]> git.openstreetmap.org Git - rails.git/blob - vendor/assets/iD/iD.js
Merge branch 'master' into moderation
[rails.git] / vendor / assets / iD / iD.js
1 (function () {
2 var version = "4.13.0";
3
4 function d3_ascending(a, b) {
5   return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
6 }
7
8 function d3_bisector(compare) {
9   if (compare.length === 1) compare = ascendingComparator(compare);
10   return {
11     left: function(a, x, lo, hi) {
12       if (lo == null) lo = 0;
13       if (hi == null) hi = a.length;
14       while (lo < hi) {
15         var mid = lo + hi >>> 1;
16         if (compare(a[mid], x) < 0) lo = mid + 1;
17         else hi = mid;
18       }
19       return lo;
20     },
21     right: function(a, x, lo, hi) {
22       if (lo == null) lo = 0;
23       if (hi == null) hi = a.length;
24       while (lo < hi) {
25         var mid = lo + hi >>> 1;
26         if (compare(a[mid], x) > 0) hi = mid;
27         else lo = mid + 1;
28       }
29       return lo;
30     }
31   };
32 }
33
34 function ascendingComparator(f) {
35   return function(d, x) {
36     return d3_ascending(f(d), x);
37   };
38 }
39
40 var ascendingBisect = d3_bisector(d3_ascending);
41 var bisectRight = ascendingBisect.right;
42 var bisectLeft = ascendingBisect.left;
43
44 function pairs(array, f) {
45   if (f == null) f = pair;
46   var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);
47   while (i < n) pairs[i] = f(p, p = array[++i]);
48   return pairs;
49 }
50
51 function pair(a, b) {
52   return [a, b];
53 }
54
55 function cross(values0, values1, reduce) {
56   var n0 = values0.length,
57       n1 = values1.length,
58       values = new Array(n0 * n1),
59       i0,
60       i1,
61       i,
62       value0;
63
64   if (reduce == null) reduce = pair;
65
66   for (i0 = i = 0; i0 < n0; ++i0) {
67     for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {
68       values[i] = reduce(value0, values1[i1]);
69     }
70   }
71
72   return values;
73 }
74
75 function d3_descending(a, b) {
76   return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
77 }
78
79 function number(x) {
80   return x === null ? NaN : +x;
81 }
82
83 function variance(values, valueof) {
84   var n = values.length,
85       m = 0,
86       i = -1,
87       mean = 0,
88       value,
89       delta,
90       sum = 0;
91
92   if (valueof == null) {
93     while (++i < n) {
94       if (!isNaN(value = number(values[i]))) {
95         delta = value - mean;
96         mean += delta / ++m;
97         sum += delta * (value - mean);
98       }
99     }
100   }
101
102   else {
103     while (++i < n) {
104       if (!isNaN(value = number(valueof(values[i], i, values)))) {
105         delta = value - mean;
106         mean += delta / ++m;
107         sum += delta * (value - mean);
108       }
109     }
110   }
111
112   if (m > 1) return sum / (m - 1);
113 }
114
115 function deviation(array, f) {
116   var v = variance(array, f);
117   return v ? Math.sqrt(v) : v;
118 }
119
120 function extent(values, valueof) {
121   var n = values.length,
122       i = -1,
123       value,
124       min,
125       max;
126
127   if (valueof == null) {
128     while (++i < n) { // Find the first comparable value.
129       if ((value = values[i]) != null && value >= value) {
130         min = max = value;
131         while (++i < n) { // Compare the remaining values.
132           if ((value = values[i]) != null) {
133             if (min > value) min = value;
134             if (max < value) max = value;
135           }
136         }
137       }
138     }
139   }
140
141   else {
142     while (++i < n) { // Find the first comparable value.
143       if ((value = valueof(values[i], i, values)) != null && value >= value) {
144         min = max = value;
145         while (++i < n) { // Compare the remaining values.
146           if ((value = valueof(values[i], i, values)) != null) {
147             if (min > value) min = value;
148             if (max < value) max = value;
149           }
150         }
151       }
152     }
153   }
154
155   return [min, max];
156 }
157
158 var array = Array.prototype;
159
160 var slice = array.slice;
161 var map = array.map;
162
163 function constant(x) {
164   return function() {
165     return x;
166   };
167 }
168
169 function identity(x) {
170   return x;
171 }
172
173 function d3_range(start, stop, step) {
174   start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
175
176   var i = -1,
177       n = Math.max(0, Math.ceil((stop - start) / step)) | 0,
178       range = new Array(n);
179
180   while (++i < n) {
181     range[i] = start + i * step;
182   }
183
184   return range;
185 }
186
187 var e10 = Math.sqrt(50),
188     e5 = Math.sqrt(10),
189     e2 = Math.sqrt(2);
190
191 function ticks(start, stop, count) {
192   var reverse,
193       i = -1,
194       n,
195       ticks,
196       step;
197
198   stop = +stop, start = +start, count = +count;
199   if (start === stop && count > 0) return [start];
200   if (reverse = stop < start) n = start, start = stop, stop = n;
201   if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];
202
203   if (step > 0) {
204     start = Math.ceil(start / step);
205     stop = Math.floor(stop / step);
206     ticks = new Array(n = Math.ceil(stop - start + 1));
207     while (++i < n) ticks[i] = (start + i) * step;
208   } else {
209     start = Math.floor(start * step);
210     stop = Math.ceil(stop * step);
211     ticks = new Array(n = Math.ceil(start - stop + 1));
212     while (++i < n) ticks[i] = (start - i) / step;
213   }
214
215   if (reverse) ticks.reverse();
216
217   return ticks;
218 }
219
220 function tickIncrement(start, stop, count) {
221   var step = (stop - start) / Math.max(0, count),
222       power = Math.floor(Math.log(step) / Math.LN10),
223       error = step / Math.pow(10, power);
224   return power >= 0
225       ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)
226       : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);
227 }
228
229 function tickStep(start, stop, count) {
230   var step0 = Math.abs(stop - start) / Math.max(0, count),
231       step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),
232       error = step0 / step1;
233   if (error >= e10) step1 *= 10;
234   else if (error >= e5) step1 *= 5;
235   else if (error >= e2) step1 *= 2;
236   return stop < start ? -step1 : step1;
237 }
238
239 function sturges(values) {
240   return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
241 }
242
243 function histogram() {
244   var value = identity,
245       domain = extent,
246       threshold = sturges;
247
248   function histogram(data) {
249     var i,
250         n = data.length,
251         x,
252         values = new Array(n);
253
254     for (i = 0; i < n; ++i) {
255       values[i] = value(data[i], i, data);
256     }
257
258     var xz = domain(values),
259         x0 = xz[0],
260         x1 = xz[1],
261         tz = threshold(values, x0, x1);
262
263     // Convert number of thresholds into uniform thresholds.
264     if (!Array.isArray(tz)) {
265       tz = tickStep(x0, x1, tz);
266       tz = d3_range(Math.ceil(x0 / tz) * tz, Math.floor(x1 / tz) * tz, tz); // exclusive
267     }
268
269     // Remove any thresholds outside the domain.
270     var m = tz.length;
271     while (tz[0] <= x0) tz.shift(), --m;
272     while (tz[m - 1] > x1) tz.pop(), --m;
273
274     var bins = new Array(m + 1),
275         bin;
276
277     // Initialize bins.
278     for (i = 0; i <= m; ++i) {
279       bin = bins[i] = [];
280       bin.x0 = i > 0 ? tz[i - 1] : x0;
281       bin.x1 = i < m ? tz[i] : x1;
282     }
283
284     // Assign data to bins by value, ignoring any outside the domain.
285     for (i = 0; i < n; ++i) {
286       x = values[i];
287       if (x0 <= x && x <= x1) {
288         bins[bisectRight(tz, x, 0, m)].push(data[i]);
289       }
290     }
291
292     return bins;
293   }
294
295   histogram.value = function(_) {
296     return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value;
297   };
298
299   histogram.domain = function(_) {
300     return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain;
301   };
302
303   histogram.thresholds = function(_) {
304     return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold;
305   };
306
307   return histogram;
308 }
309
310 function threshold(values, p, valueof) {
311   if (valueof == null) valueof = number;
312   if (!(n = values.length)) return;
313   if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);
314   if (p >= 1) return +valueof(values[n - 1], n - 1, values);
315   var n,
316       i = (n - 1) * p,
317       i0 = Math.floor(i),
318       value0 = +valueof(values[i0], i0, values),
319       value1 = +valueof(values[i0 + 1], i0 + 1, values);
320   return value0 + (value1 - value0) * (i - i0);
321 }
322
323 function freedmanDiaconis(values, min, max) {
324   values = map.call(values, number).sort(d3_ascending);
325   return Math.ceil((max - min) / (2 * (threshold(values, 0.75) - threshold(values, 0.25)) * Math.pow(values.length, -1 / 3)));
326 }
327
328 function scott(values, min, max) {
329   return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));
330 }
331
332 function max(values, valueof) {
333   var n = values.length,
334       i = -1,
335       value,
336       max;
337
338   if (valueof == null) {
339     while (++i < n) { // Find the first comparable value.
340       if ((value = values[i]) != null && value >= value) {
341         max = value;
342         while (++i < n) { // Compare the remaining values.
343           if ((value = values[i]) != null && value > max) {
344             max = value;
345           }
346         }
347       }
348     }
349   }
350
351   else {
352     while (++i < n) { // Find the first comparable value.
353       if ((value = valueof(values[i], i, values)) != null && value >= value) {
354         max = value;
355         while (++i < n) { // Compare the remaining values.
356           if ((value = valueof(values[i], i, values)) != null && value > max) {
357             max = value;
358           }
359         }
360       }
361     }
362   }
363
364   return max;
365 }
366
367 function mean(values, valueof) {
368   var n = values.length,
369       m = n,
370       i = -1,
371       value,
372       sum = 0;
373
374   if (valueof == null) {
375     while (++i < n) {
376       if (!isNaN(value = number(values[i]))) sum += value;
377       else --m;
378     }
379   }
380
381   else {
382     while (++i < n) {
383       if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value;
384       else --m;
385     }
386   }
387
388   if (m) return sum / m;
389 }
390
391 function d3_median(values, valueof) {
392   var n = values.length,
393       i = -1,
394       value,
395       numbers = [];
396
397   if (valueof == null) {
398     while (++i < n) {
399       if (!isNaN(value = number(values[i]))) {
400         numbers.push(value);
401       }
402     }
403   }
404
405   else {
406     while (++i < n) {
407       if (!isNaN(value = number(valueof(values[i], i, values)))) {
408         numbers.push(value);
409       }
410     }
411   }
412
413   return threshold(numbers.sort(d3_ascending), 0.5);
414 }
415
416 function merge(arrays) {
417   var n = arrays.length,
418       m,
419       i = -1,
420       j = 0,
421       merged,
422       array;
423
424   while (++i < n) j += arrays[i].length;
425   merged = new Array(j);
426
427   while (--n >= 0) {
428     array = arrays[n];
429     m = array.length;
430     while (--m >= 0) {
431       merged[--j] = array[m];
432     }
433   }
434
435   return merged;
436 }
437
438 function min(values, valueof) {
439   var n = values.length,
440       i = -1,
441       value,
442       min;
443
444   if (valueof == null) {
445     while (++i < n) { // Find the first comparable value.
446       if ((value = values[i]) != null && value >= value) {
447         min = value;
448         while (++i < n) { // Compare the remaining values.
449           if ((value = values[i]) != null && min > value) {
450             min = value;
451           }
452         }
453       }
454     }
455   }
456
457   else {
458     while (++i < n) { // Find the first comparable value.
459       if ((value = valueof(values[i], i, values)) != null && value >= value) {
460         min = value;
461         while (++i < n) { // Compare the remaining values.
462           if ((value = valueof(values[i], i, values)) != null && min > value) {
463             min = value;
464           }
465         }
466       }
467     }
468   }
469
470   return min;
471 }
472
473 function permute(array, indexes) {
474   var i = indexes.length, permutes = new Array(i);
475   while (i--) permutes[i] = array[indexes[i]];
476   return permutes;
477 }
478
479 function scan(values, compare) {
480   if (!(n = values.length)) return;
481   var n,
482       i = 0,
483       j = 0,
484       xi,
485       xj = values[j];
486
487   if (compare == null) compare = d3_ascending;
488
489   while (++i < n) {
490     if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) {
491       xj = xi, j = i;
492     }
493   }
494
495   if (compare(xj, xj) === 0) return j;
496 }
497
498 function shuffle(array, i0, i1) {
499   var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),
500       t,
501       i;
502
503   while (m) {
504     i = Math.random() * m-- | 0;
505     t = array[m + i0];
506     array[m + i0] = array[i + i0];
507     array[i + i0] = t;
508   }
509
510   return array;
511 }
512
513 function sum(values, valueof) {
514   var n = values.length,
515       i = -1,
516       value,
517       sum = 0;
518
519   if (valueof == null) {
520     while (++i < n) {
521       if (value = +values[i]) sum += value; // Note: zero and null are equivalent.
522     }
523   }
524
525   else {
526     while (++i < n) {
527       if (value = +valueof(values[i], i, values)) sum += value;
528     }
529   }
530
531   return sum;
532 }
533
534 function transpose(matrix) {
535   if (!(n = matrix.length)) return [];
536   for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {
537     for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {
538       row[j] = matrix[j][i];
539     }
540   }
541   return transpose;
542 }
543
544 function length(d) {
545   return d.length;
546 }
547
548 function zip() {
549   return transpose(arguments);
550 }
551
552 var slice$1 = Array.prototype.slice;
553
554 function identity$1(x) {
555   return x;
556 }
557
558 var top = 1,
559     right = 2,
560     bottom = 3,
561     left = 4,
562     epsilon = 1e-6;
563
564 function translateX(x) {
565   return "translate(" + (x + 0.5) + ",0)";
566 }
567
568 function translateY(y) {
569   return "translate(0," + (y + 0.5) + ")";
570 }
571
572 function number$1(scale) {
573   return function(d) {
574     return +scale(d);
575   };
576 }
577
578 function center(scale) {
579   var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset.
580   if (scale.round()) offset = Math.round(offset);
581   return function(d) {
582     return +scale(d) + offset;
583   };
584 }
585
586 function entering() {
587   return !this.__axis;
588 }
589
590 function axis(orient, scale) {
591   var tickArguments = [],
592       tickValues = null,
593       tickFormat = null,
594       tickSizeInner = 6,
595       tickSizeOuter = 6,
596       tickPadding = 3,
597       k = orient === top || orient === left ? -1 : 1,
598       x = orient === left || orient === right ? "x" : "y",
599       transform = orient === top || orient === bottom ? translateX : translateY;
600
601   function axis(context) {
602     var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,
603         format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity$1) : tickFormat,
604         spacing = Math.max(tickSizeInner, 0) + tickPadding,
605         range = scale.range(),
606         range0 = +range[0] + 0.5,
607         range1 = +range[range.length - 1] + 0.5,
608         position = (scale.bandwidth ? center : number$1)(scale.copy()),
609         selection = context.selection ? context.selection() : context,
610         path = selection.selectAll(".domain").data([null]),
611         tick = selection.selectAll(".tick").data(values, scale).order(),
612         tickExit = tick.exit(),
613         tickEnter = tick.enter().append("g").attr("class", "tick"),
614         line = tick.select("line"),
615         text = tick.select("text");
616
617     path = path.merge(path.enter().insert("path", ".tick")
618         .attr("class", "domain")
619         .attr("stroke", "#000"));
620
621     tick = tick.merge(tickEnter);
622
623     line = line.merge(tickEnter.append("line")
624         .attr("stroke", "#000")
625         .attr(x + "2", k * tickSizeInner));
626
627     text = text.merge(tickEnter.append("text")
628         .attr("fill", "#000")
629         .attr(x, k * spacing)
630         .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em"));
631
632     if (context !== selection) {
633       path = path.transition(context);
634       tick = tick.transition(context);
635       line = line.transition(context);
636       text = text.transition(context);
637
638       tickExit = tickExit.transition(context)
639           .attr("opacity", epsilon)
640           .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); });
641
642       tickEnter
643           .attr("opacity", epsilon)
644           .attr("transform", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });
645     }
646
647     tickExit.remove();
648
649     path
650         .attr("d", orient === left || orient == right
651             ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter
652             : "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter);
653
654     tick
655         .attr("opacity", 1)
656         .attr("transform", function(d) { return transform(position(d)); });
657
658     line
659         .attr(x + "2", k * tickSizeInner);
660
661     text
662         .attr(x, k * spacing)
663         .text(format);
664
665     selection.filter(entering)
666         .attr("fill", "none")
667         .attr("font-size", 10)
668         .attr("font-family", "sans-serif")
669         .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle");
670
671     selection
672         .each(function() { this.__axis = position; });
673   }
674
675   axis.scale = function(_) {
676     return arguments.length ? (scale = _, axis) : scale;
677   };
678
679   axis.ticks = function() {
680     return tickArguments = slice$1.call(arguments), axis;
681   };
682
683   axis.tickArguments = function(_) {
684     return arguments.length ? (tickArguments = _ == null ? [] : slice$1.call(_), axis) : tickArguments.slice();
685   };
686
687   axis.tickValues = function(_) {
688     return arguments.length ? (tickValues = _ == null ? null : slice$1.call(_), axis) : tickValues && tickValues.slice();
689   };
690
691   axis.tickFormat = function(_) {
692     return arguments.length ? (tickFormat = _, axis) : tickFormat;
693   };
694
695   axis.tickSize = function(_) {
696     return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;
697   };
698
699   axis.tickSizeInner = function(_) {
700     return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;
701   };
702
703   axis.tickSizeOuter = function(_) {
704     return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;
705   };
706
707   axis.tickPadding = function(_) {
708     return arguments.length ? (tickPadding = +_, axis) : tickPadding;
709   };
710
711   return axis;
712 }
713
714 function axisTop(scale) {
715   return axis(top, scale);
716 }
717
718 function axisRight(scale) {
719   return axis(right, scale);
720 }
721
722 function axisBottom(scale) {
723   return axis(bottom, scale);
724 }
725
726 function axisLeft(scale) {
727   return axis(left, scale);
728 }
729
730 var noop = {value: function() {}};
731
732 function dispatch() {
733   for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {
734     if (!(t = arguments[i] + "") || (t in _)) throw new Error("illegal type: " + t);
735     _[t] = [];
736   }
737   return new Dispatch(_);
738 }
739
740 function Dispatch(_) {
741   this._ = _;
742 }
743
744 function parseTypenames(typenames, types) {
745   return typenames.trim().split(/^|\s+/).map(function(t) {
746     var name = "", i = t.indexOf(".");
747     if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
748     if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t);
749     return {type: t, name: name};
750   });
751 }
752
753 Dispatch.prototype = dispatch.prototype = {
754   constructor: Dispatch,
755   on: function(typename, callback) {
756     var _ = this._,
757         T = parseTypenames(typename + "", _),
758         t,
759         i = -1,
760         n = T.length;
761
762     // If no callback was specified, return the callback of the given type and name.
763     if (arguments.length < 2) {
764       while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;
765       return;
766     }
767
768     // If a type was specified, set the callback for the given type and name.
769     // Otherwise, if a null callback was specified, remove callbacks of the given name.
770     if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback);
771     while (++i < n) {
772       if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);
773       else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);
774     }
775
776     return this;
777   },
778   copy: function() {
779     var copy = {}, _ = this._;
780     for (var t in _) copy[t] = _[t].slice();
781     return new Dispatch(copy);
782   },
783   call: function(type, that) {
784     if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];
785     if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
786     for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
787   },
788   apply: function(type, that, args) {
789     if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
790     for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
791   }
792 };
793
794 function get(type, name) {
795   for (var i = 0, n = type.length, c; i < n; ++i) {
796     if ((c = type[i]).name === name) {
797       return c.value;
798     }
799   }
800 }
801
802 function set(type, name, callback) {
803   for (var i = 0, n = type.length; i < n; ++i) {
804     if (type[i].name === name) {
805       type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));
806       break;
807     }
808   }
809   if (callback != null) type.push({name: name, value: callback});
810   return type;
811 }
812
813 var xhtml = "http://www.w3.org/1999/xhtml";
814
815 var namespaces = {
816   svg: "http://www.w3.org/2000/svg",
817   xhtml: xhtml,
818   xlink: "http://www.w3.org/1999/xlink",
819   xml: "http://www.w3.org/XML/1998/namespace",
820   xmlns: "http://www.w3.org/2000/xmlns/"
821 };
822
823 function namespace(name) {
824   var prefix = name += "", i = prefix.indexOf(":");
825   if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
826   return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;
827 }
828
829 function creatorInherit(name) {
830   return function() {
831     var document = this.ownerDocument,
832         uri = this.namespaceURI;
833     return uri === xhtml && document.documentElement.namespaceURI === xhtml
834         ? document.createElement(name)
835         : document.createElementNS(uri, name);
836   };
837 }
838
839 function creatorFixed(fullname) {
840   return function() {
841     return this.ownerDocument.createElementNS(fullname.space, fullname.local);
842   };
843 }
844
845 function creator(name) {
846   var fullname = namespace(name);
847   return (fullname.local
848       ? creatorFixed
849       : creatorInherit)(fullname);
850 }
851
852 function none() {}
853
854 function selector(selector) {
855   return selector == null ? none : function() {
856     return this.querySelector(selector);
857   };
858 }
859
860 function selection_select(select) {
861   if (typeof select !== "function") select = selector(select);
862
863   for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
864     for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
865       if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
866         if ("__data__" in node) subnode.__data__ = node.__data__;
867         subgroup[i] = subnode;
868       }
869     }
870   }
871
872   return new Selection(subgroups, this._parents);
873 }
874
875 function empty() {
876   return [];
877 }
878
879 function selectorAll(selector) {
880   return selector == null ? empty : function() {
881     return this.querySelectorAll(selector);
882   };
883 }
884
885 function selection_selectAll(select) {
886   if (typeof select !== "function") select = selectorAll(select);
887
888   for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
889     for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
890       if (node = group[i]) {
891         subgroups.push(select.call(node, node.__data__, i, group));
892         parents.push(node);
893       }
894     }
895   }
896
897   return new Selection(subgroups, parents);
898 }
899
900 var matcher = function(selector) {
901   return function() {
902     return this.matches(selector);
903   };
904 };
905
906 if (typeof document !== "undefined") {
907   var element = document.documentElement;
908   if (!element.matches) {
909     var vendorMatches = element.webkitMatchesSelector
910         || element.msMatchesSelector
911         || element.mozMatchesSelector
912         || element.oMatchesSelector;
913     matcher = function(selector) {
914       return function() {
915         return vendorMatches.call(this, selector);
916       };
917     };
918   }
919 }
920
921 var matcher$1 = matcher;
922
923 function selection_filter(match) {
924   if (typeof match !== "function") match = matcher$1(match);
925
926   for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
927     for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
928       if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
929         subgroup.push(node);
930       }
931     }
932   }
933
934   return new Selection(subgroups, this._parents);
935 }
936
937 function sparse(update) {
938   return new Array(update.length);
939 }
940
941 function selection_enter() {
942   return new Selection(this._enter || this._groups.map(sparse), this._parents);
943 }
944
945 function EnterNode(parent, datum) {
946   this.ownerDocument = parent.ownerDocument;
947   this.namespaceURI = parent.namespaceURI;
948   this._next = null;
949   this._parent = parent;
950   this.__data__ = datum;
951 }
952
953 EnterNode.prototype = {
954   constructor: EnterNode,
955   appendChild: function(child) { return this._parent.insertBefore(child, this._next); },
956   insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },
957   querySelector: function(selector) { return this._parent.querySelector(selector); },
958   querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
959 };
960
961 function constant$1(x) {
962   return function() {
963     return x;
964   };
965 }
966
967 var keyPrefix = "$"; // Protect against keys like “__proto__”.
968
969 function bindIndex(parent, group, enter, update, exit, data) {
970   var i = 0,
971       node,
972       groupLength = group.length,
973       dataLength = data.length;
974
975   // Put any non-null nodes that fit into update.
976   // Put any null nodes into enter.
977   // Put any remaining data into enter.
978   for (; i < dataLength; ++i) {
979     if (node = group[i]) {
980       node.__data__ = data[i];
981       update[i] = node;
982     } else {
983       enter[i] = new EnterNode(parent, data[i]);
984     }
985   }
986
987   // Put any non-null nodes that don’t fit into exit.
988   for (; i < groupLength; ++i) {
989     if (node = group[i]) {
990       exit[i] = node;
991     }
992   }
993 }
994
995 function bindKey(parent, group, enter, update, exit, data, key) {
996   var i,
997       node,
998       nodeByKeyValue = {},
999       groupLength = group.length,
1000       dataLength = data.length,
1001       keyValues = new Array(groupLength),
1002       keyValue;
1003
1004   // Compute the key for each node.
1005   // If multiple nodes have the same key, the duplicates are added to exit.
1006   for (i = 0; i < groupLength; ++i) {
1007     if (node = group[i]) {
1008       keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);
1009       if (keyValue in nodeByKeyValue) {
1010         exit[i] = node;
1011       } else {
1012         nodeByKeyValue[keyValue] = node;
1013       }
1014     }
1015   }
1016
1017   // Compute the key for each datum.
1018   // If there a node associated with this key, join and add it to update.
1019   // If there is not (or the key is a duplicate), add it to enter.
1020   for (i = 0; i < dataLength; ++i) {
1021     keyValue = keyPrefix + key.call(parent, data[i], i, data);
1022     if (node = nodeByKeyValue[keyValue]) {
1023       update[i] = node;
1024       node.__data__ = data[i];
1025       nodeByKeyValue[keyValue] = null;
1026     } else {
1027       enter[i] = new EnterNode(parent, data[i]);
1028     }
1029   }
1030
1031   // Add any remaining nodes that were not bound to data to exit.
1032   for (i = 0; i < groupLength; ++i) {
1033     if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {
1034       exit[i] = node;
1035     }
1036   }
1037 }
1038
1039 function selection_data(value, key) {
1040   if (!value) {
1041     data = new Array(this.size()), j = -1;
1042     this.each(function(d) { data[++j] = d; });
1043     return data;
1044   }
1045
1046   var bind = key ? bindKey : bindIndex,
1047       parents = this._parents,
1048       groups = this._groups;
1049
1050   if (typeof value !== "function") value = constant$1(value);
1051
1052   for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
1053     var parent = parents[j],
1054         group = groups[j],
1055         groupLength = group.length,
1056         data = value.call(parent, parent && parent.__data__, j, parents),
1057         dataLength = data.length,
1058         enterGroup = enter[j] = new Array(dataLength),
1059         updateGroup = update[j] = new Array(dataLength),
1060         exitGroup = exit[j] = new Array(groupLength);
1061
1062     bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
1063
1064     // Now connect the enter nodes to their following update node, such that
1065     // appendChild can insert the materialized enter node before this node,
1066     // rather than at the end of the parent node.
1067     for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
1068       if (previous = enterGroup[i0]) {
1069         if (i0 >= i1) i1 = i0 + 1;
1070         while (!(next = updateGroup[i1]) && ++i1 < dataLength);
1071         previous._next = next || null;
1072       }
1073     }
1074   }
1075
1076   update = new Selection(update, parents);
1077   update._enter = enter;
1078   update._exit = exit;
1079   return update;
1080 }
1081
1082 function selection_exit() {
1083   return new Selection(this._exit || this._groups.map(sparse), this._parents);
1084 }
1085
1086 function selection_merge(selection$$1) {
1087
1088   for (var groups0 = this._groups, groups1 = selection$$1._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
1089     for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
1090       if (node = group0[i] || group1[i]) {
1091         merge[i] = node;
1092       }
1093     }
1094   }
1095
1096   for (; j < m0; ++j) {
1097     merges[j] = groups0[j];
1098   }
1099
1100   return new Selection(merges, this._parents);
1101 }
1102
1103 function selection_order() {
1104
1105   for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
1106     for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
1107       if (node = group[i]) {
1108         if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);
1109         next = node;
1110       }
1111     }
1112   }
1113
1114   return this;
1115 }
1116
1117 function selection_sort(compare) {
1118   if (!compare) compare = ascending;
1119
1120   function compareNode(a, b) {
1121     return a && b ? compare(a.__data__, b.__data__) : !a - !b;
1122   }
1123
1124   for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
1125     for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
1126       if (node = group[i]) {
1127         sortgroup[i] = node;
1128       }
1129     }
1130     sortgroup.sort(compareNode);
1131   }
1132
1133   return new Selection(sortgroups, this._parents).order();
1134 }
1135
1136 function ascending(a, b) {
1137   return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
1138 }
1139
1140 function selection_call() {
1141   var callback = arguments[0];
1142   arguments[0] = this;
1143   callback.apply(null, arguments);
1144   return this;
1145 }
1146
1147 function selection_nodes() {
1148   var nodes = new Array(this.size()), i = -1;
1149   this.each(function() { nodes[++i] = this; });
1150   return nodes;
1151 }
1152
1153 function selection_node() {
1154
1155   for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
1156     for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
1157       var node = group[i];
1158       if (node) return node;
1159     }
1160   }
1161
1162   return null;
1163 }
1164
1165 function selection_size() {
1166   var size = 0;
1167   this.each(function() { ++size; });
1168   return size;
1169 }
1170
1171 function selection_empty() {
1172   return !this.node();
1173 }
1174
1175 function selection_each(callback) {
1176
1177   for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
1178     for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
1179       if (node = group[i]) callback.call(node, node.__data__, i, group);
1180     }
1181   }
1182
1183   return this;
1184 }
1185
1186 function attrRemove(name) {
1187   return function() {
1188     this.removeAttribute(name);
1189   };
1190 }
1191
1192 function attrRemoveNS(fullname) {
1193   return function() {
1194     this.removeAttributeNS(fullname.space, fullname.local);
1195   };
1196 }
1197
1198 function attrConstant(name, value) {
1199   return function() {
1200     this.setAttribute(name, value);
1201   };
1202 }
1203
1204 function attrConstantNS(fullname, value) {
1205   return function() {
1206     this.setAttributeNS(fullname.space, fullname.local, value);
1207   };
1208 }
1209
1210 function attrFunction(name, value) {
1211   return function() {
1212     var v = value.apply(this, arguments);
1213     if (v == null) this.removeAttribute(name);
1214     else this.setAttribute(name, v);
1215   };
1216 }
1217
1218 function attrFunctionNS(fullname, value) {
1219   return function() {
1220     var v = value.apply(this, arguments);
1221     if (v == null) this.removeAttributeNS(fullname.space, fullname.local);
1222     else this.setAttributeNS(fullname.space, fullname.local, v);
1223   };
1224 }
1225
1226 function selection_attr(name, value) {
1227   var fullname = namespace(name);
1228
1229   if (arguments.length < 2) {
1230     var node = this.node();
1231     return fullname.local
1232         ? node.getAttributeNS(fullname.space, fullname.local)
1233         : node.getAttribute(fullname);
1234   }
1235
1236   return this.each((value == null
1237       ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
1238       ? (fullname.local ? attrFunctionNS : attrFunction)
1239       : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
1240 }
1241
1242 function defaultView(node) {
1243   return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
1244       || (node.document && node) // node is a Window
1245       || node.defaultView; // node is a Document
1246 }
1247
1248 function styleRemove(name) {
1249   return function() {
1250     this.style.removeProperty(name);
1251   };
1252 }
1253
1254 function styleConstant(name, value, priority) {
1255   return function() {
1256     this.style.setProperty(name, value, priority);
1257   };
1258 }
1259
1260 function styleFunction(name, value, priority) {
1261   return function() {
1262     var v = value.apply(this, arguments);
1263     if (v == null) this.style.removeProperty(name);
1264     else this.style.setProperty(name, v, priority);
1265   };
1266 }
1267
1268 function selection_style(name, value, priority) {
1269   return arguments.length > 1
1270       ? this.each((value == null
1271             ? styleRemove : typeof value === "function"
1272             ? styleFunction
1273             : styleConstant)(name, value, priority == null ? "" : priority))
1274       : styleValue(this.node(), name);
1275 }
1276
1277 function styleValue(node, name) {
1278   return node.style.getPropertyValue(name)
1279       || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);
1280 }
1281
1282 function propertyRemove(name) {
1283   return function() {
1284     delete this[name];
1285   };
1286 }
1287
1288 function propertyConstant(name, value) {
1289   return function() {
1290     this[name] = value;
1291   };
1292 }
1293
1294 function propertyFunction(name, value) {
1295   return function() {
1296     var v = value.apply(this, arguments);
1297     if (v == null) delete this[name];
1298     else this[name] = v;
1299   };
1300 }
1301
1302 function selection_property(name, value) {
1303   return arguments.length > 1
1304       ? this.each((value == null
1305           ? propertyRemove : typeof value === "function"
1306           ? propertyFunction
1307           : propertyConstant)(name, value))
1308       : this.node()[name];
1309 }
1310
1311 function classArray(string) {
1312   return string.trim().split(/^|\s+/);
1313 }
1314
1315 function classList(node) {
1316   return node.classList || new ClassList(node);
1317 }
1318
1319 function ClassList(node) {
1320   this._node = node;
1321   this._names = classArray(node.getAttribute("class") || "");
1322 }
1323
1324 ClassList.prototype = {
1325   add: function(name) {
1326     var i = this._names.indexOf(name);
1327     if (i < 0) {
1328       this._names.push(name);
1329       this._node.setAttribute("class", this._names.join(" "));
1330     }
1331   },
1332   remove: function(name) {
1333     var i = this._names.indexOf(name);
1334     if (i >= 0) {
1335       this._names.splice(i, 1);
1336       this._node.setAttribute("class", this._names.join(" "));
1337     }
1338   },
1339   contains: function(name) {
1340     return this._names.indexOf(name) >= 0;
1341   }
1342 };
1343
1344 function classedAdd(node, names) {
1345   var list = classList(node), i = -1, n = names.length;
1346   while (++i < n) list.add(names[i]);
1347 }
1348
1349 function classedRemove(node, names) {
1350   var list = classList(node), i = -1, n = names.length;
1351   while (++i < n) list.remove(names[i]);
1352 }
1353
1354 function classedTrue(names) {
1355   return function() {
1356     classedAdd(this, names);
1357   };
1358 }
1359
1360 function classedFalse(names) {
1361   return function() {
1362     classedRemove(this, names);
1363   };
1364 }
1365
1366 function classedFunction(names, value) {
1367   return function() {
1368     (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
1369   };
1370 }
1371
1372 function selection_classed(name, value) {
1373   var names = classArray(name + "");
1374
1375   if (arguments.length < 2) {
1376     var list = classList(this.node()), i = -1, n = names.length;
1377     while (++i < n) if (!list.contains(names[i])) return false;
1378     return true;
1379   }
1380
1381   return this.each((typeof value === "function"
1382       ? classedFunction : value
1383       ? classedTrue
1384       : classedFalse)(names, value));
1385 }
1386
1387 function textRemove() {
1388   this.textContent = "";
1389 }
1390
1391 function textConstant(value) {
1392   return function() {
1393     this.textContent = value;
1394   };
1395 }
1396
1397 function textFunction(value) {
1398   return function() {
1399     var v = value.apply(this, arguments);
1400     this.textContent = v == null ? "" : v;
1401   };
1402 }
1403
1404 function selection_text(value) {
1405   return arguments.length
1406       ? this.each(value == null
1407           ? textRemove : (typeof value === "function"
1408           ? textFunction
1409           : textConstant)(value))
1410       : this.node().textContent;
1411 }
1412
1413 function htmlRemove() {
1414   this.innerHTML = "";
1415 }
1416
1417 function htmlConstant(value) {
1418   return function() {
1419     this.innerHTML = value;
1420   };
1421 }
1422
1423 function htmlFunction(value) {
1424   return function() {
1425     var v = value.apply(this, arguments);
1426     this.innerHTML = v == null ? "" : v;
1427   };
1428 }
1429
1430 function selection_html(value) {
1431   return arguments.length
1432       ? this.each(value == null
1433           ? htmlRemove : (typeof value === "function"
1434           ? htmlFunction
1435           : htmlConstant)(value))
1436       : this.node().innerHTML;
1437 }
1438
1439 function raise() {
1440   if (this.nextSibling) this.parentNode.appendChild(this);
1441 }
1442
1443 function selection_raise() {
1444   return this.each(raise);
1445 }
1446
1447 function lower() {
1448   if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
1449 }
1450
1451 function selection_lower() {
1452   return this.each(lower);
1453 }
1454
1455 function selection_append(name) {
1456   var create = typeof name === "function" ? name : creator(name);
1457   return this.select(function() {
1458     return this.appendChild(create.apply(this, arguments));
1459   });
1460 }
1461
1462 function constantNull() {
1463   return null;
1464 }
1465
1466 function selection_insert(name, before) {
1467   var create = typeof name === "function" ? name : creator(name),
1468       select = before == null ? constantNull : typeof before === "function" ? before : selector(before);
1469   return this.select(function() {
1470     return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
1471   });
1472 }
1473
1474 function remove() {
1475   var parent = this.parentNode;
1476   if (parent) parent.removeChild(this);
1477 }
1478
1479 function selection_remove() {
1480   return this.each(remove);
1481 }
1482
1483 function selection_cloneShallow() {
1484   return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibling);
1485 }
1486
1487 function selection_cloneDeep() {
1488   return this.parentNode.insertBefore(this.cloneNode(true), this.nextSibling);
1489 }
1490
1491 function selection_clone(deep) {
1492   return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
1493 }
1494
1495 function selection_datum(value) {
1496   return arguments.length
1497       ? this.property("__data__", value)
1498       : this.node().__data__;
1499 }
1500
1501 var filterEvents = {};
1502
1503 var event = null;
1504
1505 if (typeof document !== "undefined") {
1506   var element$1 = document.documentElement;
1507   if (!("onmouseenter" in element$1)) {
1508     filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
1509   }
1510 }
1511
1512 function filterContextListener(listener, index, group) {
1513   listener = contextListener(listener, index, group);
1514   return function(event) {
1515     var related = event.relatedTarget;
1516     if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
1517       listener.call(this, event);
1518     }
1519   };
1520 }
1521
1522 function contextListener(listener, index, group) {
1523   return function(event1) {
1524     var event0 = event; // Events can be reentrant (e.g., focus).
1525     event = event1;
1526     try {
1527       listener.call(this, this.__data__, index, group);
1528     } finally {
1529       event = event0;
1530     }
1531   };
1532 }
1533
1534 function parseTypenames$1(typenames) {
1535   return typenames.trim().split(/^|\s+/).map(function(t) {
1536     var name = "", i = t.indexOf(".");
1537     if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
1538     return {type: t, name: name};
1539   });
1540 }
1541
1542 function onRemove(typename) {
1543   return function() {
1544     var on = this.__on;
1545     if (!on) return;
1546     for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
1547       if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
1548         this.removeEventListener(o.type, o.listener, o.capture);
1549       } else {
1550         on[++i] = o;
1551       }
1552     }
1553     if (++i) on.length = i;
1554     else delete this.__on;
1555   };
1556 }
1557
1558 function onAdd(typename, value, capture) {
1559   var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
1560   return function(d, i, group) {
1561     var on = this.__on, o, listener = wrap(value, i, group);
1562     if (on) for (var j = 0, m = on.length; j < m; ++j) {
1563       if ((o = on[j]).type === typename.type && o.name === typename.name) {
1564         this.removeEventListener(o.type, o.listener, o.capture);
1565         this.addEventListener(o.type, o.listener = listener, o.capture = capture);
1566         o.value = value;
1567         return;
1568       }
1569     }
1570     this.addEventListener(typename.type, listener, capture);
1571     o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
1572     if (!on) this.__on = [o];
1573     else on.push(o);
1574   };
1575 }
1576
1577 function selection_on(typename, value, capture) {
1578   var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t;
1579
1580   if (arguments.length < 2) {
1581     var on = this.node().__on;
1582     if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
1583       for (i = 0, o = on[j]; i < n; ++i) {
1584         if ((t = typenames[i]).type === o.type && t.name === o.name) {
1585           return o.value;
1586         }
1587       }
1588     }
1589     return;
1590   }
1591
1592   on = value ? onAdd : onRemove;
1593   if (capture == null) capture = false;
1594   for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
1595   return this;
1596 }
1597
1598 function customEvent(event1, listener, that, args) {
1599   var event0 = event;
1600   event1.sourceEvent = event;
1601   event = event1;
1602   try {
1603     return listener.apply(that, args);
1604   } finally {
1605     event = event0;
1606   }
1607 }
1608
1609 function dispatchEvent(node, type, params) {
1610   var window = defaultView(node),
1611       event = window.CustomEvent;
1612
1613   if (typeof event === "function") {
1614     event = new event(type, params);
1615   } else {
1616     event = window.document.createEvent("Event");
1617     if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;
1618     else event.initEvent(type, false, false);
1619   }
1620
1621   node.dispatchEvent(event);
1622 }
1623
1624 function dispatchConstant(type, params) {
1625   return function() {
1626     return dispatchEvent(this, type, params);
1627   };
1628 }
1629
1630 function dispatchFunction(type, params) {
1631   return function() {
1632     return dispatchEvent(this, type, params.apply(this, arguments));
1633   };
1634 }
1635
1636 function selection_dispatch(type, params) {
1637   return this.each((typeof params === "function"
1638       ? dispatchFunction
1639       : dispatchConstant)(type, params));
1640 }
1641
1642 var root = [null];
1643
1644 function Selection(groups, parents) {
1645   this._groups = groups;
1646   this._parents = parents;
1647 }
1648
1649 function selection() {
1650   return new Selection([[document.documentElement]], root);
1651 }
1652
1653 Selection.prototype = selection.prototype = {
1654   constructor: Selection,
1655   select: selection_select,
1656   selectAll: selection_selectAll,
1657   filter: selection_filter,
1658   data: selection_data,
1659   enter: selection_enter,
1660   exit: selection_exit,
1661   merge: selection_merge,
1662   order: selection_order,
1663   sort: selection_sort,
1664   call: selection_call,
1665   nodes: selection_nodes,
1666   node: selection_node,
1667   size: selection_size,
1668   empty: selection_empty,
1669   each: selection_each,
1670   attr: selection_attr,
1671   style: selection_style,
1672   property: selection_property,
1673   classed: selection_classed,
1674   text: selection_text,
1675   html: selection_html,
1676   raise: selection_raise,
1677   lower: selection_lower,
1678   append: selection_append,
1679   insert: selection_insert,
1680   remove: selection_remove,
1681   clone: selection_clone,
1682   datum: selection_datum,
1683   on: selection_on,
1684   dispatch: selection_dispatch
1685 };
1686
1687 function d3_select(selector) {
1688   return typeof selector === "string"
1689       ? new Selection([[document.querySelector(selector)]], [document.documentElement])
1690       : new Selection([[selector]], root);
1691 }
1692
1693 function create(name) {
1694   return d3_select(creator(name).call(document.documentElement));
1695 }
1696
1697 var nextId = 0;
1698
1699 function local() {
1700   return new Local;
1701 }
1702
1703 function Local() {
1704   this._ = "@" + (++nextId).toString(36);
1705 }
1706
1707 Local.prototype = local.prototype = {
1708   constructor: Local,
1709   get: function(node) {
1710     var id = this._;
1711     while (!(id in node)) if (!(node = node.parentNode)) return;
1712     return node[id];
1713   },
1714   set: function(node, value) {
1715     return node[this._] = value;
1716   },
1717   remove: function(node) {
1718     return this._ in node && delete node[this._];
1719   },
1720   toString: function() {
1721     return this._;
1722   }
1723 };
1724
1725 function sourceEvent() {
1726   var current = event, source;
1727   while (source = current.sourceEvent) current = source;
1728   return current;
1729 }
1730
1731 function point(node, event) {
1732   var svg = node.ownerSVGElement || node;
1733
1734   if (svg.createSVGPoint) {
1735     var point = svg.createSVGPoint();
1736     point.x = event.clientX, point.y = event.clientY;
1737     point = point.matrixTransform(node.getScreenCTM().inverse());
1738     return [point.x, point.y];
1739   }
1740
1741   var rect = node.getBoundingClientRect();
1742   return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
1743 }
1744
1745 function d3_mouse(node) {
1746   var event = sourceEvent();
1747   if (event.changedTouches) event = event.changedTouches[0];
1748   return point(node, event);
1749 }
1750
1751 function d3_selectAll(selector) {
1752   return typeof selector === "string"
1753       ? new Selection([document.querySelectorAll(selector)], [document.documentElement])
1754       : new Selection([selector == null ? [] : selector], root);
1755 }
1756
1757 function touch(node, touches, identifier) {
1758   if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;
1759
1760   for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {
1761     if ((touch = touches[i]).identifier === identifier) {
1762       return point(node, touch);
1763     }
1764   }
1765
1766   return null;
1767 }
1768
1769 function d3_touches(node, touches) {
1770   if (touches == null) touches = sourceEvent().touches;
1771
1772   for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {
1773     points[i] = point(node, touches[i]);
1774   }
1775
1776   return points;
1777 }
1778
1779 function nopropagation() {
1780   event.stopImmediatePropagation();
1781 }
1782
1783 function noevent() {
1784   event.preventDefault();
1785   event.stopImmediatePropagation();
1786 }
1787
1788 function dragDisable(view) {
1789   var root = view.document.documentElement,
1790       selection$$1 = d3_select(view).on("dragstart.drag", noevent, true);
1791   if ("onselectstart" in root) {
1792     selection$$1.on("selectstart.drag", noevent, true);
1793   } else {
1794     root.__noselect = root.style.MozUserSelect;
1795     root.style.MozUserSelect = "none";
1796   }
1797 }
1798
1799 function yesdrag(view, noclick) {
1800   var root = view.document.documentElement,
1801       selection$$1 = d3_select(view).on("dragstart.drag", null);
1802   if (noclick) {
1803     selection$$1.on("click.drag", noevent, true);
1804     setTimeout(function() { selection$$1.on("click.drag", null); }, 0);
1805   }
1806   if ("onselectstart" in root) {
1807     selection$$1.on("selectstart.drag", null);
1808   } else {
1809     root.style.MozUserSelect = root.__noselect;
1810     delete root.__noselect;
1811   }
1812 }
1813
1814 function constant$2(x) {
1815   return function() {
1816     return x;
1817   };
1818 }
1819
1820 function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {
1821   this.target = target;
1822   this.type = type;
1823   this.subject = subject;
1824   this.identifier = id;
1825   this.active = active;
1826   this.x = x;
1827   this.y = y;
1828   this.dx = dx;
1829   this.dy = dy;
1830   this._ = dispatch;
1831 }
1832
1833 DragEvent.prototype.on = function() {
1834   var value = this._.on.apply(this._, arguments);
1835   return value === this._ ? this : value;
1836 };
1837
1838 // Ignore right-click, since that should open the context menu.
1839 function defaultFilter() {
1840   return !event.button;
1841 }
1842
1843 function defaultContainer() {
1844   return this.parentNode;
1845 }
1846
1847 function defaultSubject(d) {
1848   return d == null ? {x: event.x, y: event.y} : d;
1849 }
1850
1851 function defaultTouchable() {
1852   return "ontouchstart" in this;
1853 }
1854
1855 function drag() {
1856   var filter = defaultFilter,
1857       container = defaultContainer,
1858       subject = defaultSubject,
1859       touchable = defaultTouchable,
1860       gestures = {},
1861       listeners = dispatch("start", "drag", "end"),
1862       active = 0,
1863       mousedownx,
1864       mousedowny,
1865       mousemoving,
1866       touchending,
1867       clickDistance2 = 0;
1868
1869   function drag(selection$$1) {
1870     selection$$1
1871         .on("mousedown.drag", mousedowned)
1872       .filter(touchable)
1873         .on("touchstart.drag", touchstarted)
1874         .on("touchmove.drag", touchmoved)
1875         .on("touchend.drag touchcancel.drag", touchended)
1876         .style("touch-action", "none")
1877         .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
1878   }
1879
1880   function mousedowned() {
1881     if (touchending || !filter.apply(this, arguments)) return;
1882     var gesture = beforestart("mouse", container.apply(this, arguments), d3_mouse, this, arguments);
1883     if (!gesture) return;
1884     d3_select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
1885     dragDisable(event.view);
1886     nopropagation();
1887     mousemoving = false;
1888     mousedownx = event.clientX;
1889     mousedowny = event.clientY;
1890     gesture("start");
1891   }
1892
1893   function mousemoved() {
1894     noevent();
1895     if (!mousemoving) {
1896       var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
1897       mousemoving = dx * dx + dy * dy > clickDistance2;
1898     }
1899     gestures.mouse("drag");
1900   }
1901
1902   function mouseupped() {
1903     d3_select(event.view).on("mousemove.drag mouseup.drag", null);
1904     yesdrag(event.view, mousemoving);
1905     noevent();
1906     gestures.mouse("end");
1907   }
1908
1909   function touchstarted() {
1910     if (!filter.apply(this, arguments)) return;
1911     var touches = event.changedTouches,
1912         c = container.apply(this, arguments),
1913         n = touches.length, i, gesture;
1914
1915     for (i = 0; i < n; ++i) {
1916       if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {
1917         nopropagation();
1918         gesture("start");
1919       }
1920     }
1921   }
1922
1923   function touchmoved() {
1924     var touches = event.changedTouches,
1925         n = touches.length, i, gesture;
1926
1927     for (i = 0; i < n; ++i) {
1928       if (gesture = gestures[touches[i].identifier]) {
1929         noevent();
1930         gesture("drag");
1931       }
1932     }
1933   }
1934
1935   function touchended() {
1936     var touches = event.changedTouches,
1937         n = touches.length, i, gesture;
1938
1939     if (touchending) clearTimeout(touchending);
1940     touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
1941     for (i = 0; i < n; ++i) {
1942       if (gesture = gestures[touches[i].identifier]) {
1943         nopropagation();
1944         gesture("end");
1945       }
1946     }
1947   }
1948
1949   function beforestart(id, container, point$$1, that, args) {
1950     var p = point$$1(container, id), s, dx, dy,
1951         sublisteners = listeners.copy();
1952
1953     if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {
1954       if ((event.subject = s = subject.apply(that, args)) == null) return false;
1955       dx = s.x - p[0] || 0;
1956       dy = s.y - p[1] || 0;
1957       return true;
1958     })) return;
1959
1960     return function gesture(type) {
1961       var p0 = p, n;
1962       switch (type) {
1963         case "start": gestures[id] = gesture, n = active++; break;
1964         case "end": delete gestures[id], --active; // nobreak
1965         case "drag": p = point$$1(container, id), n = active; break;
1966       }
1967       customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]);
1968     };
1969   }
1970
1971   drag.filter = function(_) {
1972     return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter;
1973   };
1974
1975   drag.container = function(_) {
1976     return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container;
1977   };
1978
1979   drag.subject = function(_) {
1980     return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject;
1981   };
1982
1983   drag.touchable = function(_) {
1984     return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable;
1985   };
1986
1987   drag.on = function() {
1988     var value = listeners.on.apply(listeners, arguments);
1989     return value === listeners ? drag : value;
1990   };
1991
1992   drag.clickDistance = function(_) {
1993     return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
1994   };
1995
1996   return drag;
1997 }
1998
1999 function define(constructor, factory, prototype) {
2000   constructor.prototype = factory.prototype = prototype;
2001   prototype.constructor = constructor;
2002 }
2003
2004 function extend(parent, definition) {
2005   var prototype = Object.create(parent.prototype);
2006   for (var key in definition) prototype[key] = definition[key];
2007   return prototype;
2008 }
2009
2010 function Color() {}
2011
2012 var darker = 0.7;
2013 var brighter = 1 / darker;
2014
2015 var reI = "\\s*([+-]?\\d+)\\s*",
2016     reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",
2017     reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",
2018     reHex3 = /^#([0-9a-f]{3})$/,
2019     reHex6 = /^#([0-9a-f]{6})$/,
2020     reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"),
2021     reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"),
2022     reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"),
2023     reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"),
2024     reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"),
2025     reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$");
2026
2027 var named = {
2028   aliceblue: 0xf0f8ff,
2029   antiquewhite: 0xfaebd7,
2030   aqua: 0x00ffff,
2031   aquamarine: 0x7fffd4,
2032   azure: 0xf0ffff,
2033   beige: 0xf5f5dc,
2034   bisque: 0xffe4c4,
2035   black: 0x000000,
2036   blanchedalmond: 0xffebcd,
2037   blue: 0x0000ff,
2038   blueviolet: 0x8a2be2,
2039   brown: 0xa52a2a,
2040   burlywood: 0xdeb887,
2041   cadetblue: 0x5f9ea0,
2042   chartreuse: 0x7fff00,
2043   chocolate: 0xd2691e,
2044   coral: 0xff7f50,
2045   cornflowerblue: 0x6495ed,
2046   cornsilk: 0xfff8dc,
2047   crimson: 0xdc143c,
2048   cyan: 0x00ffff,
2049   darkblue: 0x00008b,
2050   darkcyan: 0x008b8b,
2051   darkgoldenrod: 0xb8860b,
2052   darkgray: 0xa9a9a9,
2053   darkgreen: 0x006400,
2054   darkgrey: 0xa9a9a9,
2055   darkkhaki: 0xbdb76b,
2056   darkmagenta: 0x8b008b,
2057   darkolivegreen: 0x556b2f,
2058   darkorange: 0xff8c00,
2059   darkorchid: 0x9932cc,
2060   darkred: 0x8b0000,
2061   darksalmon: 0xe9967a,
2062   darkseagreen: 0x8fbc8f,
2063   darkslateblue: 0x483d8b,
2064   darkslategray: 0x2f4f4f,
2065   darkslategrey: 0x2f4f4f,
2066   darkturquoise: 0x00ced1,
2067   darkviolet: 0x9400d3,
2068   deeppink: 0xff1493,
2069   deepskyblue: 0x00bfff,
2070   dimgray: 0x696969,
2071   dimgrey: 0x696969,
2072   dodgerblue: 0x1e90ff,
2073   firebrick: 0xb22222,
2074   floralwhite: 0xfffaf0,
2075   forestgreen: 0x228b22,
2076   fuchsia: 0xff00ff,
2077   gainsboro: 0xdcdcdc,
2078   ghostwhite: 0xf8f8ff,
2079   gold: 0xffd700,
2080   goldenrod: 0xdaa520,
2081   gray: 0x808080,
2082   green: 0x008000,
2083   greenyellow: 0xadff2f,
2084   grey: 0x808080,
2085   honeydew: 0xf0fff0,
2086   hotpink: 0xff69b4,
2087   indianred: 0xcd5c5c,
2088   indigo: 0x4b0082,
2089   ivory: 0xfffff0,
2090   khaki: 0xf0e68c,
2091   lavender: 0xe6e6fa,
2092   lavenderblush: 0xfff0f5,
2093   lawngreen: 0x7cfc00,
2094   lemonchiffon: 0xfffacd,
2095   lightblue: 0xadd8e6,
2096   lightcoral: 0xf08080,
2097   lightcyan: 0xe0ffff,
2098   lightgoldenrodyellow: 0xfafad2,
2099   lightgray: 0xd3d3d3,
2100   lightgreen: 0x90ee90,
2101   lightgrey: 0xd3d3d3,
2102   lightpink: 0xffb6c1,
2103   lightsalmon: 0xffa07a,
2104   lightseagreen: 0x20b2aa,
2105   lightskyblue: 0x87cefa,
2106   lightslategray: 0x778899,
2107   lightslategrey: 0x778899,
2108   lightsteelblue: 0xb0c4de,
2109   lightyellow: 0xffffe0,
2110   lime: 0x00ff00,
2111   limegreen: 0x32cd32,
2112   linen: 0xfaf0e6,
2113   magenta: 0xff00ff,
2114   maroon: 0x800000,
2115   mediumaquamarine: 0x66cdaa,
2116   mediumblue: 0x0000cd,
2117   mediumorchid: 0xba55d3,
2118   mediumpurple: 0x9370db,
2119   mediumseagreen: 0x3cb371,
2120   mediumslateblue: 0x7b68ee,
2121   mediumspringgreen: 0x00fa9a,
2122   mediumturquoise: 0x48d1cc,
2123   mediumvioletred: 0xc71585,
2124   midnightblue: 0x191970,
2125   mintcream: 0xf5fffa,
2126   mistyrose: 0xffe4e1,
2127   moccasin: 0xffe4b5,
2128   navajowhite: 0xffdead,
2129   navy: 0x000080,
2130   oldlace: 0xfdf5e6,
2131   olive: 0x808000,
2132   olivedrab: 0x6b8e23,
2133   orange: 0xffa500,
2134   orangered: 0xff4500,
2135   orchid: 0xda70d6,
2136   palegoldenrod: 0xeee8aa,
2137   palegreen: 0x98fb98,
2138   paleturquoise: 0xafeeee,
2139   palevioletred: 0xdb7093,
2140   papayawhip: 0xffefd5,
2141   peachpuff: 0xffdab9,
2142   peru: 0xcd853f,
2143   pink: 0xffc0cb,
2144   plum: 0xdda0dd,
2145   powderblue: 0xb0e0e6,
2146   purple: 0x800080,
2147   rebeccapurple: 0x663399,
2148   red: 0xff0000,
2149   rosybrown: 0xbc8f8f,
2150   royalblue: 0x4169e1,
2151   saddlebrown: 0x8b4513,
2152   salmon: 0xfa8072,
2153   sandybrown: 0xf4a460,
2154   seagreen: 0x2e8b57,
2155   seashell: 0xfff5ee,
2156   sienna: 0xa0522d,
2157   silver: 0xc0c0c0,
2158   skyblue: 0x87ceeb,
2159   slateblue: 0x6a5acd,
2160   slategray: 0x708090,
2161   slategrey: 0x708090,
2162   snow: 0xfffafa,
2163   springgreen: 0x00ff7f,
2164   steelblue: 0x4682b4,
2165   tan: 0xd2b48c,
2166   teal: 0x008080,
2167   thistle: 0xd8bfd8,
2168   tomato: 0xff6347,
2169   turquoise: 0x40e0d0,
2170   violet: 0xee82ee,
2171   wheat: 0xf5deb3,
2172   white: 0xffffff,
2173   whitesmoke: 0xf5f5f5,
2174   yellow: 0xffff00,
2175   yellowgreen: 0x9acd32
2176 };
2177
2178 define(Color, color, {
2179   displayable: function() {
2180     return this.rgb().displayable();
2181   },
2182   toString: function() {
2183     return this.rgb() + "";
2184   }
2185 });
2186
2187 function color(format) {
2188   var m;
2189   format = (format + "").trim().toLowerCase();
2190   return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00
2191       : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000
2192       : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)
2193       : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)
2194       : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)
2195       : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)
2196       : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)
2197       : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)
2198       : named.hasOwnProperty(format) ? rgbn(named[format])
2199       : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)
2200       : null;
2201 }
2202
2203 function rgbn(n) {
2204   return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
2205 }
2206
2207 function rgba(r, g, b, a) {
2208   if (a <= 0) r = g = b = NaN;
2209   return new Rgb(r, g, b, a);
2210 }
2211
2212 function rgbConvert(o) {
2213   if (!(o instanceof Color)) o = color(o);
2214   if (!o) return new Rgb;
2215   o = o.rgb();
2216   return new Rgb(o.r, o.g, o.b, o.opacity);
2217 }
2218
2219 function rgb(r, g, b, opacity) {
2220   return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
2221 }
2222
2223 function Rgb(r, g, b, opacity) {
2224   this.r = +r;
2225   this.g = +g;
2226   this.b = +b;
2227   this.opacity = +opacity;
2228 }
2229
2230 define(Rgb, rgb, extend(Color, {
2231   brighter: function(k) {
2232     k = k == null ? brighter : Math.pow(brighter, k);
2233     return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
2234   },
2235   darker: function(k) {
2236     k = k == null ? darker : Math.pow(darker, k);
2237     return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
2238   },
2239   rgb: function() {
2240     return this;
2241   },
2242   displayable: function() {
2243     return (0 <= this.r && this.r <= 255)
2244         && (0 <= this.g && this.g <= 255)
2245         && (0 <= this.b && this.b <= 255)
2246         && (0 <= this.opacity && this.opacity <= 1);
2247   },
2248   toString: function() {
2249     var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
2250     return (a === 1 ? "rgb(" : "rgba(")
2251         + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", "
2252         + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", "
2253         + Math.max(0, Math.min(255, Math.round(this.b) || 0))
2254         + (a === 1 ? ")" : ", " + a + ")");
2255   }
2256 }));
2257
2258 function hsla(h, s, l, a) {
2259   if (a <= 0) h = s = l = NaN;
2260   else if (l <= 0 || l >= 1) h = s = NaN;
2261   else if (s <= 0) h = NaN;
2262   return new Hsl(h, s, l, a);
2263 }
2264
2265 function hslConvert(o) {
2266   if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
2267   if (!(o instanceof Color)) o = color(o);
2268   if (!o) return new Hsl;
2269   if (o instanceof Hsl) return o;
2270   o = o.rgb();
2271   var r = o.r / 255,
2272       g = o.g / 255,
2273       b = o.b / 255,
2274       min = Math.min(r, g, b),
2275       max = Math.max(r, g, b),
2276       h = NaN,
2277       s = max - min,
2278       l = (max + min) / 2;
2279   if (s) {
2280     if (r === max) h = (g - b) / s + (g < b) * 6;
2281     else if (g === max) h = (b - r) / s + 2;
2282     else h = (r - g) / s + 4;
2283     s /= l < 0.5 ? max + min : 2 - max - min;
2284     h *= 60;
2285   } else {
2286     s = l > 0 && l < 1 ? 0 : h;
2287   }
2288   return new Hsl(h, s, l, o.opacity);
2289 }
2290
2291 function hsl(h, s, l, opacity) {
2292   return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
2293 }
2294
2295 function Hsl(h, s, l, opacity) {
2296   this.h = +h;
2297   this.s = +s;
2298   this.l = +l;
2299   this.opacity = +opacity;
2300 }
2301
2302 define(Hsl, hsl, extend(Color, {
2303   brighter: function(k) {
2304     k = k == null ? brighter : Math.pow(brighter, k);
2305     return new Hsl(this.h, this.s, this.l * k, this.opacity);
2306   },
2307   darker: function(k) {
2308     k = k == null ? darker : Math.pow(darker, k);
2309     return new Hsl(this.h, this.s, this.l * k, this.opacity);
2310   },
2311   rgb: function() {
2312     var h = this.h % 360 + (this.h < 0) * 360,
2313         s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
2314         l = this.l,
2315         m2 = l + (l < 0.5 ? l : 1 - l) * s,
2316         m1 = 2 * l - m2;
2317     return new Rgb(
2318       hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
2319       hsl2rgb(h, m1, m2),
2320       hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
2321       this.opacity
2322     );
2323   },
2324   displayable: function() {
2325     return (0 <= this.s && this.s <= 1 || isNaN(this.s))
2326         && (0 <= this.l && this.l <= 1)
2327         && (0 <= this.opacity && this.opacity <= 1);
2328   }
2329 }));
2330
2331 /* From FvD 13.37, CSS Color Module Level 3 */
2332 function hsl2rgb(h, m1, m2) {
2333   return (h < 60 ? m1 + (m2 - m1) * h / 60
2334       : h < 180 ? m2
2335       : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60
2336       : m1) * 255;
2337 }
2338
2339 var deg2rad = Math.PI / 180;
2340 var rad2deg = 180 / Math.PI;
2341
2342 var Kn = 18,
2343     Xn = 0.950470, // D65 standard referent
2344     Yn = 1,
2345     Zn = 1.088830,
2346     t0 = 4 / 29,
2347     t1 = 6 / 29,
2348     t2 = 3 * t1 * t1,
2349     t3 = t1 * t1 * t1;
2350
2351 function labConvert(o) {
2352   if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);
2353   if (o instanceof Hcl) {
2354     var h = o.h * deg2rad;
2355     return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);
2356   }
2357   if (!(o instanceof Rgb)) o = rgbConvert(o);
2358   var b = rgb2xyz(o.r),
2359       a = rgb2xyz(o.g),
2360       l = rgb2xyz(o.b),
2361       x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn),
2362       y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn),
2363       z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn);
2364   return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);
2365 }
2366
2367 function lab(l, a, b, opacity) {
2368   return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);
2369 }
2370
2371 function Lab(l, a, b, opacity) {
2372   this.l = +l;
2373   this.a = +a;
2374   this.b = +b;
2375   this.opacity = +opacity;
2376 }
2377
2378 define(Lab, lab, extend(Color, {
2379   brighter: function(k) {
2380     return new Lab(this.l + Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
2381   },
2382   darker: function(k) {
2383     return new Lab(this.l - Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
2384   },
2385   rgb: function() {
2386     var y = (this.l + 16) / 116,
2387         x = isNaN(this.a) ? y : y + this.a / 500,
2388         z = isNaN(this.b) ? y : y - this.b / 200;
2389     y = Yn * lab2xyz(y);
2390     x = Xn * lab2xyz(x);
2391     z = Zn * lab2xyz(z);
2392     return new Rgb(
2393       xyz2rgb( 3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB
2394       xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z),
2395       xyz2rgb( 0.0556434 * x - 0.2040259 * y + 1.0572252 * z),
2396       this.opacity
2397     );
2398   }
2399 }));
2400
2401 function xyz2lab(t) {
2402   return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
2403 }
2404
2405 function lab2xyz(t) {
2406   return t > t1 ? t * t * t : t2 * (t - t0);
2407 }
2408
2409 function xyz2rgb(x) {
2410   return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
2411 }
2412
2413 function rgb2xyz(x) {
2414   return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
2415 }
2416
2417 function hclConvert(o) {
2418   if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);
2419   if (!(o instanceof Lab)) o = labConvert(o);
2420   var h = Math.atan2(o.b, o.a) * rad2deg;
2421   return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);
2422 }
2423
2424 function hcl(h, c, l, opacity) {
2425   return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
2426 }
2427
2428 function Hcl(h, c, l, opacity) {
2429   this.h = +h;
2430   this.c = +c;
2431   this.l = +l;
2432   this.opacity = +opacity;
2433 }
2434
2435 define(Hcl, hcl, extend(Color, {
2436   brighter: function(k) {
2437     return new Hcl(this.h, this.c, this.l + Kn * (k == null ? 1 : k), this.opacity);
2438   },
2439   darker: function(k) {
2440     return new Hcl(this.h, this.c, this.l - Kn * (k == null ? 1 : k), this.opacity);
2441   },
2442   rgb: function() {
2443     return labConvert(this).rgb();
2444   }
2445 }));
2446
2447 var A = -0.14861,
2448     B = +1.78277,
2449     C = -0.29227,
2450     D = -0.90649,
2451     E = +1.97294,
2452     ED = E * D,
2453     EB = E * B,
2454     BC_DA = B * C - D * A;
2455
2456 function cubehelixConvert(o) {
2457   if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);
2458   if (!(o instanceof Rgb)) o = rgbConvert(o);
2459   var r = o.r / 255,
2460       g = o.g / 255,
2461       b = o.b / 255,
2462       l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),
2463       bl = b - l,
2464       k = (E * (g - l) - C * bl) / D,
2465       s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1
2466       h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;
2467   return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);
2468 }
2469
2470 function cubehelix(h, s, l, opacity) {
2471   return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);
2472 }
2473
2474 function Cubehelix(h, s, l, opacity) {
2475   this.h = +h;
2476   this.s = +s;
2477   this.l = +l;
2478   this.opacity = +opacity;
2479 }
2480
2481 define(Cubehelix, cubehelix, extend(Color, {
2482   brighter: function(k) {
2483     k = k == null ? brighter : Math.pow(brighter, k);
2484     return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
2485   },
2486   darker: function(k) {
2487     k = k == null ? darker : Math.pow(darker, k);
2488     return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
2489   },
2490   rgb: function() {
2491     var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,
2492         l = +this.l,
2493         a = isNaN(this.s) ? 0 : this.s * l * (1 - l),
2494         cosh = Math.cos(h),
2495         sinh = Math.sin(h);
2496     return new Rgb(
2497       255 * (l + a * (A * cosh + B * sinh)),
2498       255 * (l + a * (C * cosh + D * sinh)),
2499       255 * (l + a * (E * cosh)),
2500       this.opacity
2501     );
2502   }
2503 }));
2504
2505 function basis(t1, v0, v1, v2, v3) {
2506   var t2 = t1 * t1, t3 = t2 * t1;
2507   return ((1 - 3 * t1 + 3 * t2 - t3) * v0
2508       + (4 - 6 * t2 + 3 * t3) * v1
2509       + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2
2510       + t3 * v3) / 6;
2511 }
2512
2513 function basis$1(values) {
2514   var n = values.length - 1;
2515   return function(t) {
2516     var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),
2517         v1 = values[i],
2518         v2 = values[i + 1],
2519         v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,
2520         v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
2521     return basis((t - i / n) * n, v0, v1, v2, v3);
2522   };
2523 }
2524
2525 function basisClosed(values) {
2526   var n = values.length;
2527   return function(t) {
2528     var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),
2529         v0 = values[(i + n - 1) % n],
2530         v1 = values[i % n],
2531         v2 = values[(i + 1) % n],
2532         v3 = values[(i + 2) % n];
2533     return basis((t - i / n) * n, v0, v1, v2, v3);
2534   };
2535 }
2536
2537 function constant$3(x) {
2538   return function() {
2539     return x;
2540   };
2541 }
2542
2543 function linear(a, d) {
2544   return function(t) {
2545     return a + t * d;
2546   };
2547 }
2548
2549 function exponential(a, b, y) {
2550   return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
2551     return Math.pow(a + t * b, y);
2552   };
2553 }
2554
2555 function hue(a, b) {
2556   var d = b - a;
2557   return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a);
2558 }
2559
2560 function gamma(y) {
2561   return (y = +y) === 1 ? nogamma : function(a, b) {
2562     return b - a ? exponential(a, b, y) : constant$3(isNaN(a) ? b : a);
2563   };
2564 }
2565
2566 function nogamma(a, b) {
2567   var d = b - a;
2568   return d ? linear(a, d) : constant$3(isNaN(a) ? b : a);
2569 }
2570
2571 var d3_interpolateRgb = (function rgbGamma(y) {
2572   var color$$1 = gamma(y);
2573
2574   function rgb$$1(start, end) {
2575     var r = color$$1((start = rgb(start)).r, (end = rgb(end)).r),
2576         g = color$$1(start.g, end.g),
2577         b = color$$1(start.b, end.b),
2578         opacity = nogamma(start.opacity, end.opacity);
2579     return function(t) {
2580       start.r = r(t);
2581       start.g = g(t);
2582       start.b = b(t);
2583       start.opacity = opacity(t);
2584       return start + "";
2585     };
2586   }
2587
2588   rgb$$1.gamma = rgbGamma;
2589
2590   return rgb$$1;
2591 })(1);
2592
2593 function rgbSpline(spline) {
2594   return function(colors) {
2595     var n = colors.length,
2596         r = new Array(n),
2597         g = new Array(n),
2598         b = new Array(n),
2599         i, color$$1;
2600     for (i = 0; i < n; ++i) {
2601       color$$1 = rgb(colors[i]);
2602       r[i] = color$$1.r || 0;
2603       g[i] = color$$1.g || 0;
2604       b[i] = color$$1.b || 0;
2605     }
2606     r = spline(r);
2607     g = spline(g);
2608     b = spline(b);
2609     color$$1.opacity = 1;
2610     return function(t) {
2611       color$$1.r = r(t);
2612       color$$1.g = g(t);
2613       color$$1.b = b(t);
2614       return color$$1 + "";
2615     };
2616   };
2617 }
2618
2619 var rgbBasis = rgbSpline(basis$1);
2620 var rgbBasisClosed = rgbSpline(basisClosed);
2621
2622 function array$1(a, b) {
2623   var nb = b ? b.length : 0,
2624       na = a ? Math.min(nb, a.length) : 0,
2625       x = new Array(na),
2626       c = new Array(nb),
2627       i;
2628
2629   for (i = 0; i < na; ++i) x[i] = d3_interpolate(a[i], b[i]);
2630   for (; i < nb; ++i) c[i] = b[i];
2631
2632   return function(t) {
2633     for (i = 0; i < na; ++i) c[i] = x[i](t);
2634     return c;
2635   };
2636 }
2637
2638 function date(a, b) {
2639   var d = new Date;
2640   return a = +a, b -= a, function(t) {
2641     return d.setTime(a + b * t), d;
2642   };
2643 }
2644
2645 function d3_interpolateNumber(a, b) {
2646   return a = +a, b -= a, function(t) {
2647     return a + b * t;
2648   };
2649 }
2650
2651 function object(a, b) {
2652   var i = {},
2653       c = {},
2654       k;
2655
2656   if (a === null || typeof a !== "object") a = {};
2657   if (b === null || typeof b !== "object") b = {};
2658
2659   for (k in b) {
2660     if (k in a) {
2661       i[k] = d3_interpolate(a[k], b[k]);
2662     } else {
2663       c[k] = b[k];
2664     }
2665   }
2666
2667   return function(t) {
2668     for (k in i) c[k] = i[k](t);
2669     return c;
2670   };
2671 }
2672
2673 var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,
2674     reB = new RegExp(reA.source, "g");
2675
2676 function zero(b) {
2677   return function() {
2678     return b;
2679   };
2680 }
2681
2682 function one(b) {
2683   return function(t) {
2684     return b(t) + "";
2685   };
2686 }
2687
2688 function interpolateString(a, b) {
2689   var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b
2690       am, // current match in a
2691       bm, // current match in b
2692       bs, // string preceding current number in b, if any
2693       i = -1, // index in s
2694       s = [], // string constants and placeholders
2695       q = []; // number interpolators
2696
2697   // Coerce inputs to strings.
2698   a = a + "", b = b + "";
2699
2700   // Interpolate pairs of numbers in a & b.
2701   while ((am = reA.exec(a))
2702       && (bm = reB.exec(b))) {
2703     if ((bs = bm.index) > bi) { // a string precedes the next number in b
2704       bs = b.slice(bi, bs);
2705       if (s[i]) s[i] += bs; // coalesce with previous string
2706       else s[++i] = bs;
2707     }
2708     if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
2709       if (s[i]) s[i] += bm; // coalesce with previous string
2710       else s[++i] = bm;
2711     } else { // interpolate non-matching numbers
2712       s[++i] = null;
2713       q.push({i: i, x: d3_interpolateNumber(am, bm)});
2714     }
2715     bi = reB.lastIndex;
2716   }
2717
2718   // Add remains of b.
2719   if (bi < b.length) {
2720     bs = b.slice(bi);
2721     if (s[i]) s[i] += bs; // coalesce with previous string
2722     else s[++i] = bs;
2723   }
2724
2725   // Special optimization for only a single match.
2726   // Otherwise, interpolate each of the numbers and rejoin the string.
2727   return s.length < 2 ? (q[0]
2728       ? one(q[0].x)
2729       : zero(b))
2730       : (b = q.length, function(t) {
2731           for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
2732           return s.join("");
2733         });
2734 }
2735
2736 function d3_interpolate(a, b) {
2737   var t = typeof b, c;
2738   return b == null || t === "boolean" ? constant$3(b)
2739       : (t === "number" ? d3_interpolateNumber
2740       : t === "string" ? ((c = color(b)) ? (b = c, d3_interpolateRgb) : interpolateString)
2741       : b instanceof color ? d3_interpolateRgb
2742       : b instanceof Date ? date
2743       : Array.isArray(b) ? array$1
2744       : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object
2745       : d3_interpolateNumber)(a, b);
2746 }
2747
2748 function interpolateRound(a, b) {
2749   return a = +a, b -= a, function(t) {
2750     return Math.round(a + b * t);
2751   };
2752 }
2753
2754 var degrees = 180 / Math.PI;
2755
2756 var identity$2 = {
2757   translateX: 0,
2758   translateY: 0,
2759   rotate: 0,
2760   skewX: 0,
2761   scaleX: 1,
2762   scaleY: 1
2763 };
2764
2765 function decompose(a, b, c, d, e, f) {
2766   var scaleX, scaleY, skewX;
2767   if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
2768   if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
2769   if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;
2770   if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
2771   return {
2772     translateX: e,
2773     translateY: f,
2774     rotate: Math.atan2(b, a) * degrees,
2775     skewX: Math.atan(skewX) * degrees,
2776     scaleX: scaleX,
2777     scaleY: scaleY
2778   };
2779 }
2780
2781 var cssNode,
2782     cssRoot,
2783     cssView,
2784     svgNode;
2785
2786 function parseCss(value) {
2787   if (value === "none") return identity$2;
2788   if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView;
2789   cssNode.style.transform = value;
2790   value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform");
2791   cssRoot.removeChild(cssNode);
2792   value = value.slice(7, -1).split(",");
2793   return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);
2794 }
2795
2796 function parseSvg(value) {
2797   if (value == null) return identity$2;
2798   if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
2799   svgNode.setAttribute("transform", value);
2800   if (!(value = svgNode.transform.baseVal.consolidate())) return identity$2;
2801   value = value.matrix;
2802   return decompose(value.a, value.b, value.c, value.d, value.e, value.f);
2803 }
2804
2805 function interpolateTransform(parse, pxComma, pxParen, degParen) {
2806
2807   function pop(s) {
2808     return s.length ? s.pop() + " " : "";
2809   }
2810
2811   function translate(xa, ya, xb, yb, s, q) {
2812     if (xa !== xb || ya !== yb) {
2813       var i = s.push("translate(", null, pxComma, null, pxParen);
2814       q.push({i: i - 4, x: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_interpolateNumber(ya, yb)});
2815     } else if (xb || yb) {
2816       s.push("translate(" + xb + pxComma + yb + pxParen);
2817     }
2818   }
2819
2820   function rotate(a, b, s, q) {
2821     if (a !== b) {
2822       if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path
2823       q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: d3_interpolateNumber(a, b)});
2824     } else if (b) {
2825       s.push(pop(s) + "rotate(" + b + degParen);
2826     }
2827   }
2828
2829   function skewX(a, b, s, q) {
2830     if (a !== b) {
2831       q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: d3_interpolateNumber(a, b)});
2832     } else if (b) {
2833       s.push(pop(s) + "skewX(" + b + degParen);
2834     }
2835   }
2836
2837   function scale(xa, ya, xb, yb, s, q) {
2838     if (xa !== xb || ya !== yb) {
2839       var i = s.push(pop(s) + "scale(", null, ",", null, ")");
2840       q.push({i: i - 4, x: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_interpolateNumber(ya, yb)});
2841     } else if (xb !== 1 || yb !== 1) {
2842       s.push(pop(s) + "scale(" + xb + "," + yb + ")");
2843     }
2844   }
2845
2846   return function(a, b) {
2847     var s = [], // string constants and placeholders
2848         q = []; // number interpolators
2849     a = parse(a), b = parse(b);
2850     translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
2851     rotate(a.rotate, b.rotate, s, q);
2852     skewX(a.skewX, b.skewX, s, q);
2853     scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
2854     a = b = null; // gc
2855     return function(t) {
2856       var i = -1, n = q.length, o;
2857       while (++i < n) s[(o = q[i]).i] = o.x(t);
2858       return s.join("");
2859     };
2860   };
2861 }
2862
2863 var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
2864 var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
2865
2866 var rho = Math.SQRT2,
2867     rho2 = 2,
2868     rho4 = 4,
2869     epsilon2 = 1e-12;
2870
2871 function cosh(x) {
2872   return ((x = Math.exp(x)) + 1 / x) / 2;
2873 }
2874
2875 function sinh(x) {
2876   return ((x = Math.exp(x)) - 1 / x) / 2;
2877 }
2878
2879 function tanh(x) {
2880   return ((x = Math.exp(2 * x)) - 1) / (x + 1);
2881 }
2882
2883 // p0 = [ux0, uy0, w0]
2884 // p1 = [ux1, uy1, w1]
2885 function interpolateZoom(p0, p1) {
2886   var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],
2887       ux1 = p1[0], uy1 = p1[1], w1 = p1[2],
2888       dx = ux1 - ux0,
2889       dy = uy1 - uy0,
2890       d2 = dx * dx + dy * dy,
2891       i,
2892       S;
2893
2894   // Special case for u0 ≅ u1.
2895   if (d2 < epsilon2) {
2896     S = Math.log(w1 / w0) / rho;
2897     i = function(t) {
2898       return [
2899         ux0 + t * dx,
2900         uy0 + t * dy,
2901         w0 * Math.exp(rho * t * S)
2902       ];
2903     };
2904   }
2905
2906   // General case.
2907   else {
2908     var d1 = Math.sqrt(d2),
2909         b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),
2910         b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),
2911         r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),
2912         r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
2913     S = (r1 - r0) / rho;
2914     i = function(t) {
2915       var s = t * S,
2916           coshr0 = cosh(r0),
2917           u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
2918       return [
2919         ux0 + u * dx,
2920         uy0 + u * dy,
2921         w0 * coshr0 / cosh(rho * s + r0)
2922       ];
2923     };
2924   }
2925
2926   i.duration = S * 1000;
2927
2928   return i;
2929 }
2930
2931 function hsl$1(hue$$1) {
2932   return function(start, end) {
2933     var h = hue$$1((start = hsl(start)).h, (end = hsl(end)).h),
2934         s = nogamma(start.s, end.s),
2935         l = nogamma(start.l, end.l),
2936         opacity = nogamma(start.opacity, end.opacity);
2937     return function(t) {
2938       start.h = h(t);
2939       start.s = s(t);
2940       start.l = l(t);
2941       start.opacity = opacity(t);
2942       return start + "";
2943     };
2944   }
2945 }
2946
2947 var hsl$2 = hsl$1(hue);
2948 var hslLong = hsl$1(nogamma);
2949
2950 function lab$1(start, end) {
2951   var l = nogamma((start = lab(start)).l, (end = lab(end)).l),
2952       a = nogamma(start.a, end.a),
2953       b = nogamma(start.b, end.b),
2954       opacity = nogamma(start.opacity, end.opacity);
2955   return function(t) {
2956     start.l = l(t);
2957     start.a = a(t);
2958     start.b = b(t);
2959     start.opacity = opacity(t);
2960     return start + "";
2961   };
2962 }
2963
2964 function hcl$1(hue$$1) {
2965   return function(start, end) {
2966     var h = hue$$1((start = hcl(start)).h, (end = hcl(end)).h),
2967         c = nogamma(start.c, end.c),
2968         l = nogamma(start.l, end.l),
2969         opacity = nogamma(start.opacity, end.opacity);
2970     return function(t) {
2971       start.h = h(t);
2972       start.c = c(t);
2973       start.l = l(t);
2974       start.opacity = opacity(t);
2975       return start + "";
2976     };
2977   }
2978 }
2979
2980 var hcl$2 = hcl$1(hue);
2981 var hclLong = hcl$1(nogamma);
2982
2983 function cubehelix$1(hue$$1) {
2984   return (function cubehelixGamma(y) {
2985     y = +y;
2986
2987     function cubehelix$$1(start, end) {
2988       var h = hue$$1((start = cubehelix(start)).h, (end = cubehelix(end)).h),
2989           s = nogamma(start.s, end.s),
2990           l = nogamma(start.l, end.l),
2991           opacity = nogamma(start.opacity, end.opacity);
2992       return function(t) {
2993         start.h = h(t);
2994         start.s = s(t);
2995         start.l = l(Math.pow(t, y));
2996         start.opacity = opacity(t);
2997         return start + "";
2998       };
2999     }
3000
3001     cubehelix$$1.gamma = cubehelixGamma;
3002
3003     return cubehelix$$1;
3004   })(1);
3005 }
3006
3007 var cubehelix$2 = cubehelix$1(hue);
3008 var cubehelixLong = cubehelix$1(nogamma);
3009
3010 function d3_quantize(interpolator, n) {
3011   var samples = new Array(n);
3012   for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));
3013   return samples;
3014 }
3015
3016 var frame = 0, // is an animation frame pending?
3017     timeout = 0, // is a timeout pending?
3018     interval = 0, // are any timers active?
3019     pokeDelay = 1000, // how frequently we check for clock skew
3020     taskHead,
3021     taskTail,
3022     clockLast = 0,
3023     clockNow = 0,
3024     clockSkew = 0,
3025     clock = typeof performance === "object" && performance.now ? performance : Date,
3026     setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };
3027
3028 function now() {
3029   return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
3030 }
3031
3032 function clearNow() {
3033   clockNow = 0;
3034 }
3035
3036 function Timer() {
3037   this._call =
3038   this._time =
3039   this._next = null;
3040 }
3041
3042 Timer.prototype = timer.prototype = {
3043   constructor: Timer,
3044   restart: function(callback, delay, time) {
3045     if (typeof callback !== "function") throw new TypeError("callback is not a function");
3046     time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
3047     if (!this._next && taskTail !== this) {
3048       if (taskTail) taskTail._next = this;
3049       else taskHead = this;
3050       taskTail = this;
3051     }
3052     this._call = callback;
3053     this._time = time;
3054     sleep();
3055   },
3056   stop: function() {
3057     if (this._call) {
3058       this._call = null;
3059       this._time = Infinity;
3060       sleep();
3061     }
3062   }
3063 };
3064
3065 function timer(callback, delay, time) {
3066   var t = new Timer;
3067   t.restart(callback, delay, time);
3068   return t;
3069 }
3070
3071 function timerFlush() {
3072   now(); // Get the current time, if not already set.
3073   ++frame; // Pretend we’ve set an alarm, if we haven’t already.
3074   var t = taskHead, e;
3075   while (t) {
3076     if ((e = clockNow - t._time) >= 0) t._call.call(null, e);
3077     t = t._next;
3078   }
3079   --frame;
3080 }
3081
3082 function wake() {
3083   clockNow = (clockLast = clock.now()) + clockSkew;
3084   frame = timeout = 0;
3085   try {
3086     timerFlush();
3087   } finally {
3088     frame = 0;
3089     nap();
3090     clockNow = 0;
3091   }
3092 }
3093
3094 function poke() {
3095   var now = clock.now(), delay = now - clockLast;
3096   if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
3097 }
3098
3099 function nap() {
3100   var t0, t1 = taskHead, t2, time = Infinity;
3101   while (t1) {
3102     if (t1._call) {
3103       if (time > t1._time) time = t1._time;
3104       t0 = t1, t1 = t1._next;
3105     } else {
3106       t2 = t1._next, t1._next = null;
3107       t1 = t0 ? t0._next = t2 : taskHead = t2;
3108     }
3109   }
3110   taskTail = t0;
3111   sleep(time);
3112 }
3113
3114 function sleep(time) {
3115   if (frame) return; // Soonest alarm already set, or will be.
3116   if (timeout) timeout = clearTimeout(timeout);
3117   var delay = time - clockNow; // Strictly less than if we recomputed clockNow.
3118   if (delay > 24) {
3119     if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);
3120     if (interval) interval = clearInterval(interval);
3121   } else {
3122     if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
3123     frame = 1, setFrame(wake);
3124   }
3125 }
3126
3127 function d3_timeout(callback, delay, time) {
3128   var t = new Timer;
3129   delay = delay == null ? 0 : +delay;
3130   t.restart(function(elapsed) {
3131     t.stop();
3132     callback(elapsed + delay);
3133   }, delay, time);
3134   return t;
3135 }
3136
3137 function interval$1(callback, delay, time) {
3138   var t = new Timer, total = delay;
3139   if (delay == null) return t.restart(callback, delay, time), t;
3140   delay = +delay, time = time == null ? now() : +time;
3141   t.restart(function tick(elapsed) {
3142     elapsed += total;
3143     t.restart(tick, total += delay, time);
3144     callback(elapsed);
3145   }, delay, time);
3146   return t;
3147 }
3148
3149 var emptyOn = dispatch("start", "end", "interrupt");
3150 var emptyTween = [];
3151
3152 var CREATED = 0;
3153 var SCHEDULED = 1;
3154 var STARTING = 2;
3155 var STARTED = 3;
3156 var RUNNING = 4;
3157 var ENDING = 5;
3158 var ENDED = 6;
3159
3160 function schedule(node, name, id, index, group, timing) {
3161   var schedules = node.__transition;
3162   if (!schedules) node.__transition = {};
3163   else if (id in schedules) return;
3164   create$1(node, id, {
3165     name: name,
3166     index: index, // For context during callback.
3167     group: group, // For context during callback.
3168     on: emptyOn,
3169     tween: emptyTween,
3170     time: timing.time,
3171     delay: timing.delay,
3172     duration: timing.duration,
3173     ease: timing.ease,
3174     timer: null,
3175     state: CREATED
3176   });
3177 }
3178
3179 function init(node, id) {
3180   var schedule = get$1(node, id);
3181   if (schedule.state > CREATED) throw new Error("too late; already scheduled");
3182   return schedule;
3183 }
3184
3185 function set$1(node, id) {
3186   var schedule = get$1(node, id);
3187   if (schedule.state > STARTING) throw new Error("too late; already started");
3188   return schedule;
3189 }
3190
3191 function get$1(node, id) {
3192   var schedule = node.__transition;
3193   if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found");
3194   return schedule;
3195 }
3196
3197 function create$1(node, id, self) {
3198   var schedules = node.__transition,
3199       tween;
3200
3201   // Initialize the self timer when the transition is created.
3202   // Note the actual delay is not known until the first callback!
3203   schedules[id] = self;
3204   self.timer = timer(schedule, 0, self.time);
3205
3206   function schedule(elapsed) {
3207     self.state = SCHEDULED;
3208     self.timer.restart(start, self.delay, self.time);
3209
3210     // If the elapsed delay is less than our first sleep, start immediately.
3211     if (self.delay <= elapsed) start(elapsed - self.delay);
3212   }
3213
3214   function start(elapsed) {
3215     var i, j, n, o;
3216
3217     // If the state is not SCHEDULED, then we previously errored on start.
3218     if (self.state !== SCHEDULED) return stop();
3219
3220     for (i in schedules) {
3221       o = schedules[i];
3222       if (o.name !== self.name) continue;
3223
3224       // While this element already has a starting transition during this frame,
3225       // defer starting an interrupting transition until that transition has a
3226       // chance to tick (and possibly end); see d3/d3-transition#54!
3227       if (o.state === STARTED) return d3_timeout(start);
3228
3229       // Interrupt the active transition, if any.
3230       // Dispatch the interrupt event.
3231       if (o.state === RUNNING) {
3232         o.state = ENDED;
3233         o.timer.stop();
3234         o.on.call("interrupt", node, node.__data__, o.index, o.group);
3235         delete schedules[i];
3236       }
3237
3238       // Cancel any pre-empted transitions. No interrupt event is dispatched
3239       // because the cancelled transitions never started. Note that this also
3240       // removes this transition from the pending list!
3241       else if (+i < id) {
3242         o.state = ENDED;
3243         o.timer.stop();
3244         delete schedules[i];
3245       }
3246     }
3247
3248     // Defer the first tick to end of the current frame; see d3/d3#1576.
3249     // Note the transition may be canceled after start and before the first tick!
3250     // Note this must be scheduled before the start event; see d3/d3-transition#16!
3251     // Assuming this is successful, subsequent callbacks go straight to tick.
3252     d3_timeout(function() {
3253       if (self.state === STARTED) {
3254         self.state = RUNNING;
3255         self.timer.restart(tick, self.delay, self.time);
3256         tick(elapsed);
3257       }
3258     });
3259
3260     // Dispatch the start event.
3261     // Note this must be done before the tween are initialized.
3262     self.state = STARTING;
3263     self.on.call("start", node, node.__data__, self.index, self.group);
3264     if (self.state !== STARTING) return; // interrupted
3265     self.state = STARTED;
3266
3267     // Initialize the tween, deleting null tween.
3268     tween = new Array(n = self.tween.length);
3269     for (i = 0, j = -1; i < n; ++i) {
3270       if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {
3271         tween[++j] = o;
3272       }
3273     }
3274     tween.length = j + 1;
3275   }
3276
3277   function tick(elapsed) {
3278     var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),
3279         i = -1,
3280         n = tween.length;
3281
3282     while (++i < n) {
3283       tween[i].call(null, t);
3284     }
3285
3286     // Dispatch the end event.
3287     if (self.state === ENDING) {
3288       self.on.call("end", node, node.__data__, self.index, self.group);
3289       stop();
3290     }
3291   }
3292
3293   function stop() {
3294     self.state = ENDED;
3295     self.timer.stop();
3296     delete schedules[id];
3297     for (var i in schedules) return; // eslint-disable-line no-unused-vars
3298     delete node.__transition;
3299   }
3300 }
3301
3302 function interrupt(node, name) {
3303   var schedules = node.__transition,
3304       schedule$$1,
3305       active,
3306       empty = true,
3307       i;
3308
3309   if (!schedules) return;
3310
3311   name = name == null ? null : name + "";
3312
3313   for (i in schedules) {
3314     if ((schedule$$1 = schedules[i]).name !== name) { empty = false; continue; }
3315     active = schedule$$1.state > STARTING && schedule$$1.state < ENDING;
3316     schedule$$1.state = ENDED;
3317     schedule$$1.timer.stop();
3318     if (active) schedule$$1.on.call("interrupt", node, node.__data__, schedule$$1.index, schedule$$1.group);
3319     delete schedules[i];
3320   }
3321
3322   if (empty) delete node.__transition;
3323 }
3324
3325 function selection_interrupt(name) {
3326   return this.each(function() {
3327     interrupt(this, name);
3328   });
3329 }
3330
3331 function tweenRemove(id, name) {
3332   var tween0, tween1;
3333   return function() {
3334     var schedule$$1 = set$1(this, id),
3335         tween = schedule$$1.tween;
3336
3337     // If this node shared tween with the previous node,
3338     // just assign the updated shared tween and we’re done!
3339     // Otherwise, copy-on-write.
3340     if (tween !== tween0) {
3341       tween1 = tween0 = tween;
3342       for (var i = 0, n = tween1.length; i < n; ++i) {
3343         if (tween1[i].name === name) {
3344           tween1 = tween1.slice();
3345           tween1.splice(i, 1);
3346           break;
3347         }
3348       }
3349     }
3350
3351     schedule$$1.tween = tween1;
3352   };
3353 }
3354
3355 function tweenFunction(id, name, value) {
3356   var tween0, tween1;
3357   if (typeof value !== "function") throw new Error;
3358   return function() {
3359     var schedule$$1 = set$1(this, id),
3360         tween = schedule$$1.tween;
3361
3362     // If this node shared tween with the previous node,
3363     // just assign the updated shared tween and we’re done!
3364     // Otherwise, copy-on-write.
3365     if (tween !== tween0) {
3366       tween1 = (tween0 = tween).slice();
3367       for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {
3368         if (tween1[i].name === name) {
3369           tween1[i] = t;
3370           break;
3371         }
3372       }
3373       if (i === n) tween1.push(t);
3374     }
3375
3376     schedule$$1.tween = tween1;
3377   };
3378 }
3379
3380 function transition_tween(name, value) {
3381   var id = this._id;
3382
3383   name += "";
3384
3385   if (arguments.length < 2) {
3386     var tween = get$1(this.node(), id).tween;
3387     for (var i = 0, n = tween.length, t; i < n; ++i) {
3388       if ((t = tween[i]).name === name) {
3389         return t.value;
3390       }
3391     }
3392     return null;
3393   }
3394
3395   return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
3396 }
3397
3398 function tweenValue(transition, name, value) {
3399   var id = transition._id;
3400
3401   transition.each(function() {
3402     var schedule$$1 = set$1(this, id);
3403     (schedule$$1.value || (schedule$$1.value = {}))[name] = value.apply(this, arguments);
3404   });
3405
3406   return function(node) {
3407     return get$1(node, id).value[name];
3408   };
3409 }
3410
3411 function interpolate(a, b) {
3412   var c;
3413   return (typeof b === "number" ? d3_interpolateNumber
3414       : b instanceof color ? d3_interpolateRgb
3415       : (c = color(b)) ? (b = c, d3_interpolateRgb)
3416       : interpolateString)(a, b);
3417 }
3418
3419 function attrRemove$1(name) {
3420   return function() {
3421     this.removeAttribute(name);
3422   };
3423 }
3424
3425 function attrRemoveNS$1(fullname) {
3426   return function() {
3427     this.removeAttributeNS(fullname.space, fullname.local);
3428   };
3429 }
3430
3431 function attrConstant$1(name, interpolate$$1, value1) {
3432   var value00,
3433       interpolate0;
3434   return function() {
3435     var value0 = this.getAttribute(name);
3436     return value0 === value1 ? null
3437         : value0 === value00 ? interpolate0
3438         : interpolate0 = interpolate$$1(value00 = value0, value1);
3439   };
3440 }
3441
3442 function attrConstantNS$1(fullname, interpolate$$1, value1) {
3443   var value00,
3444       interpolate0;
3445   return function() {
3446     var value0 = this.getAttributeNS(fullname.space, fullname.local);
3447     return value0 === value1 ? null
3448         : value0 === value00 ? interpolate0
3449         : interpolate0 = interpolate$$1(value00 = value0, value1);
3450   };
3451 }
3452
3453 function attrFunction$1(name, interpolate$$1, value) {
3454   var value00,
3455       value10,
3456       interpolate0;
3457   return function() {
3458     var value0, value1 = value(this);
3459     if (value1 == null) return void this.removeAttribute(name);
3460     value0 = this.getAttribute(name);
3461     return value0 === value1 ? null
3462         : value0 === value00 && value1 === value10 ? interpolate0
3463         : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3464   };
3465 }
3466
3467 function attrFunctionNS$1(fullname, interpolate$$1, value) {
3468   var value00,
3469       value10,
3470       interpolate0;
3471   return function() {
3472     var value0, value1 = value(this);
3473     if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);
3474     value0 = this.getAttributeNS(fullname.space, fullname.local);
3475     return value0 === value1 ? null
3476         : value0 === value00 && value1 === value10 ? interpolate0
3477         : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3478   };
3479 }
3480
3481 function transition_attr(name, value) {
3482   var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate;
3483   return this.attrTween(name, typeof value === "function"
3484       ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value))
3485       : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname)
3486       : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value + ""));
3487 }
3488
3489 function attrTweenNS(fullname, value) {
3490   function tween() {
3491     var node = this, i = value.apply(node, arguments);
3492     return i && function(t) {
3493       node.setAttributeNS(fullname.space, fullname.local, i(t));
3494     };
3495   }
3496   tween._value = value;
3497   return tween;
3498 }
3499
3500 function attrTween(name, value) {
3501   function tween() {
3502     var node = this, i = value.apply(node, arguments);
3503     return i && function(t) {
3504       node.setAttribute(name, i(t));
3505     };
3506   }
3507   tween._value = value;
3508   return tween;
3509 }
3510
3511 function transition_attrTween(name, value) {
3512   var key = "attr." + name;
3513   if (arguments.length < 2) return (key = this.tween(key)) && key._value;
3514   if (value == null) return this.tween(key, null);
3515   if (typeof value !== "function") throw new Error;
3516   var fullname = namespace(name);
3517   return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
3518 }
3519
3520 function delayFunction(id, value) {
3521   return function() {
3522     init(this, id).delay = +value.apply(this, arguments);
3523   };
3524 }
3525
3526 function delayConstant(id, value) {
3527   return value = +value, function() {
3528     init(this, id).delay = value;
3529   };
3530 }
3531
3532 function transition_delay(value) {
3533   var id = this._id;
3534
3535   return arguments.length
3536       ? this.each((typeof value === "function"
3537           ? delayFunction
3538           : delayConstant)(id, value))
3539       : get$1(this.node(), id).delay;
3540 }
3541
3542 function durationFunction(id, value) {
3543   return function() {
3544     set$1(this, id).duration = +value.apply(this, arguments);
3545   };
3546 }
3547
3548 function durationConstant(id, value) {
3549   return value = +value, function() {
3550     set$1(this, id).duration = value;
3551   };
3552 }
3553
3554 function transition_duration(value) {
3555   var id = this._id;
3556
3557   return arguments.length
3558       ? this.each((typeof value === "function"
3559           ? durationFunction
3560           : durationConstant)(id, value))
3561       : get$1(this.node(), id).duration;
3562 }
3563
3564 function easeConstant(id, value) {
3565   if (typeof value !== "function") throw new Error;
3566   return function() {
3567     set$1(this, id).ease = value;
3568   };
3569 }
3570
3571 function transition_ease(value) {
3572   var id = this._id;
3573
3574   return arguments.length
3575       ? this.each(easeConstant(id, value))
3576       : get$1(this.node(), id).ease;
3577 }
3578
3579 function transition_filter(match) {
3580   if (typeof match !== "function") match = matcher$1(match);
3581
3582   for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
3583     for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
3584       if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
3585         subgroup.push(node);
3586       }
3587     }
3588   }
3589
3590   return new Transition(subgroups, this._parents, this._name, this._id);
3591 }
3592
3593 function transition_merge(transition$$1) {
3594   if (transition$$1._id !== this._id) throw new Error;
3595
3596   for (var groups0 = this._groups, groups1 = transition$$1._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
3597     for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
3598       if (node = group0[i] || group1[i]) {
3599         merge[i] = node;
3600       }
3601     }
3602   }
3603
3604   for (; j < m0; ++j) {
3605     merges[j] = groups0[j];
3606   }
3607
3608   return new Transition(merges, this._parents, this._name, this._id);
3609 }
3610
3611 function start(name) {
3612   return (name + "").trim().split(/^|\s+/).every(function(t) {
3613     var i = t.indexOf(".");
3614     if (i >= 0) t = t.slice(0, i);
3615     return !t || t === "start";
3616   });
3617 }
3618
3619 function onFunction(id, name, listener) {
3620   var on0, on1, sit = start(name) ? init : set$1;
3621   return function() {
3622     var schedule$$1 = sit(this, id),
3623         on = schedule$$1.on;
3624
3625     // If this node shared a dispatch with the previous node,
3626     // just assign the updated shared dispatch and we’re done!
3627     // Otherwise, copy-on-write.
3628     if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);
3629
3630     schedule$$1.on = on1;
3631   };
3632 }
3633
3634 function transition_on(name, listener) {
3635   var id = this._id;
3636
3637   return arguments.length < 2
3638       ? get$1(this.node(), id).on.on(name)
3639       : this.each(onFunction(id, name, listener));
3640 }
3641
3642 function removeFunction(id) {
3643   return function() {
3644     var parent = this.parentNode;
3645     for (var i in this.__transition) if (+i !== id) return;
3646     if (parent) parent.removeChild(this);
3647   };
3648 }
3649
3650 function transition_remove() {
3651   return this.on("end.remove", removeFunction(this._id));
3652 }
3653
3654 function transition_select(select) {
3655   var name = this._name,
3656       id = this._id;
3657
3658   if (typeof select !== "function") select = selector(select);
3659
3660   for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
3661     for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
3662       if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
3663         if ("__data__" in node) subnode.__data__ = node.__data__;
3664         subgroup[i] = subnode;
3665         schedule(subgroup[i], name, id, i, subgroup, get$1(node, id));
3666       }
3667     }
3668   }
3669
3670   return new Transition(subgroups, this._parents, name, id);
3671 }
3672
3673 function transition_selectAll(select) {
3674   var name = this._name,
3675       id = this._id;
3676
3677   if (typeof select !== "function") select = selectorAll(select);
3678
3679   for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
3680     for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
3681       if (node = group[i]) {
3682         for (var children = select.call(node, node.__data__, i, group), child, inherit = get$1(node, id), k = 0, l = children.length; k < l; ++k) {
3683           if (child = children[k]) {
3684             schedule(child, name, id, k, children, inherit);
3685           }
3686         }
3687         subgroups.push(children);
3688         parents.push(node);
3689       }
3690     }
3691   }
3692
3693   return new Transition(subgroups, parents, name, id);
3694 }
3695
3696 var Selection$1 = selection.prototype.constructor;
3697
3698 function transition_selection() {
3699   return new Selection$1(this._groups, this._parents);
3700 }
3701
3702 function styleRemove$1(name, interpolate$$1) {
3703   var value00,
3704       value10,
3705       interpolate0;
3706   return function() {
3707     var value0 = styleValue(this, name),
3708         value1 = (this.style.removeProperty(name), styleValue(this, name));
3709     return value0 === value1 ? null
3710         : value0 === value00 && value1 === value10 ? interpolate0
3711         : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3712   };
3713 }
3714
3715 function styleRemoveEnd(name) {
3716   return function() {
3717     this.style.removeProperty(name);
3718   };
3719 }
3720
3721 function styleConstant$1(name, interpolate$$1, value1) {
3722   var value00,
3723       interpolate0;
3724   return function() {
3725     var value0 = styleValue(this, name);
3726     return value0 === value1 ? null
3727         : value0 === value00 ? interpolate0
3728         : interpolate0 = interpolate$$1(value00 = value0, value1);
3729   };
3730 }
3731
3732 function styleFunction$1(name, interpolate$$1, value) {
3733   var value00,
3734       value10,
3735       interpolate0;
3736   return function() {
3737     var value0 = styleValue(this, name),
3738         value1 = value(this);
3739     if (value1 == null) value1 = (this.style.removeProperty(name), styleValue(this, name));
3740     return value0 === value1 ? null
3741         : value0 === value00 && value1 === value10 ? interpolate0
3742         : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3743   };
3744 }
3745
3746 function transition_style(name, value, priority) {
3747   var i = (name += "") === "transform" ? interpolateTransformCss : interpolate;
3748   return value == null ? this
3749           .styleTween(name, styleRemove$1(name, i))
3750           .on("end.style." + name, styleRemoveEnd(name))
3751       : this.styleTween(name, typeof value === "function"
3752           ? styleFunction$1(name, i, tweenValue(this, "style." + name, value))
3753           : styleConstant$1(name, i, value + ""), priority);
3754 }
3755
3756 function styleTween(name, value, priority) {
3757   function tween() {
3758     var node = this, i = value.apply(node, arguments);
3759     return i && function(t) {
3760       node.style.setProperty(name, i(t), priority);
3761     };
3762   }
3763   tween._value = value;
3764   return tween;
3765 }
3766
3767 function transition_styleTween(name, value, priority) {
3768   var key = "style." + (name += "");
3769   if (arguments.length < 2) return (key = this.tween(key)) && key._value;
3770   if (value == null) return this.tween(key, null);
3771   if (typeof value !== "function") throw new Error;
3772   return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
3773 }
3774
3775 function textConstant$1(value) {
3776   return function() {
3777     this.textContent = value;
3778   };
3779 }
3780
3781 function textFunction$1(value) {
3782   return function() {
3783     var value1 = value(this);
3784     this.textContent = value1 == null ? "" : value1;
3785   };
3786 }
3787
3788 function transition_text(value) {
3789   return this.tween("text", typeof value === "function"
3790       ? textFunction$1(tweenValue(this, "text", value))
3791       : textConstant$1(value == null ? "" : value + ""));
3792 }
3793
3794 function transition_transition() {
3795   var name = this._name,
3796       id0 = this._id,
3797       id1 = newId();
3798
3799   for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
3800     for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
3801       if (node = group[i]) {
3802         var inherit = get$1(node, id0);
3803         schedule(node, name, id1, i, group, {
3804           time: inherit.time + inherit.delay + inherit.duration,
3805           delay: 0,
3806           duration: inherit.duration,
3807           ease: inherit.ease
3808         });
3809       }
3810     }
3811   }
3812
3813   return new Transition(groups, this._parents, name, id1);
3814 }
3815
3816 var id = 0;
3817
3818 function Transition(groups, parents, name, id) {
3819   this._groups = groups;
3820   this._parents = parents;
3821   this._name = name;
3822   this._id = id;
3823 }
3824
3825 function transition(name) {
3826   return selection().transition(name);
3827 }
3828
3829 function newId() {
3830   return ++id;
3831 }
3832
3833 var selection_prototype = selection.prototype;
3834
3835 Transition.prototype = transition.prototype = {
3836   constructor: Transition,
3837   select: transition_select,
3838   selectAll: transition_selectAll,
3839   filter: transition_filter,
3840   merge: transition_merge,
3841   selection: transition_selection,
3842   transition: transition_transition,
3843   call: selection_prototype.call,
3844   nodes: selection_prototype.nodes,
3845   node: selection_prototype.node,
3846   size: selection_prototype.size,
3847   empty: selection_prototype.empty,
3848   each: selection_prototype.each,
3849   on: transition_on,
3850   attr: transition_attr,
3851   attrTween: transition_attrTween,
3852   style: transition_style,
3853   styleTween: transition_styleTween,
3854   text: transition_text,
3855   remove: transition_remove,
3856   tween: transition_tween,
3857   delay: transition_delay,
3858   duration: transition_duration,
3859   ease: transition_ease
3860 };
3861
3862 function linear$1(t) {
3863   return +t;
3864 }
3865
3866 function quadIn(t) {
3867   return t * t;
3868 }
3869
3870 function quadOut(t) {
3871   return t * (2 - t);
3872 }
3873
3874 function quadInOut(t) {
3875   return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;
3876 }
3877
3878 function cubicIn(t) {
3879   return t * t * t;
3880 }
3881
3882 function cubicOut(t) {
3883   return --t * t * t + 1;
3884 }
3885
3886 function cubicInOut(t) {
3887   return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
3888 }
3889
3890 var exponent = 3;
3891
3892 var polyIn = (function custom(e) {
3893   e = +e;
3894
3895   function polyIn(t) {
3896     return Math.pow(t, e);
3897   }
3898
3899   polyIn.exponent = custom;
3900
3901   return polyIn;
3902 })(exponent);
3903
3904 var polyOut = (function custom(e) {
3905   e = +e;
3906
3907   function polyOut(t) {
3908     return 1 - Math.pow(1 - t, e);
3909   }
3910
3911   polyOut.exponent = custom;
3912
3913   return polyOut;
3914 })(exponent);
3915
3916 var polyInOut = (function custom(e) {
3917   e = +e;
3918
3919   function polyInOut(t) {
3920     return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;
3921   }
3922
3923   polyInOut.exponent = custom;
3924
3925   return polyInOut;
3926 })(exponent);
3927
3928 var pi = Math.PI,
3929     halfPi = pi / 2;
3930
3931 function sinIn(t) {
3932   return 1 - Math.cos(t * halfPi);
3933 }
3934
3935 function sinOut(t) {
3936   return Math.sin(t * halfPi);
3937 }
3938
3939 function sinInOut(t) {
3940   return (1 - Math.cos(pi * t)) / 2;
3941 }
3942
3943 function expIn(t) {
3944   return Math.pow(2, 10 * t - 10);
3945 }
3946
3947 function expOut(t) {
3948   return 1 - Math.pow(2, -10 * t);
3949 }
3950
3951 function expInOut(t) {
3952   return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;
3953 }
3954
3955 function circleIn(t) {
3956   return 1 - Math.sqrt(1 - t * t);
3957 }
3958
3959 function circleOut(t) {
3960   return Math.sqrt(1 - --t * t);
3961 }
3962
3963 function circleInOut(t) {
3964   return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;
3965 }
3966
3967 var b1 = 4 / 11,
3968     b2 = 6 / 11,
3969     b3 = 8 / 11,
3970     b4 = 3 / 4,
3971     b5 = 9 / 11,
3972     b6 = 10 / 11,
3973     b7 = 15 / 16,
3974     b8 = 21 / 22,
3975     b9 = 63 / 64,
3976     b0 = 1 / b1 / b1;
3977
3978 function bounceIn(t) {
3979   return 1 - bounceOut(1 - t);
3980 }
3981
3982 function bounceOut(t) {
3983   return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;
3984 }
3985
3986 function bounceInOut(t) {
3987   return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;
3988 }
3989
3990 var overshoot = 1.70158;
3991
3992 var backIn = (function custom(s) {
3993   s = +s;
3994
3995   function backIn(t) {
3996     return t * t * ((s + 1) * t - s);
3997   }
3998
3999   backIn.overshoot = custom;
4000
4001   return backIn;
4002 })(overshoot);
4003
4004 var backOut = (function custom(s) {
4005   s = +s;
4006
4007   function backOut(t) {
4008     return --t * t * ((s + 1) * t + s) + 1;
4009   }
4010
4011   backOut.overshoot = custom;
4012
4013   return backOut;
4014 })(overshoot);
4015
4016 var backInOut = (function custom(s) {
4017   s = +s;
4018
4019   function backInOut(t) {
4020     return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;
4021   }
4022
4023   backInOut.overshoot = custom;
4024
4025   return backInOut;
4026 })(overshoot);
4027
4028 var tau = 2 * Math.PI,
4029     amplitude = 1,
4030     period = 0.3;
4031
4032 var elasticIn = (function custom(a, p) {
4033   var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4034
4035   function elasticIn(t) {
4036     return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);
4037   }
4038
4039   elasticIn.amplitude = function(a) { return custom(a, p * tau); };
4040   elasticIn.period = function(p) { return custom(a, p); };
4041
4042   return elasticIn;
4043 })(amplitude, period);
4044
4045 var elasticOut = (function custom(a, p) {
4046   var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4047
4048   function elasticOut(t) {
4049     return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);
4050   }
4051
4052   elasticOut.amplitude = function(a) { return custom(a, p * tau); };
4053   elasticOut.period = function(p) { return custom(a, p); };
4054
4055   return elasticOut;
4056 })(amplitude, period);
4057
4058 var elasticInOut = (function custom(a, p) {
4059   var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4060
4061   function elasticInOut(t) {
4062     return ((t = t * 2 - 1) < 0
4063         ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)
4064         : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;
4065   }
4066
4067   elasticInOut.amplitude = function(a) { return custom(a, p * tau); };
4068   elasticInOut.period = function(p) { return custom(a, p); };
4069
4070   return elasticInOut;
4071 })(amplitude, period);
4072
4073 var defaultTiming = {
4074   time: null, // Set on use.
4075   delay: 0,
4076   duration: 250,
4077   ease: cubicInOut
4078 };
4079
4080 function inherit(node, id) {
4081   var timing;
4082   while (!(timing = node.__transition) || !(timing = timing[id])) {
4083     if (!(node = node.parentNode)) {
4084       return defaultTiming.time = now(), defaultTiming;
4085     }
4086   }
4087   return timing;
4088 }
4089
4090 function selection_transition(name) {
4091   var id,
4092       timing;
4093
4094   if (name instanceof Transition) {
4095     id = name._id, name = name._name;
4096   } else {
4097     id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
4098   }
4099
4100   for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
4101     for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
4102       if (node = group[i]) {
4103         schedule(node, name, id, i, group, timing || inherit(node, id));
4104       }
4105     }
4106   }
4107
4108   return new Transition(groups, this._parents, name, id);
4109 }
4110
4111 selection.prototype.interrupt = selection_interrupt;
4112 selection.prototype.transition = selection_transition;
4113
4114 var root$1 = [null];
4115
4116 function active(node, name) {
4117   var schedules = node.__transition,
4118       schedule$$1,
4119       i;
4120
4121   if (schedules) {
4122     name = name == null ? null : name + "";
4123     for (i in schedules) {
4124       if ((schedule$$1 = schedules[i]).state > SCHEDULED && schedule$$1.name === name) {
4125         return new Transition([[node]], root$1, name, +i);
4126       }
4127     }
4128   }
4129
4130   return null;
4131 }
4132
4133 function constant$4(x) {
4134   return function() {
4135     return x;
4136   };
4137 }
4138
4139 function BrushEvent(target, type, selection) {
4140   this.target = target;
4141   this.type = type;
4142   this.selection = selection;
4143 }
4144
4145 function nopropagation$1() {
4146   event.stopImmediatePropagation();
4147 }
4148
4149 function noevent$1() {
4150   event.preventDefault();
4151   event.stopImmediatePropagation();
4152 }
4153
4154 var MODE_DRAG = {name: "drag"},
4155     MODE_SPACE = {name: "space"},
4156     MODE_HANDLE = {name: "handle"},
4157     MODE_CENTER = {name: "center"};
4158
4159 var X = {
4160   name: "x",
4161   handles: ["e", "w"].map(type),
4162   input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; },
4163   output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }
4164 };
4165
4166 var Y = {
4167   name: "y",
4168   handles: ["n", "s"].map(type),
4169   input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; },
4170   output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }
4171 };
4172
4173 var XY = {
4174   name: "xy",
4175   handles: ["n", "e", "s", "w", "nw", "ne", "se", "sw"].map(type),
4176   input: function(xy) { return xy; },
4177   output: function(xy) { return xy; }
4178 };
4179
4180 var cursors = {
4181   overlay: "crosshair",
4182   selection: "move",
4183   n: "ns-resize",
4184   e: "ew-resize",
4185   s: "ns-resize",
4186   w: "ew-resize",
4187   nw: "nwse-resize",
4188   ne: "nesw-resize",
4189   se: "nwse-resize",
4190   sw: "nesw-resize"
4191 };
4192
4193 var flipX = {
4194   e: "w",
4195   w: "e",
4196   nw: "ne",
4197   ne: "nw",
4198   se: "sw",
4199   sw: "se"
4200 };
4201
4202 var flipY = {
4203   n: "s",
4204   s: "n",
4205   nw: "sw",
4206   ne: "se",
4207   se: "ne",
4208   sw: "nw"
4209 };
4210
4211 var signsX = {
4212   overlay: +1,
4213   selection: +1,
4214   n: null,
4215   e: +1,
4216   s: null,
4217   w: -1,
4218   nw: -1,
4219   ne: +1,
4220   se: +1,
4221   sw: -1
4222 };
4223
4224 var signsY = {
4225   overlay: +1,
4226   selection: +1,
4227   n: -1,
4228   e: null,
4229   s: +1,
4230   w: null,
4231   nw: -1,
4232   ne: -1,
4233   se: +1,
4234   sw: +1
4235 };
4236
4237 function type(t) {
4238   return {type: t};
4239 }
4240
4241 // Ignore right-click, since that should open the context menu.
4242 function defaultFilter$1() {
4243   return !event.button;
4244 }
4245
4246 function defaultExtent() {
4247   var svg = this.ownerSVGElement || this;
4248   return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];
4249 }
4250
4251 // Like d3.local, but with the name “__brush” rather than auto-generated.
4252 function local$1(node) {
4253   while (!node.__brush) if (!(node = node.parentNode)) return;
4254   return node.__brush;
4255 }
4256
4257 function empty$1(extent) {
4258   return extent[0][0] === extent[1][0]
4259       || extent[0][1] === extent[1][1];
4260 }
4261
4262 function brushSelection(node) {
4263   var state = node.__brush;
4264   return state ? state.dim.output(state.selection) : null;
4265 }
4266
4267 function brushX() {
4268   return brush$1(X);
4269 }
4270
4271 function brushY() {
4272   return brush$1(Y);
4273 }
4274
4275 function brush() {
4276   return brush$1(XY);
4277 }
4278
4279 function brush$1(dim) {
4280   var extent = defaultExtent,
4281       filter = defaultFilter$1,
4282       listeners = dispatch(brush, "start", "brush", "end"),
4283       handleSize = 6,
4284       touchending;
4285
4286   function brush(group) {
4287     var overlay = group
4288         .property("__brush", initialize)
4289       .selectAll(".overlay")
4290       .data([type("overlay")]);
4291
4292     overlay.enter().append("rect")
4293         .attr("class", "overlay")
4294         .attr("pointer-events", "all")
4295         .attr("cursor", cursors.overlay)
4296       .merge(overlay)
4297         .each(function() {
4298           var extent = local$1(this).extent;
4299           d3_select(this)
4300               .attr("x", extent[0][0])
4301               .attr("y", extent[0][1])
4302               .attr("width", extent[1][0] - extent[0][0])
4303               .attr("height", extent[1][1] - extent[0][1]);
4304         });
4305
4306     group.selectAll(".selection")
4307       .data([type("selection")])
4308       .enter().append("rect")
4309         .attr("class", "selection")
4310         .attr("cursor", cursors.selection)
4311         .attr("fill", "#777")
4312         .attr("fill-opacity", 0.3)
4313         .attr("stroke", "#fff")
4314         .attr("shape-rendering", "crispEdges");
4315
4316     var handle = group.selectAll(".handle")
4317       .data(dim.handles, function(d) { return d.type; });
4318
4319     handle.exit().remove();
4320
4321     handle.enter().append("rect")
4322         .attr("class", function(d) { return "handle handle--" + d.type; })
4323         .attr("cursor", function(d) { return cursors[d.type]; });
4324
4325     group
4326         .each(redraw)
4327         .attr("fill", "none")
4328         .attr("pointer-events", "all")
4329         .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)")
4330         .on("mousedown.brush touchstart.brush", started);
4331   }
4332
4333   brush.move = function(group, selection$$1) {
4334     if (group.selection) {
4335       group
4336           .on("start.brush", function() { emitter(this, arguments).beforestart().start(); })
4337           .on("interrupt.brush end.brush", function() { emitter(this, arguments).end(); })
4338           .tween("brush", function() {
4339             var that = this,
4340                 state = that.__brush,
4341                 emit = emitter(that, arguments),
4342                 selection0 = state.selection,
4343                 selection1 = dim.input(typeof selection$$1 === "function" ? selection$$1.apply(this, arguments) : selection$$1, state.extent),
4344                 i = d3_interpolate(selection0, selection1);
4345
4346             function tween(t) {
4347               state.selection = t === 1 && empty$1(selection1) ? null : i(t);
4348               redraw.call(that);
4349               emit.brush();
4350             }
4351
4352             return selection0 && selection1 ? tween : tween(1);
4353           });
4354     } else {
4355       group
4356           .each(function() {
4357             var that = this,
4358                 args = arguments,
4359                 state = that.__brush,
4360                 selection1 = dim.input(typeof selection$$1 === "function" ? selection$$1.apply(that, args) : selection$$1, state.extent),
4361                 emit = emitter(that, args).beforestart();
4362
4363             interrupt(that);
4364             state.selection = selection1 == null || empty$1(selection1) ? null : selection1;
4365             redraw.call(that);
4366             emit.start().brush().end();
4367           });
4368     }
4369   };
4370
4371   function redraw() {
4372     var group = d3_select(this),
4373         selection$$1 = local$1(this).selection;
4374
4375     if (selection$$1) {
4376       group.selectAll(".selection")
4377           .style("display", null)
4378           .attr("x", selection$$1[0][0])
4379           .attr("y", selection$$1[0][1])
4380           .attr("width", selection$$1[1][0] - selection$$1[0][0])
4381           .attr("height", selection$$1[1][1] - selection$$1[0][1]);
4382
4383       group.selectAll(".handle")
4384           .style("display", null)
4385           .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection$$1[1][0] - handleSize / 2 : selection$$1[0][0] - handleSize / 2; })
4386           .attr("y", function(d) { return d.type[0] === "s" ? selection$$1[1][1] - handleSize / 2 : selection$$1[0][1] - handleSize / 2; })
4387           .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection$$1[1][0] - selection$$1[0][0] + handleSize : handleSize; })
4388           .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection$$1[1][1] - selection$$1[0][1] + handleSize : handleSize; });
4389     }
4390
4391     else {
4392       group.selectAll(".selection,.handle")
4393           .style("display", "none")
4394           .attr("x", null)
4395           .attr("y", null)
4396           .attr("width", null)
4397           .attr("height", null);
4398     }
4399   }
4400
4401   function emitter(that, args) {
4402     return that.__brush.emitter || new Emitter(that, args);
4403   }
4404
4405   function Emitter(that, args) {
4406     this.that = that;
4407     this.args = args;
4408     this.state = that.__brush;
4409     this.active = 0;
4410   }
4411
4412   Emitter.prototype = {
4413     beforestart: function() {
4414       if (++this.active === 1) this.state.emitter = this, this.starting = true;
4415       return this;
4416     },
4417     start: function() {
4418       if (this.starting) this.starting = false, this.emit("start");
4419       return this;
4420     },
4421     brush: function() {
4422       this.emit("brush");
4423       return this;
4424     },
4425     end: function() {
4426       if (--this.active === 0) delete this.state.emitter, this.emit("end");
4427       return this;
4428     },
4429     emit: function(type) {
4430       customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);
4431     }
4432   };
4433
4434   function started() {
4435     if (event.touches) { if (event.changedTouches.length < event.touches.length) return noevent$1(); }
4436     else if (touchending) return;
4437     if (!filter.apply(this, arguments)) return;
4438
4439     var that = this,
4440         type = event.target.__data__.type,
4441         mode = (event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (event.altKey ? MODE_CENTER : MODE_HANDLE),
4442         signX = dim === Y ? null : signsX[type],
4443         signY = dim === X ? null : signsY[type],
4444         state = local$1(that),
4445         extent = state.extent,
4446         selection$$1 = state.selection,
4447         W = extent[0][0], w0, w1,
4448         N = extent[0][1], n0, n1,
4449         E = extent[1][0], e0, e1,
4450         S = extent[1][1], s0, s1,
4451         dx,
4452         dy,
4453         moving,
4454         shifting = signX && signY && event.shiftKey,
4455         lockX,
4456         lockY,
4457         point0 = d3_mouse(that),
4458         point$$1 = point0,
4459         emit = emitter(that, arguments).beforestart();
4460
4461     if (type === "overlay") {
4462       state.selection = selection$$1 = [
4463         [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],
4464         [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]
4465       ];
4466     } else {
4467       w0 = selection$$1[0][0];
4468       n0 = selection$$1[0][1];
4469       e0 = selection$$1[1][0];
4470       s0 = selection$$1[1][1];
4471     }
4472
4473     w1 = w0;
4474     n1 = n0;
4475     e1 = e0;
4476     s1 = s0;
4477
4478     var group = d3_select(that)
4479         .attr("pointer-events", "none");
4480
4481     var overlay = group.selectAll(".overlay")
4482         .attr("cursor", cursors[type]);
4483
4484     if (event.touches) {
4485       group
4486           .on("touchmove.brush", moved, true)
4487           .on("touchend.brush touchcancel.brush", ended, true);
4488     } else {
4489       var view = d3_select(event.view)
4490           .on("keydown.brush", keydowned, true)
4491           .on("keyup.brush", keyupped, true)
4492           .on("mousemove.brush", moved, true)
4493           .on("mouseup.brush", ended, true);
4494
4495       dragDisable(event.view);
4496     }
4497
4498     nopropagation$1();
4499     interrupt(that);
4500     redraw.call(that);
4501     emit.start();
4502
4503     function moved() {
4504       var point1 = d3_mouse(that);
4505       if (shifting && !lockX && !lockY) {
4506         if (Math.abs(point1[0] - point$$1[0]) > Math.abs(point1[1] - point$$1[1])) lockY = true;
4507         else lockX = true;
4508       }
4509       point$$1 = point1;
4510       moving = true;
4511       noevent$1();
4512       move();
4513     }
4514
4515     function move() {
4516       var t;
4517
4518       dx = point$$1[0] - point0[0];
4519       dy = point$$1[1] - point0[1];
4520
4521       switch (mode) {
4522         case MODE_SPACE:
4523         case MODE_DRAG: {
4524           if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;
4525           if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;
4526           break;
4527         }
4528         case MODE_HANDLE: {
4529           if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;
4530           else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;
4531           if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;
4532           else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;
4533           break;
4534         }
4535         case MODE_CENTER: {
4536           if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));
4537           if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));
4538           break;
4539         }
4540       }
4541
4542       if (e1 < w1) {
4543         signX *= -1;
4544         t = w0, w0 = e0, e0 = t;
4545         t = w1, w1 = e1, e1 = t;
4546         if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]);
4547       }
4548
4549       if (s1 < n1) {
4550         signY *= -1;
4551         t = n0, n0 = s0, s0 = t;
4552         t = n1, n1 = s1, s1 = t;
4553         if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]);
4554       }
4555
4556       if (state.selection) selection$$1 = state.selection; // May be set by brush.move!
4557       if (lockX) w1 = selection$$1[0][0], e1 = selection$$1[1][0];
4558       if (lockY) n1 = selection$$1[0][1], s1 = selection$$1[1][1];
4559
4560       if (selection$$1[0][0] !== w1
4561           || selection$$1[0][1] !== n1
4562           || selection$$1[1][0] !== e1
4563           || selection$$1[1][1] !== s1) {
4564         state.selection = [[w1, n1], [e1, s1]];
4565         redraw.call(that);
4566         emit.brush();
4567       }
4568     }
4569
4570     function ended() {
4571       nopropagation$1();
4572       if (event.touches) {
4573         if (event.touches.length) return;
4574         if (touchending) clearTimeout(touchending);
4575         touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
4576         group.on("touchmove.brush touchend.brush touchcancel.brush", null);
4577       } else {
4578         yesdrag(event.view, moving);
4579         view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null);
4580       }
4581       group.attr("pointer-events", "all");
4582       overlay.attr("cursor", cursors.overlay);
4583       if (state.selection) selection$$1 = state.selection; // May be set by brush.move (on start)!
4584       if (empty$1(selection$$1)) state.selection = null, redraw.call(that);
4585       emit.end();
4586     }
4587
4588     function keydowned() {
4589       switch (event.keyCode) {
4590         case 16: { // SHIFT
4591           shifting = signX && signY;
4592           break;
4593         }
4594         case 18: { // ALT
4595           if (mode === MODE_HANDLE) {
4596             if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
4597             if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
4598             mode = MODE_CENTER;
4599             move();
4600           }
4601           break;
4602         }
4603         case 32: { // SPACE; takes priority over ALT
4604           if (mode === MODE_HANDLE || mode === MODE_CENTER) {
4605             if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;
4606             if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;
4607             mode = MODE_SPACE;
4608             overlay.attr("cursor", cursors.selection);
4609             move();
4610           }
4611           break;
4612         }
4613         default: return;
4614       }
4615       noevent$1();
4616     }
4617
4618     function keyupped() {
4619       switch (event.keyCode) {
4620         case 16: { // SHIFT
4621           if (shifting) {
4622             lockX = lockY = shifting = false;
4623             move();
4624           }
4625           break;
4626         }
4627         case 18: { // ALT
4628           if (mode === MODE_CENTER) {
4629             if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
4630             if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
4631             mode = MODE_HANDLE;
4632             move();
4633           }
4634           break;
4635         }
4636         case 32: { // SPACE
4637           if (mode === MODE_SPACE) {
4638             if (event.altKey) {
4639               if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
4640               if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
4641               mode = MODE_CENTER;
4642             } else {
4643               if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
4644               if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
4645               mode = MODE_HANDLE;
4646             }
4647             overlay.attr("cursor", cursors[type]);
4648             move();
4649           }
4650           break;
4651         }
4652         default: return;
4653       }
4654       noevent$1();
4655     }
4656   }
4657
4658   function initialize() {
4659     var state = this.__brush || {selection: null};
4660     state.extent = extent.apply(this, arguments);
4661     state.dim = dim;
4662     return state;
4663   }
4664
4665   brush.extent = function(_) {
4666     return arguments.length ? (extent = typeof _ === "function" ? _ : constant$4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent;
4667   };
4668
4669   brush.filter = function(_) {
4670     return arguments.length ? (filter = typeof _ === "function" ? _ : constant$4(!!_), brush) : filter;
4671   };
4672
4673   brush.handleSize = function(_) {
4674     return arguments.length ? (handleSize = +_, brush) : handleSize;
4675   };
4676
4677   brush.on = function() {
4678     var value = listeners.on.apply(listeners, arguments);
4679     return value === listeners ? brush : value;
4680   };
4681
4682   return brush;
4683 }
4684
4685 var cos = Math.cos;
4686 var sin = Math.sin;
4687 var pi$1 = Math.PI;
4688 var halfPi$1 = pi$1 / 2;
4689 var tau$1 = pi$1 * 2;
4690 var max$1 = Math.max;
4691
4692 function compareValue(compare) {
4693   return function(a, b) {
4694     return compare(
4695       a.source.value + a.target.value,
4696       b.source.value + b.target.value
4697     );
4698   };
4699 }
4700
4701 function chord() {
4702   var padAngle = 0,
4703       sortGroups = null,
4704       sortSubgroups = null,
4705       sortChords = null;
4706
4707   function chord(matrix) {
4708     var n = matrix.length,
4709         groupSums = [],
4710         groupIndex = d3_range(n),
4711         subgroupIndex = [],
4712         chords = [],
4713         groups = chords.groups = new Array(n),
4714         subgroups = new Array(n * n),
4715         k,
4716         x,
4717         x0,
4718         dx,
4719         i,
4720         j;
4721
4722     // Compute the sum.
4723     k = 0, i = -1; while (++i < n) {
4724       x = 0, j = -1; while (++j < n) {
4725         x += matrix[i][j];
4726       }
4727       groupSums.push(x);
4728       subgroupIndex.push(d3_range(n));
4729       k += x;
4730     }
4731
4732     // Sort groups…
4733     if (sortGroups) groupIndex.sort(function(a, b) {
4734       return sortGroups(groupSums[a], groupSums[b]);
4735     });
4736
4737     // Sort subgroups…
4738     if (sortSubgroups) subgroupIndex.forEach(function(d, i) {
4739       d.sort(function(a, b) {
4740         return sortSubgroups(matrix[i][a], matrix[i][b]);
4741       });
4742     });
4743
4744     // Convert the sum to scaling factor for [0, 2pi].
4745     // TODO Allow start and end angle to be specified?
4746     // TODO Allow padding to be specified as percentage?
4747     k = max$1(0, tau$1 - padAngle * n) / k;
4748     dx = k ? padAngle : tau$1 / n;
4749
4750     // Compute the start and end angle for each group and subgroup.
4751     // Note: Opera has a bug reordering object literal properties!
4752     x = 0, i = -1; while (++i < n) {
4753       x0 = x, j = -1; while (++j < n) {
4754         var di = groupIndex[i],
4755             dj = subgroupIndex[di][j],
4756             v = matrix[di][dj],
4757             a0 = x,
4758             a1 = x += v * k;
4759         subgroups[dj * n + di] = {
4760           index: di,
4761           subindex: dj,
4762           startAngle: a0,
4763           endAngle: a1,
4764           value: v
4765         };
4766       }
4767       groups[di] = {
4768         index: di,
4769         startAngle: x0,
4770         endAngle: x,
4771         value: groupSums[di]
4772       };
4773       x += dx;
4774     }
4775
4776     // Generate chords for each (non-empty) subgroup-subgroup link.
4777     i = -1; while (++i < n) {
4778       j = i - 1; while (++j < n) {
4779         var source = subgroups[j * n + i],
4780             target = subgroups[i * n + j];
4781         if (source.value || target.value) {
4782           chords.push(source.value < target.value
4783               ? {source: target, target: source}
4784               : {source: source, target: target});
4785         }
4786       }
4787     }
4788
4789     return sortChords ? chords.sort(sortChords) : chords;
4790   }
4791
4792   chord.padAngle = function(_) {
4793     return arguments.length ? (padAngle = max$1(0, _), chord) : padAngle;
4794   };
4795
4796   chord.sortGroups = function(_) {
4797     return arguments.length ? (sortGroups = _, chord) : sortGroups;
4798   };
4799
4800   chord.sortSubgroups = function(_) {
4801     return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;
4802   };
4803
4804   chord.sortChords = function(_) {
4805     return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._;
4806   };
4807
4808   return chord;
4809 }
4810
4811 var slice$2 = Array.prototype.slice;
4812
4813 function constant$5(x) {
4814   return function() {
4815     return x;
4816   };
4817 }
4818
4819 var pi$2 = Math.PI,
4820     tau$2 = 2 * pi$2,
4821     epsilon$1 = 1e-6,
4822     tauEpsilon = tau$2 - epsilon$1;
4823
4824 function Path() {
4825   this._x0 = this._y0 = // start of current subpath
4826   this._x1 = this._y1 = null; // end of current subpath
4827   this._ = "";
4828 }
4829
4830 function path() {
4831   return new Path;
4832 }
4833
4834 Path.prototype = path.prototype = {
4835   constructor: Path,
4836   moveTo: function(x, y) {
4837     this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);
4838   },
4839   closePath: function() {
4840     if (this._x1 !== null) {
4841       this._x1 = this._x0, this._y1 = this._y0;
4842       this._ += "Z";
4843     }
4844   },
4845   lineTo: function(x, y) {
4846     this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);
4847   },
4848   quadraticCurveTo: function(x1, y1, x, y) {
4849     this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
4850   },
4851   bezierCurveTo: function(x1, y1, x2, y2, x, y) {
4852     this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
4853   },
4854   arcTo: function(x1, y1, x2, y2, r) {
4855     x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
4856     var x0 = this._x1,
4857         y0 = this._y1,
4858         x21 = x2 - x1,
4859         y21 = y2 - y1,
4860         x01 = x0 - x1,
4861         y01 = y0 - y1,
4862         l01_2 = x01 * x01 + y01 * y01;
4863
4864     // Is the radius negative? Error.
4865     if (r < 0) throw new Error("negative radius: " + r);
4866
4867     // Is this path empty? Move to (x1,y1).
4868     if (this._x1 === null) {
4869       this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);
4870     }
4871
4872     // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.
4873     else if (!(l01_2 > epsilon$1)) {}
4874
4875     // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?
4876     // Equivalently, is (x1,y1) coincident with (x2,y2)?
4877     // Or, is the radius zero? Line to (x1,y1).
4878     else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$1) || !r) {
4879       this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1);
4880     }
4881
4882     // Otherwise, draw an arc!
4883     else {
4884       var x20 = x2 - x0,
4885           y20 = y2 - y0,
4886           l21_2 = x21 * x21 + y21 * y21,
4887           l20_2 = x20 * x20 + y20 * y20,
4888           l21 = Math.sqrt(l21_2),
4889           l01 = Math.sqrt(l01_2),
4890           l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),
4891           t01 = l / l01,
4892           t21 = l / l21;
4893
4894       // If the start tangent is not coincident with (x0,y0), line to.
4895       if (Math.abs(t01 - 1) > epsilon$1) {
4896         this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01);
4897       }
4898
4899       this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
4900     }
4901   },
4902   arc: function(x, y, r, a0, a1, ccw) {
4903     x = +x, y = +y, r = +r;
4904     var dx = r * Math.cos(a0),
4905         dy = r * Math.sin(a0),
4906         x0 = x + dx,
4907         y0 = y + dy,
4908         cw = 1 ^ ccw,
4909         da = ccw ? a0 - a1 : a1 - a0;
4910
4911     // Is the radius negative? Error.
4912     if (r < 0) throw new Error("negative radius: " + r);
4913
4914     // Is this path empty? Move to (x0,y0).
4915     if (this._x1 === null) {
4916       this._ += "M" + x0 + "," + y0;
4917     }
4918
4919     // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).
4920     else if (Math.abs(this._x1 - x0) > epsilon$1 || Math.abs(this._y1 - y0) > epsilon$1) {
4921       this._ += "L" + x0 + "," + y0;
4922     }
4923
4924     // Is this arc empty? We’re done.
4925     if (!r) return;
4926
4927     // Does the angle go the wrong way? Flip the direction.
4928     if (da < 0) da = da % tau$2 + tau$2;
4929
4930     // Is this a complete circle? Draw two arcs to complete the circle.
4931     if (da > tauEpsilon) {
4932       this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0);
4933     }
4934
4935     // Is this arc non-empty? Draw an arc!
4936     else if (da > epsilon$1) {
4937       this._ += "A" + r + "," + r + ",0," + (+(da >= pi$2)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1));
4938     }
4939   },
4940   rect: function(x, y, w, h) {
4941     this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z";
4942   },
4943   toString: function() {
4944     return this._;
4945   }
4946 };
4947
4948 function defaultSource(d) {
4949   return d.source;
4950 }
4951
4952 function defaultTarget(d) {
4953   return d.target;
4954 }
4955
4956 function defaultRadius(d) {
4957   return d.radius;
4958 }
4959
4960 function defaultStartAngle(d) {
4961   return d.startAngle;
4962 }
4963
4964 function defaultEndAngle(d) {
4965   return d.endAngle;
4966 }
4967
4968 function ribbon() {
4969   var source = defaultSource,
4970       target = defaultTarget,
4971       radius = defaultRadius,
4972       startAngle = defaultStartAngle,
4973       endAngle = defaultEndAngle,
4974       context = null;
4975
4976   function ribbon() {
4977     var buffer,
4978         argv = slice$2.call(arguments),
4979         s = source.apply(this, argv),
4980         t = target.apply(this, argv),
4981         sr = +radius.apply(this, (argv[0] = s, argv)),
4982         sa0 = startAngle.apply(this, argv) - halfPi$1,
4983         sa1 = endAngle.apply(this, argv) - halfPi$1,
4984         sx0 = sr * cos(sa0),
4985         sy0 = sr * sin(sa0),
4986         tr = +radius.apply(this, (argv[0] = t, argv)),
4987         ta0 = startAngle.apply(this, argv) - halfPi$1,
4988         ta1 = endAngle.apply(this, argv) - halfPi$1;
4989
4990     if (!context) context = buffer = path();
4991
4992     context.moveTo(sx0, sy0);
4993     context.arc(0, 0, sr, sa0, sa1);
4994     if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr?
4995       context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0));
4996       context.arc(0, 0, tr, ta0, ta1);
4997     }
4998     context.quadraticCurveTo(0, 0, sx0, sy0);
4999     context.closePath();
5000
5001     if (buffer) return context = null, buffer + "" || null;
5002   }
5003
5004   ribbon.radius = function(_) {
5005     return arguments.length ? (radius = typeof _ === "function" ? _ : constant$5(+_), ribbon) : radius;
5006   };
5007
5008   ribbon.startAngle = function(_) {
5009     return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : startAngle;
5010   };
5011
5012   ribbon.endAngle = function(_) {
5013     return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : endAngle;
5014   };
5015
5016   ribbon.source = function(_) {
5017     return arguments.length ? (source = _, ribbon) : source;
5018   };
5019
5020   ribbon.target = function(_) {
5021     return arguments.length ? (target = _, ribbon) : target;
5022   };
5023
5024   ribbon.context = function(_) {
5025     return arguments.length ? (context = _ == null ? null : _, ribbon) : context;
5026   };
5027
5028   return ribbon;
5029 }
5030
5031 var prefix = "$";
5032
5033 function Map() {}
5034
5035 Map.prototype = map$1.prototype = {
5036   constructor: Map,
5037   has: function(key) {
5038     return (prefix + key) in this;
5039   },
5040   get: function(key) {
5041     return this[prefix + key];
5042   },
5043   set: function(key, value) {
5044     this[prefix + key] = value;
5045     return this;
5046   },
5047   remove: function(key) {
5048     var property = prefix + key;
5049     return property in this && delete this[property];
5050   },
5051   clear: function() {
5052     for (var property in this) if (property[0] === prefix) delete this[property];
5053   },
5054   keys: function() {
5055     var keys = [];
5056     for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));
5057     return keys;
5058   },
5059   values: function() {
5060     var values = [];
5061     for (var property in this) if (property[0] === prefix) values.push(this[property]);
5062     return values;
5063   },
5064   entries: function() {
5065     var entries = [];
5066     for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});
5067     return entries;
5068   },
5069   size: function() {
5070     var size = 0;
5071     for (var property in this) if (property[0] === prefix) ++size;
5072     return size;
5073   },
5074   empty: function() {
5075     for (var property in this) if (property[0] === prefix) return false;
5076     return true;
5077   },
5078   each: function(f) {
5079     for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);
5080   }
5081 };
5082
5083 function map$1(object, f) {
5084   var map = new Map;
5085
5086   // Copy constructor.
5087   if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });
5088
5089   // Index array by numeric index or specified key function.
5090   else if (Array.isArray(object)) {
5091     var i = -1,
5092         n = object.length,
5093         o;
5094
5095     if (f == null) while (++i < n) map.set(i, object[i]);
5096     else while (++i < n) map.set(f(o = object[i], i, object), o);
5097   }
5098
5099   // Convert object to map.
5100   else if (object) for (var key in object) map.set(key, object[key]);
5101
5102   return map;
5103 }
5104
5105 function nest() {
5106   var keys = [],
5107       sortKeys = [],
5108       sortValues,
5109       rollup,
5110       nest;
5111
5112   function apply(array, depth, createResult, setResult) {
5113     if (depth >= keys.length) {
5114       if (sortValues != null) array.sort(sortValues);
5115       return rollup != null ? rollup(array) : array;
5116     }
5117
5118     var i = -1,
5119         n = array.length,
5120         key = keys[depth++],
5121         keyValue,
5122         value,
5123         valuesByKey = map$1(),
5124         values,
5125         result = createResult();
5126
5127     while (++i < n) {
5128       if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) {
5129         values.push(value);
5130       } else {
5131         valuesByKey.set(keyValue, [value]);
5132       }
5133     }
5134
5135     valuesByKey.each(function(values, key) {
5136       setResult(result, key, apply(values, depth, createResult, setResult));
5137     });
5138
5139     return result;
5140   }
5141
5142   function entries(map, depth) {
5143     if (++depth > keys.length) return map;
5144     var array, sortKey = sortKeys[depth - 1];
5145     if (rollup != null && depth >= keys.length) array = map.entries();
5146     else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });
5147     return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;
5148   }
5149
5150   return nest = {
5151     object: function(array) { return apply(array, 0, createObject, setObject); },
5152     map: function(array) { return apply(array, 0, createMap, setMap); },
5153     entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },
5154     key: function(d) { keys.push(d); return nest; },
5155     sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },
5156     sortValues: function(order) { sortValues = order; return nest; },
5157     rollup: function(f) { rollup = f; return nest; }
5158   };
5159 }
5160
5161 function createObject() {
5162   return {};
5163 }
5164
5165 function setObject(object, key, value) {
5166   object[key] = value;
5167 }
5168
5169 function createMap() {
5170   return map$1();
5171 }
5172
5173 function setMap(map, key, value) {
5174   map.set(key, value);
5175 }
5176
5177 function Set() {}
5178
5179 var proto = map$1.prototype;
5180
5181 Set.prototype = set$2.prototype = {
5182   constructor: Set,
5183   has: proto.has,
5184   add: function(value) {
5185     value += "";
5186     this[prefix + value] = value;
5187     return this;
5188   },
5189   remove: proto.remove,
5190   clear: proto.clear,
5191   values: proto.keys,
5192   size: proto.size,
5193   empty: proto.empty,
5194   each: proto.each
5195 };
5196
5197 function set$2(object, f) {
5198   var set = new Set;
5199
5200   // Copy constructor.
5201   if (object instanceof Set) object.each(function(value) { set.add(value); });
5202
5203   // Otherwise, assume it’s an array.
5204   else if (object) {
5205     var i = -1, n = object.length;
5206     if (f == null) while (++i < n) set.add(object[i]);
5207     else while (++i < n) set.add(f(object[i], i, object));
5208   }
5209
5210   return set;
5211 }
5212
5213 function keys(map) {
5214   var keys = [];
5215   for (var key in map) keys.push(key);
5216   return keys;
5217 }
5218
5219 function values(map) {
5220   var values = [];
5221   for (var key in map) values.push(map[key]);
5222   return values;
5223 }
5224
5225 function entries(map) {
5226   var entries = [];
5227   for (var key in map) entries.push({key: key, value: map[key]});
5228   return entries;
5229 }
5230
5231 var EOL = {},
5232     EOF = {},
5233     QUOTE = 34,
5234     NEWLINE = 10,
5235     RETURN = 13;
5236
5237 function objectConverter(columns) {
5238   return new Function("d", "return {" + columns.map(function(name, i) {
5239     return JSON.stringify(name) + ": d[" + i + "]";
5240   }).join(",") + "}");
5241 }
5242
5243 function customConverter(columns, f) {
5244   var object = objectConverter(columns);
5245   return function(row, i) {
5246     return f(object(row), i, columns);
5247   };
5248 }
5249
5250 // Compute unique columns in order of discovery.
5251 function inferColumns(rows) {
5252   var columnSet = Object.create(null),
5253       columns = [];
5254
5255   rows.forEach(function(row) {
5256     for (var column in row) {
5257       if (!(column in columnSet)) {
5258         columns.push(columnSet[column] = column);
5259       }
5260     }
5261   });
5262
5263   return columns;
5264 }
5265
5266 function dsv(delimiter) {
5267   var reFormat = new RegExp("[\"" + delimiter + "\n\r]"),
5268       DELIMITER = delimiter.charCodeAt(0);
5269
5270   function parse(text, f) {
5271     var convert, columns, rows = parseRows(text, function(row, i) {
5272       if (convert) return convert(row, i - 1);
5273       columns = row, convert = f ? customConverter(row, f) : objectConverter(row);
5274     });
5275     rows.columns = columns || [];
5276     return rows;
5277   }
5278
5279   function parseRows(text, f) {
5280     var rows = [], // output rows
5281         N = text.length,
5282         I = 0, // current character index
5283         n = 0, // current line number
5284         t, // current token
5285         eof = N <= 0, // current token followed by EOF?
5286         eol = false; // current token followed by EOL?
5287
5288     // Strip the trailing newline.
5289     if (text.charCodeAt(N - 1) === NEWLINE) --N;
5290     if (text.charCodeAt(N - 1) === RETURN) --N;
5291
5292     function token() {
5293       if (eof) return EOF;
5294       if (eol) return eol = false, EOL;
5295
5296       // Unescape quotes.
5297       var i, j = I, c;
5298       if (text.charCodeAt(j) === QUOTE) {
5299         while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);
5300         if ((i = I) >= N) eof = true;
5301         else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;
5302         else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
5303         return text.slice(j + 1, i - 1).replace(/""/g, "\"");
5304       }
5305
5306       // Find next delimiter or newline.
5307       while (I < N) {
5308         if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;
5309         else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
5310         else if (c !== DELIMITER) continue;
5311         return text.slice(j, i);
5312       }
5313
5314       // Return last token before EOF.
5315       return eof = true, text.slice(j, N);
5316     }
5317
5318     while ((t = token()) !== EOF) {
5319       var row = [];
5320       while (t !== EOL && t !== EOF) row.push(t), t = token();
5321       if (f && (row = f(row, n++)) == null) continue;
5322       rows.push(row);
5323     }
5324
5325     return rows;
5326   }
5327
5328   function format(rows, columns) {
5329     if (columns == null) columns = inferColumns(rows);
5330     return [columns.map(formatValue).join(delimiter)].concat(rows.map(function(row) {
5331       return columns.map(function(column) {
5332         return formatValue(row[column]);
5333       }).join(delimiter);
5334     })).join("\n");
5335   }
5336
5337   function formatRows(rows) {
5338     return rows.map(formatRow).join("\n");
5339   }
5340
5341   function formatRow(row) {
5342     return row.map(formatValue).join(delimiter);
5343   }
5344
5345   function formatValue(text) {
5346     return text == null ? ""
5347         : reFormat.test(text += "") ? "\"" + text.replace(/"/g, "\"\"") + "\""
5348         : text;
5349   }
5350
5351   return {
5352     parse: parse,
5353     parseRows: parseRows,
5354     format: format,
5355     formatRows: formatRows
5356   };
5357 }
5358
5359 var csv = dsv(",");
5360
5361 var csvParse = csv.parse;
5362 var csvParseRows = csv.parseRows;
5363 var csvFormat = csv.format;
5364 var csvFormatRows = csv.formatRows;
5365
5366 var tsv = dsv("\t");
5367
5368 var tsvParse = tsv.parse;
5369 var tsvParseRows = tsv.parseRows;
5370 var tsvFormat = tsv.format;
5371 var tsvFormatRows = tsv.formatRows;
5372
5373 function center$1(x, y) {
5374   var nodes;
5375
5376   if (x == null) x = 0;
5377   if (y == null) y = 0;
5378
5379   function force() {
5380     var i,
5381         n = nodes.length,
5382         node,
5383         sx = 0,
5384         sy = 0;
5385
5386     for (i = 0; i < n; ++i) {
5387       node = nodes[i], sx += node.x, sy += node.y;
5388     }
5389
5390     for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {
5391       node = nodes[i], node.x -= sx, node.y -= sy;
5392     }
5393   }
5394
5395   force.initialize = function(_) {
5396     nodes = _;
5397   };
5398
5399   force.x = function(_) {
5400     return arguments.length ? (x = +_, force) : x;
5401   };
5402
5403   force.y = function(_) {
5404     return arguments.length ? (y = +_, force) : y;
5405   };
5406
5407   return force;
5408 }
5409
5410 function constant$6(x) {
5411   return function() {
5412     return x;
5413   };
5414 }
5415
5416 function jiggle() {
5417   return (Math.random() - 0.5) * 1e-6;
5418 }
5419
5420 function tree_add(d) {
5421   var x = +this._x.call(null, d),
5422       y = +this._y.call(null, d);
5423   return add(this.cover(x, y), x, y, d);
5424 }
5425
5426 function add(tree, x, y, d) {
5427   if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points
5428
5429   var parent,
5430       node = tree._root,
5431       leaf = {data: d},
5432       x0 = tree._x0,
5433       y0 = tree._y0,
5434       x1 = tree._x1,
5435       y1 = tree._y1,
5436       xm,
5437       ym,
5438       xp,
5439       yp,
5440       right,
5441       bottom,
5442       i,
5443       j;
5444
5445   // If the tree is empty, initialize the root as a leaf.
5446   if (!node) return tree._root = leaf, tree;
5447
5448   // Find the existing leaf for the new point, or add it.
5449   while (node.length) {
5450     if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5451     if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5452     if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;
5453   }
5454
5455   // Is the new point is exactly coincident with the existing point?
5456   xp = +tree._x.call(null, node.data);
5457   yp = +tree._y.call(null, node.data);
5458   if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;
5459
5460   // Otherwise, split the leaf node until the old and new point are separated.
5461   do {
5462     parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);
5463     if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5464     if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5465   } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));
5466   return parent[j] = node, parent[i] = leaf, tree;
5467 }
5468
5469 function addAll(data) {
5470   var d, i, n = data.length,
5471       x,
5472       y,
5473       xz = new Array(n),
5474       yz = new Array(n),
5475       x0 = Infinity,
5476       y0 = Infinity,
5477       x1 = -Infinity,
5478       y1 = -Infinity;
5479
5480   // Compute the points and their extent.
5481   for (i = 0; i < n; ++i) {
5482     if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;
5483     xz[i] = x;
5484     yz[i] = y;
5485     if (x < x0) x0 = x;
5486     if (x > x1) x1 = x;
5487     if (y < y0) y0 = y;
5488     if (y > y1) y1 = y;
5489   }
5490
5491   // If there were no (valid) points, inherit the existing extent.
5492   if (x1 < x0) x0 = this._x0, x1 = this._x1;
5493   if (y1 < y0) y0 = this._y0, y1 = this._y1;
5494
5495   // Expand the tree to cover the new points.
5496   this.cover(x0, y0).cover(x1, y1);
5497
5498   // Add the new points.
5499   for (i = 0; i < n; ++i) {
5500     add(this, xz[i], yz[i], data[i]);
5501   }
5502
5503   return this;
5504 }
5505
5506 function tree_cover(x, y) {
5507   if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points
5508
5509   var x0 = this._x0,
5510       y0 = this._y0,
5511       x1 = this._x1,
5512       y1 = this._y1;
5513
5514   // If the quadtree has no extent, initialize them.
5515   // Integer extent are necessary so that if we later double the extent,
5516   // the existing quadrant boundaries don’t change due to floating point error!
5517   if (isNaN(x0)) {
5518     x1 = (x0 = Math.floor(x)) + 1;
5519     y1 = (y0 = Math.floor(y)) + 1;
5520   }
5521
5522   // Otherwise, double repeatedly to cover.
5523   else if (x0 > x || x > x1 || y0 > y || y > y1) {
5524     var z = x1 - x0,
5525         node = this._root,
5526         parent,
5527         i;
5528
5529     switch (i = (y < (y0 + y1) / 2) << 1 | (x < (x0 + x1) / 2)) {
5530       case 0: {
5531         do parent = new Array(4), parent[i] = node, node = parent;
5532         while (z *= 2, x1 = x0 + z, y1 = y0 + z, x > x1 || y > y1);
5533         break;
5534       }
5535       case 1: {
5536         do parent = new Array(4), parent[i] = node, node = parent;
5537         while (z *= 2, x0 = x1 - z, y1 = y0 + z, x0 > x || y > y1);
5538         break;
5539       }
5540       case 2: {
5541         do parent = new Array(4), parent[i] = node, node = parent;
5542         while (z *= 2, x1 = x0 + z, y0 = y1 - z, x > x1 || y0 > y);
5543         break;
5544       }
5545       case 3: {
5546         do parent = new Array(4), parent[i] = node, node = parent;
5547         while (z *= 2, x0 = x1 - z, y0 = y1 - z, x0 > x || y0 > y);
5548         break;
5549       }
5550     }
5551
5552     if (this._root && this._root.length) this._root = node;
5553   }
5554
5555   // If the quadtree covers the point already, just return.
5556   else return this;
5557
5558   this._x0 = x0;
5559   this._y0 = y0;
5560   this._x1 = x1;
5561   this._y1 = y1;
5562   return this;
5563 }
5564
5565 function tree_data() {
5566   var data = [];
5567   this.visit(function(node) {
5568     if (!node.length) do data.push(node.data); while (node = node.next)
5569   });
5570   return data;
5571 }
5572
5573 function tree_extent(_) {
5574   return arguments.length
5575       ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])
5576       : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];
5577 }
5578
5579 function Quad(node, x0, y0, x1, y1) {
5580   this.node = node;
5581   this.x0 = x0;
5582   this.y0 = y0;
5583   this.x1 = x1;
5584   this.y1 = y1;
5585 }
5586
5587 function tree_find(x, y, radius) {
5588   var data,
5589       x0 = this._x0,
5590       y0 = this._y0,
5591       x1,
5592       y1,
5593       x2,
5594       y2,
5595       x3 = this._x1,
5596       y3 = this._y1,
5597       quads = [],
5598       node = this._root,
5599       q,
5600       i;
5601
5602   if (node) quads.push(new Quad(node, x0, y0, x3, y3));
5603   if (radius == null) radius = Infinity;
5604   else {
5605     x0 = x - radius, y0 = y - radius;
5606     x3 = x + radius, y3 = y + radius;
5607     radius *= radius;
5608   }
5609
5610   while (q = quads.pop()) {
5611
5612     // Stop searching if this quadrant can’t contain a closer node.
5613     if (!(node = q.node)
5614         || (x1 = q.x0) > x3
5615         || (y1 = q.y0) > y3
5616         || (x2 = q.x1) < x0
5617         || (y2 = q.y1) < y0) continue;
5618
5619     // Bisect the current quadrant.
5620     if (node.length) {
5621       var xm = (x1 + x2) / 2,
5622           ym = (y1 + y2) / 2;
5623
5624       quads.push(
5625         new Quad(node[3], xm, ym, x2, y2),
5626         new Quad(node[2], x1, ym, xm, y2),
5627         new Quad(node[1], xm, y1, x2, ym),
5628         new Quad(node[0], x1, y1, xm, ym)
5629       );
5630
5631       // Visit the closest quadrant first.
5632       if (i = (y >= ym) << 1 | (x >= xm)) {
5633         q = quads[quads.length - 1];
5634         quads[quads.length - 1] = quads[quads.length - 1 - i];
5635         quads[quads.length - 1 - i] = q;
5636       }
5637     }
5638
5639     // Visit this point. (Visiting coincident points isn’t necessary!)
5640     else {
5641       var dx = x - +this._x.call(null, node.data),
5642           dy = y - +this._y.call(null, node.data),
5643           d2 = dx * dx + dy * dy;
5644       if (d2 < radius) {
5645         var d = Math.sqrt(radius = d2);
5646         x0 = x - d, y0 = y - d;
5647         x3 = x + d, y3 = y + d;
5648         data = node.data;
5649       }
5650     }
5651   }
5652
5653   return data;
5654 }
5655
5656 function tree_remove(d) {
5657   if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points
5658
5659   var parent,
5660       node = this._root,
5661       retainer,
5662       previous,
5663       next,
5664       x0 = this._x0,
5665       y0 = this._y0,
5666       x1 = this._x1,
5667       y1 = this._y1,
5668       x,
5669       y,
5670       xm,
5671       ym,
5672       right,
5673       bottom,
5674       i,
5675       j;
5676
5677   // If the tree is empty, initialize the root as a leaf.
5678   if (!node) return this;
5679
5680   // Find the leaf node for the point.
5681   // While descending, also retain the deepest parent with a non-removed sibling.
5682   if (node.length) while (true) {
5683     if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5684     if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5685     if (!(parent = node, node = node[i = bottom << 1 | right])) return this;
5686     if (!node.length) break;
5687     if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;
5688   }
5689
5690   // Find the point to remove.
5691   while (node.data !== d) if (!(previous = node, node = node.next)) return this;
5692   if (next = node.next) delete node.next;
5693
5694   // If there are multiple coincident points, remove just the point.
5695   if (previous) return next ? previous.next = next : delete previous.next, this;
5696
5697   // If this is the root point, remove it.
5698   if (!parent) return this._root = next, this;
5699
5700   // Remove this leaf.
5701   next ? parent[i] = next : delete parent[i];
5702
5703   // If the parent now contains exactly one leaf, collapse superfluous parents.
5704   if ((node = parent[0] || parent[1] || parent[2] || parent[3])
5705       && node === (parent[3] || parent[2] || parent[1] || parent[0])
5706       && !node.length) {
5707     if (retainer) retainer[j] = node;
5708     else this._root = node;
5709   }
5710
5711   return this;
5712 }
5713
5714 function removeAll(data) {
5715   for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);
5716   return this;
5717 }
5718
5719 function tree_root() {
5720   return this._root;
5721 }
5722
5723 function tree_size() {
5724   var size = 0;
5725   this.visit(function(node) {
5726     if (!node.length) do ++size; while (node = node.next)
5727   });
5728   return size;
5729 }
5730
5731 function tree_visit(callback) {
5732   var quads = [], q, node = this._root, child, x0, y0, x1, y1;
5733   if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));
5734   while (q = quads.pop()) {
5735     if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {
5736       var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
5737       if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
5738       if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
5739       if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
5740       if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
5741     }
5742   }
5743   return this;
5744 }
5745
5746 function tree_visitAfter(callback) {
5747   var quads = [], next = [], q;
5748   if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));
5749   while (q = quads.pop()) {
5750     var node = q.node;
5751     if (node.length) {
5752       var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
5753       if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
5754       if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
5755       if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
5756       if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
5757     }
5758     next.push(q);
5759   }
5760   while (q = next.pop()) {
5761     callback(q.node, q.x0, q.y0, q.x1, q.y1);
5762   }
5763   return this;
5764 }
5765
5766 function defaultX(d) {
5767   return d[0];
5768 }
5769
5770 function tree_x(_) {
5771   return arguments.length ? (this._x = _, this) : this._x;
5772 }
5773
5774 function defaultY(d) {
5775   return d[1];
5776 }
5777
5778 function tree_y(_) {
5779   return arguments.length ? (this._y = _, this) : this._y;
5780 }
5781
5782 function quadtree(nodes, x, y) {
5783   var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);
5784   return nodes == null ? tree : tree.addAll(nodes);
5785 }
5786
5787 function Quadtree(x, y, x0, y0, x1, y1) {
5788   this._x = x;
5789   this._y = y;
5790   this._x0 = x0;
5791   this._y0 = y0;
5792   this._x1 = x1;
5793   this._y1 = y1;
5794   this._root = undefined;
5795 }
5796
5797 function leaf_copy(leaf) {
5798   var copy = {data: leaf.data}, next = copy;
5799   while (leaf = leaf.next) next = next.next = {data: leaf.data};
5800   return copy;
5801 }
5802
5803 var treeProto = quadtree.prototype = Quadtree.prototype;
5804
5805 treeProto.copy = function() {
5806   var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),
5807       node = this._root,
5808       nodes,
5809       child;
5810
5811   if (!node) return copy;
5812
5813   if (!node.length) return copy._root = leaf_copy(node), copy;
5814
5815   nodes = [{source: node, target: copy._root = new Array(4)}];
5816   while (node = nodes.pop()) {
5817     for (var i = 0; i < 4; ++i) {
5818       if (child = node.source[i]) {
5819         if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});
5820         else node.target[i] = leaf_copy(child);
5821       }
5822     }
5823   }
5824
5825   return copy;
5826 };
5827
5828 treeProto.add = tree_add;
5829 treeProto.addAll = addAll;
5830 treeProto.cover = tree_cover;
5831 treeProto.data = tree_data;
5832 treeProto.extent = tree_extent;
5833 treeProto.find = tree_find;
5834 treeProto.remove = tree_remove;
5835 treeProto.removeAll = removeAll;
5836 treeProto.root = tree_root;
5837 treeProto.size = tree_size;
5838 treeProto.visit = tree_visit;
5839 treeProto.visitAfter = tree_visitAfter;
5840 treeProto.x = tree_x;
5841 treeProto.y = tree_y;
5842
5843 function x(d) {
5844   return d.x + d.vx;
5845 }
5846
5847 function y(d) {
5848   return d.y + d.vy;
5849 }
5850
5851 function collide(radius) {
5852   var nodes,
5853       radii,
5854       strength = 1,
5855       iterations = 1;
5856
5857   if (typeof radius !== "function") radius = constant$6(radius == null ? 1 : +radius);
5858
5859   function force() {
5860     var i, n = nodes.length,
5861         tree,
5862         node,
5863         xi,
5864         yi,
5865         ri,
5866         ri2;
5867
5868     for (var k = 0; k < iterations; ++k) {
5869       tree = quadtree(nodes, x, y).visitAfter(prepare);
5870       for (i = 0; i < n; ++i) {
5871         node = nodes[i];
5872         ri = radii[node.index], ri2 = ri * ri;
5873         xi = node.x + node.vx;
5874         yi = node.y + node.vy;
5875         tree.visit(apply);
5876       }
5877     }
5878
5879     function apply(quad, x0, y0, x1, y1) {
5880       var data = quad.data, rj = quad.r, r = ri + rj;
5881       if (data) {
5882         if (data.index > node.index) {
5883           var x = xi - data.x - data.vx,
5884               y = yi - data.y - data.vy,
5885               l = x * x + y * y;
5886           if (l < r * r) {
5887             if (x === 0) x = jiggle(), l += x * x;
5888             if (y === 0) y = jiggle(), l += y * y;
5889             l = (r - (l = Math.sqrt(l))) / l * strength;
5890             node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));
5891             node.vy += (y *= l) * r;
5892             data.vx -= x * (r = 1 - r);
5893             data.vy -= y * r;
5894           }
5895         }
5896         return;
5897       }
5898       return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
5899     }
5900   }
5901
5902   function prepare(quad) {
5903     if (quad.data) return quad.r = radii[quad.data.index];
5904     for (var i = quad.r = 0; i < 4; ++i) {
5905       if (quad[i] && quad[i].r > quad.r) {
5906         quad.r = quad[i].r;
5907       }
5908     }
5909   }
5910
5911   function initialize() {
5912     if (!nodes) return;
5913     var i, n = nodes.length, node;
5914     radii = new Array(n);
5915     for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes);
5916   }
5917
5918   force.initialize = function(_) {
5919     nodes = _;
5920     initialize();
5921   };
5922
5923   force.iterations = function(_) {
5924     return arguments.length ? (iterations = +_, force) : iterations;
5925   };
5926
5927   force.strength = function(_) {
5928     return arguments.length ? (strength = +_, force) : strength;
5929   };
5930
5931   force.radius = function(_) {
5932     return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : radius;
5933   };
5934
5935   return force;
5936 }
5937
5938 function index(d) {
5939   return d.index;
5940 }
5941
5942 function find(nodeById, nodeId) {
5943   var node = nodeById.get(nodeId);
5944   if (!node) throw new Error("missing: " + nodeId);
5945   return node;
5946 }
5947
5948 function link(links) {
5949   var id = index,
5950       strength = defaultStrength,
5951       strengths,
5952       distance = constant$6(30),
5953       distances,
5954       nodes,
5955       count,
5956       bias,
5957       iterations = 1;
5958
5959   if (links == null) links = [];
5960
5961   function defaultStrength(link) {
5962     return 1 / Math.min(count[link.source.index], count[link.target.index]);
5963   }
5964
5965   function force(alpha) {
5966     for (var k = 0, n = links.length; k < iterations; ++k) {
5967       for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {
5968         link = links[i], source = link.source, target = link.target;
5969         x = target.x + target.vx - source.x - source.vx || jiggle();
5970         y = target.y + target.vy - source.y - source.vy || jiggle();
5971         l = Math.sqrt(x * x + y * y);
5972         l = (l - distances[i]) / l * alpha * strengths[i];
5973         x *= l, y *= l;
5974         target.vx -= x * (b = bias[i]);
5975         target.vy -= y * b;
5976         source.vx += x * (b = 1 - b);
5977         source.vy += y * b;
5978       }
5979     }
5980   }
5981
5982   function initialize() {
5983     if (!nodes) return;
5984
5985     var i,
5986         n = nodes.length,
5987         m = links.length,
5988         nodeById = map$1(nodes, id),
5989         link;
5990
5991     for (i = 0, count = new Array(n); i < m; ++i) {
5992       link = links[i], link.index = i;
5993       if (typeof link.source !== "object") link.source = find(nodeById, link.source);
5994       if (typeof link.target !== "object") link.target = find(nodeById, link.target);
5995       count[link.source.index] = (count[link.source.index] || 0) + 1;
5996       count[link.target.index] = (count[link.target.index] || 0) + 1;
5997     }
5998
5999     for (i = 0, bias = new Array(m); i < m; ++i) {
6000       link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);
6001     }
6002
6003     strengths = new Array(m), initializeStrength();
6004     distances = new Array(m), initializeDistance();
6005   }
6006
6007   function initializeStrength() {
6008     if (!nodes) return;
6009
6010     for (var i = 0, n = links.length; i < n; ++i) {
6011       strengths[i] = +strength(links[i], i, links);
6012     }
6013   }
6014
6015   function initializeDistance() {
6016     if (!nodes) return;
6017
6018     for (var i = 0, n = links.length; i < n; ++i) {
6019       distances[i] = +distance(links[i], i, links);
6020     }
6021   }
6022
6023   force.initialize = function(_) {
6024     nodes = _;
6025     initialize();
6026   };
6027
6028   force.links = function(_) {
6029     return arguments.length ? (links = _, initialize(), force) : links;
6030   };
6031
6032   force.id = function(_) {
6033     return arguments.length ? (id = _, force) : id;
6034   };
6035
6036   force.iterations = function(_) {
6037     return arguments.length ? (iterations = +_, force) : iterations;
6038   };
6039
6040   force.strength = function(_) {
6041     return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initializeStrength(), force) : strength;
6042   };
6043
6044   force.distance = function(_) {
6045     return arguments.length ? (distance = typeof _ === "function" ? _ : constant$6(+_), initializeDistance(), force) : distance;
6046   };
6047
6048   return force;
6049 }
6050
6051 function x$1(d) {
6052   return d.x;
6053 }
6054
6055 function y$1(d) {
6056   return d.y;
6057 }
6058
6059 var initialRadius = 10,
6060     initialAngle = Math.PI * (3 - Math.sqrt(5));
6061
6062 function simulation(nodes) {
6063   var simulation,
6064       alpha = 1,
6065       alphaMin = 0.001,
6066       alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),
6067       alphaTarget = 0,
6068       velocityDecay = 0.6,
6069       forces = map$1(),
6070       stepper = timer(step),
6071       event = dispatch("tick", "end");
6072
6073   if (nodes == null) nodes = [];
6074
6075   function step() {
6076     tick();
6077     event.call("tick", simulation);
6078     if (alpha < alphaMin) {
6079       stepper.stop();
6080       event.call("end", simulation);
6081     }
6082   }
6083
6084   function tick() {
6085     var i, n = nodes.length, node;
6086
6087     alpha += (alphaTarget - alpha) * alphaDecay;
6088
6089     forces.each(function(force) {
6090       force(alpha);
6091     });
6092
6093     for (i = 0; i < n; ++i) {
6094       node = nodes[i];
6095       if (node.fx == null) node.x += node.vx *= velocityDecay;
6096       else node.x = node.fx, node.vx = 0;
6097       if (node.fy == null) node.y += node.vy *= velocityDecay;
6098       else node.y = node.fy, node.vy = 0;
6099     }
6100   }
6101
6102   function initializeNodes() {
6103     for (var i = 0, n = nodes.length, node; i < n; ++i) {
6104       node = nodes[i], node.index = i;
6105       if (isNaN(node.x) || isNaN(node.y)) {
6106         var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;
6107         node.x = radius * Math.cos(angle);
6108         node.y = radius * Math.sin(angle);
6109       }
6110       if (isNaN(node.vx) || isNaN(node.vy)) {
6111         node.vx = node.vy = 0;
6112       }
6113     }
6114   }
6115
6116   function initializeForce(force) {
6117     if (force.initialize) force.initialize(nodes);
6118     return force;
6119   }
6120
6121   initializeNodes();
6122
6123   return simulation = {
6124     tick: tick,
6125
6126     restart: function() {
6127       return stepper.restart(step), simulation;
6128     },
6129
6130     stop: function() {
6131       return stepper.stop(), simulation;
6132     },
6133
6134     nodes: function(_) {
6135       return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;
6136     },
6137
6138     alpha: function(_) {
6139       return arguments.length ? (alpha = +_, simulation) : alpha;
6140     },
6141
6142     alphaMin: function(_) {
6143       return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
6144     },
6145
6146     alphaDecay: function(_) {
6147       return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
6148     },
6149
6150     alphaTarget: function(_) {
6151       return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
6152     },
6153
6154     velocityDecay: function(_) {
6155       return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
6156     },
6157
6158     force: function(name, _) {
6159       return arguments.length > 1 ? (_ == null ? forces.remove(name) : forces.set(name, initializeForce(_)), simulation) : forces.get(name);
6160     },
6161
6162     find: function(x, y, radius) {
6163       var i = 0,
6164           n = nodes.length,
6165           dx,
6166           dy,
6167           d2,
6168           node,
6169           closest;
6170
6171       if (radius == null) radius = Infinity;
6172       else radius *= radius;
6173
6174       for (i = 0; i < n; ++i) {
6175         node = nodes[i];
6176         dx = x - node.x;
6177         dy = y - node.y;
6178         d2 = dx * dx + dy * dy;
6179         if (d2 < radius) closest = node, radius = d2;
6180       }
6181
6182       return closest;
6183     },
6184
6185     on: function(name, _) {
6186       return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
6187     }
6188   };
6189 }
6190
6191 function manyBody() {
6192   var nodes,
6193       node,
6194       alpha,
6195       strength = constant$6(-30),
6196       strengths,
6197       distanceMin2 = 1,
6198       distanceMax2 = Infinity,
6199       theta2 = 0.81;
6200
6201   function force(_) {
6202     var i, n = nodes.length, tree = quadtree(nodes, x$1, y$1).visitAfter(accumulate);
6203     for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);
6204   }
6205
6206   function initialize() {
6207     if (!nodes) return;
6208     var i, n = nodes.length, node;
6209     strengths = new Array(n);
6210     for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);
6211   }
6212
6213   function accumulate(quad) {
6214     var strength = 0, q, c, weight = 0, x, y, i;
6215
6216     // For internal nodes, accumulate forces from child quadrants.
6217     if (quad.length) {
6218       for (x = y = i = 0; i < 4; ++i) {
6219         if ((q = quad[i]) && (c = Math.abs(q.value))) {
6220           strength += q.value, weight += c, x += c * q.x, y += c * q.y;
6221         }
6222       }
6223       quad.x = x / weight;
6224       quad.y = y / weight;
6225     }
6226
6227     // For leaf nodes, accumulate forces from coincident quadrants.
6228     else {
6229       q = quad;
6230       q.x = q.data.x;
6231       q.y = q.data.y;
6232       do strength += strengths[q.data.index];
6233       while (q = q.next);
6234     }
6235
6236     quad.value = strength;
6237   }
6238
6239   function apply(quad, x1, _, x2) {
6240     if (!quad.value) return true;
6241
6242     var x = quad.x - node.x,
6243         y = quad.y - node.y,
6244         w = x2 - x1,
6245         l = x * x + y * y;
6246
6247     // Apply the Barnes-Hut approximation if possible.
6248     // Limit forces for very close nodes; randomize direction if coincident.
6249     if (w * w / theta2 < l) {
6250       if (l < distanceMax2) {
6251         if (x === 0) x = jiggle(), l += x * x;
6252         if (y === 0) y = jiggle(), l += y * y;
6253         if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
6254         node.vx += x * quad.value * alpha / l;
6255         node.vy += y * quad.value * alpha / l;
6256       }
6257       return true;
6258     }
6259
6260     // Otherwise, process points directly.
6261     else if (quad.length || l >= distanceMax2) return;
6262
6263     // Limit forces for very close nodes; randomize direction if coincident.
6264     if (quad.data !== node || quad.next) {
6265       if (x === 0) x = jiggle(), l += x * x;
6266       if (y === 0) y = jiggle(), l += y * y;
6267       if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
6268     }
6269
6270     do if (quad.data !== node) {
6271       w = strengths[quad.data.index] * alpha / l;
6272       node.vx += x * w;
6273       node.vy += y * w;
6274     } while (quad = quad.next);
6275   }
6276
6277   force.initialize = function(_) {
6278     nodes = _;
6279     initialize();
6280   };
6281
6282   force.strength = function(_) {
6283     return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6284   };
6285
6286   force.distanceMin = function(_) {
6287     return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
6288   };
6289
6290   force.distanceMax = function(_) {
6291     return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
6292   };
6293
6294   force.theta = function(_) {
6295     return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
6296   };
6297
6298   return force;
6299 }
6300
6301 function radial(radius, x, y) {
6302   var nodes,
6303       strength = constant$6(0.1),
6304       strengths,
6305       radiuses;
6306
6307   if (typeof radius !== "function") radius = constant$6(+radius);
6308   if (x == null) x = 0;
6309   if (y == null) y = 0;
6310
6311   function force(alpha) {
6312     for (var i = 0, n = nodes.length; i < n; ++i) {
6313       var node = nodes[i],
6314           dx = node.x - x || 1e-6,
6315           dy = node.y - y || 1e-6,
6316           r = Math.sqrt(dx * dx + dy * dy),
6317           k = (radiuses[i] - r) * strengths[i] * alpha / r;
6318       node.vx += dx * k;
6319       node.vy += dy * k;
6320     }
6321   }
6322
6323   function initialize() {
6324     if (!nodes) return;
6325     var i, n = nodes.length;
6326     strengths = new Array(n);
6327     radiuses = new Array(n);
6328     for (i = 0; i < n; ++i) {
6329       radiuses[i] = +radius(nodes[i], i, nodes);
6330       strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes);
6331     }
6332   }
6333
6334   force.initialize = function(_) {
6335     nodes = _, initialize();
6336   };
6337
6338   force.strength = function(_) {
6339     return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6340   };
6341
6342   force.radius = function(_) {
6343     return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : radius;
6344   };
6345
6346   force.x = function(_) {
6347     return arguments.length ? (x = +_, force) : x;
6348   };
6349
6350   force.y = function(_) {
6351     return arguments.length ? (y = +_, force) : y;
6352   };
6353
6354   return force;
6355 }
6356
6357 function x$2(x) {
6358   var strength = constant$6(0.1),
6359       nodes,
6360       strengths,
6361       xz;
6362
6363   if (typeof x !== "function") x = constant$6(x == null ? 0 : +x);
6364
6365   function force(alpha) {
6366     for (var i = 0, n = nodes.length, node; i < n; ++i) {
6367       node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;
6368     }
6369   }
6370
6371   function initialize() {
6372     if (!nodes) return;
6373     var i, n = nodes.length;
6374     strengths = new Array(n);
6375     xz = new Array(n);
6376     for (i = 0; i < n; ++i) {
6377       strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
6378     }
6379   }
6380
6381   force.initialize = function(_) {
6382     nodes = _;
6383     initialize();
6384   };
6385
6386   force.strength = function(_) {
6387     return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6388   };
6389
6390   force.x = function(_) {
6391     return arguments.length ? (x = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : x;
6392   };
6393
6394   return force;
6395 }
6396
6397 function y$2(y) {
6398   var strength = constant$6(0.1),
6399       nodes,
6400       strengths,
6401       yz;
6402
6403   if (typeof y !== "function") y = constant$6(y == null ? 0 : +y);
6404
6405   function force(alpha) {
6406     for (var i = 0, n = nodes.length, node; i < n; ++i) {
6407       node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;
6408     }
6409   }
6410
6411   function initialize() {
6412     if (!nodes) return;
6413     var i, n = nodes.length;
6414     strengths = new Array(n);
6415     yz = new Array(n);
6416     for (i = 0; i < n; ++i) {
6417       strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
6418     }
6419   }
6420
6421   force.initialize = function(_) {
6422     nodes = _;
6423     initialize();
6424   };
6425
6426   force.strength = function(_) {
6427     return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6428   };
6429
6430   force.y = function(_) {
6431     return arguments.length ? (y = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : y;
6432   };
6433
6434   return force;
6435 }
6436
6437 // Computes the decimal coefficient and exponent of the specified number x with
6438 // significant digits p, where x is positive and p is in [1, 21] or undefined.
6439 // For example, formatDecimal(1.23) returns ["123", 0].
6440 function formatDecimal(x, p) {
6441   if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity
6442   var i, coefficient = x.slice(0, i);
6443
6444   // The string returned by toExponential either has the form \d\.\d+e[-+]\d+
6445   // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3).
6446   return [
6447     coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
6448     +x.slice(i + 1)
6449   ];
6450 }
6451
6452 function exponent$1(x) {
6453   return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;
6454 }
6455
6456 function formatGroup(grouping, thousands) {
6457   return function(value, width) {
6458     var i = value.length,
6459         t = [],
6460         j = 0,
6461         g = grouping[0],
6462         length = 0;
6463
6464     while (i > 0 && g > 0) {
6465       if (length + g + 1 > width) g = Math.max(1, width - length);
6466       t.push(value.substring(i -= g, i + g));
6467       if ((length += g + 1) > width) break;
6468       g = grouping[j = (j + 1) % grouping.length];
6469     }
6470
6471     return t.reverse().join(thousands);
6472   };
6473 }
6474
6475 function formatNumerals(numerals) {
6476   return function(value) {
6477     return value.replace(/[0-9]/g, function(i) {
6478       return numerals[+i];
6479     });
6480   };
6481 }
6482
6483 function formatDefault(x, p) {
6484   x = x.toPrecision(p);
6485
6486   out: for (var n = x.length, i = 1, i0 = -1, i1; i < n; ++i) {
6487     switch (x[i]) {
6488       case ".": i0 = i1 = i; break;
6489       case "0": if (i0 === 0) i0 = i; i1 = i; break;
6490       case "e": break out;
6491       default: if (i0 > 0) i0 = 0; break;
6492     }
6493   }
6494
6495   return i0 > 0 ? x.slice(0, i0) + x.slice(i1 + 1) : x;
6496 }
6497
6498 var prefixExponent;
6499
6500 function formatPrefixAuto(x, p) {
6501   var d = formatDecimal(x, p);
6502   if (!d) return x + "";
6503   var coefficient = d[0],
6504       exponent = d[1],
6505       i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,
6506       n = coefficient.length;
6507   return i === n ? coefficient
6508       : i > n ? coefficient + new Array(i - n + 1).join("0")
6509       : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i)
6510       : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!
6511 }
6512
6513 function formatRounded(x, p) {
6514   var d = formatDecimal(x, p);
6515   if (!d) return x + "";
6516   var coefficient = d[0],
6517       exponent = d[1];
6518   return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient
6519       : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1)
6520       : coefficient + new Array(exponent - coefficient.length + 2).join("0");
6521 }
6522
6523 var formatTypes = {
6524   "": formatDefault,
6525   "%": function(x, p) { return (x * 100).toFixed(p); },
6526   "b": function(x) { return Math.round(x).toString(2); },
6527   "c": function(x) { return x + ""; },
6528   "d": function(x) { return Math.round(x).toString(10); },
6529   "e": function(x, p) { return x.toExponential(p); },
6530   "f": function(x, p) { return x.toFixed(p); },
6531   "g": function(x, p) { return x.toPrecision(p); },
6532   "o": function(x) { return Math.round(x).toString(8); },
6533   "p": function(x, p) { return formatRounded(x * 100, p); },
6534   "r": formatRounded,
6535   "s": formatPrefixAuto,
6536   "X": function(x) { return Math.round(x).toString(16).toUpperCase(); },
6537   "x": function(x) { return Math.round(x).toString(16); }
6538 };
6539
6540 // [[fill]align][sign][symbol][0][width][,][.precision][type]
6541 var re = /^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i;
6542
6543 function formatSpecifier(specifier) {
6544   return new FormatSpecifier(specifier);
6545 }
6546
6547 formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof
6548
6549 function FormatSpecifier(specifier) {
6550   if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
6551
6552   var match,
6553       fill = match[1] || " ",
6554       align = match[2] || ">",
6555       sign = match[3] || "-",
6556       symbol = match[4] || "",
6557       zero = !!match[5],
6558       width = match[6] && +match[6],
6559       comma = !!match[7],
6560       precision = match[8] && +match[8].slice(1),
6561       type = match[9] || "";
6562
6563   // The "n" type is an alias for ",g".
6564   if (type === "n") comma = true, type = "g";
6565
6566   // Map invalid types to the default format.
6567   else if (!formatTypes[type]) type = "";
6568
6569   // If zero fill is specified, padding goes after sign and before digits.
6570   if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "=";
6571
6572   this.fill = fill;
6573   this.align = align;
6574   this.sign = sign;
6575   this.symbol = symbol;
6576   this.zero = zero;
6577   this.width = width;
6578   this.comma = comma;
6579   this.precision = precision;
6580   this.type = type;
6581 }
6582
6583 FormatSpecifier.prototype.toString = function() {
6584   return this.fill
6585       + this.align
6586       + this.sign
6587       + this.symbol
6588       + (this.zero ? "0" : "")
6589       + (this.width == null ? "" : Math.max(1, this.width | 0))
6590       + (this.comma ? "," : "")
6591       + (this.precision == null ? "" : "." + Math.max(0, this.precision | 0))
6592       + this.type;
6593 };
6594
6595 function identity$3(x) {
6596   return x;
6597 }
6598
6599 var prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];
6600
6601 function formatLocale(locale) {
6602   var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity$3,
6603       currency = locale.currency,
6604       decimal = locale.decimal,
6605       numerals = locale.numerals ? formatNumerals(locale.numerals) : identity$3,
6606       percent = locale.percent || "%";
6607
6608   function newFormat(specifier) {
6609     specifier = formatSpecifier(specifier);
6610
6611     var fill = specifier.fill,
6612         align = specifier.align,
6613         sign = specifier.sign,
6614         symbol = specifier.symbol,
6615         zero = specifier.zero,
6616         width = specifier.width,
6617         comma = specifier.comma,
6618         precision = specifier.precision,
6619         type = specifier.type;
6620
6621     // Compute the prefix and suffix.
6622     // For SI-prefix, the suffix is lazily computed.
6623     var prefix = symbol === "$" ? currency[0] : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "",
6624         suffix = symbol === "$" ? currency[1] : /[%p]/.test(type) ? percent : "";
6625
6626     // What format function should we use?
6627     // Is this an integer type?
6628     // Can this type generate exponential notation?
6629     var formatType = formatTypes[type],
6630         maybeSuffix = !type || /[defgprs%]/.test(type);
6631
6632     // Set the default precision if not specified,
6633     // or clamp the specified precision to the supported range.
6634     // For significant precision, it must be in [1, 21].
6635     // For fixed precision, it must be in [0, 20].
6636     precision = precision == null ? (type ? 6 : 12)
6637         : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))
6638         : Math.max(0, Math.min(20, precision));
6639
6640     function format(value) {
6641       var valuePrefix = prefix,
6642           valueSuffix = suffix,
6643           i, n, c;
6644
6645       if (type === "c") {
6646         valueSuffix = formatType(value) + valueSuffix;
6647         value = "";
6648       } else {
6649         value = +value;
6650
6651         // Perform the initial formatting.
6652         var valueNegative = value < 0;
6653         value = formatType(Math.abs(value), precision);
6654
6655         // If a negative value rounds to zero during formatting, treat as positive.
6656         if (valueNegative && +value === 0) valueNegative = false;
6657
6658         // Compute the prefix and suffix.
6659         valuePrefix = (valueNegative ? (sign === "(" ? sign : "-") : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
6660         valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : "");
6661
6662         // Break the formatted value into the integer “value” part that can be
6663         // grouped, and fractional or exponential “suffix” part that is not.
6664         if (maybeSuffix) {
6665           i = -1, n = value.length;
6666           while (++i < n) {
6667             if (c = value.charCodeAt(i), 48 > c || c > 57) {
6668               valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;
6669               value = value.slice(0, i);
6670               break;
6671             }
6672           }
6673         }
6674       }
6675
6676       // If the fill character is not "0", grouping is applied before padding.
6677       if (comma && !zero) value = group(value, Infinity);
6678
6679       // Compute the padding.
6680       var length = valuePrefix.length + value.length + valueSuffix.length,
6681           padding = length < width ? new Array(width - length + 1).join(fill) : "";
6682
6683       // If the fill character is "0", grouping is applied after padding.
6684       if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
6685
6686       // Reconstruct the final output based on the desired alignment.
6687       switch (align) {
6688         case "<": value = valuePrefix + value + valueSuffix + padding; break;
6689         case "=": value = valuePrefix + padding + value + valueSuffix; break;
6690         case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;
6691         default: value = padding + valuePrefix + value + valueSuffix; break;
6692       }
6693
6694       return numerals(value);
6695     }
6696
6697     format.toString = function() {
6698       return specifier + "";
6699     };
6700
6701     return format;
6702   }
6703
6704   function formatPrefix(specifier, value) {
6705     var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)),
6706         e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3,
6707         k = Math.pow(10, -e),
6708         prefix = prefixes[8 + e / 3];
6709     return function(value) {
6710       return f(k * value) + prefix;
6711     };
6712   }
6713
6714   return {
6715     format: newFormat,
6716     formatPrefix: formatPrefix
6717   };
6718 }
6719
6720 var locale;
6721 var format;
6722 var formatPrefix;
6723
6724 defaultLocale({
6725   decimal: ".",
6726   thousands: ",",
6727   grouping: [3],
6728   currency: ["$", ""]
6729 });
6730
6731 function defaultLocale(definition) {
6732   locale = formatLocale(definition);
6733   format = locale.format;
6734   formatPrefix = locale.formatPrefix;
6735   return locale;
6736 }
6737
6738 function precisionFixed(step) {
6739   return Math.max(0, -exponent$1(Math.abs(step)));
6740 }
6741
6742 function precisionPrefix(step, value) {
6743   return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3 - exponent$1(Math.abs(step)));
6744 }
6745
6746 function precisionRound(step, max) {
6747   step = Math.abs(step), max = Math.abs(max) - step;
6748   return Math.max(0, exponent$1(max) - exponent$1(step)) + 1;
6749 }
6750
6751 // Adds floating point numbers with twice the normal precision.
6752 // Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and
6753 // Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)
6754 // 305–363 (1997).
6755 // Code adapted from GeographicLib by Charles F. F. Karney,
6756 // http://geographiclib.sourceforge.net/
6757
6758 function adder() {
6759   return new Adder;
6760 }
6761
6762 function Adder() {
6763   this.reset();
6764 }
6765
6766 Adder.prototype = {
6767   constructor: Adder,
6768   reset: function() {
6769     this.s = // rounded value
6770     this.t = 0; // exact error
6771   },
6772   add: function(y) {
6773     add$1(temp, y, this.t);
6774     add$1(this, temp.s, this.s);
6775     if (this.s) this.t += temp.t;
6776     else this.s = temp.t;
6777   },
6778   valueOf: function() {
6779     return this.s;
6780   }
6781 };
6782
6783 var temp = new Adder;
6784
6785 function add$1(adder, a, b) {
6786   var x = adder.s = a + b,
6787       bv = x - a,
6788       av = x - bv;
6789   adder.t = (a - av) + (b - bv);
6790 }
6791
6792 var epsilon$2 = 1e-6;
6793 var epsilon2$1 = 1e-12;
6794 var pi$3 = Math.PI;
6795 var halfPi$2 = pi$3 / 2;
6796 var quarterPi = pi$3 / 4;
6797 var tau$3 = pi$3 * 2;
6798
6799 var degrees$1 = 180 / pi$3;
6800 var radians = pi$3 / 180;
6801
6802 var abs = Math.abs;
6803 var atan = Math.atan;
6804 var atan2 = Math.atan2;
6805 var cos$1 = Math.cos;
6806 var ceil = Math.ceil;
6807 var exp = Math.exp;
6808 var log = Math.log;
6809 var pow = Math.pow;
6810 var sin$1 = Math.sin;
6811 var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };
6812 var sqrt = Math.sqrt;
6813 var tan = Math.tan;
6814
6815 function acos(x) {
6816   return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x);
6817 }
6818
6819 function asin(x) {
6820   return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x);
6821 }
6822
6823 function haversin(x) {
6824   return (x = sin$1(x / 2)) * x;
6825 }
6826
6827 function noop$1() {}
6828
6829 function streamGeometry(geometry, stream) {
6830   if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {
6831     streamGeometryType[geometry.type](geometry, stream);
6832   }
6833 }
6834
6835 var streamObjectType = {
6836   Feature: function(object, stream) {
6837     streamGeometry(object.geometry, stream);
6838   },
6839   FeatureCollection: function(object, stream) {
6840     var features = object.features, i = -1, n = features.length;
6841     while (++i < n) streamGeometry(features[i].geometry, stream);
6842   }
6843 };
6844
6845 var streamGeometryType = {
6846   Sphere: function(object, stream) {
6847     stream.sphere();
6848   },
6849   Point: function(object, stream) {
6850     object = object.coordinates;
6851     stream.point(object[0], object[1], object[2]);
6852   },
6853   MultiPoint: function(object, stream) {
6854     var coordinates = object.coordinates, i = -1, n = coordinates.length;
6855     while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);
6856   },
6857   LineString: function(object, stream) {
6858     streamLine(object.coordinates, stream, 0);
6859   },
6860   MultiLineString: function(object, stream) {
6861     var coordinates = object.coordinates, i = -1, n = coordinates.length;
6862     while (++i < n) streamLine(coordinates[i], stream, 0);
6863   },
6864   Polygon: function(object, stream) {
6865     streamPolygon(object.coordinates, stream);
6866   },
6867   MultiPolygon: function(object, stream) {
6868     var coordinates = object.coordinates, i = -1, n = coordinates.length;
6869     while (++i < n) streamPolygon(coordinates[i], stream);
6870   },
6871   GeometryCollection: function(object, stream) {
6872     var geometries = object.geometries, i = -1, n = geometries.length;
6873     while (++i < n) streamGeometry(geometries[i], stream);
6874   }
6875 };
6876
6877 function streamLine(coordinates, stream, closed) {
6878   var i = -1, n = coordinates.length - closed, coordinate;
6879   stream.lineStart();
6880   while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);
6881   stream.lineEnd();
6882 }
6883
6884 function streamPolygon(coordinates, stream) {
6885   var i = -1, n = coordinates.length;
6886   stream.polygonStart();
6887   while (++i < n) streamLine(coordinates[i], stream, 1);
6888   stream.polygonEnd();
6889 }
6890
6891 function d3_geoStream(object, stream) {
6892   if (object && streamObjectType.hasOwnProperty(object.type)) {
6893     streamObjectType[object.type](object, stream);
6894   } else {
6895     streamGeometry(object, stream);
6896   }
6897 }
6898
6899 var areaRingSum = adder();
6900
6901 var areaSum = adder(),
6902     lambda00,
6903     phi00,
6904     lambda0,
6905     cosPhi0,
6906     sinPhi0;
6907
6908 var areaStream = {
6909   point: noop$1,
6910   lineStart: noop$1,
6911   lineEnd: noop$1,
6912   polygonStart: function() {
6913     areaRingSum.reset();
6914     areaStream.lineStart = areaRingStart;
6915     areaStream.lineEnd = areaRingEnd;
6916   },
6917   polygonEnd: function() {
6918     var areaRing = +areaRingSum;
6919     areaSum.add(areaRing < 0 ? tau$3 + areaRing : areaRing);
6920     this.lineStart = this.lineEnd = this.point = noop$1;
6921   },
6922   sphere: function() {
6923     areaSum.add(tau$3);
6924   }
6925 };
6926
6927 function areaRingStart() {
6928   areaStream.point = areaPointFirst;
6929 }
6930
6931 function areaRingEnd() {
6932   areaPoint(lambda00, phi00);
6933 }
6934
6935 function areaPointFirst(lambda, phi) {
6936   areaStream.point = areaPoint;
6937   lambda00 = lambda, phi00 = phi;
6938   lambda *= radians, phi *= radians;
6939   lambda0 = lambda, cosPhi0 = cos$1(phi = phi / 2 + quarterPi), sinPhi0 = sin$1(phi);
6940 }
6941
6942 function areaPoint(lambda, phi) {
6943   lambda *= radians, phi *= radians;
6944   phi = phi / 2 + quarterPi; // half the angular distance from south pole
6945
6946   // Spherical excess E for a spherical triangle with vertices: south pole,
6947   // previous point, current point.  Uses a formula derived from Cagnoli’s
6948   // theorem.  See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).
6949   var dLambda = lambda - lambda0,
6950       sdLambda = dLambda >= 0 ? 1 : -1,
6951       adLambda = sdLambda * dLambda,
6952       cosPhi = cos$1(phi),
6953       sinPhi = sin$1(phi),
6954       k = sinPhi0 * sinPhi,
6955       u = cosPhi0 * cosPhi + k * cos$1(adLambda),
6956       v = k * sdLambda * sin$1(adLambda);
6957   areaRingSum.add(atan2(v, u));
6958
6959   // Advance the previous points.
6960   lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
6961 }
6962
6963 function d3_geoArea(object) {
6964   areaSum.reset();
6965   d3_geoStream(object, areaStream);
6966   return areaSum * 2;
6967 }
6968
6969 function spherical(cartesian) {
6970   return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];
6971 }
6972
6973 function cartesian(spherical) {
6974   var lambda = spherical[0], phi = spherical[1], cosPhi = cos$1(phi);
6975   return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)];
6976 }
6977
6978 function cartesianDot(a, b) {
6979   return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
6980 }
6981
6982 function cartesianCross(a, b) {
6983   return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
6984 }
6985
6986 // TODO return a
6987 function cartesianAddInPlace(a, b) {
6988   a[0] += b[0], a[1] += b[1], a[2] += b[2];
6989 }
6990
6991 function cartesianScale(vector, k) {
6992   return [vector[0] * k, vector[1] * k, vector[2] * k];
6993 }
6994
6995 // TODO return d
6996 function cartesianNormalizeInPlace(d) {
6997   var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
6998   d[0] /= l, d[1] /= l, d[2] /= l;
6999 }
7000
7001 var lambda0$1, phi0, lambda1, phi1, // bounds
7002     lambda2, // previous lambda-coordinate
7003     lambda00$1, phi00$1, // first point
7004     p0, // previous 3D point
7005     deltaSum = adder(),
7006     ranges,
7007     range;
7008
7009 var boundsStream = {
7010   point: boundsPoint,
7011   lineStart: boundsLineStart,
7012   lineEnd: boundsLineEnd,
7013   polygonStart: function() {
7014     boundsStream.point = boundsRingPoint;
7015     boundsStream.lineStart = boundsRingStart;
7016     boundsStream.lineEnd = boundsRingEnd;
7017     deltaSum.reset();
7018     areaStream.polygonStart();
7019   },
7020   polygonEnd: function() {
7021     areaStream.polygonEnd();
7022     boundsStream.point = boundsPoint;
7023     boundsStream.lineStart = boundsLineStart;
7024     boundsStream.lineEnd = boundsLineEnd;
7025     if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90);
7026     else if (deltaSum > epsilon$2) phi1 = 90;
7027     else if (deltaSum < -epsilon$2) phi0 = -90;
7028     range[0] = lambda0$1, range[1] = lambda1;
7029   }
7030 };
7031
7032 function boundsPoint(lambda, phi) {
7033   ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
7034   if (phi < phi0) phi0 = phi;
7035   if (phi > phi1) phi1 = phi;
7036 }
7037
7038 function linePoint(lambda, phi) {
7039   var p = cartesian([lambda * radians, phi * radians]);
7040   if (p0) {
7041     var normal = cartesianCross(p0, p),
7042         equatorial = [normal[1], -normal[0], 0],
7043         inflection = cartesianCross(equatorial, normal);
7044     cartesianNormalizeInPlace(inflection);
7045     inflection = spherical(inflection);
7046     var delta = lambda - lambda2,
7047         sign$$1 = delta > 0 ? 1 : -1,
7048         lambdai = inflection[0] * degrees$1 * sign$$1,
7049         phii,
7050         antimeridian = abs(delta) > 180;
7051     if (antimeridian ^ (sign$$1 * lambda2 < lambdai && lambdai < sign$$1 * lambda)) {
7052       phii = inflection[1] * degrees$1;
7053       if (phii > phi1) phi1 = phii;
7054     } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign$$1 * lambda2 < lambdai && lambdai < sign$$1 * lambda)) {
7055       phii = -inflection[1] * degrees$1;
7056       if (phii < phi0) phi0 = phii;
7057     } else {
7058       if (phi < phi0) phi0 = phi;
7059       if (phi > phi1) phi1 = phi;
7060     }
7061     if (antimeridian) {
7062       if (lambda < lambda2) {
7063         if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
7064       } else {
7065         if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
7066       }
7067     } else {
7068       if (lambda1 >= lambda0$1) {
7069         if (lambda < lambda0$1) lambda0$1 = lambda;
7070         if (lambda > lambda1) lambda1 = lambda;
7071       } else {
7072         if (lambda > lambda2) {
7073           if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
7074         } else {
7075           if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
7076         }
7077       }
7078     }
7079   } else {
7080     ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
7081   }
7082   if (phi < phi0) phi0 = phi;
7083   if (phi > phi1) phi1 = phi;
7084   p0 = p, lambda2 = lambda;
7085 }
7086
7087 function boundsLineStart() {
7088   boundsStream.point = linePoint;
7089 }
7090
7091 function boundsLineEnd() {
7092   range[0] = lambda0$1, range[1] = lambda1;
7093   boundsStream.point = boundsPoint;
7094   p0 = null;
7095 }
7096
7097 function boundsRingPoint(lambda, phi) {
7098   if (p0) {
7099     var delta = lambda - lambda2;
7100     deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
7101   } else {
7102     lambda00$1 = lambda, phi00$1 = phi;
7103   }
7104   areaStream.point(lambda, phi);
7105   linePoint(lambda, phi);
7106 }
7107
7108 function boundsRingStart() {
7109   areaStream.lineStart();
7110 }
7111
7112 function boundsRingEnd() {
7113   boundsRingPoint(lambda00$1, phi00$1);
7114   areaStream.lineEnd();
7115   if (abs(deltaSum) > epsilon$2) lambda0$1 = -(lambda1 = 180);
7116   range[0] = lambda0$1, range[1] = lambda1;
7117   p0 = null;
7118 }
7119
7120 // Finds the left-right distance between two longitudes.
7121 // This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want
7122 // the distance between ±180° to be 360°.
7123 function angle(lambda0, lambda1) {
7124   return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;
7125 }
7126
7127 function rangeCompare(a, b) {
7128   return a[0] - b[0];
7129 }
7130
7131 function rangeContains(range, x) {
7132   return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
7133 }
7134
7135 function d3_geoBounds(feature) {
7136   var i, n, a, b, merged, deltaMax, delta;
7137
7138   phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity);
7139   ranges = [];
7140   d3_geoStream(feature, boundsStream);
7141
7142   // First, sort ranges by their minimum longitudes.
7143   if (n = ranges.length) {
7144     ranges.sort(rangeCompare);
7145
7146     // Then, merge any ranges that overlap.
7147     for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {
7148       b = ranges[i];
7149       if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {
7150         if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
7151         if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
7152       } else {
7153         merged.push(a = b);
7154       }
7155     }
7156
7157     // Finally, find the largest gap between the merged ranges.
7158     // The final bounding box will be the inverse of this gap.
7159     for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {
7160       b = merged[i];
7161       if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1];
7162     }
7163   }
7164
7165   ranges = range = null;
7166
7167   return lambda0$1 === Infinity || phi0 === Infinity
7168       ? [[NaN, NaN], [NaN, NaN]]
7169       : [[lambda0$1, phi0], [lambda1, phi1]];
7170 }
7171
7172 var W0, W1,
7173     X0, Y0, Z0,
7174     X1, Y1, Z1,
7175     X2, Y2, Z2,
7176     lambda00$2, phi00$2, // first point
7177     x0, y0, z0; // previous point
7178
7179 var centroidStream = {
7180   sphere: noop$1,
7181   point: centroidPoint,
7182   lineStart: centroidLineStart,
7183   lineEnd: centroidLineEnd,
7184   polygonStart: function() {
7185     centroidStream.lineStart = centroidRingStart;
7186     centroidStream.lineEnd = centroidRingEnd;
7187   },
7188   polygonEnd: function() {
7189     centroidStream.lineStart = centroidLineStart;
7190     centroidStream.lineEnd = centroidLineEnd;
7191   }
7192 };
7193
7194 // Arithmetic mean of Cartesian vectors.
7195 function centroidPoint(lambda, phi) {
7196   lambda *= radians, phi *= radians;
7197   var cosPhi = cos$1(phi);
7198   centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi));
7199 }
7200
7201 function centroidPointCartesian(x, y, z) {
7202   ++W0;
7203   X0 += (x - X0) / W0;
7204   Y0 += (y - Y0) / W0;
7205   Z0 += (z - Z0) / W0;
7206 }
7207
7208 function centroidLineStart() {
7209   centroidStream.point = centroidLinePointFirst;
7210 }
7211
7212 function centroidLinePointFirst(lambda, phi) {
7213   lambda *= radians, phi *= radians;
7214   var cosPhi = cos$1(phi);
7215   x0 = cosPhi * cos$1(lambda);
7216   y0 = cosPhi * sin$1(lambda);
7217   z0 = sin$1(phi);
7218   centroidStream.point = centroidLinePoint;
7219   centroidPointCartesian(x0, y0, z0);
7220 }
7221
7222 function centroidLinePoint(lambda, phi) {
7223   lambda *= radians, phi *= radians;
7224   var cosPhi = cos$1(phi),
7225       x = cosPhi * cos$1(lambda),
7226       y = cosPhi * sin$1(lambda),
7227       z = sin$1(phi),
7228       w = atan2(sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);
7229   W1 += w;
7230   X1 += w * (x0 + (x0 = x));
7231   Y1 += w * (y0 + (y0 = y));
7232   Z1 += w * (z0 + (z0 = z));
7233   centroidPointCartesian(x0, y0, z0);
7234 }
7235
7236 function centroidLineEnd() {
7237   centroidStream.point = centroidPoint;
7238 }
7239
7240 // See J. E. Brock, The Inertia Tensor for a Spherical Triangle,
7241 // J. Applied Mechanics 42, 239 (1975).
7242 function centroidRingStart() {
7243   centroidStream.point = centroidRingPointFirst;
7244 }
7245
7246 function centroidRingEnd() {
7247   centroidRingPoint(lambda00$2, phi00$2);
7248   centroidStream.point = centroidPoint;
7249 }
7250
7251 function centroidRingPointFirst(lambda, phi) {
7252   lambda00$2 = lambda, phi00$2 = phi;
7253   lambda *= radians, phi *= radians;
7254   centroidStream.point = centroidRingPoint;
7255   var cosPhi = cos$1(phi);
7256   x0 = cosPhi * cos$1(lambda);
7257   y0 = cosPhi * sin$1(lambda);
7258   z0 = sin$1(phi);
7259   centroidPointCartesian(x0, y0, z0);
7260 }
7261
7262 function centroidRingPoint(lambda, phi) {
7263   lambda *= radians, phi *= radians;
7264   var cosPhi = cos$1(phi),
7265       x = cosPhi * cos$1(lambda),
7266       y = cosPhi * sin$1(lambda),
7267       z = sin$1(phi),
7268       cx = y0 * z - z0 * y,
7269       cy = z0 * x - x0 * z,
7270       cz = x0 * y - y0 * x,
7271       m = sqrt(cx * cx + cy * cy + cz * cz),
7272       w = asin(m), // line weight = angle
7273       v = m && -w / m; // area weight multiplier
7274   X2 += v * cx;
7275   Y2 += v * cy;
7276   Z2 += v * cz;
7277   W1 += w;
7278   X1 += w * (x0 + (x0 = x));
7279   Y1 += w * (y0 + (y0 = y));
7280   Z1 += w * (z0 + (z0 = z));
7281   centroidPointCartesian(x0, y0, z0);
7282 }
7283
7284 function d3_geoCentroid(object) {
7285   W0 = W1 =
7286   X0 = Y0 = Z0 =
7287   X1 = Y1 = Z1 =
7288   X2 = Y2 = Z2 = 0;
7289   d3_geoStream(object, centroidStream);
7290
7291   var x = X2,
7292       y = Y2,
7293       z = Z2,
7294       m = x * x + y * y + z * z;
7295
7296   // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid.
7297   if (m < epsilon2$1) {
7298     x = X1, y = Y1, z = Z1;
7299     // If the feature has zero length, fall back to arithmetic mean of point vectors.
7300     if (W1 < epsilon$2) x = X0, y = Y0, z = Z0;
7301     m = x * x + y * y + z * z;
7302     // If the feature still has an undefined ccentroid, then return.
7303     if (m < epsilon2$1) return [NaN, NaN];
7304   }
7305
7306   return [atan2(y, x) * degrees$1, asin(z / sqrt(m)) * degrees$1];
7307 }
7308
7309 function constant$7(x) {
7310   return function() {
7311     return x;
7312   };
7313 }
7314
7315 function compose(a, b) {
7316
7317   function compose(x, y) {
7318     return x = a(x, y), b(x[0], x[1]);
7319   }
7320
7321   if (a.invert && b.invert) compose.invert = function(x, y) {
7322     return x = b.invert(x, y), x && a.invert(x[0], x[1]);
7323   };
7324
7325   return compose;
7326 }
7327
7328 function rotationIdentity(lambda, phi) {
7329   return [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
7330 }
7331
7332 rotationIdentity.invert = rotationIdentity;
7333
7334 function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {
7335   return (deltaLambda %= tau$3) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))
7336     : rotationLambda(deltaLambda))
7337     : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)
7338     : rotationIdentity);
7339 }
7340
7341 function forwardRotationLambda(deltaLambda) {
7342   return function(lambda, phi) {
7343     return lambda += deltaLambda, [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
7344   };
7345 }
7346
7347 function rotationLambda(deltaLambda) {
7348   var rotation = forwardRotationLambda(deltaLambda);
7349   rotation.invert = forwardRotationLambda(-deltaLambda);
7350   return rotation;
7351 }
7352
7353 function rotationPhiGamma(deltaPhi, deltaGamma) {
7354   var cosDeltaPhi = cos$1(deltaPhi),
7355       sinDeltaPhi = sin$1(deltaPhi),
7356       cosDeltaGamma = cos$1(deltaGamma),
7357       sinDeltaGamma = sin$1(deltaGamma);
7358
7359   function rotation(lambda, phi) {
7360     var cosPhi = cos$1(phi),
7361         x = cos$1(lambda) * cosPhi,
7362         y = sin$1(lambda) * cosPhi,
7363         z = sin$1(phi),
7364         k = z * cosDeltaPhi + x * sinDeltaPhi;
7365     return [
7366       atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),
7367       asin(k * cosDeltaGamma + y * sinDeltaGamma)
7368     ];
7369   }
7370
7371   rotation.invert = function(lambda, phi) {
7372     var cosPhi = cos$1(phi),
7373         x = cos$1(lambda) * cosPhi,
7374         y = sin$1(lambda) * cosPhi,
7375         z = sin$1(phi),
7376         k = z * cosDeltaGamma - y * sinDeltaGamma;
7377     return [
7378       atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),
7379       asin(k * cosDeltaPhi - x * sinDeltaPhi)
7380     ];
7381   };
7382
7383   return rotation;
7384 }
7385
7386 function rotation(rotate) {
7387   rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);
7388
7389   function forward(coordinates) {
7390     coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);
7391     return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
7392   }
7393
7394   forward.invert = function(coordinates) {
7395     coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);
7396     return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
7397   };
7398
7399   return forward;
7400 }
7401
7402 // Generates a circle centered at [0°, 0°], with a given radius and precision.
7403 function circleStream(stream, radius, delta, direction, t0, t1) {
7404   if (!delta) return;
7405   var cosRadius = cos$1(radius),
7406       sinRadius = sin$1(radius),
7407       step = direction * delta;
7408   if (t0 == null) {
7409     t0 = radius + direction * tau$3;
7410     t1 = radius - step / 2;
7411   } else {
7412     t0 = circleRadius(cosRadius, t0);
7413     t1 = circleRadius(cosRadius, t1);
7414     if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$3;
7415   }
7416   for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {
7417     point = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]);
7418     stream.point(point[0], point[1]);
7419   }
7420 }
7421
7422 // Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].
7423 function circleRadius(cosRadius, point) {
7424   point = cartesian(point), point[0] -= cosRadius;
7425   cartesianNormalizeInPlace(point);
7426   var radius = acos(-point[1]);
7427   return ((-point[2] < 0 ? -radius : radius) + tau$3 - epsilon$2) % tau$3;
7428 }
7429
7430 function circle() {
7431   var center = constant$7([0, 0]),
7432       radius = constant$7(90),
7433       precision = constant$7(6),
7434       ring,
7435       rotate,
7436       stream = {point: point};
7437
7438   function point(x, y) {
7439     ring.push(x = rotate(x, y));
7440     x[0] *= degrees$1, x[1] *= degrees$1;
7441   }
7442
7443   function circle() {
7444     var c = center.apply(this, arguments),
7445         r = radius.apply(this, arguments) * radians,
7446         p = precision.apply(this, arguments) * radians;
7447     ring = [];
7448     rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;
7449     circleStream(stream, r, p, 1);
7450     c = {type: "Polygon", coordinates: [ring]};
7451     ring = rotate = null;
7452     return c;
7453   }
7454
7455   circle.center = function(_) {
7456     return arguments.length ? (center = typeof _ === "function" ? _ : constant$7([+_[0], +_[1]]), circle) : center;
7457   };
7458
7459   circle.radius = function(_) {
7460     return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), circle) : radius;
7461   };
7462
7463   circle.precision = function(_) {
7464     return arguments.length ? (precision = typeof _ === "function" ? _ : constant$7(+_), circle) : precision;
7465   };
7466
7467   return circle;
7468 }
7469
7470 function clipBuffer() {
7471   var lines = [],
7472       line;
7473   return {
7474     point: function(x, y) {
7475       line.push([x, y]);
7476     },
7477     lineStart: function() {
7478       lines.push(line = []);
7479     },
7480     lineEnd: noop$1,
7481     rejoin: function() {
7482       if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
7483     },
7484     result: function() {
7485       var result = lines;
7486       lines = [];
7487       line = null;
7488       return result;
7489     }
7490   };
7491 }
7492
7493 function pointEqual(a, b) {
7494   return abs(a[0] - b[0]) < epsilon$2 && abs(a[1] - b[1]) < epsilon$2;
7495 }
7496
7497 function Intersection(point, points, other, entry) {
7498   this.x = point;
7499   this.z = points;
7500   this.o = other; // another intersection
7501   this.e = entry; // is an entry?
7502   this.v = false; // visited
7503   this.n = this.p = null; // next & previous
7504 }
7505
7506 // A generalized polygon clipping algorithm: given a polygon that has been cut
7507 // into its visible line segments, and rejoins the segments by interpolating
7508 // along the clip edge.
7509 function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) {
7510   var subject = [],
7511       clip = [],
7512       i,
7513       n;
7514
7515   segments.forEach(function(segment) {
7516     if ((n = segment.length - 1) <= 0) return;
7517     var n, p0 = segment[0], p1 = segment[n], x;
7518
7519     // If the first and last points of a segment are coincident, then treat as a
7520     // closed ring. TODO if all rings are closed, then the winding order of the
7521     // exterior ring should be checked.
7522     if (pointEqual(p0, p1)) {
7523       stream.lineStart();
7524       for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);
7525       stream.lineEnd();
7526       return;
7527     }
7528
7529     subject.push(x = new Intersection(p0, segment, null, true));
7530     clip.push(x.o = new Intersection(p0, null, x, false));
7531     subject.push(x = new Intersection(p1, segment, null, false));
7532     clip.push(x.o = new Intersection(p1, null, x, true));
7533   });
7534
7535   if (!subject.length) return;
7536
7537   clip.sort(compareIntersection);
7538   link$1(subject);
7539   link$1(clip);
7540
7541   for (i = 0, n = clip.length; i < n; ++i) {
7542     clip[i].e = startInside = !startInside;
7543   }
7544
7545   var start = subject[0],
7546       points,
7547       point;
7548
7549   while (1) {
7550     // Find first unvisited intersection.
7551     var current = start,
7552         isSubject = true;
7553     while (current.v) if ((current = current.n) === start) return;
7554     points = current.z;
7555     stream.lineStart();
7556     do {
7557       current.v = current.o.v = true;
7558       if (current.e) {
7559         if (isSubject) {
7560           for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);
7561         } else {
7562           interpolate(current.x, current.n.x, 1, stream);
7563         }
7564         current = current.n;
7565       } else {
7566         if (isSubject) {
7567           points = current.p.z;
7568           for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);
7569         } else {
7570           interpolate(current.x, current.p.x, -1, stream);
7571         }
7572         current = current.p;
7573       }
7574       current = current.o;
7575       points = current.z;
7576       isSubject = !isSubject;
7577     } while (!current.v);
7578     stream.lineEnd();
7579   }
7580 }
7581
7582 function link$1(array) {
7583   if (!(n = array.length)) return;
7584   var n,
7585       i = 0,
7586       a = array[0],
7587       b;
7588   while (++i < n) {
7589     a.n = b = array[i];
7590     b.p = a;
7591     a = b;
7592   }
7593   a.n = b = array[0];
7594   b.p = a;
7595 }
7596
7597 var sum$1 = adder();
7598
7599 function polygonContains(polygon, point) {
7600   var lambda = point[0],
7601       phi = point[1],
7602       normal = [sin$1(lambda), -cos$1(lambda), 0],
7603       angle = 0,
7604       winding = 0;
7605
7606   sum$1.reset();
7607
7608   for (var i = 0, n = polygon.length; i < n; ++i) {
7609     if (!(m = (ring = polygon[i]).length)) continue;
7610     var ring,
7611         m,
7612         point0 = ring[m - 1],
7613         lambda0 = point0[0],
7614         phi0 = point0[1] / 2 + quarterPi,
7615         sinPhi0 = sin$1(phi0),
7616         cosPhi0 = cos$1(phi0);
7617
7618     for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {
7619       var point1 = ring[j],
7620           lambda1 = point1[0],
7621           phi1 = point1[1] / 2 + quarterPi,
7622           sinPhi1 = sin$1(phi1),
7623           cosPhi1 = cos$1(phi1),
7624           delta = lambda1 - lambda0,
7625           sign$$1 = delta >= 0 ? 1 : -1,
7626           absDelta = sign$$1 * delta,
7627           antimeridian = absDelta > pi$3,
7628           k = sinPhi0 * sinPhi1;
7629
7630       sum$1.add(atan2(k * sign$$1 * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta)));
7631       angle += antimeridian ? delta + sign$$1 * tau$3 : delta;
7632
7633       // Are the longitudes either side of the point’s meridian (lambda),
7634       // and are the latitudes smaller than the parallel (phi)?
7635       if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {
7636         var arc = cartesianCross(cartesian(point0), cartesian(point1));
7637         cartesianNormalizeInPlace(arc);
7638         var intersection = cartesianCross(normal, arc);
7639         cartesianNormalizeInPlace(intersection);
7640         var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);
7641         if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {
7642           winding += antimeridian ^ delta >= 0 ? 1 : -1;
7643         }
7644       }
7645     }
7646   }
7647
7648   // First, determine whether the South pole is inside or outside:
7649   //
7650   // It is inside if:
7651   // * the polygon winds around it in a clockwise direction.
7652   // * the polygon does not (cumulatively) wind around it, but has a negative
7653   //   (counter-clockwise) area.
7654   //
7655   // Second, count the (signed) number of times a segment crosses a lambda
7656   // from the point to the South pole.  If it is zero, then the point is the
7657   // same side as the South pole.
7658
7659   return (angle < -epsilon$2 || angle < epsilon$2 && sum$1 < -epsilon$2) ^ (winding & 1);
7660 }
7661
7662 function clip(pointVisible, clipLine, interpolate, start) {
7663   return function(sink) {
7664     var line = clipLine(sink),
7665         ringBuffer = clipBuffer(),
7666         ringSink = clipLine(ringBuffer),
7667         polygonStarted = false,
7668         polygon,
7669         segments,
7670         ring;
7671
7672     var clip = {
7673       point: point,
7674       lineStart: lineStart,
7675       lineEnd: lineEnd,
7676       polygonStart: function() {
7677         clip.point = pointRing;
7678         clip.lineStart = ringStart;
7679         clip.lineEnd = ringEnd;
7680         segments = [];
7681         polygon = [];
7682       },
7683       polygonEnd: function() {
7684         clip.point = point;
7685         clip.lineStart = lineStart;
7686         clip.lineEnd = lineEnd;
7687         segments = merge(segments);
7688         var startInside = polygonContains(polygon, start);
7689         if (segments.length) {
7690           if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7691           clipRejoin(segments, compareIntersection, startInside, interpolate, sink);
7692         } else if (startInside) {
7693           if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7694           sink.lineStart();
7695           interpolate(null, null, 1, sink);
7696           sink.lineEnd();
7697         }
7698         if (polygonStarted) sink.polygonEnd(), polygonStarted = false;
7699         segments = polygon = null;
7700       },
7701       sphere: function() {
7702         sink.polygonStart();
7703         sink.lineStart();
7704         interpolate(null, null, 1, sink);
7705         sink.lineEnd();
7706         sink.polygonEnd();
7707       }
7708     };
7709
7710     function point(lambda, phi) {
7711       if (pointVisible(lambda, phi)) sink.point(lambda, phi);
7712     }
7713
7714     function pointLine(lambda, phi) {
7715       line.point(lambda, phi);
7716     }
7717
7718     function lineStart() {
7719       clip.point = pointLine;
7720       line.lineStart();
7721     }
7722
7723     function lineEnd() {
7724       clip.point = point;
7725       line.lineEnd();
7726     }
7727
7728     function pointRing(lambda, phi) {
7729       ring.push([lambda, phi]);
7730       ringSink.point(lambda, phi);
7731     }
7732
7733     function ringStart() {
7734       ringSink.lineStart();
7735       ring = [];
7736     }
7737
7738     function ringEnd() {
7739       pointRing(ring[0][0], ring[0][1]);
7740       ringSink.lineEnd();
7741
7742       var clean = ringSink.clean(),
7743           ringSegments = ringBuffer.result(),
7744           i, n = ringSegments.length, m,
7745           segment,
7746           point;
7747
7748       ring.pop();
7749       polygon.push(ring);
7750       ring = null;
7751
7752       if (!n) return;
7753
7754       // No intersections.
7755       if (clean & 1) {
7756         segment = ringSegments[0];
7757         if ((m = segment.length - 1) > 0) {
7758           if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7759           sink.lineStart();
7760           for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);
7761           sink.lineEnd();
7762         }
7763         return;
7764       }
7765
7766       // Rejoin connected segments.
7767       // TODO reuse ringBuffer.rejoin()?
7768       if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
7769
7770       segments.push(ringSegments.filter(validSegment));
7771     }
7772
7773     return clip;
7774   };
7775 }
7776
7777 function validSegment(segment) {
7778   return segment.length > 1;
7779 }
7780
7781 // Intersections are sorted along the clip edge. For both antimeridian cutting
7782 // and circle clipping, the same comparison is used.
7783 function compareIntersection(a, b) {
7784   return ((a = a.x)[0] < 0 ? a[1] - halfPi$2 - epsilon$2 : halfPi$2 - a[1])
7785        - ((b = b.x)[0] < 0 ? b[1] - halfPi$2 - epsilon$2 : halfPi$2 - b[1]);
7786 }
7787
7788 var clipAntimeridian = clip(
7789   function() { return true; },
7790   clipAntimeridianLine,
7791   clipAntimeridianInterpolate,
7792   [-pi$3, -halfPi$2]
7793 );
7794
7795 // Takes a line and cuts into visible segments. Return values: 0 - there were
7796 // intersections or the line was empty; 1 - no intersections; 2 - there were
7797 // intersections, and the first and last segments should be rejoined.
7798 function clipAntimeridianLine(stream) {
7799   var lambda0 = NaN,
7800       phi0 = NaN,
7801       sign0 = NaN,
7802       clean; // no intersections
7803
7804   return {
7805     lineStart: function() {
7806       stream.lineStart();
7807       clean = 1;
7808     },
7809     point: function(lambda1, phi1) {
7810       var sign1 = lambda1 > 0 ? pi$3 : -pi$3,
7811           delta = abs(lambda1 - lambda0);
7812       if (abs(delta - pi$3) < epsilon$2) { // line crosses a pole
7813         stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$2 : -halfPi$2);
7814         stream.point(sign0, phi0);
7815         stream.lineEnd();
7816         stream.lineStart();
7817         stream.point(sign1, phi0);
7818         stream.point(lambda1, phi0);
7819         clean = 0;
7820       } else if (sign0 !== sign1 && delta >= pi$3) { // line crosses antimeridian
7821         if (abs(lambda0 - sign0) < epsilon$2) lambda0 -= sign0 * epsilon$2; // handle degeneracies
7822         if (abs(lambda1 - sign1) < epsilon$2) lambda1 -= sign1 * epsilon$2;
7823         phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);
7824         stream.point(sign0, phi0);
7825         stream.lineEnd();
7826         stream.lineStart();
7827         stream.point(sign1, phi0);
7828         clean = 0;
7829       }
7830       stream.point(lambda0 = lambda1, phi0 = phi1);
7831       sign0 = sign1;
7832     },
7833     lineEnd: function() {
7834       stream.lineEnd();
7835       lambda0 = phi0 = NaN;
7836     },
7837     clean: function() {
7838       return 2 - clean; // if intersections, rejoin first and last segments
7839     }
7840   };
7841 }
7842
7843 function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {
7844   var cosPhi0,
7845       cosPhi1,
7846       sinLambda0Lambda1 = sin$1(lambda0 - lambda1);
7847   return abs(sinLambda0Lambda1) > epsilon$2
7848       ? atan((sin$1(phi0) * (cosPhi1 = cos$1(phi1)) * sin$1(lambda1)
7849           - sin$1(phi1) * (cosPhi0 = cos$1(phi0)) * sin$1(lambda0))
7850           / (cosPhi0 * cosPhi1 * sinLambda0Lambda1))
7851       : (phi0 + phi1) / 2;
7852 }
7853
7854 function clipAntimeridianInterpolate(from, to, direction, stream) {
7855   var phi;
7856   if (from == null) {
7857     phi = direction * halfPi$2;
7858     stream.point(-pi$3, phi);
7859     stream.point(0, phi);
7860     stream.point(pi$3, phi);
7861     stream.point(pi$3, 0);
7862     stream.point(pi$3, -phi);
7863     stream.point(0, -phi);
7864     stream.point(-pi$3, -phi);
7865     stream.point(-pi$3, 0);
7866     stream.point(-pi$3, phi);
7867   } else if (abs(from[0] - to[0]) > epsilon$2) {
7868     var lambda = from[0] < to[0] ? pi$3 : -pi$3;
7869     phi = direction * lambda / 2;
7870     stream.point(-lambda, phi);
7871     stream.point(0, phi);
7872     stream.point(lambda, phi);
7873   } else {
7874     stream.point(to[0], to[1]);
7875   }
7876 }
7877
7878 function clipCircle(radius) {
7879   var cr = cos$1(radius),
7880       delta = 6 * radians,
7881       smallRadius = cr > 0,
7882       notHemisphere = abs(cr) > epsilon$2; // TODO optimise for this common case
7883
7884   function interpolate(from, to, direction, stream) {
7885     circleStream(stream, radius, delta, direction, from, to);
7886   }
7887
7888   function visible(lambda, phi) {
7889     return cos$1(lambda) * cos$1(phi) > cr;
7890   }
7891
7892   // Takes a line and cuts into visible segments. Return values used for polygon
7893   // clipping: 0 - there were intersections or the line was empty; 1 - no
7894   // intersections 2 - there were intersections, and the first and last segments
7895   // should be rejoined.
7896   function clipLine(stream) {
7897     var point0, // previous point
7898         c0, // code for previous point
7899         v0, // visibility of previous point
7900         v00, // visibility of first point
7901         clean; // no intersections
7902     return {
7903       lineStart: function() {
7904         v00 = v0 = false;
7905         clean = 1;
7906       },
7907       point: function(lambda, phi) {
7908         var point1 = [lambda, phi],
7909             point2,
7910             v = visible(lambda, phi),
7911             c = smallRadius
7912               ? v ? 0 : code(lambda, phi)
7913               : v ? code(lambda + (lambda < 0 ? pi$3 : -pi$3), phi) : 0;
7914         if (!point0 && (v00 = v0 = v)) stream.lineStart();
7915         // Handle degeneracies.
7916         // TODO ignore if not clipping polygons.
7917         if (v !== v0) {
7918           point2 = intersect(point0, point1);
7919           if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) {
7920             point1[0] += epsilon$2;
7921             point1[1] += epsilon$2;
7922             v = visible(point1[0], point1[1]);
7923           }
7924         }
7925         if (v !== v0) {
7926           clean = 0;
7927           if (v) {
7928             // outside going in
7929             stream.lineStart();
7930             point2 = intersect(point1, point0);
7931             stream.point(point2[0], point2[1]);
7932           } else {
7933             // inside going out
7934             point2 = intersect(point0, point1);
7935             stream.point(point2[0], point2[1]);
7936             stream.lineEnd();
7937           }
7938           point0 = point2;
7939         } else if (notHemisphere && point0 && smallRadius ^ v) {
7940           var t;
7941           // If the codes for two points are different, or are both zero,
7942           // and there this segment intersects with the small circle.
7943           if (!(c & c0) && (t = intersect(point1, point0, true))) {
7944             clean = 0;
7945             if (smallRadius) {
7946               stream.lineStart();
7947               stream.point(t[0][0], t[0][1]);
7948               stream.point(t[1][0], t[1][1]);
7949               stream.lineEnd();
7950             } else {
7951               stream.point(t[1][0], t[1][1]);
7952               stream.lineEnd();
7953               stream.lineStart();
7954               stream.point(t[0][0], t[0][1]);
7955             }
7956           }
7957         }
7958         if (v && (!point0 || !pointEqual(point0, point1))) {
7959           stream.point(point1[0], point1[1]);
7960         }
7961         point0 = point1, v0 = v, c0 = c;
7962       },
7963       lineEnd: function() {
7964         if (v0) stream.lineEnd();
7965         point0 = null;
7966       },
7967       // Rejoin first and last segments if there were intersections and the first
7968       // and last points were visible.
7969       clean: function() {
7970         return clean | ((v00 && v0) << 1);
7971       }
7972     };
7973   }
7974
7975   // Intersects the great circle between a and b with the clip circle.
7976   function intersect(a, b, two) {
7977     var pa = cartesian(a),
7978         pb = cartesian(b);
7979
7980     // We have two planes, n1.p = d1 and n2.p = d2.
7981     // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).
7982     var n1 = [1, 0, 0], // normal
7983         n2 = cartesianCross(pa, pb),
7984         n2n2 = cartesianDot(n2, n2),
7985         n1n2 = n2[0], // cartesianDot(n1, n2),
7986         determinant = n2n2 - n1n2 * n1n2;
7987
7988     // Two polar points.
7989     if (!determinant) return !two && a;
7990
7991     var c1 =  cr * n2n2 / determinant,
7992         c2 = -cr * n1n2 / determinant,
7993         n1xn2 = cartesianCross(n1, n2),
7994         A = cartesianScale(n1, c1),
7995         B = cartesianScale(n2, c2);
7996     cartesianAddInPlace(A, B);
7997
7998     // Solve |p(t)|^2 = 1.
7999     var u = n1xn2,
8000         w = cartesianDot(A, u),
8001         uu = cartesianDot(u, u),
8002         t2 = w * w - uu * (cartesianDot(A, A) - 1);
8003
8004     if (t2 < 0) return;
8005
8006     var t = sqrt(t2),
8007         q = cartesianScale(u, (-w - t) / uu);
8008     cartesianAddInPlace(q, A);
8009     q = spherical(q);
8010
8011     if (!two) return q;
8012
8013     // Two intersection points.
8014     var lambda0 = a[0],
8015         lambda1 = b[0],
8016         phi0 = a[1],
8017         phi1 = b[1],
8018         z;
8019
8020     if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;
8021
8022     var delta = lambda1 - lambda0,
8023         polar = abs(delta - pi$3) < epsilon$2,
8024         meridian = polar || delta < epsilon$2;
8025
8026     if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;
8027
8028     // Check that the first point is between a and b.
8029     if (meridian
8030         ? polar
8031           ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon$2 ? phi0 : phi1)
8032           : phi0 <= q[1] && q[1] <= phi1
8033         : delta > pi$3 ^ (lambda0 <= q[0] && q[0] <= lambda1)) {
8034       var q1 = cartesianScale(u, (-w + t) / uu);
8035       cartesianAddInPlace(q1, A);
8036       return [q, spherical(q1)];
8037     }
8038   }
8039
8040   // Generates a 4-bit vector representing the location of a point relative to
8041   // the small circle's bounding box.
8042   function code(lambda, phi) {
8043     var r = smallRadius ? radius : pi$3 - radius,
8044         code = 0;
8045     if (lambda < -r) code |= 1; // left
8046     else if (lambda > r) code |= 2; // right
8047     if (phi < -r) code |= 4; // below
8048     else if (phi > r) code |= 8; // above
8049     return code;
8050   }
8051
8052   return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$3, radius - pi$3]);
8053 }
8054
8055 function clipLine(a, b, x0, y0, x1, y1) {
8056   var ax = a[0],
8057       ay = a[1],
8058       bx = b[0],
8059       by = b[1],
8060       t0 = 0,
8061       t1 = 1,
8062       dx = bx - ax,
8063       dy = by - ay,
8064       r;
8065
8066   r = x0 - ax;
8067   if (!dx && r > 0) return;
8068   r /= dx;
8069   if (dx < 0) {
8070     if (r < t0) return;
8071     if (r < t1) t1 = r;
8072   } else if (dx > 0) {
8073     if (r > t1) return;
8074     if (r > t0) t0 = r;
8075   }
8076
8077   r = x1 - ax;
8078   if (!dx && r < 0) return;
8079   r /= dx;
8080   if (dx < 0) {
8081     if (r > t1) return;
8082     if (r > t0) t0 = r;
8083   } else if (dx > 0) {
8084     if (r < t0) return;
8085     if (r < t1) t1 = r;
8086   }
8087
8088   r = y0 - ay;
8089   if (!dy && r > 0) return;
8090   r /= dy;
8091   if (dy < 0) {
8092     if (r < t0) return;
8093     if (r < t1) t1 = r;
8094   } else if (dy > 0) {
8095     if (r > t1) return;
8096     if (r > t0) t0 = r;
8097   }
8098
8099   r = y1 - ay;
8100   if (!dy && r < 0) return;
8101   r /= dy;
8102   if (dy < 0) {
8103     if (r > t1) return;
8104     if (r > t0) t0 = r;
8105   } else if (dy > 0) {
8106     if (r < t0) return;
8107     if (r < t1) t1 = r;
8108   }
8109
8110   if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;
8111   if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;
8112   return true;
8113 }
8114
8115 var clipMax = 1e9, clipMin = -clipMax;
8116
8117 // TODO Use d3-polygon’s polygonContains here for the ring check?
8118 // TODO Eliminate duplicate buffering in clipBuffer and polygon.push?
8119
8120 function clipRectangle(x0, y0, x1, y1) {
8121
8122   function visible(x, y) {
8123     return x0 <= x && x <= x1 && y0 <= y && y <= y1;
8124   }
8125
8126   function interpolate(from, to, direction, stream) {
8127     var a = 0, a1 = 0;
8128     if (from == null
8129         || (a = corner(from, direction)) !== (a1 = corner(to, direction))
8130         || comparePoint(from, to) < 0 ^ direction > 0) {
8131       do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
8132       while ((a = (a + direction + 4) % 4) !== a1);
8133     } else {
8134       stream.point(to[0], to[1]);
8135     }
8136   }
8137
8138   function corner(p, direction) {
8139     return abs(p[0] - x0) < epsilon$2 ? direction > 0 ? 0 : 3
8140         : abs(p[0] - x1) < epsilon$2 ? direction > 0 ? 2 : 1
8141         : abs(p[1] - y0) < epsilon$2 ? direction > 0 ? 1 : 0
8142         : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon
8143   }
8144
8145   function compareIntersection(a, b) {
8146     return comparePoint(a.x, b.x);
8147   }
8148
8149   function comparePoint(a, b) {
8150     var ca = corner(a, 1),
8151         cb = corner(b, 1);
8152     return ca !== cb ? ca - cb
8153         : ca === 0 ? b[1] - a[1]
8154         : ca === 1 ? a[0] - b[0]
8155         : ca === 2 ? a[1] - b[1]
8156         : b[0] - a[0];
8157   }
8158
8159   return function(stream) {
8160     var activeStream = stream,
8161         bufferStream = clipBuffer(),
8162         segments,
8163         polygon,
8164         ring,
8165         x__, y__, v__, // first point
8166         x_, y_, v_, // previous point
8167         first,
8168         clean;
8169
8170     var clipStream = {
8171       point: point,
8172       lineStart: lineStart,
8173       lineEnd: lineEnd,
8174       polygonStart: polygonStart,
8175       polygonEnd: polygonEnd
8176     };
8177
8178     function point(x, y) {
8179       if (visible(x, y)) activeStream.point(x, y);
8180     }
8181
8182     function polygonInside() {
8183       var winding = 0;
8184
8185       for (var i = 0, n = polygon.length; i < n; ++i) {
8186         for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {
8187           a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];
8188           if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; }
8189           else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; }
8190         }
8191       }
8192
8193       return winding;
8194     }
8195
8196     // Buffer geometry within a polygon and then clip it en masse.
8197     function polygonStart() {
8198       activeStream = bufferStream, segments = [], polygon = [], clean = true;
8199     }
8200
8201     function polygonEnd() {
8202       var startInside = polygonInside(),
8203           cleanInside = clean && startInside,
8204           visible = (segments = merge(segments)).length;
8205       if (cleanInside || visible) {
8206         stream.polygonStart();
8207         if (cleanInside) {
8208           stream.lineStart();
8209           interpolate(null, null, 1, stream);
8210           stream.lineEnd();
8211         }
8212         if (visible) {
8213           clipRejoin(segments, compareIntersection, startInside, interpolate, stream);
8214         }
8215         stream.polygonEnd();
8216       }
8217       activeStream = stream, segments = polygon = ring = null;
8218     }
8219
8220     function lineStart() {
8221       clipStream.point = linePoint;
8222       if (polygon) polygon.push(ring = []);
8223       first = true;
8224       v_ = false;
8225       x_ = y_ = NaN;
8226     }
8227
8228     // TODO rather than special-case polygons, simply handle them separately.
8229     // Ideally, coincident intersection points should be jittered to avoid
8230     // clipping issues.
8231     function lineEnd() {
8232       if (segments) {
8233         linePoint(x__, y__);
8234         if (v__ && v_) bufferStream.rejoin();
8235         segments.push(bufferStream.result());
8236       }
8237       clipStream.point = point;
8238       if (v_) activeStream.lineEnd();
8239     }
8240
8241     function linePoint(x, y) {
8242       var v = visible(x, y);
8243       if (polygon) ring.push([x, y]);
8244       if (first) {
8245         x__ = x, y__ = y, v__ = v;
8246         first = false;
8247         if (v) {
8248           activeStream.lineStart();
8249           activeStream.point(x, y);
8250         }
8251       } else {
8252         if (v && v_) activeStream.point(x, y);
8253         else {
8254           var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],
8255               b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];
8256           if (clipLine(a, b, x0, y0, x1, y1)) {
8257             if (!v_) {
8258               activeStream.lineStart();
8259               activeStream.point(a[0], a[1]);
8260             }
8261             activeStream.point(b[0], b[1]);
8262             if (!v) activeStream.lineEnd();
8263             clean = false;
8264           } else if (v) {
8265             activeStream.lineStart();
8266             activeStream.point(x, y);
8267             clean = false;
8268           }
8269         }
8270       }
8271       x_ = x, y_ = y, v_ = v;
8272     }
8273
8274     return clipStream;
8275   };
8276 }
8277
8278 function extent$1() {
8279   var x0 = 0,
8280       y0 = 0,
8281       x1 = 960,
8282       y1 = 500,
8283       cache,
8284       cacheStream,
8285       clip;
8286
8287   return clip = {
8288     stream: function(stream) {
8289       return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream);
8290     },
8291     extent: function(_) {
8292       return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]];
8293     }
8294   };
8295 }
8296
8297 var lengthSum = adder(),
8298     lambda0$2,
8299     sinPhi0$1,
8300     cosPhi0$1;
8301
8302 var lengthStream = {
8303   sphere: noop$1,
8304   point: noop$1,
8305   lineStart: lengthLineStart,
8306   lineEnd: noop$1,
8307   polygonStart: noop$1,
8308   polygonEnd: noop$1
8309 };
8310
8311 function lengthLineStart() {
8312   lengthStream.point = lengthPointFirst;
8313   lengthStream.lineEnd = lengthLineEnd;
8314 }
8315
8316 function lengthLineEnd() {
8317   lengthStream.point = lengthStream.lineEnd = noop$1;
8318 }
8319
8320 function lengthPointFirst(lambda, phi) {
8321   lambda *= radians, phi *= radians;
8322   lambda0$2 = lambda, sinPhi0$1 = sin$1(phi), cosPhi0$1 = cos$1(phi);
8323   lengthStream.point = lengthPoint;
8324 }
8325
8326 function lengthPoint(lambda, phi) {
8327   lambda *= radians, phi *= radians;
8328   var sinPhi = sin$1(phi),
8329       cosPhi = cos$1(phi),
8330       delta = abs(lambda - lambda0$2),
8331       cosDelta = cos$1(delta),
8332       sinDelta = sin$1(delta),
8333       x = cosPhi * sinDelta,
8334       y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta,
8335       z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta;
8336   lengthSum.add(atan2(sqrt(x * x + y * y), z));
8337   lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi;
8338 }
8339
8340 function d3_geoLength(object) {
8341   lengthSum.reset();
8342   d3_geoStream(object, lengthStream);
8343   return +lengthSum;
8344 }
8345
8346 var coordinates = [null, null],
8347     object$1 = {type: "LineString", coordinates: coordinates};
8348
8349 function distance(a, b) {
8350   coordinates[0] = a;
8351   coordinates[1] = b;
8352   return d3_geoLength(object$1);
8353 }
8354
8355 var containsObjectType = {
8356   Feature: function(object, point) {
8357     return containsGeometry(object.geometry, point);
8358   },
8359   FeatureCollection: function(object, point) {
8360     var features = object.features, i = -1, n = features.length;
8361     while (++i < n) if (containsGeometry(features[i].geometry, point)) return true;
8362     return false;
8363   }
8364 };
8365
8366 var containsGeometryType = {
8367   Sphere: function() {
8368     return true;
8369   },
8370   Point: function(object, point) {
8371     return containsPoint(object.coordinates, point);
8372   },
8373   MultiPoint: function(object, point) {
8374     var coordinates = object.coordinates, i = -1, n = coordinates.length;
8375     while (++i < n) if (containsPoint(coordinates[i], point)) return true;
8376     return false;
8377   },
8378   LineString: function(object, point) {
8379     return containsLine(object.coordinates, point);
8380   },
8381   MultiLineString: function(object, point) {
8382     var coordinates = object.coordinates, i = -1, n = coordinates.length;
8383     while (++i < n) if (containsLine(coordinates[i], point)) return true;
8384     return false;
8385   },
8386   Polygon: function(object, point) {
8387     return containsPolygon(object.coordinates, point);
8388   },
8389   MultiPolygon: function(object, point) {
8390     var coordinates = object.coordinates, i = -1, n = coordinates.length;
8391     while (++i < n) if (containsPolygon(coordinates[i], point)) return true;
8392     return false;
8393   },
8394   GeometryCollection: function(object, point) {
8395     var geometries = object.geometries, i = -1, n = geometries.length;
8396     while (++i < n) if (containsGeometry(geometries[i], point)) return true;
8397     return false;
8398   }
8399 };
8400
8401 function containsGeometry(geometry, point) {
8402   return geometry && containsGeometryType.hasOwnProperty(geometry.type)
8403       ? containsGeometryType[geometry.type](geometry, point)
8404       : false;
8405 }
8406
8407 function containsPoint(coordinates, point) {
8408   return distance(coordinates, point) === 0;
8409 }
8410
8411 function containsLine(coordinates, point) {
8412   var ab = distance(coordinates[0], coordinates[1]),
8413       ao = distance(coordinates[0], point),
8414       ob = distance(point, coordinates[1]);
8415   return ao + ob <= ab + epsilon$2;
8416 }
8417
8418 function containsPolygon(coordinates, point) {
8419   return !!polygonContains(coordinates.map(ringRadians), pointRadians(point));
8420 }
8421
8422 function ringRadians(ring) {
8423   return ring = ring.map(pointRadians), ring.pop(), ring;
8424 }
8425
8426 function pointRadians(point) {
8427   return [point[0] * radians, point[1] * radians];
8428 }
8429
8430 function contains(object, point) {
8431   return (object && containsObjectType.hasOwnProperty(object.type)
8432       ? containsObjectType[object.type]
8433       : containsGeometry)(object, point);
8434 }
8435
8436 function graticuleX(y0, y1, dy) {
8437   var y = d3_range(y0, y1 - epsilon$2, dy).concat(y1);
8438   return function(x) { return y.map(function(y) { return [x, y]; }); };
8439 }
8440
8441 function graticuleY(x0, x1, dx) {
8442   var x = d3_range(x0, x1 - epsilon$2, dx).concat(x1);
8443   return function(y) { return x.map(function(x) { return [x, y]; }); };
8444 }
8445
8446 function graticule() {
8447   var x1, x0, X1, X0,
8448       y1, y0, Y1, Y0,
8449       dx = 10, dy = dx, DX = 90, DY = 360,
8450       x, y, X, Y,
8451       precision = 2.5;
8452
8453   function graticule() {
8454     return {type: "MultiLineString", coordinates: lines()};
8455   }
8456
8457   function lines() {
8458     return d3_range(ceil(X0 / DX) * DX, X1, DX).map(X)
8459         .concat(d3_range(ceil(Y0 / DY) * DY, Y1, DY).map(Y))
8460         .concat(d3_range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon$2; }).map(x))
8461         .concat(d3_range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > epsilon$2; }).map(y));
8462   }
8463
8464   graticule.lines = function() {
8465     return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; });
8466   };
8467
8468   graticule.outline = function() {
8469     return {
8470       type: "Polygon",
8471       coordinates: [
8472         X(X0).concat(
8473         Y(Y1).slice(1),
8474         X(X1).reverse().slice(1),
8475         Y(Y0).reverse().slice(1))
8476       ]
8477     };
8478   };
8479
8480   graticule.extent = function(_) {
8481     if (!arguments.length) return graticule.extentMinor();
8482     return graticule.extentMajor(_).extentMinor(_);
8483   };
8484
8485   graticule.extentMajor = function(_) {
8486     if (!arguments.length) return [[X0, Y0], [X1, Y1]];
8487     X0 = +_[0][0], X1 = +_[1][0];
8488     Y0 = +_[0][1], Y1 = +_[1][1];
8489     if (X0 > X1) _ = X0, X0 = X1, X1 = _;
8490     if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;
8491     return graticule.precision(precision);
8492   };
8493
8494   graticule.extentMinor = function(_) {
8495     if (!arguments.length) return [[x0, y0], [x1, y1]];
8496     x0 = +_[0][0], x1 = +_[1][0];
8497     y0 = +_[0][1], y1 = +_[1][1];
8498     if (x0 > x1) _ = x0, x0 = x1, x1 = _;
8499     if (y0 > y1) _ = y0, y0 = y1, y1 = _;
8500     return graticule.precision(precision);
8501   };
8502
8503   graticule.step = function(_) {
8504     if (!arguments.length) return graticule.stepMinor();
8505     return graticule.stepMajor(_).stepMinor(_);
8506   };
8507
8508   graticule.stepMajor = function(_) {
8509     if (!arguments.length) return [DX, DY];
8510     DX = +_[0], DY = +_[1];
8511     return graticule;
8512   };
8513
8514   graticule.stepMinor = function(_) {
8515     if (!arguments.length) return [dx, dy];
8516     dx = +_[0], dy = +_[1];
8517     return graticule;
8518   };
8519
8520   graticule.precision = function(_) {
8521     if (!arguments.length) return precision;
8522     precision = +_;
8523     x = graticuleX(y0, y1, 90);
8524     y = graticuleY(x0, x1, precision);
8525     X = graticuleX(Y0, Y1, 90);
8526     Y = graticuleY(X0, X1, precision);
8527     return graticule;
8528   };
8529
8530   return graticule
8531       .extentMajor([[-180, -90 + epsilon$2], [180, 90 - epsilon$2]])
8532       .extentMinor([[-180, -80 - epsilon$2], [180, 80 + epsilon$2]]);
8533 }
8534
8535 function graticule10() {
8536   return graticule()();
8537 }
8538
8539 function interpolate$1(a, b) {
8540   var x0 = a[0] * radians,
8541       y0 = a[1] * radians,
8542       x1 = b[0] * radians,
8543       y1 = b[1] * radians,
8544       cy0 = cos$1(y0),
8545       sy0 = sin$1(y0),
8546       cy1 = cos$1(y1),
8547       sy1 = sin$1(y1),
8548       kx0 = cy0 * cos$1(x0),
8549       ky0 = cy0 * sin$1(x0),
8550       kx1 = cy1 * cos$1(x1),
8551       ky1 = cy1 * sin$1(x1),
8552       d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))),
8553       k = sin$1(d);
8554
8555   var interpolate = d ? function(t) {
8556     var B = sin$1(t *= d) / k,
8557         A = sin$1(d - t) / k,
8558         x = A * kx0 + B * kx1,
8559         y = A * ky0 + B * ky1,
8560         z = A * sy0 + B * sy1;
8561     return [
8562       atan2(y, x) * degrees$1,
8563       atan2(z, sqrt(x * x + y * y)) * degrees$1
8564     ];
8565   } : function() {
8566     return [x0 * degrees$1, y0 * degrees$1];
8567   };
8568
8569   interpolate.distance = d;
8570
8571   return interpolate;
8572 }
8573
8574 function identity$4(x) {
8575   return x;
8576 }
8577
8578 var areaSum$1 = adder(),
8579     areaRingSum$1 = adder(),
8580     x00,
8581     y00,
8582     x0$1,
8583     y0$1;
8584
8585 var areaStream$1 = {
8586   point: noop$1,
8587   lineStart: noop$1,
8588   lineEnd: noop$1,
8589   polygonStart: function() {
8590     areaStream$1.lineStart = areaRingStart$1;
8591     areaStream$1.lineEnd = areaRingEnd$1;
8592   },
8593   polygonEnd: function() {
8594     areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop$1;
8595     areaSum$1.add(abs(areaRingSum$1));
8596     areaRingSum$1.reset();
8597   },
8598   result: function() {
8599     var area = areaSum$1 / 2;
8600     areaSum$1.reset();
8601     return area;
8602   }
8603 };
8604
8605 function areaRingStart$1() {
8606   areaStream$1.point = areaPointFirst$1;
8607 }
8608
8609 function areaPointFirst$1(x, y) {
8610   areaStream$1.point = areaPoint$1;
8611   x00 = x0$1 = x, y00 = y0$1 = y;
8612 }
8613
8614 function areaPoint$1(x, y) {
8615   areaRingSum$1.add(y0$1 * x - x0$1 * y);
8616   x0$1 = x, y0$1 = y;
8617 }
8618
8619 function areaRingEnd$1() {
8620   areaPoint$1(x00, y00);
8621 }
8622
8623 var x0$2 = Infinity,
8624     y0$2 = x0$2,
8625     x1 = -x0$2,
8626     y1 = x1;
8627
8628 var boundsStream$1 = {
8629   point: boundsPoint$1,
8630   lineStart: noop$1,
8631   lineEnd: noop$1,
8632   polygonStart: noop$1,
8633   polygonEnd: noop$1,
8634   result: function() {
8635     var bounds = [[x0$2, y0$2], [x1, y1]];
8636     x1 = y1 = -(y0$2 = x0$2 = Infinity);
8637     return bounds;
8638   }
8639 };
8640
8641 function boundsPoint$1(x, y) {
8642   if (x < x0$2) x0$2 = x;
8643   if (x > x1) x1 = x;
8644   if (y < y0$2) y0$2 = y;
8645   if (y > y1) y1 = y;
8646 }
8647
8648 // TODO Enforce positive area for exterior, negative area for interior?
8649
8650 var X0$1 = 0,
8651     Y0$1 = 0,
8652     Z0$1 = 0,
8653     X1$1 = 0,
8654     Y1$1 = 0,
8655     Z1$1 = 0,
8656     X2$1 = 0,
8657     Y2$1 = 0,
8658     Z2$1 = 0,
8659     x00$1,
8660     y00$1,
8661     x0$3,
8662     y0$3;
8663
8664 var centroidStream$1 = {
8665   point: centroidPoint$1,
8666   lineStart: centroidLineStart$1,
8667   lineEnd: centroidLineEnd$1,
8668   polygonStart: function() {
8669     centroidStream$1.lineStart = centroidRingStart$1;
8670     centroidStream$1.lineEnd = centroidRingEnd$1;
8671   },
8672   polygonEnd: function() {
8673     centroidStream$1.point = centroidPoint$1;
8674     centroidStream$1.lineStart = centroidLineStart$1;
8675     centroidStream$1.lineEnd = centroidLineEnd$1;
8676   },
8677   result: function() {
8678     var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1]
8679         : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1]
8680         : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1]
8681         : [NaN, NaN];
8682     X0$1 = Y0$1 = Z0$1 =
8683     X1$1 = Y1$1 = Z1$1 =
8684     X2$1 = Y2$1 = Z2$1 = 0;
8685     return centroid;
8686   }
8687 };
8688
8689 function centroidPoint$1(x, y) {
8690   X0$1 += x;
8691   Y0$1 += y;
8692   ++Z0$1;
8693 }
8694
8695 function centroidLineStart$1() {
8696   centroidStream$1.point = centroidPointFirstLine;
8697 }
8698
8699 function centroidPointFirstLine(x, y) {
8700   centroidStream$1.point = centroidPointLine;
8701   centroidPoint$1(x0$3 = x, y0$3 = y);
8702 }
8703
8704 function centroidPointLine(x, y) {
8705   var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy);
8706   X1$1 += z * (x0$3 + x) / 2;
8707   Y1$1 += z * (y0$3 + y) / 2;
8708   Z1$1 += z;
8709   centroidPoint$1(x0$3 = x, y0$3 = y);
8710 }
8711
8712 function centroidLineEnd$1() {
8713   centroidStream$1.point = centroidPoint$1;
8714 }
8715
8716 function centroidRingStart$1() {
8717   centroidStream$1.point = centroidPointFirstRing;
8718 }
8719
8720 function centroidRingEnd$1() {
8721   centroidPointRing(x00$1, y00$1);
8722 }
8723
8724 function centroidPointFirstRing(x, y) {
8725   centroidStream$1.point = centroidPointRing;
8726   centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y);
8727 }
8728
8729 function centroidPointRing(x, y) {
8730   var dx = x - x0$3,
8731       dy = y - y0$3,
8732       z = sqrt(dx * dx + dy * dy);
8733
8734   X1$1 += z * (x0$3 + x) / 2;
8735   Y1$1 += z * (y0$3 + y) / 2;
8736   Z1$1 += z;
8737
8738   z = y0$3 * x - x0$3 * y;
8739   X2$1 += z * (x0$3 + x);
8740   Y2$1 += z * (y0$3 + y);
8741   Z2$1 += z * 3;
8742   centroidPoint$1(x0$3 = x, y0$3 = y);
8743 }
8744
8745 function PathContext(context) {
8746   this._context = context;
8747 }
8748
8749 PathContext.prototype = {
8750   _radius: 4.5,
8751   pointRadius: function(_) {
8752     return this._radius = _, this;
8753   },
8754   polygonStart: function() {
8755     this._line = 0;
8756   },
8757   polygonEnd: function() {
8758     this._line = NaN;
8759   },
8760   lineStart: function() {
8761     this._point = 0;
8762   },
8763   lineEnd: function() {
8764     if (this._line === 0) this._context.closePath();
8765     this._point = NaN;
8766   },
8767   point: function(x, y) {
8768     switch (this._point) {
8769       case 0: {
8770         this._context.moveTo(x, y);
8771         this._point = 1;
8772         break;
8773       }
8774       case 1: {
8775         this._context.lineTo(x, y);
8776         break;
8777       }
8778       default: {
8779         this._context.moveTo(x + this._radius, y);
8780         this._context.arc(x, y, this._radius, 0, tau$3);
8781         break;
8782       }
8783     }
8784   },
8785   result: noop$1
8786 };
8787
8788 var lengthSum$1 = adder(),
8789     lengthRing,
8790     x00$2,
8791     y00$2,
8792     x0$4,
8793     y0$4;
8794
8795 var lengthStream$1 = {
8796   point: noop$1,
8797   lineStart: function() {
8798     lengthStream$1.point = lengthPointFirst$1;
8799   },
8800   lineEnd: function() {
8801     if (lengthRing) lengthPoint$1(x00$2, y00$2);
8802     lengthStream$1.point = noop$1;
8803   },
8804   polygonStart: function() {
8805     lengthRing = true;
8806   },
8807   polygonEnd: function() {
8808     lengthRing = null;
8809   },
8810   result: function() {
8811     var length = +lengthSum$1;
8812     lengthSum$1.reset();
8813     return length;
8814   }
8815 };
8816
8817 function lengthPointFirst$1(x, y) {
8818   lengthStream$1.point = lengthPoint$1;
8819   x00$2 = x0$4 = x, y00$2 = y0$4 = y;
8820 }
8821
8822 function lengthPoint$1(x, y) {
8823   x0$4 -= x, y0$4 -= y;
8824   lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4));
8825   x0$4 = x, y0$4 = y;
8826 }
8827
8828 function PathString() {
8829   this._string = [];
8830 }
8831
8832 PathString.prototype = {
8833   _radius: 4.5,
8834   _circle: circle$1(4.5),
8835   pointRadius: function(_) {
8836     if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;
8837     return this;
8838   },
8839   polygonStart: function() {
8840     this._line = 0;
8841   },
8842   polygonEnd: function() {
8843     this._line = NaN;
8844   },
8845   lineStart: function() {
8846     this._point = 0;
8847   },
8848   lineEnd: function() {
8849     if (this._line === 0) this._string.push("Z");
8850     this._point = NaN;
8851   },
8852   point: function(x, y) {
8853     switch (this._point) {
8854       case 0: {
8855         this._string.push("M", x, ",", y);
8856         this._point = 1;
8857         break;
8858       }
8859       case 1: {
8860         this._string.push("L", x, ",", y);
8861         break;
8862       }
8863       default: {
8864         if (this._circle == null) this._circle = circle$1(this._radius);
8865         this._string.push("M", x, ",", y, this._circle);
8866         break;
8867       }
8868     }
8869   },
8870   result: function() {
8871     if (this._string.length) {
8872       var result = this._string.join("");
8873       this._string = [];
8874       return result;
8875     } else {
8876       return null;
8877     }
8878   }
8879 };
8880
8881 function circle$1(radius) {
8882   return "m0," + radius
8883       + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius
8884       + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius
8885       + "z";
8886 }
8887
8888 function d3_geoPath(projection, context) {
8889   var pointRadius = 4.5,
8890       projectionStream,
8891       contextStream;
8892
8893   function path(object) {
8894     if (object) {
8895       if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
8896       d3_geoStream(object, projectionStream(contextStream));
8897     }
8898     return contextStream.result();
8899   }
8900
8901   path.area = function(object) {
8902     d3_geoStream(object, projectionStream(areaStream$1));
8903     return areaStream$1.result();
8904   };
8905
8906   path.measure = function(object) {
8907     d3_geoStream(object, projectionStream(lengthStream$1));
8908     return lengthStream$1.result();
8909   };
8910
8911   path.bounds = function(object) {
8912     d3_geoStream(object, projectionStream(boundsStream$1));
8913     return boundsStream$1.result();
8914   };
8915
8916   path.centroid = function(object) {
8917     d3_geoStream(object, projectionStream(centroidStream$1));
8918     return centroidStream$1.result();
8919   };
8920
8921   path.projection = function(_) {
8922     return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection;
8923   };
8924
8925   path.context = function(_) {
8926     if (!arguments.length) return context;
8927     contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _);
8928     if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
8929     return path;
8930   };
8931
8932   path.pointRadius = function(_) {
8933     if (!arguments.length) return pointRadius;
8934     pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
8935     return path;
8936   };
8937
8938   return path.projection(projection).context(context);
8939 }
8940
8941 function d3_geoTransform(methods) {
8942   return {
8943     stream: transformer(methods)
8944   };
8945 }
8946
8947 function transformer(methods) {
8948   return function(stream) {
8949     var s = new TransformStream;
8950     for (var key in methods) s[key] = methods[key];
8951     s.stream = stream;
8952     return s;
8953   };
8954 }
8955
8956 function TransformStream() {}
8957
8958 TransformStream.prototype = {
8959   constructor: TransformStream,
8960   point: function(x, y) { this.stream.point(x, y); },
8961   sphere: function() { this.stream.sphere(); },
8962   lineStart: function() { this.stream.lineStart(); },
8963   lineEnd: function() { this.stream.lineEnd(); },
8964   polygonStart: function() { this.stream.polygonStart(); },
8965   polygonEnd: function() { this.stream.polygonEnd(); }
8966 };
8967
8968 function fit(projection, fitBounds, object) {
8969   var clip = projection.clipExtent && projection.clipExtent();
8970   projection.scale(150).translate([0, 0]);
8971   if (clip != null) projection.clipExtent(null);
8972   d3_geoStream(object, projection.stream(boundsStream$1));
8973   fitBounds(boundsStream$1.result());
8974   if (clip != null) projection.clipExtent(clip);
8975   return projection;
8976 }
8977
8978 function fitExtent(projection, extent, object) {
8979   return fit(projection, function(b) {
8980     var w = extent[1][0] - extent[0][0],
8981         h = extent[1][1] - extent[0][1],
8982         k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),
8983         x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,
8984         y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;
8985     projection.scale(150 * k).translate([x, y]);
8986   }, object);
8987 }
8988
8989 function fitSize(projection, size, object) {
8990   return fitExtent(projection, [[0, 0], size], object);
8991 }
8992
8993 function fitWidth(projection, width, object) {
8994   return fit(projection, function(b) {
8995     var w = +width,
8996         k = w / (b[1][0] - b[0][0]),
8997         x = (w - k * (b[1][0] + b[0][0])) / 2,
8998         y = -k * b[0][1];
8999     projection.scale(150 * k).translate([x, y]);
9000   }, object);
9001 }
9002
9003 function fitHeight(projection, height, object) {
9004   return fit(projection, function(b) {
9005     var h = +height,
9006         k = h / (b[1][1] - b[0][1]),
9007         x = -k * b[0][0],
9008         y = (h - k * (b[1][1] + b[0][1])) / 2;
9009     projection.scale(150 * k).translate([x, y]);
9010   }, object);
9011 }
9012
9013 var maxDepth = 16, // maximum depth of subdivision
9014     cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance)
9015
9016 function resample(project, delta2) {
9017   return +delta2 ? resample$1(project, delta2) : resampleNone(project);
9018 }
9019
9020 function resampleNone(project) {
9021   return transformer({
9022     point: function(x, y) {
9023       x = project(x, y);
9024       this.stream.point(x[0], x[1]);
9025     }
9026   });
9027 }
9028
9029 function resample$1(project, delta2) {
9030
9031   function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {
9032     var dx = x1 - x0,
9033         dy = y1 - y0,
9034         d2 = dx * dx + dy * dy;
9035     if (d2 > 4 * delta2 && depth--) {
9036       var a = a0 + a1,
9037           b = b0 + b1,
9038           c = c0 + c1,
9039           m = sqrt(a * a + b * b + c * c),
9040           phi2 = asin(c /= m),
9041           lambda2 = abs(abs(c) - 1) < epsilon$2 || abs(lambda0 - lambda1) < epsilon$2 ? (lambda0 + lambda1) / 2 : atan2(b, a),
9042           p = project(lambda2, phi2),
9043           x2 = p[0],
9044           y2 = p[1],
9045           dx2 = x2 - x0,
9046           dy2 = y2 - y0,
9047           dz = dy * dx2 - dx * dy2;
9048       if (dz * dz / d2 > delta2 // perpendicular projected distance
9049           || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end
9050           || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance
9051         resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);
9052         stream.point(x2, y2);
9053         resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);
9054       }
9055     }
9056   }
9057   return function(stream) {
9058     var lambda00, x00, y00, a00, b00, c00, // first point
9059         lambda0, x0, y0, a0, b0, c0; // previous point
9060
9061     var resampleStream = {
9062       point: point,
9063       lineStart: lineStart,
9064       lineEnd: lineEnd,
9065       polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },
9066       polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }
9067     };
9068
9069     function point(x, y) {
9070       x = project(x, y);
9071       stream.point(x[0], x[1]);
9072     }
9073
9074     function lineStart() {
9075       x0 = NaN;
9076       resampleStream.point = linePoint;
9077       stream.lineStart();
9078     }
9079
9080     function linePoint(lambda, phi) {
9081       var c = cartesian([lambda, phi]), p = project(lambda, phi);
9082       resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);
9083       stream.point(x0, y0);
9084     }
9085
9086     function lineEnd() {
9087       resampleStream.point = point;
9088       stream.lineEnd();
9089     }
9090
9091     function ringStart() {
9092       lineStart();
9093       resampleStream.point = ringPoint;
9094       resampleStream.lineEnd = ringEnd;
9095     }
9096
9097     function ringPoint(lambda, phi) {
9098       linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
9099       resampleStream.point = linePoint;
9100     }
9101
9102     function ringEnd() {
9103       resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);
9104       resampleStream.lineEnd = lineEnd;
9105       lineEnd();
9106     }
9107
9108     return resampleStream;
9109   };
9110 }
9111
9112 var transformRadians = transformer({
9113   point: function(x, y) {
9114     this.stream.point(x * radians, y * radians);
9115   }
9116 });
9117
9118 function transformRotate(rotate) {
9119   return transformer({
9120     point: function(x, y) {
9121       var r = rotate(x, y);
9122       return this.stream.point(r[0], r[1]);
9123     }
9124   });
9125 }
9126
9127 function projection(project) {
9128   return projectionMutator(function() { return project; })();
9129 }
9130
9131 function projectionMutator(projectAt) {
9132   var project,
9133       k = 150, // scale
9134       x = 480, y = 250, // translate
9135       dx, dy, lambda = 0, phi = 0, // center
9136       deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, projectRotate, // rotate
9137       theta = null, preclip = clipAntimeridian, // clip angle
9138       x0 = null, y0, x1, y1, postclip = identity$4, // clip extent
9139       delta2 = 0.5, projectResample = resample(projectTransform, delta2), // precision
9140       cache,
9141       cacheStream;
9142
9143   function projection(point) {
9144     point = projectRotate(point[0] * radians, point[1] * radians);
9145     return [point[0] * k + dx, dy - point[1] * k];
9146   }
9147
9148   function invert(point) {
9149     point = projectRotate.invert((point[0] - dx) / k, (dy - point[1]) / k);
9150     return point && [point[0] * degrees$1, point[1] * degrees$1];
9151   }
9152
9153   function projectTransform(x, y) {
9154     return x = project(x, y), [x[0] * k + dx, dy - x[1] * k];
9155   }
9156
9157   projection.stream = function(stream) {
9158     return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));
9159   };
9160
9161   projection.preclip = function(_) {
9162     return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;
9163   };
9164
9165   projection.postclip = function(_) {
9166     return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9167   };
9168
9169   projection.clipAngle = function(_) {
9170     return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1;
9171   };
9172
9173   projection.clipExtent = function(_) {
9174     return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];
9175   };
9176
9177   projection.scale = function(_) {
9178     return arguments.length ? (k = +_, recenter()) : k;
9179   };
9180
9181   projection.translate = function(_) {
9182     return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];
9183   };
9184
9185   projection.center = function(_) {
9186     return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1];
9187   };
9188
9189   projection.rotate = function(_) {
9190     return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees$1, deltaPhi * degrees$1, deltaGamma * degrees$1];
9191   };
9192
9193   projection.precision = function(_) {
9194     return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);
9195   };
9196
9197   projection.fitExtent = function(extent, object) {
9198     return fitExtent(projection, extent, object);
9199   };
9200
9201   projection.fitSize = function(size, object) {
9202     return fitSize(projection, size, object);
9203   };
9204
9205   projection.fitWidth = function(width, object) {
9206     return fitWidth(projection, width, object);
9207   };
9208
9209   projection.fitHeight = function(height, object) {
9210     return fitHeight(projection, height, object);
9211   };
9212
9213   function recenter() {
9214     projectRotate = compose(rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma), project);
9215     var center = project(lambda, phi);
9216     dx = x - center[0] * k;
9217     dy = y + center[1] * k;
9218     return reset();
9219   }
9220
9221   function reset() {
9222     cache = cacheStream = null;
9223     return projection;
9224   }
9225
9226   return function() {
9227     project = projectAt.apply(this, arguments);
9228     projection.invert = project.invert && invert;
9229     return recenter();
9230   };
9231 }
9232
9233 function conicProjection(projectAt) {
9234   var phi0 = 0,
9235       phi1 = pi$3 / 3,
9236       m = projectionMutator(projectAt),
9237       p = m(phi0, phi1);
9238
9239   p.parallels = function(_) {
9240     return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees$1, phi1 * degrees$1];
9241   };
9242
9243   return p;
9244 }
9245
9246 function cylindricalEqualAreaRaw(phi0) {
9247   var cosPhi0 = cos$1(phi0);
9248
9249   function forward(lambda, phi) {
9250     return [lambda * cosPhi0, sin$1(phi) / cosPhi0];
9251   }
9252
9253   forward.invert = function(x, y) {
9254     return [x / cosPhi0, asin(y * cosPhi0)];
9255   };
9256
9257   return forward;
9258 }
9259
9260 function conicEqualAreaRaw(y0, y1) {
9261   var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2;
9262
9263   // Are the parallels symmetrical around the Equator?
9264   if (abs(n) < epsilon$2) return cylindricalEqualAreaRaw(y0);
9265
9266   var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n;
9267
9268   function project(x, y) {
9269     var r = sqrt(c - 2 * n * sin$1(y)) / n;
9270     return [r * sin$1(x *= n), r0 - r * cos$1(x)];
9271   }
9272
9273   project.invert = function(x, y) {
9274     var r0y = r0 - y;
9275     return [atan2(x, abs(r0y)) / n * sign(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))];
9276   };
9277
9278   return project;
9279 }
9280
9281 function conicEqualArea() {
9282   return conicProjection(conicEqualAreaRaw)
9283       .scale(155.424)
9284       .center([0, 33.6442]);
9285 }
9286
9287 function albers() {
9288   return conicEqualArea()
9289       .parallels([29.5, 45.5])
9290       .scale(1070)
9291       .translate([480, 250])
9292       .rotate([96, 0])
9293       .center([-0.6, 38.7]);
9294 }
9295
9296 // The projections must have mutually exclusive clip regions on the sphere,
9297 // as this will avoid emitting interleaving lines and polygons.
9298 function multiplex(streams) {
9299   var n = streams.length;
9300   return {
9301     point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); },
9302     sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); },
9303     lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); },
9304     lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); },
9305     polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); },
9306     polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); }
9307   };
9308 }
9309
9310 // A composite projection for the United States, configured by default for
9311 // 960×500. The projection also works quite well at 960×600 if you change the
9312 // scale to 1285 and adjust the translate accordingly. The set of standard
9313 // parallels for each region comes from USGS, which is published here:
9314 // http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
9315 function albersUsa() {
9316   var cache,
9317       cacheStream,
9318       lower48 = albers(), lower48Point,
9319       alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338
9320       hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007
9321       point, pointStream = {point: function(x, y) { point = [x, y]; }};
9322
9323   function albersUsa(coordinates) {
9324     var x = coordinates[0], y = coordinates[1];
9325     return point = null, (lower48Point.point(x, y), point)
9326         || (alaskaPoint.point(x, y), point)
9327         || (hawaiiPoint.point(x, y), point);
9328   }
9329
9330   albersUsa.invert = function(coordinates) {
9331     var k = lower48.scale(),
9332         t = lower48.translate(),
9333         x = (coordinates[0] - t[0]) / k,
9334         y = (coordinates[1] - t[1]) / k;
9335     return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska
9336         : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii
9337         : lower48).invert(coordinates);
9338   };
9339
9340   albersUsa.stream = function(stream) {
9341     return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);
9342   };
9343
9344   albersUsa.precision = function(_) {
9345     if (!arguments.length) return lower48.precision();
9346     lower48.precision(_), alaska.precision(_), hawaii.precision(_);
9347     return reset();
9348   };
9349
9350   albersUsa.scale = function(_) {
9351     if (!arguments.length) return lower48.scale();
9352     lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);
9353     return albersUsa.translate(lower48.translate());
9354   };
9355
9356   albersUsa.translate = function(_) {
9357     if (!arguments.length) return lower48.translate();
9358     var k = lower48.scale(), x = +_[0], y = +_[1];
9359
9360     lower48Point = lower48
9361         .translate(_)
9362         .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])
9363         .stream(pointStream);
9364
9365     alaskaPoint = alaska
9366         .translate([x - 0.307 * k, y + 0.201 * k])
9367         .clipExtent([[x - 0.425 * k + epsilon$2, y + 0.120 * k + epsilon$2], [x - 0.214 * k - epsilon$2, y + 0.234 * k - epsilon$2]])
9368         .stream(pointStream);
9369
9370     hawaiiPoint = hawaii
9371         .translate([x - 0.205 * k, y + 0.212 * k])
9372         .clipExtent([[x - 0.214 * k + epsilon$2, y + 0.166 * k + epsilon$2], [x - 0.115 * k - epsilon$2, y + 0.234 * k - epsilon$2]])
9373         .stream(pointStream);
9374
9375     return reset();
9376   };
9377
9378   albersUsa.fitExtent = function(extent, object) {
9379     return fitExtent(albersUsa, extent, object);
9380   };
9381
9382   albersUsa.fitSize = function(size, object) {
9383     return fitSize(albersUsa, size, object);
9384   };
9385
9386   albersUsa.fitWidth = function(width, object) {
9387     return fitWidth(albersUsa, width, object);
9388   };
9389
9390   albersUsa.fitHeight = function(height, object) {
9391     return fitHeight(albersUsa, height, object);
9392   };
9393
9394   function reset() {
9395     cache = cacheStream = null;
9396     return albersUsa;
9397   }
9398
9399   return albersUsa.scale(1070);
9400 }
9401
9402 function azimuthalRaw(scale) {
9403   return function(x, y) {
9404     var cx = cos$1(x),
9405         cy = cos$1(y),
9406         k = scale(cx * cy);
9407     return [
9408       k * cy * sin$1(x),
9409       k * sin$1(y)
9410     ];
9411   }
9412 }
9413
9414 function azimuthalInvert(angle) {
9415   return function(x, y) {
9416     var z = sqrt(x * x + y * y),
9417         c = angle(z),
9418         sc = sin$1(c),
9419         cc = cos$1(c);
9420     return [
9421       atan2(x * sc, z * cc),
9422       asin(z && y * sc / z)
9423     ];
9424   }
9425 }
9426
9427 var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {
9428   return sqrt(2 / (1 + cxcy));
9429 });
9430
9431 azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {
9432   return 2 * asin(z / 2);
9433 });
9434
9435 function azimuthalEqualArea() {
9436   return projection(azimuthalEqualAreaRaw)
9437       .scale(124.75)
9438       .clipAngle(180 - 1e-3);
9439 }
9440
9441 var azimuthalEquidistantRaw = azimuthalRaw(function(c) {
9442   return (c = acos(c)) && c / sin$1(c);
9443 });
9444
9445 azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {
9446   return z;
9447 });
9448
9449 function azimuthalEquidistant() {
9450   return projection(azimuthalEquidistantRaw)
9451       .scale(79.4188)
9452       .clipAngle(180 - 1e-3);
9453 }
9454
9455 function mercatorRaw(lambda, phi) {
9456   return [lambda, log(tan((halfPi$2 + phi) / 2))];
9457 }
9458
9459 mercatorRaw.invert = function(x, y) {
9460   return [x, 2 * atan(exp(y)) - halfPi$2];
9461 };
9462
9463 function mercator() {
9464   return mercatorProjection(mercatorRaw)
9465       .scale(961 / tau$3);
9466 }
9467
9468 function mercatorProjection(project) {
9469   var m = projection(project),
9470       center = m.center,
9471       scale = m.scale,
9472       translate = m.translate,
9473       clipExtent = m.clipExtent,
9474       x0 = null, y0, x1, y1; // clip extent
9475
9476   m.scale = function(_) {
9477     return arguments.length ? (scale(_), reclip()) : scale();
9478   };
9479
9480   m.translate = function(_) {
9481     return arguments.length ? (translate(_), reclip()) : translate();
9482   };
9483
9484   m.center = function(_) {
9485     return arguments.length ? (center(_), reclip()) : center();
9486   };
9487
9488   m.clipExtent = function(_) {
9489     return arguments.length ? (_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]];
9490   };
9491
9492   function reclip() {
9493     var k = pi$3 * scale(),
9494         t = m(rotation(m.rotate()).invert([0, 0]));
9495     return clipExtent(x0 == null
9496         ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw
9497         ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]
9498         : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);
9499   }
9500
9501   return reclip();
9502 }
9503
9504 function tany(y) {
9505   return tan((halfPi$2 + y) / 2);
9506 }
9507
9508 function conicConformalRaw(y0, y1) {
9509   var cy0 = cos$1(y0),
9510       n = y0 === y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y1) / tany(y0)),
9511       f = cy0 * pow(tany(y0), n) / n;
9512
9513   if (!n) return mercatorRaw;
9514
9515   function project(x, y) {
9516     if (f > 0) { if (y < -halfPi$2 + epsilon$2) y = -halfPi$2 + epsilon$2; }
9517     else { if (y > halfPi$2 - epsilon$2) y = halfPi$2 - epsilon$2; }
9518     var r = f / pow(tany(y), n);
9519     return [r * sin$1(n * x), f - r * cos$1(n * x)];
9520   }
9521
9522   project.invert = function(x, y) {
9523     var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy);
9524     return [atan2(x, abs(fy)) / n * sign(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi$2];
9525   };
9526
9527   return project;
9528 }
9529
9530 function conicConformal() {
9531   return conicProjection(conicConformalRaw)
9532       .scale(109.5)
9533       .parallels([30, 30]);
9534 }
9535
9536 function equirectangularRaw(lambda, phi) {
9537   return [lambda, phi];
9538 }
9539
9540 equirectangularRaw.invert = equirectangularRaw;
9541
9542 function equirectangular() {
9543   return projection(equirectangularRaw)
9544       .scale(152.63);
9545 }
9546
9547 function conicEquidistantRaw(y0, y1) {
9548   var cy0 = cos$1(y0),
9549       n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0),
9550       g = cy0 / n + y0;
9551
9552   if (abs(n) < epsilon$2) return equirectangularRaw;
9553
9554   function project(x, y) {
9555     var gy = g - y, nx = n * x;
9556     return [gy * sin$1(nx), g - gy * cos$1(nx)];
9557   }
9558
9559   project.invert = function(x, y) {
9560     var gy = g - y;
9561     return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)];
9562   };
9563
9564   return project;
9565 }
9566
9567 function conicEquidistant() {
9568   return conicProjection(conicEquidistantRaw)
9569       .scale(131.154)
9570       .center([0, 13.9389]);
9571 }
9572
9573 function gnomonicRaw(x, y) {
9574   var cy = cos$1(y), k = cos$1(x) * cy;
9575   return [cy * sin$1(x) / k, sin$1(y) / k];
9576 }
9577
9578 gnomonicRaw.invert = azimuthalInvert(atan);
9579
9580 function gnomonic() {
9581   return projection(gnomonicRaw)
9582       .scale(144.049)
9583       .clipAngle(60);
9584 }
9585
9586 function scaleTranslate(kx, ky, tx, ty) {
9587   return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity$4 : transformer({
9588     point: function(x, y) {
9589       this.stream.point(x * kx + tx, y * ky + ty);
9590     }
9591   });
9592 }
9593
9594 function d3_geoIdentity() {
9595   var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity$4, // scale, translate and reflect
9596       x0 = null, y0, x1, y1, // clip extent
9597       postclip = identity$4,
9598       cache,
9599       cacheStream,
9600       projection;
9601
9602   function reset() {
9603     cache = cacheStream = null;
9604     return projection;
9605   }
9606
9607   return projection = {
9608     stream: function(stream) {
9609       return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));
9610     },
9611     postclip: function(_) {
9612       return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9613     },
9614     clipExtent: function(_) {
9615       return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];
9616     },
9617     scale: function(_) {
9618       return arguments.length ? (transform = scaleTranslate((k = +_) * sx, k * sy, tx, ty), reset()) : k;
9619     },
9620     translate: function(_) {
9621       return arguments.length ? (transform = scaleTranslate(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];
9622     },
9623     reflectX: function(_) {
9624       return arguments.length ? (transform = scaleTranslate(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;
9625     },
9626     reflectY: function(_) {
9627       return arguments.length ? (transform = scaleTranslate(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;
9628     },
9629     fitExtent: function(extent, object) {
9630       return fitExtent(projection, extent, object);
9631     },
9632     fitSize: function(size, object) {
9633       return fitSize(projection, size, object);
9634     },
9635     fitWidth: function(width, object) {
9636       return fitWidth(projection, width, object);
9637     },
9638     fitHeight: function(height, object) {
9639       return fitHeight(projection, height, object);
9640     }
9641   };
9642 }
9643
9644 function naturalEarth1Raw(lambda, phi) {
9645   var phi2 = phi * phi, phi4 = phi2 * phi2;
9646   return [
9647     lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),
9648     phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))
9649   ];
9650 }
9651
9652 naturalEarth1Raw.invert = function(x, y) {
9653   var phi = y, i = 25, delta;
9654   do {
9655     var phi2 = phi * phi, phi4 = phi2 * phi2;
9656     phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) /
9657         (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4)));
9658   } while (abs(delta) > epsilon$2 && --i > 0);
9659   return [
9660     x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),
9661     phi
9662   ];
9663 };
9664
9665 function naturalEarth1() {
9666   return projection(naturalEarth1Raw)
9667       .scale(175.295);
9668 }
9669
9670 function orthographicRaw(x, y) {
9671   return [cos$1(y) * sin$1(x), sin$1(y)];
9672 }
9673
9674 orthographicRaw.invert = azimuthalInvert(asin);
9675
9676 function orthographic() {
9677   return projection(orthographicRaw)
9678       .scale(249.5)
9679       .clipAngle(90 + epsilon$2);
9680 }
9681
9682 function stereographicRaw(x, y) {
9683   var cy = cos$1(y), k = 1 + cos$1(x) * cy;
9684   return [cy * sin$1(x) / k, sin$1(y) / k];
9685 }
9686
9687 stereographicRaw.invert = azimuthalInvert(function(z) {
9688   return 2 * atan(z);
9689 });
9690
9691 function stereographic() {
9692   return projection(stereographicRaw)
9693       .scale(250)
9694       .clipAngle(142);
9695 }
9696
9697 function transverseMercatorRaw(lambda, phi) {
9698   return [log(tan((halfPi$2 + phi) / 2)), -lambda];
9699 }
9700
9701 transverseMercatorRaw.invert = function(x, y) {
9702   return [-y, 2 * atan(exp(x)) - halfPi$2];
9703 };
9704
9705 function transverseMercator() {
9706   var m = mercatorProjection(transverseMercatorRaw),
9707       center = m.center,
9708       rotate = m.rotate;
9709
9710   m.center = function(_) {
9711     return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);
9712   };
9713
9714   m.rotate = function(_) {
9715     return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);
9716   };
9717
9718   return rotate([0, 0, 90])
9719       .scale(159.155);
9720 }
9721
9722 function defaultSeparation(a, b) {
9723   return a.parent === b.parent ? 1 : 2;
9724 }
9725
9726 function meanX(children) {
9727   return children.reduce(meanXReduce, 0) / children.length;
9728 }
9729
9730 function meanXReduce(x, c) {
9731   return x + c.x;
9732 }
9733
9734 function maxY(children) {
9735   return 1 + children.reduce(maxYReduce, 0);
9736 }
9737
9738 function maxYReduce(y, c) {
9739   return Math.max(y, c.y);
9740 }
9741
9742 function leafLeft(node) {
9743   var children;
9744   while (children = node.children) node = children[0];
9745   return node;
9746 }
9747
9748 function leafRight(node) {
9749   var children;
9750   while (children = node.children) node = children[children.length - 1];
9751   return node;
9752 }
9753
9754 function cluster() {
9755   var separation = defaultSeparation,
9756       dx = 1,
9757       dy = 1,
9758       nodeSize = false;
9759
9760   function cluster(root) {
9761     var previousNode,
9762         x = 0;
9763
9764     // First walk, computing the initial x & y values.
9765     root.eachAfter(function(node) {
9766       var children = node.children;
9767       if (children) {
9768         node.x = meanX(children);
9769         node.y = maxY(children);
9770       } else {
9771         node.x = previousNode ? x += separation(node, previousNode) : 0;
9772         node.y = 0;
9773         previousNode = node;
9774       }
9775     });
9776
9777     var left = leafLeft(root),
9778         right = leafRight(root),
9779         x0 = left.x - separation(left, right) / 2,
9780         x1 = right.x + separation(right, left) / 2;
9781
9782     // Second walk, normalizing x & y to the desired size.
9783     return root.eachAfter(nodeSize ? function(node) {
9784       node.x = (node.x - root.x) * dx;
9785       node.y = (root.y - node.y) * dy;
9786     } : function(node) {
9787       node.x = (node.x - x0) / (x1 - x0) * dx;
9788       node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;
9789     });
9790   }
9791
9792   cluster.separation = function(x) {
9793     return arguments.length ? (separation = x, cluster) : separation;
9794   };
9795
9796   cluster.size = function(x) {
9797     return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);
9798   };
9799
9800   cluster.nodeSize = function(x) {
9801     return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);
9802   };
9803
9804   return cluster;
9805 }
9806
9807 function count(node) {
9808   var sum = 0,
9809       children = node.children,
9810       i = children && children.length;
9811   if (!i) sum = 1;
9812   else while (--i >= 0) sum += children[i].value;
9813   node.value = sum;
9814 }
9815
9816 function node_count() {
9817   return this.eachAfter(count);
9818 }
9819
9820 function node_each(callback) {
9821   var node = this, current, next = [node], children, i, n;
9822   do {
9823     current = next.reverse(), next = [];
9824     while (node = current.pop()) {
9825       callback(node), children = node.children;
9826       if (children) for (i = 0, n = children.length; i < n; ++i) {
9827         next.push(children[i]);
9828       }
9829     }
9830   } while (next.length);
9831   return this;
9832 }
9833
9834 function node_eachBefore(callback) {
9835   var node = this, nodes = [node], children, i;
9836   while (node = nodes.pop()) {
9837     callback(node), children = node.children;
9838     if (children) for (i = children.length - 1; i >= 0; --i) {
9839       nodes.push(children[i]);
9840     }
9841   }
9842   return this;
9843 }
9844
9845 function node_eachAfter(callback) {
9846   var node = this, nodes = [node], next = [], children, i, n;
9847   while (node = nodes.pop()) {
9848     next.push(node), children = node.children;
9849     if (children) for (i = 0, n = children.length; i < n; ++i) {
9850       nodes.push(children[i]);
9851     }
9852   }
9853   while (node = next.pop()) {
9854     callback(node);
9855   }
9856   return this;
9857 }
9858
9859 function node_sum(value) {
9860   return this.eachAfter(function(node) {
9861     var sum = +value(node.data) || 0,
9862         children = node.children,
9863         i = children && children.length;
9864     while (--i >= 0) sum += children[i].value;
9865     node.value = sum;
9866   });
9867 }
9868
9869 function node_sort(compare) {
9870   return this.eachBefore(function(node) {
9871     if (node.children) {
9872       node.children.sort(compare);
9873     }
9874   });
9875 }
9876
9877 function node_path(end) {
9878   var start = this,
9879       ancestor = leastCommonAncestor(start, end),
9880       nodes = [start];
9881   while (start !== ancestor) {
9882     start = start.parent;
9883     nodes.push(start);
9884   }
9885   var k = nodes.length;
9886   while (end !== ancestor) {
9887     nodes.splice(k, 0, end);
9888     end = end.parent;
9889   }
9890   return nodes;
9891 }
9892
9893 function leastCommonAncestor(a, b) {
9894   if (a === b) return a;
9895   var aNodes = a.ancestors(),
9896       bNodes = b.ancestors(),
9897       c = null;
9898   a = aNodes.pop();
9899   b = bNodes.pop();
9900   while (a === b) {
9901     c = a;
9902     a = aNodes.pop();
9903     b = bNodes.pop();
9904   }
9905   return c;
9906 }
9907
9908 function node_ancestors() {
9909   var node = this, nodes = [node];
9910   while (node = node.parent) {
9911     nodes.push(node);
9912   }
9913   return nodes;
9914 }
9915
9916 function node_descendants() {
9917   var nodes = [];
9918   this.each(function(node) {
9919     nodes.push(node);
9920   });
9921   return nodes;
9922 }
9923
9924 function node_leaves() {
9925   var leaves = [];
9926   this.eachBefore(function(node) {
9927     if (!node.children) {
9928       leaves.push(node);
9929     }
9930   });
9931   return leaves;
9932 }
9933
9934 function node_links() {
9935   var root = this, links = [];
9936   root.each(function(node) {
9937     if (node !== root) { // Don’t include the root’s parent, if any.
9938       links.push({source: node.parent, target: node});
9939     }
9940   });
9941   return links;
9942 }
9943
9944 function hierarchy(data, children) {
9945   var root = new Node(data),
9946       valued = +data.value && (root.value = data.value),
9947       node,
9948       nodes = [root],
9949       child,
9950       childs,
9951       i,
9952       n;
9953
9954   if (children == null) children = defaultChildren;
9955
9956   while (node = nodes.pop()) {
9957     if (valued) node.value = +node.data.value;
9958     if ((childs = children(node.data)) && (n = childs.length)) {
9959       node.children = new Array(n);
9960       for (i = n - 1; i >= 0; --i) {
9961         nodes.push(child = node.children[i] = new Node(childs[i]));
9962         child.parent = node;
9963         child.depth = node.depth + 1;
9964       }
9965     }
9966   }
9967
9968   return root.eachBefore(computeHeight);
9969 }
9970
9971 function node_copy() {
9972   return hierarchy(this).eachBefore(copyData);
9973 }
9974
9975 function defaultChildren(d) {
9976   return d.children;
9977 }
9978
9979 function copyData(node) {
9980   node.data = node.data.data;
9981 }
9982
9983 function computeHeight(node) {
9984   var height = 0;
9985   do node.height = height;
9986   while ((node = node.parent) && (node.height < ++height));
9987 }
9988
9989 function Node(data) {
9990   this.data = data;
9991   this.depth =
9992   this.height = 0;
9993   this.parent = null;
9994 }
9995
9996 Node.prototype = hierarchy.prototype = {
9997   constructor: Node,
9998   count: node_count,
9999   each: node_each,
10000   eachAfter: node_eachAfter,
10001   eachBefore: node_eachBefore,
10002   sum: node_sum,
10003   sort: node_sort,
10004   path: node_path,
10005   ancestors: node_ancestors,
10006   descendants: node_descendants,
10007   leaves: node_leaves,
10008   links: node_links,
10009   copy: node_copy
10010 };
10011
10012 var slice$3 = Array.prototype.slice;
10013
10014 function shuffle$1(array) {
10015   var m = array.length,
10016       t,
10017       i;
10018
10019   while (m) {
10020     i = Math.random() * m-- | 0;
10021     t = array[m];
10022     array[m] = array[i];
10023     array[i] = t;
10024   }
10025
10026   return array;
10027 }
10028
10029 function enclose(circles) {
10030   var i = 0, n = (circles = shuffle$1(slice$3.call(circles))).length, B = [], p, e;
10031
10032   while (i < n) {
10033     p = circles[i];
10034     if (e && enclosesWeak(e, p)) ++i;
10035     else e = encloseBasis(B = extendBasis(B, p)), i = 0;
10036   }
10037
10038   return e;
10039 }
10040
10041 function extendBasis(B, p) {
10042   var i, j;
10043
10044   if (enclosesWeakAll(p, B)) return [p];
10045
10046   // If we get here then B must have at least one element.
10047   for (i = 0; i < B.length; ++i) {
10048     if (enclosesNot(p, B[i])
10049         && enclosesWeakAll(encloseBasis2(B[i], p), B)) {
10050       return [B[i], p];
10051     }
10052   }
10053
10054   // If we get here then B must have at least two elements.
10055   for (i = 0; i < B.length - 1; ++i) {
10056     for (j = i + 1; j < B.length; ++j) {
10057       if (enclosesNot(encloseBasis2(B[i], B[j]), p)
10058           && enclosesNot(encloseBasis2(B[i], p), B[j])
10059           && enclosesNot(encloseBasis2(B[j], p), B[i])
10060           && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {
10061         return [B[i], B[j], p];
10062       }
10063     }
10064   }
10065
10066   // If we get here then something is very wrong.
10067   throw new Error;
10068 }
10069
10070 function enclosesNot(a, b) {
10071   var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;
10072   return dr < 0 || dr * dr < dx * dx + dy * dy;
10073 }
10074
10075 function enclosesWeak(a, b) {
10076   var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y;
10077   return dr > 0 && dr * dr > dx * dx + dy * dy;
10078 }
10079
10080 function enclosesWeakAll(a, B) {
10081   for (var i = 0; i < B.length; ++i) {
10082     if (!enclosesWeak(a, B[i])) {
10083       return false;
10084     }
10085   }
10086   return true;
10087 }
10088
10089 function encloseBasis(B) {
10090   switch (B.length) {
10091     case 1: return encloseBasis1(B[0]);
10092     case 2: return encloseBasis2(B[0], B[1]);
10093     case 3: return encloseBasis3(B[0], B[1], B[2]);
10094   }
10095 }
10096
10097 function encloseBasis1(a) {
10098   return {
10099     x: a.x,
10100     y: a.y,
10101     r: a.r
10102   };
10103 }
10104
10105 function encloseBasis2(a, b) {
10106   var x1 = a.x, y1 = a.y, r1 = a.r,
10107       x2 = b.x, y2 = b.y, r2 = b.r,
10108       x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,
10109       l = Math.sqrt(x21 * x21 + y21 * y21);
10110   return {
10111     x: (x1 + x2 + x21 / l * r21) / 2,
10112     y: (y1 + y2 + y21 / l * r21) / 2,
10113     r: (l + r1 + r2) / 2
10114   };
10115 }
10116
10117 function encloseBasis3(a, b, c) {
10118   var x1 = a.x, y1 = a.y, r1 = a.r,
10119       x2 = b.x, y2 = b.y, r2 = b.r,
10120       x3 = c.x, y3 = c.y, r3 = c.r,
10121       a2 = x1 - x2,
10122       a3 = x1 - x3,
10123       b2 = y1 - y2,
10124       b3 = y1 - y3,
10125       c2 = r2 - r1,
10126       c3 = r3 - r1,
10127       d1 = x1 * x1 + y1 * y1 - r1 * r1,
10128       d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2,
10129       d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3,
10130       ab = a3 * b2 - a2 * b3,
10131       xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1,
10132       xb = (b3 * c2 - b2 * c3) / ab,
10133       ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1,
10134       yb = (a2 * c3 - a3 * c2) / ab,
10135       A = xb * xb + yb * yb - 1,
10136       B = 2 * (r1 + xa * xb + ya * yb),
10137       C = xa * xa + ya * ya - r1 * r1,
10138       r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);
10139   return {
10140     x: x1 + xa + xb * r,
10141     y: y1 + ya + yb * r,
10142     r: r
10143   };
10144 }
10145
10146 function place(a, b, c) {
10147   var ax = a.x,
10148       ay = a.y,
10149       da = b.r + c.r,
10150       db = a.r + c.r,
10151       dx = b.x - ax,
10152       dy = b.y - ay,
10153       dc = dx * dx + dy * dy;
10154   if (dc) {
10155     var x = 0.5 + ((db *= db) - (da *= da)) / (2 * dc),
10156         y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);
10157     c.x = ax + x * dx + y * dy;
10158     c.y = ay + x * dy - y * dx;
10159   } else {
10160     c.x = ax + db;
10161     c.y = ay;
10162   }
10163 }
10164
10165 function intersects(a, b) {
10166   var dx = b.x - a.x,
10167       dy = b.y - a.y,
10168       dr = a.r + b.r;
10169   return dr * dr - 1e-6 > dx * dx + dy * dy;
10170 }
10171
10172 function score(node) {
10173   var a = node._,
10174       b = node.next._,
10175       ab = a.r + b.r,
10176       dx = (a.x * b.r + b.x * a.r) / ab,
10177       dy = (a.y * b.r + b.y * a.r) / ab;
10178   return dx * dx + dy * dy;
10179 }
10180
10181 function Node$1(circle) {
10182   this._ = circle;
10183   this.next = null;
10184   this.previous = null;
10185 }
10186
10187 function packEnclose(circles) {
10188   if (!(n = circles.length)) return 0;
10189
10190   var a, b, c, n, aa, ca, i, j, k, sj, sk;
10191
10192   // Place the first circle.
10193   a = circles[0], a.x = 0, a.y = 0;
10194   if (!(n > 1)) return a.r;
10195
10196   // Place the second circle.
10197   b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;
10198   if (!(n > 2)) return a.r + b.r;
10199
10200   // Place the third circle.
10201   place(b, a, c = circles[2]);
10202
10203   // Initialize the front-chain using the first three circles a, b and c.
10204   a = new Node$1(a), b = new Node$1(b), c = new Node$1(c);
10205   a.next = c.previous = b;
10206   b.next = a.previous = c;
10207   c.next = b.previous = a;
10208
10209   // Attempt to place each remaining circle…
10210   pack: for (i = 3; i < n; ++i) {
10211     place(a._, b._, c = circles[i]), c = new Node$1(c);
10212
10213     // Find the closest intersecting circle on the front-chain, if any.
10214     // “Closeness” is determined by linear distance along the front-chain.
10215     // “Ahead” or “behind” is likewise determined by linear distance.
10216     j = b.next, k = a.previous, sj = b._.r, sk = a._.r;
10217     do {
10218       if (sj <= sk) {
10219         if (intersects(j._, c._)) {
10220           b = j, a.next = b, b.previous = a, --i;
10221           continue pack;
10222         }
10223         sj += j._.r, j = j.next;
10224       } else {
10225         if (intersects(k._, c._)) {
10226           a = k, a.next = b, b.previous = a, --i;
10227           continue pack;
10228         }
10229         sk += k._.r, k = k.previous;
10230       }
10231     } while (j !== k.next);
10232
10233     // Success! Insert the new circle c between a and b.
10234     c.previous = a, c.next = b, a.next = b.previous = b = c;
10235
10236     // Compute the new closest circle pair to the centroid.
10237     aa = score(a);
10238     while ((c = c.next) !== b) {
10239       if ((ca = score(c)) < aa) {
10240         a = c, aa = ca;
10241       }
10242     }
10243     b = a.next;
10244   }
10245
10246   // Compute the enclosing circle of the front chain.
10247   a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a);
10248
10249   // Translate the circles to put the enclosing circle around the origin.
10250   for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;
10251
10252   return c.r;
10253 }
10254
10255 function siblings(circles) {
10256   packEnclose(circles);
10257   return circles;
10258 }
10259
10260 function optional(f) {
10261   return f == null ? null : required(f);
10262 }
10263
10264 function required(f) {
10265   if (typeof f !== "function") throw new Error;
10266   return f;
10267 }
10268
10269 function constantZero() {
10270   return 0;
10271 }
10272
10273 function constant$8(x) {
10274   return function() {
10275     return x;
10276   };
10277 }
10278
10279 function defaultRadius$1(d) {
10280   return Math.sqrt(d.value);
10281 }
10282
10283 function index$1() {
10284   var radius = null,
10285       dx = 1,
10286       dy = 1,
10287       padding = constantZero;
10288
10289   function pack(root) {
10290     root.x = dx / 2, root.y = dy / 2;
10291     if (radius) {
10292       root.eachBefore(radiusLeaf(radius))
10293           .eachAfter(packChildren(padding, 0.5))
10294           .eachBefore(translateChild(1));
10295     } else {
10296       root.eachBefore(radiusLeaf(defaultRadius$1))
10297           .eachAfter(packChildren(constantZero, 1))
10298           .eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))
10299           .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));
10300     }
10301     return root;
10302   }
10303
10304   pack.radius = function(x) {
10305     return arguments.length ? (radius = optional(x), pack) : radius;
10306   };
10307
10308   pack.size = function(x) {
10309     return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
10310   };
10311
10312   pack.padding = function(x) {
10313     return arguments.length ? (padding = typeof x === "function" ? x : constant$8(+x), pack) : padding;
10314   };
10315
10316   return pack;
10317 }
10318
10319 function radiusLeaf(radius) {
10320   return function(node) {
10321     if (!node.children) {
10322       node.r = Math.max(0, +radius(node) || 0);
10323     }
10324   };
10325 }
10326
10327 function packChildren(padding, k) {
10328   return function(node) {
10329     if (children = node.children) {
10330       var children,
10331           i,
10332           n = children.length,
10333           r = padding(node) * k || 0,
10334           e;
10335
10336       if (r) for (i = 0; i < n; ++i) children[i].r += r;
10337       e = packEnclose(children);
10338       if (r) for (i = 0; i < n; ++i) children[i].r -= r;
10339       node.r = e + r;
10340     }
10341   };
10342 }
10343
10344 function translateChild(k) {
10345   return function(node) {
10346     var parent = node.parent;
10347     node.r *= k;
10348     if (parent) {
10349       node.x = parent.x + k * node.x;
10350       node.y = parent.y + k * node.y;
10351     }
10352   };
10353 }
10354
10355 function roundNode(node) {
10356   node.x0 = Math.round(node.x0);
10357   node.y0 = Math.round(node.y0);
10358   node.x1 = Math.round(node.x1);
10359   node.y1 = Math.round(node.y1);
10360 }
10361
10362 function treemapDice(parent, x0, y0, x1, y1) {
10363   var nodes = parent.children,
10364       node,
10365       i = -1,
10366       n = nodes.length,
10367       k = parent.value && (x1 - x0) / parent.value;
10368
10369   while (++i < n) {
10370     node = nodes[i], node.y0 = y0, node.y1 = y1;
10371     node.x0 = x0, node.x1 = x0 += node.value * k;
10372   }
10373 }
10374
10375 function partition() {
10376   var dx = 1,
10377       dy = 1,
10378       padding = 0,
10379       round = false;
10380
10381   function partition(root) {
10382     var n = root.height + 1;
10383     root.x0 =
10384     root.y0 = padding;
10385     root.x1 = dx;
10386     root.y1 = dy / n;
10387     root.eachBefore(positionNode(dy, n));
10388     if (round) root.eachBefore(roundNode);
10389     return root;
10390   }
10391
10392   function positionNode(dy, n) {
10393     return function(node) {
10394       if (node.children) {
10395         treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);
10396       }
10397       var x0 = node.x0,
10398           y0 = node.y0,
10399           x1 = node.x1 - padding,
10400           y1 = node.y1 - padding;
10401       if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10402       if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10403       node.x0 = x0;
10404       node.y0 = y0;
10405       node.x1 = x1;
10406       node.y1 = y1;
10407     };
10408   }
10409
10410   partition.round = function(x) {
10411     return arguments.length ? (round = !!x, partition) : round;
10412   };
10413
10414   partition.size = function(x) {
10415     return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];
10416   };
10417
10418   partition.padding = function(x) {
10419     return arguments.length ? (padding = +x, partition) : padding;
10420   };
10421
10422   return partition;
10423 }
10424
10425 var keyPrefix$1 = "$", // Protect against keys like “__proto__”.
10426     preroot = {depth: -1},
10427     ambiguous = {};
10428
10429 function defaultId(d) {
10430   return d.id;
10431 }
10432
10433 function defaultParentId(d) {
10434   return d.parentId;
10435 }
10436
10437 function stratify() {
10438   var id = defaultId,
10439       parentId = defaultParentId;
10440
10441   function stratify(data) {
10442     var d,
10443         i,
10444         n = data.length,
10445         root,
10446         parent,
10447         node,
10448         nodes = new Array(n),
10449         nodeId,
10450         nodeKey,
10451         nodeByKey = {};
10452
10453     for (i = 0; i < n; ++i) {
10454       d = data[i], node = nodes[i] = new Node(d);
10455       if ((nodeId = id(d, i, data)) != null && (nodeId += "")) {
10456         nodeKey = keyPrefix$1 + (node.id = nodeId);
10457         nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;
10458       }
10459     }
10460
10461     for (i = 0; i < n; ++i) {
10462       node = nodes[i], nodeId = parentId(data[i], i, data);
10463       if (nodeId == null || !(nodeId += "")) {
10464         if (root) throw new Error("multiple roots");
10465         root = node;
10466       } else {
10467         parent = nodeByKey[keyPrefix$1 + nodeId];
10468         if (!parent) throw new Error("missing: " + nodeId);
10469         if (parent === ambiguous) throw new Error("ambiguous: " + nodeId);
10470         if (parent.children) parent.children.push(node);
10471         else parent.children = [node];
10472         node.parent = parent;
10473       }
10474     }
10475
10476     if (!root) throw new Error("no root");
10477     root.parent = preroot;
10478     root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight);
10479     root.parent = null;
10480     if (n > 0) throw new Error("cycle");
10481
10482     return root;
10483   }
10484
10485   stratify.id = function(x) {
10486     return arguments.length ? (id = required(x), stratify) : id;
10487   };
10488
10489   stratify.parentId = function(x) {
10490     return arguments.length ? (parentId = required(x), stratify) : parentId;
10491   };
10492
10493   return stratify;
10494 }
10495
10496 function defaultSeparation$1(a, b) {
10497   return a.parent === b.parent ? 1 : 2;
10498 }
10499
10500 // function radialSeparation(a, b) {
10501 //   return (a.parent === b.parent ? 1 : 2) / a.depth;
10502 // }
10503
10504 // This function is used to traverse the left contour of a subtree (or
10505 // subforest). It returns the successor of v on this contour. This successor is
10506 // either given by the leftmost child of v or by the thread of v. The function
10507 // returns null if and only if v is on the highest level of its subtree.
10508 function nextLeft(v) {
10509   var children = v.children;
10510   return children ? children[0] : v.t;
10511 }
10512
10513 // This function works analogously to nextLeft.
10514 function nextRight(v) {
10515   var children = v.children;
10516   return children ? children[children.length - 1] : v.t;
10517 }
10518
10519 // Shifts the current subtree rooted at w+. This is done by increasing
10520 // prelim(w+) and mod(w+) by shift.
10521 function moveSubtree(wm, wp, shift) {
10522   var change = shift / (wp.i - wm.i);
10523   wp.c -= change;
10524   wp.s += shift;
10525   wm.c += change;
10526   wp.z += shift;
10527   wp.m += shift;
10528 }
10529
10530 // All other shifts, applied to the smaller subtrees between w- and w+, are
10531 // performed by this function. To prepare the shifts, we have to adjust
10532 // change(w+), shift(w+), and change(w-).
10533 function executeShifts(v) {
10534   var shift = 0,
10535       change = 0,
10536       children = v.children,
10537       i = children.length,
10538       w;
10539   while (--i >= 0) {
10540     w = children[i];
10541     w.z += shift;
10542     w.m += shift;
10543     shift += w.s + (change += w.c);
10544   }
10545 }
10546
10547 // If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,
10548 // returns the specified (default) ancestor.
10549 function nextAncestor(vim, v, ancestor) {
10550   return vim.a.parent === v.parent ? vim.a : ancestor;
10551 }
10552
10553 function TreeNode(node, i) {
10554   this._ = node;
10555   this.parent = null;
10556   this.children = null;
10557   this.A = null; // default ancestor
10558   this.a = this; // ancestor
10559   this.z = 0; // prelim
10560   this.m = 0; // mod
10561   this.c = 0; // change
10562   this.s = 0; // shift
10563   this.t = null; // thread
10564   this.i = i; // number
10565 }
10566
10567 TreeNode.prototype = Object.create(Node.prototype);
10568
10569 function treeRoot(root) {
10570   var tree = new TreeNode(root, 0),
10571       node,
10572       nodes = [tree],
10573       child,
10574       children,
10575       i,
10576       n;
10577
10578   while (node = nodes.pop()) {
10579     if (children = node._.children) {
10580       node.children = new Array(n = children.length);
10581       for (i = n - 1; i >= 0; --i) {
10582         nodes.push(child = node.children[i] = new TreeNode(children[i], i));
10583         child.parent = node;
10584       }
10585     }
10586   }
10587
10588   (tree.parent = new TreeNode(null, 0)).children = [tree];
10589   return tree;
10590 }
10591
10592 // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
10593 function tree() {
10594   var separation = defaultSeparation$1,
10595       dx = 1,
10596       dy = 1,
10597       nodeSize = null;
10598
10599   function tree(root) {
10600     var t = treeRoot(root);
10601
10602     // Compute the layout using Buchheim et al.’s algorithm.
10603     t.eachAfter(firstWalk), t.parent.m = -t.z;
10604     t.eachBefore(secondWalk);
10605
10606     // If a fixed node size is specified, scale x and y.
10607     if (nodeSize) root.eachBefore(sizeNode);
10608
10609     // If a fixed tree size is specified, scale x and y based on the extent.
10610     // Compute the left-most, right-most, and depth-most nodes for extents.
10611     else {
10612       var left = root,
10613           right = root,
10614           bottom = root;
10615       root.eachBefore(function(node) {
10616         if (node.x < left.x) left = node;
10617         if (node.x > right.x) right = node;
10618         if (node.depth > bottom.depth) bottom = node;
10619       });
10620       var s = left === right ? 1 : separation(left, right) / 2,
10621           tx = s - left.x,
10622           kx = dx / (right.x + s + tx),
10623           ky = dy / (bottom.depth || 1);
10624       root.eachBefore(function(node) {
10625         node.x = (node.x + tx) * kx;
10626         node.y = node.depth * ky;
10627       });
10628     }
10629
10630     return root;
10631   }
10632
10633   // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is
10634   // applied recursively to the children of v, as well as the function
10635   // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the
10636   // node v is placed to the midpoint of its outermost children.
10637   function firstWalk(v) {
10638     var children = v.children,
10639         siblings = v.parent.children,
10640         w = v.i ? siblings[v.i - 1] : null;
10641     if (children) {
10642       executeShifts(v);
10643       var midpoint = (children[0].z + children[children.length - 1].z) / 2;
10644       if (w) {
10645         v.z = w.z + separation(v._, w._);
10646         v.m = v.z - midpoint;
10647       } else {
10648         v.z = midpoint;
10649       }
10650     } else if (w) {
10651       v.z = w.z + separation(v._, w._);
10652     }
10653     v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
10654   }
10655
10656   // Computes all real x-coordinates by summing up the modifiers recursively.
10657   function secondWalk(v) {
10658     v._.x = v.z + v.parent.m;
10659     v.m += v.parent.m;
10660   }
10661
10662   // The core of the algorithm. Here, a new subtree is combined with the
10663   // previous subtrees. Threads are used to traverse the inside and outside
10664   // contours of the left and right subtree up to the highest common level. The
10665   // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the
10666   // superscript o means outside and i means inside, the subscript - means left
10667   // subtree and + means right subtree. For summing up the modifiers along the
10668   // contour, we use respective variables si+, si-, so-, and so+. Whenever two
10669   // nodes of the inside contours conflict, we compute the left one of the
10670   // greatest uncommon ancestors using the function ANCESTOR and call MOVE
10671   // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.
10672   // Finally, we add a new thread (if necessary).
10673   function apportion(v, w, ancestor) {
10674     if (w) {
10675       var vip = v,
10676           vop = v,
10677           vim = w,
10678           vom = vip.parent.children[0],
10679           sip = vip.m,
10680           sop = vop.m,
10681           sim = vim.m,
10682           som = vom.m,
10683           shift;
10684       while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
10685         vom = nextLeft(vom);
10686         vop = nextRight(vop);
10687         vop.a = v;
10688         shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
10689         if (shift > 0) {
10690           moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
10691           sip += shift;
10692           sop += shift;
10693         }
10694         sim += vim.m;
10695         sip += vip.m;
10696         som += vom.m;
10697         sop += vop.m;
10698       }
10699       if (vim && !nextRight(vop)) {
10700         vop.t = vim;
10701         vop.m += sim - sop;
10702       }
10703       if (vip && !nextLeft(vom)) {
10704         vom.t = vip;
10705         vom.m += sip - som;
10706         ancestor = v;
10707       }
10708     }
10709     return ancestor;
10710   }
10711
10712   function sizeNode(node) {
10713     node.x *= dx;
10714     node.y = node.depth * dy;
10715   }
10716
10717   tree.separation = function(x) {
10718     return arguments.length ? (separation = x, tree) : separation;
10719   };
10720
10721   tree.size = function(x) {
10722     return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);
10723   };
10724
10725   tree.nodeSize = function(x) {
10726     return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);
10727   };
10728
10729   return tree;
10730 }
10731
10732 function treemapSlice(parent, x0, y0, x1, y1) {
10733   var nodes = parent.children,
10734       node,
10735       i = -1,
10736       n = nodes.length,
10737       k = parent.value && (y1 - y0) / parent.value;
10738
10739   while (++i < n) {
10740     node = nodes[i], node.x0 = x0, node.x1 = x1;
10741     node.y0 = y0, node.y1 = y0 += node.value * k;
10742   }
10743 }
10744
10745 var phi = (1 + Math.sqrt(5)) / 2;
10746
10747 function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
10748   var rows = [],
10749       nodes = parent.children,
10750       row,
10751       nodeValue,
10752       i0 = 0,
10753       i1 = 0,
10754       n = nodes.length,
10755       dx, dy,
10756       value = parent.value,
10757       sumValue,
10758       minValue,
10759       maxValue,
10760       newRatio,
10761       minRatio,
10762       alpha,
10763       beta;
10764
10765   while (i0 < n) {
10766     dx = x1 - x0, dy = y1 - y0;
10767
10768     // Find the next non-empty node.
10769     do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);
10770     minValue = maxValue = sumValue;
10771     alpha = Math.max(dy / dx, dx / dy) / (value * ratio);
10772     beta = sumValue * sumValue * alpha;
10773     minRatio = Math.max(maxValue / beta, beta / minValue);
10774
10775     // Keep adding nodes while the aspect ratio maintains or improves.
10776     for (; i1 < n; ++i1) {
10777       sumValue += nodeValue = nodes[i1].value;
10778       if (nodeValue < minValue) minValue = nodeValue;
10779       if (nodeValue > maxValue) maxValue = nodeValue;
10780       beta = sumValue * sumValue * alpha;
10781       newRatio = Math.max(maxValue / beta, beta / minValue);
10782       if (newRatio > minRatio) { sumValue -= nodeValue; break; }
10783       minRatio = newRatio;
10784     }
10785
10786     // Position and record the row orientation.
10787     rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});
10788     if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);
10789     else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);
10790     value -= sumValue, i0 = i1;
10791   }
10792
10793   return rows;
10794 }
10795
10796 var squarify = (function custom(ratio) {
10797
10798   function squarify(parent, x0, y0, x1, y1) {
10799     squarifyRatio(ratio, parent, x0, y0, x1, y1);
10800   }
10801
10802   squarify.ratio = function(x) {
10803     return custom((x = +x) > 1 ? x : 1);
10804   };
10805
10806   return squarify;
10807 })(phi);
10808
10809 function index$2() {
10810   var tile = squarify,
10811       round = false,
10812       dx = 1,
10813       dy = 1,
10814       paddingStack = [0],
10815       paddingInner = constantZero,
10816       paddingTop = constantZero,
10817       paddingRight = constantZero,
10818       paddingBottom = constantZero,
10819       paddingLeft = constantZero;
10820
10821   function treemap(root) {
10822     root.x0 =
10823     root.y0 = 0;
10824     root.x1 = dx;
10825     root.y1 = dy;
10826     root.eachBefore(positionNode);
10827     paddingStack = [0];
10828     if (round) root.eachBefore(roundNode);
10829     return root;
10830   }
10831
10832   function positionNode(node) {
10833     var p = paddingStack[node.depth],
10834         x0 = node.x0 + p,
10835         y0 = node.y0 + p,
10836         x1 = node.x1 - p,
10837         y1 = node.y1 - p;
10838     if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10839     if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10840     node.x0 = x0;
10841     node.y0 = y0;
10842     node.x1 = x1;
10843     node.y1 = y1;
10844     if (node.children) {
10845       p = paddingStack[node.depth + 1] = paddingInner(node) / 2;
10846       x0 += paddingLeft(node) - p;
10847       y0 += paddingTop(node) - p;
10848       x1 -= paddingRight(node) - p;
10849       y1 -= paddingBottom(node) - p;
10850       if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10851       if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10852       tile(node, x0, y0, x1, y1);
10853     }
10854   }
10855
10856   treemap.round = function(x) {
10857     return arguments.length ? (round = !!x, treemap) : round;
10858   };
10859
10860   treemap.size = function(x) {
10861     return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
10862   };
10863
10864   treemap.tile = function(x) {
10865     return arguments.length ? (tile = required(x), treemap) : tile;
10866   };
10867
10868   treemap.padding = function(x) {
10869     return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
10870   };
10871
10872   treemap.paddingInner = function(x) {
10873     return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$8(+x), treemap) : paddingInner;
10874   };
10875
10876   treemap.paddingOuter = function(x) {
10877     return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
10878   };
10879
10880   treemap.paddingTop = function(x) {
10881     return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$8(+x), treemap) : paddingTop;
10882   };
10883
10884   treemap.paddingRight = function(x) {
10885     return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$8(+x), treemap) : paddingRight;
10886   };
10887
10888   treemap.paddingBottom = function(x) {
10889     return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$8(+x), treemap) : paddingBottom;
10890   };
10891
10892   treemap.paddingLeft = function(x) {
10893     return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$8(+x), treemap) : paddingLeft;
10894   };
10895
10896   return treemap;
10897 }
10898
10899 function binary(parent, x0, y0, x1, y1) {
10900   var nodes = parent.children,
10901       i, n = nodes.length,
10902       sum, sums = new Array(n + 1);
10903
10904   for (sums[0] = sum = i = 0; i < n; ++i) {
10905     sums[i + 1] = sum += nodes[i].value;
10906   }
10907
10908   partition(0, n, parent.value, x0, y0, x1, y1);
10909
10910   function partition(i, j, value, x0, y0, x1, y1) {
10911     if (i >= j - 1) {
10912       var node = nodes[i];
10913       node.x0 = x0, node.y0 = y0;
10914       node.x1 = x1, node.y1 = y1;
10915       return;
10916     }
10917
10918     var valueOffset = sums[i],
10919         valueTarget = (value / 2) + valueOffset,
10920         k = i + 1,
10921         hi = j - 1;
10922
10923     while (k < hi) {
10924       var mid = k + hi >>> 1;
10925       if (sums[mid] < valueTarget) k = mid + 1;
10926       else hi = mid;
10927     }
10928
10929     if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;
10930
10931     var valueLeft = sums[k] - valueOffset,
10932         valueRight = value - valueLeft;
10933
10934     if ((x1 - x0) > (y1 - y0)) {
10935       var xk = (x0 * valueRight + x1 * valueLeft) / value;
10936       partition(i, k, valueLeft, x0, y0, xk, y1);
10937       partition(k, j, valueRight, xk, y0, x1, y1);
10938     } else {
10939       var yk = (y0 * valueRight + y1 * valueLeft) / value;
10940       partition(i, k, valueLeft, x0, y0, x1, yk);
10941       partition(k, j, valueRight, x0, yk, x1, y1);
10942     }
10943   }
10944 }
10945
10946 function sliceDice(parent, x0, y0, x1, y1) {
10947   (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1);
10948 }
10949
10950 var resquarify = (function custom(ratio) {
10951
10952   function resquarify(parent, x0, y0, x1, y1) {
10953     if ((rows = parent._squarify) && (rows.ratio === ratio)) {
10954       var rows,
10955           row,
10956           nodes,
10957           i,
10958           j = -1,
10959           n,
10960           m = rows.length,
10961           value = parent.value;
10962
10963       while (++j < m) {
10964         row = rows[j], nodes = row.children;
10965         for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;
10966         if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);
10967         else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);
10968         value -= row.value;
10969       }
10970     } else {
10971       parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);
10972       rows.ratio = ratio;
10973     }
10974   }
10975
10976   resquarify.ratio = function(x) {
10977     return custom((x = +x) > 1 ? x : 1);
10978   };
10979
10980   return resquarify;
10981 })(phi);
10982
10983 function d3_polygonArea(polygon) {
10984   var i = -1,
10985       n = polygon.length,
10986       a,
10987       b = polygon[n - 1],
10988       area = 0;
10989
10990   while (++i < n) {
10991     a = b;
10992     b = polygon[i];
10993     area += a[1] * b[0] - a[0] * b[1];
10994   }
10995
10996   return area / 2;
10997 }
10998
10999 function d3_polygonCentroid(polygon) {
11000   var i = -1,
11001       n = polygon.length,
11002       x = 0,
11003       y = 0,
11004       a,
11005       b = polygon[n - 1],
11006       c,
11007       k = 0;
11008
11009   while (++i < n) {
11010     a = b;
11011     b = polygon[i];
11012     k += c = a[0] * b[1] - b[0] * a[1];
11013     x += (a[0] + b[0]) * c;
11014     y += (a[1] + b[1]) * c;
11015   }
11016
11017   return k *= 3, [x / k, y / k];
11018 }
11019
11020 // Returns the 2D cross product of AB and AC vectors, i.e., the z-component of
11021 // the 3D cross product in a quadrant I Cartesian coordinate system (+x is
11022 // right, +y is up). Returns a positive value if ABC is counter-clockwise,
11023 // negative if clockwise, and zero if the points are collinear.
11024 function cross$1(a, b, c) {
11025   return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
11026 }
11027
11028 function lexicographicOrder(a, b) {
11029   return a[0] - b[0] || a[1] - b[1];
11030 }
11031
11032 // Computes the upper convex hull per the monotone chain algorithm.
11033 // Assumes points.length >= 3, is sorted by x, unique in y.
11034 // Returns an array of indices into points in left-to-right order.
11035 function computeUpperHullIndexes(points) {
11036   var n = points.length,
11037       indexes = [0, 1],
11038       size = 2;
11039
11040   for (var i = 2; i < n; ++i) {
11041     while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;
11042     indexes[size++] = i;
11043   }
11044
11045   return indexes.slice(0, size); // remove popped points
11046 }
11047
11048 function d3_polygonHull(points) {
11049   if ((n = points.length) < 3) return null;
11050
11051   var i,
11052       n,
11053       sortedPoints = new Array(n),
11054       flippedPoints = new Array(n);
11055
11056   for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];
11057   sortedPoints.sort(lexicographicOrder);
11058   for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];
11059
11060   var upperIndexes = computeUpperHullIndexes(sortedPoints),
11061       lowerIndexes = computeUpperHullIndexes(flippedPoints);
11062
11063   // Construct the hull polygon, removing possible duplicate endpoints.
11064   var skipLeft = lowerIndexes[0] === upperIndexes[0],
11065       skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],
11066       hull = [];
11067
11068   // Add upper hull in right-to-l order.
11069   // Then add lower hull in left-to-right order.
11070   for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);
11071   for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);
11072
11073   return hull;
11074 }
11075
11076 function contains$1(polygon, point) {
11077   var n = polygon.length,
11078       p = polygon[n - 1],
11079       x = point[0], y = point[1],
11080       x0 = p[0], y0 = p[1],
11081       x1, y1,
11082       inside = false;
11083
11084   for (var i = 0; i < n; ++i) {
11085     p = polygon[i], x1 = p[0], y1 = p[1];
11086     if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside;
11087     x0 = x1, y0 = y1;
11088   }
11089
11090   return inside;
11091 }
11092
11093 function length$1(polygon) {
11094   var i = -1,
11095       n = polygon.length,
11096       b = polygon[n - 1],
11097       xa,
11098       ya,
11099       xb = b[0],
11100       yb = b[1],
11101       perimeter = 0;
11102
11103   while (++i < n) {
11104     xa = xb;
11105     ya = yb;
11106     b = polygon[i];
11107     xb = b[0];
11108     yb = b[1];
11109     xa -= xb;
11110     ya -= yb;
11111     perimeter += Math.sqrt(xa * xa + ya * ya);
11112   }
11113
11114   return perimeter;
11115 }
11116
11117 var slice$4 = [].slice;
11118
11119 var noabort = {};
11120
11121 function Queue(size) {
11122   this._size = size;
11123   this._call =
11124   this._error = null;
11125   this._tasks = [];
11126   this._data = [];
11127   this._waiting =
11128   this._active =
11129   this._ended =
11130   this._start = 0; // inside a synchronous task callback?
11131 }
11132
11133 Queue.prototype = queue.prototype = {
11134   constructor: Queue,
11135   defer: function(callback) {
11136     if (typeof callback !== "function") throw new Error("invalid callback");
11137     if (this._call) throw new Error("defer after await");
11138     if (this._error != null) return this;
11139     var t = slice$4.call(arguments, 1);
11140     t.push(callback);
11141     ++this._waiting, this._tasks.push(t);
11142     poke$1(this);
11143     return this;
11144   },
11145   abort: function() {
11146     if (this._error == null) abort(this, new Error("abort"));
11147     return this;
11148   },
11149   await: function(callback) {
11150     if (typeof callback !== "function") throw new Error("invalid callback");
11151     if (this._call) throw new Error("multiple await");
11152     this._call = function(error, results) { callback.apply(null, [error].concat(results)); };
11153     maybeNotify(this);
11154     return this;
11155   },
11156   awaitAll: function(callback) {
11157     if (typeof callback !== "function") throw new Error("invalid callback");
11158     if (this._call) throw new Error("multiple await");
11159     this._call = callback;
11160     maybeNotify(this);
11161     return this;
11162   }
11163 };
11164
11165 function poke$1(q) {
11166   if (!q._start) {
11167     try { start$1(q); } // let the current task complete
11168     catch (e) {
11169       if (q._tasks[q._ended + q._active - 1]) abort(q, e); // task errored synchronously
11170       else if (!q._data) throw e; // await callback errored synchronously
11171     }
11172   }
11173 }
11174
11175 function start$1(q) {
11176   while (q._start = q._waiting && q._active < q._size) {
11177     var i = q._ended + q._active,
11178         t = q._tasks[i],
11179         j = t.length - 1,
11180         c = t[j];
11181     t[j] = end(q, i);
11182     --q._waiting, ++q._active;
11183     t = c.apply(null, t);
11184     if (!q._tasks[i]) continue; // task finished synchronously
11185     q._tasks[i] = t || noabort;
11186   }
11187 }
11188
11189 function end(q, i) {
11190   return function(e, r) {
11191     if (!q._tasks[i]) return; // ignore multiple callbacks
11192     --q._active, ++q._ended;
11193     q._tasks[i] = null;
11194     if (q._error != null) return; // ignore secondary errors
11195     if (e != null) {
11196       abort(q, e);
11197     } else {
11198       q._data[i] = r;
11199       if (q._waiting) poke$1(q);
11200       else maybeNotify(q);
11201     }
11202   };
11203 }
11204
11205 function abort(q, e) {
11206   var i = q._tasks.length, t;
11207   q._error = e; // ignore active callbacks
11208   q._data = undefined; // allow gc
11209   q._waiting = NaN; // prevent starting
11210
11211   while (--i >= 0) {
11212     if (t = q._tasks[i]) {
11213       q._tasks[i] = null;
11214       if (t.abort) {
11215         try { t.abort(); }
11216         catch (e) { /* ignore */ }
11217       }
11218     }
11219   }
11220
11221   q._active = NaN; // allow notification
11222   maybeNotify(q);
11223 }
11224
11225 function maybeNotify(q) {
11226   if (!q._active && q._call) {
11227     var d = q._data;
11228     q._data = undefined; // allow gc
11229     q._call(q._error, d);
11230   }
11231 }
11232
11233 function queue(concurrency) {
11234   if (concurrency == null) concurrency = Infinity;
11235   else if (!((concurrency = +concurrency) >= 1)) throw new Error("invalid concurrency");
11236   return new Queue(concurrency);
11237 }
11238
11239 function defaultSource$1() {
11240   return Math.random();
11241 }
11242
11243 var uniform = (function sourceRandomUniform(source) {
11244   function randomUniform(min, max) {
11245     min = min == null ? 0 : +min;
11246     max = max == null ? 1 : +max;
11247     if (arguments.length === 1) max = min, min = 0;
11248     else max -= min;
11249     return function() {
11250       return source() * max + min;
11251     };
11252   }
11253
11254   randomUniform.source = sourceRandomUniform;
11255
11256   return randomUniform;
11257 })(defaultSource$1);
11258
11259 var normal = (function sourceRandomNormal(source) {
11260   function randomNormal(mu, sigma) {
11261     var x, r;
11262     mu = mu == null ? 0 : +mu;
11263     sigma = sigma == null ? 1 : +sigma;
11264     return function() {
11265       var y;
11266
11267       // If available, use the second previously-generated uniform random.
11268       if (x != null) y = x, x = null;
11269
11270       // Otherwise, generate a new x and y.
11271       else do {
11272         x = source() * 2 - 1;
11273         y = source() * 2 - 1;
11274         r = x * x + y * y;
11275       } while (!r || r > 1);
11276
11277       return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
11278     };
11279   }
11280
11281   randomNormal.source = sourceRandomNormal;
11282
11283   return randomNormal;
11284 })(defaultSource$1);
11285
11286 var logNormal = (function sourceRandomLogNormal(source) {
11287   function randomLogNormal() {
11288     var randomNormal = normal.source(source).apply(this, arguments);
11289     return function() {
11290       return Math.exp(randomNormal());
11291     };
11292   }
11293
11294   randomLogNormal.source = sourceRandomLogNormal;
11295
11296   return randomLogNormal;
11297 })(defaultSource$1);
11298
11299 var irwinHall = (function sourceRandomIrwinHall(source) {
11300   function randomIrwinHall(n) {
11301     return function() {
11302       for (var sum = 0, i = 0; i < n; ++i) sum += source();
11303       return sum;
11304     };
11305   }
11306
11307   randomIrwinHall.source = sourceRandomIrwinHall;
11308
11309   return randomIrwinHall;
11310 })(defaultSource$1);
11311
11312 var bates = (function sourceRandomBates(source) {
11313   function randomBates(n) {
11314     var randomIrwinHall = irwinHall.source(source)(n);
11315     return function() {
11316       return randomIrwinHall() / n;
11317     };
11318   }
11319
11320   randomBates.source = sourceRandomBates;
11321
11322   return randomBates;
11323 })(defaultSource$1);
11324
11325 var exponential$1 = (function sourceRandomExponential(source) {
11326   function randomExponential(lambda) {
11327     return function() {
11328       return -Math.log(1 - source()) / lambda;
11329     };
11330   }
11331
11332   randomExponential.source = sourceRandomExponential;
11333
11334   return randomExponential;
11335 })(defaultSource$1);
11336
11337 function d3_request(url, callback) {
11338   var request,
11339       event = dispatch("beforesend", "progress", "load", "error"),
11340       mimeType,
11341       headers = map$1(),
11342       xhr = new XMLHttpRequest,
11343       user = null,
11344       password = null,
11345       response,
11346       responseType,
11347       timeout = 0;
11348
11349   // If IE does not support CORS, use XDomainRequest.
11350   if (typeof XDomainRequest !== "undefined"
11351       && !("withCredentials" in xhr)
11352       && /^(http(s)?:)?\/\//.test(url)) xhr = new XDomainRequest;
11353
11354   "onload" in xhr
11355       ? xhr.onload = xhr.onerror = xhr.ontimeout = respond
11356       : xhr.onreadystatechange = function(o) { xhr.readyState > 3 && respond(o); };
11357
11358   function respond(o) {
11359     var status = xhr.status, result;
11360     if (!status && hasResponse(xhr)
11361         || status >= 200 && status < 300
11362         || status === 304) {
11363       if (response) {
11364         try {
11365           result = response.call(request, xhr);
11366         } catch (e) {
11367           event.call("error", request, e);
11368           return;
11369         }
11370       } else {
11371         result = xhr;
11372       }
11373       event.call("load", request, result);
11374     } else {
11375       event.call("error", request, o);
11376     }
11377   }
11378
11379   xhr.onprogress = function(e) {
11380     event.call("progress", request, e);
11381   };
11382
11383   request = {
11384     header: function(name, value) {
11385       name = (name + "").toLowerCase();
11386       if (arguments.length < 2) return headers.get(name);
11387       if (value == null) headers.remove(name);
11388       else headers.set(name, value + "");
11389       return request;
11390     },
11391
11392     // If mimeType is non-null and no Accept header is set, a default is used.
11393     mimeType: function(value) {
11394       if (!arguments.length) return mimeType;
11395       mimeType = value == null ? null : value + "";
11396       return request;
11397     },
11398
11399     // Specifies what type the response value should take;
11400     // for instance, arraybuffer, blob, document, or text.
11401     responseType: function(value) {
11402       if (!arguments.length) return responseType;
11403       responseType = value;
11404       return request;
11405     },
11406
11407     timeout: function(value) {
11408       if (!arguments.length) return timeout;
11409       timeout = +value;
11410       return request;
11411     },
11412
11413     user: function(value) {
11414       return arguments.length < 1 ? user : (user = value == null ? null : value + "", request);
11415     },
11416
11417     password: function(value) {
11418       return arguments.length < 1 ? password : (password = value == null ? null : value + "", request);
11419     },
11420
11421     // Specify how to convert the response content to a specific type;
11422     // changes the callback value on "load" events.
11423     response: function(value) {
11424       response = value;
11425       return request;
11426     },
11427
11428     // Alias for send("GET", …).
11429     get: function(data, callback) {
11430       return request.send("GET", data, callback);
11431     },
11432
11433     // Alias for send("POST", …).
11434     post: function(data, callback) {
11435       return request.send("POST", data, callback);
11436     },
11437
11438     // If callback is non-null, it will be used for error and load events.
11439     send: function(method, data, callback) {
11440       xhr.open(method, url, true, user, password);
11441       if (mimeType != null && !headers.has("accept")) headers.set("accept", mimeType + ",*/*");
11442       if (xhr.setRequestHeader) headers.each(function(value, name) { xhr.setRequestHeader(name, value); });
11443       if (mimeType != null && xhr.overrideMimeType) xhr.overrideMimeType(mimeType);
11444       if (responseType != null) xhr.responseType = responseType;
11445       if (timeout > 0) xhr.timeout = timeout;
11446       if (callback == null && typeof data === "function") callback = data, data = null;
11447       if (callback != null && callback.length === 1) callback = fixCallback(callback);
11448       if (callback != null) request.on("error", callback).on("load", function(xhr) { callback(null, xhr); });
11449       event.call("beforesend", request, xhr);
11450       xhr.send(data == null ? null : data);
11451       return request;
11452     },
11453
11454     abort: function() {
11455       xhr.abort();
11456       return request;
11457     },
11458
11459     on: function() {
11460       var value = event.on.apply(event, arguments);
11461       return value === event ? request : value;
11462     }
11463   };
11464
11465   if (callback != null) {
11466     if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11467     return request.get(callback);
11468   }
11469
11470   return request;
11471 }
11472
11473 function fixCallback(callback) {
11474   return function(error, xhr) {
11475     callback(error == null ? xhr : null);
11476   };
11477 }
11478
11479 function hasResponse(xhr) {
11480   var type = xhr.responseType;
11481   return type && type !== "text"
11482       ? xhr.response // null on error
11483       : xhr.responseText; // "" on error
11484 }
11485
11486 function type$1(defaultMimeType, response) {
11487   return function(url, callback) {
11488     var r = d3_request(url).mimeType(defaultMimeType).response(response);
11489     if (callback != null) {
11490       if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11491       return r.get(callback);
11492     }
11493     return r;
11494   };
11495 }
11496
11497 var html = type$1("text/html", function(xhr) {
11498   return document.createRange().createContextualFragment(xhr.responseText);
11499 });
11500
11501 var d3_json = type$1("application/json", function(xhr) {
11502   return JSON.parse(xhr.responseText);
11503 });
11504
11505 var d3_text = type$1("text/plain", function(xhr) {
11506   return xhr.responseText;
11507 });
11508
11509 var d3_xml = type$1("application/xml", function(xhr) {
11510   var xml = xhr.responseXML;
11511   if (!xml) throw new Error("parse error");
11512   return xml;
11513 });
11514
11515 function dsv$1(defaultMimeType, parse) {
11516   return function(url, row, callback) {
11517     if (arguments.length < 3) callback = row, row = null;
11518     var r = d3_request(url).mimeType(defaultMimeType);
11519     r.row = function(_) { return arguments.length ? r.response(responseOf(parse, row = _)) : row; };
11520     r.row(row);
11521     return callback ? r.get(callback) : r;
11522   };
11523 }
11524
11525 function responseOf(parse, row) {
11526   return function(request) {
11527     return parse(request.responseText, row);
11528   };
11529 }
11530
11531 var csv$1 = dsv$1("text/csv", csvParse);
11532
11533 var tsv$1 = dsv$1("text/tab-separated-values", tsvParse);
11534
11535 var array$2 = Array.prototype;
11536
11537 var map$2 = array$2.map;
11538 var slice$5 = array$2.slice;
11539
11540 var implicit = {name: "implicit"};
11541
11542 function ordinal(range) {
11543   var index = map$1(),
11544       domain = [],
11545       unknown = implicit;
11546
11547   range = range == null ? [] : slice$5.call(range);
11548
11549   function scale(d) {
11550     var key = d + "", i = index.get(key);
11551     if (!i) {
11552       if (unknown !== implicit) return unknown;
11553       index.set(key, i = domain.push(d));
11554     }
11555     return range[(i - 1) % range.length];
11556   }
11557
11558   scale.domain = function(_) {
11559     if (!arguments.length) return domain.slice();
11560     domain = [], index = map$1();
11561     var i = -1, n = _.length, d, key;
11562     while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));
11563     return scale;
11564   };
11565
11566   scale.range = function(_) {
11567     return arguments.length ? (range = slice$5.call(_), scale) : range.slice();
11568   };
11569
11570   scale.unknown = function(_) {
11571     return arguments.length ? (unknown = _, scale) : unknown;
11572   };
11573
11574   scale.copy = function() {
11575     return ordinal()
11576         .domain(domain)
11577         .range(range)
11578         .unknown(unknown);
11579   };
11580
11581   return scale;
11582 }
11583
11584 function band() {
11585   var scale = ordinal().unknown(undefined),
11586       domain = scale.domain,
11587       ordinalRange = scale.range,
11588       range$$1 = [0, 1],
11589       step,
11590       bandwidth,
11591       round = false,
11592       paddingInner = 0,
11593       paddingOuter = 0,
11594       align = 0.5;
11595
11596   delete scale.unknown;
11597
11598   function rescale() {
11599     var n = domain().length,
11600         reverse = range$$1[1] < range$$1[0],
11601         start = range$$1[reverse - 0],
11602         stop = range$$1[1 - reverse];
11603     step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
11604     if (round) step = Math.floor(step);
11605     start += (stop - start - step * (n - paddingInner)) * align;
11606     bandwidth = step * (1 - paddingInner);
11607     if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
11608     var values = d3_range(n).map(function(i) { return start + step * i; });
11609     return ordinalRange(reverse ? values.reverse() : values);
11610   }
11611
11612   scale.domain = function(_) {
11613     return arguments.length ? (domain(_), rescale()) : domain();
11614   };
11615
11616   scale.range = function(_) {
11617     return arguments.length ? (range$$1 = [+_[0], +_[1]], rescale()) : range$$1.slice();
11618   };
11619
11620   scale.rangeRound = function(_) {
11621     return range$$1 = [+_[0], +_[1]], round = true, rescale();
11622   };
11623
11624   scale.bandwidth = function() {
11625     return bandwidth;
11626   };
11627
11628   scale.step = function() {
11629     return step;
11630   };
11631
11632   scale.round = function(_) {
11633     return arguments.length ? (round = !!_, rescale()) : round;
11634   };
11635
11636   scale.padding = function(_) {
11637     return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11638   };
11639
11640   scale.paddingInner = function(_) {
11641     return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11642   };
11643
11644   scale.paddingOuter = function(_) {
11645     return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;
11646   };
11647
11648   scale.align = function(_) {
11649     return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
11650   };
11651
11652   scale.copy = function() {
11653     return band()
11654         .domain(domain())
11655         .range(range$$1)
11656         .round(round)
11657         .paddingInner(paddingInner)
11658         .paddingOuter(paddingOuter)
11659         .align(align);
11660   };
11661
11662   return rescale();
11663 }
11664
11665 function pointish(scale) {
11666   var copy = scale.copy;
11667
11668   scale.padding = scale.paddingOuter;
11669   delete scale.paddingInner;
11670   delete scale.paddingOuter;
11671
11672   scale.copy = function() {
11673     return pointish(copy());
11674   };
11675
11676   return scale;
11677 }
11678
11679 function point$1() {
11680   return pointish(band().paddingInner(1));
11681 }
11682
11683 function constant$9(x) {
11684   return function() {
11685     return x;
11686   };
11687 }
11688
11689 function number$2(x) {
11690   return +x;
11691 }
11692
11693 var unit = [0, 1];
11694
11695 function deinterpolateLinear(a, b) {
11696   return (b -= (a = +a))
11697       ? function(x) { return (x - a) / b; }
11698       : constant$9(b);
11699 }
11700
11701 function deinterpolateClamp(deinterpolate) {
11702   return function(a, b) {
11703     var d = deinterpolate(a = +a, b = +b);
11704     return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); };
11705   };
11706 }
11707
11708 function reinterpolateClamp(reinterpolate) {
11709   return function(a, b) {
11710     var r = reinterpolate(a = +a, b = +b);
11711     return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); };
11712   };
11713 }
11714
11715 function bimap(domain, range, deinterpolate, reinterpolate) {
11716   var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
11717   if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0);
11718   else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1);
11719   return function(x) { return r0(d0(x)); };
11720 }
11721
11722 function polymap(domain, range, deinterpolate, reinterpolate) {
11723   var j = Math.min(domain.length, range.length) - 1,
11724       d = new Array(j),
11725       r = new Array(j),
11726       i = -1;
11727
11728   // Reverse descending domains.
11729   if (domain[j] < domain[0]) {
11730     domain = domain.slice().reverse();
11731     range = range.slice().reverse();
11732   }
11733
11734   while (++i < j) {
11735     d[i] = deinterpolate(domain[i], domain[i + 1]);
11736     r[i] = reinterpolate(range[i], range[i + 1]);
11737   }
11738
11739   return function(x) {
11740     var i = bisectRight(domain, x, 1, j) - 1;
11741     return r[i](d[i](x));
11742   };
11743 }
11744
11745 function copy(source, target) {
11746   return target
11747       .domain(source.domain())
11748       .range(source.range())
11749       .interpolate(source.interpolate())
11750       .clamp(source.clamp());
11751 }
11752
11753 // deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
11754 // reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b].
11755 function continuous(deinterpolate, reinterpolate) {
11756   var domain = unit,
11757       range = unit,
11758       interpolate$$1 = d3_interpolate,
11759       clamp = false,
11760       piecewise,
11761       output,
11762       input;
11763
11764   function rescale() {
11765     piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;
11766     output = input = null;
11767     return scale;
11768   }
11769
11770   function scale(x) {
11771     return (output || (output = piecewise(domain, range, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate$$1)))(+x);
11772   }
11773
11774   scale.invert = function(y) {
11775     return (input || (input = piecewise(range, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);
11776   };
11777
11778   scale.domain = function(_) {
11779     return arguments.length ? (domain = map$2.call(_, number$2), rescale()) : domain.slice();
11780   };
11781
11782   scale.range = function(_) {
11783     return arguments.length ? (range = slice$5.call(_), rescale()) : range.slice();
11784   };
11785
11786   scale.rangeRound = function(_) {
11787     return range = slice$5.call(_), interpolate$$1 = interpolateRound, rescale();
11788   };
11789
11790   scale.clamp = function(_) {
11791     return arguments.length ? (clamp = !!_, rescale()) : clamp;
11792   };
11793
11794   scale.interpolate = function(_) {
11795     return arguments.length ? (interpolate$$1 = _, rescale()) : interpolate$$1;
11796   };
11797
11798   return rescale();
11799 }
11800
11801 function tickFormat(domain, count, specifier) {
11802   var start = domain[0],
11803       stop = domain[domain.length - 1],
11804       step = tickStep(start, stop, count == null ? 10 : count),
11805       precision;
11806   specifier = formatSpecifier(specifier == null ? ",f" : specifier);
11807   switch (specifier.type) {
11808     case "s": {
11809       var value = Math.max(Math.abs(start), Math.abs(stop));
11810       if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;
11811       return formatPrefix(specifier, value);
11812     }
11813     case "":
11814     case "e":
11815     case "g":
11816     case "p":
11817     case "r": {
11818       if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
11819       break;
11820     }
11821     case "f":
11822     case "%": {
11823       if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
11824       break;
11825     }
11826   }
11827   return format(specifier);
11828 }
11829
11830 function linearish(scale) {
11831   var domain = scale.domain;
11832
11833   scale.ticks = function(count) {
11834     var d = domain();
11835     return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
11836   };
11837
11838   scale.tickFormat = function(count, specifier) {
11839     return tickFormat(domain(), count, specifier);
11840   };
11841
11842   scale.nice = function(count) {
11843     if (count == null) count = 10;
11844
11845     var d = domain(),
11846         i0 = 0,
11847         i1 = d.length - 1,
11848         start = d[i0],
11849         stop = d[i1],
11850         step;
11851
11852     if (stop < start) {
11853       step = start, start = stop, stop = step;
11854       step = i0, i0 = i1, i1 = step;
11855     }
11856
11857     step = tickIncrement(start, stop, count);
11858
11859     if (step > 0) {
11860       start = Math.floor(start / step) * step;
11861       stop = Math.ceil(stop / step) * step;
11862       step = tickIncrement(start, stop, count);
11863     } else if (step < 0) {
11864       start = Math.ceil(start * step) / step;
11865       stop = Math.floor(stop * step) / step;
11866       step = tickIncrement(start, stop, count);
11867     }
11868
11869     if (step > 0) {
11870       d[i0] = Math.floor(start / step) * step;
11871       d[i1] = Math.ceil(stop / step) * step;
11872       domain(d);
11873     } else if (step < 0) {
11874       d[i0] = Math.ceil(start * step) / step;
11875       d[i1] = Math.floor(stop * step) / step;
11876       domain(d);
11877     }
11878
11879     return scale;
11880   };
11881
11882   return scale;
11883 }
11884
11885 function linear$2() {
11886   var scale = continuous(deinterpolateLinear, d3_interpolateNumber);
11887
11888   scale.copy = function() {
11889     return copy(scale, linear$2());
11890   };
11891
11892   return linearish(scale);
11893 }
11894
11895 function identity$5() {
11896   var domain = [0, 1];
11897
11898   function scale(x) {
11899     return +x;
11900   }
11901
11902   scale.invert = scale;
11903
11904   scale.domain = scale.range = function(_) {
11905     return arguments.length ? (domain = map$2.call(_, number$2), scale) : domain.slice();
11906   };
11907
11908   scale.copy = function() {
11909     return identity$5().domain(domain);
11910   };
11911
11912   return linearish(scale);
11913 }
11914
11915 function nice(domain, interval) {
11916   domain = domain.slice();
11917
11918   var i0 = 0,
11919       i1 = domain.length - 1,
11920       x0 = domain[i0],
11921       x1 = domain[i1],
11922       t;
11923
11924   if (x1 < x0) {
11925     t = i0, i0 = i1, i1 = t;
11926     t = x0, x0 = x1, x1 = t;
11927   }
11928
11929   domain[i0] = interval.floor(x0);
11930   domain[i1] = interval.ceil(x1);
11931   return domain;
11932 }
11933
11934 function deinterpolate(a, b) {
11935   return (b = Math.log(b / a))
11936       ? function(x) { return Math.log(x / a) / b; }
11937       : constant$9(b);
11938 }
11939
11940 function reinterpolate(a, b) {
11941   return a < 0
11942       ? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); }
11943       : function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); };
11944 }
11945
11946 function pow10(x) {
11947   return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
11948 }
11949
11950 function powp(base) {
11951   return base === 10 ? pow10
11952       : base === Math.E ? Math.exp
11953       : function(x) { return Math.pow(base, x); };
11954 }
11955
11956 function logp(base) {
11957   return base === Math.E ? Math.log
11958       : base === 10 && Math.log10
11959       || base === 2 && Math.log2
11960       || (base = Math.log(base), function(x) { return Math.log(x) / base; });
11961 }
11962
11963 function reflect(f) {
11964   return function(x) {
11965     return -f(-x);
11966   };
11967 }
11968
11969 function log$1() {
11970   var scale = continuous(deinterpolate, reinterpolate).domain([1, 10]),
11971       domain = scale.domain,
11972       base = 10,
11973       logs = logp(10),
11974       pows = powp(10);
11975
11976   function rescale() {
11977     logs = logp(base), pows = powp(base);
11978     if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows);
11979     return scale;
11980   }
11981
11982   scale.base = function(_) {
11983     return arguments.length ? (base = +_, rescale()) : base;
11984   };
11985
11986   scale.domain = function(_) {
11987     return arguments.length ? (domain(_), rescale()) : domain();
11988   };
11989
11990   scale.ticks = function(count) {
11991     var d = domain(),
11992         u = d[0],
11993         v = d[d.length - 1],
11994         r;
11995
11996     if (r = v < u) i = u, u = v, v = i;
11997
11998     var i = logs(u),
11999         j = logs(v),
12000         p,
12001         k,
12002         t,
12003         n = count == null ? 10 : +count,
12004         z = [];
12005
12006     if (!(base % 1) && j - i < n) {
12007       i = Math.round(i) - 1, j = Math.round(j) + 1;
12008       if (u > 0) for (; i < j; ++i) {
12009         for (k = 1, p = pows(i); k < base; ++k) {
12010           t = p * k;
12011           if (t < u) continue;
12012           if (t > v) break;
12013           z.push(t);
12014         }
12015       } else for (; i < j; ++i) {
12016         for (k = base - 1, p = pows(i); k >= 1; --k) {
12017           t = p * k;
12018           if (t < u) continue;
12019           if (t > v) break;
12020           z.push(t);
12021         }
12022       }
12023     } else {
12024       z = ticks(i, j, Math.min(j - i, n)).map(pows);
12025     }
12026
12027     return r ? z.reverse() : z;
12028   };
12029
12030   scale.tickFormat = function(count, specifier) {
12031     if (specifier == null) specifier = base === 10 ? ".0e" : ",";
12032     if (typeof specifier !== "function") specifier = format(specifier);
12033     if (count === Infinity) return specifier;
12034     if (count == null) count = 10;
12035     var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?
12036     return function(d) {
12037       var i = d / pows(Math.round(logs(d)));
12038       if (i * base < base - 0.5) i *= base;
12039       return i <= k ? specifier(d) : "";
12040     };
12041   };
12042
12043   scale.nice = function() {
12044     return domain(nice(domain(), {
12045       floor: function(x) { return pows(Math.floor(logs(x))); },
12046       ceil: function(x) { return pows(Math.ceil(logs(x))); }
12047     }));
12048   };
12049
12050   scale.copy = function() {
12051     return copy(scale, log$1().base(base));
12052   };
12053
12054   return scale;
12055 }
12056
12057 function raise$1(x, exponent) {
12058   return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
12059 }
12060
12061 function pow$1() {
12062   var exponent = 1,
12063       scale = continuous(deinterpolate, reinterpolate),
12064       domain = scale.domain;
12065
12066   function deinterpolate(a, b) {
12067     return (b = raise$1(b, exponent) - (a = raise$1(a, exponent)))
12068         ? function(x) { return (raise$1(x, exponent) - a) / b; }
12069         : constant$9(b);
12070   }
12071
12072   function reinterpolate(a, b) {
12073     b = raise$1(b, exponent) - (a = raise$1(a, exponent));
12074     return function(t) { return raise$1(a + b * t, 1 / exponent); };
12075   }
12076
12077   scale.exponent = function(_) {
12078     return arguments.length ? (exponent = +_, domain(domain())) : exponent;
12079   };
12080
12081   scale.copy = function() {
12082     return copy(scale, pow$1().exponent(exponent));
12083   };
12084
12085   return linearish(scale);
12086 }
12087
12088 function sqrt$1() {
12089   return pow$1().exponent(0.5);
12090 }
12091
12092 function quantile$$1() {
12093   var domain = [],
12094       range = [],
12095       thresholds = [];
12096
12097   function rescale() {
12098     var i = 0, n = Math.max(1, range.length);
12099     thresholds = new Array(n - 1);
12100     while (++i < n) thresholds[i - 1] = threshold(domain, i / n);
12101     return scale;
12102   }
12103
12104   function scale(x) {
12105     if (!isNaN(x = +x)) return range[bisectRight(thresholds, x)];
12106   }
12107
12108   scale.invertExtent = function(y) {
12109     var i = range.indexOf(y);
12110     return i < 0 ? [NaN, NaN] : [
12111       i > 0 ? thresholds[i - 1] : domain[0],
12112       i < thresholds.length ? thresholds[i] : domain[domain.length - 1]
12113     ];
12114   };
12115
12116   scale.domain = function(_) {
12117     if (!arguments.length) return domain.slice();
12118     domain = [];
12119     for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
12120     domain.sort(d3_ascending);
12121     return rescale();
12122   };
12123
12124   scale.range = function(_) {
12125     return arguments.length ? (range = slice$5.call(_), rescale()) : range.slice();
12126   };
12127
12128   scale.quantiles = function() {
12129     return thresholds.slice();
12130   };
12131
12132   scale.copy = function() {
12133     return quantile$$1()
12134         .domain(domain)
12135         .range(range);
12136   };
12137
12138   return scale;
12139 }
12140
12141 function quantize() {
12142   var x0 = 0,
12143       x1 = 1,
12144       n = 1,
12145       domain = [0.5],
12146       range = [0, 1];
12147
12148   function scale(x) {
12149     if (x <= x) return range[bisectRight(domain, x, 0, n)];
12150   }
12151
12152   function rescale() {
12153     var i = -1;
12154     domain = new Array(n);
12155     while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
12156     return scale;
12157   }
12158
12159   scale.domain = function(_) {
12160     return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
12161   };
12162
12163   scale.range = function(_) {
12164     return arguments.length ? (n = (range = slice$5.call(_)).length - 1, rescale()) : range.slice();
12165   };
12166
12167   scale.invertExtent = function(y) {
12168     var i = range.indexOf(y);
12169     return i < 0 ? [NaN, NaN]
12170         : i < 1 ? [x0, domain[0]]
12171         : i >= n ? [domain[n - 1], x1]
12172         : [domain[i - 1], domain[i]];
12173   };
12174
12175   scale.copy = function() {
12176     return quantize()
12177         .domain([x0, x1])
12178         .range(range);
12179   };
12180
12181   return linearish(scale);
12182 }
12183
12184 function threshold$1() {
12185   var domain = [0.5],
12186       range = [0, 1],
12187       n = 1;
12188
12189   function scale(x) {
12190     if (x <= x) return range[bisectRight(domain, x, 0, n)];
12191   }
12192
12193   scale.domain = function(_) {
12194     return arguments.length ? (domain = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();
12195   };
12196
12197   scale.range = function(_) {
12198     return arguments.length ? (range = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();
12199   };
12200
12201   scale.invertExtent = function(y) {
12202     var i = range.indexOf(y);
12203     return [domain[i - 1], domain[i]];
12204   };
12205
12206   scale.copy = function() {
12207     return threshold$1()
12208         .domain(domain)
12209         .range(range);
12210   };
12211
12212   return scale;
12213 }
12214
12215 var t0$1 = new Date,
12216     t1$1 = new Date;
12217
12218 function newInterval(floori, offseti, count, field) {
12219
12220   function interval(date) {
12221     return floori(date = new Date(+date)), date;
12222   }
12223
12224   interval.floor = interval;
12225
12226   interval.ceil = function(date) {
12227     return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
12228   };
12229
12230   interval.round = function(date) {
12231     var d0 = interval(date),
12232         d1 = interval.ceil(date);
12233     return date - d0 < d1 - date ? d0 : d1;
12234   };
12235
12236   interval.offset = function(date, step) {
12237     return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;
12238   };
12239
12240   interval.range = function(start, stop, step) {
12241     var range = [], previous;
12242     start = interval.ceil(start);
12243     step = step == null ? 1 : Math.floor(step);
12244     if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date
12245     do range.push(previous = new Date(+start)), offseti(start, step), floori(start);
12246     while (previous < start && start < stop);
12247     return range;
12248   };
12249
12250   interval.filter = function(test) {
12251     return newInterval(function(date) {
12252       if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);
12253     }, function(date, step) {
12254       if (date >= date) {
12255         if (step < 0) while (++step <= 0) {
12256           while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty
12257         } else while (--step >= 0) {
12258           while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty
12259         }
12260       }
12261     });
12262   };
12263
12264   if (count) {
12265     interval.count = function(start, end) {
12266       t0$1.setTime(+start), t1$1.setTime(+end);
12267       floori(t0$1), floori(t1$1);
12268       return Math.floor(count(t0$1, t1$1));
12269     };
12270
12271     interval.every = function(step) {
12272       step = Math.floor(step);
12273       return !isFinite(step) || !(step > 0) ? null
12274           : !(step > 1) ? interval
12275           : interval.filter(field
12276               ? function(d) { return field(d) % step === 0; }
12277               : function(d) { return interval.count(0, d) % step === 0; });
12278     };
12279   }
12280
12281   return interval;
12282 }
12283
12284 var millisecond = newInterval(function() {
12285   // noop
12286 }, function(date, step) {
12287   date.setTime(+date + step);
12288 }, function(start, end) {
12289   return end - start;
12290 });
12291
12292 // An optimized implementation for this simple case.
12293 millisecond.every = function(k) {
12294   k = Math.floor(k);
12295   if (!isFinite(k) || !(k > 0)) return null;
12296   if (!(k > 1)) return millisecond;
12297   return newInterval(function(date) {
12298     date.setTime(Math.floor(date / k) * k);
12299   }, function(date, step) {
12300     date.setTime(+date + step * k);
12301   }, function(start, end) {
12302     return (end - start) / k;
12303   });
12304 };
12305 var milliseconds = millisecond.range;
12306
12307 var durationSecond = 1e3;
12308 var durationMinute = 6e4;
12309 var durationHour = 36e5;
12310 var durationDay = 864e5;
12311 var durationWeek = 6048e5;
12312
12313 var second = newInterval(function(date) {
12314   date.setTime(Math.floor(date / durationSecond) * durationSecond);
12315 }, function(date, step) {
12316   date.setTime(+date + step * durationSecond);
12317 }, function(start, end) {
12318   return (end - start) / durationSecond;
12319 }, function(date) {
12320   return date.getUTCSeconds();
12321 });
12322 var seconds = second.range;
12323
12324 var minute = newInterval(function(date) {
12325   date.setTime(Math.floor(date / durationMinute) * durationMinute);
12326 }, function(date, step) {
12327   date.setTime(+date + step * durationMinute);
12328 }, function(start, end) {
12329   return (end - start) / durationMinute;
12330 }, function(date) {
12331   return date.getMinutes();
12332 });
12333 var minutes = minute.range;
12334
12335 var hour = newInterval(function(date) {
12336   var offset = date.getTimezoneOffset() * durationMinute % durationHour;
12337   if (offset < 0) offset += durationHour;
12338   date.setTime(Math.floor((+date - offset) / durationHour) * durationHour + offset);
12339 }, function(date, step) {
12340   date.setTime(+date + step * durationHour);
12341 }, function(start, end) {
12342   return (end - start) / durationHour;
12343 }, function(date) {
12344   return date.getHours();
12345 });
12346 var hours = hour.range;
12347
12348 var day = newInterval(function(date) {
12349   date.setHours(0, 0, 0, 0);
12350 }, function(date, step) {
12351   date.setDate(date.getDate() + step);
12352 }, function(start, end) {
12353   return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;
12354 }, function(date) {
12355   return date.getDate() - 1;
12356 });
12357 var days = day.range;
12358
12359 function weekday(i) {
12360   return newInterval(function(date) {
12361     date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);
12362     date.setHours(0, 0, 0, 0);
12363   }, function(date, step) {
12364     date.setDate(date.getDate() + step * 7);
12365   }, function(start, end) {
12366     return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;
12367   });
12368 }
12369
12370 var sunday = weekday(0);
12371 var monday = weekday(1);
12372 var tuesday = weekday(2);
12373 var wednesday = weekday(3);
12374 var thursday = weekday(4);
12375 var friday = weekday(5);
12376 var saturday = weekday(6);
12377
12378 var sundays = sunday.range;
12379 var mondays = monday.range;
12380 var tuesdays = tuesday.range;
12381 var wednesdays = wednesday.range;
12382 var thursdays = thursday.range;
12383 var fridays = friday.range;
12384 var saturdays = saturday.range;
12385
12386 var month = newInterval(function(date) {
12387   date.setDate(1);
12388   date.setHours(0, 0, 0, 0);
12389 }, function(date, step) {
12390   date.setMonth(date.getMonth() + step);
12391 }, function(start, end) {
12392   return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;
12393 }, function(date) {
12394   return date.getMonth();
12395 });
12396 var months = month.range;
12397
12398 var year = newInterval(function(date) {
12399   date.setMonth(0, 1);
12400   date.setHours(0, 0, 0, 0);
12401 }, function(date, step) {
12402   date.setFullYear(date.getFullYear() + step);
12403 }, function(start, end) {
12404   return end.getFullYear() - start.getFullYear();
12405 }, function(date) {
12406   return date.getFullYear();
12407 });
12408
12409 // An optimized implementation for this simple case.
12410 year.every = function(k) {
12411   return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
12412     date.setFullYear(Math.floor(date.getFullYear() / k) * k);
12413     date.setMonth(0, 1);
12414     date.setHours(0, 0, 0, 0);
12415   }, function(date, step) {
12416     date.setFullYear(date.getFullYear() + step * k);
12417   });
12418 };
12419 var years = year.range;
12420
12421 var utcMinute = newInterval(function(date) {
12422   date.setUTCSeconds(0, 0);
12423 }, function(date, step) {
12424   date.setTime(+date + step * durationMinute);
12425 }, function(start, end) {
12426   return (end - start) / durationMinute;
12427 }, function(date) {
12428   return date.getUTCMinutes();
12429 });
12430 var utcMinutes = utcMinute.range;
12431
12432 var utcHour = newInterval(function(date) {
12433   date.setUTCMinutes(0, 0, 0);
12434 }, function(date, step) {
12435   date.setTime(+date + step * durationHour);
12436 }, function(start, end) {
12437   return (end - start) / durationHour;
12438 }, function(date) {
12439   return date.getUTCHours();
12440 });
12441 var utcHours = utcHour.range;
12442
12443 var utcDay = newInterval(function(date) {
12444   date.setUTCHours(0, 0, 0, 0);
12445 }, function(date, step) {
12446   date.setUTCDate(date.getUTCDate() + step);
12447 }, function(start, end) {
12448   return (end - start) / durationDay;
12449 }, function(date) {
12450   return date.getUTCDate() - 1;
12451 });
12452 var utcDays = utcDay.range;
12453
12454 function utcWeekday(i) {
12455   return newInterval(function(date) {
12456     date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);
12457     date.setUTCHours(0, 0, 0, 0);
12458   }, function(date, step) {
12459     date.setUTCDate(date.getUTCDate() + step * 7);
12460   }, function(start, end) {
12461     return (end - start) / durationWeek;
12462   });
12463 }
12464
12465 var utcSunday = utcWeekday(0);
12466 var utcMonday = utcWeekday(1);
12467 var utcTuesday = utcWeekday(2);
12468 var utcWednesday = utcWeekday(3);
12469 var utcThursday = utcWeekday(4);
12470 var utcFriday = utcWeekday(5);
12471 var utcSaturday = utcWeekday(6);
12472
12473 var utcSundays = utcSunday.range;
12474 var utcMondays = utcMonday.range;
12475 var utcTuesdays = utcTuesday.range;
12476 var utcWednesdays = utcWednesday.range;
12477 var utcThursdays = utcThursday.range;
12478 var utcFridays = utcFriday.range;
12479 var utcSaturdays = utcSaturday.range;
12480
12481 var utcMonth = newInterval(function(date) {
12482   date.setUTCDate(1);
12483   date.setUTCHours(0, 0, 0, 0);
12484 }, function(date, step) {
12485   date.setUTCMonth(date.getUTCMonth() + step);
12486 }, function(start, end) {
12487   return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;
12488 }, function(date) {
12489   return date.getUTCMonth();
12490 });
12491 var utcMonths = utcMonth.range;
12492
12493 var utcYear = newInterval(function(date) {
12494   date.setUTCMonth(0, 1);
12495   date.setUTCHours(0, 0, 0, 0);
12496 }, function(date, step) {
12497   date.setUTCFullYear(date.getUTCFullYear() + step);
12498 }, function(start, end) {
12499   return end.getUTCFullYear() - start.getUTCFullYear();
12500 }, function(date) {
12501   return date.getUTCFullYear();
12502 });
12503
12504 // An optimized implementation for this simple case.
12505 utcYear.every = function(k) {
12506   return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
12507     date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);
12508     date.setUTCMonth(0, 1);
12509     date.setUTCHours(0, 0, 0, 0);
12510   }, function(date, step) {
12511     date.setUTCFullYear(date.getUTCFullYear() + step * k);
12512   });
12513 };
12514 var utcYears = utcYear.range;
12515
12516 function localDate(d) {
12517   if (0 <= d.y && d.y < 100) {
12518     var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
12519     date.setFullYear(d.y);
12520     return date;
12521   }
12522   return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
12523 }
12524
12525 function utcDate(d) {
12526   if (0 <= d.y && d.y < 100) {
12527     var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
12528     date.setUTCFullYear(d.y);
12529     return date;
12530   }
12531   return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
12532 }
12533
12534 function newYear(y) {
12535   return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};
12536 }
12537
12538 function formatLocale$1(locale) {
12539   var locale_dateTime = locale.dateTime,
12540       locale_date = locale.date,
12541       locale_time = locale.time,
12542       locale_periods = locale.periods,
12543       locale_weekdays = locale.days,
12544       locale_shortWeekdays = locale.shortDays,
12545       locale_months = locale.months,
12546       locale_shortMonths = locale.shortMonths;
12547
12548   var periodRe = formatRe(locale_periods),
12549       periodLookup = formatLookup(locale_periods),
12550       weekdayRe = formatRe(locale_weekdays),
12551       weekdayLookup = formatLookup(locale_weekdays),
12552       shortWeekdayRe = formatRe(locale_shortWeekdays),
12553       shortWeekdayLookup = formatLookup(locale_shortWeekdays),
12554       monthRe = formatRe(locale_months),
12555       monthLookup = formatLookup(locale_months),
12556       shortMonthRe = formatRe(locale_shortMonths),
12557       shortMonthLookup = formatLookup(locale_shortMonths);
12558
12559   var formats = {
12560     "a": formatShortWeekday,
12561     "A": formatWeekday,
12562     "b": formatShortMonth,
12563     "B": formatMonth,
12564     "c": null,
12565     "d": formatDayOfMonth,
12566     "e": formatDayOfMonth,
12567     "f": formatMicroseconds,
12568     "H": formatHour24,
12569     "I": formatHour12,
12570     "j": formatDayOfYear,
12571     "L": formatMilliseconds,
12572     "m": formatMonthNumber,
12573     "M": formatMinutes,
12574     "p": formatPeriod,
12575     "Q": formatUnixTimestamp,
12576     "s": formatUnixTimestampSeconds,
12577     "S": formatSeconds,
12578     "u": formatWeekdayNumberMonday,
12579     "U": formatWeekNumberSunday,
12580     "V": formatWeekNumberISO,
12581     "w": formatWeekdayNumberSunday,
12582     "W": formatWeekNumberMonday,
12583     "x": null,
12584     "X": null,
12585     "y": formatYear,
12586     "Y": formatFullYear,
12587     "Z": formatZone,
12588     "%": formatLiteralPercent
12589   };
12590
12591   var utcFormats = {
12592     "a": formatUTCShortWeekday,
12593     "A": formatUTCWeekday,
12594     "b": formatUTCShortMonth,
12595     "B": formatUTCMonth,
12596     "c": null,
12597     "d": formatUTCDayOfMonth,
12598     "e": formatUTCDayOfMonth,
12599     "f": formatUTCMicroseconds,
12600     "H": formatUTCHour24,
12601     "I": formatUTCHour12,
12602     "j": formatUTCDayOfYear,
12603     "L": formatUTCMilliseconds,
12604     "m": formatUTCMonthNumber,
12605     "M": formatUTCMinutes,
12606     "p": formatUTCPeriod,
12607     "Q": formatUnixTimestamp,
12608     "s": formatUnixTimestampSeconds,
12609     "S": formatUTCSeconds,
12610     "u": formatUTCWeekdayNumberMonday,
12611     "U": formatUTCWeekNumberSunday,
12612     "V": formatUTCWeekNumberISO,
12613     "w": formatUTCWeekdayNumberSunday,
12614     "W": formatUTCWeekNumberMonday,
12615     "x": null,
12616     "X": null,
12617     "y": formatUTCYear,
12618     "Y": formatUTCFullYear,
12619     "Z": formatUTCZone,
12620     "%": formatLiteralPercent
12621   };
12622
12623   var parses = {
12624     "a": parseShortWeekday,
12625     "A": parseWeekday,
12626     "b": parseShortMonth,
12627     "B": parseMonth,
12628     "c": parseLocaleDateTime,
12629     "d": parseDayOfMonth,
12630     "e": parseDayOfMonth,
12631     "f": parseMicroseconds,
12632     "H": parseHour24,
12633     "I": parseHour24,
12634     "j": parseDayOfYear,
12635     "L": parseMilliseconds,
12636     "m": parseMonthNumber,
12637     "M": parseMinutes,
12638     "p": parsePeriod,
12639     "Q": parseUnixTimestamp,
12640     "s": parseUnixTimestampSeconds,
12641     "S": parseSeconds,
12642     "u": parseWeekdayNumberMonday,
12643     "U": parseWeekNumberSunday,
12644     "V": parseWeekNumberISO,
12645     "w": parseWeekdayNumberSunday,
12646     "W": parseWeekNumberMonday,
12647     "x": parseLocaleDate,
12648     "X": parseLocaleTime,
12649     "y": parseYear,
12650     "Y": parseFullYear,
12651     "Z": parseZone,
12652     "%": parseLiteralPercent
12653   };
12654
12655   // These recursive directive definitions must be deferred.
12656   formats.x = newFormat(locale_date, formats);
12657   formats.X = newFormat(locale_time, formats);
12658   formats.c = newFormat(locale_dateTime, formats);
12659   utcFormats.x = newFormat(locale_date, utcFormats);
12660   utcFormats.X = newFormat(locale_time, utcFormats);
12661   utcFormats.c = newFormat(locale_dateTime, utcFormats);
12662
12663   function newFormat(specifier, formats) {
12664     return function(date) {
12665       var string = [],
12666           i = -1,
12667           j = 0,
12668           n = specifier.length,
12669           c,
12670           pad,
12671           format;
12672
12673       if (!(date instanceof Date)) date = new Date(+date);
12674
12675       while (++i < n) {
12676         if (specifier.charCodeAt(i) === 37) {
12677           string.push(specifier.slice(j, i));
12678           if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);
12679           else pad = c === "e" ? " " : "0";
12680           if (format = formats[c]) c = format(date, pad);
12681           string.push(c);
12682           j = i + 1;
12683         }
12684       }
12685
12686       string.push(specifier.slice(j, i));
12687       return string.join("");
12688     };
12689   }
12690
12691   function newParse(specifier, newDate) {
12692     return function(string) {
12693       var d = newYear(1900),
12694           i = parseSpecifier(d, specifier, string += "", 0),
12695           week, day$$1;
12696       if (i != string.length) return null;
12697
12698       // If a UNIX timestamp is specified, return it.
12699       if ("Q" in d) return new Date(d.Q);
12700
12701       // The am-pm flag is 0 for AM, and 1 for PM.
12702       if ("p" in d) d.H = d.H % 12 + d.p * 12;
12703
12704       // Convert day-of-week and week-of-year to day-of-year.
12705       if ("V" in d) {
12706         if (d.V < 1 || d.V > 53) return null;
12707         if (!("w" in d)) d.w = 1;
12708         if ("Z" in d) {
12709           week = utcDate(newYear(d.y)), day$$1 = week.getUTCDay();
12710           week = day$$1 > 4 || day$$1 === 0 ? utcMonday.ceil(week) : utcMonday(week);
12711           week = utcDay.offset(week, (d.V - 1) * 7);
12712           d.y = week.getUTCFullYear();
12713           d.m = week.getUTCMonth();
12714           d.d = week.getUTCDate() + (d.w + 6) % 7;
12715         } else {
12716           week = newDate(newYear(d.y)), day$$1 = week.getDay();
12717           week = day$$1 > 4 || day$$1 === 0 ? monday.ceil(week) : monday(week);
12718           week = day.offset(week, (d.V - 1) * 7);
12719           d.y = week.getFullYear();
12720           d.m = week.getMonth();
12721           d.d = week.getDate() + (d.w + 6) % 7;
12722         }
12723       } else if ("W" in d || "U" in d) {
12724         if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0;
12725         day$$1 = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();
12726         d.m = 0;
12727         d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day$$1 + 5) % 7 : d.w + d.U * 7 - (day$$1 + 6) % 7;
12728       }
12729
12730       // If a time zone is specified, all fields are interpreted as UTC and then
12731       // offset according to the specified time zone.
12732       if ("Z" in d) {
12733         d.H += d.Z / 100 | 0;
12734         d.M += d.Z % 100;
12735         return utcDate(d);
12736       }
12737
12738       // Otherwise, all fields are in local time.
12739       return newDate(d);
12740     };
12741   }
12742
12743   function parseSpecifier(d, specifier, string, j) {
12744     var i = 0,
12745         n = specifier.length,
12746         m = string.length,
12747         c,
12748         parse;
12749
12750     while (i < n) {
12751       if (j >= m) return -1;
12752       c = specifier.charCodeAt(i++);
12753       if (c === 37) {
12754         c = specifier.charAt(i++);
12755         parse = parses[c in pads ? specifier.charAt(i++) : c];
12756         if (!parse || ((j = parse(d, string, j)) < 0)) return -1;
12757       } else if (c != string.charCodeAt(j++)) {
12758         return -1;
12759       }
12760     }
12761
12762     return j;
12763   }
12764
12765   function parsePeriod(d, string, i) {
12766     var n = periodRe.exec(string.slice(i));
12767     return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12768   }
12769
12770   function parseShortWeekday(d, string, i) {
12771     var n = shortWeekdayRe.exec(string.slice(i));
12772     return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12773   }
12774
12775   function parseWeekday(d, string, i) {
12776     var n = weekdayRe.exec(string.slice(i));
12777     return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12778   }
12779
12780   function parseShortMonth(d, string, i) {
12781     var n = shortMonthRe.exec(string.slice(i));
12782     return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12783   }
12784
12785   function parseMonth(d, string, i) {
12786     var n = monthRe.exec(string.slice(i));
12787     return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12788   }
12789
12790   function parseLocaleDateTime(d, string, i) {
12791     return parseSpecifier(d, locale_dateTime, string, i);
12792   }
12793
12794   function parseLocaleDate(d, string, i) {
12795     return parseSpecifier(d, locale_date, string, i);
12796   }
12797
12798   function parseLocaleTime(d, string, i) {
12799     return parseSpecifier(d, locale_time, string, i);
12800   }
12801
12802   function formatShortWeekday(d) {
12803     return locale_shortWeekdays[d.getDay()];
12804   }
12805
12806   function formatWeekday(d) {
12807     return locale_weekdays[d.getDay()];
12808   }
12809
12810   function formatShortMonth(d) {
12811     return locale_shortMonths[d.getMonth()];
12812   }
12813
12814   function formatMonth(d) {
12815     return locale_months[d.getMonth()];
12816   }
12817
12818   function formatPeriod(d) {
12819     return locale_periods[+(d.getHours() >= 12)];
12820   }
12821
12822   function formatUTCShortWeekday(d) {
12823     return locale_shortWeekdays[d.getUTCDay()];
12824   }
12825
12826   function formatUTCWeekday(d) {
12827     return locale_weekdays[d.getUTCDay()];
12828   }
12829
12830   function formatUTCShortMonth(d) {
12831     return locale_shortMonths[d.getUTCMonth()];
12832   }
12833
12834   function formatUTCMonth(d) {
12835     return locale_months[d.getUTCMonth()];
12836   }
12837
12838   function formatUTCPeriod(d) {
12839     return locale_periods[+(d.getUTCHours() >= 12)];
12840   }
12841
12842   return {
12843     format: function(specifier) {
12844       var f = newFormat(specifier += "", formats);
12845       f.toString = function() { return specifier; };
12846       return f;
12847     },
12848     parse: function(specifier) {
12849       var p = newParse(specifier += "", localDate);
12850       p.toString = function() { return specifier; };
12851       return p;
12852     },
12853     utcFormat: function(specifier) {
12854       var f = newFormat(specifier += "", utcFormats);
12855       f.toString = function() { return specifier; };
12856       return f;
12857     },
12858     utcParse: function(specifier) {
12859       var p = newParse(specifier, utcDate);
12860       p.toString = function() { return specifier; };
12861       return p;
12862     }
12863   };
12864 }
12865
12866 var pads = {"-": "", "_": " ", "0": "0"},
12867     numberRe = /^\s*\d+/, // note: ignores next directive
12868     percentRe = /^%/,
12869     requoteRe = /[\\^$*+?|[\]().{}]/g;
12870
12871 function pad(value, fill, width) {
12872   var sign = value < 0 ? "-" : "",
12873       string = (sign ? -value : value) + "",
12874       length = string.length;
12875   return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
12876 }
12877
12878 function requote(s) {
12879   return s.replace(requoteRe, "\\$&");
12880 }
12881
12882 function formatRe(names) {
12883   return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
12884 }
12885
12886 function formatLookup(names) {
12887   var map = {}, i = -1, n = names.length;
12888   while (++i < n) map[names[i].toLowerCase()] = i;
12889   return map;
12890 }
12891
12892 function parseWeekdayNumberSunday(d, string, i) {
12893   var n = numberRe.exec(string.slice(i, i + 1));
12894   return n ? (d.w = +n[0], i + n[0].length) : -1;
12895 }
12896
12897 function parseWeekdayNumberMonday(d, string, i) {
12898   var n = numberRe.exec(string.slice(i, i + 1));
12899   return n ? (d.u = +n[0], i + n[0].length) : -1;
12900 }
12901
12902 function parseWeekNumberSunday(d, string, i) {
12903   var n = numberRe.exec(string.slice(i, i + 2));
12904   return n ? (d.U = +n[0], i + n[0].length) : -1;
12905 }
12906
12907 function parseWeekNumberISO(d, string, i) {
12908   var n = numberRe.exec(string.slice(i, i + 2));
12909   return n ? (d.V = +n[0], i + n[0].length) : -1;
12910 }
12911
12912 function parseWeekNumberMonday(d, string, i) {
12913   var n = numberRe.exec(string.slice(i, i + 2));
12914   return n ? (d.W = +n[0], i + n[0].length) : -1;
12915 }
12916
12917 function parseFullYear(d, string, i) {
12918   var n = numberRe.exec(string.slice(i, i + 4));
12919   return n ? (d.y = +n[0], i + n[0].length) : -1;
12920 }
12921
12922 function parseYear(d, string, i) {
12923   var n = numberRe.exec(string.slice(i, i + 2));
12924   return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;
12925 }
12926
12927 function parseZone(d, string, i) {
12928   var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6));
12929   return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
12930 }
12931
12932 function parseMonthNumber(d, string, i) {
12933   var n = numberRe.exec(string.slice(i, i + 2));
12934   return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
12935 }
12936
12937 function parseDayOfMonth(d, string, i) {
12938   var n = numberRe.exec(string.slice(i, i + 2));
12939   return n ? (d.d = +n[0], i + n[0].length) : -1;
12940 }
12941
12942 function parseDayOfYear(d, string, i) {
12943   var n = numberRe.exec(string.slice(i, i + 3));
12944   return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
12945 }
12946
12947 function parseHour24(d, string, i) {
12948   var n = numberRe.exec(string.slice(i, i + 2));
12949   return n ? (d.H = +n[0], i + n[0].length) : -1;
12950 }
12951
12952 function parseMinutes(d, string, i) {
12953   var n = numberRe.exec(string.slice(i, i + 2));
12954   return n ? (d.M = +n[0], i + n[0].length) : -1;
12955 }
12956
12957 function parseSeconds(d, string, i) {
12958   var n = numberRe.exec(string.slice(i, i + 2));
12959   return n ? (d.S = +n[0], i + n[0].length) : -1;
12960 }
12961
12962 function parseMilliseconds(d, string, i) {
12963   var n = numberRe.exec(string.slice(i, i + 3));
12964   return n ? (d.L = +n[0], i + n[0].length) : -1;
12965 }
12966
12967 function parseMicroseconds(d, string, i) {
12968   var n = numberRe.exec(string.slice(i, i + 6));
12969   return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;
12970 }
12971
12972 function parseLiteralPercent(d, string, i) {
12973   var n = percentRe.exec(string.slice(i, i + 1));
12974   return n ? i + n[0].length : -1;
12975 }
12976
12977 function parseUnixTimestamp(d, string, i) {
12978   var n = numberRe.exec(string.slice(i));
12979   return n ? (d.Q = +n[0], i + n[0].length) : -1;
12980 }
12981
12982 function parseUnixTimestampSeconds(d, string, i) {
12983   var n = numberRe.exec(string.slice(i));
12984   return n ? (d.Q = (+n[0]) * 1000, i + n[0].length) : -1;
12985 }
12986
12987 function formatDayOfMonth(d, p) {
12988   return pad(d.getDate(), p, 2);
12989 }
12990
12991 function formatHour24(d, p) {
12992   return pad(d.getHours(), p, 2);
12993 }
12994
12995 function formatHour12(d, p) {
12996   return pad(d.getHours() % 12 || 12, p, 2);
12997 }
12998
12999 function formatDayOfYear(d, p) {
13000   return pad(1 + day.count(year(d), d), p, 3);
13001 }
13002
13003 function formatMilliseconds(d, p) {
13004   return pad(d.getMilliseconds(), p, 3);
13005 }
13006
13007 function formatMicroseconds(d, p) {
13008   return formatMilliseconds(d, p) + "000";
13009 }
13010
13011 function formatMonthNumber(d, p) {
13012   return pad(d.getMonth() + 1, p, 2);
13013 }
13014
13015 function formatMinutes(d, p) {
13016   return pad(d.getMinutes(), p, 2);
13017 }
13018
13019 function formatSeconds(d, p) {
13020   return pad(d.getSeconds(), p, 2);
13021 }
13022
13023 function formatWeekdayNumberMonday(d) {
13024   var day$$1 = d.getDay();
13025   return day$$1 === 0 ? 7 : day$$1;
13026 }
13027
13028 function formatWeekNumberSunday(d, p) {
13029   return pad(sunday.count(year(d), d), p, 2);
13030 }
13031
13032 function formatWeekNumberISO(d, p) {
13033   var day$$1 = d.getDay();
13034   d = (day$$1 >= 4 || day$$1 === 0) ? thursday(d) : thursday.ceil(d);
13035   return pad(thursday.count(year(d), d) + (year(d).getDay() === 4), p, 2);
13036 }
13037
13038 function formatWeekdayNumberSunday(d) {
13039   return d.getDay();
13040 }
13041
13042 function formatWeekNumberMonday(d, p) {
13043   return pad(monday.count(year(d), d), p, 2);
13044 }
13045
13046 function formatYear(d, p) {
13047   return pad(d.getFullYear() % 100, p, 2);
13048 }
13049
13050 function formatFullYear(d, p) {
13051   return pad(d.getFullYear() % 10000, p, 4);
13052 }
13053
13054 function formatZone(d) {
13055   var z = d.getTimezoneOffset();
13056   return (z > 0 ? "-" : (z *= -1, "+"))
13057       + pad(z / 60 | 0, "0", 2)
13058       + pad(z % 60, "0", 2);
13059 }
13060
13061 function formatUTCDayOfMonth(d, p) {
13062   return pad(d.getUTCDate(), p, 2);
13063 }
13064
13065 function formatUTCHour24(d, p) {
13066   return pad(d.getUTCHours(), p, 2);
13067 }
13068
13069 function formatUTCHour12(d, p) {
13070   return pad(d.getUTCHours() % 12 || 12, p, 2);
13071 }
13072
13073 function formatUTCDayOfYear(d, p) {
13074   return pad(1 + utcDay.count(utcYear(d), d), p, 3);
13075 }
13076
13077 function formatUTCMilliseconds(d, p) {
13078   return pad(d.getUTCMilliseconds(), p, 3);
13079 }
13080
13081 function formatUTCMicroseconds(d, p) {
13082   return formatUTCMilliseconds(d, p) + "000";
13083 }
13084
13085 function formatUTCMonthNumber(d, p) {
13086   return pad(d.getUTCMonth() + 1, p, 2);
13087 }
13088
13089 function formatUTCMinutes(d, p) {
13090   return pad(d.getUTCMinutes(), p, 2);
13091 }
13092
13093 function formatUTCSeconds(d, p) {
13094   return pad(d.getUTCSeconds(), p, 2);
13095 }
13096
13097 function formatUTCWeekdayNumberMonday(d) {
13098   var dow = d.getUTCDay();
13099   return dow === 0 ? 7 : dow;
13100 }
13101
13102 function formatUTCWeekNumberSunday(d, p) {
13103   return pad(utcSunday.count(utcYear(d), d), p, 2);
13104 }
13105
13106 function formatUTCWeekNumberISO(d, p) {
13107   var day$$1 = d.getUTCDay();
13108   d = (day$$1 >= 4 || day$$1 === 0) ? utcThursday(d) : utcThursday.ceil(d);
13109   return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);
13110 }
13111
13112 function formatUTCWeekdayNumberSunday(d) {
13113   return d.getUTCDay();
13114 }
13115
13116 function formatUTCWeekNumberMonday(d, p) {
13117   return pad(utcMonday.count(utcYear(d), d), p, 2);
13118 }
13119
13120 function formatUTCYear(d, p) {
13121   return pad(d.getUTCFullYear() % 100, p, 2);
13122 }
13123
13124 function formatUTCFullYear(d, p) {
13125   return pad(d.getUTCFullYear() % 10000, p, 4);
13126 }
13127
13128 function formatUTCZone() {
13129   return "+0000";
13130 }
13131
13132 function formatLiteralPercent() {
13133   return "%";
13134 }
13135
13136 function formatUnixTimestamp(d) {
13137   return +d;
13138 }
13139
13140 function formatUnixTimestampSeconds(d) {
13141   return Math.floor(+d / 1000);
13142 }
13143
13144 var locale$1;
13145 var timeFormat;
13146 var timeParse;
13147 var utcFormat;
13148 var utcParse;
13149
13150 defaultLocale$1({
13151   dateTime: "%x, %X",
13152   date: "%-m/%-d/%Y",
13153   time: "%-I:%M:%S %p",
13154   periods: ["AM", "PM"],
13155   days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
13156   shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
13157   months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
13158   shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
13159 });
13160
13161 function defaultLocale$1(definition) {
13162   locale$1 = formatLocale$1(definition);
13163   timeFormat = locale$1.format;
13164   timeParse = locale$1.parse;
13165   utcFormat = locale$1.utcFormat;
13166   utcParse = locale$1.utcParse;
13167   return locale$1;
13168 }
13169
13170 var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ";
13171
13172 function formatIsoNative(date) {
13173   return date.toISOString();
13174 }
13175
13176 var formatIso = Date.prototype.toISOString
13177     ? formatIsoNative
13178     : utcFormat(isoSpecifier);
13179
13180 function parseIsoNative(string) {
13181   var date = new Date(string);
13182   return isNaN(date) ? null : date;
13183 }
13184
13185 var parseIso = +new Date("2000-01-01T00:00:00.000Z")
13186     ? parseIsoNative
13187     : utcParse(isoSpecifier);
13188
13189 var durationSecond$1 = 1000,
13190     durationMinute$1 = durationSecond$1 * 60,
13191     durationHour$1 = durationMinute$1 * 60,
13192     durationDay$1 = durationHour$1 * 24,
13193     durationWeek$1 = durationDay$1 * 7,
13194     durationMonth = durationDay$1 * 30,
13195     durationYear = durationDay$1 * 365;
13196
13197 function date$1(t) {
13198   return new Date(t);
13199 }
13200
13201 function number$3(t) {
13202   return t instanceof Date ? +t : +new Date(+t);
13203 }
13204
13205 function calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format) {
13206   var scale = continuous(deinterpolateLinear, d3_interpolateNumber),
13207       invert = scale.invert,
13208       domain = scale.domain;
13209
13210   var formatMillisecond = format(".%L"),
13211       formatSecond = format(":%S"),
13212       formatMinute = format("%I:%M"),
13213       formatHour = format("%I %p"),
13214       formatDay = format("%a %d"),
13215       formatWeek = format("%b %d"),
13216       formatMonth = format("%B"),
13217       formatYear = format("%Y");
13218
13219   var tickIntervals = [
13220     [second$$1,  1,      durationSecond$1],
13221     [second$$1,  5,  5 * durationSecond$1],
13222     [second$$1, 15, 15 * durationSecond$1],
13223     [second$$1, 30, 30 * durationSecond$1],
13224     [minute$$1,  1,      durationMinute$1],
13225     [minute$$1,  5,  5 * durationMinute$1],
13226     [minute$$1, 15, 15 * durationMinute$1],
13227     [minute$$1, 30, 30 * durationMinute$1],
13228     [  hour$$1,  1,      durationHour$1  ],
13229     [  hour$$1,  3,  3 * durationHour$1  ],
13230     [  hour$$1,  6,  6 * durationHour$1  ],
13231     [  hour$$1, 12, 12 * durationHour$1  ],
13232     [   day$$1,  1,      durationDay$1   ],
13233     [   day$$1,  2,  2 * durationDay$1   ],
13234     [  week,  1,      durationWeek$1  ],
13235     [ month$$1,  1,      durationMonth ],
13236     [ month$$1,  3,  3 * durationMonth ],
13237     [  year$$1,  1,      durationYear  ]
13238   ];
13239
13240   function tickFormat(date$$1) {
13241     return (second$$1(date$$1) < date$$1 ? formatMillisecond
13242         : minute$$1(date$$1) < date$$1 ? formatSecond
13243         : hour$$1(date$$1) < date$$1 ? formatMinute
13244         : day$$1(date$$1) < date$$1 ? formatHour
13245         : month$$1(date$$1) < date$$1 ? (week(date$$1) < date$$1 ? formatDay : formatWeek)
13246         : year$$1(date$$1) < date$$1 ? formatMonth
13247         : formatYear)(date$$1);
13248   }
13249
13250   function tickInterval(interval, start, stop, step) {
13251     if (interval == null) interval = 10;
13252
13253     // If a desired tick count is specified, pick a reasonable tick interval
13254     // based on the extent of the domain and a rough estimate of tick size.
13255     // Otherwise, assume interval is already a time interval and use it.
13256     if (typeof interval === "number") {
13257       var target = Math.abs(stop - start) / interval,
13258           i = d3_bisector(function(i) { return i[2]; }).right(tickIntervals, target);
13259       if (i === tickIntervals.length) {
13260         step = tickStep(start / durationYear, stop / durationYear, interval);
13261         interval = year$$1;
13262       } else if (i) {
13263         i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
13264         step = i[1];
13265         interval = i[0];
13266       } else {
13267         step = Math.max(tickStep(start, stop, interval), 1);
13268         interval = millisecond$$1;
13269       }
13270     }
13271
13272     return step == null ? interval : interval.every(step);
13273   }
13274
13275   scale.invert = function(y) {
13276     return new Date(invert(y));
13277   };
13278
13279   scale.domain = function(_) {
13280     return arguments.length ? domain(map$2.call(_, number$3)) : domain().map(date$1);
13281   };
13282
13283   scale.ticks = function(interval, step) {
13284     var d = domain(),
13285         t0 = d[0],
13286         t1 = d[d.length - 1],
13287         r = t1 < t0,
13288         t;
13289     if (r) t = t0, t0 = t1, t1 = t;
13290     t = tickInterval(interval, t0, t1, step);
13291     t = t ? t.range(t0, t1 + 1) : []; // inclusive stop
13292     return r ? t.reverse() : t;
13293   };
13294
13295   scale.tickFormat = function(count, specifier) {
13296     return specifier == null ? tickFormat : format(specifier);
13297   };
13298
13299   scale.nice = function(interval, step) {
13300     var d = domain();
13301     return (interval = tickInterval(interval, d[0], d[d.length - 1], step))
13302         ? domain(nice(d, interval))
13303         : scale;
13304   };
13305
13306   scale.copy = function() {
13307     return copy(scale, calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format));
13308   };
13309
13310   return scale;
13311 }
13312
13313 function time() {
13314   return calendar(year, month, sunday, day, hour, minute, second, millisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);
13315 }
13316
13317 function utcTime() {
13318   return calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]);
13319 }
13320
13321 function colors(s) {
13322   return s.match(/.{6}/g).map(function(x) {
13323     return "#" + x;
13324   });
13325 }
13326
13327 var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
13328
13329 var category20b = colors("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6");
13330
13331 var category20c = colors("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9");
13332
13333 var category20 = colors("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5");
13334
13335 var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));
13336
13337 var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13338
13339 var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13340
13341 var rainbow = cubehelix();
13342
13343 function rainbow$1(t) {
13344   if (t < 0 || t > 1) t -= Math.floor(t);
13345   var ts = Math.abs(t - 0.5);
13346   rainbow.h = 360 * t - 100;
13347   rainbow.s = 1.5 - 1.5 * ts;
13348   rainbow.l = 0.8 - 0.9 * ts;
13349   return rainbow + "";
13350 }
13351
13352 function ramp(range) {
13353   var n = range.length;
13354   return function(t) {
13355     return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
13356   };
13357 }
13358
13359 var viridis = ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
13360
13361 var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
13362
13363 var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
13364
13365 var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
13366
13367 function sequential(interpolator) {
13368   var x0 = 0,
13369       x1 = 1,
13370       clamp = false;
13371
13372   function scale(x) {
13373     var t = (x - x0) / (x1 - x0);
13374     return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);
13375   }
13376
13377   scale.domain = function(_) {
13378     return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [x0, x1];
13379   };
13380
13381   scale.clamp = function(_) {
13382     return arguments.length ? (clamp = !!_, scale) : clamp;
13383   };
13384
13385   scale.interpolator = function(_) {
13386     return arguments.length ? (interpolator = _, scale) : interpolator;
13387   };
13388
13389   scale.copy = function() {
13390     return sequential(interpolator).domain([x0, x1]).clamp(clamp);
13391   };
13392
13393   return linearish(scale);
13394 }
13395
13396 function constant$10(x) {
13397   return function constant() {
13398     return x;
13399   };
13400 }
13401
13402 var abs$1 = Math.abs;
13403 var atan2$1 = Math.atan2;
13404 var cos$2 = Math.cos;
13405 var max$2 = Math.max;
13406 var min$1 = Math.min;
13407 var sin$2 = Math.sin;
13408 var sqrt$2 = Math.sqrt;
13409
13410 var epsilon$3 = 1e-12;
13411 var pi$4 = Math.PI;
13412 var halfPi$3 = pi$4 / 2;
13413 var tau$4 = 2 * pi$4;
13414
13415 function acos$1(x) {
13416   return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x);
13417 }
13418
13419 function asin$1(x) {
13420   return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x);
13421 }
13422
13423 function arcInnerRadius(d) {
13424   return d.innerRadius;
13425 }
13426
13427 function arcOuterRadius(d) {
13428   return d.outerRadius;
13429 }
13430
13431 function arcStartAngle(d) {
13432   return d.startAngle;
13433 }
13434
13435 function arcEndAngle(d) {
13436   return d.endAngle;
13437 }
13438
13439 function arcPadAngle(d) {
13440   return d && d.padAngle; // Note: optional!
13441 }
13442
13443 function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {
13444   var x10 = x1 - x0, y10 = y1 - y0,
13445       x32 = x3 - x2, y32 = y3 - y2,
13446       t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / (y32 * x10 - x32 * y10);
13447   return [x0 + t * x10, y0 + t * y10];
13448 }
13449
13450 // Compute perpendicular offset line of length rc.
13451 // http://mathworld.wolfram.com/Circle-LineIntersection.html
13452 function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
13453   var x01 = x0 - x1,
13454       y01 = y0 - y1,
13455       lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01),
13456       ox = lo * y01,
13457       oy = -lo * x01,
13458       x11 = x0 + ox,
13459       y11 = y0 + oy,
13460       x10 = x1 + ox,
13461       y10 = y1 + oy,
13462       x00 = (x11 + x10) / 2,
13463       y00 = (y11 + y10) / 2,
13464       dx = x10 - x11,
13465       dy = y10 - y11,
13466       d2 = dx * dx + dy * dy,
13467       r = r1 - rc,
13468       D = x11 * y10 - x10 * y11,
13469       d = (dy < 0 ? -1 : 1) * sqrt$2(max$2(0, r * r * d2 - D * D)),
13470       cx0 = (D * dy - dx * d) / d2,
13471       cy0 = (-D * dx - dy * d) / d2,
13472       cx1 = (D * dy + dx * d) / d2,
13473       cy1 = (-D * dx + dy * d) / d2,
13474       dx0 = cx0 - x00,
13475       dy0 = cy0 - y00,
13476       dx1 = cx1 - x00,
13477       dy1 = cy1 - y00;
13478
13479   // Pick the closer of the two intersection points.
13480   // TODO Is there a faster way to determine which intersection to use?
13481   if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
13482
13483   return {
13484     cx: cx0,
13485     cy: cy0,
13486     x01: -ox,
13487     y01: -oy,
13488     x11: cx0 * (r1 / r - 1),
13489     y11: cy0 * (r1 / r - 1)
13490   };
13491 }
13492
13493 function arc() {
13494   var innerRadius = arcInnerRadius,
13495       outerRadius = arcOuterRadius,
13496       cornerRadius = constant$10(0),
13497       padRadius = null,
13498       startAngle = arcStartAngle,
13499       endAngle = arcEndAngle,
13500       padAngle = arcPadAngle,
13501       context = null;
13502
13503   function arc() {
13504     var buffer,
13505         r,
13506         r0 = +innerRadius.apply(this, arguments),
13507         r1 = +outerRadius.apply(this, arguments),
13508         a0 = startAngle.apply(this, arguments) - halfPi$3,
13509         a1 = endAngle.apply(this, arguments) - halfPi$3,
13510         da = abs$1(a1 - a0),
13511         cw = a1 > a0;
13512
13513     if (!context) context = buffer = path();
13514
13515     // Ensure that the outer radius is always larger than the inner radius.
13516     if (r1 < r0) r = r1, r1 = r0, r0 = r;
13517
13518     // Is it a point?
13519     if (!(r1 > epsilon$3)) context.moveTo(0, 0);
13520
13521     // Or is it a circle or annulus?
13522     else if (da > tau$4 - epsilon$3) {
13523       context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0));
13524       context.arc(0, 0, r1, a0, a1, !cw);
13525       if (r0 > epsilon$3) {
13526         context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1));
13527         context.arc(0, 0, r0, a1, a0, cw);
13528       }
13529     }
13530
13531     // Or is it a circular or annular sector?
13532     else {
13533       var a01 = a0,
13534           a11 = a1,
13535           a00 = a0,
13536           a10 = a1,
13537           da0 = da,
13538           da1 = da,
13539           ap = padAngle.apply(this, arguments) / 2,
13540           rp = (ap > epsilon$3) && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)),
13541           rc = min$1(abs$1(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),
13542           rc0 = rc,
13543           rc1 = rc,
13544           t0,
13545           t1;
13546
13547       // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.
13548       if (rp > epsilon$3) {
13549         var p0 = asin$1(rp / r0 * sin$2(ap)),
13550             p1 = asin$1(rp / r1 * sin$2(ap));
13551         if ((da0 -= p0 * 2) > epsilon$3) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;
13552         else da0 = 0, a00 = a10 = (a0 + a1) / 2;
13553         if ((da1 -= p1 * 2) > epsilon$3) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;
13554         else da1 = 0, a01 = a11 = (a0 + a1) / 2;
13555       }
13556
13557       var x01 = r1 * cos$2(a01),
13558           y01 = r1 * sin$2(a01),
13559           x10 = r0 * cos$2(a10),
13560           y10 = r0 * sin$2(a10);
13561
13562       // Apply rounded corners?
13563       if (rc > epsilon$3) {
13564         var x11 = r1 * cos$2(a11),
13565             y11 = r1 * sin$2(a11),
13566             x00 = r0 * cos$2(a00),
13567             y00 = r0 * sin$2(a00);
13568
13569         // Restrict the corner radius according to the sector angle.
13570         if (da < pi$4) {
13571           var oc = da0 > epsilon$3 ? intersect(x01, y01, x00, y00, x11, y11, x10, y10) : [x10, y10],
13572               ax = x01 - oc[0],
13573               ay = y01 - oc[1],
13574               bx = x11 - oc[0],
13575               by = y11 - oc[1],
13576               kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2),
13577               lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]);
13578           rc0 = min$1(rc, (r0 - lc) / (kc - 1));
13579           rc1 = min$1(rc, (r1 - lc) / (kc + 1));
13580         }
13581       }
13582
13583       // Is the sector collapsed to a line?
13584       if (!(da1 > epsilon$3)) context.moveTo(x01, y01);
13585
13586       // Does the sector’s outer ring have rounded corners?
13587       else if (rc1 > epsilon$3) {
13588         t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);
13589         t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);
13590
13591         context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
13592
13593         // Have the corners merged?
13594         if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
13595
13596         // Otherwise, draw the two corners and the ring.
13597         else {
13598           context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
13599           context.arc(0, 0, r1, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), !cw);
13600           context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
13601         }
13602       }
13603
13604       // Or is the outer ring just a circular arc?
13605       else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
13606
13607       // Is there no inner ring, and it’s a circular sector?
13608       // Or perhaps it’s an annular sector collapsed due to padding?
13609       if (!(r0 > epsilon$3) || !(da0 > epsilon$3)) context.lineTo(x10, y10);
13610
13611       // Does the sector’s inner ring (or point) have rounded corners?
13612       else if (rc0 > epsilon$3) {
13613         t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);
13614         t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);
13615
13616         context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
13617
13618         // Have the corners merged?
13619         if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
13620
13621         // Otherwise, draw the two corners and the ring.
13622         else {
13623           context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
13624           context.arc(0, 0, r0, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), cw);
13625           context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
13626         }
13627       }
13628
13629       // Or is the inner ring just a circular arc?
13630       else context.arc(0, 0, r0, a10, a00, cw);
13631     }
13632
13633     context.closePath();
13634
13635     if (buffer) return context = null, buffer + "" || null;
13636   }
13637
13638   arc.centroid = function() {
13639     var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,
13640         a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$4 / 2;
13641     return [cos$2(a) * r, sin$2(a) * r];
13642   };
13643
13644   arc.innerRadius = function(_) {
13645     return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$10(+_), arc) : innerRadius;
13646   };
13647
13648   arc.outerRadius = function(_) {
13649     return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$10(+_), arc) : outerRadius;
13650   };
13651
13652   arc.cornerRadius = function(_) {
13653     return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$10(+_), arc) : cornerRadius;
13654   };
13655
13656   arc.padRadius = function(_) {
13657     return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$10(+_), arc) : padRadius;
13658   };
13659
13660   arc.startAngle = function(_) {
13661     return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$10(+_), arc) : startAngle;
13662   };
13663
13664   arc.endAngle = function(_) {
13665     return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$10(+_), arc) : endAngle;
13666   };
13667
13668   arc.padAngle = function(_) {
13669     return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$10(+_), arc) : padAngle;
13670   };
13671
13672   arc.context = function(_) {
13673     return arguments.length ? (context = _ == null ? null : _, arc) : context;
13674   };
13675
13676   return arc;
13677 }
13678
13679 function Linear(context) {
13680   this._context = context;
13681 }
13682
13683 Linear.prototype = {
13684   areaStart: function() {
13685     this._line = 0;
13686   },
13687   areaEnd: function() {
13688     this._line = NaN;
13689   },
13690   lineStart: function() {
13691     this._point = 0;
13692   },
13693   lineEnd: function() {
13694     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
13695     this._line = 1 - this._line;
13696   },
13697   point: function(x, y) {
13698     x = +x, y = +y;
13699     switch (this._point) {
13700       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
13701       case 1: this._point = 2; // proceed
13702       default: this._context.lineTo(x, y); break;
13703     }
13704   }
13705 };
13706
13707 function curveLinear(context) {
13708   return new Linear(context);
13709 }
13710
13711 function x$3(p) {
13712   return p[0];
13713 }
13714
13715 function y$3(p) {
13716   return p[1];
13717 }
13718
13719 function line() {
13720   var x$$1 = x$3,
13721       y$$1 = y$3,
13722       defined = constant$10(true),
13723       context = null,
13724       curve = curveLinear,
13725       output = null;
13726
13727   function line(data) {
13728     var i,
13729         n = data.length,
13730         d,
13731         defined0 = false,
13732         buffer;
13733
13734     if (context == null) output = curve(buffer = path());
13735
13736     for (i = 0; i <= n; ++i) {
13737       if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13738         if (defined0 = !defined0) output.lineStart();
13739         else output.lineEnd();
13740       }
13741       if (defined0) output.point(+x$$1(d, i, data), +y$$1(d, i, data));
13742     }
13743
13744     if (buffer) return output = null, buffer + "" || null;
13745   }
13746
13747   line.x = function(_) {
13748     return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$10(+_), line) : x$$1;
13749   };
13750
13751   line.y = function(_) {
13752     return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$10(+_), line) : y$$1;
13753   };
13754
13755   line.defined = function(_) {
13756     return arguments.length ? (defined = typeof _ === "function" ? _ : constant$10(!!_), line) : defined;
13757   };
13758
13759   line.curve = function(_) {
13760     return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
13761   };
13762
13763   line.context = function(_) {
13764     return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
13765   };
13766
13767   return line;
13768 }
13769
13770 function area() {
13771   var x0 = x$3,
13772       x1 = null,
13773       y0 = constant$10(0),
13774       y1 = y$3,
13775       defined = constant$10(true),
13776       context = null,
13777       curve = curveLinear,
13778       output = null;
13779
13780   function area(data) {
13781     var i,
13782         j,
13783         k,
13784         n = data.length,
13785         d,
13786         defined0 = false,
13787         buffer,
13788         x0z = new Array(n),
13789         y0z = new Array(n);
13790
13791     if (context == null) output = curve(buffer = path());
13792
13793     for (i = 0; i <= n; ++i) {
13794       if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13795         if (defined0 = !defined0) {
13796           j = i;
13797           output.areaStart();
13798           output.lineStart();
13799         } else {
13800           output.lineEnd();
13801           output.lineStart();
13802           for (k = i - 1; k >= j; --k) {
13803             output.point(x0z[k], y0z[k]);
13804           }
13805           output.lineEnd();
13806           output.areaEnd();
13807         }
13808       }
13809       if (defined0) {
13810         x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);
13811         output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);
13812       }
13813     }
13814
13815     if (buffer) return output = null, buffer + "" || null;
13816   }
13817
13818   function arealine() {
13819     return line().defined(defined).curve(curve).context(context);
13820   }
13821
13822   area.x = function(_) {
13823     return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$10(+_), x1 = null, area) : x0;
13824   };
13825
13826   area.x0 = function(_) {
13827     return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$10(+_), area) : x0;
13828   };
13829
13830   area.x1 = function(_) {
13831     return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$10(+_), area) : x1;
13832   };
13833
13834   area.y = function(_) {
13835     return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$10(+_), y1 = null, area) : y0;
13836   };
13837
13838   area.y0 = function(_) {
13839     return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$10(+_), area) : y0;
13840   };
13841
13842   area.y1 = function(_) {
13843     return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$10(+_), area) : y1;
13844   };
13845
13846   area.lineX0 =
13847   area.lineY0 = function() {
13848     return arealine().x(x0).y(y0);
13849   };
13850
13851   area.lineY1 = function() {
13852     return arealine().x(x0).y(y1);
13853   };
13854
13855   area.lineX1 = function() {
13856     return arealine().x(x1).y(y0);
13857   };
13858
13859   area.defined = function(_) {
13860     return arguments.length ? (defined = typeof _ === "function" ? _ : constant$10(!!_), area) : defined;
13861   };
13862
13863   area.curve = function(_) {
13864     return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
13865   };
13866
13867   area.context = function(_) {
13868     return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
13869   };
13870
13871   return area;
13872 }
13873
13874 function descending(a, b) {
13875   return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
13876 }
13877
13878 function identity$6(d) {
13879   return d;
13880 }
13881
13882 function pie() {
13883   var value = identity$6,
13884       sortValues = descending,
13885       sort = null,
13886       startAngle = constant$10(0),
13887       endAngle = constant$10(tau$4),
13888       padAngle = constant$10(0);
13889
13890   function pie(data) {
13891     var i,
13892         n = data.length,
13893         j,
13894         k,
13895         sum = 0,
13896         index = new Array(n),
13897         arcs = new Array(n),
13898         a0 = +startAngle.apply(this, arguments),
13899         da = Math.min(tau$4, Math.max(-tau$4, endAngle.apply(this, arguments) - a0)),
13900         a1,
13901         p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),
13902         pa = p * (da < 0 ? -1 : 1),
13903         v;
13904
13905     for (i = 0; i < n; ++i) {
13906       if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
13907         sum += v;
13908       }
13909     }
13910
13911     // Optionally sort the arcs by previously-computed values or by data.
13912     if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });
13913     else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });
13914
13915     // Compute the arcs! They are stored in the original data's order.
13916     for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {
13917       j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {
13918         data: data[j],
13919         index: i,
13920         value: v,
13921         startAngle: a0,
13922         endAngle: a1,
13923         padAngle: p
13924       };
13925     }
13926
13927     return arcs;
13928   }
13929
13930   pie.value = function(_) {
13931     return arguments.length ? (value = typeof _ === "function" ? _ : constant$10(+_), pie) : value;
13932   };
13933
13934   pie.sortValues = function(_) {
13935     return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
13936   };
13937
13938   pie.sort = function(_) {
13939     return arguments.length ? (sort = _, sortValues = null, pie) : sort;
13940   };
13941
13942   pie.startAngle = function(_) {
13943     return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$10(+_), pie) : startAngle;
13944   };
13945
13946   pie.endAngle = function(_) {
13947     return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$10(+_), pie) : endAngle;
13948   };
13949
13950   pie.padAngle = function(_) {
13951     return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$10(+_), pie) : padAngle;
13952   };
13953
13954   return pie;
13955 }
13956
13957 var curveRadialLinear = curveRadial(curveLinear);
13958
13959 function Radial(curve) {
13960   this._curve = curve;
13961 }
13962
13963 Radial.prototype = {
13964   areaStart: function() {
13965     this._curve.areaStart();
13966   },
13967   areaEnd: function() {
13968     this._curve.areaEnd();
13969   },
13970   lineStart: function() {
13971     this._curve.lineStart();
13972   },
13973   lineEnd: function() {
13974     this._curve.lineEnd();
13975   },
13976   point: function(a, r) {
13977     this._curve.point(r * Math.sin(a), r * -Math.cos(a));
13978   }
13979 };
13980
13981 function curveRadial(curve) {
13982
13983   function radial(context) {
13984     return new Radial(curve(context));
13985   }
13986
13987   radial._curve = curve;
13988
13989   return radial;
13990 }
13991
13992 function lineRadial(l) {
13993   var c = l.curve;
13994
13995   l.angle = l.x, delete l.x;
13996   l.radius = l.y, delete l.y;
13997
13998   l.curve = function(_) {
13999     return arguments.length ? c(curveRadial(_)) : c()._curve;
14000   };
14001
14002   return l;
14003 }
14004
14005 function lineRadial$1() {
14006   return lineRadial(line().curve(curveRadialLinear));
14007 }
14008
14009 function areaRadial() {
14010   var a = area().curve(curveRadialLinear),
14011       c = a.curve,
14012       x0 = a.lineX0,
14013       x1 = a.lineX1,
14014       y0 = a.lineY0,
14015       y1 = a.lineY1;
14016
14017   a.angle = a.x, delete a.x;
14018   a.startAngle = a.x0, delete a.x0;
14019   a.endAngle = a.x1, delete a.x1;
14020   a.radius = a.y, delete a.y;
14021   a.innerRadius = a.y0, delete a.y0;
14022   a.outerRadius = a.y1, delete a.y1;
14023   a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;
14024   a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;
14025   a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;
14026   a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;
14027
14028   a.curve = function(_) {
14029     return arguments.length ? c(curveRadial(_)) : c()._curve;
14030   };
14031
14032   return a;
14033 }
14034
14035 function pointRadial(x, y) {
14036   return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
14037 }
14038
14039 var slice$6 = Array.prototype.slice;
14040
14041 function linkSource(d) {
14042   return d.source;
14043 }
14044
14045 function linkTarget(d) {
14046   return d.target;
14047 }
14048
14049 function link$2(curve) {
14050   var source = linkSource,
14051       target = linkTarget,
14052       x$$1 = x$3,
14053       y$$1 = y$3,
14054       context = null;
14055
14056   function link() {
14057     var buffer, argv = slice$6.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
14058     if (!context) context = buffer = path();
14059     curve(context, +x$$1.apply(this, (argv[0] = s, argv)), +y$$1.apply(this, argv), +x$$1.apply(this, (argv[0] = t, argv)), +y$$1.apply(this, argv));
14060     if (buffer) return context = null, buffer + "" || null;
14061   }
14062
14063   link.source = function(_) {
14064     return arguments.length ? (source = _, link) : source;
14065   };
14066
14067   link.target = function(_) {
14068     return arguments.length ? (target = _, link) : target;
14069   };
14070
14071   link.x = function(_) {
14072     return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$10(+_), link) : x$$1;
14073   };
14074
14075   link.y = function(_) {
14076     return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$10(+_), link) : y$$1;
14077   };
14078
14079   link.context = function(_) {
14080     return arguments.length ? (context = _ == null ? null : _, link) : context;
14081   };
14082
14083   return link;
14084 }
14085
14086 function curveHorizontal(context, x0, y0, x1, y1) {
14087   context.moveTo(x0, y0);
14088   context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
14089 }
14090
14091 function curveVertical(context, x0, y0, x1, y1) {
14092   context.moveTo(x0, y0);
14093   context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);
14094 }
14095
14096 function curveRadial$1(context, x0, y0, x1, y1) {
14097   var p0 = pointRadial(x0, y0),
14098       p1 = pointRadial(x0, y0 = (y0 + y1) / 2),
14099       p2 = pointRadial(x1, y0),
14100       p3 = pointRadial(x1, y1);
14101   context.moveTo(p0[0], p0[1]);
14102   context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);
14103 }
14104
14105 function linkHorizontal() {
14106   return link$2(curveHorizontal);
14107 }
14108
14109 function linkVertical() {
14110   return link$2(curveVertical);
14111 }
14112
14113 function linkRadial() {
14114   var l = link$2(curveRadial$1);
14115   l.angle = l.x, delete l.x;
14116   l.radius = l.y, delete l.y;
14117   return l;
14118 }
14119
14120 var circle$2 = {
14121   draw: function(context, size) {
14122     var r = Math.sqrt(size / pi$4);
14123     context.moveTo(r, 0);
14124     context.arc(0, 0, r, 0, tau$4);
14125   }
14126 };
14127
14128 var cross$2 = {
14129   draw: function(context, size) {
14130     var r = Math.sqrt(size / 5) / 2;
14131     context.moveTo(-3 * r, -r);
14132     context.lineTo(-r, -r);
14133     context.lineTo(-r, -3 * r);
14134     context.lineTo(r, -3 * r);
14135     context.lineTo(r, -r);
14136     context.lineTo(3 * r, -r);
14137     context.lineTo(3 * r, r);
14138     context.lineTo(r, r);
14139     context.lineTo(r, 3 * r);
14140     context.lineTo(-r, 3 * r);
14141     context.lineTo(-r, r);
14142     context.lineTo(-3 * r, r);
14143     context.closePath();
14144   }
14145 };
14146
14147 var tan30 = Math.sqrt(1 / 3),
14148     tan30_2 = tan30 * 2;
14149
14150 var diamond = {
14151   draw: function(context, size) {
14152     var y = Math.sqrt(size / tan30_2),
14153         x = y * tan30;
14154     context.moveTo(0, -y);
14155     context.lineTo(x, 0);
14156     context.lineTo(0, y);
14157     context.lineTo(-x, 0);
14158     context.closePath();
14159   }
14160 };
14161
14162 var ka = 0.89081309152928522810,
14163     kr = Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10),
14164     kx = Math.sin(tau$4 / 10) * kr,
14165     ky = -Math.cos(tau$4 / 10) * kr;
14166
14167 var star = {
14168   draw: function(context, size) {
14169     var r = Math.sqrt(size * ka),
14170         x = kx * r,
14171         y = ky * r;
14172     context.moveTo(0, -r);
14173     context.lineTo(x, y);
14174     for (var i = 1; i < 5; ++i) {
14175       var a = tau$4 * i / 5,
14176           c = Math.cos(a),
14177           s = Math.sin(a);
14178       context.lineTo(s * r, -c * r);
14179       context.lineTo(c * x - s * y, s * x + c * y);
14180     }
14181     context.closePath();
14182   }
14183 };
14184
14185 var square = {
14186   draw: function(context, size) {
14187     var w = Math.sqrt(size),
14188         x = -w / 2;
14189     context.rect(x, x, w, w);
14190   }
14191 };
14192
14193 var sqrt3 = Math.sqrt(3);
14194
14195 var triangle = {
14196   draw: function(context, size) {
14197     var y = -Math.sqrt(size / (sqrt3 * 3));
14198     context.moveTo(0, y * 2);
14199     context.lineTo(-sqrt3 * y, -y);
14200     context.lineTo(sqrt3 * y, -y);
14201     context.closePath();
14202   }
14203 };
14204
14205 var c = -0.5,
14206     s = Math.sqrt(3) / 2,
14207     k = 1 / Math.sqrt(12),
14208     a = (k / 2 + 1) * 3;
14209
14210 var wye = {
14211   draw: function(context, size) {
14212     var r = Math.sqrt(size / a),
14213         x0 = r / 2,
14214         y0 = r * k,
14215         x1 = x0,
14216         y1 = r * k + r,
14217         x2 = -x1,
14218         y2 = y1;
14219     context.moveTo(x0, y0);
14220     context.lineTo(x1, y1);
14221     context.lineTo(x2, y2);
14222     context.lineTo(c * x0 - s * y0, s * x0 + c * y0);
14223     context.lineTo(c * x1 - s * y1, s * x1 + c * y1);
14224     context.lineTo(c * x2 - s * y2, s * x2 + c * y2);
14225     context.lineTo(c * x0 + s * y0, c * y0 - s * x0);
14226     context.lineTo(c * x1 + s * y1, c * y1 - s * x1);
14227     context.lineTo(c * x2 + s * y2, c * y2 - s * x2);
14228     context.closePath();
14229   }
14230 };
14231
14232 var symbols = [
14233   circle$2,
14234   cross$2,
14235   diamond,
14236   square,
14237   star,
14238   triangle,
14239   wye
14240 ];
14241
14242 function symbol() {
14243   var type = constant$10(circle$2),
14244       size = constant$10(64),
14245       context = null;
14246
14247   function symbol() {
14248     var buffer;
14249     if (!context) context = buffer = path();
14250     type.apply(this, arguments).draw(context, +size.apply(this, arguments));
14251     if (buffer) return context = null, buffer + "" || null;
14252   }
14253
14254   symbol.type = function(_) {
14255     return arguments.length ? (type = typeof _ === "function" ? _ : constant$10(_), symbol) : type;
14256   };
14257
14258   symbol.size = function(_) {
14259     return arguments.length ? (size = typeof _ === "function" ? _ : constant$10(+_), symbol) : size;
14260   };
14261
14262   symbol.context = function(_) {
14263     return arguments.length ? (context = _ == null ? null : _, symbol) : context;
14264   };
14265
14266   return symbol;
14267 }
14268
14269 function noop$2() {}
14270
14271 function point$2(that, x, y) {
14272   that._context.bezierCurveTo(
14273     (2 * that._x0 + that._x1) / 3,
14274     (2 * that._y0 + that._y1) / 3,
14275     (that._x0 + 2 * that._x1) / 3,
14276     (that._y0 + 2 * that._y1) / 3,
14277     (that._x0 + 4 * that._x1 + x) / 6,
14278     (that._y0 + 4 * that._y1 + y) / 6
14279   );
14280 }
14281
14282 function Basis(context) {
14283   this._context = context;
14284 }
14285
14286 Basis.prototype = {
14287   areaStart: function() {
14288     this._line = 0;
14289   },
14290   areaEnd: function() {
14291     this._line = NaN;
14292   },
14293   lineStart: function() {
14294     this._x0 = this._x1 =
14295     this._y0 = this._y1 = NaN;
14296     this._point = 0;
14297   },
14298   lineEnd: function() {
14299     switch (this._point) {
14300       case 3: point$2(this, this._x1, this._y1); // proceed
14301       case 2: this._context.lineTo(this._x1, this._y1); break;
14302     }
14303     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14304     this._line = 1 - this._line;
14305   },
14306   point: function(x, y) {
14307     x = +x, y = +y;
14308     switch (this._point) {
14309       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14310       case 1: this._point = 2; break;
14311       case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed
14312       default: point$2(this, x, y); break;
14313     }
14314     this._x0 = this._x1, this._x1 = x;
14315     this._y0 = this._y1, this._y1 = y;
14316   }
14317 };
14318
14319 function basis$2(context) {
14320   return new Basis(context);
14321 }
14322
14323 function BasisClosed(context) {
14324   this._context = context;
14325 }
14326
14327 BasisClosed.prototype = {
14328   areaStart: noop$2,
14329   areaEnd: noop$2,
14330   lineStart: function() {
14331     this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =
14332     this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;
14333     this._point = 0;
14334   },
14335   lineEnd: function() {
14336     switch (this._point) {
14337       case 1: {
14338         this._context.moveTo(this._x2, this._y2);
14339         this._context.closePath();
14340         break;
14341       }
14342       case 2: {
14343         this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);
14344         this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);
14345         this._context.closePath();
14346         break;
14347       }
14348       case 3: {
14349         this.point(this._x2, this._y2);
14350         this.point(this._x3, this._y3);
14351         this.point(this._x4, this._y4);
14352         break;
14353       }
14354     }
14355   },
14356   point: function(x, y) {
14357     x = +x, y = +y;
14358     switch (this._point) {
14359       case 0: this._point = 1; this._x2 = x, this._y2 = y; break;
14360       case 1: this._point = 2; this._x3 = x, this._y3 = y; break;
14361       case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;
14362       default: point$2(this, x, y); break;
14363     }
14364     this._x0 = this._x1, this._x1 = x;
14365     this._y0 = this._y1, this._y1 = y;
14366   }
14367 };
14368
14369 function basisClosed$1(context) {
14370   return new BasisClosed(context);
14371 }
14372
14373 function BasisOpen(context) {
14374   this._context = context;
14375 }
14376
14377 BasisOpen.prototype = {
14378   areaStart: function() {
14379     this._line = 0;
14380   },
14381   areaEnd: function() {
14382     this._line = NaN;
14383   },
14384   lineStart: function() {
14385     this._x0 = this._x1 =
14386     this._y0 = this._y1 = NaN;
14387     this._point = 0;
14388   },
14389   lineEnd: function() {
14390     if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14391     this._line = 1 - this._line;
14392   },
14393   point: function(x, y) {
14394     x = +x, y = +y;
14395     switch (this._point) {
14396       case 0: this._point = 1; break;
14397       case 1: this._point = 2; break;
14398       case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;
14399       case 3: this._point = 4; // proceed
14400       default: point$2(this, x, y); break;
14401     }
14402     this._x0 = this._x1, this._x1 = x;
14403     this._y0 = this._y1, this._y1 = y;
14404   }
14405 };
14406
14407 function basisOpen(context) {
14408   return new BasisOpen(context);
14409 }
14410
14411 function Bundle(context, beta) {
14412   this._basis = new Basis(context);
14413   this._beta = beta;
14414 }
14415
14416 Bundle.prototype = {
14417   lineStart: function() {
14418     this._x = [];
14419     this._y = [];
14420     this._basis.lineStart();
14421   },
14422   lineEnd: function() {
14423     var x = this._x,
14424         y = this._y,
14425         j = x.length - 1;
14426
14427     if (j > 0) {
14428       var x0 = x[0],
14429           y0 = y[0],
14430           dx = x[j] - x0,
14431           dy = y[j] - y0,
14432           i = -1,
14433           t;
14434
14435       while (++i <= j) {
14436         t = i / j;
14437         this._basis.point(
14438           this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
14439           this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
14440         );
14441       }
14442     }
14443
14444     this._x = this._y = null;
14445     this._basis.lineEnd();
14446   },
14447   point: function(x, y) {
14448     this._x.push(+x);
14449     this._y.push(+y);
14450   }
14451 };
14452
14453 var bundle = (function custom(beta) {
14454
14455   function bundle(context) {
14456     return beta === 1 ? new Basis(context) : new Bundle(context, beta);
14457   }
14458
14459   bundle.beta = function(beta) {
14460     return custom(+beta);
14461   };
14462
14463   return bundle;
14464 })(0.85);
14465
14466 function point$3(that, x, y) {
14467   that._context.bezierCurveTo(
14468     that._x1 + that._k * (that._x2 - that._x0),
14469     that._y1 + that._k * (that._y2 - that._y0),
14470     that._x2 + that._k * (that._x1 - x),
14471     that._y2 + that._k * (that._y1 - y),
14472     that._x2,
14473     that._y2
14474   );
14475 }
14476
14477 function Cardinal(context, tension) {
14478   this._context = context;
14479   this._k = (1 - tension) / 6;
14480 }
14481
14482 Cardinal.prototype = {
14483   areaStart: function() {
14484     this._line = 0;
14485   },
14486   areaEnd: function() {
14487     this._line = NaN;
14488   },
14489   lineStart: function() {
14490     this._x0 = this._x1 = this._x2 =
14491     this._y0 = this._y1 = this._y2 = NaN;
14492     this._point = 0;
14493   },
14494   lineEnd: function() {
14495     switch (this._point) {
14496       case 2: this._context.lineTo(this._x2, this._y2); break;
14497       case 3: point$3(this, this._x1, this._y1); break;
14498     }
14499     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14500     this._line = 1 - this._line;
14501   },
14502   point: function(x, y) {
14503     x = +x, y = +y;
14504     switch (this._point) {
14505       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14506       case 1: this._point = 2; this._x1 = x, this._y1 = y; break;
14507       case 2: this._point = 3; // proceed
14508       default: point$3(this, x, y); break;
14509     }
14510     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14511     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14512   }
14513 };
14514
14515 var cardinal = (function custom(tension) {
14516
14517   function cardinal(context) {
14518     return new Cardinal(context, tension);
14519   }
14520
14521   cardinal.tension = function(tension) {
14522     return custom(+tension);
14523   };
14524
14525   return cardinal;
14526 })(0);
14527
14528 function CardinalClosed(context, tension) {
14529   this._context = context;
14530   this._k = (1 - tension) / 6;
14531 }
14532
14533 CardinalClosed.prototype = {
14534   areaStart: noop$2,
14535   areaEnd: noop$2,
14536   lineStart: function() {
14537     this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
14538     this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
14539     this._point = 0;
14540   },
14541   lineEnd: function() {
14542     switch (this._point) {
14543       case 1: {
14544         this._context.moveTo(this._x3, this._y3);
14545         this._context.closePath();
14546         break;
14547       }
14548       case 2: {
14549         this._context.lineTo(this._x3, this._y3);
14550         this._context.closePath();
14551         break;
14552       }
14553       case 3: {
14554         this.point(this._x3, this._y3);
14555         this.point(this._x4, this._y4);
14556         this.point(this._x5, this._y5);
14557         break;
14558       }
14559     }
14560   },
14561   point: function(x, y) {
14562     x = +x, y = +y;
14563     switch (this._point) {
14564       case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
14565       case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
14566       case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
14567       default: point$3(this, x, y); break;
14568     }
14569     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14570     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14571   }
14572 };
14573
14574 var cardinalClosed = (function custom(tension) {
14575
14576   function cardinal$$1(context) {
14577     return new CardinalClosed(context, tension);
14578   }
14579
14580   cardinal$$1.tension = function(tension) {
14581     return custom(+tension);
14582   };
14583
14584   return cardinal$$1;
14585 })(0);
14586
14587 function CardinalOpen(context, tension) {
14588   this._context = context;
14589   this._k = (1 - tension) / 6;
14590 }
14591
14592 CardinalOpen.prototype = {
14593   areaStart: function() {
14594     this._line = 0;
14595   },
14596   areaEnd: function() {
14597     this._line = NaN;
14598   },
14599   lineStart: function() {
14600     this._x0 = this._x1 = this._x2 =
14601     this._y0 = this._y1 = this._y2 = NaN;
14602     this._point = 0;
14603   },
14604   lineEnd: function() {
14605     if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14606     this._line = 1 - this._line;
14607   },
14608   point: function(x, y) {
14609     x = +x, y = +y;
14610     switch (this._point) {
14611       case 0: this._point = 1; break;
14612       case 1: this._point = 2; break;
14613       case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
14614       case 3: this._point = 4; // proceed
14615       default: point$3(this, x, y); break;
14616     }
14617     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14618     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14619   }
14620 };
14621
14622 var cardinalOpen = (function custom(tension) {
14623
14624   function cardinal$$1(context) {
14625     return new CardinalOpen(context, tension);
14626   }
14627
14628   cardinal$$1.tension = function(tension) {
14629     return custom(+tension);
14630   };
14631
14632   return cardinal$$1;
14633 })(0);
14634
14635 function point$4(that, x, y) {
14636   var x1 = that._x1,
14637       y1 = that._y1,
14638       x2 = that._x2,
14639       y2 = that._y2;
14640
14641   if (that._l01_a > epsilon$3) {
14642     var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,
14643         n = 3 * that._l01_a * (that._l01_a + that._l12_a);
14644     x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;
14645     y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
14646   }
14647
14648   if (that._l23_a > epsilon$3) {
14649     var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,
14650         m = 3 * that._l23_a * (that._l23_a + that._l12_a);
14651     x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;
14652     y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
14653   }
14654
14655   that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
14656 }
14657
14658 function CatmullRom(context, alpha) {
14659   this._context = context;
14660   this._alpha = alpha;
14661 }
14662
14663 CatmullRom.prototype = {
14664   areaStart: function() {
14665     this._line = 0;
14666   },
14667   areaEnd: function() {
14668     this._line = NaN;
14669   },
14670   lineStart: function() {
14671     this._x0 = this._x1 = this._x2 =
14672     this._y0 = this._y1 = this._y2 = NaN;
14673     this._l01_a = this._l12_a = this._l23_a =
14674     this._l01_2a = this._l12_2a = this._l23_2a =
14675     this._point = 0;
14676   },
14677   lineEnd: function() {
14678     switch (this._point) {
14679       case 2: this._context.lineTo(this._x2, this._y2); break;
14680       case 3: this.point(this._x2, this._y2); break;
14681     }
14682     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14683     this._line = 1 - this._line;
14684   },
14685   point: function(x, y) {
14686     x = +x, y = +y;
14687
14688     if (this._point) {
14689       var x23 = this._x2 - x,
14690           y23 = this._y2 - y;
14691       this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14692     }
14693
14694     switch (this._point) {
14695       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14696       case 1: this._point = 2; break;
14697       case 2: this._point = 3; // proceed
14698       default: point$4(this, x, y); break;
14699     }
14700
14701     this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14702     this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14703     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14704     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14705   }
14706 };
14707
14708 var catmullRom = (function custom(alpha) {
14709
14710   function catmullRom(context) {
14711     return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);
14712   }
14713
14714   catmullRom.alpha = function(alpha) {
14715     return custom(+alpha);
14716   };
14717
14718   return catmullRom;
14719 })(0.5);
14720
14721 function CatmullRomClosed(context, alpha) {
14722   this._context = context;
14723   this._alpha = alpha;
14724 }
14725
14726 CatmullRomClosed.prototype = {
14727   areaStart: noop$2,
14728   areaEnd: noop$2,
14729   lineStart: function() {
14730     this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
14731     this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
14732     this._l01_a = this._l12_a = this._l23_a =
14733     this._l01_2a = this._l12_2a = this._l23_2a =
14734     this._point = 0;
14735   },
14736   lineEnd: function() {
14737     switch (this._point) {
14738       case 1: {
14739         this._context.moveTo(this._x3, this._y3);
14740         this._context.closePath();
14741         break;
14742       }
14743       case 2: {
14744         this._context.lineTo(this._x3, this._y3);
14745         this._context.closePath();
14746         break;
14747       }
14748       case 3: {
14749         this.point(this._x3, this._y3);
14750         this.point(this._x4, this._y4);
14751         this.point(this._x5, this._y5);
14752         break;
14753       }
14754     }
14755   },
14756   point: function(x, y) {
14757     x = +x, y = +y;
14758
14759     if (this._point) {
14760       var x23 = this._x2 - x,
14761           y23 = this._y2 - y;
14762       this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14763     }
14764
14765     switch (this._point) {
14766       case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
14767       case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
14768       case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
14769       default: point$4(this, x, y); break;
14770     }
14771
14772     this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14773     this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14774     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14775     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14776   }
14777 };
14778
14779 var catmullRomClosed = (function custom(alpha) {
14780
14781   function catmullRom$$1(context) {
14782     return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
14783   }
14784
14785   catmullRom$$1.alpha = function(alpha) {
14786     return custom(+alpha);
14787   };
14788
14789   return catmullRom$$1;
14790 })(0.5);
14791
14792 function CatmullRomOpen(context, alpha) {
14793   this._context = context;
14794   this._alpha = alpha;
14795 }
14796
14797 CatmullRomOpen.prototype = {
14798   areaStart: function() {
14799     this._line = 0;
14800   },
14801   areaEnd: function() {
14802     this._line = NaN;
14803   },
14804   lineStart: function() {
14805     this._x0 = this._x1 = this._x2 =
14806     this._y0 = this._y1 = this._y2 = NaN;
14807     this._l01_a = this._l12_a = this._l23_a =
14808     this._l01_2a = this._l12_2a = this._l23_2a =
14809     this._point = 0;
14810   },
14811   lineEnd: function() {
14812     if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14813     this._line = 1 - this._line;
14814   },
14815   point: function(x, y) {
14816     x = +x, y = +y;
14817
14818     if (this._point) {
14819       var x23 = this._x2 - x,
14820           y23 = this._y2 - y;
14821       this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14822     }
14823
14824     switch (this._point) {
14825       case 0: this._point = 1; break;
14826       case 1: this._point = 2; break;
14827       case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
14828       case 3: this._point = 4; // proceed
14829       default: point$4(this, x, y); break;
14830     }
14831
14832     this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14833     this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14834     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14835     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14836   }
14837 };
14838
14839 var catmullRomOpen = (function custom(alpha) {
14840
14841   function catmullRom$$1(context) {
14842     return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
14843   }
14844
14845   catmullRom$$1.alpha = function(alpha) {
14846     return custom(+alpha);
14847   };
14848
14849   return catmullRom$$1;
14850 })(0.5);
14851
14852 function LinearClosed(context) {
14853   this._context = context;
14854 }
14855
14856 LinearClosed.prototype = {
14857   areaStart: noop$2,
14858   areaEnd: noop$2,
14859   lineStart: function() {
14860     this._point = 0;
14861   },
14862   lineEnd: function() {
14863     if (this._point) this._context.closePath();
14864   },
14865   point: function(x, y) {
14866     x = +x, y = +y;
14867     if (this._point) this._context.lineTo(x, y);
14868     else this._point = 1, this._context.moveTo(x, y);
14869   }
14870 };
14871
14872 function linearClosed(context) {
14873   return new LinearClosed(context);
14874 }
14875
14876 function sign$1(x) {
14877   return x < 0 ? -1 : 1;
14878 }
14879
14880 // Calculate the slopes of the tangents (Hermite-type interpolation) based on
14881 // the following paper: Steffen, M. 1990. A Simple Method for Monotonic
14882 // Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.
14883 // NOV(II), P. 443, 1990.
14884 function slope3(that, x2, y2) {
14885   var h0 = that._x1 - that._x0,
14886       h1 = x2 - that._x1,
14887       s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),
14888       s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),
14889       p = (s0 * h1 + s1 * h0) / (h0 + h1);
14890   return (sign$1(s0) + sign$1(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
14891 }
14892
14893 // Calculate a one-sided slope.
14894 function slope2(that, t) {
14895   var h = that._x1 - that._x0;
14896   return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
14897 }
14898
14899 // According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations
14900 // "you can express cubic Hermite interpolation in terms of cubic Bézier curves
14901 // with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".
14902 function point$5(that, t0, t1) {
14903   var x0 = that._x0,
14904       y0 = that._y0,
14905       x1 = that._x1,
14906       y1 = that._y1,
14907       dx = (x1 - x0) / 3;
14908   that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
14909 }
14910
14911 function MonotoneX(context) {
14912   this._context = context;
14913 }
14914
14915 MonotoneX.prototype = {
14916   areaStart: function() {
14917     this._line = 0;
14918   },
14919   areaEnd: function() {
14920     this._line = NaN;
14921   },
14922   lineStart: function() {
14923     this._x0 = this._x1 =
14924     this._y0 = this._y1 =
14925     this._t0 = NaN;
14926     this._point = 0;
14927   },
14928   lineEnd: function() {
14929     switch (this._point) {
14930       case 2: this._context.lineTo(this._x1, this._y1); break;
14931       case 3: point$5(this, this._t0, slope2(this, this._t0)); break;
14932     }
14933     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14934     this._line = 1 - this._line;
14935   },
14936   point: function(x, y) {
14937     var t1 = NaN;
14938
14939     x = +x, y = +y;
14940     if (x === this._x1 && y === this._y1) return; // Ignore coincident points.
14941     switch (this._point) {
14942       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14943       case 1: this._point = 2; break;
14944       case 2: this._point = 3; point$5(this, slope2(this, t1 = slope3(this, x, y)), t1); break;
14945       default: point$5(this, this._t0, t1 = slope3(this, x, y)); break;
14946     }
14947
14948     this._x0 = this._x1, this._x1 = x;
14949     this._y0 = this._y1, this._y1 = y;
14950     this._t0 = t1;
14951   }
14952 };
14953
14954 function MonotoneY(context) {
14955   this._context = new ReflectContext(context);
14956 }
14957
14958 (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
14959   MonotoneX.prototype.point.call(this, y, x);
14960 };
14961
14962 function ReflectContext(context) {
14963   this._context = context;
14964 }
14965
14966 ReflectContext.prototype = {
14967   moveTo: function(x, y) { this._context.moveTo(y, x); },
14968   closePath: function() { this._context.closePath(); },
14969   lineTo: function(x, y) { this._context.lineTo(y, x); },
14970   bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }
14971 };
14972
14973 function monotoneX(context) {
14974   return new MonotoneX(context);
14975 }
14976
14977 function monotoneY(context) {
14978   return new MonotoneY(context);
14979 }
14980
14981 function Natural(context) {
14982   this._context = context;
14983 }
14984
14985 Natural.prototype = {
14986   areaStart: function() {
14987     this._line = 0;
14988   },
14989   areaEnd: function() {
14990     this._line = NaN;
14991   },
14992   lineStart: function() {
14993     this._x = [];
14994     this._y = [];
14995   },
14996   lineEnd: function() {
14997     var x = this._x,
14998         y = this._y,
14999         n = x.length;
15000
15001     if (n) {
15002       this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
15003       if (n === 2) {
15004         this._context.lineTo(x[1], y[1]);
15005       } else {
15006         var px = controlPoints(x),
15007             py = controlPoints(y);
15008         for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {
15009           this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
15010         }
15011       }
15012     }
15013
15014     if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();
15015     this._line = 1 - this._line;
15016     this._x = this._y = null;
15017   },
15018   point: function(x, y) {
15019     this._x.push(+x);
15020     this._y.push(+y);
15021   }
15022 };
15023
15024 // See https://www.particleincell.com/2012/bezier-splines/ for derivation.
15025 function controlPoints(x) {
15026   var i,
15027       n = x.length - 1,
15028       m,
15029       a = new Array(n),
15030       b = new Array(n),
15031       r = new Array(n);
15032   a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];
15033   for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
15034   a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];
15035   for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];
15036   a[n - 1] = r[n - 1] / b[n - 1];
15037   for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];
15038   b[n - 1] = (x[n] + a[n - 1]) / 2;
15039   for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];
15040   return [a, b];
15041 }
15042
15043 function natural(context) {
15044   return new Natural(context);
15045 }
15046
15047 function Step(context, t) {
15048   this._context = context;
15049   this._t = t;
15050 }
15051
15052 Step.prototype = {
15053   areaStart: function() {
15054     this._line = 0;
15055   },
15056   areaEnd: function() {
15057     this._line = NaN;
15058   },
15059   lineStart: function() {
15060     this._x = this._y = NaN;
15061     this._point = 0;
15062   },
15063   lineEnd: function() {
15064     if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);
15065     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
15066     if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;
15067   },
15068   point: function(x, y) {
15069     x = +x, y = +y;
15070     switch (this._point) {
15071       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
15072       case 1: this._point = 2; // proceed
15073       default: {
15074         if (this._t <= 0) {
15075           this._context.lineTo(this._x, y);
15076           this._context.lineTo(x, y);
15077         } else {
15078           var x1 = this._x * (1 - this._t) + x * this._t;
15079           this._context.lineTo(x1, this._y);
15080           this._context.lineTo(x1, y);
15081         }
15082         break;
15083       }
15084     }
15085     this._x = x, this._y = y;
15086   }
15087 };
15088
15089 function step(context) {
15090   return new Step(context, 0.5);
15091 }
15092
15093 function stepBefore(context) {
15094   return new Step(context, 0);
15095 }
15096
15097 function stepAfter(context) {
15098   return new Step(context, 1);
15099 }
15100
15101 function none$1(series, order) {
15102   if (!((n = series.length) > 1)) return;
15103   for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
15104     s0 = s1, s1 = series[order[i]];
15105     for (j = 0; j < m; ++j) {
15106       s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
15107     }
15108   }
15109 }
15110
15111 function none$2(series) {
15112   var n = series.length, o = new Array(n);
15113   while (--n >= 0) o[n] = n;
15114   return o;
15115 }
15116
15117 function stackValue(d, key) {
15118   return d[key];
15119 }
15120
15121 function stack() {
15122   var keys = constant$10([]),
15123       order = none$2,
15124       offset = none$1,
15125       value = stackValue;
15126
15127   function stack(data) {
15128     var kz = keys.apply(this, arguments),
15129         i,
15130         m = data.length,
15131         n = kz.length,
15132         sz = new Array(n),
15133         oz;
15134
15135     for (i = 0; i < n; ++i) {
15136       for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {
15137         si[j] = sij = [0, +value(data[j], ki, j, data)];
15138         sij.data = data[j];
15139       }
15140       si.key = ki;
15141     }
15142
15143     for (i = 0, oz = order(sz); i < n; ++i) {
15144       sz[oz[i]].index = i;
15145     }
15146
15147     offset(sz, oz);
15148     return sz;
15149   }
15150
15151   stack.keys = function(_) {
15152     return arguments.length ? (keys = typeof _ === "function" ? _ : constant$10(slice$6.call(_)), stack) : keys;
15153   };
15154
15155   stack.value = function(_) {
15156     return arguments.length ? (value = typeof _ === "function" ? _ : constant$10(+_), stack) : value;
15157   };
15158
15159   stack.order = function(_) {
15160     return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$10(slice$6.call(_)), stack) : order;
15161   };
15162
15163   stack.offset = function(_) {
15164     return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset;
15165   };
15166
15167   return stack;
15168 }
15169
15170 function expand(series, order) {
15171   if (!((n = series.length) > 0)) return;
15172   for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {
15173     for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;
15174     if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;
15175   }
15176   none$1(series, order);
15177 }
15178
15179 function diverging(series, order) {
15180   if (!((n = series.length) > 1)) return;
15181   for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {
15182     for (yp = yn = 0, i = 0; i < n; ++i) {
15183       if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) {
15184         d[0] = yp, d[1] = yp += dy;
15185       } else if (dy < 0) {
15186         d[1] = yn, d[0] = yn += dy;
15187       } else {
15188         d[0] = yp;
15189       }
15190     }
15191   }
15192 }
15193
15194 function silhouette(series, order) {
15195   if (!((n = series.length) > 0)) return;
15196   for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {
15197     for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;
15198     s0[j][1] += s0[j][0] = -y / 2;
15199   }
15200   none$1(series, order);
15201 }
15202
15203 function wiggle(series, order) {
15204   if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;
15205   for (var y = 0, j = 1, s0, m, n; j < m; ++j) {
15206     for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {
15207       var si = series[order[i]],
15208           sij0 = si[j][1] || 0,
15209           sij1 = si[j - 1][1] || 0,
15210           s3 = (sij0 - sij1) / 2;
15211       for (var k = 0; k < i; ++k) {
15212         var sk = series[order[k]],
15213             skj0 = sk[j][1] || 0,
15214             skj1 = sk[j - 1][1] || 0;
15215         s3 += skj0 - skj1;
15216       }
15217       s1 += sij0, s2 += s3 * sij0;
15218     }
15219     s0[j - 1][1] += s0[j - 1][0] = y;
15220     if (s1) y -= s2 / s1;
15221   }
15222   s0[j - 1][1] += s0[j - 1][0] = y;
15223   none$1(series, order);
15224 }
15225
15226 function ascending$1(series) {
15227   var sums = series.map(sum$2);
15228   return none$2(series).sort(function(a, b) { return sums[a] - sums[b]; });
15229 }
15230
15231 function sum$2(series) {
15232   var s = 0, i = -1, n = series.length, v;
15233   while (++i < n) if (v = +series[i][1]) s += v;
15234   return s;
15235 }
15236
15237 function descending$1(series) {
15238   return ascending$1(series).reverse();
15239 }
15240
15241 function insideOut(series) {
15242   var n = series.length,
15243       i,
15244       j,
15245       sums = series.map(sum$2),
15246       order = none$2(series).sort(function(a, b) { return sums[b] - sums[a]; }),
15247       top = 0,
15248       bottom = 0,
15249       tops = [],
15250       bottoms = [];
15251
15252   for (i = 0; i < n; ++i) {
15253     j = order[i];
15254     if (top < bottom) {
15255       top += sums[j];
15256       tops.push(j);
15257     } else {
15258       bottom += sums[j];
15259       bottoms.push(j);
15260     }
15261   }
15262
15263   return bottoms.reverse().concat(tops);
15264 }
15265
15266 function reverse(series) {
15267   return none$2(series).reverse();
15268 }
15269
15270 function constant$11(x) {
15271   return function() {
15272     return x;
15273   };
15274 }
15275
15276 function x$4(d) {
15277   return d[0];
15278 }
15279
15280 function y$4(d) {
15281   return d[1];
15282 }
15283
15284 function RedBlackTree() {
15285   this._ = null; // root node
15286 }
15287
15288 function RedBlackNode(node) {
15289   node.U = // parent node
15290   node.C = // color - true for red, false for black
15291   node.L = // left node
15292   node.R = // right node
15293   node.P = // previous node
15294   node.N = null; // next node
15295 }
15296
15297 RedBlackTree.prototype = {
15298   constructor: RedBlackTree,
15299
15300   insert: function(after, node) {
15301     var parent, grandpa, uncle;
15302
15303     if (after) {
15304       node.P = after;
15305       node.N = after.N;
15306       if (after.N) after.N.P = node;
15307       after.N = node;
15308       if (after.R) {
15309         after = after.R;
15310         while (after.L) after = after.L;
15311         after.L = node;
15312       } else {
15313         after.R = node;
15314       }
15315       parent = after;
15316     } else if (this._) {
15317       after = RedBlackFirst(this._);
15318       node.P = null;
15319       node.N = after;
15320       after.P = after.L = node;
15321       parent = after;
15322     } else {
15323       node.P = node.N = null;
15324       this._ = node;
15325       parent = null;
15326     }
15327     node.L = node.R = null;
15328     node.U = parent;
15329     node.C = true;
15330
15331     after = node;
15332     while (parent && parent.C) {
15333       grandpa = parent.U;
15334       if (parent === grandpa.L) {
15335         uncle = grandpa.R;
15336         if (uncle && uncle.C) {
15337           parent.C = uncle.C = false;
15338           grandpa.C = true;
15339           after = grandpa;
15340         } else {
15341           if (after === parent.R) {
15342             RedBlackRotateLeft(this, parent);
15343             after = parent;
15344             parent = after.U;
15345           }
15346           parent.C = false;
15347           grandpa.C = true;
15348           RedBlackRotateRight(this, grandpa);
15349         }
15350       } else {
15351         uncle = grandpa.L;
15352         if (uncle && uncle.C) {
15353           parent.C = uncle.C = false;
15354           grandpa.C = true;
15355           after = grandpa;
15356         } else {
15357           if (after === parent.L) {
15358             RedBlackRotateRight(this, parent);
15359             after = parent;
15360             parent = after.U;
15361           }
15362           parent.C = false;
15363           grandpa.C = true;
15364           RedBlackRotateLeft(this, grandpa);
15365         }
15366       }
15367       parent = after.U;
15368     }
15369     this._.C = false;
15370   },
15371
15372   remove: function(node) {
15373     if (node.N) node.N.P = node.P;
15374     if (node.P) node.P.N = node.N;
15375     node.N = node.P = null;
15376
15377     var parent = node.U,
15378         sibling,
15379         left = node.L,
15380         right = node.R,
15381         next,
15382         red;
15383
15384     if (!left) next = right;
15385     else if (!right) next = left;
15386     else next = RedBlackFirst(right);
15387
15388     if (parent) {
15389       if (parent.L === node) parent.L = next;
15390       else parent.R = next;
15391     } else {
15392       this._ = next;
15393     }
15394
15395     if (left && right) {
15396       red = next.C;
15397       next.C = node.C;
15398       next.L = left;
15399       left.U = next;
15400       if (next !== right) {
15401         parent = next.U;
15402         next.U = node.U;
15403         node = next.R;
15404         parent.L = node;
15405         next.R = right;
15406         right.U = next;
15407       } else {
15408         next.U = parent;
15409         parent = next;
15410         node = next.R;
15411       }
15412     } else {
15413       red = node.C;
15414       node = next;
15415     }
15416
15417     if (node) node.U = parent;
15418     if (red) return;
15419     if (node && node.C) { node.C = false; return; }
15420
15421     do {
15422       if (node === this._) break;
15423       if (node === parent.L) {
15424         sibling = parent.R;
15425         if (sibling.C) {
15426           sibling.C = false;
15427           parent.C = true;
15428           RedBlackRotateLeft(this, parent);
15429           sibling = parent.R;
15430         }
15431         if ((sibling.L && sibling.L.C)
15432             || (sibling.R && sibling.R.C)) {
15433           if (!sibling.R || !sibling.R.C) {
15434             sibling.L.C = false;
15435             sibling.C = true;
15436             RedBlackRotateRight(this, sibling);
15437             sibling = parent.R;
15438           }
15439           sibling.C = parent.C;
15440           parent.C = sibling.R.C = false;
15441           RedBlackRotateLeft(this, parent);
15442           node = this._;
15443           break;
15444         }
15445       } else {
15446         sibling = parent.L;
15447         if (sibling.C) {
15448           sibling.C = false;
15449           parent.C = true;
15450           RedBlackRotateRight(this, parent);
15451           sibling = parent.L;
15452         }
15453         if ((sibling.L && sibling.L.C)
15454           || (sibling.R && sibling.R.C)) {
15455           if (!sibling.L || !sibling.L.C) {
15456             sibling.R.C = false;
15457             sibling.C = true;
15458             RedBlackRotateLeft(this, sibling);
15459             sibling = parent.L;
15460           }
15461           sibling.C = parent.C;
15462           parent.C = sibling.L.C = false;
15463           RedBlackRotateRight(this, parent);
15464           node = this._;
15465           break;
15466         }
15467       }
15468       sibling.C = true;
15469       node = parent;
15470       parent = parent.U;
15471     } while (!node.C);
15472
15473     if (node) node.C = false;
15474   }
15475 };
15476
15477 function RedBlackRotateLeft(tree, node) {
15478   var p = node,
15479       q = node.R,
15480       parent = p.U;
15481
15482   if (parent) {
15483     if (parent.L === p) parent.L = q;
15484     else parent.R = q;
15485   } else {
15486     tree._ = q;
15487   }
15488
15489   q.U = parent;
15490   p.U = q;
15491   p.R = q.L;
15492   if (p.R) p.R.U = p;
15493   q.L = p;
15494 }
15495
15496 function RedBlackRotateRight(tree, node) {
15497   var p = node,
15498       q = node.L,
15499       parent = p.U;
15500
15501   if (parent) {
15502     if (parent.L === p) parent.L = q;
15503     else parent.R = q;
15504   } else {
15505     tree._ = q;
15506   }
15507
15508   q.U = parent;
15509   p.U = q;
15510   p.L = q.R;
15511   if (p.L) p.L.U = p;
15512   q.R = p;
15513 }
15514
15515 function RedBlackFirst(node) {
15516   while (node.L) node = node.L;
15517   return node;
15518 }
15519
15520 function createEdge(left, right, v0, v1) {
15521   var edge = [null, null],
15522       index = edges.push(edge) - 1;
15523   edge.left = left;
15524   edge.right = right;
15525   if (v0) setEdgeEnd(edge, left, right, v0);
15526   if (v1) setEdgeEnd(edge, right, left, v1);
15527   cells[left.index].halfedges.push(index);
15528   cells[right.index].halfedges.push(index);
15529   return edge;
15530 }
15531
15532 function createBorderEdge(left, v0, v1) {
15533   var edge = [v0, v1];
15534   edge.left = left;
15535   return edge;
15536 }
15537
15538 function setEdgeEnd(edge, left, right, vertex) {
15539   if (!edge[0] && !edge[1]) {
15540     edge[0] = vertex;
15541     edge.left = left;
15542     edge.right = right;
15543   } else if (edge.left === right) {
15544     edge[1] = vertex;
15545   } else {
15546     edge[0] = vertex;
15547   }
15548 }
15549
15550 // Liang–Barsky line clipping.
15551 function clipEdge(edge, x0, y0, x1, y1) {
15552   var a = edge[0],
15553       b = edge[1],
15554       ax = a[0],
15555       ay = a[1],
15556       bx = b[0],
15557       by = b[1],
15558       t0 = 0,
15559       t1 = 1,
15560       dx = bx - ax,
15561       dy = by - ay,
15562       r;
15563
15564   r = x0 - ax;
15565   if (!dx && r > 0) return;
15566   r /= dx;
15567   if (dx < 0) {
15568     if (r < t0) return;
15569     if (r < t1) t1 = r;
15570   } else if (dx > 0) {
15571     if (r > t1) return;
15572     if (r > t0) t0 = r;
15573   }
15574
15575   r = x1 - ax;
15576   if (!dx && r < 0) return;
15577   r /= dx;
15578   if (dx < 0) {
15579     if (r > t1) return;
15580     if (r > t0) t0 = r;
15581   } else if (dx > 0) {
15582     if (r < t0) return;
15583     if (r < t1) t1 = r;
15584   }
15585
15586   r = y0 - ay;
15587   if (!dy && r > 0) return;
15588   r /= dy;
15589   if (dy < 0) {
15590     if (r < t0) return;
15591     if (r < t1) t1 = r;
15592   } else if (dy > 0) {
15593     if (r > t1) return;
15594     if (r > t0) t0 = r;
15595   }
15596
15597   r = y1 - ay;
15598   if (!dy && r < 0) return;
15599   r /= dy;
15600   if (dy < 0) {
15601     if (r > t1) return;
15602     if (r > t0) t0 = r;
15603   } else if (dy > 0) {
15604     if (r < t0) return;
15605     if (r < t1) t1 = r;
15606   }
15607
15608   if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?
15609
15610   if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];
15611   if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];
15612   return true;
15613 }
15614
15615 function connectEdge(edge, x0, y0, x1, y1) {
15616   var v1 = edge[1];
15617   if (v1) return true;
15618
15619   var v0 = edge[0],
15620       left = edge.left,
15621       right = edge.right,
15622       lx = left[0],
15623       ly = left[1],
15624       rx = right[0],
15625       ry = right[1],
15626       fx = (lx + rx) / 2,
15627       fy = (ly + ry) / 2,
15628       fm,
15629       fb;
15630
15631   if (ry === ly) {
15632     if (fx < x0 || fx >= x1) return;
15633     if (lx > rx) {
15634       if (!v0) v0 = [fx, y0];
15635       else if (v0[1] >= y1) return;
15636       v1 = [fx, y1];
15637     } else {
15638       if (!v0) v0 = [fx, y1];
15639       else if (v0[1] < y0) return;
15640       v1 = [fx, y0];
15641     }
15642   } else {
15643     fm = (lx - rx) / (ry - ly);
15644     fb = fy - fm * fx;
15645     if (fm < -1 || fm > 1) {
15646       if (lx > rx) {
15647         if (!v0) v0 = [(y0 - fb) / fm, y0];
15648         else if (v0[1] >= y1) return;
15649         v1 = [(y1 - fb) / fm, y1];
15650       } else {
15651         if (!v0) v0 = [(y1 - fb) / fm, y1];
15652         else if (v0[1] < y0) return;
15653         v1 = [(y0 - fb) / fm, y0];
15654       }
15655     } else {
15656       if (ly < ry) {
15657         if (!v0) v0 = [x0, fm * x0 + fb];
15658         else if (v0[0] >= x1) return;
15659         v1 = [x1, fm * x1 + fb];
15660       } else {
15661         if (!v0) v0 = [x1, fm * x1 + fb];
15662         else if (v0[0] < x0) return;
15663         v1 = [x0, fm * x0 + fb];
15664       }
15665     }
15666   }
15667
15668   edge[0] = v0;
15669   edge[1] = v1;
15670   return true;
15671 }
15672
15673 function clipEdges(x0, y0, x1, y1) {
15674   var i = edges.length,
15675       edge;
15676
15677   while (i--) {
15678     if (!connectEdge(edge = edges[i], x0, y0, x1, y1)
15679         || !clipEdge(edge, x0, y0, x1, y1)
15680         || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$4
15681             || Math.abs(edge[0][1] - edge[1][1]) > epsilon$4)) {
15682       delete edges[i];
15683     }
15684   }
15685 }
15686
15687 function createCell(site) {
15688   return cells[site.index] = {
15689     site: site,
15690     halfedges: []
15691   };
15692 }
15693
15694 function cellHalfedgeAngle(cell, edge) {
15695   var site = cell.site,
15696       va = edge.left,
15697       vb = edge.right;
15698   if (site === vb) vb = va, va = site;
15699   if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);
15700   if (site === va) va = edge[1], vb = edge[0];
15701   else va = edge[0], vb = edge[1];
15702   return Math.atan2(va[0] - vb[0], vb[1] - va[1]);
15703 }
15704
15705 function cellHalfedgeStart(cell, edge) {
15706   return edge[+(edge.left !== cell.site)];
15707 }
15708
15709 function cellHalfedgeEnd(cell, edge) {
15710   return edge[+(edge.left === cell.site)];
15711 }
15712
15713 function sortCellHalfedges() {
15714   for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {
15715     if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {
15716       var index = new Array(m),
15717           array = new Array(m);
15718       for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);
15719       index.sort(function(i, j) { return array[j] - array[i]; });
15720       for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];
15721       for (j = 0; j < m; ++j) halfedges[j] = array[j];
15722     }
15723   }
15724 }
15725
15726 function clipCells(x0, y0, x1, y1) {
15727   var nCells = cells.length,
15728       iCell,
15729       cell,
15730       site,
15731       iHalfedge,
15732       halfedges,
15733       nHalfedges,
15734       start,
15735       startX,
15736       startY,
15737       end,
15738       endX,
15739       endY,
15740       cover = true;
15741
15742   for (iCell = 0; iCell < nCells; ++iCell) {
15743     if (cell = cells[iCell]) {
15744       site = cell.site;
15745       halfedges = cell.halfedges;
15746       iHalfedge = halfedges.length;
15747
15748       // Remove any dangling clipped edges.
15749       while (iHalfedge--) {
15750         if (!edges[halfedges[iHalfedge]]) {
15751           halfedges.splice(iHalfedge, 1);
15752         }
15753       }
15754
15755       // Insert any border edges as necessary.
15756       iHalfedge = 0, nHalfedges = halfedges.length;
15757       while (iHalfedge < nHalfedges) {
15758         end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];
15759         start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];
15760         if (Math.abs(endX - startX) > epsilon$4 || Math.abs(endY - startY) > epsilon$4) {
15761           halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,
15762               Math.abs(endX - x0) < epsilon$4 && y1 - endY > epsilon$4 ? [x0, Math.abs(startX - x0) < epsilon$4 ? startY : y1]
15763               : Math.abs(endY - y1) < epsilon$4 && x1 - endX > epsilon$4 ? [Math.abs(startY - y1) < epsilon$4 ? startX : x1, y1]
15764               : Math.abs(endX - x1) < epsilon$4 && endY - y0 > epsilon$4 ? [x1, Math.abs(startX - x1) < epsilon$4 ? startY : y0]
15765               : Math.abs(endY - y0) < epsilon$4 && endX - x0 > epsilon$4 ? [Math.abs(startY - y0) < epsilon$4 ? startX : x0, y0]
15766               : null)) - 1);
15767           ++nHalfedges;
15768         }
15769       }
15770
15771       if (nHalfedges) cover = false;
15772     }
15773   }
15774
15775   // If there weren’t any edges, have the closest site cover the extent.
15776   // It doesn’t matter which corner of the extent we measure!
15777   if (cover) {
15778     var dx, dy, d2, dc = Infinity;
15779
15780     for (iCell = 0, cover = null; iCell < nCells; ++iCell) {
15781       if (cell = cells[iCell]) {
15782         site = cell.site;
15783         dx = site[0] - x0;
15784         dy = site[1] - y0;
15785         d2 = dx * dx + dy * dy;
15786         if (d2 < dc) dc = d2, cover = cell;
15787       }
15788     }
15789
15790     if (cover) {
15791       var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];
15792       cover.halfedges.push(
15793         edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,
15794         edges.push(createBorderEdge(site, v01, v11)) - 1,
15795         edges.push(createBorderEdge(site, v11, v10)) - 1,
15796         edges.push(createBorderEdge(site, v10, v00)) - 1
15797       );
15798     }
15799   }
15800
15801   // Lastly delete any cells with no edges; these were entirely clipped.
15802   for (iCell = 0; iCell < nCells; ++iCell) {
15803     if (cell = cells[iCell]) {
15804       if (!cell.halfedges.length) {
15805         delete cells[iCell];
15806       }
15807     }
15808   }
15809 }
15810
15811 var circlePool = [];
15812
15813 var firstCircle;
15814
15815 function Circle() {
15816   RedBlackNode(this);
15817   this.x =
15818   this.y =
15819   this.arc =
15820   this.site =
15821   this.cy = null;
15822 }
15823
15824 function attachCircle(arc) {
15825   var lArc = arc.P,
15826       rArc = arc.N;
15827
15828   if (!lArc || !rArc) return;
15829
15830   var lSite = lArc.site,
15831       cSite = arc.site,
15832       rSite = rArc.site;
15833
15834   if (lSite === rSite) return;
15835
15836   var bx = cSite[0],
15837       by = cSite[1],
15838       ax = lSite[0] - bx,
15839       ay = lSite[1] - by,
15840       cx = rSite[0] - bx,
15841       cy = rSite[1] - by;
15842
15843   var d = 2 * (ax * cy - ay * cx);
15844   if (d >= -epsilon2$2) return;
15845
15846   var ha = ax * ax + ay * ay,
15847       hc = cx * cx + cy * cy,
15848       x = (cy * ha - ay * hc) / d,
15849       y = (ax * hc - cx * ha) / d;
15850
15851   var circle = circlePool.pop() || new Circle;
15852   circle.arc = arc;
15853   circle.site = cSite;
15854   circle.x = x + bx;
15855   circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom
15856
15857   arc.circle = circle;
15858
15859   var before = null,
15860       node = circles._;
15861
15862   while (node) {
15863     if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {
15864       if (node.L) node = node.L;
15865       else { before = node.P; break; }
15866     } else {
15867       if (node.R) node = node.R;
15868       else { before = node; break; }
15869     }
15870   }
15871
15872   circles.insert(before, circle);
15873   if (!before) firstCircle = circle;
15874 }
15875
15876 function detachCircle(arc) {
15877   var circle = arc.circle;
15878   if (circle) {
15879     if (!circle.P) firstCircle = circle.N;
15880     circles.remove(circle);
15881     circlePool.push(circle);
15882     RedBlackNode(circle);
15883     arc.circle = null;
15884   }
15885 }
15886
15887 var beachPool = [];
15888
15889 function Beach() {
15890   RedBlackNode(this);
15891   this.edge =
15892   this.site =
15893   this.circle = null;
15894 }
15895
15896 function createBeach(site) {
15897   var beach = beachPool.pop() || new Beach;
15898   beach.site = site;
15899   return beach;
15900 }
15901
15902 function detachBeach(beach) {
15903   detachCircle(beach);
15904   beaches.remove(beach);
15905   beachPool.push(beach);
15906   RedBlackNode(beach);
15907 }
15908
15909 function removeBeach(beach) {
15910   var circle = beach.circle,
15911       x = circle.x,
15912       y = circle.cy,
15913       vertex = [x, y],
15914       previous = beach.P,
15915       next = beach.N,
15916       disappearing = [beach];
15917
15918   detachBeach(beach);
15919
15920   var lArc = previous;
15921   while (lArc.circle
15922       && Math.abs(x - lArc.circle.x) < epsilon$4
15923       && Math.abs(y - lArc.circle.cy) < epsilon$4) {
15924     previous = lArc.P;
15925     disappearing.unshift(lArc);
15926     detachBeach(lArc);
15927     lArc = previous;
15928   }
15929
15930   disappearing.unshift(lArc);
15931   detachCircle(lArc);
15932
15933   var rArc = next;
15934   while (rArc.circle
15935       && Math.abs(x - rArc.circle.x) < epsilon$4
15936       && Math.abs(y - rArc.circle.cy) < epsilon$4) {
15937     next = rArc.N;
15938     disappearing.push(rArc);
15939     detachBeach(rArc);
15940     rArc = next;
15941   }
15942
15943   disappearing.push(rArc);
15944   detachCircle(rArc);
15945
15946   var nArcs = disappearing.length,
15947       iArc;
15948   for (iArc = 1; iArc < nArcs; ++iArc) {
15949     rArc = disappearing[iArc];
15950     lArc = disappearing[iArc - 1];
15951     setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
15952   }
15953
15954   lArc = disappearing[0];
15955   rArc = disappearing[nArcs - 1];
15956   rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);
15957
15958   attachCircle(lArc);
15959   attachCircle(rArc);
15960 }
15961
15962 function addBeach(site) {
15963   var x = site[0],
15964       directrix = site[1],
15965       lArc,
15966       rArc,
15967       dxl,
15968       dxr,
15969       node = beaches._;
15970
15971   while (node) {
15972     dxl = leftBreakPoint(node, directrix) - x;
15973     if (dxl > epsilon$4) node = node.L; else {
15974       dxr = x - rightBreakPoint(node, directrix);
15975       if (dxr > epsilon$4) {
15976         if (!node.R) {
15977           lArc = node;
15978           break;
15979         }
15980         node = node.R;
15981       } else {
15982         if (dxl > -epsilon$4) {
15983           lArc = node.P;
15984           rArc = node;
15985         } else if (dxr > -epsilon$4) {
15986           lArc = node;
15987           rArc = node.N;
15988         } else {
15989           lArc = rArc = node;
15990         }
15991         break;
15992       }
15993     }
15994   }
15995
15996   createCell(site);
15997   var newArc = createBeach(site);
15998   beaches.insert(lArc, newArc);
15999
16000   if (!lArc && !rArc) return;
16001
16002   if (lArc === rArc) {
16003     detachCircle(lArc);
16004     rArc = createBeach(lArc.site);
16005     beaches.insert(newArc, rArc);
16006     newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);
16007     attachCircle(lArc);
16008     attachCircle(rArc);
16009     return;
16010   }
16011
16012   if (!rArc) { // && lArc
16013     newArc.edge = createEdge(lArc.site, newArc.site);
16014     return;
16015   }
16016
16017   // else lArc !== rArc
16018   detachCircle(lArc);
16019   detachCircle(rArc);
16020
16021   var lSite = lArc.site,
16022       ax = lSite[0],
16023       ay = lSite[1],
16024       bx = site[0] - ax,
16025       by = site[1] - ay,
16026       rSite = rArc.site,
16027       cx = rSite[0] - ax,
16028       cy = rSite[1] - ay,
16029       d = 2 * (bx * cy - by * cx),
16030       hb = bx * bx + by * by,
16031       hc = cx * cx + cy * cy,
16032       vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];
16033
16034   setEdgeEnd(rArc.edge, lSite, rSite, vertex);
16035   newArc.edge = createEdge(lSite, site, null, vertex);
16036   rArc.edge = createEdge(site, rSite, null, vertex);
16037   attachCircle(lArc);
16038   attachCircle(rArc);
16039 }
16040
16041 function leftBreakPoint(arc, directrix) {
16042   var site = arc.site,
16043       rfocx = site[0],
16044       rfocy = site[1],
16045       pby2 = rfocy - directrix;
16046
16047   if (!pby2) return rfocx;
16048
16049   var lArc = arc.P;
16050   if (!lArc) return -Infinity;
16051
16052   site = lArc.site;
16053   var lfocx = site[0],
16054       lfocy = site[1],
16055       plby2 = lfocy - directrix;
16056
16057   if (!plby2) return lfocx;
16058
16059   var hl = lfocx - rfocx,
16060       aby2 = 1 / pby2 - 1 / plby2,
16061       b = hl / plby2;
16062
16063   if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
16064
16065   return (rfocx + lfocx) / 2;
16066 }
16067
16068 function rightBreakPoint(arc, directrix) {
16069   var rArc = arc.N;
16070   if (rArc) return leftBreakPoint(rArc, directrix);
16071   var site = arc.site;
16072   return site[1] === directrix ? site[0] : Infinity;
16073 }
16074
16075 var epsilon$4 = 1e-6;
16076 var epsilon2$2 = 1e-12;
16077 var beaches;
16078 var cells;
16079 var circles;
16080 var edges;
16081
16082 function triangleArea(a, b, c) {
16083   return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);
16084 }
16085
16086 function lexicographic(a, b) {
16087   return b[1] - a[1]
16088       || b[0] - a[0];
16089 }
16090
16091 function Diagram(sites, extent) {
16092   var site = sites.sort(lexicographic).pop(),
16093       x,
16094       y,
16095       circle;
16096
16097   edges = [];
16098   cells = new Array(sites.length);
16099   beaches = new RedBlackTree;
16100   circles = new RedBlackTree;
16101
16102   while (true) {
16103     circle = firstCircle;
16104     if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {
16105       if (site[0] !== x || site[1] !== y) {
16106         addBeach(site);
16107         x = site[0], y = site[1];
16108       }
16109       site = sites.pop();
16110     } else if (circle) {
16111       removeBeach(circle.arc);
16112     } else {
16113       break;
16114     }
16115   }
16116
16117   sortCellHalfedges();
16118
16119   if (extent) {
16120     var x0 = +extent[0][0],
16121         y0 = +extent[0][1],
16122         x1 = +extent[1][0],
16123         y1 = +extent[1][1];
16124     clipEdges(x0, y0, x1, y1);
16125     clipCells(x0, y0, x1, y1);
16126   }
16127
16128   this.edges = edges;
16129   this.cells = cells;
16130
16131   beaches =
16132   circles =
16133   edges =
16134   cells = null;
16135 }
16136
16137 Diagram.prototype = {
16138   constructor: Diagram,
16139
16140   polygons: function() {
16141     var edges = this.edges;
16142
16143     return this.cells.map(function(cell) {
16144       var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });
16145       polygon.data = cell.site.data;
16146       return polygon;
16147     });
16148   },
16149
16150   triangles: function() {
16151     var triangles = [],
16152         edges = this.edges;
16153
16154     this.cells.forEach(function(cell, i) {
16155       if (!(m = (halfedges = cell.halfedges).length)) return;
16156       var site = cell.site,
16157           halfedges,
16158           j = -1,
16159           m,
16160           s0,
16161           e1 = edges[halfedges[m - 1]],
16162           s1 = e1.left === site ? e1.right : e1.left;
16163
16164       while (++j < m) {
16165         s0 = s1;
16166         e1 = edges[halfedges[j]];
16167         s1 = e1.left === site ? e1.right : e1.left;
16168         if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {
16169           triangles.push([site.data, s0.data, s1.data]);
16170         }
16171       }
16172     });
16173
16174     return triangles;
16175   },
16176
16177   links: function() {
16178     return this.edges.filter(function(edge) {
16179       return edge.right;
16180     }).map(function(edge) {
16181       return {
16182         source: edge.left.data,
16183         target: edge.right.data
16184       };
16185     });
16186   },
16187
16188   find: function(x, y, radius) {
16189     var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;
16190
16191     // Use the previously-found cell, or start with an arbitrary one.
16192     while (!(cell = that.cells[i1])) if (++i1 >= n) return null;
16193     var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;
16194
16195     // Traverse the half-edges to find a closer cell, if any.
16196     do {
16197       cell = that.cells[i0 = i1], i1 = null;
16198       cell.halfedges.forEach(function(e) {
16199         var edge = that.edges[e], v = edge.left;
16200         if ((v === cell.site || !v) && !(v = edge.right)) return;
16201         var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;
16202         if (v2 < d2) d2 = v2, i1 = v.index;
16203       });
16204     } while (i1 !== null);
16205
16206     that._found = i0;
16207
16208     return radius == null || d2 <= radius * radius ? cell.site : null;
16209   }
16210 };
16211
16212 function voronoi() {
16213   var x$$1 = x$4,
16214       y$$1 = y$4,
16215       extent = null;
16216
16217   function voronoi(data) {
16218     return new Diagram(data.map(function(d, i) {
16219       var s = [Math.round(x$$1(d, i, data) / epsilon$4) * epsilon$4, Math.round(y$$1(d, i, data) / epsilon$4) * epsilon$4];
16220       s.index = i;
16221       s.data = d;
16222       return s;
16223     }), extent);
16224   }
16225
16226   voronoi.polygons = function(data) {
16227     return voronoi(data).polygons();
16228   };
16229
16230   voronoi.links = function(data) {
16231     return voronoi(data).links();
16232   };
16233
16234   voronoi.triangles = function(data) {
16235     return voronoi(data).triangles();
16236   };
16237
16238   voronoi.x = function(_) {
16239     return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$11(+_), voronoi) : x$$1;
16240   };
16241
16242   voronoi.y = function(_) {
16243     return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$11(+_), voronoi) : y$$1;
16244   };
16245
16246   voronoi.extent = function(_) {
16247     return arguments.length ? (extent = _ == null ? null : [[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]], voronoi) : extent && [[extent[0][0], extent[0][1]], [extent[1][0], extent[1][1]]];
16248   };
16249
16250   voronoi.size = function(_) {
16251     return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]];
16252   };
16253
16254   return voronoi;
16255 }
16256
16257 function constant$12(x) {
16258   return function() {
16259     return x;
16260   };
16261 }
16262
16263 function ZoomEvent(target, type, transform) {
16264   this.target = target;
16265   this.type = type;
16266   this.transform = transform;
16267 }
16268
16269 function Transform(k, x, y) {
16270   this.k = k;
16271   this.x = x;
16272   this.y = y;
16273 }
16274
16275 Transform.prototype = {
16276   constructor: Transform,
16277   scale: function(k) {
16278     return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
16279   },
16280   translate: function(x, y) {
16281     return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
16282   },
16283   apply: function(point) {
16284     return [point[0] * this.k + this.x, point[1] * this.k + this.y];
16285   },
16286   applyX: function(x) {
16287     return x * this.k + this.x;
16288   },
16289   applyY: function(y) {
16290     return y * this.k + this.y;
16291   },
16292   invert: function(location) {
16293     return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
16294   },
16295   invertX: function(x) {
16296     return (x - this.x) / this.k;
16297   },
16298   invertY: function(y) {
16299     return (y - this.y) / this.k;
16300   },
16301   rescaleX: function(x) {
16302     return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
16303   },
16304   rescaleY: function(y) {
16305     return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
16306   },
16307   toString: function() {
16308     return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
16309   }
16310 };
16311
16312 var identity$7 = new Transform(1, 0, 0);
16313
16314 transform.prototype = Transform.prototype;
16315
16316 function transform(node) {
16317   return node.__zoom || identity$7;
16318 }
16319
16320 function nopropagation$2() {
16321   event.stopImmediatePropagation();
16322 }
16323
16324 function noevent$2() {
16325   event.preventDefault();
16326   event.stopImmediatePropagation();
16327 }
16328
16329 // Ignore right-click, since that should open the context menu.
16330 function defaultFilter$2() {
16331   return !event.button;
16332 }
16333
16334 function defaultExtent$1() {
16335   var e = this, w, h;
16336   if (e instanceof SVGElement) {
16337     e = e.ownerSVGElement || e;
16338     w = e.width.baseVal.value;
16339     h = e.height.baseVal.value;
16340   } else {
16341     w = e.clientWidth;
16342     h = e.clientHeight;
16343   }
16344   return [[0, 0], [w, h]];
16345 }
16346
16347 function defaultTransform() {
16348   return this.__zoom || identity$7;
16349 }
16350
16351 function defaultWheelDelta() {
16352   return -event.deltaY * (event.deltaMode ? 120 : 1) / 500;
16353 }
16354
16355 function defaultTouchable$1() {
16356   return "ontouchstart" in this;
16357 }
16358
16359 function defaultConstrain(transform$$1, extent, translateExtent) {
16360   var dx0 = transform$$1.invertX(extent[0][0]) - translateExtent[0][0],
16361       dx1 = transform$$1.invertX(extent[1][0]) - translateExtent[1][0],
16362       dy0 = transform$$1.invertY(extent[0][1]) - translateExtent[0][1],
16363       dy1 = transform$$1.invertY(extent[1][1]) - translateExtent[1][1];
16364   return transform$$1.translate(
16365     dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
16366     dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
16367   );
16368 }
16369
16370 function d3_zoom() {
16371   var filter = defaultFilter$2,
16372       extent = defaultExtent$1,
16373       constrain = defaultConstrain,
16374       wheelDelta = defaultWheelDelta,
16375       touchable = defaultTouchable$1,
16376       scaleExtent = [0, Infinity],
16377       translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],
16378       duration = 250,
16379       interpolate = interpolateZoom,
16380       gestures = [],
16381       listeners = dispatch("start", "zoom", "end"),
16382       touchstarting,
16383       touchending,
16384       touchDelay = 500,
16385       wheelDelay = 150,
16386       clickDistance2 = 0;
16387
16388   function zoom(selection$$1) {
16389     selection$$1
16390         .property("__zoom", defaultTransform)
16391         .on("wheel.zoom", wheeled)
16392         .on("mousedown.zoom", mousedowned)
16393         .on("dblclick.zoom", dblclicked)
16394       .filter(touchable)
16395         .on("touchstart.zoom", touchstarted)
16396         .on("touchmove.zoom", touchmoved)
16397         .on("touchend.zoom touchcancel.zoom", touchended)
16398         .style("touch-action", "none")
16399         .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
16400   }
16401
16402   zoom.transform = function(collection, transform$$1) {
16403     var selection$$1 = collection.selection ? collection.selection() : collection;
16404     selection$$1.property("__zoom", defaultTransform);
16405     if (collection !== selection$$1) {
16406       schedule(collection, transform$$1);
16407     } else {
16408       selection$$1.interrupt().each(function() {
16409         gesture(this, arguments)
16410             .start()
16411             .zoom(null, typeof transform$$1 === "function" ? transform$$1.apply(this, arguments) : transform$$1)
16412             .end();
16413       });
16414     }
16415   };
16416
16417   zoom.scaleBy = function(selection$$1, k) {
16418     zoom.scaleTo(selection$$1, function() {
16419       var k0 = this.__zoom.k,
16420           k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16421       return k0 * k1;
16422     });
16423   };
16424
16425   zoom.scaleTo = function(selection$$1, k) {
16426     zoom.transform(selection$$1, function() {
16427       var e = extent.apply(this, arguments),
16428           t0 = this.__zoom,
16429           p0 = centroid(e),
16430           p1 = t0.invert(p0),
16431           k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16432       return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
16433     });
16434   };
16435
16436   zoom.translateBy = function(selection$$1, x, y) {
16437     zoom.transform(selection$$1, function() {
16438       return constrain(this.__zoom.translate(
16439         typeof x === "function" ? x.apply(this, arguments) : x,
16440         typeof y === "function" ? y.apply(this, arguments) : y
16441       ), extent.apply(this, arguments), translateExtent);
16442     });
16443   };
16444
16445   zoom.translateTo = function(selection$$1, x, y) {
16446     zoom.transform(selection$$1, function() {
16447       var e = extent.apply(this, arguments),
16448           t = this.__zoom,
16449           p = centroid(e);
16450       return constrain(identity$7.translate(p[0], p[1]).scale(t.k).translate(
16451         typeof x === "function" ? -x.apply(this, arguments) : -x,
16452         typeof y === "function" ? -y.apply(this, arguments) : -y
16453       ), e, translateExtent);
16454     });
16455   };
16456
16457   function scale(transform$$1, k) {
16458     k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
16459     return k === transform$$1.k ? transform$$1 : new Transform(k, transform$$1.x, transform$$1.y);
16460   }
16461
16462   function translate(transform$$1, p0, p1) {
16463     var x = p0[0] - p1[0] * transform$$1.k, y = p0[1] - p1[1] * transform$$1.k;
16464     return x === transform$$1.x && y === transform$$1.y ? transform$$1 : new Transform(transform$$1.k, x, y);
16465   }
16466
16467   function centroid(extent) {
16468     return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
16469   }
16470
16471   function schedule(transition$$1, transform$$1, center) {
16472     transition$$1
16473         .on("start.zoom", function() { gesture(this, arguments).start(); })
16474         .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); })
16475         .tween("zoom", function() {
16476           var that = this,
16477               args = arguments,
16478               g = gesture(that, args),
16479               e = extent.apply(that, args),
16480               p = center || centroid(e),
16481               w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
16482               a = that.__zoom,
16483               b = typeof transform$$1 === "function" ? transform$$1.apply(that, args) : transform$$1,
16484               i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
16485           return function(t) {
16486             if (t === 1) t = b; // Avoid rounding error on end.
16487             else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }
16488             g.zoom(null, t);
16489           };
16490         });
16491   }
16492
16493   function gesture(that, args) {
16494     for (var i = 0, n = gestures.length, g; i < n; ++i) {
16495       if ((g = gestures[i]).that === that) {
16496         return g;
16497       }
16498     }
16499     return new Gesture(that, args);
16500   }
16501
16502   function Gesture(that, args) {
16503     this.that = that;
16504     this.args = args;
16505     this.index = -1;
16506     this.active = 0;
16507     this.extent = extent.apply(that, args);
16508   }
16509
16510   Gesture.prototype = {
16511     start: function() {
16512       if (++this.active === 1) {
16513         this.index = gestures.push(this) - 1;
16514         this.emit("start");
16515       }
16516       return this;
16517     },
16518     zoom: function(key, transform$$1) {
16519       if (this.mouse && key !== "mouse") this.mouse[1] = transform$$1.invert(this.mouse[0]);
16520       if (this.touch0 && key !== "touch") this.touch0[1] = transform$$1.invert(this.touch0[0]);
16521       if (this.touch1 && key !== "touch") this.touch1[1] = transform$$1.invert(this.touch1[0]);
16522       this.that.__zoom = transform$$1;
16523       this.emit("zoom");
16524       return this;
16525     },
16526     end: function() {
16527       if (--this.active === 0) {
16528         gestures.splice(this.index, 1);
16529         this.index = -1;
16530         this.emit("end");
16531       }
16532       return this;
16533     },
16534     emit: function(type) {
16535       customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);
16536     }
16537   };
16538
16539   function wheeled() {
16540     if (!filter.apply(this, arguments)) return;
16541     var g = gesture(this, arguments),
16542         t = this.__zoom,
16543         k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
16544         p = d3_mouse(this);
16545
16546     // If the mouse is in the same location as before, reuse it.
16547     // If there were recent wheel events, reset the wheel idle timeout.
16548     if (g.wheel) {
16549       if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
16550         g.mouse[1] = t.invert(g.mouse[0] = p);
16551       }
16552       clearTimeout(g.wheel);
16553     }
16554
16555     // If this wheel event won’t trigger a transform change, ignore it.
16556     else if (t.k === k) return;
16557
16558     // Otherwise, capture the mouse point and location at the start.
16559     else {
16560       g.mouse = [p, t.invert(p)];
16561       interrupt(this);
16562       g.start();
16563     }
16564
16565     noevent$2();
16566     g.wheel = setTimeout(wheelidled, wheelDelay);
16567     g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
16568
16569     function wheelidled() {
16570       g.wheel = null;
16571       g.end();
16572     }
16573   }
16574
16575   function mousedowned() {
16576     if (touchending || !filter.apply(this, arguments)) return;
16577     var g = gesture(this, arguments),
16578         v = d3_select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),
16579         p = d3_mouse(this),
16580         x0 = event.clientX,
16581         y0 = event.clientY;
16582
16583     dragDisable(event.view);
16584     nopropagation$2();
16585     g.mouse = [p, this.__zoom.invert(p)];
16586     interrupt(this);
16587     g.start();
16588
16589     function mousemoved() {
16590       noevent$2();
16591       if (!g.moved) {
16592         var dx = event.clientX - x0, dy = event.clientY - y0;
16593         g.moved = dx * dx + dy * dy > clickDistance2;
16594       }
16595       g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = d3_mouse(g.that), g.mouse[1]), g.extent, translateExtent));
16596     }
16597
16598     function mouseupped() {
16599       v.on("mousemove.zoom mouseup.zoom", null);
16600       yesdrag(event.view, g.moved);
16601       noevent$2();
16602       g.end();
16603     }
16604   }
16605
16606   function dblclicked() {
16607     if (!filter.apply(this, arguments)) return;
16608     var t0 = this.__zoom,
16609         p0 = d3_mouse(this),
16610         p1 = t0.invert(p0),
16611         k1 = t0.k * (event.shiftKey ? 0.5 : 2),
16612         t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent);
16613
16614     noevent$2();
16615     if (duration > 0) d3_select(this).transition().duration(duration).call(schedule, t1, p0);
16616     else d3_select(this).call(zoom.transform, t1);
16617   }
16618
16619   function touchstarted() {
16620     if (!filter.apply(this, arguments)) return;
16621     var g = gesture(this, arguments),
16622         touches = event.changedTouches,
16623         started,
16624         n = touches.length, i, t, p;
16625
16626     nopropagation$2();
16627     for (i = 0; i < n; ++i) {
16628       t = touches[i], p = touch(this, touches, t.identifier);
16629       p = [p, this.__zoom.invert(p), t.identifier];
16630       if (!g.touch0) g.touch0 = p, started = true;
16631       else if (!g.touch1) g.touch1 = p;
16632     }
16633
16634     // If this is a dbltap, reroute to the (optional) dblclick.zoom handler.
16635     if (touchstarting) {
16636       touchstarting = clearTimeout(touchstarting);
16637       if (!g.touch1) {
16638         g.end();
16639         p = d3_select(this).on("dblclick.zoom");
16640         if (p) p.apply(this, arguments);
16641         return;
16642       }
16643     }
16644
16645     if (started) {
16646       touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
16647       interrupt(this);
16648       g.start();
16649     }
16650   }
16651
16652   function touchmoved() {
16653     var g = gesture(this, arguments),
16654         touches = event.changedTouches,
16655         n = touches.length, i, t, p, l;
16656
16657     noevent$2();
16658     if (touchstarting) touchstarting = clearTimeout(touchstarting);
16659     for (i = 0; i < n; ++i) {
16660       t = touches[i], p = touch(this, touches, t.identifier);
16661       if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;
16662       else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;
16663     }
16664     t = g.that.__zoom;
16665     if (g.touch1) {
16666       var p0 = g.touch0[0], l0 = g.touch0[1],
16667           p1 = g.touch1[0], l1 = g.touch1[1],
16668           dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
16669           dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
16670       t = scale(t, Math.sqrt(dp / dl));
16671       p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
16672       l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
16673     }
16674     else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
16675     else return;
16676     g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
16677   }
16678
16679   function touchended() {
16680     var g = gesture(this, arguments),
16681         touches = event.changedTouches,
16682         n = touches.length, i, t;
16683
16684     nopropagation$2();
16685     if (touchending) clearTimeout(touchending);
16686     touchending = setTimeout(function() { touchending = null; }, touchDelay);
16687     for (i = 0; i < n; ++i) {
16688       t = touches[i];
16689       if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;
16690       else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;
16691     }
16692     if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;
16693     if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);
16694     else g.end();
16695   }
16696
16697   zoom.wheelDelta = function(_) {
16698     return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$12(+_), zoom) : wheelDelta;
16699   };
16700
16701   zoom.filter = function(_) {
16702     return arguments.length ? (filter = typeof _ === "function" ? _ : constant$12(!!_), zoom) : filter;
16703   };
16704
16705   zoom.touchable = function(_) {
16706     return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$12(!!_), zoom) : touchable;
16707   };
16708
16709   zoom.extent = function(_) {
16710     return arguments.length ? (extent = typeof _ === "function" ? _ : constant$12([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
16711   };
16712
16713   zoom.scaleExtent = function(_) {
16714     return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
16715   };
16716
16717   zoom.translateExtent = function(_) {
16718     return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];
16719   };
16720
16721   zoom.constrain = function(_) {
16722     return arguments.length ? (constrain = _, zoom) : constrain;
16723   };
16724
16725   zoom.duration = function(_) {
16726     return arguments.length ? (duration = +_, zoom) : duration;
16727   };
16728
16729   zoom.interpolate = function(_) {
16730     return arguments.length ? (interpolate = _, zoom) : interpolate;
16731   };
16732
16733   zoom.on = function() {
16734     var value = listeners.on.apply(listeners, arguments);
16735     return value === listeners ? zoom : value;
16736   };
16737
16738   zoom.clickDistance = function(_) {
16739     return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
16740   };
16741
16742   return zoom;
16743 }
16744
16745
16746
16747 var index$3 = Object.freeze({
16748         version: version,
16749         bisect: bisectRight,
16750         bisectRight: bisectRight,
16751         bisectLeft: bisectLeft,
16752         ascending: d3_ascending,
16753         bisector: d3_bisector,
16754         cross: cross,
16755         descending: d3_descending,
16756         deviation: deviation,
16757         extent: extent,
16758         histogram: histogram,
16759         thresholdFreedmanDiaconis: freedmanDiaconis,
16760         thresholdScott: scott,
16761         thresholdSturges: sturges,
16762         max: max,
16763         mean: mean,
16764         median: d3_median,
16765         merge: merge,
16766         min: min,
16767         pairs: pairs,
16768         permute: permute,
16769         quantile: threshold,
16770         range: d3_range,
16771         scan: scan,
16772         shuffle: shuffle,
16773         sum: sum,
16774         ticks: ticks,
16775         tickIncrement: tickIncrement,
16776         tickStep: tickStep,
16777         transpose: transpose,
16778         variance: variance,
16779         zip: zip,
16780         axisTop: axisTop,
16781         axisRight: axisRight,
16782         axisBottom: axisBottom,
16783         axisLeft: axisLeft,
16784         brush: brush,
16785         brushX: brushX,
16786         brushY: brushY,
16787         brushSelection: brushSelection,
16788         chord: chord,
16789         ribbon: ribbon,
16790         nest: nest,
16791         set: set$2,
16792         map: map$1,
16793         keys: keys,
16794         values: values,
16795         entries: entries,
16796         color: color,
16797         rgb: rgb,
16798         hsl: hsl,
16799         lab: lab,
16800         hcl: hcl,
16801         cubehelix: cubehelix,
16802         dispatch: dispatch,
16803         drag: drag,
16804         dragDisable: dragDisable,
16805         dragEnable: yesdrag,
16806         dsvFormat: dsv,
16807         csvParse: csvParse,
16808         csvParseRows: csvParseRows,
16809         csvFormat: csvFormat,
16810         csvFormatRows: csvFormatRows,
16811         tsvParse: tsvParse,
16812         tsvParseRows: tsvParseRows,
16813         tsvFormat: tsvFormat,
16814         tsvFormatRows: tsvFormatRows,
16815         easeLinear: linear$1,
16816         easeQuad: quadInOut,
16817         easeQuadIn: quadIn,
16818         easeQuadOut: quadOut,
16819         easeQuadInOut: quadInOut,
16820         easeCubic: cubicInOut,
16821         easeCubicIn: cubicIn,
16822         easeCubicOut: cubicOut,
16823         easeCubicInOut: cubicInOut,
16824         easePoly: polyInOut,
16825         easePolyIn: polyIn,
16826         easePolyOut: polyOut,
16827         easePolyInOut: polyInOut,
16828         easeSin: sinInOut,
16829         easeSinIn: sinIn,
16830         easeSinOut: sinOut,
16831         easeSinInOut: sinInOut,
16832         easeExp: expInOut,
16833         easeExpIn: expIn,
16834         easeExpOut: expOut,
16835         easeExpInOut: expInOut,
16836         easeCircle: circleInOut,
16837         easeCircleIn: circleIn,
16838         easeCircleOut: circleOut,
16839         easeCircleInOut: circleInOut,
16840         easeBounce: bounceOut,
16841         easeBounceIn: bounceIn,
16842         easeBounceOut: bounceOut,
16843         easeBounceInOut: bounceInOut,
16844         easeBack: backInOut,
16845         easeBackIn: backIn,
16846         easeBackOut: backOut,
16847         easeBackInOut: backInOut,
16848         easeElastic: elasticOut,
16849         easeElasticIn: elasticIn,
16850         easeElasticOut: elasticOut,
16851         easeElasticInOut: elasticInOut,
16852         forceCenter: center$1,
16853         forceCollide: collide,
16854         forceLink: link,
16855         forceManyBody: manyBody,
16856         forceRadial: radial,
16857         forceSimulation: simulation,
16858         forceX: x$2,
16859         forceY: y$2,
16860         formatDefaultLocale: defaultLocale,
16861         get format () { return format; },
16862         get formatPrefix () { return formatPrefix; },
16863         formatLocale: formatLocale,
16864         formatSpecifier: formatSpecifier,
16865         precisionFixed: precisionFixed,
16866         precisionPrefix: precisionPrefix,
16867         precisionRound: precisionRound,
16868         geoArea: d3_geoArea,
16869         geoBounds: d3_geoBounds,
16870         geoCentroid: d3_geoCentroid,
16871         geoCircle: circle,
16872         geoClipAntimeridian: clipAntimeridian,
16873         geoClipCircle: clipCircle,
16874         geoClipExtent: extent$1,
16875         geoClipRectangle: clipRectangle,
16876         geoContains: contains,
16877         geoDistance: distance,
16878         geoGraticule: graticule,
16879         geoGraticule10: graticule10,
16880         geoInterpolate: interpolate$1,
16881         geoLength: d3_geoLength,
16882         geoPath: d3_geoPath,
16883         geoAlbers: albers,
16884         geoAlbersUsa: albersUsa,
16885         geoAzimuthalEqualArea: azimuthalEqualArea,
16886         geoAzimuthalEqualAreaRaw: azimuthalEqualAreaRaw,
16887         geoAzimuthalEquidistant: azimuthalEquidistant,
16888         geoAzimuthalEquidistantRaw: azimuthalEquidistantRaw,
16889         geoConicConformal: conicConformal,
16890         geoConicConformalRaw: conicConformalRaw,
16891         geoConicEqualArea: conicEqualArea,
16892         geoConicEqualAreaRaw: conicEqualAreaRaw,
16893         geoConicEquidistant: conicEquidistant,
16894         geoConicEquidistantRaw: conicEquidistantRaw,
16895         geoEquirectangular: equirectangular,
16896         geoEquirectangularRaw: equirectangularRaw,
16897         geoGnomonic: gnomonic,
16898         geoGnomonicRaw: gnomonicRaw,
16899         geoIdentity: d3_geoIdentity,
16900         geoProjection: projection,
16901         geoProjectionMutator: projectionMutator,
16902         geoMercator: mercator,
16903         geoMercatorRaw: mercatorRaw,
16904         geoNaturalEarth1: naturalEarth1,
16905         geoNaturalEarth1Raw: naturalEarth1Raw,
16906         geoOrthographic: orthographic,
16907         geoOrthographicRaw: orthographicRaw,
16908         geoStereographic: stereographic,
16909         geoStereographicRaw: stereographicRaw,
16910         geoTransverseMercator: transverseMercator,
16911         geoTransverseMercatorRaw: transverseMercatorRaw,
16912         geoRotation: rotation,
16913         geoStream: d3_geoStream,
16914         geoTransform: d3_geoTransform,
16915         cluster: cluster,
16916         hierarchy: hierarchy,
16917         pack: index$1,
16918         packSiblings: siblings,
16919         packEnclose: enclose,
16920         partition: partition,
16921         stratify: stratify,
16922         tree: tree,
16923         treemap: index$2,
16924         treemapBinary: binary,
16925         treemapDice: treemapDice,
16926         treemapSlice: treemapSlice,
16927         treemapSliceDice: sliceDice,
16928         treemapSquarify: squarify,
16929         treemapResquarify: resquarify,
16930         interpolate: d3_interpolate,
16931         interpolateArray: array$1,
16932         interpolateBasis: basis$1,
16933         interpolateBasisClosed: basisClosed,
16934         interpolateDate: date,
16935         interpolateNumber: d3_interpolateNumber,
16936         interpolateObject: object,
16937         interpolateRound: interpolateRound,
16938         interpolateString: interpolateString,
16939         interpolateTransformCss: interpolateTransformCss,
16940         interpolateTransformSvg: interpolateTransformSvg,
16941         interpolateZoom: interpolateZoom,
16942         interpolateRgb: d3_interpolateRgb,
16943         interpolateRgbBasis: rgbBasis,
16944         interpolateRgbBasisClosed: rgbBasisClosed,
16945         interpolateHsl: hsl$2,
16946         interpolateHslLong: hslLong,
16947         interpolateLab: lab$1,
16948         interpolateHcl: hcl$2,
16949         interpolateHclLong: hclLong,
16950         interpolateCubehelix: cubehelix$2,
16951         interpolateCubehelixLong: cubehelixLong,
16952         quantize: d3_quantize,
16953         path: path,
16954         polygonArea: d3_polygonArea,
16955         polygonCentroid: d3_polygonCentroid,
16956         polygonHull: d3_polygonHull,
16957         polygonContains: contains$1,
16958         polygonLength: length$1,
16959         quadtree: quadtree,
16960         queue: queue,
16961         randomUniform: uniform,
16962         randomNormal: normal,
16963         randomLogNormal: logNormal,
16964         randomBates: bates,
16965         randomIrwinHall: irwinHall,
16966         randomExponential: exponential$1,
16967         request: d3_request,
16968         html: html,
16969         json: d3_json,
16970         text: d3_text,
16971         xml: d3_xml,
16972         csv: csv$1,
16973         tsv: tsv$1,
16974         scaleBand: band,
16975         scalePoint: point$1,
16976         scaleIdentity: identity$5,
16977         scaleLinear: linear$2,
16978         scaleLog: log$1,
16979         scaleOrdinal: ordinal,
16980         scaleImplicit: implicit,
16981         scalePow: pow$1,
16982         scaleSqrt: sqrt$1,
16983         scaleQuantile: quantile$$1,
16984         scaleQuantize: quantize,
16985         scaleThreshold: threshold$1,
16986         scaleTime: time,
16987         scaleUtc: utcTime,
16988         schemeCategory10: category10,
16989         schemeCategory20b: category20b,
16990         schemeCategory20c: category20c,
16991         schemeCategory20: category20,
16992         interpolateCubehelixDefault: cubehelix$3,
16993         interpolateRainbow: rainbow$1,
16994         interpolateWarm: warm,
16995         interpolateCool: cool,
16996         interpolateViridis: viridis,
16997         interpolateMagma: magma,
16998         interpolateInferno: inferno,
16999         interpolatePlasma: plasma,
17000         scaleSequential: sequential,
17001         create: create,
17002         creator: creator,
17003         local: local,
17004         matcher: matcher$1,
17005         mouse: d3_mouse,
17006         namespace: namespace,
17007         namespaces: namespaces,
17008         clientPoint: point,
17009         select: d3_select,
17010         selectAll: d3_selectAll,
17011         selection: selection,
17012         selector: selector,
17013         selectorAll: selectorAll,
17014         style: styleValue,
17015         touch: touch,
17016         touches: d3_touches,
17017         window: defaultView,
17018         get event () { return event; },
17019         customEvent: customEvent,
17020         arc: arc,
17021         area: area,
17022         line: line,
17023         pie: pie,
17024         areaRadial: areaRadial,
17025         radialArea: areaRadial,
17026         lineRadial: lineRadial$1,
17027         radialLine: lineRadial$1,
17028         pointRadial: pointRadial,
17029         linkHorizontal: linkHorizontal,
17030         linkVertical: linkVertical,
17031         linkRadial: linkRadial,
17032         symbol: symbol,
17033         symbols: symbols,
17034         symbolCircle: circle$2,
17035         symbolCross: cross$2,
17036         symbolDiamond: diamond,
17037         symbolSquare: square,
17038         symbolStar: star,
17039         symbolTriangle: triangle,
17040         symbolWye: wye,
17041         curveBasisClosed: basisClosed$1,
17042         curveBasisOpen: basisOpen,
17043         curveBasis: basis$2,
17044         curveBundle: bundle,
17045         curveCardinalClosed: cardinalClosed,
17046         curveCardinalOpen: cardinalOpen,
17047         curveCardinal: cardinal,
17048         curveCatmullRomClosed: catmullRomClosed,
17049         curveCatmullRomOpen: catmullRomOpen,
17050         curveCatmullRom: catmullRom,
17051         curveLinearClosed: linearClosed,
17052         curveLinear: curveLinear,
17053         curveMonotoneX: monotoneX,
17054         curveMonotoneY: monotoneY,
17055         curveNatural: natural,
17056         curveStep: step,
17057         curveStepAfter: stepAfter,
17058         curveStepBefore: stepBefore,
17059         stack: stack,
17060         stackOffsetExpand: expand,
17061         stackOffsetDiverging: diverging,
17062         stackOffsetNone: none$1,
17063         stackOffsetSilhouette: silhouette,
17064         stackOffsetWiggle: wiggle,
17065         stackOrderAscending: ascending$1,
17066         stackOrderDescending: descending$1,
17067         stackOrderInsideOut: insideOut,
17068         stackOrderNone: none$2,
17069         stackOrderReverse: reverse,
17070         timeInterval: newInterval,
17071         timeMillisecond: millisecond,
17072         timeMilliseconds: milliseconds,
17073         utcMillisecond: millisecond,
17074         utcMilliseconds: milliseconds,
17075         timeSecond: second,
17076         timeSeconds: seconds,
17077         utcSecond: second,
17078         utcSeconds: seconds,
17079         timeMinute: minute,
17080         timeMinutes: minutes,
17081         timeHour: hour,
17082         timeHours: hours,
17083         timeDay: day,
17084         timeDays: days,
17085         timeWeek: sunday,
17086         timeWeeks: sundays,
17087         timeSunday: sunday,
17088         timeSundays: sundays,
17089         timeMonday: monday,
17090         timeMondays: mondays,
17091         timeTuesday: tuesday,
17092         timeTuesdays: tuesdays,
17093         timeWednesday: wednesday,
17094         timeWednesdays: wednesdays,
17095         timeThursday: thursday,
17096         timeThursdays: thursdays,
17097         timeFriday: friday,
17098         timeFridays: fridays,
17099         timeSaturday: saturday,
17100         timeSaturdays: saturdays,
17101         timeMonth: month,
17102         timeMonths: months,
17103         timeYear: year,
17104         timeYears: years,
17105         utcMinute: utcMinute,
17106         utcMinutes: utcMinutes,
17107         utcHour: utcHour,
17108         utcHours: utcHours,
17109         utcDay: utcDay,
17110         utcDays: utcDays,
17111         utcWeek: utcSunday,
17112         utcWeeks: utcSundays,
17113         utcSunday: utcSunday,
17114         utcSundays: utcSundays,
17115         utcMonday: utcMonday,
17116         utcMondays: utcMondays,
17117         utcTuesday: utcTuesday,
17118         utcTuesdays: utcTuesdays,
17119         utcWednesday: utcWednesday,
17120         utcWednesdays: utcWednesdays,
17121         utcThursday: utcThursday,
17122         utcThursdays: utcThursdays,
17123         utcFriday: utcFriday,
17124         utcFridays: utcFridays,
17125         utcSaturday: utcSaturday,
17126         utcSaturdays: utcSaturdays,
17127         utcMonth: utcMonth,
17128         utcMonths: utcMonths,
17129         utcYear: utcYear,
17130         utcYears: utcYears,
17131         timeFormatDefaultLocale: defaultLocale$1,
17132         get timeFormat () { return timeFormat; },
17133         get timeParse () { return timeParse; },
17134         get utcFormat () { return utcFormat; },
17135         get utcParse () { return utcParse; },
17136         timeFormatLocale: formatLocale$1,
17137         isoFormat: formatIso,
17138         isoParse: parseIso,
17139         now: now,
17140         timer: timer,
17141         timerFlush: timerFlush,
17142         timeout: d3_timeout,
17143         interval: interval$1,
17144         transition: transition,
17145         active: active,
17146         interrupt: interrupt,
17147         voronoi: voronoi,
17148         zoom: d3_zoom,
17149         zoomTransform: transform,
17150         zoomIdentity: identity$7
17151 });
17152
17153 function actionAddEntity(way) {
17154     return function(graph) {
17155         return graph.replace(way);
17156     };
17157 }
17158
17159 /**
17160  * Removes all key-value entries from the list cache.
17161  *
17162  * @private
17163  * @name clear
17164  * @memberOf ListCache
17165  */
17166 function listCacheClear() {
17167   this.__data__ = [];
17168   this.size = 0;
17169 }
17170
17171 /**
17172  * Performs a
17173  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
17174  * comparison between two values to determine if they are equivalent.
17175  *
17176  * @static
17177  * @memberOf _
17178  * @since 4.0.0
17179  * @category Lang
17180  * @param {*} value The value to compare.
17181  * @param {*} other The other value to compare.
17182  * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
17183  * @example
17184  *
17185  * var object = { 'a': 1 };
17186  * var other = { 'a': 1 };
17187  *
17188  * _.eq(object, object);
17189  * // => true
17190  *
17191  * _.eq(object, other);
17192  * // => false
17193  *
17194  * _.eq('a', 'a');
17195  * // => true
17196  *
17197  * _.eq('a', Object('a'));
17198  * // => false
17199  *
17200  * _.eq(NaN, NaN);
17201  * // => true
17202  */
17203 function eq(value, other) {
17204   return value === other || (value !== value && other !== other);
17205 }
17206
17207 /**
17208  * Gets the index at which the `key` is found in `array` of key-value pairs.
17209  *
17210  * @private
17211  * @param {Array} array The array to inspect.
17212  * @param {*} key The key to search for.
17213  * @returns {number} Returns the index of the matched value, else `-1`.
17214  */
17215 function assocIndexOf(array, key) {
17216   var length = array.length;
17217   while (length--) {
17218     if (eq(array[length][0], key)) {
17219       return length;
17220     }
17221   }
17222   return -1;
17223 }
17224
17225 /** Used for built-in method references. */
17226 var arrayProto = Array.prototype;
17227
17228 /** Built-in value references. */
17229 var splice = arrayProto.splice;
17230
17231 /**
17232  * Removes `key` and its value from the list cache.
17233  *
17234  * @private
17235  * @name delete
17236  * @memberOf ListCache
17237  * @param {string} key The key of the value to remove.
17238  * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17239  */
17240 function listCacheDelete(key) {
17241   var data = this.__data__,
17242       index = assocIndexOf(data, key);
17243
17244   if (index < 0) {
17245     return false;
17246   }
17247   var lastIndex = data.length - 1;
17248   if (index == lastIndex) {
17249     data.pop();
17250   } else {
17251     splice.call(data, index, 1);
17252   }
17253   --this.size;
17254   return true;
17255 }
17256
17257 /**
17258  * Gets the list cache value for `key`.
17259  *
17260  * @private
17261  * @name get
17262  * @memberOf ListCache
17263  * @param {string} key The key of the value to get.
17264  * @returns {*} Returns the entry value.
17265  */
17266 function listCacheGet(key) {
17267   var data = this.__data__,
17268       index = assocIndexOf(data, key);
17269
17270   return index < 0 ? undefined : data[index][1];
17271 }
17272
17273 /**
17274  * Checks if a list cache value for `key` exists.
17275  *
17276  * @private
17277  * @name has
17278  * @memberOf ListCache
17279  * @param {string} key The key of the entry to check.
17280  * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17281  */
17282 function listCacheHas(key) {
17283   return assocIndexOf(this.__data__, key) > -1;
17284 }
17285
17286 /**
17287  * Sets the list cache `key` to `value`.
17288  *
17289  * @private
17290  * @name set
17291  * @memberOf ListCache
17292  * @param {string} key The key of the value to set.
17293  * @param {*} value The value to set.
17294  * @returns {Object} Returns the list cache instance.
17295  */
17296 function listCacheSet(key, value) {
17297   var data = this.__data__,
17298       index = assocIndexOf(data, key);
17299
17300   if (index < 0) {
17301     ++this.size;
17302     data.push([key, value]);
17303   } else {
17304     data[index][1] = value;
17305   }
17306   return this;
17307 }
17308
17309 /**
17310  * Creates an list cache object.
17311  *
17312  * @private
17313  * @constructor
17314  * @param {Array} [entries] The key-value pairs to cache.
17315  */
17316 function ListCache(entries) {
17317   var index = -1,
17318       length = entries == null ? 0 : entries.length;
17319
17320   this.clear();
17321   while (++index < length) {
17322     var entry = entries[index];
17323     this.set(entry[0], entry[1]);
17324   }
17325 }
17326
17327 // Add methods to `ListCache`.
17328 ListCache.prototype.clear = listCacheClear;
17329 ListCache.prototype['delete'] = listCacheDelete;
17330 ListCache.prototype.get = listCacheGet;
17331 ListCache.prototype.has = listCacheHas;
17332 ListCache.prototype.set = listCacheSet;
17333
17334 /**
17335  * Removes all key-value entries from the stack.
17336  *
17337  * @private
17338  * @name clear
17339  * @memberOf Stack
17340  */
17341 function stackClear() {
17342   this.__data__ = new ListCache;
17343   this.size = 0;
17344 }
17345
17346 /**
17347  * Removes `key` and its value from the stack.
17348  *
17349  * @private
17350  * @name delete
17351  * @memberOf Stack
17352  * @param {string} key The key of the value to remove.
17353  * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17354  */
17355 function stackDelete(key) {
17356   var data = this.__data__,
17357       result = data['delete'](key);
17358
17359   this.size = data.size;
17360   return result;
17361 }
17362
17363 /**
17364  * Gets the stack value for `key`.
17365  *
17366  * @private
17367  * @name get
17368  * @memberOf Stack
17369  * @param {string} key The key of the value to get.
17370  * @returns {*} Returns the entry value.
17371  */
17372 function stackGet(key) {
17373   return this.__data__.get(key);
17374 }
17375
17376 /**
17377  * Checks if a stack value for `key` exists.
17378  *
17379  * @private
17380  * @name has
17381  * @memberOf Stack
17382  * @param {string} key The key of the entry to check.
17383  * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17384  */
17385 function stackHas(key) {
17386   return this.__data__.has(key);
17387 }
17388
17389 /** Detect free variable `global` from Node.js. */
17390 var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
17391
17392 /** Detect free variable `self`. */
17393 var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
17394
17395 /** Used as a reference to the global object. */
17396 var root$2 = freeGlobal || freeSelf || Function('return this')();
17397
17398 /** Built-in value references. */
17399 var Symbol = root$2.Symbol;
17400
17401 /** Used for built-in method references. */
17402 var objectProto = Object.prototype;
17403
17404 /** Used to check objects for own properties. */
17405 var hasOwnProperty = objectProto.hasOwnProperty;
17406
17407 /**
17408  * Used to resolve the
17409  * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17410  * of values.
17411  */
17412 var nativeObjectToString = objectProto.toString;
17413
17414 /** Built-in value references. */
17415 var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
17416
17417 /**
17418  * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
17419  *
17420  * @private
17421  * @param {*} value The value to query.
17422  * @returns {string} Returns the raw `toStringTag`.
17423  */
17424 function getRawTag(value) {
17425   var isOwn = hasOwnProperty.call(value, symToStringTag),
17426       tag = value[symToStringTag];
17427
17428   try {
17429     value[symToStringTag] = undefined;
17430     var unmasked = true;
17431   } catch (e) {}
17432
17433   var result = nativeObjectToString.call(value);
17434   if (unmasked) {
17435     if (isOwn) {
17436       value[symToStringTag] = tag;
17437     } else {
17438       delete value[symToStringTag];
17439     }
17440   }
17441   return result;
17442 }
17443
17444 /** Used for built-in method references. */
17445 var objectProto$1 = Object.prototype;
17446
17447 /**
17448  * Used to resolve the
17449  * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17450  * of values.
17451  */
17452 var nativeObjectToString$1 = objectProto$1.toString;
17453
17454 /**
17455  * Converts `value` to a string using `Object.prototype.toString`.
17456  *
17457  * @private
17458  * @param {*} value The value to convert.
17459  * @returns {string} Returns the converted string.
17460  */
17461 function objectToString(value) {
17462   return nativeObjectToString$1.call(value);
17463 }
17464
17465 /** `Object#toString` result references. */
17466 var nullTag = '[object Null]',
17467     undefinedTag = '[object Undefined]';
17468
17469 /** Built-in value references. */
17470 var symToStringTag$1 = Symbol ? Symbol.toStringTag : undefined;
17471
17472 /**
17473  * The base implementation of `getTag` without fallbacks for buggy environments.
17474  *
17475  * @private
17476  * @param {*} value The value to query.
17477  * @returns {string} Returns the `toStringTag`.
17478  */
17479 function baseGetTag(value) {
17480   if (value == null) {
17481     return value === undefined ? undefinedTag : nullTag;
17482   }
17483   return (symToStringTag$1 && symToStringTag$1 in Object(value))
17484     ? getRawTag(value)
17485     : objectToString(value);
17486 }
17487
17488 /**
17489  * Checks if `value` is the
17490  * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
17491  * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
17492  *
17493  * @static
17494  * @memberOf _
17495  * @since 0.1.0
17496  * @category Lang
17497  * @param {*} value The value to check.
17498  * @returns {boolean} Returns `true` if `value` is an object, else `false`.
17499  * @example
17500  *
17501  * _.isObject({});
17502  * // => true
17503  *
17504  * _.isObject([1, 2, 3]);
17505  * // => true
17506  *
17507  * _.isObject(_.noop);
17508  * // => true
17509  *
17510  * _.isObject(null);
17511  * // => false
17512  */
17513 function isObject(value) {
17514   var type = typeof value;
17515   return value != null && (type == 'object' || type == 'function');
17516 }
17517
17518 /** `Object#toString` result references. */
17519 var asyncTag = '[object AsyncFunction]',
17520     funcTag = '[object Function]',
17521     genTag = '[object GeneratorFunction]',
17522     proxyTag = '[object Proxy]';
17523
17524 /**
17525  * Checks if `value` is classified as a `Function` object.
17526  *
17527  * @static
17528  * @memberOf _
17529  * @since 0.1.0
17530  * @category Lang
17531  * @param {*} value The value to check.
17532  * @returns {boolean} Returns `true` if `value` is a function, else `false`.
17533  * @example
17534  *
17535  * _.isFunction(_);
17536  * // => true
17537  *
17538  * _.isFunction(/abc/);
17539  * // => false
17540  */
17541 function isFunction(value) {
17542   if (!isObject(value)) {
17543     return false;
17544   }
17545   // The use of `Object#toString` avoids issues with the `typeof` operator
17546   // in Safari 9 which returns 'object' for typed arrays and other constructors.
17547   var tag = baseGetTag(value);
17548   return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
17549 }
17550
17551 /** Used to detect overreaching core-js shims. */
17552 var coreJsData = root$2['__core-js_shared__'];
17553
17554 /** Used to detect methods masquerading as native. */
17555 var maskSrcKey = (function() {
17556   var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
17557   return uid ? ('Symbol(src)_1.' + uid) : '';
17558 }());
17559
17560 /**
17561  * Checks if `func` has its source masked.
17562  *
17563  * @private
17564  * @param {Function} func The function to check.
17565  * @returns {boolean} Returns `true` if `func` is masked, else `false`.
17566  */
17567 function isMasked(func) {
17568   return !!maskSrcKey && (maskSrcKey in func);
17569 }
17570
17571 /** Used for built-in method references. */
17572 var funcProto = Function.prototype;
17573
17574 /** Used to resolve the decompiled source of functions. */
17575 var funcToString = funcProto.toString;
17576
17577 /**
17578  * Converts `func` to its source code.
17579  *
17580  * @private
17581  * @param {Function} func The function to convert.
17582  * @returns {string} Returns the source code.
17583  */
17584 function toSource(func) {
17585   if (func != null) {
17586     try {
17587       return funcToString.call(func);
17588     } catch (e) {}
17589     try {
17590       return (func + '');
17591     } catch (e) {}
17592   }
17593   return '';
17594 }
17595
17596 /**
17597  * Used to match `RegExp`
17598  * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
17599  */
17600 var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
17601
17602 /** Used to detect host constructors (Safari). */
17603 var reIsHostCtor = /^\[object .+?Constructor\]$/;
17604
17605 /** Used for built-in method references. */
17606 var funcProto$1 = Function.prototype,
17607     objectProto$2 = Object.prototype;
17608
17609 /** Used to resolve the decompiled source of functions. */
17610 var funcToString$1 = funcProto$1.toString;
17611
17612 /** Used to check objects for own properties. */
17613 var hasOwnProperty$1 = objectProto$2.hasOwnProperty;
17614
17615 /** Used to detect if a method is native. */
17616 var reIsNative = RegExp('^' +
17617   funcToString$1.call(hasOwnProperty$1).replace(reRegExpChar, '\\$&')
17618   .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
17619 );
17620
17621 /**
17622  * The base implementation of `_.isNative` without bad shim checks.
17623  *
17624  * @private
17625  * @param {*} value The value to check.
17626  * @returns {boolean} Returns `true` if `value` is a native function,
17627  *  else `false`.
17628  */
17629 function baseIsNative(value) {
17630   if (!isObject(value) || isMasked(value)) {
17631     return false;
17632   }
17633   var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
17634   return pattern.test(toSource(value));
17635 }
17636
17637 /**
17638  * Gets the value at `key` of `object`.
17639  *
17640  * @private
17641  * @param {Object} [object] The object to query.
17642  * @param {string} key The key of the property to get.
17643  * @returns {*} Returns the property value.
17644  */
17645 function getValue(object, key) {
17646   return object == null ? undefined : object[key];
17647 }
17648
17649 /**
17650  * Gets the native function at `key` of `object`.
17651  *
17652  * @private
17653  * @param {Object} object The object to query.
17654  * @param {string} key The key of the method to get.
17655  * @returns {*} Returns the function if it's native, else `undefined`.
17656  */
17657 function getNative(object, key) {
17658   var value = getValue(object, key);
17659   return baseIsNative(value) ? value : undefined;
17660 }
17661
17662 /* Built-in method references that are verified to be native. */
17663 var Map$1 = getNative(root$2, 'Map');
17664
17665 /* Built-in method references that are verified to be native. */
17666 var nativeCreate = getNative(Object, 'create');
17667
17668 /**
17669  * Removes all key-value entries from the hash.
17670  *
17671  * @private
17672  * @name clear
17673  * @memberOf Hash
17674  */
17675 function hashClear() {
17676   this.__data__ = nativeCreate ? nativeCreate(null) : {};
17677   this.size = 0;
17678 }
17679
17680 /**
17681  * Removes `key` and its value from the hash.
17682  *
17683  * @private
17684  * @name delete
17685  * @memberOf Hash
17686  * @param {Object} hash The hash to modify.
17687  * @param {string} key The key of the value to remove.
17688  * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17689  */
17690 function hashDelete(key) {
17691   var result = this.has(key) && delete this.__data__[key];
17692   this.size -= result ? 1 : 0;
17693   return result;
17694 }
17695
17696 /** Used to stand-in for `undefined` hash values. */
17697 var HASH_UNDEFINED = '__lodash_hash_undefined__';
17698
17699 /** Used for built-in method references. */
17700 var objectProto$3 = Object.prototype;
17701
17702 /** Used to check objects for own properties. */
17703 var hasOwnProperty$2 = objectProto$3.hasOwnProperty;
17704
17705 /**
17706  * Gets the hash value for `key`.
17707  *
17708  * @private
17709  * @name get
17710  * @memberOf Hash
17711  * @param {string} key The key of the value to get.
17712  * @returns {*} Returns the entry value.
17713  */
17714 function hashGet(key) {
17715   var data = this.__data__;
17716   if (nativeCreate) {
17717     var result = data[key];
17718     return result === HASH_UNDEFINED ? undefined : result;
17719   }
17720   return hasOwnProperty$2.call(data, key) ? data[key] : undefined;
17721 }
17722
17723 /** Used for built-in method references. */
17724 var objectProto$4 = Object.prototype;
17725
17726 /** Used to check objects for own properties. */
17727 var hasOwnProperty$3 = objectProto$4.hasOwnProperty;
17728
17729 /**
17730  * Checks if a hash value for `key` exists.
17731  *
17732  * @private
17733  * @name has
17734  * @memberOf Hash
17735  * @param {string} key The key of the entry to check.
17736  * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17737  */
17738 function hashHas(key) {
17739   var data = this.__data__;
17740   return nativeCreate ? (data[key] !== undefined) : hasOwnProperty$3.call(data, key);
17741 }
17742
17743 /** Used to stand-in for `undefined` hash values. */
17744 var HASH_UNDEFINED$1 = '__lodash_hash_undefined__';
17745
17746 /**
17747  * Sets the hash `key` to `value`.
17748  *
17749  * @private
17750  * @name set
17751  * @memberOf Hash
17752  * @param {string} key The key of the value to set.
17753  * @param {*} value The value to set.
17754  * @returns {Object} Returns the hash instance.
17755  */
17756 function hashSet(key, value) {
17757   var data = this.__data__;
17758   this.size += this.has(key) ? 0 : 1;
17759   data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED$1 : value;
17760   return this;
17761 }
17762
17763 /**
17764  * Creates a hash object.
17765  *
17766  * @private
17767  * @constructor
17768  * @param {Array} [entries] The key-value pairs to cache.
17769  */
17770 function Hash(entries) {
17771   var index = -1,
17772       length = entries == null ? 0 : entries.length;
17773
17774   this.clear();
17775   while (++index < length) {
17776     var entry = entries[index];
17777     this.set(entry[0], entry[1]);
17778   }
17779 }
17780
17781 // Add methods to `Hash`.
17782 Hash.prototype.clear = hashClear;
17783 Hash.prototype['delete'] = hashDelete;
17784 Hash.prototype.get = hashGet;
17785 Hash.prototype.has = hashHas;
17786 Hash.prototype.set = hashSet;
17787
17788 /**
17789  * Removes all key-value entries from the map.
17790  *
17791  * @private
17792  * @name clear
17793  * @memberOf MapCache
17794  */
17795 function mapCacheClear() {
17796   this.size = 0;
17797   this.__data__ = {
17798     'hash': new Hash,
17799     'map': new (Map$1 || ListCache),
17800     'string': new Hash
17801   };
17802 }
17803
17804 /**
17805  * Checks if `value` is suitable for use as unique object key.
17806  *
17807  * @private
17808  * @param {*} value The value to check.
17809  * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
17810  */
17811 function isKeyable(value) {
17812   var type = typeof value;
17813   return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
17814     ? (value !== '__proto__')
17815     : (value === null);
17816 }
17817
17818 /**
17819  * Gets the data for `map`.
17820  *
17821  * @private
17822  * @param {Object} map The map to query.
17823  * @param {string} key The reference key.
17824  * @returns {*} Returns the map data.
17825  */
17826 function getMapData(map, key) {
17827   var data = map.__data__;
17828   return isKeyable(key)
17829     ? data[typeof key == 'string' ? 'string' : 'hash']
17830     : data.map;
17831 }
17832
17833 /**
17834  * Removes `key` and its value from the map.
17835  *
17836  * @private
17837  * @name delete
17838  * @memberOf MapCache
17839  * @param {string} key The key of the value to remove.
17840  * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17841  */
17842 function mapCacheDelete(key) {
17843   var result = getMapData(this, key)['delete'](key);
17844   this.size -= result ? 1 : 0;
17845   return result;
17846 }
17847
17848 /**
17849  * Gets the map value for `key`.
17850  *
17851  * @private
17852  * @name get
17853  * @memberOf MapCache
17854  * @param {string} key The key of the value to get.
17855  * @returns {*} Returns the entry value.
17856  */
17857 function mapCacheGet(key) {
17858   return getMapData(this, key).get(key);
17859 }
17860
17861 /**
17862  * Checks if a map value for `key` exists.
17863  *
17864  * @private
17865  * @name has
17866  * @memberOf MapCache
17867  * @param {string} key The key of the entry to check.
17868  * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17869  */
17870 function mapCacheHas(key) {
17871   return getMapData(this, key).has(key);
17872 }
17873
17874 /**
17875  * Sets the map `key` to `value`.
17876  *
17877  * @private
17878  * @name set
17879  * @memberOf MapCache
17880  * @param {string} key The key of the value to set.
17881  * @param {*} value The value to set.
17882  * @returns {Object} Returns the map cache instance.
17883  */
17884 function mapCacheSet(key, value) {
17885   var data = getMapData(this, key),
17886       size = data.size;
17887
17888   data.set(key, value);
17889   this.size += data.size == size ? 0 : 1;
17890   return this;
17891 }
17892
17893 /**
17894  * Creates a map cache object to store key-value pairs.
17895  *
17896  * @private
17897  * @constructor
17898  * @param {Array} [entries] The key-value pairs to cache.
17899  */
17900 function MapCache(entries) {
17901   var index = -1,
17902       length = entries == null ? 0 : entries.length;
17903
17904   this.clear();
17905   while (++index < length) {
17906     var entry = entries[index];
17907     this.set(entry[0], entry[1]);
17908   }
17909 }
17910
17911 // Add methods to `MapCache`.
17912 MapCache.prototype.clear = mapCacheClear;
17913 MapCache.prototype['delete'] = mapCacheDelete;
17914 MapCache.prototype.get = mapCacheGet;
17915 MapCache.prototype.has = mapCacheHas;
17916 MapCache.prototype.set = mapCacheSet;
17917
17918 /** Used as the size to enable large array optimizations. */
17919 var LARGE_ARRAY_SIZE = 200;
17920
17921 /**
17922  * Sets the stack `key` to `value`.
17923  *
17924  * @private
17925  * @name set
17926  * @memberOf Stack
17927  * @param {string} key The key of the value to set.
17928  * @param {*} value The value to set.
17929  * @returns {Object} Returns the stack cache instance.
17930  */
17931 function stackSet(key, value) {
17932   var data = this.__data__;
17933   if (data instanceof ListCache) {
17934     var pairs = data.__data__;
17935     if (!Map$1 || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
17936       pairs.push([key, value]);
17937       this.size = ++data.size;
17938       return this;
17939     }
17940     data = this.__data__ = new MapCache(pairs);
17941   }
17942   data.set(key, value);
17943   this.size = data.size;
17944   return this;
17945 }
17946
17947 /**
17948  * Creates a stack cache object to store key-value pairs.
17949  *
17950  * @private
17951  * @constructor
17952  * @param {Array} [entries] The key-value pairs to cache.
17953  */
17954 function Stack(entries) {
17955   var data = this.__data__ = new ListCache(entries);
17956   this.size = data.size;
17957 }
17958
17959 // Add methods to `Stack`.
17960 Stack.prototype.clear = stackClear;
17961 Stack.prototype['delete'] = stackDelete;
17962 Stack.prototype.get = stackGet;
17963 Stack.prototype.has = stackHas;
17964 Stack.prototype.set = stackSet;
17965
17966 /**
17967  * A specialized version of `_.forEach` for arrays without support for
17968  * iteratee shorthands.
17969  *
17970  * @private
17971  * @param {Array} [array] The array to iterate over.
17972  * @param {Function} iteratee The function invoked per iteration.
17973  * @returns {Array} Returns `array`.
17974  */
17975 function arrayEach(array, iteratee) {
17976   var index = -1,
17977       length = array == null ? 0 : array.length;
17978
17979   while (++index < length) {
17980     if (iteratee(array[index], index, array) === false) {
17981       break;
17982     }
17983   }
17984   return array;
17985 }
17986
17987 var defineProperty = (function() {
17988   try {
17989     var func = getNative(Object, 'defineProperty');
17990     func({}, '', {});
17991     return func;
17992   } catch (e) {}
17993 }());
17994
17995 /**
17996  * The base implementation of `assignValue` and `assignMergeValue` without
17997  * value checks.
17998  *
17999  * @private
18000  * @param {Object} object The object to modify.
18001  * @param {string} key The key of the property to assign.
18002  * @param {*} value The value to assign.
18003  */
18004 function baseAssignValue(object, key, value) {
18005   if (key == '__proto__' && defineProperty) {
18006     defineProperty(object, key, {
18007       'configurable': true,
18008       'enumerable': true,
18009       'value': value,
18010       'writable': true
18011     });
18012   } else {
18013     object[key] = value;
18014   }
18015 }
18016
18017 /** Used for built-in method references. */
18018 var objectProto$5 = Object.prototype;
18019
18020 /** Used to check objects for own properties. */
18021 var hasOwnProperty$4 = objectProto$5.hasOwnProperty;
18022
18023 /**
18024  * Assigns `value` to `key` of `object` if the existing value is not equivalent
18025  * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
18026  * for equality comparisons.
18027  *
18028  * @private
18029  * @param {Object} object The object to modify.
18030  * @param {string} key The key of the property to assign.
18031  * @param {*} value The value to assign.
18032  */
18033 function assignValue(object, key, value) {
18034   var objValue = object[key];
18035   if (!(hasOwnProperty$4.call(object, key) && eq(objValue, value)) ||
18036       (value === undefined && !(key in object))) {
18037     baseAssignValue(object, key, value);
18038   }
18039 }
18040
18041 /**
18042  * Copies properties of `source` to `object`.
18043  *
18044  * @private
18045  * @param {Object} source The object to copy properties from.
18046  * @param {Array} props The property identifiers to copy.
18047  * @param {Object} [object={}] The object to copy properties to.
18048  * @param {Function} [customizer] The function to customize copied values.
18049  * @returns {Object} Returns `object`.
18050  */
18051 function copyObject(source, props, object, customizer) {
18052   var isNew = !object;
18053   object || (object = {});
18054
18055   var index = -1,
18056       length = props.length;
18057
18058   while (++index < length) {
18059     var key = props[index];
18060
18061     var newValue = customizer
18062       ? customizer(object[key], source[key], key, object, source)
18063       : undefined;
18064
18065     if (newValue === undefined) {
18066       newValue = source[key];
18067     }
18068     if (isNew) {
18069       baseAssignValue(object, key, newValue);
18070     } else {
18071       assignValue(object, key, newValue);
18072     }
18073   }
18074   return object;
18075 }
18076
18077 /**
18078  * The base implementation of `_.times` without support for iteratee shorthands
18079  * or max array length checks.
18080  *
18081  * @private
18082  * @param {number} n The number of times to invoke `iteratee`.
18083  * @param {Function} iteratee The function invoked per iteration.
18084  * @returns {Array} Returns the array of results.
18085  */
18086 function baseTimes(n, iteratee) {
18087   var index = -1,
18088       result = Array(n);
18089
18090   while (++index < n) {
18091     result[index] = iteratee(index);
18092   }
18093   return result;
18094 }
18095
18096 /**
18097  * Checks if `value` is object-like. A value is object-like if it's not `null`
18098  * and has a `typeof` result of "object".
18099  *
18100  * @static
18101  * @memberOf _
18102  * @since 4.0.0
18103  * @category Lang
18104  * @param {*} value The value to check.
18105  * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
18106  * @example
18107  *
18108  * _.isObjectLike({});
18109  * // => true
18110  *
18111  * _.isObjectLike([1, 2, 3]);
18112  * // => true
18113  *
18114  * _.isObjectLike(_.noop);
18115  * // => false
18116  *
18117  * _.isObjectLike(null);
18118  * // => false
18119  */
18120 function isObjectLike(value) {
18121   return value != null && typeof value == 'object';
18122 }
18123
18124 /** `Object#toString` result references. */
18125 var argsTag = '[object Arguments]';
18126
18127 /**
18128  * The base implementation of `_.isArguments`.
18129  *
18130  * @private
18131  * @param {*} value The value to check.
18132  * @returns {boolean} Returns `true` if `value` is an `arguments` object,
18133  */
18134 function baseIsArguments(value) {
18135   return isObjectLike(value) && baseGetTag(value) == argsTag;
18136 }
18137
18138 /** Used for built-in method references. */
18139 var objectProto$6 = Object.prototype;
18140
18141 /** Used to check objects for own properties. */
18142 var hasOwnProperty$5 = objectProto$6.hasOwnProperty;
18143
18144 /** Built-in value references. */
18145 var propertyIsEnumerable = objectProto$6.propertyIsEnumerable;
18146
18147 /**
18148  * Checks if `value` is likely an `arguments` object.
18149  *
18150  * @static
18151  * @memberOf _
18152  * @since 0.1.0
18153  * @category Lang
18154  * @param {*} value The value to check.
18155  * @returns {boolean} Returns `true` if `value` is an `arguments` object,
18156  *  else `false`.
18157  * @example
18158  *
18159  * _.isArguments(function() { return arguments; }());
18160  * // => true
18161  *
18162  * _.isArguments([1, 2, 3]);
18163  * // => false
18164  */
18165 var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
18166   return isObjectLike(value) && hasOwnProperty$5.call(value, 'callee') &&
18167     !propertyIsEnumerable.call(value, 'callee');
18168 };
18169
18170 /**
18171  * Checks if `value` is classified as an `Array` object.
18172  *
18173  * @static
18174  * @memberOf _
18175  * @since 0.1.0
18176  * @category Lang
18177  * @param {*} value The value to check.
18178  * @returns {boolean} Returns `true` if `value` is an array, else `false`.
18179  * @example
18180  *
18181  * _.isArray([1, 2, 3]);
18182  * // => true
18183  *
18184  * _.isArray(document.body.children);
18185  * // => false
18186  *
18187  * _.isArray('abc');
18188  * // => false
18189  *
18190  * _.isArray(_.noop);
18191  * // => false
18192  */
18193 var isArray = Array.isArray;
18194
18195 /**
18196  * This method returns `false`.
18197  *
18198  * @static
18199  * @memberOf _
18200  * @since 4.13.0
18201  * @category Util
18202  * @returns {boolean} Returns `false`.
18203  * @example
18204  *
18205  * _.times(2, _.stubFalse);
18206  * // => [false, false]
18207  */
18208 function stubFalse() {
18209   return false;
18210 }
18211
18212 /** Detect free variable `exports`. */
18213 var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
18214
18215 /** Detect free variable `module`. */
18216 var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
18217
18218 /** Detect the popular CommonJS extension `module.exports`. */
18219 var moduleExports = freeModule && freeModule.exports === freeExports;
18220
18221 /** Built-in value references. */
18222 var Buffer = moduleExports ? root$2.Buffer : undefined;
18223
18224 /* Built-in method references for those with the same name as other `lodash` methods. */
18225 var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;
18226
18227 /**
18228  * Checks if `value` is a buffer.
18229  *
18230  * @static
18231  * @memberOf _
18232  * @since 4.3.0
18233  * @category Lang
18234  * @param {*} value The value to check.
18235  * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
18236  * @example
18237  *
18238  * _.isBuffer(new Buffer(2));
18239  * // => true
18240  *
18241  * _.isBuffer(new Uint8Array(2));
18242  * // => false
18243  */
18244 var isBuffer = nativeIsBuffer || stubFalse;
18245
18246 /** Used as references for various `Number` constants. */
18247 var MAX_SAFE_INTEGER = 9007199254740991;
18248
18249 /** Used to detect unsigned integer values. */
18250 var reIsUint = /^(?:0|[1-9]\d*)$/;
18251
18252 /**
18253  * Checks if `value` is a valid array-like index.
18254  *
18255  * @private
18256  * @param {*} value The value to check.
18257  * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
18258  * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
18259  */
18260 function isIndex(value, length) {
18261   var type = typeof value;
18262   length = length == null ? MAX_SAFE_INTEGER : length;
18263
18264   return !!length &&
18265     (type == 'number' ||
18266       (type != 'symbol' && reIsUint.test(value))) &&
18267         (value > -1 && value % 1 == 0 && value < length);
18268 }
18269
18270 /** Used as references for various `Number` constants. */
18271 var MAX_SAFE_INTEGER$1 = 9007199254740991;
18272
18273 /**
18274  * Checks if `value` is a valid array-like length.
18275  *
18276  * **Note:** This method is loosely based on
18277  * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
18278  *
18279  * @static
18280  * @memberOf _
18281  * @since 4.0.0
18282  * @category Lang
18283  * @param {*} value The value to check.
18284  * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
18285  * @example
18286  *
18287  * _.isLength(3);
18288  * // => true
18289  *
18290  * _.isLength(Number.MIN_VALUE);
18291  * // => false
18292  *
18293  * _.isLength(Infinity);
18294  * // => false
18295  *
18296  * _.isLength('3');
18297  * // => false
18298  */
18299 function isLength(value) {
18300   return typeof value == 'number' &&
18301     value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER$1;
18302 }
18303
18304 /** `Object#toString` result references. */
18305 var argsTag$1 = '[object Arguments]',
18306     arrayTag = '[object Array]',
18307     boolTag = '[object Boolean]',
18308     dateTag = '[object Date]',
18309     errorTag = '[object Error]',
18310     funcTag$1 = '[object Function]',
18311     mapTag = '[object Map]',
18312     numberTag = '[object Number]',
18313     objectTag = '[object Object]',
18314     regexpTag = '[object RegExp]',
18315     setTag = '[object Set]',
18316     stringTag = '[object String]',
18317     weakMapTag = '[object WeakMap]';
18318
18319 var arrayBufferTag = '[object ArrayBuffer]',
18320     dataViewTag = '[object DataView]',
18321     float32Tag = '[object Float32Array]',
18322     float64Tag = '[object Float64Array]',
18323     int8Tag = '[object Int8Array]',
18324     int16Tag = '[object Int16Array]',
18325     int32Tag = '[object Int32Array]',
18326     uint8Tag = '[object Uint8Array]',
18327     uint8ClampedTag = '[object Uint8ClampedArray]',
18328     uint16Tag = '[object Uint16Array]',
18329     uint32Tag = '[object Uint32Array]';
18330
18331 /** Used to identify `toStringTag` values of typed arrays. */
18332 var typedArrayTags = {};
18333 typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
18334 typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
18335 typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
18336 typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
18337 typedArrayTags[uint32Tag] = true;
18338 typedArrayTags[argsTag$1] = typedArrayTags[arrayTag] =
18339 typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
18340 typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
18341 typedArrayTags[errorTag] = typedArrayTags[funcTag$1] =
18342 typedArrayTags[mapTag] = typedArrayTags[numberTag] =
18343 typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
18344 typedArrayTags[setTag] = typedArrayTags[stringTag] =
18345 typedArrayTags[weakMapTag] = false;
18346
18347 /**
18348  * The base implementation of `_.isTypedArray` without Node.js optimizations.
18349  *
18350  * @private
18351  * @param {*} value The value to check.
18352  * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18353  */
18354 function baseIsTypedArray(value) {
18355   return isObjectLike(value) &&
18356     isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
18357 }
18358
18359 /**
18360  * The base implementation of `_.unary` without support for storing metadata.
18361  *
18362  * @private
18363  * @param {Function} func The function to cap arguments for.
18364  * @returns {Function} Returns the new capped function.
18365  */
18366 function baseUnary(func) {
18367   return function(value) {
18368     return func(value);
18369   };
18370 }
18371
18372 /** Detect free variable `exports`. */
18373 var freeExports$1 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18374
18375 /** Detect free variable `module`. */
18376 var freeModule$1 = freeExports$1 && typeof module == 'object' && module && !module.nodeType && module;
18377
18378 /** Detect the popular CommonJS extension `module.exports`. */
18379 var moduleExports$1 = freeModule$1 && freeModule$1.exports === freeExports$1;
18380
18381 /** Detect free variable `process` from Node.js. */
18382 var freeProcess = moduleExports$1 && freeGlobal.process;
18383
18384 /** Used to access faster Node.js helpers. */
18385 var nodeUtil = (function() {
18386   try {
18387     return freeProcess && freeProcess.binding && freeProcess.binding('util');
18388   } catch (e) {}
18389 }());
18390
18391 /* Node.js helper references. */
18392 var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
18393
18394 /**
18395  * Checks if `value` is classified as a typed array.
18396  *
18397  * @static
18398  * @memberOf _
18399  * @since 3.0.0
18400  * @category Lang
18401  * @param {*} value The value to check.
18402  * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18403  * @example
18404  *
18405  * _.isTypedArray(new Uint8Array);
18406  * // => true
18407  *
18408  * _.isTypedArray([]);
18409  * // => false
18410  */
18411 var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
18412
18413 /** Used for built-in method references. */
18414 var objectProto$7 = Object.prototype;
18415
18416 /** Used to check objects for own properties. */
18417 var hasOwnProperty$6 = objectProto$7.hasOwnProperty;
18418
18419 /**
18420  * Creates an array of the enumerable property names of the array-like `value`.
18421  *
18422  * @private
18423  * @param {*} value The value to query.
18424  * @param {boolean} inherited Specify returning inherited property names.
18425  * @returns {Array} Returns the array of property names.
18426  */
18427 function arrayLikeKeys(value, inherited) {
18428   var isArr = isArray(value),
18429       isArg = !isArr && isArguments(value),
18430       isBuff = !isArr && !isArg && isBuffer(value),
18431       isType = !isArr && !isArg && !isBuff && isTypedArray(value),
18432       skipIndexes = isArr || isArg || isBuff || isType,
18433       result = skipIndexes ? baseTimes(value.length, String) : [],
18434       length = result.length;
18435
18436   for (var key in value) {
18437     if ((inherited || hasOwnProperty$6.call(value, key)) &&
18438         !(skipIndexes && (
18439            // Safari 9 has enumerable `arguments.length` in strict mode.
18440            key == 'length' ||
18441            // Node.js 0.10 has enumerable non-index properties on buffers.
18442            (isBuff && (key == 'offset' || key == 'parent')) ||
18443            // PhantomJS 2 has enumerable non-index properties on typed arrays.
18444            (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
18445            // Skip index properties.
18446            isIndex(key, length)
18447         ))) {
18448       result.push(key);
18449     }
18450   }
18451   return result;
18452 }
18453
18454 /** Used for built-in method references. */
18455 var objectProto$8 = Object.prototype;
18456
18457 /**
18458  * Checks if `value` is likely a prototype object.
18459  *
18460  * @private
18461  * @param {*} value The value to check.
18462  * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
18463  */
18464 function isPrototype(value) {
18465   var Ctor = value && value.constructor,
18466       proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$8;
18467
18468   return value === proto;
18469 }
18470
18471 /**
18472  * Creates a unary function that invokes `func` with its argument transformed.
18473  *
18474  * @private
18475  * @param {Function} func The function to wrap.
18476  * @param {Function} transform The argument transform.
18477  * @returns {Function} Returns the new function.
18478  */
18479 function overArg(func, transform) {
18480   return function(arg) {
18481     return func(transform(arg));
18482   };
18483 }
18484
18485 /* Built-in method references for those with the same name as other `lodash` methods. */
18486 var nativeKeys = overArg(Object.keys, Object);
18487
18488 /** Used for built-in method references. */
18489 var objectProto$9 = Object.prototype;
18490
18491 /** Used to check objects for own properties. */
18492 var hasOwnProperty$7 = objectProto$9.hasOwnProperty;
18493
18494 /**
18495  * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
18496  *
18497  * @private
18498  * @param {Object} object The object to query.
18499  * @returns {Array} Returns the array of property names.
18500  */
18501 function baseKeys(object) {
18502   if (!isPrototype(object)) {
18503     return nativeKeys(object);
18504   }
18505   var result = [];
18506   for (var key in Object(object)) {
18507     if (hasOwnProperty$7.call(object, key) && key != 'constructor') {
18508       result.push(key);
18509     }
18510   }
18511   return result;
18512 }
18513
18514 /**
18515  * Checks if `value` is array-like. A value is considered array-like if it's
18516  * not a function and has a `value.length` that's an integer greater than or
18517  * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
18518  *
18519  * @static
18520  * @memberOf _
18521  * @since 4.0.0
18522  * @category Lang
18523  * @param {*} value The value to check.
18524  * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
18525  * @example
18526  *
18527  * _.isArrayLike([1, 2, 3]);
18528  * // => true
18529  *
18530  * _.isArrayLike(document.body.children);
18531  * // => true
18532  *
18533  * _.isArrayLike('abc');
18534  * // => true
18535  *
18536  * _.isArrayLike(_.noop);
18537  * // => false
18538  */
18539 function isArrayLike(value) {
18540   return value != null && isLength(value.length) && !isFunction(value);
18541 }
18542
18543 /**
18544  * Creates an array of the own enumerable property names of `object`.
18545  *
18546  * **Note:** Non-object values are coerced to objects. See the
18547  * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18548  * for more details.
18549  *
18550  * @static
18551  * @since 0.1.0
18552  * @memberOf _
18553  * @category Object
18554  * @param {Object} object The object to query.
18555  * @returns {Array} Returns the array of property names.
18556  * @example
18557  *
18558  * function Foo() {
18559  *   this.a = 1;
18560  *   this.b = 2;
18561  * }
18562  *
18563  * Foo.prototype.c = 3;
18564  *
18565  * _.keys(new Foo);
18566  * // => ['a', 'b'] (iteration order is not guaranteed)
18567  *
18568  * _.keys('hi');
18569  * // => ['0', '1']
18570  */
18571 function keys$1(object) {
18572   return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
18573 }
18574
18575 /**
18576  * The base implementation of `_.assign` without support for multiple sources
18577  * or `customizer` functions.
18578  *
18579  * @private
18580  * @param {Object} object The destination object.
18581  * @param {Object} source The source object.
18582  * @returns {Object} Returns `object`.
18583  */
18584 function baseAssign(object, source) {
18585   return object && copyObject(source, keys$1(source), object);
18586 }
18587
18588 /**
18589  * This function is like
18590  * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18591  * except that it includes inherited enumerable properties.
18592  *
18593  * @private
18594  * @param {Object} object The object to query.
18595  * @returns {Array} Returns the array of property names.
18596  */
18597 function nativeKeysIn(object) {
18598   var result = [];
18599   if (object != null) {
18600     for (var key in Object(object)) {
18601       result.push(key);
18602     }
18603   }
18604   return result;
18605 }
18606
18607 /** Used for built-in method references. */
18608 var objectProto$10 = Object.prototype;
18609
18610 /** Used to check objects for own properties. */
18611 var hasOwnProperty$8 = objectProto$10.hasOwnProperty;
18612
18613 /**
18614  * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
18615  *
18616  * @private
18617  * @param {Object} object The object to query.
18618  * @returns {Array} Returns the array of property names.
18619  */
18620 function baseKeysIn(object) {
18621   if (!isObject(object)) {
18622     return nativeKeysIn(object);
18623   }
18624   var isProto = isPrototype(object),
18625       result = [];
18626
18627   for (var key in object) {
18628     if (!(key == 'constructor' && (isProto || !hasOwnProperty$8.call(object, key)))) {
18629       result.push(key);
18630     }
18631   }
18632   return result;
18633 }
18634
18635 /**
18636  * Creates an array of the own and inherited enumerable property names of `object`.
18637  *
18638  * **Note:** Non-object values are coerced to objects.
18639  *
18640  * @static
18641  * @memberOf _
18642  * @since 3.0.0
18643  * @category Object
18644  * @param {Object} object The object to query.
18645  * @returns {Array} Returns the array of property names.
18646  * @example
18647  *
18648  * function Foo() {
18649  *   this.a = 1;
18650  *   this.b = 2;
18651  * }
18652  *
18653  * Foo.prototype.c = 3;
18654  *
18655  * _.keysIn(new Foo);
18656  * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
18657  */
18658 function keysIn$1(object) {
18659   return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
18660 }
18661
18662 /**
18663  * The base implementation of `_.assignIn` without support for multiple sources
18664  * or `customizer` functions.
18665  *
18666  * @private
18667  * @param {Object} object The destination object.
18668  * @param {Object} source The source object.
18669  * @returns {Object} Returns `object`.
18670  */
18671 function baseAssignIn(object, source) {
18672   return object && copyObject(source, keysIn$1(source), object);
18673 }
18674
18675 /** Detect free variable `exports`. */
18676 var freeExports$2 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18677
18678 /** Detect free variable `module`. */
18679 var freeModule$2 = freeExports$2 && typeof module == 'object' && module && !module.nodeType && module;
18680
18681 /** Detect the popular CommonJS extension `module.exports`. */
18682 var moduleExports$2 = freeModule$2 && freeModule$2.exports === freeExports$2;
18683
18684 /** Built-in value references. */
18685 var Buffer$1 = moduleExports$2 ? root$2.Buffer : undefined,
18686     allocUnsafe = Buffer$1 ? Buffer$1.allocUnsafe : undefined;
18687
18688 /**
18689  * Creates a clone of  `buffer`.
18690  *
18691  * @private
18692  * @param {Buffer} buffer The buffer to clone.
18693  * @param {boolean} [isDeep] Specify a deep clone.
18694  * @returns {Buffer} Returns the cloned buffer.
18695  */
18696 function cloneBuffer(buffer, isDeep) {
18697   if (isDeep) {
18698     return buffer.slice();
18699   }
18700   var length = buffer.length,
18701       result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
18702
18703   buffer.copy(result);
18704   return result;
18705 }
18706
18707 /**
18708  * Copies the values of `source` to `array`.
18709  *
18710  * @private
18711  * @param {Array} source The array to copy values from.
18712  * @param {Array} [array=[]] The array to copy values to.
18713  * @returns {Array} Returns `array`.
18714  */
18715 function copyArray(source, array) {
18716   var index = -1,
18717       length = source.length;
18718
18719   array || (array = Array(length));
18720   while (++index < length) {
18721     array[index] = source[index];
18722   }
18723   return array;
18724 }
18725
18726 /**
18727  * A specialized version of `_.filter` for arrays without support for
18728  * iteratee shorthands.
18729  *
18730  * @private
18731  * @param {Array} [array] The array to iterate over.
18732  * @param {Function} predicate The function invoked per iteration.
18733  * @returns {Array} Returns the new filtered array.
18734  */
18735 function arrayFilter(array, predicate) {
18736   var index = -1,
18737       length = array == null ? 0 : array.length,
18738       resIndex = 0,
18739       result = [];
18740
18741   while (++index < length) {
18742     var value = array[index];
18743     if (predicate(value, index, array)) {
18744       result[resIndex++] = value;
18745     }
18746   }
18747   return result;
18748 }
18749
18750 /**
18751  * This method returns a new empty array.
18752  *
18753  * @static
18754  * @memberOf _
18755  * @since 4.13.0
18756  * @category Util
18757  * @returns {Array} Returns the new empty array.
18758  * @example
18759  *
18760  * var arrays = _.times(2, _.stubArray);
18761  *
18762  * console.log(arrays);
18763  * // => [[], []]
18764  *
18765  * console.log(arrays[0] === arrays[1]);
18766  * // => false
18767  */
18768 function stubArray() {
18769   return [];
18770 }
18771
18772 /** Used for built-in method references. */
18773 var objectProto$11 = Object.prototype;
18774
18775 /** Built-in value references. */
18776 var propertyIsEnumerable$1 = objectProto$11.propertyIsEnumerable;
18777
18778 /* Built-in method references for those with the same name as other `lodash` methods. */
18779 var nativeGetSymbols = Object.getOwnPropertySymbols;
18780
18781 /**
18782  * Creates an array of the own enumerable symbols of `object`.
18783  *
18784  * @private
18785  * @param {Object} object The object to query.
18786  * @returns {Array} Returns the array of symbols.
18787  */
18788 var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
18789   if (object == null) {
18790     return [];
18791   }
18792   object = Object(object);
18793   return arrayFilter(nativeGetSymbols(object), function(symbol) {
18794     return propertyIsEnumerable$1.call(object, symbol);
18795   });
18796 };
18797
18798 /**
18799  * Copies own symbols of `source` to `object`.
18800  *
18801  * @private
18802  * @param {Object} source The object to copy symbols from.
18803  * @param {Object} [object={}] The object to copy symbols to.
18804  * @returns {Object} Returns `object`.
18805  */
18806 function copySymbols(source, object) {
18807   return copyObject(source, getSymbols(source), object);
18808 }
18809
18810 /**
18811  * Appends the elements of `values` to `array`.
18812  *
18813  * @private
18814  * @param {Array} array The array to modify.
18815  * @param {Array} values The values to append.
18816  * @returns {Array} Returns `array`.
18817  */
18818 function arrayPush(array, values) {
18819   var index = -1,
18820       length = values.length,
18821       offset = array.length;
18822
18823   while (++index < length) {
18824     array[offset + index] = values[index];
18825   }
18826   return array;
18827 }
18828
18829 /** Built-in value references. */
18830 var getPrototype = overArg(Object.getPrototypeOf, Object);
18831
18832 /* Built-in method references for those with the same name as other `lodash` methods. */
18833 var nativeGetSymbols$1 = Object.getOwnPropertySymbols;
18834
18835 /**
18836  * Creates an array of the own and inherited enumerable symbols of `object`.
18837  *
18838  * @private
18839  * @param {Object} object The object to query.
18840  * @returns {Array} Returns the array of symbols.
18841  */
18842 var getSymbolsIn = !nativeGetSymbols$1 ? stubArray : function(object) {
18843   var result = [];
18844   while (object) {
18845     arrayPush(result, getSymbols(object));
18846     object = getPrototype(object);
18847   }
18848   return result;
18849 };
18850
18851 /**
18852  * Copies own and inherited symbols of `source` to `object`.
18853  *
18854  * @private
18855  * @param {Object} source The object to copy symbols from.
18856  * @param {Object} [object={}] The object to copy symbols to.
18857  * @returns {Object} Returns `object`.
18858  */
18859 function copySymbolsIn(source, object) {
18860   return copyObject(source, getSymbolsIn(source), object);
18861 }
18862
18863 /**
18864  * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
18865  * `keysFunc` and `symbolsFunc` to get the enumerable property names and
18866  * symbols of `object`.
18867  *
18868  * @private
18869  * @param {Object} object The object to query.
18870  * @param {Function} keysFunc The function to get the keys of `object`.
18871  * @param {Function} symbolsFunc The function to get the symbols of `object`.
18872  * @returns {Array} Returns the array of property names and symbols.
18873  */
18874 function baseGetAllKeys(object, keysFunc, symbolsFunc) {
18875   var result = keysFunc(object);
18876   return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
18877 }
18878
18879 /**
18880  * Creates an array of own enumerable property names and symbols of `object`.
18881  *
18882  * @private
18883  * @param {Object} object The object to query.
18884  * @returns {Array} Returns the array of property names and symbols.
18885  */
18886 function getAllKeys(object) {
18887   return baseGetAllKeys(object, keys$1, getSymbols);
18888 }
18889
18890 /**
18891  * Creates an array of own and inherited enumerable property names and
18892  * symbols of `object`.
18893  *
18894  * @private
18895  * @param {Object} object The object to query.
18896  * @returns {Array} Returns the array of property names and symbols.
18897  */
18898 function getAllKeysIn(object) {
18899   return baseGetAllKeys(object, keysIn$1, getSymbolsIn);
18900 }
18901
18902 /* Built-in method references that are verified to be native. */
18903 var DataView = getNative(root$2, 'DataView');
18904
18905 /* Built-in method references that are verified to be native. */
18906 var Promise = getNative(root$2, 'Promise');
18907
18908 /* Built-in method references that are verified to be native. */
18909 var Set$1 = getNative(root$2, 'Set');
18910
18911 /* Built-in method references that are verified to be native. */
18912 var WeakMap = getNative(root$2, 'WeakMap');
18913
18914 /** `Object#toString` result references. */
18915 var mapTag$1 = '[object Map]',
18916     objectTag$1 = '[object Object]',
18917     promiseTag = '[object Promise]',
18918     setTag$1 = '[object Set]',
18919     weakMapTag$1 = '[object WeakMap]';
18920
18921 var dataViewTag$1 = '[object DataView]';
18922
18923 /** Used to detect maps, sets, and weakmaps. */
18924 var dataViewCtorString = toSource(DataView),
18925     mapCtorString = toSource(Map$1),
18926     promiseCtorString = toSource(Promise),
18927     setCtorString = toSource(Set$1),
18928     weakMapCtorString = toSource(WeakMap);
18929
18930 /**
18931  * Gets the `toStringTag` of `value`.
18932  *
18933  * @private
18934  * @param {*} value The value to query.
18935  * @returns {string} Returns the `toStringTag`.
18936  */
18937 var getTag = baseGetTag;
18938
18939 // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
18940 if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag$1) ||
18941     (Map$1 && getTag(new Map$1) != mapTag$1) ||
18942     (Promise && getTag(Promise.resolve()) != promiseTag) ||
18943     (Set$1 && getTag(new Set$1) != setTag$1) ||
18944     (WeakMap && getTag(new WeakMap) != weakMapTag$1)) {
18945   getTag = function(value) {
18946     var result = baseGetTag(value),
18947         Ctor = result == objectTag$1 ? value.constructor : undefined,
18948         ctorString = Ctor ? toSource(Ctor) : '';
18949
18950     if (ctorString) {
18951       switch (ctorString) {
18952         case dataViewCtorString: return dataViewTag$1;
18953         case mapCtorString: return mapTag$1;
18954         case promiseCtorString: return promiseTag;
18955         case setCtorString: return setTag$1;
18956         case weakMapCtorString: return weakMapTag$1;
18957       }
18958     }
18959     return result;
18960   };
18961 }
18962
18963 var getTag$1 = getTag;
18964
18965 /** Used for built-in method references. */
18966 var objectProto$12 = Object.prototype;
18967
18968 /** Used to check objects for own properties. */
18969 var hasOwnProperty$9 = objectProto$12.hasOwnProperty;
18970
18971 /**
18972  * Initializes an array clone.
18973  *
18974  * @private
18975  * @param {Array} array The array to clone.
18976  * @returns {Array} Returns the initialized clone.
18977  */
18978 function initCloneArray(array) {
18979   var length = array.length,
18980       result = new array.constructor(length);
18981
18982   // Add properties assigned by `RegExp#exec`.
18983   if (length && typeof array[0] == 'string' && hasOwnProperty$9.call(array, 'index')) {
18984     result.index = array.index;
18985     result.input = array.input;
18986   }
18987   return result;
18988 }
18989
18990 /** Built-in value references. */
18991 var Uint8Array = root$2.Uint8Array;
18992
18993 /**
18994  * Creates a clone of `arrayBuffer`.
18995  *
18996  * @private
18997  * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
18998  * @returns {ArrayBuffer} Returns the cloned array buffer.
18999  */
19000 function cloneArrayBuffer(arrayBuffer) {
19001   var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
19002   new Uint8Array(result).set(new Uint8Array(arrayBuffer));
19003   return result;
19004 }
19005
19006 /**
19007  * Creates a clone of `dataView`.
19008  *
19009  * @private
19010  * @param {Object} dataView The data view to clone.
19011  * @param {boolean} [isDeep] Specify a deep clone.
19012  * @returns {Object} Returns the cloned data view.
19013  */
19014 function cloneDataView(dataView, isDeep) {
19015   var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
19016   return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
19017 }
19018
19019 /** Used to match `RegExp` flags from their coerced string values. */
19020 var reFlags = /\w*$/;
19021
19022 /**
19023  * Creates a clone of `regexp`.
19024  *
19025  * @private
19026  * @param {Object} regexp The regexp to clone.
19027  * @returns {Object} Returns the cloned regexp.
19028  */
19029 function cloneRegExp(regexp) {
19030   var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
19031   result.lastIndex = regexp.lastIndex;
19032   return result;
19033 }
19034
19035 /** Used to convert symbols to primitives and strings. */
19036 var symbolProto = Symbol ? Symbol.prototype : undefined,
19037     symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
19038
19039 /**
19040  * Creates a clone of the `symbol` object.
19041  *
19042  * @private
19043  * @param {Object} symbol The symbol object to clone.
19044  * @returns {Object} Returns the cloned symbol object.
19045  */
19046 function cloneSymbol(symbol) {
19047   return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
19048 }
19049
19050 /**
19051  * Creates a clone of `typedArray`.
19052  *
19053  * @private
19054  * @param {Object} typedArray The typed array to clone.
19055  * @param {boolean} [isDeep] Specify a deep clone.
19056  * @returns {Object} Returns the cloned typed array.
19057  */
19058 function cloneTypedArray(typedArray, isDeep) {
19059   var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
19060   return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
19061 }
19062
19063 /** `Object#toString` result references. */
19064 var boolTag$1 = '[object Boolean]',
19065     dateTag$1 = '[object Date]',
19066     mapTag$2 = '[object Map]',
19067     numberTag$1 = '[object Number]',
19068     regexpTag$1 = '[object RegExp]',
19069     setTag$2 = '[object Set]',
19070     stringTag$1 = '[object String]',
19071     symbolTag = '[object Symbol]';
19072
19073 var arrayBufferTag$1 = '[object ArrayBuffer]',
19074     dataViewTag$2 = '[object DataView]',
19075     float32Tag$1 = '[object Float32Array]',
19076     float64Tag$1 = '[object Float64Array]',
19077     int8Tag$1 = '[object Int8Array]',
19078     int16Tag$1 = '[object Int16Array]',
19079     int32Tag$1 = '[object Int32Array]',
19080     uint8Tag$1 = '[object Uint8Array]',
19081     uint8ClampedTag$1 = '[object Uint8ClampedArray]',
19082     uint16Tag$1 = '[object Uint16Array]',
19083     uint32Tag$1 = '[object Uint32Array]';
19084
19085 /**
19086  * Initializes an object clone based on its `toStringTag`.
19087  *
19088  * **Note:** This function only supports cloning values with tags of
19089  * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
19090  *
19091  * @private
19092  * @param {Object} object The object to clone.
19093  * @param {string} tag The `toStringTag` of the object to clone.
19094  * @param {boolean} [isDeep] Specify a deep clone.
19095  * @returns {Object} Returns the initialized clone.
19096  */
19097 function initCloneByTag(object, tag, isDeep) {
19098   var Ctor = object.constructor;
19099   switch (tag) {
19100     case arrayBufferTag$1:
19101       return cloneArrayBuffer(object);
19102
19103     case boolTag$1:
19104     case dateTag$1:
19105       return new Ctor(+object);
19106
19107     case dataViewTag$2:
19108       return cloneDataView(object, isDeep);
19109
19110     case float32Tag$1: case float64Tag$1:
19111     case int8Tag$1: case int16Tag$1: case int32Tag$1:
19112     case uint8Tag$1: case uint8ClampedTag$1: case uint16Tag$1: case uint32Tag$1:
19113       return cloneTypedArray(object, isDeep);
19114
19115     case mapTag$2:
19116       return new Ctor;
19117
19118     case numberTag$1:
19119     case stringTag$1:
19120       return new Ctor(object);
19121
19122     case regexpTag$1:
19123       return cloneRegExp(object);
19124
19125     case setTag$2:
19126       return new Ctor;
19127
19128     case symbolTag:
19129       return cloneSymbol(object);
19130   }
19131 }
19132
19133 /** Built-in value references. */
19134 var objectCreate = Object.create;
19135
19136 /**
19137  * The base implementation of `_.create` without support for assigning
19138  * properties to the created object.
19139  *
19140  * @private
19141  * @param {Object} proto The object to inherit from.
19142  * @returns {Object} Returns the new object.
19143  */
19144 var baseCreate = (function() {
19145   function object() {}
19146   return function(proto) {
19147     if (!isObject(proto)) {
19148       return {};
19149     }
19150     if (objectCreate) {
19151       return objectCreate(proto);
19152     }
19153     object.prototype = proto;
19154     var result = new object;
19155     object.prototype = undefined;
19156     return result;
19157   };
19158 }());
19159
19160 /**
19161  * Initializes an object clone.
19162  *
19163  * @private
19164  * @param {Object} object The object to clone.
19165  * @returns {Object} Returns the initialized clone.
19166  */
19167 function initCloneObject(object) {
19168   return (typeof object.constructor == 'function' && !isPrototype(object))
19169     ? baseCreate(getPrototype(object))
19170     : {};
19171 }
19172
19173 /** `Object#toString` result references. */
19174 var mapTag$3 = '[object Map]';
19175
19176 /**
19177  * The base implementation of `_.isMap` without Node.js optimizations.
19178  *
19179  * @private
19180  * @param {*} value The value to check.
19181  * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19182  */
19183 function baseIsMap(value) {
19184   return isObjectLike(value) && getTag$1(value) == mapTag$3;
19185 }
19186
19187 /* Node.js helper references. */
19188 var nodeIsMap = nodeUtil && nodeUtil.isMap;
19189
19190 /**
19191  * Checks if `value` is classified as a `Map` object.
19192  *
19193  * @static
19194  * @memberOf _
19195  * @since 4.3.0
19196  * @category Lang
19197  * @param {*} value The value to check.
19198  * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19199  * @example
19200  *
19201  * _.isMap(new Map);
19202  * // => true
19203  *
19204  * _.isMap(new WeakMap);
19205  * // => false
19206  */
19207 var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
19208
19209 /** `Object#toString` result references. */
19210 var setTag$3 = '[object Set]';
19211
19212 /**
19213  * The base implementation of `_.isSet` without Node.js optimizations.
19214  *
19215  * @private
19216  * @param {*} value The value to check.
19217  * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19218  */
19219 function baseIsSet(value) {
19220   return isObjectLike(value) && getTag$1(value) == setTag$3;
19221 }
19222
19223 /* Node.js helper references. */
19224 var nodeIsSet = nodeUtil && nodeUtil.isSet;
19225
19226 /**
19227  * Checks if `value` is classified as a `Set` object.
19228  *
19229  * @static
19230  * @memberOf _
19231  * @since 4.3.0
19232  * @category Lang
19233  * @param {*} value The value to check.
19234  * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19235  * @example
19236  *
19237  * _.isSet(new Set);
19238  * // => true
19239  *
19240  * _.isSet(new WeakSet);
19241  * // => false
19242  */
19243 var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
19244
19245 /** Used to compose bitmasks for cloning. */
19246 var CLONE_DEEP_FLAG = 1,
19247     CLONE_FLAT_FLAG = 2,
19248     CLONE_SYMBOLS_FLAG = 4;
19249
19250 /** `Object#toString` result references. */
19251 var argsTag$2 = '[object Arguments]',
19252     arrayTag$1 = '[object Array]',
19253     boolTag$2 = '[object Boolean]',
19254     dateTag$2 = '[object Date]',
19255     errorTag$1 = '[object Error]',
19256     funcTag$2 = '[object Function]',
19257     genTag$1 = '[object GeneratorFunction]',
19258     mapTag$4 = '[object Map]',
19259     numberTag$2 = '[object Number]',
19260     objectTag$2 = '[object Object]',
19261     regexpTag$2 = '[object RegExp]',
19262     setTag$4 = '[object Set]',
19263     stringTag$2 = '[object String]',
19264     symbolTag$1 = '[object Symbol]',
19265     weakMapTag$2 = '[object WeakMap]';
19266
19267 var arrayBufferTag$2 = '[object ArrayBuffer]',
19268     dataViewTag$3 = '[object DataView]',
19269     float32Tag$2 = '[object Float32Array]',
19270     float64Tag$2 = '[object Float64Array]',
19271     int8Tag$2 = '[object Int8Array]',
19272     int16Tag$2 = '[object Int16Array]',
19273     int32Tag$2 = '[object Int32Array]',
19274     uint8Tag$2 = '[object Uint8Array]',
19275     uint8ClampedTag$2 = '[object Uint8ClampedArray]',
19276     uint16Tag$2 = '[object Uint16Array]',
19277     uint32Tag$2 = '[object Uint32Array]';
19278
19279 /** Used to identify `toStringTag` values supported by `_.clone`. */
19280 var cloneableTags = {};
19281 cloneableTags[argsTag$2] = cloneableTags[arrayTag$1] =
19282 cloneableTags[arrayBufferTag$2] = cloneableTags[dataViewTag$3] =
19283 cloneableTags[boolTag$2] = cloneableTags[dateTag$2] =
19284 cloneableTags[float32Tag$2] = cloneableTags[float64Tag$2] =
19285 cloneableTags[int8Tag$2] = cloneableTags[int16Tag$2] =
19286 cloneableTags[int32Tag$2] = cloneableTags[mapTag$4] =
19287 cloneableTags[numberTag$2] = cloneableTags[objectTag$2] =
19288 cloneableTags[regexpTag$2] = cloneableTags[setTag$4] =
19289 cloneableTags[stringTag$2] = cloneableTags[symbolTag$1] =
19290 cloneableTags[uint8Tag$2] = cloneableTags[uint8ClampedTag$2] =
19291 cloneableTags[uint16Tag$2] = cloneableTags[uint32Tag$2] = true;
19292 cloneableTags[errorTag$1] = cloneableTags[funcTag$2] =
19293 cloneableTags[weakMapTag$2] = false;
19294
19295 /**
19296  * The base implementation of `_.clone` and `_.cloneDeep` which tracks
19297  * traversed objects.
19298  *
19299  * @private
19300  * @param {*} value The value to clone.
19301  * @param {boolean} bitmask The bitmask flags.
19302  *  1 - Deep clone
19303  *  2 - Flatten inherited properties
19304  *  4 - Clone symbols
19305  * @param {Function} [customizer] The function to customize cloning.
19306  * @param {string} [key] The key of `value`.
19307  * @param {Object} [object] The parent object of `value`.
19308  * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
19309  * @returns {*} Returns the cloned value.
19310  */
19311 function baseClone(value, bitmask, customizer, key, object, stack) {
19312   var result,
19313       isDeep = bitmask & CLONE_DEEP_FLAG,
19314       isFlat = bitmask & CLONE_FLAT_FLAG,
19315       isFull = bitmask & CLONE_SYMBOLS_FLAG;
19316
19317   if (customizer) {
19318     result = object ? customizer(value, key, object, stack) : customizer(value);
19319   }
19320   if (result !== undefined) {
19321     return result;
19322   }
19323   if (!isObject(value)) {
19324     return value;
19325   }
19326   var isArr = isArray(value);
19327   if (isArr) {
19328     result = initCloneArray(value);
19329     if (!isDeep) {
19330       return copyArray(value, result);
19331     }
19332   } else {
19333     var tag = getTag$1(value),
19334         isFunc = tag == funcTag$2 || tag == genTag$1;
19335
19336     if (isBuffer(value)) {
19337       return cloneBuffer(value, isDeep);
19338     }
19339     if (tag == objectTag$2 || tag == argsTag$2 || (isFunc && !object)) {
19340       result = (isFlat || isFunc) ? {} : initCloneObject(value);
19341       if (!isDeep) {
19342         return isFlat
19343           ? copySymbolsIn(value, baseAssignIn(result, value))
19344           : copySymbols(value, baseAssign(result, value));
19345       }
19346     } else {
19347       if (!cloneableTags[tag]) {
19348         return object ? value : {};
19349       }
19350       result = initCloneByTag(value, tag, isDeep);
19351     }
19352   }
19353   // Check for circular references and return its corresponding clone.
19354   stack || (stack = new Stack);
19355   var stacked = stack.get(value);
19356   if (stacked) {
19357     return stacked;
19358   }
19359   stack.set(value, result);
19360
19361   if (isSet(value)) {
19362     value.forEach(function(subValue) {
19363       result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
19364     });
19365
19366     return result;
19367   }
19368
19369   if (isMap(value)) {
19370     value.forEach(function(subValue, key) {
19371       result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
19372     });
19373
19374     return result;
19375   }
19376
19377   var keysFunc = isFull
19378     ? (isFlat ? getAllKeysIn : getAllKeys)
19379     : (isFlat ? keysIn : keys$1);
19380
19381   var props = isArr ? undefined : keysFunc(value);
19382   arrayEach(props || value, function(subValue, key) {
19383     if (props) {
19384       key = subValue;
19385       subValue = value[key];
19386     }
19387     // Recursively populate clone (susceptible to call stack limits).
19388     assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
19389   });
19390   return result;
19391 }
19392
19393 /** Used to compose bitmasks for cloning. */
19394 var CLONE_SYMBOLS_FLAG$1 = 4;
19395
19396 /**
19397  * Creates a shallow clone of `value`.
19398  *
19399  * **Note:** This method is loosely based on the
19400  * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
19401  * and supports cloning arrays, array buffers, booleans, date objects, maps,
19402  * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
19403  * arrays. The own enumerable properties of `arguments` objects are cloned
19404  * as plain objects. An empty object is returned for uncloneable values such
19405  * as error objects, functions, DOM nodes, and WeakMaps.
19406  *
19407  * @static
19408  * @memberOf _
19409  * @since 0.1.0
19410  * @category Lang
19411  * @param {*} value The value to clone.
19412  * @returns {*} Returns the cloned value.
19413  * @see _.cloneDeep
19414  * @example
19415  *
19416  * var objects = [{ 'a': 1 }, { 'b': 2 }];
19417  *
19418  * var shallow = _.clone(objects);
19419  * console.log(shallow[0] === objects[0]);
19420  * // => true
19421  */
19422 function clone(value) {
19423   return baseClone(value, CLONE_SYMBOLS_FLAG$1);
19424 }
19425
19426 /**
19427  * A specialized version of `baseAggregator` for arrays.
19428  *
19429  * @private
19430  * @param {Array} [array] The array to iterate over.
19431  * @param {Function} setter The function to set `accumulator` values.
19432  * @param {Function} iteratee The iteratee to transform keys.
19433  * @param {Object} accumulator The initial aggregated object.
19434  * @returns {Function} Returns `accumulator`.
19435  */
19436 function arrayAggregator(array, setter, iteratee, accumulator) {
19437   var index = -1,
19438       length = array == null ? 0 : array.length;
19439
19440   while (++index < length) {
19441     var value = array[index];
19442     setter(accumulator, value, iteratee(value), array);
19443   }
19444   return accumulator;
19445 }
19446
19447 /**
19448  * Creates a base function for methods like `_.forIn` and `_.forOwn`.
19449  *
19450  * @private
19451  * @param {boolean} [fromRight] Specify iterating from right to left.
19452  * @returns {Function} Returns the new base function.
19453  */
19454 function createBaseFor(fromRight) {
19455   return function(object, iteratee, keysFunc) {
19456     var index = -1,
19457         iterable = Object(object),
19458         props = keysFunc(object),
19459         length = props.length;
19460
19461     while (length--) {
19462       var key = props[fromRight ? length : ++index];
19463       if (iteratee(iterable[key], key, iterable) === false) {
19464         break;
19465       }
19466     }
19467     return object;
19468   };
19469 }
19470
19471 /**
19472  * The base implementation of `baseForOwn` which iterates over `object`
19473  * properties returned by `keysFunc` and invokes `iteratee` for each property.
19474  * Iteratee functions may exit iteration early by explicitly returning `false`.
19475  *
19476  * @private
19477  * @param {Object} object The object to iterate over.
19478  * @param {Function} iteratee The function invoked per iteration.
19479  * @param {Function} keysFunc The function to get the keys of `object`.
19480  * @returns {Object} Returns `object`.
19481  */
19482 var baseFor = createBaseFor();
19483
19484 /**
19485  * The base implementation of `_.forOwn` without support for iteratee shorthands.
19486  *
19487  * @private
19488  * @param {Object} object The object to iterate over.
19489  * @param {Function} iteratee The function invoked per iteration.
19490  * @returns {Object} Returns `object`.
19491  */
19492 function baseForOwn(object, iteratee) {
19493   return object && baseFor(object, iteratee, keys$1);
19494 }
19495
19496 /**
19497  * Creates a `baseEach` or `baseEachRight` function.
19498  *
19499  * @private
19500  * @param {Function} eachFunc The function to iterate over a collection.
19501  * @param {boolean} [fromRight] Specify iterating from right to left.
19502  * @returns {Function} Returns the new base function.
19503  */
19504 function createBaseEach(eachFunc, fromRight) {
19505   return function(collection, iteratee) {
19506     if (collection == null) {
19507       return collection;
19508     }
19509     if (!isArrayLike(collection)) {
19510       return eachFunc(collection, iteratee);
19511     }
19512     var length = collection.length,
19513         index = fromRight ? length : -1,
19514         iterable = Object(collection);
19515
19516     while ((fromRight ? index-- : ++index < length)) {
19517       if (iteratee(iterable[index], index, iterable) === false) {
19518         break;
19519       }
19520     }
19521     return collection;
19522   };
19523 }
19524
19525 /**
19526  * The base implementation of `_.forEach` without support for iteratee shorthands.
19527  *
19528  * @private
19529  * @param {Array|Object} collection The collection to iterate over.
19530  * @param {Function} iteratee The function invoked per iteration.
19531  * @returns {Array|Object} Returns `collection`.
19532  */
19533 var baseEach = createBaseEach(baseForOwn);
19534
19535 /**
19536  * Aggregates elements of `collection` on `accumulator` with keys transformed
19537  * by `iteratee` and values set by `setter`.
19538  *
19539  * @private
19540  * @param {Array|Object} collection The collection to iterate over.
19541  * @param {Function} setter The function to set `accumulator` values.
19542  * @param {Function} iteratee The iteratee to transform keys.
19543  * @param {Object} accumulator The initial aggregated object.
19544  * @returns {Function} Returns `accumulator`.
19545  */
19546 function baseAggregator(collection, setter, iteratee, accumulator) {
19547   baseEach(collection, function(value, key, collection) {
19548     setter(accumulator, value, iteratee(value), collection);
19549   });
19550   return accumulator;
19551 }
19552
19553 /** Used to stand-in for `undefined` hash values. */
19554 var HASH_UNDEFINED$2 = '__lodash_hash_undefined__';
19555
19556 /**
19557  * Adds `value` to the array cache.
19558  *
19559  * @private
19560  * @name add
19561  * @memberOf SetCache
19562  * @alias push
19563  * @param {*} value The value to cache.
19564  * @returns {Object} Returns the cache instance.
19565  */
19566 function setCacheAdd(value) {
19567   this.__data__.set(value, HASH_UNDEFINED$2);
19568   return this;
19569 }
19570
19571 /**
19572  * Checks if `value` is in the array cache.
19573  *
19574  * @private
19575  * @name has
19576  * @memberOf SetCache
19577  * @param {*} value The value to search for.
19578  * @returns {number} Returns `true` if `value` is found, else `false`.
19579  */
19580 function setCacheHas(value) {
19581   return this.__data__.has(value);
19582 }
19583
19584 /**
19585  *
19586  * Creates an array cache object to store unique values.
19587  *
19588  * @private
19589  * @constructor
19590  * @param {Array} [values] The values to cache.
19591  */
19592 function SetCache(values) {
19593   var index = -1,
19594       length = values == null ? 0 : values.length;
19595
19596   this.__data__ = new MapCache;
19597   while (++index < length) {
19598     this.add(values[index]);
19599   }
19600 }
19601
19602 // Add methods to `SetCache`.
19603 SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
19604 SetCache.prototype.has = setCacheHas;
19605
19606 /**
19607  * A specialized version of `_.some` for arrays without support for iteratee
19608  * shorthands.
19609  *
19610  * @private
19611  * @param {Array} [array] The array to iterate over.
19612  * @param {Function} predicate The function invoked per iteration.
19613  * @returns {boolean} Returns `true` if any element passes the predicate check,
19614  *  else `false`.
19615  */
19616 function arraySome(array, predicate) {
19617   var index = -1,
19618       length = array == null ? 0 : array.length;
19619
19620   while (++index < length) {
19621     if (predicate(array[index], index, array)) {
19622       return true;
19623     }
19624   }
19625   return false;
19626 }
19627
19628 /**
19629  * Checks if a `cache` value for `key` exists.
19630  *
19631  * @private
19632  * @param {Object} cache The cache to query.
19633  * @param {string} key The key of the entry to check.
19634  * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
19635  */
19636 function cacheHas(cache, key) {
19637   return cache.has(key);
19638 }
19639
19640 /** Used to compose bitmasks for value comparisons. */
19641 var COMPARE_PARTIAL_FLAG = 1,
19642     COMPARE_UNORDERED_FLAG = 2;
19643
19644 /**
19645  * A specialized version of `baseIsEqualDeep` for arrays with support for
19646  * partial deep comparisons.
19647  *
19648  * @private
19649  * @param {Array} array The array to compare.
19650  * @param {Array} other The other array to compare.
19651  * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19652  * @param {Function} customizer The function to customize comparisons.
19653  * @param {Function} equalFunc The function to determine equivalents of values.
19654  * @param {Object} stack Tracks traversed `array` and `other` objects.
19655  * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
19656  */
19657 function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
19658   var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
19659       arrLength = array.length,
19660       othLength = other.length;
19661
19662   if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
19663     return false;
19664   }
19665   // Assume cyclic values are equal.
19666   var stacked = stack.get(array);
19667   if (stacked && stack.get(other)) {
19668     return stacked == other;
19669   }
19670   var index = -1,
19671       result = true,
19672       seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
19673
19674   stack.set(array, other);
19675   stack.set(other, array);
19676
19677   // Ignore non-index properties.
19678   while (++index < arrLength) {
19679     var arrValue = array[index],
19680         othValue = other[index];
19681
19682     if (customizer) {
19683       var compared = isPartial
19684         ? customizer(othValue, arrValue, index, other, array, stack)
19685         : customizer(arrValue, othValue, index, array, other, stack);
19686     }
19687     if (compared !== undefined) {
19688       if (compared) {
19689         continue;
19690       }
19691       result = false;
19692       break;
19693     }
19694     // Recursively compare arrays (susceptible to call stack limits).
19695     if (seen) {
19696       if (!arraySome(other, function(othValue, othIndex) {
19697             if (!cacheHas(seen, othIndex) &&
19698                 (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
19699               return seen.push(othIndex);
19700             }
19701           })) {
19702         result = false;
19703         break;
19704       }
19705     } else if (!(
19706           arrValue === othValue ||
19707             equalFunc(arrValue, othValue, bitmask, customizer, stack)
19708         )) {
19709       result = false;
19710       break;
19711     }
19712   }
19713   stack['delete'](array);
19714   stack['delete'](other);
19715   return result;
19716 }
19717
19718 /**
19719  * Converts `map` to its key-value pairs.
19720  *
19721  * @private
19722  * @param {Object} map The map to convert.
19723  * @returns {Array} Returns the key-value pairs.
19724  */
19725 function mapToArray(map) {
19726   var index = -1,
19727       result = Array(map.size);
19728
19729   map.forEach(function(value, key) {
19730     result[++index] = [key, value];
19731   });
19732   return result;
19733 }
19734
19735 /**
19736  * Converts `set` to an array of its values.
19737  *
19738  * @private
19739  * @param {Object} set The set to convert.
19740  * @returns {Array} Returns the values.
19741  */
19742 function setToArray(set) {
19743   var index = -1,
19744       result = Array(set.size);
19745
19746   set.forEach(function(value) {
19747     result[++index] = value;
19748   });
19749   return result;
19750 }
19751
19752 /** Used to compose bitmasks for value comparisons. */
19753 var COMPARE_PARTIAL_FLAG$1 = 1,
19754     COMPARE_UNORDERED_FLAG$1 = 2;
19755
19756 /** `Object#toString` result references. */
19757 var boolTag$3 = '[object Boolean]',
19758     dateTag$3 = '[object Date]',
19759     errorTag$2 = '[object Error]',
19760     mapTag$5 = '[object Map]',
19761     numberTag$3 = '[object Number]',
19762     regexpTag$3 = '[object RegExp]',
19763     setTag$5 = '[object Set]',
19764     stringTag$3 = '[object String]',
19765     symbolTag$2 = '[object Symbol]';
19766
19767 var arrayBufferTag$3 = '[object ArrayBuffer]',
19768     dataViewTag$4 = '[object DataView]';
19769
19770 /** Used to convert symbols to primitives and strings. */
19771 var symbolProto$1 = Symbol ? Symbol.prototype : undefined,
19772     symbolValueOf$1 = symbolProto$1 ? symbolProto$1.valueOf : undefined;
19773
19774 /**
19775  * A specialized version of `baseIsEqualDeep` for comparing objects of
19776  * the same `toStringTag`.
19777  *
19778  * **Note:** This function only supports comparing values with tags of
19779  * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
19780  *
19781  * @private
19782  * @param {Object} object The object to compare.
19783  * @param {Object} other The other object to compare.
19784  * @param {string} tag The `toStringTag` of the objects to compare.
19785  * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19786  * @param {Function} customizer The function to customize comparisons.
19787  * @param {Function} equalFunc The function to determine equivalents of values.
19788  * @param {Object} stack Tracks traversed `object` and `other` objects.
19789  * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19790  */
19791 function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
19792   switch (tag) {
19793     case dataViewTag$4:
19794       if ((object.byteLength != other.byteLength) ||
19795           (object.byteOffset != other.byteOffset)) {
19796         return false;
19797       }
19798       object = object.buffer;
19799       other = other.buffer;
19800
19801     case arrayBufferTag$3:
19802       if ((object.byteLength != other.byteLength) ||
19803           !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
19804         return false;
19805       }
19806       return true;
19807
19808     case boolTag$3:
19809     case dateTag$3:
19810     case numberTag$3:
19811       // Coerce booleans to `1` or `0` and dates to milliseconds.
19812       // Invalid dates are coerced to `NaN`.
19813       return eq(+object, +other);
19814
19815     case errorTag$2:
19816       return object.name == other.name && object.message == other.message;
19817
19818     case regexpTag$3:
19819     case stringTag$3:
19820       // Coerce regexes to strings and treat strings, primitives and objects,
19821       // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
19822       // for more details.
19823       return object == (other + '');
19824
19825     case mapTag$5:
19826       var convert = mapToArray;
19827
19828     case setTag$5:
19829       var isPartial = bitmask & COMPARE_PARTIAL_FLAG$1;
19830       convert || (convert = setToArray);
19831
19832       if (object.size != other.size && !isPartial) {
19833         return false;
19834       }
19835       // Assume cyclic values are equal.
19836       var stacked = stack.get(object);
19837       if (stacked) {
19838         return stacked == other;
19839       }
19840       bitmask |= COMPARE_UNORDERED_FLAG$1;
19841
19842       // Recursively compare objects (susceptible to call stack limits).
19843       stack.set(object, other);
19844       var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
19845       stack['delete'](object);
19846       return result;
19847
19848     case symbolTag$2:
19849       if (symbolValueOf$1) {
19850         return symbolValueOf$1.call(object) == symbolValueOf$1.call(other);
19851       }
19852   }
19853   return false;
19854 }
19855
19856 /** Used to compose bitmasks for value comparisons. */
19857 var COMPARE_PARTIAL_FLAG$2 = 1;
19858
19859 /** Used for built-in method references. */
19860 var objectProto$13 = Object.prototype;
19861
19862 /** Used to check objects for own properties. */
19863 var hasOwnProperty$10 = objectProto$13.hasOwnProperty;
19864
19865 /**
19866  * A specialized version of `baseIsEqualDeep` for objects with support for
19867  * partial deep comparisons.
19868  *
19869  * @private
19870  * @param {Object} object The object to compare.
19871  * @param {Object} other The other object to compare.
19872  * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19873  * @param {Function} customizer The function to customize comparisons.
19874  * @param {Function} equalFunc The function to determine equivalents of values.
19875  * @param {Object} stack Tracks traversed `object` and `other` objects.
19876  * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19877  */
19878 function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
19879   var isPartial = bitmask & COMPARE_PARTIAL_FLAG$2,
19880       objProps = getAllKeys(object),
19881       objLength = objProps.length,
19882       othProps = getAllKeys(other),
19883       othLength = othProps.length;
19884
19885   if (objLength != othLength && !isPartial) {
19886     return false;
19887   }
19888   var index = objLength;
19889   while (index--) {
19890     var key = objProps[index];
19891     if (!(isPartial ? key in other : hasOwnProperty$10.call(other, key))) {
19892       return false;
19893     }
19894   }
19895   // Assume cyclic values are equal.
19896   var stacked = stack.get(object);
19897   if (stacked && stack.get(other)) {
19898     return stacked == other;
19899   }
19900   var result = true;
19901   stack.set(object, other);
19902   stack.set(other, object);
19903
19904   var skipCtor = isPartial;
19905   while (++index < objLength) {
19906     key = objProps[index];
19907     var objValue = object[key],
19908         othValue = other[key];
19909
19910     if (customizer) {
19911       var compared = isPartial
19912         ? customizer(othValue, objValue, key, other, object, stack)
19913         : customizer(objValue, othValue, key, object, other, stack);
19914     }
19915     // Recursively compare objects (susceptible to call stack limits).
19916     if (!(compared === undefined
19917           ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
19918           : compared
19919         )) {
19920       result = false;
19921       break;
19922     }
19923     skipCtor || (skipCtor = key == 'constructor');
19924   }
19925   if (result && !skipCtor) {
19926     var objCtor = object.constructor,
19927         othCtor = other.constructor;
19928
19929     // Non `Object` object instances with different constructors are not equal.
19930     if (objCtor != othCtor &&
19931         ('constructor' in object && 'constructor' in other) &&
19932         !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
19933           typeof othCtor == 'function' && othCtor instanceof othCtor)) {
19934       result = false;
19935     }
19936   }
19937   stack['delete'](object);
19938   stack['delete'](other);
19939   return result;
19940 }
19941
19942 /** Used to compose bitmasks for value comparisons. */
19943 var COMPARE_PARTIAL_FLAG$3 = 1;
19944
19945 /** `Object#toString` result references. */
19946 var argsTag$3 = '[object Arguments]',
19947     arrayTag$2 = '[object Array]',
19948     objectTag$3 = '[object Object]';
19949
19950 /** Used for built-in method references. */
19951 var objectProto$14 = Object.prototype;
19952
19953 /** Used to check objects for own properties. */
19954 var hasOwnProperty$11 = objectProto$14.hasOwnProperty;
19955
19956 /**
19957  * A specialized version of `baseIsEqual` for arrays and objects which performs
19958  * deep comparisons and tracks traversed objects enabling objects with circular
19959  * references to be compared.
19960  *
19961  * @private
19962  * @param {Object} object The object to compare.
19963  * @param {Object} other The other object to compare.
19964  * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19965  * @param {Function} customizer The function to customize comparisons.
19966  * @param {Function} equalFunc The function to determine equivalents of values.
19967  * @param {Object} [stack] Tracks traversed `object` and `other` objects.
19968  * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19969  */
19970 function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
19971   var objIsArr = isArray(object),
19972       othIsArr = isArray(other),
19973       objTag = objIsArr ? arrayTag$2 : getTag$1(object),
19974       othTag = othIsArr ? arrayTag$2 : getTag$1(other);
19975
19976   objTag = objTag == argsTag$3 ? objectTag$3 : objTag;
19977   othTag = othTag == argsTag$3 ? objectTag$3 : othTag;
19978
19979   var objIsObj = objTag == objectTag$3,
19980       othIsObj = othTag == objectTag$3,
19981       isSameTag = objTag == othTag;
19982
19983   if (isSameTag && isBuffer(object)) {
19984     if (!isBuffer(other)) {
19985       return false;
19986     }
19987     objIsArr = true;
19988     objIsObj = false;
19989   }
19990   if (isSameTag && !objIsObj) {
19991     stack || (stack = new Stack);
19992     return (objIsArr || isTypedArray(object))
19993       ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
19994       : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
19995   }
19996   if (!(bitmask & COMPARE_PARTIAL_FLAG$3)) {
19997     var objIsWrapped = objIsObj && hasOwnProperty$11.call(object, '__wrapped__'),
19998         othIsWrapped = othIsObj && hasOwnProperty$11.call(other, '__wrapped__');
19999
20000     if (objIsWrapped || othIsWrapped) {
20001       var objUnwrapped = objIsWrapped ? object.value() : object,
20002           othUnwrapped = othIsWrapped ? other.value() : other;
20003
20004       stack || (stack = new Stack);
20005       return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
20006     }
20007   }
20008   if (!isSameTag) {
20009     return false;
20010   }
20011   stack || (stack = new Stack);
20012   return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
20013 }
20014
20015 /**
20016  * The base implementation of `_.isEqual` which supports partial comparisons
20017  * and tracks traversed objects.
20018  *
20019  * @private
20020  * @param {*} value The value to compare.
20021  * @param {*} other The other value to compare.
20022  * @param {boolean} bitmask The bitmask flags.
20023  *  1 - Unordered comparison
20024  *  2 - Partial comparison
20025  * @param {Function} [customizer] The function to customize comparisons.
20026  * @param {Object} [stack] Tracks traversed `value` and `other` objects.
20027  * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
20028  */
20029 function baseIsEqual(value, other, bitmask, customizer, stack) {
20030   if (value === other) {
20031     return true;
20032   }
20033   if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
20034     return value !== value && other !== other;
20035   }
20036   return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
20037 }
20038
20039 /** Used to compose bitmasks for value comparisons. */
20040 var COMPARE_PARTIAL_FLAG$4 = 1,
20041     COMPARE_UNORDERED_FLAG$2 = 2;
20042
20043 /**
20044  * The base implementation of `_.isMatch` without support for iteratee shorthands.
20045  *
20046  * @private
20047  * @param {Object} object The object to inspect.
20048  * @param {Object} source The object of property values to match.
20049  * @param {Array} matchData The property names, values, and compare flags to match.
20050  * @param {Function} [customizer] The function to customize comparisons.
20051  * @returns {boolean} Returns `true` if `object` is a match, else `false`.
20052  */
20053 function baseIsMatch(object, source, matchData, customizer) {
20054   var index = matchData.length,
20055       length = index,
20056       noCustomizer = !customizer;
20057
20058   if (object == null) {
20059     return !length;
20060   }
20061   object = Object(object);
20062   while (index--) {
20063     var data = matchData[index];
20064     if ((noCustomizer && data[2])
20065           ? data[1] !== object[data[0]]
20066           : !(data[0] in object)
20067         ) {
20068       return false;
20069     }
20070   }
20071   while (++index < length) {
20072     data = matchData[index];
20073     var key = data[0],
20074         objValue = object[key],
20075         srcValue = data[1];
20076
20077     if (noCustomizer && data[2]) {
20078       if (objValue === undefined && !(key in object)) {
20079         return false;
20080       }
20081     } else {
20082       var stack = new Stack;
20083       if (customizer) {
20084         var result = customizer(objValue, srcValue, key, object, source, stack);
20085       }
20086       if (!(result === undefined
20087             ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$4 | COMPARE_UNORDERED_FLAG$2, customizer, stack)
20088             : result
20089           )) {
20090         return false;
20091       }
20092     }
20093   }
20094   return true;
20095 }
20096
20097 /**
20098  * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
20099  *
20100  * @private
20101  * @param {*} value The value to check.
20102  * @returns {boolean} Returns `true` if `value` if suitable for strict
20103  *  equality comparisons, else `false`.
20104  */
20105 function isStrictComparable(value) {
20106   return value === value && !isObject(value);
20107 }
20108
20109 /**
20110  * Gets the property names, values, and compare flags of `object`.
20111  *
20112  * @private
20113  * @param {Object} object The object to query.
20114  * @returns {Array} Returns the match data of `object`.
20115  */
20116 function getMatchData(object) {
20117   var result = keys$1(object),
20118       length = result.length;
20119
20120   while (length--) {
20121     var key = result[length],
20122         value = object[key];
20123
20124     result[length] = [key, value, isStrictComparable(value)];
20125   }
20126   return result;
20127 }
20128
20129 /**
20130  * A specialized version of `matchesProperty` for source values suitable
20131  * for strict equality comparisons, i.e. `===`.
20132  *
20133  * @private
20134  * @param {string} key The key of the property to get.
20135  * @param {*} srcValue The value to match.
20136  * @returns {Function} Returns the new spec function.
20137  */
20138 function matchesStrictComparable(key, srcValue) {
20139   return function(object) {
20140     if (object == null) {
20141       return false;
20142     }
20143     return object[key] === srcValue &&
20144       (srcValue !== undefined || (key in Object(object)));
20145   };
20146 }
20147
20148 /**
20149  * The base implementation of `_.matches` which doesn't clone `source`.
20150  *
20151  * @private
20152  * @param {Object} source The object of property values to match.
20153  * @returns {Function} Returns the new spec function.
20154  */
20155 function baseMatches(source) {
20156   var matchData = getMatchData(source);
20157   if (matchData.length == 1 && matchData[0][2]) {
20158     return matchesStrictComparable(matchData[0][0], matchData[0][1]);
20159   }
20160   return function(object) {
20161     return object === source || baseIsMatch(object, source, matchData);
20162   };
20163 }
20164
20165 /** `Object#toString` result references. */
20166 var symbolTag$3 = '[object Symbol]';
20167
20168 /**
20169  * Checks if `value` is classified as a `Symbol` primitive or object.
20170  *
20171  * @static
20172  * @memberOf _
20173  * @since 4.0.0
20174  * @category Lang
20175  * @param {*} value The value to check.
20176  * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
20177  * @example
20178  *
20179  * _.isSymbol(Symbol.iterator);
20180  * // => true
20181  *
20182  * _.isSymbol('abc');
20183  * // => false
20184  */
20185 function isSymbol(value) {
20186   return typeof value == 'symbol' ||
20187     (isObjectLike(value) && baseGetTag(value) == symbolTag$3);
20188 }
20189
20190 /** Used to match property names within property paths. */
20191 var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
20192     reIsPlainProp = /^\w*$/;
20193
20194 /**
20195  * Checks if `value` is a property name and not a property path.
20196  *
20197  * @private
20198  * @param {*} value The value to check.
20199  * @param {Object} [object] The object to query keys on.
20200  * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
20201  */
20202 function isKey(value, object) {
20203   if (isArray(value)) {
20204     return false;
20205   }
20206   var type = typeof value;
20207   if (type == 'number' || type == 'symbol' || type == 'boolean' ||
20208       value == null || isSymbol(value)) {
20209     return true;
20210   }
20211   return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
20212     (object != null && value in Object(object));
20213 }
20214
20215 /** Error message constants. */
20216 var FUNC_ERROR_TEXT = 'Expected a function';
20217
20218 /**
20219  * Creates a function that memoizes the result of `func`. If `resolver` is
20220  * provided, it determines the cache key for storing the result based on the
20221  * arguments provided to the memoized function. By default, the first argument
20222  * provided to the memoized function is used as the map cache key. The `func`
20223  * is invoked with the `this` binding of the memoized function.
20224  *
20225  * **Note:** The cache is exposed as the `cache` property on the memoized
20226  * function. Its creation may be customized by replacing the `_.memoize.Cache`
20227  * constructor with one whose instances implement the
20228  * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
20229  * method interface of `clear`, `delete`, `get`, `has`, and `set`.
20230  *
20231  * @static
20232  * @memberOf _
20233  * @since 0.1.0
20234  * @category Function
20235  * @param {Function} func The function to have its output memoized.
20236  * @param {Function} [resolver] The function to resolve the cache key.
20237  * @returns {Function} Returns the new memoized function.
20238  * @example
20239  *
20240  * var object = { 'a': 1, 'b': 2 };
20241  * var other = { 'c': 3, 'd': 4 };
20242  *
20243  * var values = _.memoize(_.values);
20244  * values(object);
20245  * // => [1, 2]
20246  *
20247  * values(other);
20248  * // => [3, 4]
20249  *
20250  * object.a = 2;
20251  * values(object);
20252  * // => [1, 2]
20253  *
20254  * // Modify the result cache.
20255  * values.cache.set(object, ['a', 'b']);
20256  * values(object);
20257  * // => ['a', 'b']
20258  *
20259  * // Replace `_.memoize.Cache`.
20260  * _.memoize.Cache = WeakMap;
20261  */
20262 function memoize(func, resolver) {
20263   if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
20264     throw new TypeError(FUNC_ERROR_TEXT);
20265   }
20266   var memoized = function() {
20267     var args = arguments,
20268         key = resolver ? resolver.apply(this, args) : args[0],
20269         cache = memoized.cache;
20270
20271     if (cache.has(key)) {
20272       return cache.get(key);
20273     }
20274     var result = func.apply(this, args);
20275     memoized.cache = cache.set(key, result) || cache;
20276     return result;
20277   };
20278   memoized.cache = new (memoize.Cache || MapCache);
20279   return memoized;
20280 }
20281
20282 // Expose `MapCache`.
20283 memoize.Cache = MapCache;
20284
20285 /** Used as the maximum memoize cache size. */
20286 var MAX_MEMOIZE_SIZE = 500;
20287
20288 /**
20289  * A specialized version of `_.memoize` which clears the memoized function's
20290  * cache when it exceeds `MAX_MEMOIZE_SIZE`.
20291  *
20292  * @private
20293  * @param {Function} func The function to have its output memoized.
20294  * @returns {Function} Returns the new memoized function.
20295  */
20296 function memoizeCapped(func) {
20297   var result = memoize(func, function(key) {
20298     if (cache.size === MAX_MEMOIZE_SIZE) {
20299       cache.clear();
20300     }
20301     return key;
20302   });
20303
20304   var cache = result.cache;
20305   return result;
20306 }
20307
20308 /** Used to match property names within property paths. */
20309 var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
20310
20311 /** Used to match backslashes in property paths. */
20312 var reEscapeChar = /\\(\\)?/g;
20313
20314 /**
20315  * Converts `string` to a property path array.
20316  *
20317  * @private
20318  * @param {string} string The string to convert.
20319  * @returns {Array} Returns the property path array.
20320  */
20321 var stringToPath = memoizeCapped(function(string) {
20322   var result = [];
20323   if (string.charCodeAt(0) === 46 /* . */) {
20324     result.push('');
20325   }
20326   string.replace(rePropName, function(match, number, quote, subString) {
20327     result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
20328   });
20329   return result;
20330 });
20331
20332 /**
20333  * A specialized version of `_.map` for arrays without support for iteratee
20334  * shorthands.
20335  *
20336  * @private
20337  * @param {Array} [array] The array to iterate over.
20338  * @param {Function} iteratee The function invoked per iteration.
20339  * @returns {Array} Returns the new mapped array.
20340  */
20341 function arrayMap(array, iteratee) {
20342   var index = -1,
20343       length = array == null ? 0 : array.length,
20344       result = Array(length);
20345
20346   while (++index < length) {
20347     result[index] = iteratee(array[index], index, array);
20348   }
20349   return result;
20350 }
20351
20352 /** Used as references for various `Number` constants. */
20353 var INFINITY = 1 / 0;
20354
20355 /** Used to convert symbols to primitives and strings. */
20356 var symbolProto$2 = Symbol ? Symbol.prototype : undefined,
20357     symbolToString = symbolProto$2 ? symbolProto$2.toString : undefined;
20358
20359 /**
20360  * The base implementation of `_.toString` which doesn't convert nullish
20361  * values to empty strings.
20362  *
20363  * @private
20364  * @param {*} value The value to process.
20365  * @returns {string} Returns the string.
20366  */
20367 function baseToString(value) {
20368   // Exit early for strings to avoid a performance hit in some environments.
20369   if (typeof value == 'string') {
20370     return value;
20371   }
20372   if (isArray(value)) {
20373     // Recursively convert values (susceptible to call stack limits).
20374     return arrayMap(value, baseToString) + '';
20375   }
20376   if (isSymbol(value)) {
20377     return symbolToString ? symbolToString.call(value) : '';
20378   }
20379   var result = (value + '');
20380   return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
20381 }
20382
20383 /**
20384  * Converts `value` to a string. An empty string is returned for `null`
20385  * and `undefined` values. The sign of `-0` is preserved.
20386  *
20387  * @static
20388  * @memberOf _
20389  * @since 4.0.0
20390  * @category Lang
20391  * @param {*} value The value to convert.
20392  * @returns {string} Returns the converted string.
20393  * @example
20394  *
20395  * _.toString(null);
20396  * // => ''
20397  *
20398  * _.toString(-0);
20399  * // => '-0'
20400  *
20401  * _.toString([1, 2, 3]);
20402  * // => '1,2,3'
20403  */
20404 function toString(value) {
20405   return value == null ? '' : baseToString(value);
20406 }
20407
20408 /**
20409  * Casts `value` to a path array if it's not one.
20410  *
20411  * @private
20412  * @param {*} value The value to inspect.
20413  * @param {Object} [object] The object to query keys on.
20414  * @returns {Array} Returns the cast property path array.
20415  */
20416 function castPath(value, object) {
20417   if (isArray(value)) {
20418     return value;
20419   }
20420   return isKey(value, object) ? [value] : stringToPath(toString(value));
20421 }
20422
20423 /** Used as references for various `Number` constants. */
20424 var INFINITY$1 = 1 / 0;
20425
20426 /**
20427  * Converts `value` to a string key if it's not a string or symbol.
20428  *
20429  * @private
20430  * @param {*} value The value to inspect.
20431  * @returns {string|symbol} Returns the key.
20432  */
20433 function toKey(value) {
20434   if (typeof value == 'string' || isSymbol(value)) {
20435     return value;
20436   }
20437   var result = (value + '');
20438   return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result;
20439 }
20440
20441 /**
20442  * The base implementation of `_.get` without support for default values.
20443  *
20444  * @private
20445  * @param {Object} object The object to query.
20446  * @param {Array|string} path The path of the property to get.
20447  * @returns {*} Returns the resolved value.
20448  */
20449 function baseGet(object, path) {
20450   path = castPath(path, object);
20451
20452   var index = 0,
20453       length = path.length;
20454
20455   while (object != null && index < length) {
20456     object = object[toKey(path[index++])];
20457   }
20458   return (index && index == length) ? object : undefined;
20459 }
20460
20461 /**
20462  * Gets the value at `path` of `object`. If the resolved value is
20463  * `undefined`, the `defaultValue` is returned in its place.
20464  *
20465  * @static
20466  * @memberOf _
20467  * @since 3.7.0
20468  * @category Object
20469  * @param {Object} object The object to query.
20470  * @param {Array|string} path The path of the property to get.
20471  * @param {*} [defaultValue] The value returned for `undefined` resolved values.
20472  * @returns {*} Returns the resolved value.
20473  * @example
20474  *
20475  * var object = { 'a': [{ 'b': { 'c': 3 } }] };
20476  *
20477  * _.get(object, 'a[0].b.c');
20478  * // => 3
20479  *
20480  * _.get(object, ['a', '0', 'b', 'c']);
20481  * // => 3
20482  *
20483  * _.get(object, 'a.b.c', 'default');
20484  * // => 'default'
20485  */
20486 function get$2(object, path, defaultValue) {
20487   var result = object == null ? undefined : baseGet(object, path);
20488   return result === undefined ? defaultValue : result;
20489 }
20490
20491 /**
20492  * The base implementation of `_.hasIn` without support for deep paths.
20493  *
20494  * @private
20495  * @param {Object} [object] The object to query.
20496  * @param {Array|string} key The key to check.
20497  * @returns {boolean} Returns `true` if `key` exists, else `false`.
20498  */
20499 function baseHasIn(object, key) {
20500   return object != null && key in Object(object);
20501 }
20502
20503 /**
20504  * Checks if `path` exists on `object`.
20505  *
20506  * @private
20507  * @param {Object} object The object to query.
20508  * @param {Array|string} path The path to check.
20509  * @param {Function} hasFunc The function to check properties.
20510  * @returns {boolean} Returns `true` if `path` exists, else `false`.
20511  */
20512 function hasPath(object, path, hasFunc) {
20513   path = castPath(path, object);
20514
20515   var index = -1,
20516       length = path.length,
20517       result = false;
20518
20519   while (++index < length) {
20520     var key = toKey(path[index]);
20521     if (!(result = object != null && hasFunc(object, key))) {
20522       break;
20523     }
20524     object = object[key];
20525   }
20526   if (result || ++index != length) {
20527     return result;
20528   }
20529   length = object == null ? 0 : object.length;
20530   return !!length && isLength(length) && isIndex(key, length) &&
20531     (isArray(object) || isArguments(object));
20532 }
20533
20534 /**
20535  * Checks if `path` is a direct or inherited property of `object`.
20536  *
20537  * @static
20538  * @memberOf _
20539  * @since 4.0.0
20540  * @category Object
20541  * @param {Object} object The object to query.
20542  * @param {Array|string} path The path to check.
20543  * @returns {boolean} Returns `true` if `path` exists, else `false`.
20544  * @example
20545  *
20546  * var object = _.create({ 'a': _.create({ 'b': 2 }) });
20547  *
20548  * _.hasIn(object, 'a');
20549  * // => true
20550  *
20551  * _.hasIn(object, 'a.b');
20552  * // => true
20553  *
20554  * _.hasIn(object, ['a', 'b']);
20555  * // => true
20556  *
20557  * _.hasIn(object, 'b');
20558  * // => false
20559  */
20560 function hasIn(object, path) {
20561   return object != null && hasPath(object, path, baseHasIn);
20562 }
20563
20564 /** Used to compose bitmasks for value comparisons. */
20565 var COMPARE_PARTIAL_FLAG$5 = 1,
20566     COMPARE_UNORDERED_FLAG$3 = 2;
20567
20568 /**
20569  * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
20570  *
20571  * @private
20572  * @param {string} path The path of the property to get.
20573  * @param {*} srcValue The value to match.
20574  * @returns {Function} Returns the new spec function.
20575  */
20576 function baseMatchesProperty(path, srcValue) {
20577   if (isKey(path) && isStrictComparable(srcValue)) {
20578     return matchesStrictComparable(toKey(path), srcValue);
20579   }
20580   return function(object) {
20581     var objValue = get$2(object, path);
20582     return (objValue === undefined && objValue === srcValue)
20583       ? hasIn(object, path)
20584       : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$5 | COMPARE_UNORDERED_FLAG$3);
20585   };
20586 }
20587
20588 /**
20589  * This method returns the first argument it receives.
20590  *
20591  * @static
20592  * @since 0.1.0
20593  * @memberOf _
20594  * @category Util
20595  * @param {*} value Any value.
20596  * @returns {*} Returns `value`.
20597  * @example
20598  *
20599  * var object = { 'a': 1 };
20600  *
20601  * console.log(_.identity(object) === object);
20602  * // => true
20603  */
20604 function identity$8(value) {
20605   return value;
20606 }
20607
20608 /**
20609  * The base implementation of `_.property` without support for deep paths.
20610  *
20611  * @private
20612  * @param {string} key The key of the property to get.
20613  * @returns {Function} Returns the new accessor function.
20614  */
20615 function baseProperty(key) {
20616   return function(object) {
20617     return object == null ? undefined : object[key];
20618   };
20619 }
20620
20621 /**
20622  * A specialized version of `baseProperty` which supports deep paths.
20623  *
20624  * @private
20625  * @param {Array|string} path The path of the property to get.
20626  * @returns {Function} Returns the new accessor function.
20627  */
20628 function basePropertyDeep(path) {
20629   return function(object) {
20630     return baseGet(object, path);
20631   };
20632 }
20633
20634 /**
20635  * Creates a function that returns the value at `path` of a given object.
20636  *
20637  * @static
20638  * @memberOf _
20639  * @since 2.4.0
20640  * @category Util
20641  * @param {Array|string} path The path of the property to get.
20642  * @returns {Function} Returns the new accessor function.
20643  * @example
20644  *
20645  * var objects = [
20646  *   { 'a': { 'b': 2 } },
20647  *   { 'a': { 'b': 1 } }
20648  * ];
20649  *
20650  * _.map(objects, _.property('a.b'));
20651  * // => [2, 1]
20652  *
20653  * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
20654  * // => [1, 2]
20655  */
20656 function property(path) {
20657   return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
20658 }
20659
20660 /**
20661  * The base implementation of `_.iteratee`.
20662  *
20663  * @private
20664  * @param {*} [value=_.identity] The value to convert to an iteratee.
20665  * @returns {Function} Returns the iteratee.
20666  */
20667 function baseIteratee(value) {
20668   // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
20669   // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
20670   if (typeof value == 'function') {
20671     return value;
20672   }
20673   if (value == null) {
20674     return identity$8;
20675   }
20676   if (typeof value == 'object') {
20677     return isArray(value)
20678       ? baseMatchesProperty(value[0], value[1])
20679       : baseMatches(value);
20680   }
20681   return property(value);
20682 }
20683
20684 /**
20685  * Creates a function like `_.groupBy`.
20686  *
20687  * @private
20688  * @param {Function} setter The function to set accumulator values.
20689  * @param {Function} [initializer] The accumulator object initializer.
20690  * @returns {Function} Returns the new aggregator function.
20691  */
20692 function createAggregator(setter, initializer) {
20693   return function(collection, iteratee) {
20694     var func = isArray(collection) ? arrayAggregator : baseAggregator,
20695         accumulator = initializer ? initializer() : {};
20696
20697     return func(collection, setter, baseIteratee(iteratee, 2), accumulator);
20698   };
20699 }
20700
20701 /** Used for built-in method references. */
20702 var objectProto$15 = Object.prototype;
20703
20704 /** Used to check objects for own properties. */
20705 var hasOwnProperty$12 = objectProto$15.hasOwnProperty;
20706
20707 /**
20708  * Creates an object composed of keys generated from the results of running
20709  * each element of `collection` thru `iteratee`. The order of grouped values
20710  * is determined by the order they occur in `collection`. The corresponding
20711  * value of each key is an array of elements responsible for generating the
20712  * key. The iteratee is invoked with one argument: (value).
20713  *
20714  * @static
20715  * @memberOf _
20716  * @since 0.1.0
20717  * @category Collection
20718  * @param {Array|Object} collection The collection to iterate over.
20719  * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
20720  * @returns {Object} Returns the composed aggregate object.
20721  * @example
20722  *
20723  * _.groupBy([6.1, 4.2, 6.3], Math.floor);
20724  * // => { '4': [4.2], '6': [6.1, 6.3] }
20725  *
20726  * // The `_.property` iteratee shorthand.
20727  * _.groupBy(['one', 'two', 'three'], 'length');
20728  * // => { '3': ['one', 'two'], '5': ['three'] }
20729  */
20730 var groupBy = createAggregator(function(result, value, key) {
20731   if (hasOwnProperty$12.call(result, key)) {
20732     result[key].push(value);
20733   } else {
20734     baseAssignValue(result, key, [value]);
20735   }
20736 });
20737
20738 /**
20739  * Gets the last element of `array`.
20740  *
20741  * @static
20742  * @memberOf _
20743  * @since 0.1.0
20744  * @category Array
20745  * @param {Array} array The array to query.
20746  * @returns {*} Returns the last element of `array`.
20747  * @example
20748  *
20749  * _.last([1, 2, 3]);
20750  * // => 3
20751  */
20752 function last(array) {
20753   var length = array == null ? 0 : array.length;
20754   return length ? array[length - 1] : undefined;
20755 }
20756
20757 /**
20758  * The base implementation of `_.slice` without an iteratee call guard.
20759  *
20760  * @private
20761  * @param {Array} array The array to slice.
20762  * @param {number} [start=0] The start position.
20763  * @param {number} [end=array.length] The end position.
20764  * @returns {Array} Returns the slice of `array`.
20765  */
20766 function baseSlice(array, start, end) {
20767   var index = -1,
20768       length = array.length;
20769
20770   if (start < 0) {
20771     start = -start > length ? 0 : (length + start);
20772   }
20773   end = end > length ? length : end;
20774   if (end < 0) {
20775     end += length;
20776   }
20777   length = start > end ? 0 : ((end - start) >>> 0);
20778   start >>>= 0;
20779
20780   var result = Array(length);
20781   while (++index < length) {
20782     result[index] = array[index + start];
20783   }
20784   return result;
20785 }
20786
20787 /**
20788  * Gets the parent value at `path` of `object`.
20789  *
20790  * @private
20791  * @param {Object} object The object to query.
20792  * @param {Array} path The path to get the parent value of.
20793  * @returns {*} Returns the parent value.
20794  */
20795 function parent(object, path) {
20796   return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
20797 }
20798
20799 /**
20800  * The base implementation of `_.unset`.
20801  *
20802  * @private
20803  * @param {Object} object The object to modify.
20804  * @param {Array|string} path The property path to unset.
20805  * @returns {boolean} Returns `true` if the property is deleted, else `false`.
20806  */
20807 function baseUnset(object, path) {
20808   path = castPath(path, object);
20809   object = parent(object, path);
20810   return object == null || delete object[toKey(last(path))];
20811 }
20812
20813 /** `Object#toString` result references. */
20814 var objectTag$4 = '[object Object]';
20815
20816 /** Used for built-in method references. */
20817 var funcProto$2 = Function.prototype,
20818     objectProto$16 = Object.prototype;
20819
20820 /** Used to resolve the decompiled source of functions. */
20821 var funcToString$2 = funcProto$2.toString;
20822
20823 /** Used to check objects for own properties. */
20824 var hasOwnProperty$13 = objectProto$16.hasOwnProperty;
20825
20826 /** Used to infer the `Object` constructor. */
20827 var objectCtorString = funcToString$2.call(Object);
20828
20829 /**
20830  * Checks if `value` is a plain object, that is, an object created by the
20831  * `Object` constructor or one with a `[[Prototype]]` of `null`.
20832  *
20833  * @static
20834  * @memberOf _
20835  * @since 0.8.0
20836  * @category Lang
20837  * @param {*} value The value to check.
20838  * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
20839  * @example
20840  *
20841  * function Foo() {
20842  *   this.a = 1;
20843  * }
20844  *
20845  * _.isPlainObject(new Foo);
20846  * // => false
20847  *
20848  * _.isPlainObject([1, 2, 3]);
20849  * // => false
20850  *
20851  * _.isPlainObject({ 'x': 0, 'y': 0 });
20852  * // => true
20853  *
20854  * _.isPlainObject(Object.create(null));
20855  * // => true
20856  */
20857 function isPlainObject(value) {
20858   if (!isObjectLike(value) || baseGetTag(value) != objectTag$4) {
20859     return false;
20860   }
20861   var proto = getPrototype(value);
20862   if (proto === null) {
20863     return true;
20864   }
20865   var Ctor = hasOwnProperty$13.call(proto, 'constructor') && proto.constructor;
20866   return typeof Ctor == 'function' && Ctor instanceof Ctor &&
20867     funcToString$2.call(Ctor) == objectCtorString;
20868 }
20869
20870 /**
20871  * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
20872  * objects.
20873  *
20874  * @private
20875  * @param {*} value The value to inspect.
20876  * @param {string} key The key of the property to inspect.
20877  * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
20878  */
20879 function customOmitClone(value) {
20880   return isPlainObject(value) ? undefined : value;
20881 }
20882
20883 /** Built-in value references. */
20884 var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
20885
20886 /**
20887  * Checks if `value` is a flattenable `arguments` object or array.
20888  *
20889  * @private
20890  * @param {*} value The value to check.
20891  * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
20892  */
20893 function isFlattenable(value) {
20894   return isArray(value) || isArguments(value) ||
20895     !!(spreadableSymbol && value && value[spreadableSymbol]);
20896 }
20897
20898 /**
20899  * The base implementation of `_.flatten` with support for restricting flattening.
20900  *
20901  * @private
20902  * @param {Array} array The array to flatten.
20903  * @param {number} depth The maximum recursion depth.
20904  * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
20905  * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
20906  * @param {Array} [result=[]] The initial result value.
20907  * @returns {Array} Returns the new flattened array.
20908  */
20909 function baseFlatten(array, depth, predicate, isStrict, result) {
20910   var index = -1,
20911       length = array.length;
20912
20913   predicate || (predicate = isFlattenable);
20914   result || (result = []);
20915
20916   while (++index < length) {
20917     var value = array[index];
20918     if (depth > 0 && predicate(value)) {
20919       if (depth > 1) {
20920         // Recursively flatten arrays (susceptible to call stack limits).
20921         baseFlatten(value, depth - 1, predicate, isStrict, result);
20922       } else {
20923         arrayPush(result, value);
20924       }
20925     } else if (!isStrict) {
20926       result[result.length] = value;
20927     }
20928   }
20929   return result;
20930 }
20931
20932 /**
20933  * Flattens `array` a single level deep.
20934  *
20935  * @static
20936  * @memberOf _
20937  * @since 0.1.0
20938  * @category Array
20939  * @param {Array} array The array to flatten.
20940  * @returns {Array} Returns the new flattened array.
20941  * @example
20942  *
20943  * _.flatten([1, [2, [3, [4]], 5]]);
20944  * // => [1, 2, [3, [4]], 5]
20945  */
20946 function flatten(array) {
20947   var length = array == null ? 0 : array.length;
20948   return length ? baseFlatten(array, 1) : [];
20949 }
20950
20951 /**
20952  * A faster alternative to `Function#apply`, this function invokes `func`
20953  * with the `this` binding of `thisArg` and the arguments of `args`.
20954  *
20955  * @private
20956  * @param {Function} func The function to invoke.
20957  * @param {*} thisArg The `this` binding of `func`.
20958  * @param {Array} args The arguments to invoke `func` with.
20959  * @returns {*} Returns the result of `func`.
20960  */
20961 function apply(func, thisArg, args) {
20962   switch (args.length) {
20963     case 0: return func.call(thisArg);
20964     case 1: return func.call(thisArg, args[0]);
20965     case 2: return func.call(thisArg, args[0], args[1]);
20966     case 3: return func.call(thisArg, args[0], args[1], args[2]);
20967   }
20968   return func.apply(thisArg, args);
20969 }
20970
20971 /* Built-in method references for those with the same name as other `lodash` methods. */
20972 var nativeMax = Math.max;
20973
20974 /**
20975  * A specialized version of `baseRest` which transforms the rest array.
20976  *
20977  * @private
20978  * @param {Function} func The function to apply a rest parameter to.
20979  * @param {number} [start=func.length-1] The start position of the rest parameter.
20980  * @param {Function} transform The rest array transform.
20981  * @returns {Function} Returns the new function.
20982  */
20983 function overRest(func, start, transform) {
20984   start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
20985   return function() {
20986     var args = arguments,
20987         index = -1,
20988         length = nativeMax(args.length - start, 0),
20989         array = Array(length);
20990
20991     while (++index < length) {
20992       array[index] = args[start + index];
20993     }
20994     index = -1;
20995     var otherArgs = Array(start + 1);
20996     while (++index < start) {
20997       otherArgs[index] = args[index];
20998     }
20999     otherArgs[start] = transform(array);
21000     return apply(func, this, otherArgs);
21001   };
21002 }
21003
21004 /**
21005  * Creates a function that returns `value`.
21006  *
21007  * @static
21008  * @memberOf _
21009  * @since 2.4.0
21010  * @category Util
21011  * @param {*} value The value to return from the new function.
21012  * @returns {Function} Returns the new constant function.
21013  * @example
21014  *
21015  * var objects = _.times(2, _.constant({ 'a': 1 }));
21016  *
21017  * console.log(objects);
21018  * // => [{ 'a': 1 }, { 'a': 1 }]
21019  *
21020  * console.log(objects[0] === objects[1]);
21021  * // => true
21022  */
21023 function constant$13(value) {
21024   return function() {
21025     return value;
21026   };
21027 }
21028
21029 /**
21030  * The base implementation of `setToString` without support for hot loop shorting.
21031  *
21032  * @private
21033  * @param {Function} func The function to modify.
21034  * @param {Function} string The `toString` result.
21035  * @returns {Function} Returns `func`.
21036  */
21037 var baseSetToString = !defineProperty ? identity$8 : function(func, string) {
21038   return defineProperty(func, 'toString', {
21039     'configurable': true,
21040     'enumerable': false,
21041     'value': constant$13(string),
21042     'writable': true
21043   });
21044 };
21045
21046 /** Used to detect hot functions by number of calls within a span of milliseconds. */
21047 var HOT_COUNT = 800,
21048     HOT_SPAN = 16;
21049
21050 /* Built-in method references for those with the same name as other `lodash` methods. */
21051 var nativeNow = Date.now;
21052
21053 /**
21054  * Creates a function that'll short out and invoke `identity` instead
21055  * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
21056  * milliseconds.
21057  *
21058  * @private
21059  * @param {Function} func The function to restrict.
21060  * @returns {Function} Returns the new shortable function.
21061  */
21062 function shortOut(func) {
21063   var count = 0,
21064       lastCalled = 0;
21065
21066   return function() {
21067     var stamp = nativeNow(),
21068         remaining = HOT_SPAN - (stamp - lastCalled);
21069
21070     lastCalled = stamp;
21071     if (remaining > 0) {
21072       if (++count >= HOT_COUNT) {
21073         return arguments[0];
21074       }
21075     } else {
21076       count = 0;
21077     }
21078     return func.apply(undefined, arguments);
21079   };
21080 }
21081
21082 /**
21083  * Sets the `toString` method of `func` to return `string`.
21084  *
21085  * @private
21086  * @param {Function} func The function to modify.
21087  * @param {Function} string The `toString` result.
21088  * @returns {Function} Returns `func`.
21089  */
21090 var setToString = shortOut(baseSetToString);
21091
21092 /**
21093  * A specialized version of `baseRest` which flattens the rest array.
21094  *
21095  * @private
21096  * @param {Function} func The function to apply a rest parameter to.
21097  * @returns {Function} Returns the new function.
21098  */
21099 function flatRest(func) {
21100   return setToString(overRest(func, undefined, flatten), func + '');
21101 }
21102
21103 /** Used to compose bitmasks for cloning. */
21104 var CLONE_DEEP_FLAG$1 = 1,
21105     CLONE_FLAT_FLAG$1 = 2,
21106     CLONE_SYMBOLS_FLAG$2 = 4;
21107
21108 /**
21109  * The opposite of `_.pick`; this method creates an object composed of the
21110  * own and inherited enumerable property paths of `object` that are not omitted.
21111  *
21112  * **Note:** This method is considerably slower than `_.pick`.
21113  *
21114  * @static
21115  * @since 0.1.0
21116  * @memberOf _
21117  * @category Object
21118  * @param {Object} object The source object.
21119  * @param {...(string|string[])} [paths] The property paths to omit.
21120  * @returns {Object} Returns the new object.
21121  * @example
21122  *
21123  * var object = { 'a': 1, 'b': '2', 'c': 3 };
21124  *
21125  * _.omit(object, ['a', 'c']);
21126  * // => { 'b': '2' }
21127  */
21128 var omit = flatRest(function(object, paths) {
21129   var result = {};
21130   if (object == null) {
21131     return result;
21132   }
21133   var isDeep = false;
21134   paths = arrayMap(paths, function(path) {
21135     path = castPath(path, object);
21136     isDeep || (isDeep = path.length > 1);
21137     return path;
21138   });
21139   copyObject(object, getAllKeysIn(object), result);
21140   if (isDeep) {
21141     result = baseClone(result, CLONE_DEEP_FLAG$1 | CLONE_FLAT_FLAG$1 | CLONE_SYMBOLS_FLAG$2, customOmitClone);
21142   }
21143   var length = paths.length;
21144   while (length--) {
21145     baseUnset(result, paths[length]);
21146   }
21147   return result;
21148 });
21149
21150 /**
21151  * Creates an array with all falsey values removed. The values `false`, `null`,
21152  * `0`, `""`, `undefined`, and `NaN` are falsey.
21153  *
21154  * @static
21155  * @memberOf _
21156  * @since 0.1.0
21157  * @category Array
21158  * @param {Array} array The array to compact.
21159  * @returns {Array} Returns the new array of filtered values.
21160  * @example
21161  *
21162  * _.compact([0, 1, false, 2, '', 3]);
21163  * // => [1, 2, 3]
21164  */
21165 function compact(array) {
21166   var index = -1,
21167       length = array == null ? 0 : array.length,
21168       resIndex = 0,
21169       result = [];
21170
21171   while (++index < length) {
21172     var value = array[index];
21173     if (value) {
21174       result[resIndex++] = value;
21175     }
21176   }
21177   return result;
21178 }
21179
21180 /**
21181  * The base implementation of `_.rest` which doesn't validate or coerce arguments.
21182  *
21183  * @private
21184  * @param {Function} func The function to apply a rest parameter to.
21185  * @param {number} [start=func.length-1] The start position of the rest parameter.
21186  * @returns {Function} Returns the new function.
21187  */
21188 function baseRest(func, start) {
21189   return setToString(overRest(func, start, identity$8), func + '');
21190 }
21191
21192 /**
21193  * Checks if the given arguments are from an iteratee call.
21194  *
21195  * @private
21196  * @param {*} value The potential iteratee value argument.
21197  * @param {*} index The potential iteratee index or key argument.
21198  * @param {*} object The potential iteratee object argument.
21199  * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
21200  *  else `false`.
21201  */
21202 function isIterateeCall(value, index, object) {
21203   if (!isObject(object)) {
21204     return false;
21205   }
21206   var type = typeof index;
21207   if (type == 'number'
21208         ? (isArrayLike(object) && isIndex(index, object.length))
21209         : (type == 'string' && index in object)
21210       ) {
21211     return eq(object[index], value);
21212   }
21213   return false;
21214 }
21215
21216 /**
21217  * Creates a function like `_.assign`.
21218  *
21219  * @private
21220  * @param {Function} assigner The function to assign values.
21221  * @returns {Function} Returns the new assigner function.
21222  */
21223 function createAssigner(assigner) {
21224   return baseRest(function(object, sources) {
21225     var index = -1,
21226         length = sources.length,
21227         customizer = length > 1 ? sources[length - 1] : undefined,
21228         guard = length > 2 ? sources[2] : undefined;
21229
21230     customizer = (assigner.length > 3 && typeof customizer == 'function')
21231       ? (length--, customizer)
21232       : undefined;
21233
21234     if (guard && isIterateeCall(sources[0], sources[1], guard)) {
21235       customizer = length < 3 ? undefined : customizer;
21236       length = 1;
21237     }
21238     object = Object(object);
21239     while (++index < length) {
21240       var source = sources[index];
21241       if (source) {
21242         assigner(object, source, index, customizer);
21243       }
21244     }
21245     return object;
21246   });
21247 }
21248
21249 /**
21250  * This method is like `_.assign` except that it iterates over own and
21251  * inherited source properties.
21252  *
21253  * **Note:** This method mutates `object`.
21254  *
21255  * @static
21256  * @memberOf _
21257  * @since 4.0.0
21258  * @alias extend
21259  * @category Object
21260  * @param {Object} object The destination object.
21261  * @param {...Object} [sources] The source objects.
21262  * @returns {Object} Returns `object`.
21263  * @see _.assign
21264  * @example
21265  *
21266  * function Foo() {
21267  *   this.a = 1;
21268  * }
21269  *
21270  * function Bar() {
21271  *   this.c = 3;
21272  * }
21273  *
21274  * Foo.prototype.b = 2;
21275  * Bar.prototype.d = 4;
21276  *
21277  * _.assignIn({ 'a': 0 }, new Foo, new Bar);
21278  * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
21279  */
21280 var assignIn = createAssigner(function(object, source) {
21281   copyObject(source, keysIn$1(source), object);
21282 });
21283
21284 /**
21285  * The base implementation of `_.filter` without support for iteratee shorthands.
21286  *
21287  * @private
21288  * @param {Array|Object} collection The collection to iterate over.
21289  * @param {Function} predicate The function invoked per iteration.
21290  * @returns {Array} Returns the new filtered array.
21291  */
21292 function baseFilter(collection, predicate) {
21293   var result = [];
21294   baseEach(collection, function(value, index, collection) {
21295     if (predicate(value, index, collection)) {
21296       result.push(value);
21297     }
21298   });
21299   return result;
21300 }
21301
21302 /**
21303  * Iterates over elements of `collection`, returning an array of all elements
21304  * `predicate` returns truthy for. The predicate is invoked with three
21305  * arguments: (value, index|key, collection).
21306  *
21307  * **Note:** Unlike `_.remove`, this method returns a new array.
21308  *
21309  * @static
21310  * @memberOf _
21311  * @since 0.1.0
21312  * @category Collection
21313  * @param {Array|Object} collection The collection to iterate over.
21314  * @param {Function} [predicate=_.identity] The function invoked per iteration.
21315  * @returns {Array} Returns the new filtered array.
21316  * @see _.reject
21317  * @example
21318  *
21319  * var users = [
21320  *   { 'user': 'barney', 'age': 36, 'active': true },
21321  *   { 'user': 'fred',   'age': 40, 'active': false }
21322  * ];
21323  *
21324  * _.filter(users, function(o) { return !o.active; });
21325  * // => objects for ['fred']
21326  *
21327  * // The `_.matches` iteratee shorthand.
21328  * _.filter(users, { 'age': 36, 'active': true });
21329  * // => objects for ['barney']
21330  *
21331  * // The `_.matchesProperty` iteratee shorthand.
21332  * _.filter(users, ['active', false]);
21333  * // => objects for ['fred']
21334  *
21335  * // The `_.property` iteratee shorthand.
21336  * _.filter(users, 'active');
21337  * // => objects for ['barney']
21338  */
21339 function filter(collection, predicate) {
21340   var func = isArray(collection) ? arrayFilter : baseFilter;
21341   return func(collection, baseIteratee(predicate, 3));
21342 }
21343
21344 /**
21345  * Creates a `_.find` or `_.findLast` function.
21346  *
21347  * @private
21348  * @param {Function} findIndexFunc The function to find the collection index.
21349  * @returns {Function} Returns the new find function.
21350  */
21351 function createFind(findIndexFunc) {
21352   return function(collection, predicate, fromIndex) {
21353     var iterable = Object(collection);
21354     if (!isArrayLike(collection)) {
21355       var iteratee = baseIteratee(predicate, 3);
21356       collection = keys$1(collection);
21357       predicate = function(key) { return iteratee(iterable[key], key, iterable); };
21358     }
21359     var index = findIndexFunc(collection, predicate, fromIndex);
21360     return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
21361   };
21362 }
21363
21364 /**
21365  * The base implementation of `_.findIndex` and `_.findLastIndex` without
21366  * support for iteratee shorthands.
21367  *
21368  * @private
21369  * @param {Array} array The array to inspect.
21370  * @param {Function} predicate The function invoked per iteration.
21371  * @param {number} fromIndex The index to search from.
21372  * @param {boolean} [fromRight] Specify iterating from right to left.
21373  * @returns {number} Returns the index of the matched value, else `-1`.
21374  */
21375 function baseFindIndex(array, predicate, fromIndex, fromRight) {
21376   var length = array.length,
21377       index = fromIndex + (fromRight ? 1 : -1);
21378
21379   while ((fromRight ? index-- : ++index < length)) {
21380     if (predicate(array[index], index, array)) {
21381       return index;
21382     }
21383   }
21384   return -1;
21385 }
21386
21387 /** Used as references for various `Number` constants. */
21388 var NAN = 0 / 0;
21389
21390 /** Used to match leading and trailing whitespace. */
21391 var reTrim = /^\s+|\s+$/g;
21392
21393 /** Used to detect bad signed hexadecimal string values. */
21394 var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
21395
21396 /** Used to detect binary string values. */
21397 var reIsBinary = /^0b[01]+$/i;
21398
21399 /** Used to detect octal string values. */
21400 var reIsOctal = /^0o[0-7]+$/i;
21401
21402 /** Built-in method references without a dependency on `root`. */
21403 var freeParseInt = parseInt;
21404
21405 /**
21406  * Converts `value` to a number.
21407  *
21408  * @static
21409  * @memberOf _
21410  * @since 4.0.0
21411  * @category Lang
21412  * @param {*} value The value to process.
21413  * @returns {number} Returns the number.
21414  * @example
21415  *
21416  * _.toNumber(3.2);
21417  * // => 3.2
21418  *
21419  * _.toNumber(Number.MIN_VALUE);
21420  * // => 5e-324
21421  *
21422  * _.toNumber(Infinity);
21423  * // => Infinity
21424  *
21425  * _.toNumber('3.2');
21426  * // => 3.2
21427  */
21428 function toNumber(value) {
21429   if (typeof value == 'number') {
21430     return value;
21431   }
21432   if (isSymbol(value)) {
21433     return NAN;
21434   }
21435   if (isObject(value)) {
21436     var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
21437     value = isObject(other) ? (other + '') : other;
21438   }
21439   if (typeof value != 'string') {
21440     return value === 0 ? value : +value;
21441   }
21442   value = value.replace(reTrim, '');
21443   var isBinary = reIsBinary.test(value);
21444   return (isBinary || reIsOctal.test(value))
21445     ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
21446     : (reIsBadHex.test(value) ? NAN : +value);
21447 }
21448
21449 /** Used as references for various `Number` constants. */
21450 var INFINITY$2 = 1 / 0,
21451     MAX_INTEGER = 1.7976931348623157e+308;
21452
21453 /**
21454  * Converts `value` to a finite number.
21455  *
21456  * @static
21457  * @memberOf _
21458  * @since 4.12.0
21459  * @category Lang
21460  * @param {*} value The value to convert.
21461  * @returns {number} Returns the converted number.
21462  * @example
21463  *
21464  * _.toFinite(3.2);
21465  * // => 3.2
21466  *
21467  * _.toFinite(Number.MIN_VALUE);
21468  * // => 5e-324
21469  *
21470  * _.toFinite(Infinity);
21471  * // => 1.7976931348623157e+308
21472  *
21473  * _.toFinite('3.2');
21474  * // => 3.2
21475  */
21476 function toFinite(value) {
21477   if (!value) {
21478     return value === 0 ? value : 0;
21479   }
21480   value = toNumber(value);
21481   if (value === INFINITY$2 || value === -INFINITY$2) {
21482     var sign = (value < 0 ? -1 : 1);
21483     return sign * MAX_INTEGER;
21484   }
21485   return value === value ? value : 0;
21486 }
21487
21488 /**
21489  * Converts `value` to an integer.
21490  *
21491  * **Note:** This method is loosely based on
21492  * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
21493  *
21494  * @static
21495  * @memberOf _
21496  * @since 4.0.0
21497  * @category Lang
21498  * @param {*} value The value to convert.
21499  * @returns {number} Returns the converted integer.
21500  * @example
21501  *
21502  * _.toInteger(3.2);
21503  * // => 3
21504  *
21505  * _.toInteger(Number.MIN_VALUE);
21506  * // => 0
21507  *
21508  * _.toInteger(Infinity);
21509  * // => 1.7976931348623157e+308
21510  *
21511  * _.toInteger('3.2');
21512  * // => 3
21513  */
21514 function toInteger(value) {
21515   var result = toFinite(value),
21516       remainder = result % 1;
21517
21518   return result === result ? (remainder ? result - remainder : result) : 0;
21519 }
21520
21521 /* Built-in method references for those with the same name as other `lodash` methods. */
21522 var nativeMax$1 = Math.max;
21523
21524 /**
21525  * This method is like `_.find` except that it returns the index of the first
21526  * element `predicate` returns truthy for instead of the element itself.
21527  *
21528  * @static
21529  * @memberOf _
21530  * @since 1.1.0
21531  * @category Array
21532  * @param {Array} array The array to inspect.
21533  * @param {Function} [predicate=_.identity] The function invoked per iteration.
21534  * @param {number} [fromIndex=0] The index to search from.
21535  * @returns {number} Returns the index of the found element, else `-1`.
21536  * @example
21537  *
21538  * var users = [
21539  *   { 'user': 'barney',  'active': false },
21540  *   { 'user': 'fred',    'active': false },
21541  *   { 'user': 'pebbles', 'active': true }
21542  * ];
21543  *
21544  * _.findIndex(users, function(o) { return o.user == 'barney'; });
21545  * // => 0
21546  *
21547  * // The `_.matches` iteratee shorthand.
21548  * _.findIndex(users, { 'user': 'fred', 'active': false });
21549  * // => 1
21550  *
21551  * // The `_.matchesProperty` iteratee shorthand.
21552  * _.findIndex(users, ['active', false]);
21553  * // => 0
21554  *
21555  * // The `_.property` iteratee shorthand.
21556  * _.findIndex(users, 'active');
21557  * // => 2
21558  */
21559 function findIndex(array, predicate, fromIndex) {
21560   var length = array == null ? 0 : array.length;
21561   if (!length) {
21562     return -1;
21563   }
21564   var index = fromIndex == null ? 0 : toInteger(fromIndex);
21565   if (index < 0) {
21566     index = nativeMax$1(length + index, 0);
21567   }
21568   return baseFindIndex(array, baseIteratee(predicate, 3), index);
21569 }
21570
21571 /**
21572  * Iterates over elements of `collection`, returning the first element
21573  * `predicate` returns truthy for. The predicate is invoked with three
21574  * arguments: (value, index|key, collection).
21575  *
21576  * @static
21577  * @memberOf _
21578  * @since 0.1.0
21579  * @category Collection
21580  * @param {Array|Object} collection The collection to inspect.
21581  * @param {Function} [predicate=_.identity] The function invoked per iteration.
21582  * @param {number} [fromIndex=0] The index to search from.
21583  * @returns {*} Returns the matched element, else `undefined`.
21584  * @example
21585  *
21586  * var users = [
21587  *   { 'user': 'barney',  'age': 36, 'active': true },
21588  *   { 'user': 'fred',    'age': 40, 'active': false },
21589  *   { 'user': 'pebbles', 'age': 1,  'active': true }
21590  * ];
21591  *
21592  * _.find(users, function(o) { return o.age < 40; });
21593  * // => object for 'barney'
21594  *
21595  * // The `_.matches` iteratee shorthand.
21596  * _.find(users, { 'age': 1, 'active': true });
21597  * // => object for 'pebbles'
21598  *
21599  * // The `_.matchesProperty` iteratee shorthand.
21600  * _.find(users, ['active', false]);
21601  * // => object for 'fred'
21602  *
21603  * // The `_.property` iteratee shorthand.
21604  * _.find(users, 'active');
21605  * // => object for 'barney'
21606  */
21607 var find$1 = createFind(findIndex);
21608
21609 /**
21610  * The base implementation of `_.map` without support for iteratee shorthands.
21611  *
21612  * @private
21613  * @param {Array|Object} collection The collection to iterate over.
21614  * @param {Function} iteratee The function invoked per iteration.
21615  * @returns {Array} Returns the new mapped array.
21616  */
21617 function baseMap(collection, iteratee) {
21618   var index = -1,
21619       result = isArrayLike(collection) ? Array(collection.length) : [];
21620
21621   baseEach(collection, function(value, key, collection) {
21622     result[++index] = iteratee(value, key, collection);
21623   });
21624   return result;
21625 }
21626
21627 /**
21628  * Creates an array of values by running each element in `collection` thru
21629  * `iteratee`. The iteratee is invoked with three arguments:
21630  * (value, index|key, collection).
21631  *
21632  * Many lodash methods are guarded to work as iteratees for methods like
21633  * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
21634  *
21635  * The guarded methods are:
21636  * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
21637  * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
21638  * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
21639  * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
21640  *
21641  * @static
21642  * @memberOf _
21643  * @since 0.1.0
21644  * @category Collection
21645  * @param {Array|Object} collection The collection to iterate over.
21646  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
21647  * @returns {Array} Returns the new mapped array.
21648  * @example
21649  *
21650  * function square(n) {
21651  *   return n * n;
21652  * }
21653  *
21654  * _.map([4, 8], square);
21655  * // => [16, 64]
21656  *
21657  * _.map({ 'a': 4, 'b': 8 }, square);
21658  * // => [16, 64] (iteration order is not guaranteed)
21659  *
21660  * var users = [
21661  *   { 'user': 'barney' },
21662  *   { 'user': 'fred' }
21663  * ];
21664  *
21665  * // The `_.property` iteratee shorthand.
21666  * _.map(users, 'user');
21667  * // => ['barney', 'fred']
21668  */
21669 function map$3(collection, iteratee) {
21670   var func = isArray(collection) ? arrayMap : baseMap;
21671   return func(collection, baseIteratee(iteratee, 3));
21672 }
21673
21674 /**
21675  * The base implementation of `_.values` and `_.valuesIn` which creates an
21676  * array of `object` property values corresponding to the property names
21677  * of `props`.
21678  *
21679  * @private
21680  * @param {Object} object The object to query.
21681  * @param {Array} props The property names to get values for.
21682  * @returns {Object} Returns the array of property values.
21683  */
21684 function baseValues(object, props) {
21685   return arrayMap(props, function(key) {
21686     return object[key];
21687   });
21688 }
21689
21690 /**
21691  * Creates an array of the own enumerable string keyed property values of `object`.
21692  *
21693  * **Note:** Non-object values are coerced to objects.
21694  *
21695  * @static
21696  * @since 0.1.0
21697  * @memberOf _
21698  * @category Object
21699  * @param {Object} object The object to query.
21700  * @returns {Array} Returns the array of property values.
21701  * @example
21702  *
21703  * function Foo() {
21704  *   this.a = 1;
21705  *   this.b = 2;
21706  * }
21707  *
21708  * Foo.prototype.c = 3;
21709  *
21710  * _.values(new Foo);
21711  * // => [1, 2] (iteration order is not guaranteed)
21712  *
21713  * _.values('hi');
21714  * // => ['h', 'i']
21715  */
21716 function values$1(object) {
21717   return object == null ? [] : baseValues(object, keys$1(object));
21718 }
21719
21720 /**
21721  * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
21722  * of key-value pairs for `object` corresponding to the property names of `props`.
21723  *
21724  * @private
21725  * @param {Object} object The object to query.
21726  * @param {Array} props The property names to get values for.
21727  * @returns {Object} Returns the key-value pairs.
21728  */
21729 function baseToPairs(object, props) {
21730   return arrayMap(props, function(key) {
21731     return [key, object[key]];
21732   });
21733 }
21734
21735 /**
21736  * Converts `set` to its value-value pairs.
21737  *
21738  * @private
21739  * @param {Object} set The set to convert.
21740  * @returns {Array} Returns the value-value pairs.
21741  */
21742 function setToPairs(set) {
21743   var index = -1,
21744       result = Array(set.size);
21745
21746   set.forEach(function(value) {
21747     result[++index] = [value, value];
21748   });
21749   return result;
21750 }
21751
21752 /** `Object#toString` result references. */
21753 var mapTag$6 = '[object Map]',
21754     setTag$6 = '[object Set]';
21755
21756 /**
21757  * Creates a `_.toPairs` or `_.toPairsIn` function.
21758  *
21759  * @private
21760  * @param {Function} keysFunc The function to get the keys of a given object.
21761  * @returns {Function} Returns the new pairs function.
21762  */
21763 function createToPairs(keysFunc) {
21764   return function(object) {
21765     var tag = getTag$1(object);
21766     if (tag == mapTag$6) {
21767       return mapToArray(object);
21768     }
21769     if (tag == setTag$6) {
21770       return setToPairs(object);
21771     }
21772     return baseToPairs(object, keysFunc(object));
21773   };
21774 }
21775
21776 /**
21777  * Creates an array of own enumerable string keyed-value pairs for `object`
21778  * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
21779  * entries are returned.
21780  *
21781  * @static
21782  * @memberOf _
21783  * @since 4.0.0
21784  * @alias entries
21785  * @category Object
21786  * @param {Object} object The object to query.
21787  * @returns {Array} Returns the key-value pairs.
21788  * @example
21789  *
21790  * function Foo() {
21791  *   this.a = 1;
21792  *   this.b = 2;
21793  * }
21794  *
21795  * Foo.prototype.c = 3;
21796  *
21797  * _.toPairs(new Foo);
21798  * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
21799  */
21800 var toPairs = createToPairs(keys$1);
21801
21802 /**
21803  * The base implementation of `_.isNaN` without support for number objects.
21804  *
21805  * @private
21806  * @param {*} value The value to check.
21807  * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
21808  */
21809 function baseIsNaN(value) {
21810   return value !== value;
21811 }
21812
21813 /**
21814  * A specialized version of `_.indexOf` which performs strict equality
21815  * comparisons of values, i.e. `===`.
21816  *
21817  * @private
21818  * @param {Array} array The array to inspect.
21819  * @param {*} value The value to search for.
21820  * @param {number} fromIndex The index to search from.
21821  * @returns {number} Returns the index of the matched value, else `-1`.
21822  */
21823 function strictIndexOf(array, value, fromIndex) {
21824   var index = fromIndex - 1,
21825       length = array.length;
21826
21827   while (++index < length) {
21828     if (array[index] === value) {
21829       return index;
21830     }
21831   }
21832   return -1;
21833 }
21834
21835 /**
21836  * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
21837  *
21838  * @private
21839  * @param {Array} array The array to inspect.
21840  * @param {*} value The value to search for.
21841  * @param {number} fromIndex The index to search from.
21842  * @returns {number} Returns the index of the matched value, else `-1`.
21843  */
21844 function baseIndexOf(array, value, fromIndex) {
21845   return value === value
21846     ? strictIndexOf(array, value, fromIndex)
21847     : baseFindIndex(array, baseIsNaN, fromIndex);
21848 }
21849
21850 /**
21851  * A specialized version of `_.includes` for arrays without support for
21852  * specifying an index to search from.
21853  *
21854  * @private
21855  * @param {Array} [array] The array to inspect.
21856  * @param {*} target The value to search for.
21857  * @returns {boolean} Returns `true` if `target` is found, else `false`.
21858  */
21859 function arrayIncludes(array, value) {
21860   var length = array == null ? 0 : array.length;
21861   return !!length && baseIndexOf(array, value, 0) > -1;
21862 }
21863
21864 /**
21865  * This function is like `arrayIncludes` except that it accepts a comparator.
21866  *
21867  * @private
21868  * @param {Array} [array] The array to inspect.
21869  * @param {*} target The value to search for.
21870  * @param {Function} comparator The comparator invoked per element.
21871  * @returns {boolean} Returns `true` if `target` is found, else `false`.
21872  */
21873 function arrayIncludesWith(array, value, comparator) {
21874   var index = -1,
21875       length = array == null ? 0 : array.length;
21876
21877   while (++index < length) {
21878     if (comparator(value, array[index])) {
21879       return true;
21880     }
21881   }
21882   return false;
21883 }
21884
21885 /**
21886  * This method returns `undefined`.
21887  *
21888  * @static
21889  * @memberOf _
21890  * @since 2.3.0
21891  * @category Util
21892  * @example
21893  *
21894  * _.times(2, _.noop);
21895  * // => [undefined, undefined]
21896  */
21897 function noop$3() {
21898   // No operation performed.
21899 }
21900
21901 /** Used as references for various `Number` constants. */
21902 var INFINITY$3 = 1 / 0;
21903
21904 /**
21905  * Creates a set object of `values`.
21906  *
21907  * @private
21908  * @param {Array} values The values to add to the set.
21909  * @returns {Object} Returns the new set.
21910  */
21911 var createSet = !(Set$1 && (1 / setToArray(new Set$1([,-0]))[1]) == INFINITY$3) ? noop$3 : function(values) {
21912   return new Set$1(values);
21913 };
21914
21915 /** Used as the size to enable large array optimizations. */
21916 var LARGE_ARRAY_SIZE$1 = 200;
21917
21918 /**
21919  * The base implementation of `_.uniqBy` without support for iteratee shorthands.
21920  *
21921  * @private
21922  * @param {Array} array The array to inspect.
21923  * @param {Function} [iteratee] The iteratee invoked per element.
21924  * @param {Function} [comparator] The comparator invoked per element.
21925  * @returns {Array} Returns the new duplicate free array.
21926  */
21927 function baseUniq(array, iteratee, comparator) {
21928   var index = -1,
21929       includes = arrayIncludes,
21930       length = array.length,
21931       isCommon = true,
21932       result = [],
21933       seen = result;
21934
21935   if (comparator) {
21936     isCommon = false;
21937     includes = arrayIncludesWith;
21938   }
21939   else if (length >= LARGE_ARRAY_SIZE$1) {
21940     var set = iteratee ? null : createSet(array);
21941     if (set) {
21942       return setToArray(set);
21943     }
21944     isCommon = false;
21945     includes = cacheHas;
21946     seen = new SetCache;
21947   }
21948   else {
21949     seen = iteratee ? [] : result;
21950   }
21951   outer:
21952   while (++index < length) {
21953     var value = array[index],
21954         computed = iteratee ? iteratee(value) : value;
21955
21956     value = (comparator || value !== 0) ? value : 0;
21957     if (isCommon && computed === computed) {
21958       var seenIndex = seen.length;
21959       while (seenIndex--) {
21960         if (seen[seenIndex] === computed) {
21961           continue outer;
21962         }
21963       }
21964       if (iteratee) {
21965         seen.push(computed);
21966       }
21967       result.push(value);
21968     }
21969     else if (!includes(seen, computed, comparator)) {
21970       if (seen !== result) {
21971         seen.push(computed);
21972       }
21973       result.push(value);
21974     }
21975   }
21976   return result;
21977 }
21978
21979 /**
21980  * This method is like `_.isArrayLike` except that it also checks if `value`
21981  * is an object.
21982  *
21983  * @static
21984  * @memberOf _
21985  * @since 4.0.0
21986  * @category Lang
21987  * @param {*} value The value to check.
21988  * @returns {boolean} Returns `true` if `value` is an array-like object,
21989  *  else `false`.
21990  * @example
21991  *
21992  * _.isArrayLikeObject([1, 2, 3]);
21993  * // => true
21994  *
21995  * _.isArrayLikeObject(document.body.children);
21996  * // => true
21997  *
21998  * _.isArrayLikeObject('abc');
21999  * // => false
22000  *
22001  * _.isArrayLikeObject(_.noop);
22002  * // => false
22003  */
22004 function isArrayLikeObject(value) {
22005   return isObjectLike(value) && isArrayLike(value);
22006 }
22007
22008 /**
22009  * Creates an array of unique values, in order, from all given arrays using
22010  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22011  * for equality comparisons.
22012  *
22013  * @static
22014  * @memberOf _
22015  * @since 0.1.0
22016  * @category Array
22017  * @param {...Array} [arrays] The arrays to inspect.
22018  * @returns {Array} Returns the new array of combined values.
22019  * @example
22020  *
22021  * _.union([2], [1, 2]);
22022  * // => [2, 1]
22023  */
22024 var union = baseRest(function(arrays) {
22025   return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
22026 });
22027
22028 /** Used as the size to enable large array optimizations. */
22029 var LARGE_ARRAY_SIZE$2 = 200;
22030
22031 /**
22032  * The base implementation of methods like `_.difference` without support
22033  * for excluding multiple arrays or iteratee shorthands.
22034  *
22035  * @private
22036  * @param {Array} array The array to inspect.
22037  * @param {Array} values The values to exclude.
22038  * @param {Function} [iteratee] The iteratee invoked per element.
22039  * @param {Function} [comparator] The comparator invoked per element.
22040  * @returns {Array} Returns the new array of filtered values.
22041  */
22042 function baseDifference(array, values, iteratee, comparator) {
22043   var index = -1,
22044       includes = arrayIncludes,
22045       isCommon = true,
22046       length = array.length,
22047       result = [],
22048       valuesLength = values.length;
22049
22050   if (!length) {
22051     return result;
22052   }
22053   if (iteratee) {
22054     values = arrayMap(values, baseUnary(iteratee));
22055   }
22056   if (comparator) {
22057     includes = arrayIncludesWith;
22058     isCommon = false;
22059   }
22060   else if (values.length >= LARGE_ARRAY_SIZE$2) {
22061     includes = cacheHas;
22062     isCommon = false;
22063     values = new SetCache(values);
22064   }
22065   outer:
22066   while (++index < length) {
22067     var value = array[index],
22068         computed = iteratee == null ? value : iteratee(value);
22069
22070     value = (comparator || value !== 0) ? value : 0;
22071     if (isCommon && computed === computed) {
22072       var valuesIndex = valuesLength;
22073       while (valuesIndex--) {
22074         if (values[valuesIndex] === computed) {
22075           continue outer;
22076         }
22077       }
22078       result.push(value);
22079     }
22080     else if (!includes(values, computed, comparator)) {
22081       result.push(value);
22082     }
22083   }
22084   return result;
22085 }
22086
22087 /**
22088  * Creates an array excluding all given values using
22089  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22090  * for equality comparisons.
22091  *
22092  * **Note:** Unlike `_.pull`, this method returns a new array.
22093  *
22094  * @static
22095  * @memberOf _
22096  * @since 0.1.0
22097  * @category Array
22098  * @param {Array} array The array to inspect.
22099  * @param {...*} [values] The values to exclude.
22100  * @returns {Array} Returns the new array of filtered values.
22101  * @see _.difference, _.xor
22102  * @example
22103  *
22104  * _.without([2, 1, 2, 3], 1, 2);
22105  * // => [3]
22106  */
22107 var without = baseRest(function(array, values) {
22108   return isArrayLikeObject(array)
22109     ? baseDifference(array, values)
22110     : [];
22111 });
22112
22113 function osmIsInterestingTag(key) {
22114     return key !== 'attribution' &&
22115         key !== 'created_by' &&
22116         key !== 'source' &&
22117         key !== 'odbl' &&
22118         key.indexOf('tiger:') !== 0;
22119
22120 }
22121
22122
22123 var osmOneWayTags = {
22124     'aerialway': {
22125         'chair_lift': true,
22126         'mixed_lift': true,
22127         't-bar': true,
22128         'j-bar': true,
22129         'platter': true,
22130         'rope_tow': true,
22131         'magic_carpet': true,
22132         'yes': true
22133     },
22134     'highway': {
22135         'motorway': true
22136     },
22137     'junction': {
22138         'circular': true,
22139         'roundabout': true
22140     },
22141     'man_made': {
22142         'piste:halfpipe': true
22143     },
22144     'piste:type': {
22145         'downhill': true,
22146         'sled': true,
22147         'yes': true
22148     },
22149     'waterway': {
22150         'canal': true,
22151         'ditch': true,
22152         'drain': true,
22153         'river': true,
22154         'stream': true
22155     }
22156 };
22157
22158
22159 var osmPavedTags = {
22160     'surface': {
22161         'paved': true,
22162         'asphalt': true,
22163         'concrete': true,
22164         'concrete:lanes': true,
22165         'concrete:plates': true
22166     },
22167     'tracktype': {
22168         'grade1': true
22169     }
22170 };
22171
22172 var wikipedia = [
22173     [
22174         "Abkhazian",
22175         "Аҧсшәа",
22176         "ab"
22177     ],
22178     [
22179         "Achinese",
22180         "Acèh",
22181         "ace"
22182     ],
22183     [
22184         "Adyghe",
22185         "адыгабзэ",
22186         "ady"
22187     ],
22188     [
22189         "Afrikaans",
22190         "Afrikaans",
22191         "af"
22192     ],
22193     [
22194         "Akan",
22195         "Akan",
22196         "ak"
22197     ],
22198     [
22199         "Alemannisch",
22200         "Alemannisch",
22201         "als"
22202     ],
22203     [
22204         "Amharic",
22205         "አማርኛ",
22206         "am"
22207     ],
22208     [
22209         "Aragonese",
22210         "aragonés",
22211         "an"
22212     ],
22213     [
22214         "Old English",
22215         "Ænglisc",
22216         "ang"
22217     ],
22218     [
22219         "Arabic",
22220         "العربية",
22221         "ar"
22222     ],
22223     [
22224         "Aramaic",
22225         "ܐܪܡܝܐ",
22226         "arc"
22227     ],
22228     [
22229         "Egyptian Arabic",
22230         "مصرى",
22231         "arz"
22232     ],
22233     [
22234         "Assamese",
22235         "অসমীয়া",
22236         "as"
22237     ],
22238     [
22239         "Asturian",
22240         "asturianu",
22241         "ast"
22242     ],
22243     [
22244         "Avaric",
22245         "авар",
22246         "av"
22247     ],
22248     [
22249         "Aymara",
22250         "Aymar aru",
22251         "ay"
22252     ],
22253     [
22254         "Azerbaijani",
22255         "azərbaycanca",
22256         "az"
22257     ],
22258     [
22259         "تۆرکجه",
22260         "تۆرکجه",
22261         "azb"
22262     ],
22263     [
22264         "Bashkir",
22265         "башҡортса",
22266         "ba"
22267     ],
22268     [
22269         "Bavarian",
22270         "Boarisch",
22271         "bar"
22272     ],
22273     [
22274         "Samogitian",
22275         "žemaitėška",
22276         "bat-smg"
22277     ],
22278     [
22279         "Bikol Central",
22280         "Bikol Central",
22281         "bcl"
22282     ],
22283     [
22284         "Belarusian",
22285         "беларуская",
22286         "be"
22287     ],
22288     [
22289         "беларуская (тарашкевіца)‎",
22290         "беларуская (тарашкевіца)‎",
22291         "be-x-old"
22292     ],
22293     [
22294         "Bulgarian",
22295         "български",
22296         "bg"
22297     ],
22298     [
22299         "भोजपुरी",
22300         "भोजपुरी",
22301         "bh"
22302     ],
22303     [
22304         "Bislama",
22305         "Bislama",
22306         "bi"
22307     ],
22308     [
22309         "Banjar",
22310         "Bahasa Banjar",
22311         "bjn"
22312     ],
22313     [
22314         "Bambara",
22315         "bamanankan",
22316         "bm"
22317     ],
22318     [
22319         "Bangla",
22320         "বাংলা",
22321         "bn"
22322     ],
22323     [
22324         "Tibetan",
22325         "བོད་ཡིག",
22326         "bo"
22327     ],
22328     [
22329         "Bishnupriya",
22330         "বিষ্ণুপ্রিয়া মণিপুরী",
22331         "bpy"
22332     ],
22333     [
22334         "Breton",
22335         "brezhoneg",
22336         "br"
22337     ],
22338     [
22339         "Bosnian",
22340         "bosanski",
22341         "bs"
22342     ],
22343     [
22344         "Buginese",
22345         "ᨅᨔ ᨕᨘᨁᨗ",
22346         "bug"
22347     ],
22348     [
22349         "буряад",
22350         "буряад",
22351         "bxr"
22352     ],
22353     [
22354         "Catalan",
22355         "català",
22356         "ca"
22357     ],
22358     [
22359         "Chavacano de Zamboanga",
22360         "Chavacano de Zamboanga",
22361         "cbk-zam"
22362     ],
22363     [
22364         "Min Dong Chinese",
22365         "Mìng-dĕ̤ng-ngṳ̄",
22366         "cdo"
22367     ],
22368     [
22369         "Chechen",
22370         "нохчийн",
22371         "ce"
22372     ],
22373     [
22374         "Cebuano",
22375         "Cebuano",
22376         "ceb"
22377     ],
22378     [
22379         "Chamorro",
22380         "Chamoru",
22381         "ch"
22382     ],
22383     [
22384         "Cherokee",
22385         "ᏣᎳᎩ",
22386         "chr"
22387     ],
22388     [
22389         "Cheyenne",
22390         "Tsetsêhestâhese",
22391         "chy"
22392     ],
22393     [
22394         "Central Kurdish",
22395         "کوردیی ناوەندی",
22396         "ckb"
22397     ],
22398     [
22399         "Corsican",
22400         "corsu",
22401         "co"
22402     ],
22403     [
22404         "Cree",
22405         "Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ",
22406         "cr"
22407     ],
22408     [
22409         "Crimean Turkish",
22410         "qırımtatarca",
22411         "crh"
22412     ],
22413     [
22414         "Czech",
22415         "čeština",
22416         "cs"
22417     ],
22418     [
22419         "Kashubian",
22420         "kaszëbsczi",
22421         "csb"
22422     ],
22423     [
22424         "Church Slavic",
22425         "словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ",
22426         "cu"
22427     ],
22428     [
22429         "Chuvash",
22430         "Чӑвашла",
22431         "cv"
22432     ],
22433     [
22434         "Welsh",
22435         "Cymraeg",
22436         "cy"
22437     ],
22438     [
22439         "Danish",
22440         "dansk",
22441         "da"
22442     ],
22443     [
22444         "German",
22445         "Deutsch",
22446         "de"
22447     ],
22448     [
22449         "Zazaki",
22450         "Zazaki",
22451         "diq"
22452     ],
22453     [
22454         "Lower Sorbian",
22455         "dolnoserbski",
22456         "dsb"
22457     ],
22458     [
22459         "Divehi",
22460         "ދިވެހިބަސް",
22461         "dv"
22462     ],
22463     [
22464         "Dzongkha",
22465         "ཇོང་ཁ",
22466         "dz"
22467     ],
22468     [
22469         "Ewe",
22470         "eʋegbe",
22471         "ee"
22472     ],
22473     [
22474         "Greek",
22475         "Ελληνικά",
22476         "el"
22477     ],
22478     [
22479         "Emiliano-Romagnolo",
22480         "emiliàn e rumagnòl",
22481         "eml"
22482     ],
22483     [
22484         "English",
22485         "English",
22486         "en"
22487     ],
22488     [
22489         "Esperanto",
22490         "Esperanto",
22491         "eo"
22492     ],
22493     [
22494         "Spanish",
22495         "español",
22496         "es"
22497     ],
22498     [
22499         "Estonian",
22500         "eesti",
22501         "et"
22502     ],
22503     [
22504         "Basque",
22505         "euskara",
22506         "eu"
22507     ],
22508     [
22509         "Extremaduran",
22510         "estremeñu",
22511         "ext"
22512     ],
22513     [
22514         "Persian",
22515         "فارسی",
22516         "fa"
22517     ],
22518     [
22519         "Fulah",
22520         "Fulfulde",
22521         "ff"
22522     ],
22523     [
22524         "Finnish",
22525         "suomi",
22526         "fi"
22527     ],
22528     [
22529         "Võro",
22530         "Võro",
22531         "fiu-vro"
22532     ],
22533     [
22534         "Fijian",
22535         "Na Vosa Vakaviti",
22536         "fj"
22537     ],
22538     [
22539         "Faroese",
22540         "føroyskt",
22541         "fo"
22542     ],
22543     [
22544         "French",
22545         "français",
22546         "fr"
22547     ],
22548     [
22549         "Arpitan",
22550         "arpetan",
22551         "frp"
22552     ],
22553     [
22554         "Northern Frisian",
22555         "Nordfriisk",
22556         "frr"
22557     ],
22558     [
22559         "Friulian",
22560         "furlan",
22561         "fur"
22562     ],
22563     [
22564         "Western Frisian",
22565         "Frysk",
22566         "fy"
22567     ],
22568     [
22569         "Irish",
22570         "Gaeilge",
22571         "ga"
22572     ],
22573     [
22574         "Gagauz",
22575         "Gagauz",
22576         "gag"
22577     ],
22578     [
22579         "Gan Chinese",
22580         "贛語",
22581         "gan"
22582     ],
22583     [
22584         "Scottish Gaelic",
22585         "Gàidhlig",
22586         "gd"
22587     ],
22588     [
22589         "Galician",
22590         "galego",
22591         "gl"
22592     ],
22593     [
22594         "Gilaki",
22595         "گیلکی",
22596         "glk"
22597     ],
22598     [
22599         "Guarani",
22600         "Avañe'ẽ",
22601         "gn"
22602     ],
22603     [
22604         "Goan Konkani",
22605         "गोंयची कोंकणी / Gõychi Konknni",
22606         "gom"
22607     ],
22608     [
22609         "Gothic",
22610         "𐌲𐌿𐍄𐌹𐍃𐌺",
22611         "got"
22612     ],
22613     [
22614         "Gujarati",
22615         "ગુજરાતી",
22616         "gu"
22617     ],
22618     [
22619         "Manx",
22620         "Gaelg",
22621         "gv"
22622     ],
22623     [
22624         "Hausa",
22625         "Hausa",
22626         "ha"
22627     ],
22628     [
22629         "Hakka Chinese",
22630         "客家語/Hak-kâ-ngî",
22631         "hak"
22632     ],
22633     [
22634         "Hawaiian",
22635         "Hawaiʻi",
22636         "haw"
22637     ],
22638     [
22639         "Hebrew",
22640         "עברית",
22641         "he"
22642     ],
22643     [
22644         "Hindi",
22645         "हिन्दी",
22646         "hi"
22647     ],
22648     [
22649         "Fiji Hindi",
22650         "Fiji Hindi",
22651         "hif"
22652     ],
22653     [
22654         "Croatian",
22655         "hrvatski",
22656         "hr"
22657     ],
22658     [
22659         "Upper Sorbian",
22660         "hornjoserbsce",
22661         "hsb"
22662     ],
22663     [
22664         "Haitian Creole",
22665         "Kreyòl ayisyen",
22666         "ht"
22667     ],
22668     [
22669         "Hungarian",
22670         "magyar",
22671         "hu"
22672     ],
22673     [
22674         "Armenian",
22675         "Հայերեն",
22676         "hy"
22677     ],
22678     [
22679         "Interlingua",
22680         "interlingua",
22681         "ia"
22682     ],
22683     [
22684         "Indonesian",
22685         "Bahasa Indonesia",
22686         "id"
22687     ],
22688     [
22689         "Interlingue",
22690         "Interlingue",
22691         "ie"
22692     ],
22693     [
22694         "Igbo",
22695         "Igbo",
22696         "ig"
22697     ],
22698     [
22699         "Inupiaq",
22700         "Iñupiak",
22701         "ik"
22702     ],
22703     [
22704         "Iloko",
22705         "Ilokano",
22706         "ilo"
22707     ],
22708     [
22709         "Ido",
22710         "Ido",
22711         "io"
22712     ],
22713     [
22714         "Icelandic",
22715         "íslenska",
22716         "is"
22717     ],
22718     [
22719         "Italian",
22720         "italiano",
22721         "it"
22722     ],
22723     [
22724         "Inuktitut",
22725         "ᐃᓄᒃᑎᑐᑦ/inuktitut",
22726         "iu"
22727     ],
22728     [
22729         "Japanese",
22730         "日本語",
22731         "ja"
22732     ],
22733     [
22734         "Jamaican Creole English",
22735         "Patois",
22736         "jam"
22737     ],
22738     [
22739         "Lojban",
22740         "la .lojban.",
22741         "jbo"
22742     ],
22743     [
22744         "Javanese",
22745         "Basa Jawa",
22746         "jv"
22747     ],
22748     [
22749         "Georgian",
22750         "ქართული",
22751         "ka"
22752     ],
22753     [
22754         "Kara-Kalpak",
22755         "Qaraqalpaqsha",
22756         "kaa"
22757     ],
22758     [
22759         "Kabyle",
22760         "Taqbaylit",
22761         "kab"
22762     ],
22763     [
22764         "Kabardian",
22765         "Адыгэбзэ",
22766         "kbd"
22767     ],
22768     [
22769         "Kongo",
22770         "Kongo",
22771         "kg"
22772     ],
22773     [
22774         "Kikuyu",
22775         "Gĩkũyũ",
22776         "ki"
22777     ],
22778     [
22779         "Kazakh",
22780         "қазақша",
22781         "kk"
22782     ],
22783     [
22784         "Kalaallisut",
22785         "kalaallisut",
22786         "kl"
22787     ],
22788     [
22789         "Khmer",
22790         "ភាសាខ្មែរ",
22791         "km"
22792     ],
22793     [
22794         "Kannada",
22795         "ಕನ್ನಡ",
22796         "kn"
22797     ],
22798     [
22799         "Korean",
22800         "한국어",
22801         "ko"
22802     ],
22803     [
22804         "Komi-Permyak",
22805         "Перем Коми",
22806         "koi"
22807     ],
22808     [
22809         "Karachay-Balkar",
22810         "къарачай-малкъар",
22811         "krc"
22812     ],
22813     [
22814         "Kashmiri",
22815         "कॉशुर / کٲشُر",
22816         "ks"
22817     ],
22818     [
22819         "Colognian",
22820         "Ripoarisch",
22821         "ksh"
22822     ],
22823     [
22824         "Kurdish",
22825         "Kurdî",
22826         "ku"
22827     ],
22828     [
22829         "Komi",
22830         "коми",
22831         "kv"
22832     ],
22833     [
22834         "Cornish",
22835         "kernowek",
22836         "kw"
22837     ],
22838     [
22839         "Kyrgyz",
22840         "Кыргызча",
22841         "ky"
22842     ],
22843     [
22844         "Latin",
22845         "Latina",
22846         "la"
22847     ],
22848     [
22849         "Ladino",
22850         "Ladino",
22851         "lad"
22852     ],
22853     [
22854         "Luxembourgish",
22855         "Lëtzebuergesch",
22856         "lb"
22857     ],
22858     [
22859         "лакку",
22860         "лакку",
22861         "lbe"
22862     ],
22863     [
22864         "Lezghian",
22865         "лезги",
22866         "lez"
22867     ],
22868     [
22869         "Ganda",
22870         "Luganda",
22871         "lg"
22872     ],
22873     [
22874         "Limburgish",
22875         "Limburgs",
22876         "li"
22877     ],
22878     [
22879         "Ligurian",
22880         "Ligure",
22881         "lij"
22882     ],
22883     [
22884         "Lombard",
22885         "lumbaart",
22886         "lmo"
22887     ],
22888     [
22889         "Lingala",
22890         "lingála",
22891         "ln"
22892     ],
22893     [
22894         "Lao",
22895         "ລາວ",
22896         "lo"
22897     ],
22898     [
22899         "Northern Luri",
22900         "لۊری شومالی",
22901         "lrc"
22902     ],
22903     [
22904         "Lithuanian",
22905         "lietuvių",
22906         "lt"
22907     ],
22908     [
22909         "Latgalian",
22910         "latgaļu",
22911         "ltg"
22912     ],
22913     [
22914         "Latvian",
22915         "latviešu",
22916         "lv"
22917     ],
22918     [
22919         "Maithili",
22920         "मैथिली",
22921         "mai"
22922     ],
22923     [
22924         "Basa Banyumasan",
22925         "Basa Banyumasan",
22926         "map-bms"
22927     ],
22928     [
22929         "Moksha",
22930         "мокшень",
22931         "mdf"
22932     ],
22933     [
22934         "Malagasy",
22935         "Malagasy",
22936         "mg"
22937     ],
22938     [
22939         "Eastern Mari",
22940         "олык марий",
22941         "mhr"
22942     ],
22943     [
22944         "Maori",
22945         "Māori",
22946         "mi"
22947     ],
22948     [
22949         "Minangkabau",
22950         "Baso Minangkabau",
22951         "min"
22952     ],
22953     [
22954         "Macedonian",
22955         "македонски",
22956         "mk"
22957     ],
22958     [
22959         "Malayalam",
22960         "മലയാളം",
22961         "ml"
22962     ],
22963     [
22964         "Mongolian",
22965         "монгол",
22966         "mn"
22967     ],
22968     [
22969         "Marathi",
22970         "मराठी",
22971         "mr"
22972     ],
22973     [
22974         "Western Mari",
22975         "кырык мары",
22976         "mrj"
22977     ],
22978     [
22979         "Malay",
22980         "Bahasa Melayu",
22981         "ms"
22982     ],
22983     [
22984         "Maltese",
22985         "Malti",
22986         "mt"
22987     ],
22988     [
22989         "Mirandese",
22990         "Mirandés",
22991         "mwl"
22992     ],
22993     [
22994         "Burmese",
22995         "မြန်မာဘာသာ",
22996         "my"
22997     ],
22998     [
22999         "Erzya",
23000         "эрзянь",
23001         "myv"
23002     ],
23003     [
23004         "Mazanderani",
23005         "مازِرونی",
23006         "mzn"
23007     ],
23008     [
23009         "Nauru",
23010         "Dorerin Naoero",
23011         "na"
23012     ],
23013     [
23014         "Nāhuatl",
23015         "Nāhuatl",
23016         "nah"
23017     ],
23018     [
23019         "Neapolitan",
23020         "Napulitano",
23021         "nap"
23022     ],
23023     [
23024         "Low German",
23025         "Plattdüütsch",
23026         "nds"
23027     ],
23028     [
23029         "Low Saxon",
23030         "Nedersaksies",
23031         "nds-nl"
23032     ],
23033     [
23034         "Nepali",
23035         "नेपाली",
23036         "ne"
23037     ],
23038     [
23039         "Newari",
23040         "नेपाल भाषा",
23041         "new"
23042     ],
23043     [
23044         "Dutch",
23045         "Nederlands",
23046         "nl"
23047     ],
23048     [
23049         "Norwegian Nynorsk",
23050         "norsk nynorsk",
23051         "nn"
23052     ],
23053     [
23054         "Norwegian",
23055         "norsk bokmål",
23056         "no"
23057     ],
23058     [
23059         "Novial",
23060         "Novial",
23061         "nov"
23062     ],
23063     [
23064         "Nouormand",
23065         "Nouormand",
23066         "nrm"
23067     ],
23068     [
23069         "Northern Sotho",
23070         "Sesotho sa Leboa",
23071         "nso"
23072     ],
23073     [
23074         "Navajo",
23075         "Diné bizaad",
23076         "nv"
23077     ],
23078     [
23079         "Nyanja",
23080         "Chi-Chewa",
23081         "ny"
23082     ],
23083     [
23084         "Occitan",
23085         "occitan",
23086         "oc"
23087     ],
23088     [
23089         "Livvi-Karelian",
23090         "Livvinkarjala",
23091         "olo"
23092     ],
23093     [
23094         "Oromo",
23095         "Oromoo",
23096         "om"
23097     ],
23098     [
23099         "Odia",
23100         "ଓଡ଼ିଆ",
23101         "or"
23102     ],
23103     [
23104         "Ossetic",
23105         "Ирон",
23106         "os"
23107     ],
23108     [
23109         "Punjabi",
23110         "ਪੰਜਾਬੀ",
23111         "pa"
23112     ],
23113     [
23114         "Pangasinan",
23115         "Pangasinan",
23116         "pag"
23117     ],
23118     [
23119         "Pampanga",
23120         "Kapampangan",
23121         "pam"
23122     ],
23123     [
23124         "Papiamento",
23125         "Papiamentu",
23126         "pap"
23127     ],
23128     [
23129         "Picard",
23130         "Picard",
23131         "pcd"
23132     ],
23133     [
23134         "Pennsylvania German",
23135         "Deitsch",
23136         "pdc"
23137     ],
23138     [
23139         "Palatine German",
23140         "Pälzisch",
23141         "pfl"
23142     ],
23143     [
23144         "Pali",
23145         "पालि",
23146         "pi"
23147     ],
23148     [
23149         "Norfuk / Pitkern",
23150         "Norfuk / Pitkern",
23151         "pih"
23152     ],
23153     [
23154         "Polish",
23155         "polski",
23156         "pl"
23157     ],
23158     [
23159         "Piedmontese",
23160         "Piemontèis",
23161         "pms"
23162     ],
23163     [
23164         "Western Punjabi",
23165         "پنجابی",
23166         "pnb"
23167     ],
23168     [
23169         "Pontic",
23170         "Ποντιακά",
23171         "pnt"
23172     ],
23173     [
23174         "Pashto",
23175         "پښتو",
23176         "ps"
23177     ],
23178     [
23179         "Portuguese",
23180         "português",
23181         "pt"
23182     ],
23183     [
23184         "Quechua",
23185         "Runa Simi",
23186         "qu"
23187     ],
23188     [
23189         "Romansh",
23190         "rumantsch",
23191         "rm"
23192     ],
23193     [
23194         "Romani",
23195         "Romani",
23196         "rmy"
23197     ],
23198     [
23199         "Rundi",
23200         "Kirundi",
23201         "rn"
23202     ],
23203     [
23204         "Romanian",
23205         "română",
23206         "ro"
23207     ],
23208     [
23209         "Aromanian",
23210         "armãneashti",
23211         "roa-rup"
23212     ],
23213     [
23214         "tarandíne",
23215         "tarandíne",
23216         "roa-tara"
23217     ],
23218     [
23219         "Russian",
23220         "русский",
23221         "ru"
23222     ],
23223     [
23224         "Rusyn",
23225         "русиньскый",
23226         "rue"
23227     ],
23228     [
23229         "Kinyarwanda",
23230         "Kinyarwanda",
23231         "rw"
23232     ],
23233     [
23234         "Sanskrit",
23235         "संस्कृतम्",
23236         "sa"
23237     ],
23238     [
23239         "Sakha",
23240         "саха тыла",
23241         "sah"
23242     ],
23243     [
23244         "Sardinian",
23245         "sardu",
23246         "sc"
23247     ],
23248     [
23249         "Sicilian",
23250         "sicilianu",
23251         "scn"
23252     ],
23253     [
23254         "Scots",
23255         "Scots",
23256         "sco"
23257     ],
23258     [
23259         "Sindhi",
23260         "سنڌي",
23261         "sd"
23262     ],
23263     [
23264         "Northern Sami",
23265         "sámegiella",
23266         "se"
23267     ],
23268     [
23269         "Sango",
23270         "Sängö",
23271         "sg"
23272     ],
23273     [
23274         "Serbo-Croatian",
23275         "srpskohrvatski / српскохрватски",
23276         "sh"
23277     ],
23278     [
23279         "Sinhala",
23280         "සිංහල",
23281         "si"
23282     ],
23283     [
23284         "Simple English",
23285         "Simple English",
23286         "simple"
23287     ],
23288     [
23289         "Slovak",
23290         "slovenčina",
23291         "sk"
23292     ],
23293     [
23294         "Slovenian",
23295         "slovenščina",
23296         "sl"
23297     ],
23298     [
23299         "Samoan",
23300         "Gagana Samoa",
23301         "sm"
23302     ],
23303     [
23304         "Shona",
23305         "chiShona",
23306         "sn"
23307     ],
23308     [
23309         "Somali",
23310         "Soomaaliga",
23311         "so"
23312     ],
23313     [
23314         "Albanian",
23315         "shqip",
23316         "sq"
23317     ],
23318     [
23319         "Serbian",
23320         "српски / srpski",
23321         "sr"
23322     ],
23323     [
23324         "Sranan Tongo",
23325         "Sranantongo",
23326         "srn"
23327     ],
23328     [
23329         "Swati",
23330         "SiSwati",
23331         "ss"
23332     ],
23333     [
23334         "Southern Sotho",
23335         "Sesotho",
23336         "st"
23337     ],
23338     [
23339         "Saterland Frisian",
23340         "Seeltersk",
23341         "stq"
23342     ],
23343     [
23344         "Sundanese",
23345         "Basa Sunda",
23346         "su"
23347     ],
23348     [
23349         "Swedish",
23350         "svenska",
23351         "sv"
23352     ],
23353     [
23354         "Swahili",
23355         "Kiswahili",
23356         "sw"
23357     ],
23358     [
23359         "Silesian",
23360         "ślůnski",
23361         "szl"
23362     ],
23363     [
23364         "Tamil",
23365         "தமிழ்",
23366         "ta"
23367     ],
23368     [
23369         "Tulu",
23370         "ತುಳು",
23371         "tcy"
23372     ],
23373     [
23374         "Telugu",
23375         "తెలుగు",
23376         "te"
23377     ],
23378     [
23379         "Tetum",
23380         "tetun",
23381         "tet"
23382     ],
23383     [
23384         "Tajik",
23385         "тоҷикӣ",
23386         "tg"
23387     ],
23388     [
23389         "Thai",
23390         "ไทย",
23391         "th"
23392     ],
23393     [
23394         "Tigrinya",
23395         "ትግርኛ",
23396         "ti"
23397     ],
23398     [
23399         "Turkmen",
23400         "Türkmençe",
23401         "tk"
23402     ],
23403     [
23404         "Tagalog",
23405         "Tagalog",
23406         "tl"
23407     ],
23408     [
23409         "Tswana",
23410         "Setswana",
23411         "tn"
23412     ],
23413     [
23414         "Tongan",
23415         "lea faka-Tonga",
23416         "to"
23417     ],
23418     [
23419         "Tok Pisin",
23420         "Tok Pisin",
23421         "tpi"
23422     ],
23423     [
23424         "Turkish",
23425         "Türkçe",
23426         "tr"
23427     ],
23428     [
23429         "Tsonga",
23430         "Xitsonga",
23431         "ts"
23432     ],
23433     [
23434         "Tatar",
23435         "татарча/tatarça",
23436         "tt"
23437     ],
23438     [
23439         "Tumbuka",
23440         "chiTumbuka",
23441         "tum"
23442     ],
23443     [
23444         "Twi",
23445         "Twi",
23446         "tw"
23447     ],
23448     [
23449         "Tahitian",
23450         "reo tahiti",
23451         "ty"
23452     ],
23453     [
23454         "Tuvinian",
23455         "тыва дыл",
23456         "tyv"
23457     ],
23458     [
23459         "Udmurt",
23460         "удмурт",
23461         "udm"
23462     ],
23463     [
23464         "Uyghur",
23465         "ئۇيغۇرچە / Uyghurche",
23466         "ug"
23467     ],
23468     [
23469         "Ukrainian",
23470         "українська",
23471         "uk"
23472     ],
23473     [
23474         "Urdu",
23475         "اردو",
23476         "ur"
23477     ],
23478     [
23479         "Uzbek",
23480         "oʻzbekcha/ўзбекча",
23481         "uz"
23482     ],
23483     [
23484         "Venda",
23485         "Tshivenda",
23486         "ve"
23487     ],
23488     [
23489         "Venetian",
23490         "vèneto",
23491         "vec"
23492     ],
23493     [
23494         "Veps",
23495         "vepsän kel’",
23496         "vep"
23497     ],
23498     [
23499         "Vietnamese",
23500         "Tiếng Việt",
23501         "vi"
23502     ],
23503     [
23504         "West Flemish",
23505         "West-Vlams",
23506         "vls"
23507     ],
23508     [
23509         "Volapük",
23510         "Volapük",
23511         "vo"
23512     ],
23513     [
23514         "Walloon",
23515         "walon",
23516         "wa"
23517     ],
23518     [
23519         "Waray",
23520         "Winaray",
23521         "war"
23522     ],
23523     [
23524         "Wolof",
23525         "Wolof",
23526         "wo"
23527     ],
23528     [
23529         "Wu Chinese",
23530         "吴语",
23531         "wuu"
23532     ],
23533     [
23534         "Kalmyk",
23535         "хальмг",
23536         "xal"
23537     ],
23538     [
23539         "Xhosa",
23540         "isiXhosa",
23541         "xh"
23542     ],
23543     [
23544         "Mingrelian",
23545         "მარგალური",
23546         "xmf"
23547     ],
23548     [
23549         "Yiddish",
23550         "ייִדיש",
23551         "yi"
23552     ],
23553     [
23554         "Yoruba",
23555         "Yorùbá",
23556         "yo"
23557     ],
23558     [
23559         "Zhuang",
23560         "Vahcuengh",
23561         "za"
23562     ],
23563     [
23564         "Zeelandic",
23565         "Zeêuws",
23566         "zea"
23567     ],
23568     [
23569         "Chinese",
23570         "中文",
23571         "zh"
23572     ],
23573     [
23574         "Classical Chinese",
23575         "文言",
23576         "zh-classical"
23577     ],
23578     [
23579         "Chinese (Min Nan)",
23580         "Bân-lâm-gú",
23581         "zh-min-nan"
23582     ],
23583     [
23584         "Cantonese",
23585         "粵語",
23586         "zh-yue"
23587     ],
23588     [
23589         "Zulu",
23590         "isiZulu",
23591         "zu"
23592     ]
23593 ];
23594
23595 var wikipedia$1 = Object.freeze({
23596         default: wikipedia
23597 });
23598
23599 var require$$6 = ( wikipedia$1 && wikipedia ) || wikipedia$1;
23600
23601 var wikipedia$2 = require$$6;
23602
23603 var amenity = {"arts_centre":{"Świetlica wiejska":{"count":62},"Дом культуры":{"count":182}},"bank":{"ABANCA":{"count":83},"ABN AMRO":{"count":152},"ABSA":{"count":105},"AIB":{"count":85},"ANZ":{"count":378},"ASB Bank":{"count":51},"ATB Financial":{"count":68},"AXA":{"count":106},"Agribank":{"count":58},"Akbank":{"count":129},"Alior Bank":{"count":180},"Allahabad Bank":{"count":52},"Allied Bank":{"count":67},"Alpha Bank":{"count":329},"Andhra Bank":{"count":97},"Antonveneta":{"count":56},"Argenta":{"count":125},"Asia United Bank":{"count":57},"Askari Bank":{"count":71},"Associated Bank":{"count":55},"Axis Bank":{"count":198},"BAC":{"count":77},"BAWAG PSK":{"count":97},"BB&T":{"count":418},"BBBank":{"count":58},"BBK":{"count":122},"BBVA":{"count":1445},"BBVA Bancomer":{"count":157},"BBVA Compass":{"count":80},"BBVA Continental":{"count":74},"BBVA Francés":{"count":158},"BCA":{"count":135},"BCI":{"count":140},"BCP":{"count":226},"BCR":{"count":232},"BDO":{"count":538},"BGŻ BNP Paribas":{"count":74},"BMCE":{"count":53},"BMN":{"count":88},"BMO":{"count":339},"BMO Harris Bank":{"count":72},"BNA":{"count":70},"BNI":{"count":136},"BNL":{"count":159},"BNP Paribas":{"count":1165},"BNP Paribas Fortis":{"count":303},"BOC":{"count":95},"BPH":{"count":63},"BPI":{"count":579},"BPI Family Savings Bank":{"count":54},"BRD":{"count":276},"BRED":{"count":70},"BRI":{"count":209},"BW-Bank":{"count":95},"BZ WBK":{"count":156},"Banamex":{"count":356},"Banc Sabadell":{"count":175},"Banca Intesa":{"count":92},"Banca March":{"count":51},"Banca Popolare di Milano":{"count":99},"Banca Popolare di Novara":{"count":79},"Banca Popolare di Sondrio":{"count":105},"Banca Popolare di Verona":{"count":59},"Banca Popolare di Vicenza":{"count":119},"Banca Românească":{"count":61},"Banca Sella":{"count":56},"Banca Transilvania":{"count":167},"Banco Agrario":{"count":58},"Banco Azteca":{"count":119},"Banco BCI":{"count":74},"Banco Bradesco":{"count":226},"Banco Continental":{"count":64},"Banco Estado":{"count":153},"Banco Fassil":{"count":59},"Banco G&T Continental":{"count":84},"Banco General":{"count":53},"Banco Industrial":{"count":91},"Banco Internacional":{"count":62},"Banco Itaú":{"count":351},"Banco Nacional":{"count":143},"Banco Nación":{"count":149},"Banco Pastor":{"count":74},"Banco Pichincha":{"count":109},"Banco Popular":{"count":619},"Banco Provincia":{"count":138},"Banco Sabadell":{"count":189},"Banco Santander":{"count":112},"Banco Sol":{"count":74},"Banco de Bogotá":{"count":74},"Banco de Chile":{"count":175},"Banco de Costa Rica":{"count":123},"Banco de Desarrollo Banrural":{"count":85},"Banco de Occidente":{"count":67},"Banco de Venezuela":{"count":76},"Banco de la Nación":{"count":156},"Banco de la Nación Argentina":{"count":166},"Banco di Napoli":{"count":79},"Banco di Sardegna":{"count":79},"Banco do Brasil":{"count":1313},"Banco do Nordeste":{"count":56},"BancoEstado":{"count":121},"Bancolombia":{"count":170},"Bancomer":{"count":227},"Bancpost":{"count":77},"Banesco":{"count":209},"Bangkok Bank":{"count":69},"Bank Al Habib":{"count":52},"Bank Alfalah":{"count":63},"Bank Austria":{"count":123},"Bank BCA":{"count":71},"Bank BNI":{"count":67},"Bank BPH":{"count":56},"Bank BRI":{"count":196},"Bank Danamon":{"count":60},"Bank Mandiri":{"count":232},"Bank Mega":{"count":54},"Bank Spółdzielczy":{"count":395},"Bank Zachodni WBK":{"count":103},"Bank of Africa":{"count":59},"Bank of America":{"count":1787},"Bank of Baroda":{"count":122},"Bank of Ceylon":{"count":74},"Bank of China":{"count":152},"Bank of Commerce":{"count":69},"Bank of India":{"count":113},"Bank of Ireland":{"count":151},"Bank of Montreal":{"count":157},"Bank of New Zealand":{"count":63},"Bank of Scotland":{"count":122},"Bank of the West":{"count":173},"Bankia":{"count":613},"Bankinter":{"count":139},"Banner Bank":{"count":53},"Banorte":{"count":260},"Banque Atlantique":{"count":57},"Banque Nationale":{"count":137},"Banque Populaire":{"count":919},"Banrisul":{"count":101},"Banrural":{"count":84},"Barclays":{"count":1243},"Bcc":{"count":54},"Belfius":{"count":285},"Bendigo Bank":{"count":140},"Berliner Volksbank":{"count":73},"Bicentenario":{"count":173},"Bradesco":{"count":751},"Budapest Bank":{"count":56},"CBAO":{"count":53},"CEC Bank":{"count":121},"CGD":{"count":52},"CIB Bank":{"count":64},"CIBC":{"count":574},"CIC":{"count":742},"CIMB Bank":{"count":64},"CNEP":{"count":52},"Caisse Desjardins":{"count":69},"Caisse d'Épargne":{"count":1607},"Caixa":{"count":239},"Caixa Econômica Federal":{"count":573},"Caixa Geral de Depósitos":{"count":231},"CaixaBank":{"count":343},"Caja Círculo":{"count":68},"Caja Duero":{"count":90},"Caja España":{"count":74},"Caja Rural":{"count":216},"Caja Rural de Jaén":{"count":55},"CajaSur":{"count":73},"Cajamar":{"count":216},"Cajero Automatico Bancared":{"count":123},"Canara Bank":{"count":270},"Capital One":{"count":199},"Carige":{"count":57},"Cariparma":{"count":69},"Cassa di Risparmio del Veneto":{"count":102},"CatalunyaCaixa":{"count":107},"Central Bank of India":{"count":60},"Chase":{"count":1658},"China Bank":{"count":156},"China Bank Savings":{"count":54},"China Construction Bank":{"count":68},"Citibank":{"count":485},"Citizens Bank":{"count":248},"Clydesdale Bank":{"count":55},"Columbia Bank":{"count":79},"Comerica Bank":{"count":67},"Commerce Bank":{"count":61},"Commercial Bank":{"count":75},"Commercial Bank of Ceylon PLC":{"count":100},"Commerzbank":{"count":879},"Commonwealth Bank":{"count":376},"Corporation Bank":{"count":92},"Credem":{"count":77},"Credicoop":{"count":111},"Credit Agricole":{"count":104},"Credit Suisse":{"count":93},"Crelan":{"count":53},"Crédit Agricole":{"count":2544},"Crédit Mutuel":{"count":1129},"Crédit Mutuel de Bretagne":{"count":368},"Crédit du Nord":{"count":148},"Crédito Agrícola":{"count":87},"Cбербанк":{"count":74},"Danske Bank":{"count":157},"Davivienda":{"count":172},"De Venezuela":{"count":87},"Denizbank":{"count":58},"Desjardins":{"count":80},"Deutsche Bank":{"count":995},"Dubai Islamic Bank":{"count":71},"EastWest Bank":{"count":127},"Ecobank":{"count":197},"Erste Bank":{"count":200},"Eurobank":{"count":261},"Express Union":{"count":58},"FNB":{"count":143},"Federal Bank":{"count":88},"Fifth Third Bank":{"count":234},"Finansbank":{"count":68},"First Bank":{"count":91},"First Citizens Bank":{"count":88},"First National Bank":{"count":209},"Galicia":{"count":179},"Garanti":{"count":58},"Garanti Bankası":{"count":82},"Getin Bank":{"count":112},"Groupama":{"count":61},"HDFC Bank":{"count":219},"HNB":{"count":67},"HSBC":{"count":1748},"Halifax":{"count":367},"Halkbank":{"count":74},"Hamburger Sparkasse":{"count":159},"Handelsbanken":{"count":250},"Hong Leong Bank":{"count":51},"Hrvatska poštanska banka":{"count":54},"Huntington Bank":{"count":110},"HypoVereinsbank":{"count":408},"ICBC":{"count":158},"ICICI Bank":{"count":224},"IDBI Bank":{"count":73},"ING":{"count":654},"ING Bank Śląski":{"count":128},"IberCaja":{"count":209},"Indian Bank":{"count":98},"Indian Overseas Bank":{"count":108},"Interbank":{"count":131},"Intesa San Paolo":{"count":257},"Itaú":{"count":726},"K&H Bank":{"count":75},"KBC":{"count":273},"Kasa Stefczyka":{"count":65},"Key Bank":{"count":382},"Komerční banka":{"count":180},"Kreissparkasse":{"count":600},"Kreissparkasse Köln":{"count":69},"Kutxabank":{"count":68},"LCL":{"count":903},"La Banque Postale":{"count":124},"La Caixa":{"count":1144},"Laboral Kutxa":{"count":66},"Landbank":{"count":115},"Liberbank":{"count":164},"Lloyds Bank":{"count":612},"M&T Bank":{"count":184},"MCB":{"count":62},"MCB Bank":{"count":54},"MONETA Money Bank":{"count":92},"Macro":{"count":174},"Maybank":{"count":234},"Meezan Bank":{"count":63},"Mercantil":{"count":132},"Metro Bank":{"count":57},"Metrobank":{"count":434},"Millennium BCP":{"count":119},"Millennium Bank":{"count":386},"Monte dei Paschi di Siena":{"count":265},"Montepio":{"count":113},"NAB":{"count":205},"NSB":{"count":51},"NatWest":{"count":800},"National Bank":{"count":147},"Nationwide":{"count":337},"Nedbank":{"count":100},"Nordea":{"count":331},"Novo Banco":{"count":101},"OLB":{"count":57},"OTP":{"count":362},"Oberbank":{"count":103},"Occidental de Descuento":{"count":68},"Oldenburgische Landesbank":{"count":68},"One Network Bank":{"count":91},"Osuuspankki":{"count":89},"PBZ":{"count":65},"PKO":{"count":58},"PKO BP":{"count":561},"PNB":{"count":323},"PNC":{"count":52},"PNC Bank":{"count":639},"PSBank":{"count":108},"Patagonia":{"count":94},"Pekao SA":{"count":155},"Peoples Bank":{"count":254},"Philippine National Bank":{"count":69},"Piraeus Bank":{"count":96},"Popular":{"count":104},"Postbank":{"count":567},"Postbank Finanzcenter":{"count":65},"Provincial":{"count":135},"Public Bank":{"count":90},"Punjab National Bank":{"count":134},"RBC":{"count":487},"RBC Financial Group":{"count":59},"RBS":{"count":190},"RCBC":{"count":144},"RCBC Savings Bank":{"count":84},"Rabobank":{"count":557},"Raiffeisen Polbank":{"count":78},"Raiffeisenbank":{"count":2705},"Regions Bank":{"count":204},"Republic Bank":{"count":85},"Royal Bank":{"count":90},"Royal Bank of Canada":{"count":56},"Royal Bank of Scotland":{"count":129},"SEB":{"count":129},"SNS Bank":{"count":58},"Sabadell":{"count":97},"Sampath Bank":{"count":87},"Santander":{"count":3268},"Santander Consumer Bank":{"count":109},"Santander Río":{"count":239},"Santander Totta":{"count":201},"Sberbank":{"count":135},"Scotiabank":{"count":1144},"Security Bank":{"count":171},"Sicredi":{"count":94},"Slovenská sporiteľňa":{"count":165},"Société Générale":{"count":1136},"Sparda-Bank":{"count":277},"Sparkasse":{"count":4667},"Sparkasse Aachen":{"count":56},"Sparkasse KölnBonn":{"count":76},"Stadtsparkasse":{"count":68},"Stanbic Bank":{"count":63},"Standard Bank":{"count":165},"Standard Chartered":{"count":95},"Standard Chartered Bank":{"count":74},"State Bank of India":{"count":1013},"SunTrust":{"count":322},"Supervielle":{"count":72},"Swedbank":{"count":252},"Syndicate Bank":{"count":118},"TCF Bank":{"count":85},"TD Bank":{"count":425},"TD Canada Trust":{"count":675},"TEB":{"count":56},"TSB":{"count":259},"Takarékszövetkezet":{"count":120},"Targobank":{"count":279},"Tatra banka":{"count":70},"Türkiye İş Bankası":{"count":53},"UBS":{"count":169},"UCO Bank":{"count":51},"UCPB":{"count":122},"UOB":{"count":126},"US Bank":{"count":723},"Ulster Bank":{"count":100},"Umpqua Bank":{"count":103},"UniCredit Bank":{"count":548},"Unicaja Banco":{"count":182},"Unicredit Banca":{"count":496},"Union Bank":{"count":304},"United Bank":{"count":68},"VR-Bank":{"count":506},"Vakıfbank":{"count":85},"Veneto Banca":{"count":73},"Vijaya Bank":{"count":56},"Volks- und Raiffeisenbank":{"count":53},"Volksbank":{"count":2665},"Volksbank Mittelhessen":{"count":53},"Volksbank Raiffeisenbank":{"count":63},"VÚB":{"count":105},"Washington Federal":{"count":65},"Wells Fargo":{"count":1947},"Western Union":{"count":440},"Westpac":{"count":322},"Yorkshire Bank":{"count":95},"Yorkshire Building Society":{"count":69},"Zagrebačka banka":{"count":54},"Ziraat Bankası":{"count":172},"mBank":{"count":70},"ČSOB":{"count":211},"Česká spořitelna":{"count":243},"İş Bankası":{"count":112},"Εθνική Τράπεζα":{"count":103},"Πειραιώς":{"count":120},"Τράπεζα Πειραιώς":{"count":104},"Авангард":{"count":76},"Альфа-Банк":{"count":301},"Банк Москвы":{"count":176},"Банка ДСК":{"count":63},"Белагропромбанк":{"count":184},"Беларусбанк":{"count":570},"Белинвестбанк":{"count":78},"Бинбанк":{"count":114},"ВТБ":{"count":80},"ВТБ24":{"count":545},"Возрождение":{"count":81},"Газпромбанк":{"count":161},"Генбанк":{"count":83},"Казкоммерцбанк":{"count":74},"МДМ Банк":{"count":52},"Московский индустриальный банк":{"count":53},"Мособлбанк":{"count":54},"Народный банк":{"count":63},"ОТП Банк":{"count":54},"Открытие":{"count":92},"Ощадбанк":{"count":883},"ПУМБ":{"count":78},"Почта Банк":{"count":65},"ПриватБанк":{"count":1018},"Приватбанк":{"count":76},"Приднестровский Сбербанк":{"count":59},"Приорбанк":{"count":69},"Промсвязьбанк":{"count":133},"РНКБ":{"count":124},"Райффайзен":{"count":65},"Райффайзен Банк Аваль":{"count":125},"Райффайзенбанк":{"count":52},"Росбанк":{"count":218},"Россельхозбанк":{"count":374},"Русский стандарт":{"count":55},"Сбербанк":{"count":6921},"Совкомбанк":{"count":186},"УкрСиббанк":{"count":213},"Укрсоцбанк":{"count":57},"Уралсиб":{"count":130},"Хоум Кредит":{"count":53},"בנק הפועלים":{"count":112},"בנק לאומי":{"count":83},"بانک":{"count":219},"بانک آینده":{"count":58},"بانک اقتصاد نوین":{"count":78},"بانک انصار":{"count":99},"بانک تجارت":{"count":365},"بانک رفاه":{"count":138},"بانک رفاه کارگران":{"count":72},"بانک سپه":{"count":348},"بانک شهر":{"count":93},"بانک صادرات":{"count":492},"بانک قوامین":{"count":110},"بانک مسکن":{"count":263},"بانک ملت":{"count":428},"بانک ملی":{"count":561},"بانک ملی ایران":{"count":80},"بانک مهر اقتصاد":{"count":92},"بانک پارسیان":{"count":103},"بانک پاسارگاد":{"count":107},"بانک کشاورزی":{"count":277},"صادرات":{"count":85},"ملی":{"count":67},"پست بانک":{"count":71},"ธนาคารกรุงเทพ":{"count":121},"ธนาคารกรุงไทย":{"count":85},"ธนาคารกสิกรไทย":{"count":108},"ธนาคารออมสิน":{"count":71},"ธนาคารไทยพาณิชย์":{"count":95},"みずほ銀行":{"count":255},"りそな銀行":{"count":135},"三井住友銀行":{"count":204},"三菱東京UFJ銀行":{"count":235},"中国农业银行":{"count":198},"中国工商银行":{"count":181},"中国建设银行":{"count":158},"中国邮政储蓄银行":{"count":76},"中国银行":{"count":275},"交通银行":{"count":68},"京都中央信用金庫":{"count":53},"京都銀行":{"count":66},"农业银行":{"count":78},"北海道銀行":{"count":51},"合作金庫銀行":{"count":55},"土地銀行":{"count":54},"工商银行":{"count":160},"建设银行":{"count":89},"彰化銀行":{"count":53},"招商银行":{"count":94},"横浜銀行":{"count":92},"第一銀行":{"count":78},"華南銀行":{"count":52},"국민은행":{"count":199,"tags":{"name:en":"Gungmin Bank"}},"기업은행":{"count":53},"농협":{"count":148},"새마을금고":{"count":102},"신한은행":{"count":245,"tags":{"name:en":"Sinhan Bank"}},"우리은행":{"count":316,"tags":{"name:en":"Uri Bank"}},"하나은행":{"count":85}},"bar":{"Bar Centrale":{"count":141},"Bar Sport":{"count":90},"Beach Bar":{"count":80},"Pool Bar":{"count":54}},"bicycle_rental":{"Bicing":{"count":130},"Call a Bike":{"count":95},"Grid":{"count":51},"Mibici":{"count":116},"metropolradruhr":{"count":91}},"bureau_de_change":{"Abitab":{"count":55},"Change":{"count":51},"Travelex":{"count":75},"Western Union":{"count":189}},"cafe":{"85度C":{"count":128},"Bar Centrale":{"count":77},"Bar Kafe":{"count":253},"Barista":{"count":65},"Bistro":{"count":60},"Bonafide":{"count":63},"Cafe Coffee Day":{"count":239},"Cafe Nero":{"count":52},"Cafeteria":{"count":579},"Cafetería":{"count":61},"Caffè Nero":{"count":316},"Café Amazon":{"count":241},"Café Central":{"count":115},"Café de la Place":{"count":55},"Café des Sports":{"count":71},"Caribou Coffee":{"count":184},"Coffee Fellows":{"count":77},"Coffee House":{"count":71},"Coffee Island":{"count":51},"Coffee Time":{"count":133},"Costa":{"count":1403},"Country Style":{"count":58},"Dolce Vita":{"count":55},"Dunkin' Donuts":{"count":1662,"tags":{"cuisine":"donut"}},"Eiscafe Dolomiti":{"count":51},"Eiscafe Venezia":{"count":237},"Espresso House":{"count":122},"Havanna":{"count":81},"Internet Cafe":{"count":95},"Jamba Juice":{"count":86},"Kafe":{"count":55},"Krispy Kreme":{"count":63},"Le Pain Quotidien":{"count":59},"McCafé":{"count":72,"tags":{"amenity":"cafe","cuisine":"coffee_shop"}},"Peet's Coffee & Tea":{"count":82},"Pret A Manger":{"count":174},"Prime":{"count":51},"Second Cup":{"count":234},"Segafredo":{"count":103},"Starbucks":{"count":8463,"tags":{"cuisine":"coffee_shop"}},"Subway":{"count":114},"Tchibo":{"count":168},"The Coffee Bean & Tea Leaf":{"count":93},"The Coffee Club":{"count":81},"Tim Hortons":{"count":1945},"Traveler's Coffee":{"count":70},"Venezia":{"count":55},"Wayne's Coffee":{"count":52},"Берёзка":{"count":52},"Бистро":{"count":84},"Буфет":{"count":56},"Встреча":{"count":83},"Даблби":{"count":59},"Закусочная":{"count":101},"Кофе Хауз":{"count":119},"Кофейня":{"count":78},"Лакомка":{"count":62},"Летнее кафе":{"count":61},"Оазис":{"count":54},"Пельменная":{"count":63},"Пиццерия":{"count":60},"Рандеву":{"count":54},"Сказка":{"count":66},"Смак":{"count":62},"Старбакс":{"count":55},"Столовая":{"count":1181},"Теремок":{"count":64},"Уют":{"count":115},"Хуторок":{"count":59},"Шашлычная":{"count":153},"Шоколад":{"count":54},"Шоколадница":{"count":252},"ארומה":{"count":64},"مقهى":{"count":136},"คาเฟ่ อเมซอน":{"count":59},"エクセルシオール カフェ":{"count":61},"カフェ・ド・クリエ":{"count":80,"tags":{"name:en":"Cafe de CRIE"}},"カフェ・ベローチェ":{"count":105},"コメダ珈琲店":{"count":179},"サンマルクカフェ":{"count":156},"スターバックス":{"count":558,"tags":{"name:en":"Starbucks"}},"タリーズコーヒー":{"count":243},"ドトールコーヒーショップ":{"count":489},"星巴克":{"count":146},"스타벅스":{"count":52}},"car_rental":{"Alamo":{"count":57},"Avis":{"count":604},"Budget":{"count":218},"Enterprise":{"count":594},"Enterprise Rent-a-Car":{"count":51},"Europcar":{"count":611},"Hertz":{"count":654},"Localiza":{"count":59},"Sixt":{"count":323},"Thrifty":{"count":81},"U-Haul":{"count":94},"オリックスレンタカー":{"count":54},"トヨタレンタカー":{"count":57},"トヨタレンタリース":{"count":63},"ニッポンレンタカー":{"count":113}},"car_wash":{"Aral":{"count":88},"Autolavaggio":{"count":52},"BP":{"count":63},"Esso":{"count":55},"H-E-B Car Wash":{"count":71},"Intermarché":{"count":60},"Lavage Auto":{"count":60},"Lavazh":{"count":52},"Myjnia":{"count":54},"Myjnia bezdotykowa":{"count":93},"Myjnia samochodowa":{"count":66},"Shell":{"count":162},"Spălătorie Auto":{"count":69},"Spălătorie auto":{"count":52},"Автомийка":{"count":63}},"cinema":{"Cinema City":{"count":61},"Cinemark":{"count":87},"Cinemex":{"count":70},"Cinepolis":{"count":59},"Cineworld":{"count":64},"Odeon":{"count":81}},"clinic":{"ФАП":{"count":162}},"dentist":{"Aspen Dental":{"count":73},"Family Dentistry":{"count":51},"Vitaldent":{"count":54},"Стоматолог":{"count":72},"Стоматологія":{"count":66}},"doctors":{"Háziorvosi rendelő":{"count":54},"Инвитро":{"count":115},"ФАП":{"count":147}},"driving_school":{"Автодром":{"count":55}},"fast_food":{"A&W":{"count":614},"Ali Baba":{"count":101},"Angel's Burger":{"count":66},"Antalya":{"count":53},"Arby's":{"count":1432},"Asia Bistro":{"count":53},"Asia Wok":{"count":53},"Baskin-Robbins":{"count":262,"tags":{"amenity":"ice_cream"}},"Bistro":{"count":80},"Bob's":{"count":83},"Bojangles":{"count":89},"Booster Juice":{"count":76},"Boston Market":{"count":107},"Braum's":{"count":58},"Burger King":{"count":6601,"tags":{"cuisine":"burger"}},"Burger Machine":{"count":55},"Büfé":{"count":72},"Captain D's":{"count":56},"Carl's Jr.":{"count":593,"tags":{"cuisine":"burger"}},"Checkers":{"count":102},"Chick-fil-A":{"count":906,"tags":{"cuisine":"chicken"}},"Chicken Express":{"count":67},"Chipotle":{"count":688,"tags":{"cuisine":"mexican"}},"Chowking":{"count":250},"Church's Chicken":{"count":249},"CoCo壱番屋":{"count":218},"Cold Stone Creamery":{"count":72},"Cook Out":{"count":81},"Culver's":{"count":541},"DQ":{"count":66},"Dairy Queen":{"count":1485},"Del Taco":{"count":244},"Ditsch":{"count":55},"Domino's Pizza":{"count":2577,"tags":{"cuisine":"pizza"}},"Dunkin' Donuts":{"count":747,"tags":{"cuisine":"donut"}},"El Pollo Loco":{"count":132},"Everest":{"count":59},"Extreme Pita":{"count":58},"Fazoli's":{"count":53},"Firehouse Subs":{"count":147},"Fish & Chips":{"count":185},"Fish and Chips":{"count":55},"Five Guys":{"count":457},"Greenwich":{"count":83},"Habib's":{"count":87},"Hallo Pizza":{"count":98},"Hardee's":{"count":634,"tags":{"cuisine":"burger"}},"Harvey's":{"count":158},"Hesburger":{"count":164},"Hungry Jacks":{"count":261,"tags":{"cuisine":"burger"}},"In-N-Out Burger":{"count":211},"Istanbul":{"count":96},"Istanbul Kebab":{"count":59},"Jack in the Box":{"count":951,"tags":{"cuisine":"burger"}},"Jamba Juice":{"count":148},"Jersey Mike's Subs":{"count":88},"Jimmy John's":{"count":519,"tags":{"cuisine":"sandwich"}},"Jollibee":{"count":740},"KFC":{"count":6003,"tags":{"cuisine":"chicken"}},"KFC/Taco Bell":{"count":70},"Kebab House":{"count":74},"Kebabai":{"count":64},"Kochlöffel":{"count":78},"Kotipizza":{"count":89},"Krispy Kreme":{"count":63},"Krystal":{"count":53},"Little Caesars":{"count":567},"Little Caesars Pizza":{"count":82},"Long John Silver's":{"count":200},"Lotteria":{"count":67},"Max":{"count":54},"McDonald's":{"count":18327,"tags":{"cuisine":"burger"}},"Minute Burger":{"count":53},"Mr. Sub":{"count":153},"New York Pizza":{"count":65},"Nordsee":{"count":198},"Panda Express":{"count":593,"tags":{"cuisine":"chinese"}},"Panera Bread":{"count":120},"Papa John's":{"count":820,"tags":{"cuisine":"pizza"}},"Papa Murphy's":{"count":100},"Pinulito":{"count":58},"Pita Pit":{"count":150},"Pizza Hut":{"count":1503,"tags":{"cuisine":"pizza"}},"Pizza Hut Delivery":{"count":70},"Pizza King":{"count":56},"Pizza Nova":{"count":90},"Pizza Pizza":{"count":411},"Pollo Campero":{"count":134},"Pollo Granjero":{"count":66},"Popeye's":{"count":521,"tags":{"cuisine":"chicken"}},"Popeyes Louisiana Kitchen":{"count":51},"Qdoba":{"count":91},"Quick":{"count":434},"Quiznos":{"count":401},"Rally's":{"count":68},"Red Rooster":{"count":192},"Sbarro":{"count":65},"Schlotzsky's Deli":{"count":348},"Sibylla":{"count":74},"Sonic":{"count":1166,"tags":{"cuisine":"burger"}},"Starbucks":{"count":60,"tags":{"cuisine":"coffee_shop"}},"Steers":{"count":190},"Subway":{"count":11431},"Taco Bell":{"count":2947,"tags":{"cuisine":"mexican"}},"Taco Bueno":{"count":59},"Taco Cabana":{"count":57},"Taco Del Mar":{"count":57},"Taco John's":{"count":141},"Taco Time":{"count":171},"Telepizza":{"count":323},"Thai Express":{"count":63},"The Pizza Company":{"count":62},"Waffle House":{"count":86},"Wendy's":{"count":3036,"tags":{"cuisine":"burger"}},"Whataburger":{"count":815},"White Castle":{"count":149},"Wienerschnitzel":{"count":61},"Wimpy":{"count":168},"Zaxby's":{"count":185},"Γρηγόρης":{"count":59},"Бистро":{"count":61},"Бургер Кинг":{"count":181},"Крошка Картошка":{"count":77},"Макдоналдс":{"count":469,"tags":{"name:en":"McDonald's"}},"Робин Сдобин":{"count":131},"Русский Аппетит":{"count":129},"Сабвэй":{"count":73},"Стардог!s":{"count":66},"Теремок":{"count":155},"Шаверма":{"count":93},"Шаурма":{"count":265},"かっぱ寿司":{"count":84},"かつや":{"count":58},"くら寿司":{"count":99},"すき家":{"count":571,"tags":{"name:en":"SUKIYA"}},"なか卯":{"count":180},"ほっかほっか亭":{"count":57},"ほっともっと":{"count":168},"オリジン弁当":{"count":93},"ケンタッキーフライドチキン":{"count":334,"tags":{"cuisine":"chicken","name:en":"KFC"}},"サブウェイ":{"count":74},"スシロー":{"count":94},"マクドナルド":{"count":1261,"tags":{"cuisine":"burger","name:en":"McDonald's"}},"ミスタードーナツ":{"count":188},"モスバーガー":{"count":507,"tags":{"name:en":"MOS BURGER"}},"ロッテリア":{"count":97},"丸亀製麺":{"count":57},"吉野家":{"count":461},"幸楽苑":{"count":80},"摩斯漢堡":{"count":86},"松屋":{"count":574,"tags":{"name:en":"Matsuya"}},"肯德基":{"count":197},"麥當勞":{"count":224},"麦当劳":{"count":97},"롯데리아":{"count":83}},"fuel":{"76":{"count":603},"1-2-3":{"count":75},"7-Eleven":{"count":1013},"ABC":{"count":83},"ADNOC":{"count":76},"ANP":{"count":202},"ARAL":{"count":68},"Aegean":{"count":56},"Afriquia":{"count":134},"Agip":{"count":2348},"Agrola":{"count":99},"Alon":{"count":54},"Alpet":{"count":61},"Api":{"count":234},"Aral":{"count":1708},"Arco":{"count":585},"Asda":{"count":51},"Auchan":{"count":84},"Avanti":{"count":112},"Avia":{"count":1061},"BEBECO":{"count":77},"BFT":{"count":102},"BHPetrol":{"count":60},"BP":{"count":4069},"BR":{"count":165},"Bangchak":{"count":106},"Benzina":{"count":167},"Bharat Petroleum":{"count":230},"Bliska":{"count":141},"CAMPSA":{"count":420},"CARREFOUR":{"count":61},"CEPSA":{"count":892},"CNG":{"count":373},"Caltex":{"count":1574},"Campsa":{"count":64},"Canadian Tire":{"count":97},"Carrefour":{"count":372},"Casey's General Store":{"count":385},"Cenex":{"count":222},"Cepsa":{"count":305},"Ceypetco":{"count":70},"Chevron":{"count":1781},"Circle K":{"count":730},"Citgo":{"count":692},"Clark":{"count":56},"Co-op":{"count":52},"Coles Express":{"count":305},"Conoco":{"count":398},"Coop":{"count":71},"Copec":{"count":566},"Copetrol":{"count":119},"Cosmo":{"count":68},"Costco Gasoline":{"count":203},"Couche-Tard":{"count":54},"Crodux":{"count":51},"Cumberland Farms":{"count":93},"Delta":{"count":157},"Diamond Shamrock":{"count":51},"Drummed Fuel":{"count":178},"E. Leclerc":{"count":136},"EKO":{"count":224},"ENEOS":{"count":1600},"ENI":{"count":92},"ERG":{"count":71},"Elan":{"count":208},"Eneos":{"count":130},"Engen":{"count":383},"Eni":{"count":681},"Erg":{"count":469},"Esso":{"count":4742},"Esso Express":{"count":176},"EuroOil":{"count":52},"Exxon":{"count":1064},"F24":{"count":67},"Firezone":{"count":66},"Flying V":{"count":175},"GALP":{"count":788},"Gazprom":{"count":68},"GetGo":{"count":54},"Goil":{"count":78},"Gulf":{"count":416},"H-E-B Fuel":{"count":51},"H-E-B Gas":{"count":155},"HEM":{"count":276},"HP":{"count":163},"HP Petrol Pump":{"count":53},"Helios":{"count":63},"Hess":{"count":195},"Hindustan Petroleum":{"count":82},"Holiday":{"count":156},"Husky":{"count":244},"IES":{"count":57},"IP":{"count":993},"Independent Fuel Station":{"count":52},"Indian Oil":{"count":416},"Indipend.":{"count":129},"Ingo":{"count":62},"Intermarché":{"count":556},"Intermarché Super":{"count":102},"Ipiranga":{"count":173},"Irving":{"count":194},"JA-SS":{"count":74},"JOMO":{"count":51},"Jet":{"count":707},"Jetti":{"count":61},"Kangaroo":{"count":115},"Kobil":{"count":87},"Kroger":{"count":59},"Kroger Fuel":{"count":68},"Kum & Go":{"count":136},"Kwik Trip":{"count":210},"LPG":{"count":349},"LPG Station":{"count":51},"LUKOIL":{"count":61},"Liberty":{"count":93},"Lotos":{"count":284},"Lotos Optima":{"count":71},"Love's":{"count":52},"Lukoil":{"count":908},"MEROIL":{"count":70},"MOL":{"count":436},"MRS":{"count":65},"Marathon":{"count":694},"Maverik":{"count":66},"Maxol":{"count":57},"Metano":{"count":248},"Migrol":{"count":71},"Minipump":{"count":140},"Mobil":{"count":1387},"Mobile":{"count":62},"Mol":{"count":64},"Morrisons":{"count":128},"Moya":{"count":62},"Murphy USA":{"count":190},"NP":{"count":63},"Neste":{"count":166},"OIL!":{"count":110},"OK":{"count":269},"OKQ8":{"count":218},"OMV":{"count":936},"Oilibya":{"count":127},"Opet":{"count":117},"Orlen":{"count":1185},"PETRONOR":{"count":182},"PSO":{"count":121},"PSO Petrol Pump":{"count":56},"PT":{"count":306},"PTT":{"count":423},"PV Oil":{"count":100},"Pacific Pride":{"count":54},"Pecsa":{"count":130},"Pemex":{"count":2023},"Pertamina":{"count":324},"Petro":{"count":54},"Petro-Canada":{"count":893},"Petrobras":{"count":487},"Petrochina":{"count":116},"Petroecuador":{"count":64},"Petrol Ofisi":{"count":237},"Petrolimex":{"count":325},"Petrom":{"count":381},"Petron":{"count":1485},"Petronas":{"count":387},"Petroperu":{"count":110},"Phillips 66":{"count":424},"Phoenix":{"count":210},"Pilot":{"count":69},"Pioneer":{"count":104},"Posto":{"count":52},"Posto Atem":{"count":68},"Posto BR":{"count":222},"Posto Ipiranga":{"count":177},"Posto Shell":{"count":104},"Primax":{"count":288},"Prio":{"count":52},"Puma":{"count":442},"Q1":{"count":53},"Q8":{"count":1467},"Q8 Easy":{"count":66},"QuikTrip":{"count":251},"REPSOL":{"count":1380},"RaceTrac":{"count":80},"Raiffeisenbank":{"count":130},"Repsol":{"count":1099},"Rompetrol":{"count":234},"Royal Farms":{"count":79},"Rubis":{"count":108},"SB Tank":{"count":62},"SPBU":{"count":203},"Safeway":{"count":74},"Sainsbury's":{"count":75},"Sam's Club":{"count":57},"Sasol":{"count":90},"Sea Oil":{"count":142},"Sheetz":{"count":304},"Shell":{"count":12317},"Shell Express":{"count":135},"Sinclair":{"count":201},"Sinopec":{"count":106},"Sinopec Fuel":{"count":116},"Slovnaft":{"count":259},"Socar":{"count":86},"Sokimex":{"count":85},"Speedway":{"count":556},"St1":{"count":141},"Star":{"count":419},"Star Oil":{"count":100},"Station Service E. Leclerc":{"count":423},"Statoil":{"count":495},"Stewart's":{"count":72},"Sunoco":{"count":853},"Super U":{"count":174},"Tamoil":{"count":959},"Tango":{"count":146},"Teboil":{"count":100},"Tela":{"count":191},"Terpel":{"count":367},"Tesco":{"count":218},"Texaco":{"count":1167},"Tinq":{"count":219},"Topaz":{"count":111},"Total":{"count":3591},"Total Access":{"count":226},"Total Erg":{"count":59},"TotalErg":{"count":267},"Turkey Hill":{"count":80},"Turmöl":{"count":80},"Ultramar":{"count":372},"United":{"count":197},"Uno":{"count":134},"Uno-X":{"count":69},"Valero":{"count":778},"Vito":{"count":91},"WOG":{"count":350},"Wawa":{"count":173},"Westfalen":{"count":94},"Woolworths Petrol":{"count":187},"Z":{"count":98},"bft":{"count":202},"eni":{"count":71},"ΕΚΟ":{"count":58},"АГЗС":{"count":1020},"АЗС":{"count":86},"Авіас":{"count":116},"БРСМ-Нафта":{"count":64},"Башнефть":{"count":272},"Белоруснефть":{"count":71},"Газовая заправка":{"count":57},"Газпромнефть":{"count":1242},"Гелиос":{"count":61},"ЕКА":{"count":78},"Заправка":{"count":63},"КазМунайГаз":{"count":150},"Лукойл":{"count":2327},"Макпетрол":{"count":108},"НК Альянс":{"count":105},"Нефтьмагистраль":{"count":66},"ОККО":{"count":316},"ОМВ":{"count":55},"Октан":{"count":53},"ПТК":{"count":104},"Петрол":{"count":124},"Пропан":{"count":83},"Роснефть":{"count":957},"Сибнефть":{"count":51},"Сургутнефтегаз":{"count":95},"ТНК":{"count":588},"Татнефтепродукт":{"count":58},"Татнефть":{"count":331},"Укрнафта":{"count":228},"דור אלון":{"count":126},"דלק":{"count":160},"סונול":{"count":159},"פז":{"count":209},"محطة وقود":{"count":221},"محطه وقود":{"count":98},"پمپ بنزین":{"count":559},"پمپ گاز":{"count":152},"บางจาก":{"count":214},"ป.ต.ท.":{"count":414},"เชลล์":{"count":90},"เอสโซ่":{"count":82},"エッソ":{"count":70},"エネオス":{"count":301},"コスモ石油":{"count":415},"ゼネラル":{"count":75},"中国石化":{"count":104},"中国石化 Sinopec":{"count":61},"中国石油":{"count":82},"中油":{"count":64},"出光":{"count":620,"tags":{"name:en":"IDEMITSU"}},"加油站":{"count":60},"台灣中油":{"count":257},"昭和シェル":{"count":274}},"hospital":{"Cruz Roja":{"count":93},"IMSS":{"count":64},"Инфекционное отделение":{"count":91},"Кожно-венерологический диспансер":{"count":57},"Районная больница":{"count":88},"Роддом":{"count":133},"Родильный дом":{"count":75},"Скорая помощь":{"count":75},"ФАП":{"count":108},"ЦРБ":{"count":122},"Центральная районная больница":{"count":144},"โรงพยาบาลส่งเสริมสุขภาพตำบล":{"count":69}},"ice_cream":{"Baskin-Robbins":{"count":69,"tags":{"amenity":"ice_cream"}},"Cold Stone Creamery":{"count":66},"Grido":{"count":163}},"kindergarten":{"Amado Nervo":{"count":64},"Anganwadi":{"count":85},"Arche Noah":{"count":67},"Benito Juarez":{"count":89},"CONAFE Preescolar":{"count":90},"Cuauhtemoc":{"count":54},"Cursos Comunitarios":{"count":74},"Educacion Inicial de CONAFE No Escolarizado":{"count":184},"Emiliano Zapata":{"count":60},"Estefania Casta�eda":{"count":53},"Evangelischer Kindergarten":{"count":320},"Federico Froebel":{"count":88},"Gabriela Mistral":{"count":129},"Jean Piaget":{"count":82},"Jose Vasconcelos":{"count":71},"Juan Escutia":{"count":82},"Katholischer Kindergarten":{"count":99},"Kindergarten Regenbogen":{"count":62},"Kindergarten St. Josef":{"count":55},"Kindergarten St. Martin":{"count":55},"Maria Montessori":{"count":93},"Miguel Hidalgo Y Costilla":{"count":57},"Ni�os Heroes":{"count":68},"PAUD":{"count":82},"Pusteblume":{"count":54},"Rosaura Zapata":{"count":68},"Sor Juana Ines De La Cruz":{"count":76},"Spatzennest":{"count":54},"Städtischer Kindergarten":{"count":103},"Villa Kunterbunt":{"count":88},"Waldkindergarten":{"count":111},"Waldorfkindergarten":{"count":71},"Óvoda":{"count":72},"Детсад":{"count":65},"Детский сад \"Солнышко\"":{"count":83},"Детский сад № 1":{"count":54},"Детский сад №1":{"count":150},"Детский сад №10":{"count":77},"Детский сад №11":{"count":81},"Детский сад №12":{"count":57},"Детский сад №13":{"count":57},"Детский сад №14":{"count":76},"Детский сад №15":{"count":72},"Детский сад №16":{"count":58},"Детский сад №17":{"count":67},"Детский сад №18":{"count":77},"Детский сад №19":{"count":62},"Детский сад №2":{"count":155},"Детский сад №22":{"count":60},"Детский сад №24":{"count":53},"Детский сад №25":{"count":56},"Детский сад №27":{"count":54},"Детский сад №29":{"count":57},"Детский сад №3":{"count":129},"Детский сад №33":{"count":55},"Детский сад №4":{"count":86},"Детский сад №5":{"count":106},"Детский сад №6":{"count":93},"Детский сад №7":{"count":98},"Детский сад №8":{"count":80},"Детский сад №9":{"count":80},"Дитячий садок":{"count":58},"Сказка":{"count":52},"Солнышко":{"count":99},"Теремок":{"count":59},"საბავშვო ბაღი":{"count":69},"中央保育所":{"count":56}},"library":{"Biblioteca Comunale":{"count":212},"Biblioteca comunale":{"count":187},"Biblioteka Publiczna":{"count":78},"Bibliothèque Municipale":{"count":299},"Bibliothèque municipale":{"count":247},"Bücherei":{"count":113},"Central Library":{"count":65},"Gemeindebücherei":{"count":150},"Gminna Biblioteka Publiczna":{"count":71},"Miejska Biblioteka Publiczna":{"count":66},"Médiathèque":{"count":287},"Městská knihovna":{"count":60},"Public Library":{"count":91},"Stadtbibliothek":{"count":232},"Stadtbücherei":{"count":289},"Городская библиотека":{"count":69},"Детская библиотека":{"count":260},"Центральная библиотека":{"count":83},"Центральная городская библиотека":{"count":61},"图书馆":{"count":65}},"pharmacy":{"36.6":{"count":57},"Adler-Apotheke":{"count":375},"Alte Apotheke":{"count":99},"Apollo Pharmacy":{"count":87},"Apotek":{"count":62},"Apotek Hjärtat":{"count":51},"Apotheke am Markt":{"count":83},"Bahnhof Apotheke":{"count":51},"Bahnhof-Apotheke":{"count":90},"Bartell Drugs":{"count":53},"Benavides":{"count":83},"Benu":{"count":61},"Boots":{"count":1348},"Botica":{"count":118},"Brunnen-Apotheke":{"count":77},"Burg-Apotheke":{"count":76},"Bären-Apotheke":{"count":111},"CVS":{"count":3228},"Camelia":{"count":54},"Catena":{"count":112},"Chemist Warehouse":{"count":82},"Clicks":{"count":123},"Cruz Azul":{"count":97},"Cruz Verde":{"count":223},"Dbam o Zdrowie":{"count":68},"Dr. Max":{"count":324},"Droga Raia":{"count":152},"Drogaria São Paulo":{"count":87},"Drogasil":{"count":157},"Duane Reade":{"count":91},"Eczane":{"count":88},"Engel-Apotheke":{"count":143},"Eurovaistinė":{"count":89},"Familiprix":{"count":70},"Farmacenter":{"count":65},"Farmacia Centrale":{"count":61},"Farmacia Comunale":{"count":196},"Farmacia Guadalajara":{"count":146},"Farmacia del Ahorro":{"count":65},"Farmacias Ahumada":{"count":182},"Farmacias Cruz Azul":{"count":134},"Farmacias Cruz Verde":{"count":162},"Farmacias Económicas":{"count":63},"Farmacias Guadalajara":{"count":107},"Farmacias SalcoBrand":{"count":140},"Farmacias Sana Sana":{"count":111},"Farmacias Similares":{"count":137},"Farmacias del Ahorro":{"count":187},"Farmacity":{"count":191},"Farmahorro":{"count":53},"Farmatodo":{"count":165},"Felicia":{"count":56},"Fybeca":{"count":52},"Generika Drugstore":{"count":52},"Gintarinė vaistinė":{"count":121},"Guardian":{"count":71},"Gyógyszertár":{"count":59},"H-E-B Pharmacy":{"count":239},"Hirsch-Apotheke":{"count":180},"Hubertus Apotheke":{"count":120},"Inkafarma":{"count":234},"Jean Coutu":{"count":132},"Kinney Drugs":{"count":74},"Kur-Apotheke":{"count":52},"Linden-Apotheke":{"count":224},"Ljekarna":{"count":77},"Lloyds Pharmacy":{"count":539},"Lékárna":{"count":52},"Löwen-Apotheke":{"count":397},"Marien-Apotheke":{"count":370},"Markt-Apotheke":{"count":207},"Mercury Drug":{"count":584},"Mifarma":{"count":195},"Mēness aptieka":{"count":64},"Neue Apotheke":{"count":129},"Pague Menos":{"count":74},"Panvel":{"count":77},"Park-Apotheke":{"count":54},"Pharmacie Centrale":{"count":218},"Pharmacie Principale":{"count":62},"Pharmacie de l'Hôtel de Ville":{"count":52},"Pharmacie de la Gare":{"count":114},"Pharmacie de la Mairie":{"count":71},"Pharmacie de la Poste":{"count":68},"Pharmacie du Centre":{"count":154},"Pharmacie du Marché":{"count":110},"Pharmacie du Parc":{"count":60},"Pharmaprix":{"count":99},"Pharmasave":{"count":129},"Punkt Apteczny":{"count":53},"Rathaus-Apotheke":{"count":181},"Rats-Apotheke":{"count":126},"Rexall":{"count":109},"Rite Aid":{"count":1481},"Rose Pharmacy":{"count":99},"Rosen-Apotheke":{"count":205},"Rowlands Pharmacy":{"count":127},"SalcoBrand":{"count":112},"Sana Sana":{"count":95},"Schloss-Apotheke":{"count":62},"Sensiblu":{"count":115},"Shoppers Drug Mart":{"count":713},"Sonnen-Apotheke":{"count":372},"South Star Drug":{"count":69},"Stadt-Apotheke":{"count":397},"Stern-Apotheke":{"count":83},"Superdrug":{"count":177},"São João":{"count":54},"The Generics Pharmacy":{"count":211},"Uniprix":{"count":63},"Walgreens":{"count":3314},"Walgreens Pharmacy":{"count":76},"Walmart Pharmacy":{"count":99},"Watsons":{"count":110},"Well Pharmacy":{"count":61},"centro naturista":{"count":123},"А5":{"count":94},"Айболит":{"count":88},"Аптека 36,6":{"count":285},"Аптека низких цен":{"count":65},"Аптека низьких цін":{"count":88},"Аптека от склада":{"count":83},"Аптека №1":{"count":92},"Аптечный пункт":{"count":285},"Арніка":{"count":124},"Бережная аптека":{"count":67},"Будь здоров":{"count":63},"Вита":{"count":140},"Горздрав":{"count":395},"Живика":{"count":105},"Здоровье":{"count":87},"Имплозия":{"count":84},"Классика":{"count":102},"Ладушка":{"count":53},"Мед-сервіс":{"count":59},"Мелодия здоровья":{"count":60},"Невис":{"count":151},"Норма":{"count":89},"Озерки":{"count":54},"Панацея":{"count":68},"Первая помощь":{"count":132},"Планета здоровья":{"count":140},"Радуга":{"count":139},"Ригла":{"count":215},"Семейная":{"count":52},"Социальная аптека":{"count":62},"Столички":{"count":83},"Фармакопейка":{"count":85},"Фармакор":{"count":106},"Фармация":{"count":187},"Фармленд":{"count":108},"Центральная аптека":{"count":57},"סופר-פארם":{"count":93},"داروخانه":{"count":264},"داروخانه شبانه روزی":{"count":54},"صيدلية":{"count":148},"くすりの福太郎":{"count":51},"さくら薬局":{"count":52},"ウエルシア":{"count":84},"カワチ薬品":{"count":52},"クリエイト":{"count":53},"サンドラッグ":{"count":130},"スギ薬局":{"count":134},"セイジョー":{"count":58},"ツルハドラッグ":{"count":185},"ドラッグてらしま (Drug Terashima)":{"count":58},"マツモトキヨシ":{"count":221},"丁丁藥局":{"count":75}},"pub":{"Black Bull":{"count":55},"Commercial Hotel":{"count":62},"Cross Keys":{"count":64},"Irish Pub":{"count":107},"Kings Arms":{"count":81},"Kings Head":{"count":65},"New Inn":{"count":100},"Prince of Wales":{"count":89},"Queens Head":{"count":55},"Red Lion":{"count":201},"Rose & Crown":{"count":63},"Rose and Crown":{"count":82},"Royal Hotel":{"count":64},"Royal Oak":{"count":172},"The Albion":{"count":51},"The Anchor":{"count":68},"The Angel":{"count":55},"The Beehive":{"count":52},"The Bell":{"count":128},"The Bell Inn":{"count":58},"The Black Horse":{"count":100},"The Bull":{"count":82},"The Castle":{"count":63},"The Chequers":{"count":74},"The Cricketers":{"count":56},"The Cross Keys":{"count":58},"The Crown":{"count":252},"The Crown Inn":{"count":88},"The Fox":{"count":76},"The George":{"count":119},"The Green Man":{"count":59},"The Greyhound":{"count":99},"The Kings Arms":{"count":65},"The Kings Head":{"count":68},"The New Inn":{"count":126},"The Plough":{"count":182},"The Plough Inn":{"count":57},"The Queens Head":{"count":61},"The Railway":{"count":112},"The Red Lion":{"count":271},"The Rising Sun":{"count":74},"The Royal Oak":{"count":223},"The Ship":{"count":92},"The Ship Inn":{"count":98},"The Star":{"count":72},"The Star Inn":{"count":53},"The Sun Inn":{"count":51},"The Swan":{"count":155},"The Swan Inn":{"count":59},"The Victoria":{"count":72},"The Wheatsheaf":{"count":126},"The White Hart":{"count":247},"The White Horse":{"count":234},"The White Lion":{"count":75},"The White Swan":{"count":55},"魚民":{"count":119},"鳥貴族":{"count":57}},"restaurant":{"Adler":{"count":228},"Adria":{"count":60},"Adyar Ananda Bhavan":{"count":60},"Akropolis":{"count":212},"Ali Baba":{"count":59},"Alte Post":{"count":68},"Applebee's":{"count":977},"Asia":{"count":78},"Athen":{"count":75},"Athos":{"count":61},"Autogrill":{"count":60},"Bahnhof":{"count":56},"Bella Italia":{"count":194},"Bella Napoli":{"count":88},"Big Boy":{"count":58},"Bistro":{"count":64},"Bob Evans":{"count":269},"Bonefish Grill":{"count":73},"Boston Market":{"count":91},"Boston Pizza":{"count":278},"Buffalo Grill":{"count":282},"Buffalo Wild Wings":{"count":454},"Bären":{"count":75},"Cafeteria":{"count":65},"California Pizza Kitchen":{"count":116},"Campanile":{"count":55},"Canteen":{"count":91},"Capri":{"count":56},"Captain D's":{"count":54},"Carluccio's":{"count":57},"Carpe Diem":{"count":60},"Carrabba's Italian Grill":{"count":62},"Casa Mia":{"count":64},"Casablanca":{"count":61},"Cheesecake Factory":{"count":52},"Chifa":{"count":86},"Chili's":{"count":698},"China Buffet":{"count":54},"China Garden":{"count":114},"China House":{"count":72},"China Town":{"count":117},"China Wok":{"count":100},"Chiquito":{"count":55},"Chuck E. Cheese's":{"count":54},"Cici's Pizza":{"count":51},"CoCo壱番屋":{"count":77},"Cold Stone Creamery":{"count":67},"Comedor":{"count":60},"Comida China":{"count":52},"Courtepaille":{"count":170},"Cracker Barrel":{"count":392},"Da Grasso":{"count":63},"Da Vinci":{"count":88},"Delphi":{"count":105},"Denny's":{"count":850},"Deutsches Haus":{"count":93},"Dionysos":{"count":75},"Dolce Vita":{"count":121},"Dorfkrug":{"count":60},"Dunkin' Donuts":{"count":94,"tags":{"cuisine":"donut"}},"East Side Mario's":{"count":53},"El Greco":{"count":112},"El Paso":{"count":60},"El Rancho":{"count":82},"Europa":{"count":61},"Famous Dave's":{"count":62},"Firehouse Subs":{"count":85},"Five Guys":{"count":91},"Flunch":{"count":179},"Frankie & Benny's":{"count":151},"Friendly's":{"count":113},"Gasthaus Krone":{"count":93},"Gasthaus zur Linde":{"count":59},"Gasthof zur Post":{"count":109},"Golden Corral":{"count":209},"Golden Dragon":{"count":62},"Great Wall":{"count":54},"Grüner Baum":{"count":122},"Gusto":{"count":74},"Hard Rock Cafe":{"count":96},"Hardee's":{"count":56,"tags":{"cuisine":"burger"}},"Harvester":{"count":75},"Hellas":{"count":66},"Hippopotamus":{"count":115},"Hirsch":{"count":83},"Hirschen":{"count":86},"Hong Kong":{"count":126},"Hooters":{"count":190},"IHOP":{"count":758},"IL Патио":{"count":51},"Jason's Deli":{"count":73},"Jimmy John's":{"count":150,"tags":{"cuisine":"sandwich"}},"Joe's Crab Shack":{"count":70},"Jägerhof":{"count":54},"Kantine":{"count":104},"Kelsey's":{"count":66},"Kirchenwirt":{"count":94},"Kreta":{"count":70},"Kreuz":{"count":85},"Krone":{"count":179},"Kudu":{"count":172},"L'Escale":{"count":66},"L'Osteria":{"count":80},"La Bodega":{"count":55},"La Boucherie":{"count":80},"La Cantina":{"count":105},"La Casa":{"count":66},"La Casona":{"count":62},"La Dolce Vita":{"count":129},"La Fontana":{"count":62},"La Gondola":{"count":60},"La Hacienda":{"count":54},"La Pataterie":{"count":116},"La Pergola":{"count":87},"La Perla":{"count":85},"La Piazza":{"count":123},"La Piazzetta":{"count":77},"La Place":{"count":55},"La Scala":{"count":62},"La Strada":{"count":74},"La Tagliatella":{"count":69},"La Tasca":{"count":56},"La Taverna":{"count":58},"La Terrasse":{"count":82},"La Terraza":{"count":56},"La Terrazza":{"count":57},"La Trattoria":{"count":91},"Lamm":{"count":69},"Linde":{"count":114},"Lindenhof":{"count":95},"Little Caesars":{"count":80},"Little Chef":{"count":62},"Little Italy":{"count":90},"Logan's Roadhouse":{"count":89},"LongHorn Steakhouse":{"count":183},"Lotus":{"count":87},"Léon de Bruxelles":{"count":63},"Löwen":{"count":141},"MK Restaurants":{"count":65},"Maharaja":{"count":52},"Mamma Mia":{"count":130},"Mandarin":{"count":90},"Mang Inasal":{"count":128},"Marco Polo":{"count":62},"Marco's Pizza":{"count":53},"McAlister's Deli":{"count":51},"Mediterraneo":{"count":55},"Mellow Mushroom":{"count":73},"Mensa":{"count":148},"Milano":{"count":77},"Mimi's Cafe":{"count":52},"Moe's Southwest Grill":{"count":79},"Mykonos":{"count":89},"Mythos":{"count":61},"Nando's":{"count":412},"Noodles & Company":{"count":106},"O'Charley's":{"count":61},"Oasis":{"count":73},"Ocean Basket":{"count":71},"Ochsen":{"count":94},"Old Chicago":{"count":54},"Olive Garden":{"count":504},"Olympia":{"count":86},"Osaka":{"count":52},"Outback Steakhouse":{"count":399},"P.F. Chang's":{"count":53},"Pancake House":{"count":79},"Panda":{"count":52},"Panera Bread":{"count":582},"Panorama":{"count":102},"Papa Murphy's":{"count":66},"Parrilla":{"count":62},"Peking":{"count":68},"Perkins":{"count":157},"Pinocchio":{"count":63},"Pizza Express":{"count":417},"Pizza Factory":{"count":59},"Pizza House":{"count":56},"Pizza Hut":{"count":2688,"tags":{"cuisine":"pizza"}},"Pizza Ranch":{"count":77},"Pizzeria Italia":{"count":65},"Pizzeria Milano":{"count":51},"Pizzeria Napoli":{"count":53},"Pizzeria Roma":{"count":86},"Pizzeria Venezia":{"count":54},"Poivre Rouge":{"count":56},"Pollo Campero":{"count":53},"Pomodoro":{"count":62},"Portofino":{"count":67},"Poseidon":{"count":145},"Prezzo":{"count":147},"Qdoba":{"count":81},"Qdoba Mexican Grill":{"count":54},"Ratskeller":{"count":161},"Red Lobster":{"count":419},"Red Robin":{"count":312},"Restaurante Universitário":{"count":53},"Rhodos":{"count":94},"Ristorante Del Arte":{"count":160},"Roma":{"count":85},"Rose":{"count":51},"Round Table Pizza":{"count":100},"Ruby Tuesday":{"count":303},"Rössle":{"count":54},"Rössli":{"count":93},"Saigon":{"count":51},"Sakura":{"count":139},"San Marco":{"count":88},"Santorini":{"count":59},"Schwarzer Adler":{"count":65},"Schützenhaus":{"count":151},"Shakey's":{"count":64},"Shalimar":{"count":53},"Shanghai":{"count":96},"Shari's":{"count":75},"Shoney's":{"count":55},"Sizzler":{"count":90},"Sonic":{"count":80,"tags":{"cuisine":"burger"}},"Sonne":{"count":121},"Sphinx":{"count":66},"Sportheim":{"count":113},"Spur":{"count":70},"Starbucks":{"count":54,"tags":{"cuisine":"coffee_shop"}},"Steak 'n Shake":{"count":86,"tags":{"cuisine":"burger"}},"Sternen":{"count":85},"Subway":{"count":1108},"Sunset Grill":{"count":55},"Sushi":{"count":88},"Sushi Bar":{"count":68},"Swiss Chalet":{"count":162},"Syrtaki":{"count":65},"TGI Friday's":{"count":364},"Taj Mahal":{"count":183},"Taste of India":{"count":68},"Taverna":{"count":69},"Telepizza":{"count":109},"Texas Roadhouse":{"count":232},"The Cheesecake Factory":{"count":52},"Tim Hortons":{"count":61},"Toby Carvery":{"count":51},"Tony Roma's":{"count":63},"Toscana":{"count":76},"Trattoria":{"count":70},"Traube":{"count":68},"Vapiano":{"count":136},"Venezia":{"count":68},"Village Inn":{"count":149},"Vips":{"count":109},"Waffle House":{"count":521},"Wagamama":{"count":111},"Waldschänke":{"count":52},"Warung":{"count":73},"Wasabi":{"count":70},"Wimpy":{"count":66},"Zaxby's":{"count":60},"Zizzi":{"count":102},"Zorbas":{"count":62},"Zum Hirschen":{"count":52},"Zum Löwen":{"count":80},"Zur Krone":{"count":96},"Zur Linde":{"count":228},"Zur Post":{"count":125},"Zur Sonne":{"count":77},"Евразия":{"count":93},"Ресторан":{"count":60},"Тануки":{"count":62},"Якитория":{"count":84},"رستوران":{"count":72},"مطعم":{"count":52},"すき家":{"count":61,"tags":{"name:en":"SUKIYA"}},"はま寿司":{"count":67},"びっくりドンキー":{"count":120},"やよい軒":{"count":71},"ガスト":{"count":512,"tags":{"name:en":"Gusto"}},"ココス":{"count":142},"サイゼリア":{"count":54},"サイゼリヤ":{"count":285},"ジョイフル":{"count":83},"ジョナサン":{"count":139},"ジョリーパスタ":{"count":75},"デニーズ":{"count":199},"バーミヤン":{"count":130},"ロイヤルホスト":{"count":108},"丸亀製麺":{"count":98},"八方雲集":{"count":145},"吉野家":{"count":61},"夢庵":{"count":67},"大戸屋":{"count":68},"大阪王将":{"count":68},"天下一品":{"count":70},"安楽亭":{"count":60},"牛角":{"count":107},"食堂":{"count":63},"餃子の王将":{"count":212},"바다횟집 (Bada Fish Restaurant)":{"count":52}},"school":{"Adolfo Lopez Mateos":{"count":137},"Agustin Ya�ez":{"count":57},"Albert-Schweitzer-Schule":{"count":81},"Amado Nervo":{"count":85},"Astrid-Lindgren-Schule":{"count":77},"Benito Juarez":{"count":294},"Brown School":{"count":54},"CEM":{"count":215},"Center School":{"count":115},"Central Elementary School":{"count":179},"Central High School":{"count":130},"Central School":{"count":215},"Colegio San José":{"count":74},"Collège Jean Moulin":{"count":68},"Collège privé Saint-Joseph":{"count":60},"Cuauhtemoc":{"count":152},"Curso Comunitario":{"count":57},"Cursos Comunitarios":{"count":116},"EPP":{"count":112},"Emiliano Zapata":{"count":286},"Fairview Elementary School":{"count":64},"Fairview School":{"count":164},"Francisco I Madero":{"count":86},"Francisco I. Madero":{"count":52},"Francisco Villa":{"count":116},"Franklin Elementary School":{"count":96},"Franklin School":{"count":126},"Garfield Elementary School":{"count":69},"Garfield School":{"count":58},"Gimnazjum nr 1":{"count":59},"Government School":{"count":60},"Gregorio Torres Quintero":{"count":53},"Groupe Scolaire":{"count":57},"Guadalupe Victoria":{"count":58},"Highland School":{"count":71},"Hillcrest Elementary School":{"count":63},"Holy Cross School":{"count":68},"Holy Family School":{"count":77},"Holy Trinity School":{"count":59},"Ignacio Allende":{"count":51},"Ignacio Zaragoza":{"count":98},"Immaculate Conception School":{"count":83},"Jackson Elementary School":{"count":53},"Jackson School":{"count":56},"Jefferson Elementary School":{"count":177},"Jefferson School":{"count":108},"Jose Clemente Orozco":{"count":59},"Jose Ma Morelos Y Pavon":{"count":120},"Jose Vasconcelos":{"count":73},"Josefa Ortiz De Dominguez":{"count":78},"Juan Escutia":{"count":121},"Justo Sierra":{"count":118},"Kumon":{"count":66},"Lazaro Cardenas":{"count":68},"Lazaro Cardenas Del Rio":{"count":153},"Leona Vicario":{"count":64},"Liberty Elementary School":{"count":56},"Liberty School":{"count":84},"Lincoln Elementary School":{"count":264},"Lincoln School":{"count":269},"Longfellow Elementary School":{"count":55},"Longfellow School":{"count":53},"Madison Elementary School":{"count":55},"Manuel Lopez Cotilla":{"count":107},"Maple Grove School":{"count":51},"McKinley Elementary School":{"count":62},"McKinley School":{"count":63},"Miguel Hidalgo":{"count":86},"Miguel Hidalgo Y Costilla":{"count":213},"Miller School":{"count":66},"Mount Pleasant School":{"count":61},"Mount Zion School":{"count":53},"Mountain View Elementary School":{"count":52},"New Hope School":{"count":51},"Nicolas Bravo":{"count":58},"Ni�os Heroes":{"count":155},"Nombre En Tramite":{"count":126},"North Elementary School":{"count":57},"Oak Grove School":{"count":148},"Pedro Moreno":{"count":69},"Pestalozzischule":{"count":84},"Pine Grove School":{"count":63},"Pleasant Hill School":{"count":110},"Pleasant Valley School":{"count":85},"Pleasant View School":{"count":61},"Primaria Comunitaria":{"count":59},"Ramon Corona":{"count":54},"Ricardo Flores Magon":{"count":91},"Riverside School":{"count":76},"Roosevelt Elementary School":{"count":112},"Roosevelt School":{"count":114},"SD":{"count":76},"SDN":{"count":290},"Sacred Heart School":{"count":206},"Saint Francis School":{"count":56},"Saint James School":{"count":83},"Saint Johns School":{"count":173},"Saint Joseph School":{"count":147},"Saint Josephs School":{"count":157},"Saint Kizito Primary School":{"count":61},"Saint Mary School":{"count":54},"Saint Marys School":{"count":256},"Saint Patricks School":{"count":80},"Saint Paul School":{"count":53},"Saint Pauls School":{"count":74},"Saint Peters School":{"count":81},"Schillerschule":{"count":61},"School Number 1":{"count":233},"School Number 2":{"count":206},"School Number 3":{"count":184},"School Number 4":{"count":126},"Smith School":{"count":60},"Sor Juana Ines De La Cruz":{"count":56},"South Elementary School":{"count":53},"Sunnyside School":{"count":60},"Szkoła Podstawowa nr 1":{"count":78},"Szkoła Podstawowa nr 2":{"count":75},"Szkoła Podstawowa nr 3":{"count":60},"Trinity School":{"count":85},"UNIDAD EDUCATIVA":{"count":106},"Union School":{"count":128},"Valentin Gomez Farias":{"count":71},"Venustiano Carranza":{"count":64},"Vicente Guerrero":{"count":159},"Volkshochschule":{"count":105},"Volksschule":{"count":366},"Washington Elementary School":{"count":192},"Washington School":{"count":213},"West Elementary School":{"count":58},"White School":{"count":51},"Wilson Elementary School":{"count":66},"Wilson School":{"count":80},"Általános iskola":{"count":105},"École Jules Ferry":{"count":51},"École Notre-Dame":{"count":61},"École Saint-Joseph":{"count":96},"École primaire Jean Jaurès":{"count":71},"École primaire Jules Ferry":{"count":82},"École primaire privée Notre-Dame":{"count":69},"École primaire privée Saint-Joseph":{"count":132},"École primaire privée Sainte-Marie":{"count":63},"École élémentaire Jules Ferry":{"count":52},"Școala Generală":{"count":51},"Școală":{"count":53},"Вечерняя школа":{"count":53},"Гимназия №1":{"count":96},"ДЮСШ":{"count":63},"Средняя школа №1":{"count":80},"Средняя школа №2":{"count":86},"Средняя школа №3":{"count":58},"Школа № 1":{"count":130},"Школа № 2":{"count":117},"Школа № 3":{"count":80},"Школа № 4":{"count":77},"Школа № 5":{"count":55},"Школа №1":{"count":576},"Школа №10":{"count":167},"Школа №11":{"count":148},"Школа №12":{"count":136},"Школа №13":{"count":129},"Школа №14":{"count":123},"Школа №15":{"count":129},"Школа №16":{"count":99},"Школа №17":{"count":117},"Школа №18":{"count":111},"Школа №19":{"count":98},"Школа №2":{"count":509},"Школа №20":{"count":100},"Школа №21":{"count":72},"Школа №22":{"count":72},"Школа №23":{"count":75},"Школа №24":{"count":78},"Школа №25":{"count":57},"Школа №26":{"count":64},"Школа №27":{"count":58},"Школа №28":{"count":53},"Школа №3":{"count":393},"Школа №31":{"count":55},"Школа №35":{"count":54},"Школа №4":{"count":281},"Школа №5":{"count":275},"Школа №6":{"count":217},"Школа №7":{"count":215},"Школа №8":{"count":188},"Школа №9":{"count":183},"مدرسة":{"count":92},"مدرسه":{"count":500},"市立南中学校":{"count":53},"市立南小学校":{"count":56},"市立東中学校":{"count":54}},"social_facility":{"Safe Haven":{"count":92},"Детский дом":{"count":70},"Социальный участковый":{"count":195}},"theatre":{"Amfiteatr":{"count":97},"Amphitheater":{"count":110},"Amphitheatre":{"count":109},"Freilichtbühne":{"count":78},"Teatro Comunale":{"count":56}}};
23604 var leisure = {"fitness_centre":{"Anytime Fitness":{"count":143},"Gold's Gym":{"count":61},"LA Fitness":{"count":126},"Planet Fitness":{"count":106},"Snap Fitness":{"count":67}},"playground":{"Çocuk Parkı":{"count":60},"놀이터":{"count":292}},"sports_centre":{"Anytime Fitness":{"count":152},"Complejo Municipal de Deportes":{"count":88},"Complexe Sportif":{"count":51},"Curves":{"count":91},"Fitness First":{"count":70},"Gold's Gym":{"count":82},"Kieser Training":{"count":90},"LA Fitness":{"count":72},"Life Time Fitness":{"count":76},"McFit":{"count":60},"Mrs. Sporty":{"count":76},"Orlik":{"count":82},"Pabellón Municipal de Deportes":{"count":109},"Palestra Comunale":{"count":81},"Planet Fitness":{"count":106},"Salle Omnisport":{"count":57},"Schützenhaus":{"count":79},"Snap Fitness":{"count":51},"Virgin Active":{"count":69},"YMCA":{"count":174},"ДЮСШ":{"count":82},"Ледовый дворец":{"count":54},"体育館":{"count":80}},"swimming_pool":{"Schwimmerbecken":{"count":57},"Yüzme Havuzu":{"count":51},"プール":{"count":56},"游泳池":{"count":55}}};
23605 var man_made = {"windmill":{"De Hoop":{"count":57}}};
23606 var shop = {"alcohol":{"Alko":{"count":170},"BC Liquor Store":{"count":66},"BWS":{"count":157},"Bargain Booze":{"count":140},"Beer Store":{"count":66},"Botilleria":{"count":121},"Dan Murphy's":{"count":61},"Gall & Gall":{"count":511},"LCBO":{"count":430},"Liquor Depot":{"count":53},"Liquor Store":{"count":72},"Liquorland":{"count":112},"Mitra":{"count":60},"Nicolas":{"count":253},"SAQ":{"count":169},"Systembolaget":{"count":271},"The Beer Store":{"count":231},"Vinmonopolet":{"count":66},"Алкомаркет":{"count":67},"Ароматный мир":{"count":196},"Бристоль":{"count":329},"Градус":{"count":52},"Живое пиво":{"count":182},"Красное & Белое":{"count":989},"Кристалл":{"count":56},"Норман":{"count":146},"Отдохни":{"count":75},"Пиво":{"count":73},"Разливное пиво":{"count":143}},"baby_goods":{"Aubert":{"count":56},"Babies R Us":{"count":80},"BabyOne":{"count":52},"西松屋":{"count":53}},"bakery":{"AILI":{"count":53},"Anker":{"count":85},"Awiteks":{"count":53},"Backshop":{"count":57},"Backwerk":{"count":161},"Baguette":{"count":72},"Bakers Delight":{"count":75},"Bakker Bart":{"count":97},"Banette":{"count":111},"Bäckerei Fuchs":{"count":62},"Bäckerei Grimminger":{"count":51},"Bäckerei Müller":{"count":68},"Bäckerei Schmidt":{"count":103},"Bäckerei Schneider":{"count":52},"Cooplands":{"count":63},"Dat Backhus":{"count":81},"Der Beck":{"count":114},"Der Mann":{"count":53},"Ditsch":{"count":70},"Dunkin' Donuts":{"count":55,"tags":{"cuisine":"donut"}},"Fornetti":{"count":113},"Goeken backen":{"count":53},"Goldilocks":{"count":124},"Greggs":{"count":613},"Hofpfisterei":{"count":134},"Ihle":{"count":108},"Julie's Bakeshop":{"count":57},"K&U":{"count":117},"K&U Bäckerei":{"count":54},"Kamps":{"count":268},"La Mie Câline":{"count":56},"Le Crobag":{"count":54},"Le Fournil":{"count":57},"Lila Bäcker":{"count":107},"Lipóti Pékség":{"count":54},"Marie Blachère":{"count":89},"Mlinar":{"count":80},"Musmanni":{"count":81},"Oebel":{"count":65},"Paul":{"count":186},"Red Ribbon":{"count":72},"Schäfer's":{"count":146},"Sehne":{"count":91},"Stadtbäckerei":{"count":60},"Steinecke":{"count":268},"Sternenbäck":{"count":89},"Ströck":{"count":62},"Wiener Feinbäcker":{"count":55},"von Allwörden":{"count":65},"Булочная":{"count":71},"Горячий хлеб":{"count":54},"Каравай":{"count":56},"Кулиничи":{"count":121},"Кулиничі":{"count":59},"Свежий хлеб":{"count":68},"Хлеб":{"count":177},"مخبز":{"count":72},"مخبزة":{"count":55},"نان لواش":{"count":54},"نانوایی":{"count":665},"نانوایی بربری":{"count":140},"نانوایی سنگک":{"count":68},"نانوایی سنگکی":{"count":52},"نانوایی لواش":{"count":63}},"beauty":{"Marionnaud":{"count":54},"Sally Beauty Supply":{"count":151},"Yves Rocher":{"count":654}},"bed":{"Dänisches Bettenlager":{"count":157},"Matratzen Concord":{"count":361},"Mattress Firm":{"count":173},"Sleepy's":{"count":52}},"beverages":{"50嵐":{"count":101},"Dursty":{"count":77},"Edeka Getränkemarkt":{"count":69},"Fristo":{"count":88},"Getränke Hoffmann":{"count":187},"Getränkeland":{"count":81},"Getränkemarkt":{"count":110},"Orterer Getränkemarkt":{"count":64},"Rewe Getränkemarkt":{"count":256},"Trinkgut":{"count":112},"茶湯會":{"count":56}},"bicycle":{"Giant":{"count":52},"Halfords":{"count":158},"Веломарка":{"count":51},"サイクルベースあさひ":{"count":87}},"bookmaker":{"Betfred":{"count":320},"Coral":{"count":466},"Ladbrokes":{"count":629},"Paddy Power":{"count":127},"William Hill":{"count":634},"ΟΠΑΠ":{"count":102}},"butcher":{"Boucherie Charcuterie":{"count":51},"Carnicería":{"count":78},"Fleischerei Richter":{"count":51},"Húsbolt":{"count":52},"Macelleria":{"count":84},"Vinzenzmurr":{"count":55},"Ариант":{"count":84},"Великолукский мясокомбинат":{"count":173},"Мясная лавка":{"count":226},"Мясницкий ряд":{"count":64},"Мясной":{"count":53},"Мясо":{"count":156},"Наша Ряба":{"count":60},"Свежее мясо":{"count":111}},"car":{"Audi":{"count":191},"BMW":{"count":216},"Chevrolet":{"count":259},"Citroën":{"count":445},"Dacia":{"count":56},"Fiat":{"count":167},"Ford":{"count":446},"Honda":{"count":348},"Hyundai":{"count":421},"Isuzu":{"count":66},"Kia":{"count":456},"Land Rover":{"count":54},"Lexus":{"count":76},"Mazda":{"count":193},"Mercedes-Benz":{"count":447},"Mitsubishi":{"count":176},"Mitsubishi Motors":{"count":60},"NISSAN":{"count":51},"Nissan":{"count":424},"Opel":{"count":218},"Peugeot":{"count":527},"Porsche":{"count":97},"Renault":{"count":701},"Seat":{"count":90},"Skoda":{"count":143},"Subaru":{"count":118},"Suzuki":{"count":178},"Toyota":{"count":597},"Volkswagen":{"count":371},"Volvo":{"count":180}},"car_parts":{"Advance Auto Parts":{"count":306},"AutoZone":{"count":759},"Brezan":{"count":95},"Halfords":{"count":95},"NAPA Auto Parts":{"count":250},"Napa Auto Parts":{"count":61},"O'Reilly Auto Parts":{"count":374},"Repco":{"count":77},"Tokić":{"count":61},"repuestos automotrices":{"count":56},"Автозапчастини":{"count":61},"Автомир":{"count":53},"イエローハット":{"count":80},"オートバックス":{"count":91},"タイヤ館":{"count":83}},"car_repair":{"A.T.U":{"count":457},"Advance Auto Parts":{"count":290},"Borracharia":{"count":56},"Bosch Car Service":{"count":65},"Carglass":{"count":234},"Citroën":{"count":108},"Euromaster":{"count":142},"Feu Vert":{"count":178},"Firestone":{"count":224},"Firestone Complete Auto Care":{"count":73},"Ford":{"count":61},"Garage Renault":{"count":84},"Gomeria":{"count":153},"Gomería":{"count":107},"Goodyear":{"count":97},"Grease Monkey":{"count":57},"Halfords":{"count":56},"Jiffy Lube":{"count":464},"Kwik Fit":{"count":249},"Lubricentro":{"count":83},"Meineke":{"count":52},"Mekonomen":{"count":59},"Midas":{"count":462},"Mr. Lube":{"count":56},"NAPA Auto Parts":{"count":82},"Norauto":{"count":257},"O'Reilly Auto Parts":{"count":227},"Pep Boys":{"count":79},"Peugeot":{"count":152},"Pit Stop":{"count":84},"Point S":{"count":59},"Renault":{"count":294},"Roady":{"count":82},"Sears Auto Center":{"count":59},"Speedy":{"count":192},"Stacja Kontroli Pojazdów":{"count":70},"Taller":{"count":63},"Toyota":{"count":63},"Valvoline":{"count":52},"Valvoline Instant Oil Change":{"count":92},"Wulkanizacja":{"count":84},"ÖAMTC":{"count":52},"Автомастерская":{"count":93},"Авторемонт":{"count":57},"Автосервис":{"count":799},"Автосервис+шиномонтаж":{"count":66},"Вулканизация":{"count":72},"Замена масла":{"count":98},"СТО":{"count":1058},"Шиномонтаж":{"count":3591},"шиномонтаж":{"count":173}},"carpet":{"Carpet Right":{"count":111},"Carpetright":{"count":53}},"charity":{"Age UK":{"count":116},"Barnardo's":{"count":56},"British Heart Foundation":{"count":189},"Cancer Research UK":{"count":129},"Goodwill":{"count":120},"Oxfam":{"count":216},"Salvation Army":{"count":63},"Scope":{"count":74},"Sue Ryder":{"count":83}},"chemist":{"7 Дней":{"count":55},"Bipa":{"count":485},"Budnikowsky":{"count":114},"CVS":{"count":58},"Etos":{"count":486},"Kruidvat":{"count":1169},"Matas":{"count":74},"Müller":{"count":350},"Rossmann":{"count":2516},"Schlecker":{"count":51},"Teta":{"count":120},"Trekpleister":{"count":185},"Walgreens":{"count":142},"Watsons":{"count":123},"dm":{"count":1877},"Бытовая химия":{"count":73},"Магнит Косметик":{"count":233},"Мила":{"count":70},"Остров чистоты":{"count":110},"Рубль Бум":{"count":68},"Улыбка радуги":{"count":110},"スギ薬局":{"count":51},"丁丁藥局":{"count":72},"屈臣氏":{"count":134},"康是美":{"count":81}},"clothes":{"AOKI":{"count":119},"AWG":{"count":95},"Ackermans":{"count":98},"Adidas":{"count":224},"Adler":{"count":83},"American Apparel":{"count":89},"American Eagle Outfitters":{"count":93},"Anthropologie":{"count":55},"Ardene":{"count":55},"Armand Thiery":{"count":89},"Banana Republic":{"count":120},"Benetton":{"count":190},"Bershka":{"count":166},"Bonita":{"count":315},"Bonobo":{"count":59},"Brooks Brothers":{"count":55},"Burberry":{"count":63},"Burlington Coat Factory":{"count":104},"Burton":{"count":94},"C&A":{"count":860},"Cache Cache":{"count":59},"Calvin Klein":{"count":78},"Calzedonia":{"count":264},"Camaïeu":{"count":167},"Caroll":{"count":75},"Carter's":{"count":64},"Cecil":{"count":119},"Celio":{"count":206},"Charles Vögele":{"count":133},"Chico's":{"count":96},"Cropp":{"count":68},"Cubus":{"count":65},"Desigual":{"count":175},"Devred":{"count":59},"Didi":{"count":72},"Diesel":{"count":77},"Dorothy Perkins":{"count":85},"Dress Barn":{"count":135},"Dressmann":{"count":67},"Eddie Bauer":{"count":54},"Edgars":{"count":117},"Engbers":{"count":64},"Ernsting's family":{"count":720},"Esprit":{"count":404},"Etam":{"count":121},"Express":{"count":56},"Fat Face":{"count":82},"Forever 21":{"count":124},"Gant":{"count":78},"Gap":{"count":258},"Gerry Weber":{"count":220},"Gina Laura":{"count":80},"Goodwill":{"count":65},"Guess":{"count":146},"Gymboree":{"count":60},"Gémo":{"count":99},"H&M":{"count":1467},"Hallhuber":{"count":63},"House":{"count":67},"Hugo Boss":{"count":109},"Humana":{"count":83},"Hunkemöller":{"count":224},"Intimissimi":{"count":173},"JBC":{"count":54},"Jack & Jones":{"count":174},"Jack Wolfskin":{"count":68},"Jeans Fritz":{"count":110},"Jennyfer":{"count":81},"Jet":{"count":68},"Jigsaw":{"count":51},"Jules":{"count":120},"Justice":{"count":81},"KappAhl":{"count":68},"KiK":{"count":1862},"Kiabi":{"count":276},"La Halle":{"count":148},"Lacoste":{"count":193},"Lane Bryant":{"count":86},"Levi's":{"count":197},"Lindex":{"count":120},"Loft":{"count":62},"Mango":{"count":339},"Marc O'Polo":{"count":82},"Mark's":{"count":76},"Marks & Spencer":{"count":53},"Marshalls":{"count":218},"Massimo Dutti":{"count":109},"Matalan":{"count":144},"Maurices":{"count":70},"Max Mara":{"count":55},"Men's Wearhouse":{"count":128},"Mexx":{"count":68},"Michael Kors":{"count":55},"Mim":{"count":57},"Monsoon":{"count":75},"Mr Price":{"count":99},"NKD":{"count":783},"New Look":{"count":280},"New Yorker":{"count":350},"NewYorker":{"count":54},"Next":{"count":313},"Nike":{"count":122},"Nordstrom Rack":{"count":57},"OVS":{"count":92},"Okaïdi":{"count":63},"Old Navy":{"count":361},"Only":{"count":94},"Orchestra":{"count":117},"Original Marines":{"count":60},"Orsay":{"count":168},"Outfit":{"count":51},"Outlet":{"count":63},"Palmers":{"count":78},"Peacocks":{"count":178},"Peek & Cloppenburg":{"count":69},"Pep":{"count":139},"Pepco":{"count":153},"Petit Bateau":{"count":67},"Pimkie":{"count":163},"Plato's Closet":{"count":53},"Primark":{"count":177},"Promod":{"count":195},"Pull & Bear":{"count":63},"Puma":{"count":65},"Reitmans":{"count":71},"Reserved":{"count":150},"River Island":{"count":125},"Ross":{"count":363},"Sela":{"count":58},"Sergent Major":{"count":77},"Shoeby":{"count":109},"Sisley":{"count":82},"Springfield":{"count":83},"Stefanel":{"count":63},"Steps":{"count":56},"Stradivarius":{"count":103},"Street One":{"count":153},"Superdry":{"count":82},"TJ Maxx":{"count":200},"TK Maxx":{"count":209},"Takko":{"count":843},"Talbots":{"count":54},"Tally Weijl":{"count":151},"Tati":{"count":64},"Terranova":{"count":63},"Tesha":{"count":76},"Tezenis":{"count":98},"The Children's Place":{"count":71},"The North Face":{"count":56},"The Sting":{"count":53},"Timberland":{"count":87},"Toko Pakaian":{"count":72},"Tom Tailor":{"count":120},"Tommy Hilfiger":{"count":206},"Topshop":{"count":62},"Triumph":{"count":132},"Truworths":{"count":72},"Ulla Popken":{"count":117},"Uniqlo":{"count":63},"United Colors of Benetton":{"count":210},"Urban Outfitters":{"count":130},"Vero Moda":{"count":222},"Victoria's Secret":{"count":143},"Vögele":{"count":191},"WE":{"count":68},"Wibra":{"count":99},"Winners":{"count":112},"Woolworths":{"count":119},"Yamamay":{"count":65},"Zara":{"count":540},"Zeeman":{"count":379},"mister*lady":{"count":59},"s.Oliver":{"count":103},"Детская одежда":{"count":59},"Женская одежда":{"count":65},"Липненски":{"count":81},"Московская ярмарка":{"count":51},"Одежда":{"count":163},"Смешные цены":{"count":86},"Спецодежда":{"count":85},"しまむら":{"count":213},"ユニクロ":{"count":201},"ワークマン":{"count":65},"洋服の青山":{"count":242},"西松屋":{"count":113}},"coffee":{"Café Amazon":{"count":212},"Nespresso":{"count":74},"Starbucks":{"count":264,"tags":{"cuisine":"coffee_shop"}},"Tchibo":{"count":197}},"computer":{"Apple Store":{"count":75},"DNS":{"count":234},"PC World":{"count":59},"ДНС":{"count":55}},"confectionery":{"Fagyizó":{"count":58},"Hussel":{"count":78},"Leonidas":{"count":84},"T. SN":{"count":77},"Thorntons":{"count":66}},"convenience":{"711":{"count":64},"777":{"count":58},"24 часа":{"count":85},"7-Eleven":{"count":11418},"8 à Huit":{"count":82},"99 Speedmart":{"count":85},"ABC":{"count":716},"AMPM":{"count":125},"Aibė":{"count":112},"Alepa":{"count":60},"Alfamart":{"count":427},"Alimentara":{"count":63},"Almacen":{"count":405},"Almacén":{"count":94},"Aral":{"count":93},"BP":{"count":273},"BP Shop":{"count":70},"Baqala":{"count":181},"Best One":{"count":57},"Best-One":{"count":63},"Biedronka":{"count":98},"Bodega":{"count":83},"Bonjour":{"count":71},"CBA":{"count":299},"COOP":{"count":470},"COOP Jednota":{"count":381},"CU":{"count":324},"Carrefour City":{"count":91},"Carrefour Express":{"count":255},"Casey's General Store":{"count":225},"Casino Shop":{"count":56},"Centra":{"count":139},"Central Convenience Store":{"count":69},"Chevron":{"count":110},"Circle K":{"count":790},"Citgo":{"count":73},"Co-Op":{"count":54},"Co-op":{"count":161},"Coles Express":{"count":217},"Coop":{"count":492},"Coop Jednota":{"count":128},"Corner Store":{"count":109},"Costcutter":{"count":435},"Couche-Tard":{"count":139},"Cumberland Farms":{"count":109},"Daisy Mart":{"count":57},"Delikatesy":{"count":148},"Delikatesy Centrum":{"count":182},"Dollar General":{"count":646},"Dollar Tree":{"count":67},"Dépanneur":{"count":53},"Esso":{"count":143},"Express":{"count":53},"Extra":{"count":86},"Exxon":{"count":51},"Family Dollar":{"count":85},"FamilyMart":{"count":919},"Food Mart":{"count":512},"Four Square":{"count":99},"Franprix":{"count":96},"Fresh":{"count":67},"Freshmarket":{"count":224},"GS25":{"count":343},"Groszek":{"count":254},"Hasty Market":{"count":87},"Holiday":{"count":67},"Hruška":{"count":89},"Indomaret":{"count":483},"Jednota":{"count":66},"Joker":{"count":56},"K-Market":{"count":104},"Kangaroo":{"count":54},"Kangaroo Express":{"count":51},"Kisbolt":{"count":94},"Konzum":{"count":229},"Kum & Go":{"count":127},"Kwik Trip":{"count":134},"Lawson":{"count":311},"Lewiatan":{"count":565},"Lifestyle Express":{"count":114},"Londis":{"count":505},"M&S Simply Food":{"count":72},"Mac's":{"count":295},"Mace":{"count":166},"Magazin":{"count":81},"Magazin Mixt":{"count":139},"Magazin Non-Stop":{"count":62},"Magazin mixt":{"count":57},"Marathon":{"count":59},"Maxikiosco":{"count":86},"Małpka Express":{"count":71},"McColl's":{"count":289},"Mercator":{"count":122},"Migrolino":{"count":63},"Mini ABC":{"count":77},"Mini Market":{"count":1312},"Mini Market Non-Stop":{"count":134},"Mini Mart":{"count":78},"Mini Stop":{"count":466},"Minimercado":{"count":77},"Mlin i pekare":{"count":63},"Mobil":{"count":82},"Nasz Sklep":{"count":92},"Nisa":{"count":70},"Nisa Local":{"count":164},"OK":{"count":107},"OK-Mart":{"count":51},"OK便利商店":{"count":96},"OK便利店 Circle K":{"count":92},"Odido":{"count":148},"On The Run":{"count":53},"On the Run":{"count":111},"One Stop":{"count":294},"Oxxo":{"count":2261},"Parduotuvė":{"count":102},"Petit Casino":{"count":297},"Plaid Pantry":{"count":69},"Potraviny":{"count":438},"Prehrana":{"count":88},"Premier":{"count":321},"Proxi":{"count":249},"Proxy":{"count":53},"Pulperia":{"count":56},"Pulpería":{"count":51},"QuikTrip":{"count":161},"Rite Aid":{"count":72},"Royal Farms":{"count":90},"Sainsbury's Local":{"count":208},"Sale":{"count":89},"Sari-sari Store":{"count":82},"Select":{"count":133},"Sheetz":{"count":137},"Shell":{"count":479},"Shell Select":{"count":71},"Shop & Go":{"count":80},"Siwa":{"count":157},"Sklep spożywczy":{"count":151},"Smíšené zboží":{"count":57},"Spar":{"count":1472},"Speedway":{"count":108},"Społem":{"count":199},"Spätkauf":{"count":60},"Statoil":{"count":62},"Stewart's":{"count":255},"Stores":{"count":70},"Stripes":{"count":63},"Studenac":{"count":113},"Sunkus":{"count":51},"Sunoco":{"count":65},"Słoneczko":{"count":61},"TESCO Lotus Express":{"count":55},"Tchibo":{"count":75},"Tesco":{"count":54},"Tesco Express":{"count":661},"Tesco Lotus Express":{"count":107},"The Co-operative Food":{"count":341},"Tom Market 89":{"count":232},"Total":{"count":172},"United Dairy Farmers":{"count":55},"Utile":{"count":63},"Valero":{"count":71},"Vegyesbolt":{"count":391},"Večerka":{"count":131},"Vival":{"count":381},"Volg":{"count":149},"Wawa":{"count":279},"Weltladen":{"count":64},"Woolworths Petrol":{"count":97},"abc":{"count":374},"ampm":{"count":152},"best-one":{"count":52},"odido":{"count":77},"Élelmiszer":{"count":59},"Élelmiszerbolt":{"count":65},"Żabka":{"count":1656},"Žabka":{"count":61},"АТБ":{"count":56},"Августина":{"count":52},"Авоська":{"count":115},"Агрокомплекс":{"count":79},"Альянс":{"count":51},"Апельсин":{"count":72},"Ассорти":{"count":118},"Белорусские продукты":{"count":58},"Берёзка":{"count":193},"Везунчик":{"count":66},"Верный":{"count":61},"Весна":{"count":101},"Ветеран":{"count":56},"Визит":{"count":99},"Виктория":{"count":164},"ВкусВилл":{"count":131},"Гастроном":{"count":383},"Гермес":{"count":68},"Гроздь":{"count":52},"Гурман":{"count":92},"Дикси":{"count":270},"Домашний":{"count":77},"Евроопт":{"count":152},"Елена":{"count":68},"Ермолино":{"count":51},"КазМунайГаз":{"count":117},"Калинка":{"count":61},"Каравай":{"count":52},"Квартал":{"count":57},"Кировский":{"count":86},"Колобок":{"count":51},"Колосок":{"count":58},"Копеечка":{"count":99},"Копейка":{"count":65},"Корзинка":{"count":54},"Крамниця":{"count":64},"Кристалл":{"count":57},"Кулинария":{"count":134},"Купец":{"count":64},"Ласточка":{"count":51},"Лидер":{"count":60},"Любимый":{"count":84},"Люкс":{"count":59},"Магазин при АЗС":{"count":54},"Магнит":{"count":1991},"Магнолия":{"count":88},"Мария-Ра":{"count":197},"Маяк":{"count":76},"Меркурий":{"count":77},"Мечта":{"count":103},"Минимаркет":{"count":424},"Мираж":{"count":56},"Монетка":{"count":165},"Надежда":{"count":115},"Ника":{"count":57},"Оазис":{"count":57},"Олимп":{"count":51},"Перекресток":{"count":157},"Подсолнух":{"count":69},"Престиж":{"count":58},"Продукти":{"count":1446},"Продуктовый":{"count":307},"Продуктовый магазин":{"count":803},"Продукты":{"count":8416},"Продукты 24":{"count":65},"Пятёрочка":{"count":1324},"Радуга":{"count":165},"Родны кут":{"count":90},"Ромашка":{"count":83},"Русь":{"count":61},"Светлана":{"count":96},"Сказка":{"count":62},"Смак":{"count":151},"Солнечный":{"count":54},"Солнышко":{"count":54},"Татьяна":{"count":68},"Теремок":{"count":105},"Тройка":{"count":62},"У Палыча":{"count":69},"Универсам":{"count":153},"Фортуна":{"count":97},"Хороший":{"count":55},"Центральный":{"count":73},"Чайка":{"count":57},"Шанс":{"count":60},"Эконом":{"count":72},"Юбилейный":{"count":56},"Юлия":{"count":58},"продукты":{"count":157},"მარკეტი":{"count":134},"მარკეტი (Market)":{"count":71},"サンクス":{"count":970,"tags":{"name:en":"sunkus"}},"サークルK":{"count":1109,"tags":{"name:en":"Circle K"}},"スリーエフ":{"count":228},"セイコーマート":{"count":449},"セブンイレブン":{"count":7859,"tags":{"name:en":"7-Eleven"}},"セブンイレブン(Seven-Eleven)":{"count":332},"セーブオン":{"count":71},"デイリーヤマザキ":{"count":421},"ファミリーマート":{"count":4457,"tags":{"name:en":"FamilyMart"}},"ポプラ":{"count":101},"ミニストップ":{"count":773,"tags":{"name:en":"MINISTOP"}},"ヤマザキショップ":{"count":106},"ローソン":{"count":4247,"tags":{"name:en":"LAWSON"}},"ローソンストア100":{"count":272},"全家":{"count":482},"全家便利商店":{"count":833},"萊爾富":{"count":405},"세븐일레븐":{"count":157}},"copyshop":{"FedEx Office":{"count":53},"FedEx Office Print and Ship Center":{"count":170}},"cosmetics":{"Douglas":{"count":58},"Lush":{"count":80},"Marionnaud":{"count":55},"Sephora":{"count":184},"The Body Shop":{"count":95},"Yves Rocher":{"count":111},"Л'Этуаль":{"count":111},"Магнит Косметик":{"count":116},"Магнит косметик":{"count":63},"Магнит-Косметик":{"count":55},"Мила":{"count":68},"Подружка":{"count":51}},"craft":{"Hobby Lobby":{"count":96},"Michaels":{"count":222}},"deli":{"ほっともっと":{"count":58}},"department_store":{"Argos":{"count":90},"Bed Bath & Beyond":{"count":72},"Big Lots":{"count":142},"Big W":{"count":120},"Canadian Tire":{"count":176},"Coppel":{"count":55},"Debenhams":{"count":118},"Dillard's":{"count":86},"Dollar General":{"count":62},"Dollar Tree":{"count":64},"El Corte Inglés":{"count":61},"Family Dollar":{"count":76},"Fred Meyer":{"count":51},"Galeria Kaufhof":{"count":60},"HEMA":{"count":248},"Harvey Norman":{"count":62},"JCPenney":{"count":365},"Karstadt":{"count":66},"Kmart":{"count":390},"Kohl's":{"count":371},"Lojas Americanas":{"count":63},"Macy's":{"count":292},"Marks & Spencer":{"count":136},"Marshalls":{"count":58},"Myer":{"count":51},"Nordstrom":{"count":54},"Sam's Club":{"count":103},"Sears":{"count":462},"Shopko":{"count":65},"Target":{"count":1104},"The Warehouse":{"count":68},"Walmart":{"count":847},"Walmart Supercenter":{"count":234},"Woolworth":{"count":153},"Магнит":{"count":88},"Универмаг":{"count":170}},"doityourself":{"Ace Hardware":{"count":300},"B&Q":{"count":229},"Bauhaus":{"count":223},"Biltema":{"count":64},"Brico":{"count":126},"Bricomarché":{"count":425},"Bricorama":{"count":117},"Bunnings Warehouse":{"count":210},"Canadian Tire":{"count":138},"Castorama":{"count":168},"Easy":{"count":53},"Gamma":{"count":133},"Globus Baumarkt":{"count":52},"Hagebaumarkt":{"count":132},"Hellweg":{"count":70},"Home Depot":{"count":1345},"Home Hardware":{"count":172},"Homebase":{"count":205},"Hornbach":{"count":134},"Hubo":{"count":107},"Karwei":{"count":77},"Lagerhaus":{"count":116},"Leroy Merlin":{"count":285},"Lowe's":{"count":1236},"Lowes":{"count":95},"Menards":{"count":132},"Mr Bricolage":{"count":112},"Mr.Bricolage":{"count":139},"OBI":{"count":501},"Point P":{"count":125},"Praktiker":{"count":54},"Praxis":{"count":61},"Rona":{"count":77},"Screwfix":{"count":80},"Sonderpreis Baumarkt":{"count":68},"Tekzen":{"count":112},"Toom Baumarkt":{"count":155},"Weldom":{"count":110},"Wickes":{"count":159},"Леруа Мерлен":{"count":54},"Мастер":{"count":59},"Сантехника":{"count":51},"Строитель":{"count":67},"Стройматериалы":{"count":506},"Хозтовары":{"count":137},"カインズホーム":{"count":51},"コメリ":{"count":137},"コーナン":{"count":77}},"dry_cleaning":{"Cleaners":{"count":103},"Pressing":{"count":58},"Диана":{"count":88},"Химчистка":{"count":73},"ホワイト急便":{"count":136}},"electronics":{"Apple Store":{"count":63},"BCC":{"count":54},"Batteries Plus Bulbs":{"count":74},"Bell":{"count":73},"Best Buy":{"count":706},"Boulanger":{"count":71},"Currys":{"count":109},"Currys PC World":{"count":70},"DNS":{"count":111},"Darty":{"count":168},"Elektra":{"count":64},"Elgiganten":{"count":67},"Euronics":{"count":247},"Expert":{"count":224},"Hartlauer":{"count":64},"Interdiscount":{"count":57},"La Curacao":{"count":69},"Maplin":{"count":114},"Media Expert":{"count":163},"Media Markt":{"count":422},"Musimundo":{"count":53},"Neonet":{"count":97},"RTV Euro AGD":{"count":68},"Radio Shack":{"count":485},"Rogers":{"count":61},"Samsung":{"count":164},"Saturn":{"count":155},"Sony":{"count":51},"The Source":{"count":91},"Unieuro":{"count":66},"М.Видео":{"count":121},"Фокстрот":{"count":76},"Эксперт":{"count":70},"Эльдорадо":{"count":313},"エディオン":{"count":74},"ケーズデンキ":{"count":136},"コジマ":{"count":53},"ヤマダ電機":{"count":162},"全國電子":{"count":72},"燦坤3C":{"count":52}},"erotic":{"Orion":{"count":85}},"fabric":{"Ткани":{"count":121}},"farm":{"Hofladen":{"count":63}},"florist":{"Blume 2000":{"count":94},"Blumen Risse":{"count":69},"Fleuriste":{"count":54},"Interflora":{"count":78},"Monceau Fleurs":{"count":69},"Virágbolt":{"count":64},"Квіти":{"count":86},"Цветочный магазин":{"count":57},"Цветы":{"count":1098}},"frame":{"rumah penduduk":{"count":316}},"funeral_directors":{"The Co-operative Funeralcare":{"count":82},"Ритуальные услуги":{"count":133}},"furniture":{"Aaron's":{"count":57},"Black Red White":{"count":79},"Bodzio":{"count":61},"But":{"count":162},"Casa":{"count":62},"Conforama":{"count":174},"DFS":{"count":52},"Dänisches Bettenlager":{"count":464},"Fly":{"count":53},"Harveys":{"count":58},"IKEA":{"count":234},"JYSK":{"count":431},"Kwantum":{"count":54},"Leen Bakker":{"count":72},"Pier 1 Imports":{"count":95},"Roller":{"count":99},"The Brick":{"count":68},"Меблі":{"count":70},"ニトリ":{"count":93}},"garden_centre":{"Dehner":{"count":59},"Gamm Vert":{"count":210},"Jardiland":{"count":124},"Point Vert":{"count":68},"Welkoop":{"count":97},"Семена":{"count":53}},"gift":{"Card Factory":{"count":116},"Hallmark":{"count":163},"Подарки":{"count":56}},"greengrocer":{"Frutería":{"count":60},"Овощи и фрукты":{"count":71}},"hairdresser":{"Berber":{"count":71},"Cost Cutters":{"count":69},"Fantastic Sams":{"count":53},"Figaro":{"count":79},"First Choice Haircutters":{"count":51},"Franck Provost":{"count":136},"Frizerie":{"count":59},"Great Clips":{"count":578},"Haarmonie":{"count":79},"Haarscharf":{"count":59},"Hair Cuttery":{"count":121},"Hairkiller":{"count":73},"Jean Louis David":{"count":90},"Jean-Louis David":{"count":59},"Klier":{"count":239},"Klipp":{"count":76},"Le Salon":{"count":55},"Marco Aldany":{"count":55},"Peluquería":{"count":165},"Salon fryzjerski":{"count":52},"Sport Clips":{"count":114},"Super Cuts":{"count":55},"Supercuts":{"count":359},"Tchip":{"count":62},"The Barber Shop":{"count":130},"Toni & Guy":{"count":77},"Top Hair":{"count":74},"Виктория":{"count":53},"Елена":{"count":53},"Локон":{"count":67},"Парикмахерская":{"count":798},"Перукарня":{"count":119},"Салон красоты":{"count":58},"Стиль":{"count":94},"Шарм":{"count":79},"حلاق":{"count":65}},"hardware":{"1000 мелочей":{"count":125},"Ferretería":{"count":295},"Harbor Freight Tools":{"count":57},"Home Hardware":{"count":94},"Lowe's":{"count":74},"Quincaillerie":{"count":105},"True Value":{"count":52},"Würth":{"count":51},"Промтовары":{"count":67},"Сантехника":{"count":87},"Стройматериалы":{"count":142},"Товары для дома":{"count":69},"Хозтовары":{"count":477}},"hearing_aids":{"Amplifon":{"count":124},"Geers":{"count":66},"Kind Hörgeräte":{"count":74},"amplifon":{"count":52}},"hifi":{"Bang & Olufsen":{"count":51}},"houseware":{"Blokker":{"count":264},"Marskramer":{"count":72},"Xenos":{"count":119}},"interior_decoration":{"Casa":{"count":65},"Depot":{"count":97}},"jewelry":{"585":{"count":94},"Apart":{"count":53},"Bijou Brigitte":{"count":172},"Christ":{"count":116},"Claire's":{"count":99},"Ernest Jones":{"count":53},"H Samuel":{"count":55},"James Avery Jewelry":{"count":99},"Julien d'Orcel":{"count":123},"Kay Jewelers":{"count":78},"Pandora":{"count":280},"Swarovski":{"count":240},"Адамас":{"count":60},"Золото":{"count":51}},"kiosk":{"Aral":{"count":76},"Edicola":{"count":94},"Esso":{"count":51},"KIOS":{"count":288},"Kiosko":{"count":62},"Kiosque":{"count":68},"Kolporter":{"count":88},"Lietuvos spauda":{"count":62},"Narvesen":{"count":188},"Pressbyrån":{"count":117},"Pulpería":{"count":61},"R-Kioski":{"count":352},"Relay":{"count":61},"Ruch":{"count":187},"Shell":{"count":122},"Tabak Trafik":{"count":83},"Tisak":{"count":245},"Trafik":{"count":221},"Trafika":{"count":64},"Trinkhalle":{"count":98},"Warung":{"count":73},"Белсоюзпечать":{"count":59},"Киоск":{"count":143},"Продукты":{"count":212},"Роспечать":{"count":233},"Союзпечать":{"count":94},"მარკეტი (Market)":{"count":94}},"kitchen":{"Cuisinella":{"count":60},"Home Utensils":{"count":65}},"laundry":{"Launderette":{"count":51},"Lavandería":{"count":84},"コインランドリー":{"count":64}},"lottery":{"Loteria de la Provincia":{"count":63},"Lotería Nacional":{"count":221},"Lotería de la Provincia":{"count":349},"Lotto":{"count":192},"Lottózó":{"count":69},"ONCE":{"count":91}},"mall":{"Торговый центр":{"count":57}},"massage":{"Massage Envy":{"count":80}},"medical_supply":{"Pofam-Poznań":{"count":61}},"mobile_phone":{"3 Store":{"count":90},"AT&T":{"count":558},"Bell":{"count":140},"Bitė":{"count":66},"Boost Mobile":{"count":151},"Carphone Warehouse":{"count":357},"Claro":{"count":446},"Cricket Wireless":{"count":73},"Digicel":{"count":152},"EE":{"count":190},"MetroPCS":{"count":201},"Movistar":{"count":411},"O2":{"count":527},"Orange":{"count":730},"Personal":{"count":54},"Play":{"count":150},"Plus":{"count":122},"Rogers":{"count":52},"SFR":{"count":156},"Samsung":{"count":71},"Sprint":{"count":394},"T-Mobile":{"count":665},"TIM":{"count":67},"Telcel":{"count":52},"Tele2":{"count":186},"Telekom":{"count":148},"Telekom Shop":{"count":99},"Telenor":{"count":99},"Telus":{"count":69},"The Phone House":{"count":137},"Three":{"count":57},"Tim":{"count":51},"Télécentre":{"count":76},"Verizon":{"count":152},"Verizon Wireless":{"count":629},"Vodafone":{"count":1168},"Vodafone Shop":{"count":52},"Wind":{"count":156},"Yoigo":{"count":61},"au":{"count":136},"auショップ":{"count":340},"mobilcom debitel":{"count":63},"Алло":{"count":86},"Билайн":{"count":441},"Евросеть":{"count":1020},"Київстар":{"count":57},"МТС":{"count":1012},"Мегафон":{"count":687},"Связной":{"count":842},"Теле2":{"count":70},"ソフトバンクショップ":{"count":482},"ドコモショップ":{"count":426}},"money_lender":{"Money Mart":{"count":95}},"motorcycle":{"Harley Davidson":{"count":81},"Honda":{"count":238},"Suzuki":{"count":90},"Yamaha":{"count":235}},"music":{"HMV":{"count":81},"TSUTAYA":{"count":53}},"musical_instrument":{"Guitar Center":{"count":51}},"newsagent":{"Edicola":{"count":111},"Kolporter":{"count":56},"Maison de la Presse":{"count":132},"Relay":{"count":246},"Tabac Presse":{"count":82},"Trafika":{"count":60},"WHSmith":{"count":160},"Белсоюзпечать":{"count":52},"Витебскоблсоюзпечать":{"count":56},"Первая полоса":{"count":57},"Печать":{"count":74},"Роспечать":{"count":371},"Союзпечать":{"count":130}},"optician":{"Alain Afflelou":{"count":204},"Apollo":{"count":441},"Atol":{"count":124},"Boots Opticians":{"count":101},"Fielmann":{"count":477},"General Óptica":{"count":53},"Grand Optical":{"count":57},"Générale d'Optique":{"count":94},"Hakim Optical":{"count":73},"Hans Anders":{"count":105},"Krys":{"count":192},"Les Opticiens Mutualistes":{"count":103},"Optic 2000":{"count":281},"Optical Center":{"count":125},"Pearle":{"count":199},"Pearle Vision":{"count":52},"Specsavers":{"count":384},"Sunglass Hut":{"count":61},"Synoptik":{"count":55},"Vision Express":{"count":183},"แว่นท็อปเจริญ":{"count":97},"メガネスーパー":{"count":62},"眼鏡市場":{"count":206}},"outdoor":{"Jack Wolfskin":{"count":51},"Mountain Warehouse":{"count":74},"REI":{"count":77},"Рыболов":{"count":70}},"paint":{"Benjamin Moore":{"count":58},"Comex":{"count":68},"Jotun":{"count":51},"National Paints":{"count":53},"Sherwin Williams":{"count":323},"Sherwin-Williams Paints":{"count":59}},"pawnbroker":{"Cash Converters":{"count":83},"Lombard":{"count":55},"Palawan Pawnshop":{"count":52}},"pet":{"Das Futterhaus":{"count":158},"Fressnapf":{"count":620},"Global Pet Foods":{"count":54},"Maxi Zoo":{"count":65},"Pet Valu":{"count":112},"PetSmart":{"count":491},"Petco":{"count":377},"Pets at Home":{"count":170},"Бетховен":{"count":60},"Зоотовары":{"count":79},"Четыре лапы":{"count":56}},"second_hand":{"Goodwill":{"count":235},"Value Village":{"count":53}},"shoes":{"Adidas":{"count":51},"Aldo":{"count":74},"Bata":{"count":281},"Besson Chaussures":{"count":124},"Brantano":{"count":132},"CCC":{"count":245},"Camper":{"count":51},"Chaussea":{"count":102},"Clarks":{"count":268},"Converse":{"count":58},"Crocs":{"count":64},"DSW":{"count":52},"Deichmann":{"count":1231},"Dosenbach":{"count":58},"Ecco":{"count":185},"Famous Footwear":{"count":178},"Foot Locker":{"count":240},"Geox":{"count":151},"Kari":{"count":66},"La Halle aux Chaussures":{"count":158},"Mephisto":{"count":57},"Minelli":{"count":55},"New Balance":{"count":52},"Payless":{"count":56},"Payless Shoe Source":{"count":316},"Payless ShoeSource":{"count":133},"Quick Schuh":{"count":116},"Rack Room Shoes":{"count":51},"Reno":{"count":233},"Rieker":{"count":83},"Salamander":{"count":103},"San Marina":{"count":54},"Scapino":{"count":67},"Shoe Carnival":{"count":66},"Shoe Zone":{"count":161},"Siemes Schuhcenter":{"count":69},"Skechers":{"count":83},"Tamaris":{"count":99},"Timberland":{"count":51},"vanHaren":{"count":98},"Éram":{"count":88},"Ремонт обуви":{"count":71},"ЦентрОбувь":{"count":76},"Юничел":{"count":73},"東京靴流通センター":{"count":81}},"sports":{"Adidas":{"count":132},"Aktiesport":{"count":61},"Big 5 Sporting Goods":{"count":93},"Decathlon":{"count":409},"Dick's Sporting Goods":{"count":222},"Hervis":{"count":66},"Intersport":{"count":737},"JD Sports":{"count":58},"Nike":{"count":95},"Sport 2000":{"count":209},"Sports Authority":{"count":108},"Sports Direct":{"count":217},"Спортмастер":{"count":208},"Спорттовары":{"count":68}},"stationery":{"Bureau Vallée":{"count":64},"Libro":{"count":73},"McPaper":{"count":158},"Office Depot":{"count":378},"Office Max":{"count":169},"Officeworks":{"count":73},"Pagro":{"count":64},"Paperchase":{"count":54},"Ryman":{"count":85},"Staples":{"count":671},"Канцтовары":{"count":140}},"supermarket":{"7-Eleven":{"count":60},"A&O":{"count":67},"A101":{"count":388},"AD Delhaize":{"count":80},"ADEG":{"count":85},"Ahorramás":{"count":66},"Albert":{"count":245},"Albert Heijn":{"count":766},"Albertsons":{"count":316},"Aldi":{"count":6323},"Aldi Nord":{"count":356},"Aldi Süd":{"count":916},"Alfamart":{"count":109},"Alimerka":{"count":96},"Alnatura":{"count":97},"Asda":{"count":474},"Atac":{"count":53},"Atacadão":{"count":80},"Auchan":{"count":229},"BM":{"count":52},"Biedronka":{"count":2348},"Big C":{"count":53},"Billa":{"count":1592},"Bim":{"count":678},"Biocoop":{"count":159},"Bodega Aurrera":{"count":264},"Budgens":{"count":77},"Bulk Barn":{"count":54},"Bunnpris":{"count":69},"CBA":{"count":236},"CONAD":{"count":67},"COOP":{"count":255},"COOP Jednota":{"count":177},"CRAI":{"count":66},"CU":{"count":64},"Caprabo":{"count":144},"Cargills Food City":{"count":79},"Carrefour":{"count":2544},"Carrefour City":{"count":349},"Carrefour Contact":{"count":270},"Carrefour Express":{"count":921},"Centra":{"count":63},"Centre Commercial E. Leclerc":{"count":385},"Checkers":{"count":140},"Chedraui":{"count":80},"Co-Op":{"count":62},"Co-op":{"count":352},"Co-operative":{"count":51},"Coles":{"count":583},"Colmado":{"count":103},"Colruyt":{"count":212},"Combi":{"count":127},"Comercial Mexicana":{"count":59},"Conad":{"count":560},"Conad City":{"count":95},"Condis":{"count":126},"Consum":{"count":236},"Continente":{"count":111},"Coop":{"count":1665},"Coop Extra":{"count":88},"Coop Jednota":{"count":101},"Coop Konsum":{"count":96},"Costco Gasoline":{"count":295},"Costcutter":{"count":93},"Coto":{"count":65},"Countdown":{"count":135},"Coviran":{"count":124},"Covirán":{"count":51},"Crai":{"count":119},"Cub Foods":{"count":57},"Dagli'Brugsen":{"count":135},"Deen":{"count":55},"Delhaize":{"count":228},"Delikatesy Centrum":{"count":209},"Denner":{"count":412},"Despar":{"count":209},"Despensa Familiar":{"count":81},"Dia":{"count":1329},"Dia %":{"count":181},"Dia Market":{"count":60},"Dino":{"count":298},"Dirk van den Broek":{"count":66},"Disco":{"count":74},"Diska":{"count":68},"Dollar General":{"count":106},"Dollar Tree":{"count":52},"Dunnes Stores":{"count":72},"E-Center":{"count":66},"E. Leclerc":{"count":186},"E. Leclerc Drive":{"count":97},"EKO":{"count":78},"EMTÉ":{"count":74},"Edeka":{"count":2231},"Ekom":{"count":64},"Ekono":{"count":68},"El Árbol":{"count":86},"Eroski":{"count":351},"Esselunga":{"count":106},"EuroSpin":{"count":81},"Eurospar":{"count":340},"Eurospin":{"count":328},"Extra":{"count":149},"Famiglia Cooperativa":{"count":89},"Famila":{"count":167},"Family Dollar":{"count":72},"Fareway":{"count":51},"Farmfoods":{"count":141},"Feneberg":{"count":64},"Food Basics":{"count":116},"Food Lion":{"count":425},"Foodland":{"count":192},"Foodworks":{"count":90},"Franprix":{"count":401},"Fred Meyer":{"count":70},"Freshmarket":{"count":86},"Froiz":{"count":97},"Føtex":{"count":74},"G20":{"count":71},"GS25":{"count":72},"Gadis":{"count":126},"Game":{"count":59},"Giant":{"count":276},"Giant Eagle":{"count":134},"Grand Frais":{"count":70},"Grocery Outlet":{"count":128},"Géant Casino":{"count":75},"H-E-B":{"count":274},"HIT":{"count":64},"Hannaford":{"count":95},"Harris Teeter":{"count":158},"Hemköp":{"count":87},"Heron Foods":{"count":55},"Hofer":{"count":484},"Hoogvliet":{"count":66},"Hruška":{"count":54},"Hy-Vee":{"count":121},"ICA":{"count":255},"ICA Kvantum":{"count":51},"IDEA":{"count":52},"IGA":{"count":568},"Iceland":{"count":538},"Indomaret":{"count":124},"Intermarché":{"count":1477},"Intermarché Contact":{"count":122},"Intermarché Super":{"count":261},"Interspar":{"count":117},"Irma":{"count":69},"Jewel-Osco":{"count":72},"Jumbo":{"count":476},"K+K":{"count":119},"Kaufland":{"count":1172},"King Soopers":{"count":99},"Kiwi":{"count":178},"Konsum":{"count":144},"Konzum":{"count":370},"Kroger":{"count":627},"Kvickly":{"count":60},"La Vie Claire":{"count":65},"Landi":{"count":54},"Leader Price":{"count":502},"Leclerc Drive":{"count":120},"Lewiatan":{"count":255},"Lider":{"count":78},"Lidl":{"count":8927},"Londis":{"count":52},"Lupa":{"count":79},"M&S Simply Food":{"count":52},"MPREIS":{"count":187},"Makro":{"count":226},"Markant":{"count":98},"Market Basket":{"count":57},"Marktkauf":{"count":117},"Match":{"count":139},"Maxi":{"count":198},"Maxi Dia":{"count":52},"Maxima":{"count":111},"Maxima X":{"count":158},"Maxima XX":{"count":69},"Mega Image":{"count":97},"Mego":{"count":52},"Meijer":{"count":129},"Meny":{"count":105},"Mercado Municipal":{"count":52},"Mercado de Abastos":{"count":57},"Mercadona":{"count":1228},"Mercator":{"count":155},"Merkur":{"count":132},"Metro":{"count":395},"Migros":{"count":641},"Mila":{"count":90},"Mini Market":{"count":81},"Minipreço":{"count":213},"Mix Markt":{"count":60},"Monoprix":{"count":283},"More":{"count":61},"Morrisons":{"count":443},"NORMA":{"count":144},"NP":{"count":251},"Nah & Frisch":{"count":107},"Nahkauf":{"count":324},"Netto":{"count":4429},"Netto Marken-Discount":{"count":706},"New World":{"count":89},"No Frills":{"count":177},"Norfa XL":{"count":66},"Norma":{"count":1162},"Oxxo":{"count":278},"PENNY":{"count":89},"PLUS":{"count":92},"POLOmarket":{"count":172},"Palí":{"count":69},"Pam":{"count":77},"Penny":{"count":2819},"Penny Markt":{"count":77},"Petit Casino":{"count":146},"Pick n Pay":{"count":268},"Piggly Wiggly":{"count":103},"Pingo Doce":{"count":308},"Piotr i Paweł":{"count":112},"Plaza Vea":{"count":68},"Plodine":{"count":67},"Poiesz":{"count":53},"Price Chopper":{"count":132},"Prix":{"count":53},"Profi":{"count":203},"Proxi":{"count":75},"Proxy Delhaize":{"count":63},"Publix":{"count":645},"Punto Simply":{"count":54},"Puregold":{"count":75},"Pão de Açúcar":{"count":76},"QFC":{"count":54},"REMA 1000":{"count":89},"Ralphs":{"count":81},"Real":{"count":210},"Real Canadian Superstore":{"count":69},"Reliance Fresh":{"count":95},"Rema 1000":{"count":394},"Rewe":{"count":2808},"Rewe City":{"count":78},"Rimi":{"count":115},"S-Market":{"count":110},"Safeway":{"count":619},"Sainsbury's":{"count":595},"Sainsbury's Local":{"count":248},"Sam's Club":{"count":303},"Santa Isabel":{"count":174},"Save-A-Lot":{"count":100,"tags":{"shop":"supermarket"}},"ShopRite":{"count":53},"Shoprite":{"count":337},"Sigma":{"count":107},"Simply Market":{"count":541},"Sky":{"count":113},"Smith's":{"count":56},"Sobeys":{"count":186},"Soriana":{"count":194},"Spar":{"count":3381},"Społem":{"count":120},"Sprouts Farmers Market":{"count":71},"Stokrotka":{"count":227},"Stop & Shop":{"count":147},"Super C":{"count":57},"Super U":{"count":654},"SuperBrugsen":{"count":183},"SuperValu":{"count":80},"Superama":{"count":51},"Supersol":{"count":51},"Superspar":{"count":54},"Tegut":{"count":118},"Tengelmann":{"count":155},"Tesco":{"count":1373},"Tesco Express":{"count":566},"Tesco Extra":{"count":200},"Tesco Lotus":{"count":95},"Tesco Metro":{"count":153},"The Co-operative":{"count":79},"The Co-operative Food":{"count":1261},"Tommy":{"count":56},"Tottus":{"count":82},"Trader Joe's":{"count":345},"Treff 3000":{"count":134},"U Express":{"count":129},"Unimarc":{"count":256},"Unimarkt":{"count":104},"Utile":{"count":68},"Vea":{"count":67},"Vival":{"count":80},"Volg":{"count":231},"Waitrose":{"count":301},"Walmart":{"count":1164},"Walmart Neighborhood Market":{"count":171},"Walmart Supercenter":{"count":688},"Wasgau":{"count":51},"Wegmans":{"count":89},"Wellcome":{"count":51},"Whole Foods Market":{"count":379,"tags":{"shop":"supermarket"}},"Willys":{"count":89},"WinCo Foods":{"count":53},"Winn Dixie":{"count":168},"Woolworths":{"count":816},"denn's Biomarkt":{"count":147},"fakta":{"count":296},"real":{"count":58},"tegut":{"count":89},"Şok":{"count":271},"Żabka":{"count":88},"ΑΒ Βασιλόπουλος":{"count":82},"Γαλαξίας":{"count":54},"Μασούτης":{"count":85},"Σκλαβενίτης":{"count":92},"АТБ":{"count":618},"Абсолют":{"count":51},"Авоська":{"count":60},"Азбука Вкуса":{"count":66},"Атак":{"count":85},"Ашан":{"count":80},"Верный":{"count":226},"Виктория":{"count":74},"Вопак":{"count":59},"Гастроном":{"count":54},"Гроздь":{"count":63},"Десяточка":{"count":52},"Дикси":{"count":1670},"Евроопт":{"count":201},"Карусель":{"count":68},"Квартал":{"count":77},"Кировский":{"count":54},"Командор":{"count":75},"Красный Яр":{"count":58},"Лента":{"count":165},"Магнит":{"count":4289},"Магнолия":{"count":121},"Мария-Ра":{"count":159},"Монетка":{"count":363},"Народная 7Я семьЯ":{"count":199},"Перекресток":{"count":501},"Покупочка":{"count":73},"Полушка":{"count":213},"Пятёрочка":{"count":3622},"Радеж":{"count":64},"Рукавичка":{"count":78},"Светофор":{"count":73},"Седьмой континент":{"count":69},"Семейный":{"count":52},"Семья":{"count":85},"Супермаркет":{"count":65},"Сільпо":{"count":203},"Таврія‑В":{"count":66},"Универсам":{"count":77},"Фора":{"count":162},"Фуршет":{"count":86},"Хүнсний дэлгүүр":{"count":63},"Эдельвейс":{"count":55},"хүнсний дэлгүүр":{"count":73},"بقالة":{"count":74},"سوپر مارکت":{"count":75},"سوپرمارکت":{"count":79},"いなげや":{"count":66},"まいばすけっと":{"count":162},"イオン":{"count":95},"イトーヨーカドー":{"count":67},"カスミ":{"count":56},"マックスバリュ":{"count":143},"マルエツ":{"count":99},"ライフ":{"count":125},"全聯":{"count":74},"全聯福利中心":{"count":241},"惠康 Wellcome":{"count":57},"業務スーパー":{"count":176},"美廉社":{"count":74},"西友":{"count":137}},"tailor":{"Atelier de couture":{"count":63}},"ticket":{"Boutique Grandes Lignes":{"count":60},"Guichet Transilien":{"count":243},"Касса":{"count":61},"Проездные билеты":{"count":65}},"tobacco":{"Dohánybolt":{"count":109},"Estanco":{"count":134},"Nemzeti Dohánybolt":{"count":926},"Tabacos":{"count":62},"Табакерка":{"count":73}},"toys":{"Dráčik":{"count":63},"Intertoys":{"count":242},"King Jouet":{"count":102},"La Grande Récré":{"count":112},"Maxi Toys":{"count":63},"Toys R Us":{"count":410,"tags":{"shop":"toys"}},"Детский мир":{"count":186},"Игрушки":{"count":95}},"travel_agency":{"D-reizen":{"count":64},"DER Reisebüro":{"count":52},"First Reisebüro":{"count":57},"Flight Centre":{"count":159},"Reiseland":{"count":52},"TUI":{"count":262},"The Co-operative Travel":{"count":58},"Thomas Cook":{"count":298},"Thomson":{"count":144}},"tyres":{"Borracharia":{"count":98},"Bridgestone":{"count":65},"Discount Tire":{"count":94},"Euromaster":{"count":76},"Firestone":{"count":57},"Gomeria":{"count":71},"Les Schwab Tire Center":{"count":59},"Vianor":{"count":52},"Вулканизация":{"count":113},"Шиномонтаж":{"count":419}},"variety_store":{"Action":{"count":147},"Bazar":{"count":56},"Big Bazar":{"count":60},"Big Lots":{"count":65},"Dollar General":{"count":345},"Dollar Tree":{"count":753},"Dollarama":{"count":404},"EuroShop":{"count":59},"Family Dollar":{"count":590},"Fix Price":{"count":97},"Fix price":{"count":127},"FixPrice":{"count":62},"GiFi":{"count":229},"Home Bargains":{"count":68},"Mäc-Geiz":{"count":59},"NOZ":{"count":82},"Poundland":{"count":197},"Poundworld":{"count":70},"Tedi":{"count":611},"ダイソー":{"count":226}},"video":{"Blockbuster":{"count":75},"Family Video":{"count":113},"TSUTAYA":{"count":122},"World of Video":{"count":53},"ゲオ":{"count":81}},"video_games":{"EB Games":{"count":101},"Game":{"count":76},"GameStop":{"count":676},"Micromania":{"count":83}}};
23607 var tourism = {"alpine_hut":{"КОШ":{"count":105}},"apartment":{"Двухкомнатная квартира на сутки":{"count":52}},"attraction":{"Arch":{"count":51},"Kursächsische Postmeilensäule":{"count":54},"Maibaum":{"count":52},"Moab trail":{"count":55},"Moai":{"count":702},"OWŚ":{"count":102},"Sommerrodelbahn":{"count":54},"path contiunes":{"count":75},"white blaze":{"count":53},"Кладбище еврейское":{"count":89},"Колесо обозрения":{"count":69},"Приусадебный парк":{"count":69},"Усадьба":{"count":53},"Хозяйственный двор":{"count":72},"Часовня":{"count":64},"дольмен":{"count":86}},"camp_site":{"Camping Municipal":{"count":198},"Camping municipal":{"count":80}},"guest_house":{"Casa":{"count":61},"Home":{"count":68},"OW \"Bielanka\"":{"count":54}},"hostel":{"Albergue de Peregrinos":{"count":67},"Hospedaje":{"count":70},"Hostal":{"count":124}},"hotel":{"B&B Hôtel":{"count":104},"B&b Hôtel":{"count":78},"Best Western":{"count":242},"Campanile":{"count":145},"Central Hotel":{"count":51},"City Hotel":{"count":74},"Comfort Inn":{"count":283},"Comfort Inn & Suites":{"count":67},"Comfort Suites":{"count":148},"Country Inn & Suites":{"count":83},"Courtyard by Marriott":{"count":155},"Crowne Plaza":{"count":85},"Days Inn":{"count":245},"Econo Lodge":{"count":70},"Embassy Suites":{"count":68},"Extended Stay America":{"count":102},"Fairfield Inn":{"count":60},"Fairfield Inn & Suites":{"count":67},"Formule 1":{"count":74},"Grand Hotel":{"count":90},"Hampton Inn":{"count":376},"Hampton Inn & Suites":{"count":96},"Hilton Garden Inn":{"count":183},"Holiday Inn":{"count":411},"Holiday Inn Express":{"count":479},"Holiday Inn Express & Suites":{"count":72},"Homewood Suites":{"count":61},"Hotel Central":{"count":92},"Hotel Europa":{"count":91},"Hotel Ibis":{"count":67},"Hotel Krone":{"count":58},"Hotel Panorama":{"count":61},"Hotel Plaza":{"count":62},"Hotel Post":{"count":60},"Hotel Royal":{"count":62},"Hotel Victoria":{"count":71},"Hotel zur Post":{"count":60},"Hôtel Ibis":{"count":70},"Hôtel de France":{"count":61},"Ibis":{"count":215},"Ibis Budget":{"count":188},"Ibis Styles":{"count":53},"Krone":{"count":68},"Kyriad":{"count":65},"La Quinta":{"count":54},"Marriott":{"count":57},"Mercure":{"count":109},"Motel 6":{"count":83},"Novotel":{"count":180},"Palace Hotel":{"count":54},"Park Hotel":{"count":88},"Parkhotel":{"count":64},"Premier Inn":{"count":400},"Première Classe":{"count":62},"Quality Inn":{"count":178},"Quality Inn & Suites":{"count":80},"Ramada":{"count":97},"Residence Inn":{"count":89},"Royal Hotel":{"count":94},"Sheraton":{"count":56},"Sleep Inn":{"count":68},"Staybridge Suites":{"count":54},"Super 8":{"count":229},"Travelodge":{"count":284},"Гостиница":{"count":166},"Уют":{"count":58},"東横イン":{"count":57}},"motel":{"Best Western":{"count":59},"Budget Inn":{"count":76},"Comfort Inn":{"count":131},"Days Inn":{"count":103},"Econo Lodge":{"count":117},"Motel 6":{"count":214},"Quality Inn":{"count":113},"Rodeway Inn":{"count":102},"Super 8":{"count":173},"Travelodge":{"count":68}},"museum":{"Heimatmuseum":{"count":336},"Stadtmuseum":{"count":86},"Tájház":{"count":93},"Краеведческий музей":{"count":247},"Музей":{"count":99}}};
23608 var dataSuggestions = {
23609         amenity: amenity,
23610         leisure: leisure,
23611         man_made: man_made,
23612         shop: shop,
23613         tourism: tourism
23614 };
23615
23616 var dataAddressFormats = [{"format":[["housenumber","street"],["city","postcode"]]},{"countryCodes":["gb"],"format":[["housename"],["housenumber","street"],["city","postcode"]]},{"countryCodes":["ie"],"format":[["housename"],["housenumber","street"],["city"],["postcode"]]},{"countryCodes":["at","ch","de","si","pl"],"format":[["street","housenumber"],["postcode","city"]]},{"countryCodes":["ad","ba","be","cz","dk","es","fi","gr","hr","is","it","li","nl","no","pt","se","sk","sm","va"],"format":[["street","housenumber","unit"],["postcode","city"]]},{"countryCodes":["fr","lu","mo"],"format":[["housenumber","street"],["postcode","city"]]},{"countryCodes":["br"],"format":[["street"],["housenumber","suburb"],["city","postcode"]]},{"countryCodes":["vn"],"format":[["housenumber","street"],["subdistrict"],["district"],["city"],["province","postcode"]]},{"countryCodes":["au","ca"],"format":[["housenumber","street","unit"],["city","province","postcode"]]},{"countryCodes":["us"],"format":[["housenumber","street","unit"],["city","state","postcode"]]},{"countryCodes":["tw"],"format":[["postcode","city","district"],["place","street"],["housenumber","floor","unit"]]},{"countryCodes":["jp"],"format":[["postcode","province","county"],["city","suburb"],["quarter","neighbourhood"],["block_number","housenumber"]],"dropdowns":["postcode","province","county","city","suburb","quarter","neighbourhood","block_number"],"widths":{"postcode":0.3,"province":0.35,"county":0.35,"city":0.65,"suburb":0.35,"quarter":0.5,"neighbourhood":0.5,"block_number":0.5,"housenumber":0.5}},{"countryCodes":["tr"],"format":[["neighbourhood"],["street","housenumber"],["postcode","district","city"]]},{"countryCodes":["ua"],"format":[["housenumber","postcode"],["street"]]},{"countryCodes":["cn"],"format":[["postcode","province"],["city","district"],["street","housenumber"]]}];
23617
23618 var dataDeprecated = [{"old":{"amenity":"firepit"},"replace":{"leisure":"firepit"}},{"old":{"barrier":"wire_fence"},"replace":{"barrier":"fence","fence_type":"chain"}},{"old":{"barrier":"wood_fence"},"replace":{"barrier":"fence","fence_type":"wood"}},{"old":{"highway":"ford"},"replace":{"ford":"yes"}},{"old":{"highway":"stile"},"replace":{"barrier":"stile"}},{"old":{"highway":"incline"},"replace":{"highway":"road","incline":"up"}},{"old":{"highway":"incline_steep"},"replace":{"highway":"road","incline":"up"}},{"old":{"highway":"unsurfaced"},"replace":{"highway":"road","incline":"unpaved"}},{"old":{"landuse":"wood"},"replace":{"landuse":"forest","natural":"wood"}},{"old":{"natural":"marsh"},"replace":{"natural":"wetland","wetland":"marsh"}},{"old":{"power_source":"*"},"replace":{"generator:source":"$1"}},{"old":{"power_rating":"*"},"replace":{"generator:output":"$1"}},{"old":{"shop":"organic"},"replace":{"shop":"supermarket","organic":"only"}}];
23619
23620 var dataDiscarded = {"created_by":true,"odbl":true,"odbl:note":true,"tiger:upload_uuid":true,"tiger:tlid":true,"tiger:source":true,"tiger:separated":true,"geobase:datasetName":true,"geobase:uuid":true,"sub_sea:type":true,"KSJ2:ADS":true,"KSJ2:ARE":true,"KSJ2:AdminArea":true,"KSJ2:COP_label":true,"KSJ2:DFD":true,"KSJ2:INT":true,"KSJ2:INT_label":true,"KSJ2:LOC":true,"KSJ2:LPN":true,"KSJ2:OPC":true,"KSJ2:PubFacAdmin":true,"KSJ2:RAC":true,"KSJ2:RAC_label":true,"KSJ2:RIC":true,"KSJ2:RIN":true,"KSJ2:WSC":true,"KSJ2:coordinate":true,"KSJ2:curve_id":true,"KSJ2:curve_type":true,"KSJ2:filename":true,"KSJ2:lake_id":true,"KSJ2:lat":true,"KSJ2:long":true,"KSJ2:river_id":true,"yh:LINE_NAME":true,"yh:LINE_NUM":true,"yh:STRUCTURE":true,"yh:TOTYUMONO":true,"yh:TYPE":true,"yh:WIDTH":true,"yh:WIDTH_RANK":true,"SK53_bulk:load":true};
23621
23622 var dataLocales = {"af":{"rtl":false},"ar":{"rtl":true},"ar-AA":{"rtl":true},"ast":{"rtl":false},"be":{"rtl":false},"bg":{"rtl":false},"bn":{"rtl":false},"bs":{"rtl":false},"ca":{"rtl":false},"ckb":{"rtl":true},"cs":{"rtl":false},"cy":{"rtl":false},"da":{"rtl":false},"de":{"rtl":false},"dv":{"rtl":true},"el":{"rtl":false},"en-GB":{"rtl":false},"eo":{"rtl":false},"es":{"rtl":false},"et":{"rtl":false},"eu":{"rtl":false},"fa":{"rtl":true},"fi":{"rtl":false},"fr":{"rtl":false},"gan":{"rtl":false},"gl":{"rtl":false},"gu":{"rtl":false},"he":{"rtl":true},"hi":{"rtl":false},"hr":{"rtl":false},"hu":{"rtl":false},"hy":{"rtl":false},"ia":{"rtl":false},"id":{"rtl":false},"is":{"rtl":false},"it":{"rtl":false},"ja":{"rtl":false},"jv":{"rtl":false},"km":{"rtl":false},"kn":{"rtl":false},"ko":{"rtl":false},"ku":{"rtl":false},"lij":{},"lt":{"rtl":false},"lv":{"rtl":false},"mg":{"rtl":false},"mk":{"rtl":false},"ml":{"rtl":false},"mn":{"rtl":false},"ms":{"rtl":false},"ne":{"rtl":false},"nl":{"rtl":false},"nn":{"rtl":false},"no":{"rtl":false},"nv":{"rtl":false},"pl":{"rtl":false},"pt":{"rtl":false},"pt-BR":{"rtl":false},"rm":{"rtl":false},"ro":{"rtl":false},"ru":{"rtl":false},"sc":{"rtl":false},"si":{"rtl":false},"sk":{"rtl":false},"sl":{"rtl":false},"so":{"rtl":false},"sq":{"rtl":false},"sr":{"rtl":false},"sv":{"rtl":false},"ta":{"rtl":false},"te":{"rtl":false},"th":{"rtl":false},"tl":{"rtl":false},"tr":{"rtl":false},"uk":{"rtl":false},"ur":{"rtl":true},"vi":{"rtl":false},"yue":{"rtl":false},"zh":{"rtl":false},"zh-CN":{"rtl":false},"zh-HK":{"rtl":false},"zh-TW":{"rtl":false}};
23623
23624 var dataPhoneFormats = {"us":"+1-202-555-1234","ca":"+1-226-555-1234","bs":"+1-242-555-1234","bb":"+1-246-555-1234","ai":"+1-264-555-1234","ag":"+1-268-555-1234","vg":"+1-284-555-1234","vi":"+1-340-555-1234","ky":"+1-345-555-1234","bm":"+1-441-555-1234","gd":"+1-473-555-1234","tc":"+1-649-555-1234","ms":"+1-664-555-1234","mp":"+1-670-555-1234","gu":"+1-671-555-1234","as":"+1-684-555-1234","sx":"+1-721-555-1234","lc":"+1-758-555-1234","dm":"+1-767-555-1234","vc":"+1-784-555-1234","pr":"+1-787-555-1234","do":"+1-809-555-1234","tt":"+1-868-555-1234","kn":"+1-869-555-1234","jm":"+1-876-555-1234","za":"+27 11 907 1111","nl":"+31 42 123 4567","fr":"+33 1 23 45 67 89","es":"+34 989 12 34 56","pt":"+351 211 123456","ie":"+353 20 912 3456","fi":"+358 40 123 4567","hu":"+36 1 123 45 67","hr":"+385 01 123 4567","si":"+386 31 123 4567","it":"+39 01 123 456","va":"+39 01 123 456","gb":"+44 1632 961234","gg":"+44 1632 961234","im":"+44 1632 961234","je":"+44 1632 961234","se":"+46 31 123 4567","no":"+47 22 12 34 56","sj":"+47 22 12 34 56","pl":"+48 42 123 4567","de":"+49 89 1234567","br":"+55 11 0982 1098","ru":"+7 495 1234567","kz":"+7 495 1234567","vn":"+84 1 234 5678","hk":"+852 1234 5678","cn":"+86 10 12345678","tw":"+886 1 2345 6789","tr":"+90 312 123 4567","ua":"+380 44 123 4567","at":"+43 1 123 45 67","ci":"+225 20 12 34 56","bj":"+229 20 12 34 56"};
23625
23626 var dataShortcuts = [{"tab":"browsing","text":"shortcuts.browsing.title","columns":[{"rows":[{"section":"navigation","text":"shortcuts.browsing.navigation.title"},{"shortcuts":["↓","↑","←","→"],"text":"shortcuts.browsing.navigation.pan","separator":","},{"modifiers":["⌘"],"shortcuts":["↓","↑","←","→"],"text":"shortcuts.browsing.navigation.pan_more","separator":","},{"shortcuts":["+","-"],"text":"shortcuts.browsing.navigation.zoom","separator":","},{"modifiers":["⌘"],"shortcuts":["+","-"],"text":"shortcuts.browsing.navigation.zoom_more","separator":","},{"section":"help","text":"shortcuts.browsing.help.title"},{"shortcuts":["help.key"],"text":"shortcuts.browsing.help.help"},{"shortcuts":["shortcuts.toggle.key"],"text":"shortcuts.browsing.help.keyboard"},{"section":"display_options","text":"shortcuts.browsing.display_options.title"},{"shortcuts":["background.key"],"text":"shortcuts.browsing.display_options.background"},{"modifiers":["⌘"],"shortcuts":["background.key"],"text":"shortcuts.browsing.display_options.background_switch"},{"shortcuts":["map_data.key"],"text":"shortcuts.browsing.display_options.map_data"},{"modifiers":["⌃","⌘"],"shortcuts":["F","F11"],"text":"shortcuts.browsing.display_options.fullscreen"},{"shortcuts":["area_fill.wireframe.key"],"text":"shortcuts.browsing.display_options.wireframe"},{"shortcuts":["background.minimap.key"],"text":"shortcuts.browsing.display_options.minimap"}]},{"rows":[{"section":"selecting","text":"shortcuts.browsing.selecting.title"},{"shortcuts":["Left-click"],"text":"shortcuts.browsing.selecting.select_one"},{"modifiers":["⇧"],"shortcuts":["Left-click"],"text":"shortcuts.browsing.selecting.select_multi"},{"modifiers":["⇧"],"shortcuts":["Left-click"],"gesture":"shortcuts.gesture.drag","text":"shortcuts.browsing.selecting.lasso"},{"modifiers":["⌘"],"shortcuts":["F"],"text":"shortcuts.browsing.selecting.search"},{"section":"with_selected","text":"shortcuts.browsing.with_selected.title"},{"shortcuts":["Right-click","shortcuts.key.space"],"text":"shortcuts.browsing.with_selected.edit_menu"},{"shortcuts":[],"text":""},{"section":"vertex_selected","text":"shortcuts.browsing.vertex_selected.title"},{"shortcuts":["[","↖"],"text":"shortcuts.browsing.vertex_selected.previous"},{"shortcuts":["]","↘"],"text":"shortcuts.browsing.vertex_selected.next"},{"shortcuts":["{","⇞"],"text":"shortcuts.browsing.vertex_selected.first"},{"shortcuts":["}","⇟"],"text":"shortcuts.browsing.vertex_selected.last"},{"shortcuts":["\\","shortcuts.key.pause"],"text":"shortcuts.browsing.vertex_selected.change_parent"}]}]},{"tab":"editing","text":"shortcuts.editing.title","columns":[{"rows":[{"section":"drawing","text":"shortcuts.editing.drawing.title"},{"shortcuts":["1"],"text":"shortcuts.editing.drawing.add_point"},{"shortcuts":["2"],"text":"shortcuts.editing.drawing.add_line"},{"shortcuts":["3"],"text":"shortcuts.editing.drawing.add_area"},{"shortcuts":["Left-click","shortcuts.key.space"],"text":"shortcuts.editing.drawing.place_point"},{"shortcuts":["⌥"],"text":"shortcuts.editing.drawing.disable_snap"},{"shortcuts":["↵","⎋"],"text":"shortcuts.editing.drawing.stop_line"},{"section":"commands","text":"shortcuts.editing.commands.title"},{"modifiers":["⌘"],"shortcuts":["C"],"text":"shortcuts.editing.commands.copy"},{"modifiers":["⌘"],"shortcuts":["V"],"text":"shortcuts.editing.commands.paste"},{"modifiers":["⌘"],"shortcuts":["Z"],"text":"shortcuts.editing.commands.undo"},{"modifiers":["⌘","⇧"],"shortcuts":["Z"],"text":"shortcuts.editing.commands.redo"},{"modifiers":["⌘"],"shortcuts":["S"],"text":"shortcuts.editing.commands.save"}]},{"rows":[{"section":"operations","text":"shortcuts.editing.operations.title"},{"shortcuts":["operations.continue.key"],"text":"shortcuts.editing.operations.continue_line"},{"shortcuts":["operations.merge.key"],"text":"shortcuts.editing.operations.merge"},{"shortcuts":["operations.disconnect.key"],"text":"shortcuts.editing.operations.disconnect"},{"shortcuts":["operations.split.key"],"text":"shortcuts.editing.operations.split"},{"shortcuts":["operations.reverse.key"],"text":"shortcuts.editing.operations.reverse"},{"shortcuts":["operations.move.key"],"text":"shortcuts.editing.operations.move"},{"shortcuts":["operations.rotate.key"],"text":"shortcuts.editing.operations.rotate"},{"shortcuts":["operations.orthogonalize.key"],"text":"shortcuts.editing.operations.orthogonalize"},{"shortcuts":["operations.circularize.key"],"text":"shortcuts.editing.operations.circularize"},{"shortcuts":["operations.reflect.key.long"],"text":"shortcuts.editing.operations.reflect_long"},{"shortcuts":["operations.reflect.key.short"],"text":"shortcuts.editing.operations.reflect_short"},{"modifiers":["⌘"],"shortcuts":["⌫"],"text":"shortcuts.editing.operations.delete"}]}]},{"tab":"tools","text":"shortcuts.tools.title","columns":[{"rows":[{"section":"info","text":"shortcuts.tools.info.title"},{"modifiers":["⌘"],"shortcuts":["info_panels.key"],"text":"shortcuts.tools.info.all"},{"modifiers":["⌘","⇧"],"shortcuts":["info_panels.background.key"],"text":"shortcuts.tools.info.background"},{"modifiers":["⌘","⇧"],"shortcuts":["info_panels.history.key"],"text":"shortcuts.tools.info.history"},{"modifiers":["⌘","⇧"],"shortcuts":["info_panels.location.key"],"text":"shortcuts.tools.info.location"},{"modifiers":["⌘","⇧"],"shortcuts":["info_panels.measurement.key"],"text":"shortcuts.tools.info.measurement"}]}]}];
23627
23628 var type$2 = "FeatureCollection";
23629 var features = [{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[1.97754,51.13111],[1.8457,63.45051],[-10.45898,57.01681],[-6.82251,55.26503],[-7.25583,55.06525],[-7.26546,55.0665],[-7.26992,55.06419],[-7.2725,55.06346],[-7.27818,55.05362],[-7.2893,55.04735],[-7.29939,55.0561],[-7.31835,55.04475],[-7.3447,55.05079],[-7.38831,55.02389],[-7.40547,55.00292],[-7.39157,54.99507],[-7.40075,54.98892],[-7.40706,54.98291],[-7.40363,54.97963],[-7.40633,54.97813],[-7.39835,54.97013],[-7.40745,54.96357],[-7.40178,54.95961],[-7.40727,54.95515],[-7.3944,54.94376],[-7.44444,54.93858],[-7.45216,54.89793],[-7.44204,54.87532],[-7.4713,54.83431],[-7.48092,54.83093],[-7.49216,54.82185],[-7.55121,54.79054],[-7.5443,54.78609],[-7.54958,54.75653],[-7.5349,54.74917],[-7.54881,54.74068],[-7.55941,54.74556],[-7.57894,54.74221],[-7.57507,54.7494],[-7.58606,54.75039],[-7.58872,54.74377],[-7.60031,54.74603],[-7.60632,54.74405],[-7.61662,54.74459],[-7.63593,54.75108],[-7.68854,54.72968],[-7.72064,54.72155],[-7.75094,54.70469],[-7.79094,54.71942],[-7.8051,54.71932],[-7.83497,54.73632],[-7.85419,54.72745],[-7.91496,54.67582],[-7.90174,54.66182],[-7.83832,54.63401],[-7.7433,54.6188],[-7.70863,54.63485],[-7.70682,54.6189],[-7.69386,54.6188],[-7.69631,54.61125],[-7.75845,54.59509],[-7.78708,54.58],[-7.79446,54.58141],[-7.79969,54.57704],[-7.79673,54.56915],[-7.8184,54.56315],[-7.83334,54.55227],[-7.82737,54.54299],[-7.85007,54.53363],[-7.90741,54.53722],[-7.93213,54.53388],[-8.00487,54.54568],[-8.03727,54.51162],[-8.04285,54.48759],[-8.08027,54.48829],[-8.09988,54.48395],[-8.09126,54.4765],[-8.111,54.47807],[-8.11512,54.46904],[-8.16542,54.46914],[-8.1776,54.46485],[-8.14293,54.45003],[-8.16284,54.4413],[-8.08731,54.4002],[-8.06062,54.37051],[-8.03289,54.35711],[-8.00054,54.34835],[-7.93333,54.30561],[-7.85849,54.29151],[-7.87067,54.28794],[-7.87265,54.26648],[-7.86123,54.25931],[-7.85917,54.21256],[-7.71043,54.20307],[-7.70193,54.20776],[-7.68828,54.202],[-7.67644,54.18906],[-7.66082,54.1871],[-7.62554,54.16545],[-7.62541,54.15319],[-7.61026,54.14353],[-7.57421,54.14142],[-7.57181,54.13287],[-7.56228,54.12704],[-7.51379,54.12998],[-7.47944,54.122],[-7.47169,54.12665],[-7.47075,54.13318],[-7.44684,54.15168],[-7.40792,54.156],[-7.42579,54.14092],[-7.41903,54.13629],[-7.3744,54.14172],[-7.37234,54.13881],[-7.39509,54.12624],[-7.39182,54.12017],[-7.36341,54.13157],[-7.34518,54.11577],[-7.32471,54.12123],[-7.32003,54.11379],[-7.3078,54.11718],[-7.30548,54.12347],[-7.31591,54.12697],[-7.31213,54.13162],[-7.3187,54.13411],[-7.31857,54.13745],[-7.32222,54.13836],[-7.32737,54.13544],[-7.3399,54.14585],[-7.30827,54.16716],[-7.30024,54.16625],[-7.29029,54.1715],[-7.28158,54.16839],[-7.2863,54.14919],[-7.29874,54.14904],[-7.30162,54.14411],[-7.28411,54.13971],[-7.29192,54.13071],[-7.29737,54.133],[-7.30883,54.13242],[-7.30333,54.12251],[-7.29218,54.11929],[-7.27844,54.12282],[-7.27707,54.12986],[-7.26613,54.13624],[-7.2566,54.16354],[-7.24015,54.17125],[-7.2575,54.17678],[-7.2581,54.19257],[-7.25179,54.19403],[-7.23608,54.1935],[-7.23338,54.19792],[-7.24317,54.20076],[-7.24892,54.1977],[-7.25183,54.20201],[-7.24119,54.20623],[-7.23094,54.20578],[-7.23269,54.20912],[-7.22188,54.21607],[-7.20643,54.2117],[-7.18506,54.22485],[-7.17055,54.21742],[-7.14721,54.22488],[-7.14633,54.23008],[-7.15051,54.23165],[-7.14613,54.23983],[-7.15802,54.24434],[-7.13985,54.25298],[-7.15255,54.26235],[-7.16064,54.27405],[-7.17991,54.27144],[-7.17201,54.28627],[-7.21252,54.2985],[-7.19888,54.31117],[-7.17918,54.30946],[-7.1812,54.3397],[-7.15339,54.33514],[-7.10253,54.35811],[-7.10811,54.36677],[-7.06927,54.3899],[-7.05593,54.41056],[-7.02898,54.42135],[-7.00198,54.40832],[-6.98683,54.40829],[-6.97562,54.40014],[-6.96774,54.40145],[-6.90682,54.36966],[-6.89772,54.35075],[-6.87527,54.33853],[-6.86512,54.32568],[-6.85163,54.29137],[-6.87452,54.28677],[-6.87791,54.27918],[-6.86673,54.27522],[-6.85177,54.26489],[-6.83693,54.26658],[-6.82165,54.24346],[-6.81633,54.22299],[-6.80045,54.22108],[-6.80122,54.21338],[-6.77599,54.19965],[-6.75573,54.1987],[-6.74316,54.18258],[-6.73406,54.18566],[-6.72445,54.18127],[-6.70295,54.20036],[-6.69166,54.20018],[-6.68673,54.19398],[-6.669,54.19584],[-6.65248,54.18102],[-6.6433,54.17801],[-6.63467,54.16449],[-6.63179,54.14766],[-6.64081,54.14238],[-6.63935,54.13599],[-6.66149,54.1205],[-6.6481,54.10153],[-6.66119,54.0934],[-6.66458,54.06629],[-6.64681,54.05873],[-6.62501,54.03737],[-6.59291,54.04755],[-6.58905,54.05808],[-6.5597,54.0481],[-6.52897,54.05888],[-6.50442,54.05566],[-6.47824,54.07004],[-6.47919,54.07762],[-6.43601,54.05959],[-6.36314,54.07057],[-6.36589,54.09338],[-6.36293,54.09758],[-6.37104,54.11497],[-6.3522,54.11084],[-6.34242,54.1114],[-6.33589,54.10833],[-6.33636,54.09469],[-6.31808,54.09096],[-6.30903,54.10463],[-6.29165,54.11235],[-6.28246,54.11145],[-6.26272,54.09786],[-5.35583,53.72597],[-7.0752,49.23912],[-1.83472,49.02346],[-2.12036,49.94415],[1.97754,51.13111]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-65.2,18.7],[-65,16.3],[-63.7,19.2],[-65.2,18.7]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-63,-50.5],[-55,-51],[-60,-54],[-63,-50.5]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-139.19952,60.08402],[-141,60.30621],[-141,76],[-169,68.63655],[-169,65.20147],[-180,61],[-180,-4],[-154,9],[-133.76404,54.54021],[-130.73868,54.71986],[-129.96277,55.29163],[-130.15228,55.7758],[-130.01787,55.90688],[-130.00362,56.00798],[-130.10284,56.12336],[-130.24498,56.09656],[-130.42625,56.14249],[-131.87439,56.79787],[-135.02884,59.56285],[-135.11759,59.62306],[-135.15827,59.6261],[-135.47928,59.79822],[-136.28677,59.57955],[-136.30531,59.46462],[-136.36836,59.44898],[-136.47697,59.46558],[-137.19727,59.01935],[-139.19952,60.08402]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-111.96064,48.99841],[-121.22623,49.00049],[-122.26513,49.00246],[-122.7565,49.00208],[-123.32218,49.00218],[-122.97821,48.76524],[-123.2666,48.69821],[-123.21991,48.21186],[-125.80444,48.60749],[-124.32129,31.54109],[-117.125,32.53429],[-116.82417,32.55996],[-115.88036,32.63735],[-115.49738,32.66486],[-114.71984,32.71877],[-114.7649,32.64602],[-114.80885,32.60959],[-114.81481,32.49451],[-112.81743,31.88004],[-111.07481,31.33224],[-109.56051,31.33402],[-108.20847,31.33384],[-108.20838,31.78363],[-106.52847,31.78391],[-106.52781,31.78086],[-106.52249,31.77501],[-106.51249,31.76933],[-106.50988,31.7612],[-106.50709,31.76123],[-106.48896,31.74806],[-106.48473,31.74769],[-106.4719,31.75101],[-106.46816,31.75897],[-106.45434,31.76466],[-106.45035,31.76426],[-106.43516,31.75492],[-106.41484,31.75101],[-106.37864,31.73021],[-106.37225,31.71174],[-106.34924,31.69633],[-106.33289,31.66178],[-106.3068,31.62459],[-106.28079,31.56179],[-106.24775,31.54226],[-106.2329,31.49982],[-106.2105,31.46857],[-106.08201,31.39863],[-106.00554,31.39233],[-105.76401,31.17051],[-105.58548,31.06117],[-105.56419,30.98526],[-104.99153,30.6639],[-104.97162,30.60896],[-104.90639,30.57822],[-104.83772,30.38117],[-104.70177,30.20567],[-104.68048,29.92399],[-104.57611,29.77838],[-104.51157,29.63674],[-104.39758,29.57047],[-104.39278,29.55293],[-104.05769,29.32173],[-103.79883,29.2581],[-103.78196,29.26555],[-103.76759,29.22799],[-103.14102,28.93666],[-102.86087,29.2217],[-102.65076,29.79418],[-101.41068,29.73457],[-101.26511,29.51372],[-101.05997,29.452],[-101.04083,29.38038],[-100.96303,29.34735],[-100.94406,29.34369],[-100.94071,29.33351],[-100.92775,29.32663],[-100.89814,29.30957],[-100.87818,29.28086],[-100.80076,29.2238],[-100.76437,29.15981],[-100.67047,29.08663],[-100.6412,28.91299],[-100.63236,28.90255],[-100.61296,28.89939],[-100.534,28.75622],[-100.51495,28.74531],[-100.50705,28.7143],[-100.51203,28.70666],[-100.51014,28.69127],[-100.50048,28.66186],[-100.45547,28.6381],[-100.44697,28.60743],[-100.35599,28.45239],[-100.34946,28.39653],[-100.29488,28.31315],[-100.29591,28.27324],[-100.17197,28.17493],[-99.93645,27.9568],[-99.87722,27.80173],[-99.79671,27.73338],[-99.772,27.72532],[-99.74556,27.69979],[-99.71947,27.65981],[-99.5957,27.59974],[-99.54094,27.60537],[-99.53055,27.57973],[-99.52034,27.55782],[-99.52802,27.49773],[-99.50141,27.49986],[-99.48755,27.49518],[-99.47897,27.48421],[-99.48661,27.46453],[-99.49534,27.44861],[-99.48927,27.40941],[-99.53957,27.31565],[-99.43588,27.19678],[-99.46404,27.01968],[-99.16698,26.56039],[-99.17474,26.53939],[-99.12698,26.51958],[-99.1135,26.42954],[-99.08355,26.39625],[-99.06007,26.39737],[-99.03634,26.41255],[-99.02042,26.40598],[-99.01291,26.39364],[-98.95686,26.38641],[-98.9566,26.37365],[-98.94523,26.36949],[-98.90013,26.36419],[-98.89905,26.35454],[-98.80305,26.36626],[-98.78254,26.30511],[-98.66667,26.23457],[-98.58496,26.24647],[-98.57951,26.23434],[-98.56519,26.23987],[-98.56294,26.22464],[-98.50599,26.20858],[-98.44806,26.21236],[-98.38617,26.15721],[-98.34176,26.15278],[-98.33579,26.1388],[-98.30626,26.10003],[-98.28841,26.10512],[-98.26524,26.0914],[-98.19898,26.06411],[-98.09577,26.05698],[-98.07568,26.06667],[-98.08302,26.03396],[-97.9771,26.04136],[-97.9532,26.06179],[-97.81643,26.04475],[-97.77017,26.02439],[-97.73884,26.02902],[-97.5289,25.90648],[-97.52151,25.88625],[-97.50615,25.89031],[-97.49851,25.89903],[-97.49637,25.89641],[-97.49748,25.88008],[-97.49422,25.87981],[-97.48847,25.88564],[-97.46409,25.88174],[-97.42607,25.842],[-97.36856,25.8396],[-97.26231,25.94724],[-80.81543,24.00633],[-66.87378,44.77794],[-67.16148,45.16715],[-67.2286,45.16739],[-67.26246,45.18797],[-67.28311,45.19175],[-67.28959,45.18784],[-67.29332,45.17568],[-67.29049,45.17317],[-67.3001,45.16776],[-67.3025,45.16122],[-67.29761,45.14766],[-67.33975,45.1255],[-67.40524,45.16122],[-67.40387,45.17139],[-67.4818,45.27682],[-67.42172,45.38543],[-67.45262,45.41008],[-67.50498,45.4889],[-67.41623,45.50105],[-67.42219,45.55661],[-67.42902,45.56833],[-67.42331,45.57154],[-67.42498,45.57836],[-67.45193,45.60323],[-67.77981,45.6738],[-67.79019,47.06776],[-67.88006,47.1067],[-67.91319,47.14793],[-67.92598,47.15418],[-67.95181,47.1875],[-68.02374,47.23915],[-68.13017,47.29309],[-68.17669,47.32893],[-68.24046,47.35354],[-68.32809,47.36005],[-68.36363,47.35476],[-68.38054,47.34167],[-68.38509,47.30321],[-68.37367,47.28796],[-68.4377,47.28232],[-68.47916,47.29623],[-68.51074,47.29885],[-68.54593,47.28441],[-68.58408,47.28482],[-68.59777,47.27134],[-68.59271,47.25762],[-68.61889,47.24148],[-68.68936,47.24125],[-68.71768,47.23676],[-68.80128,47.21423],[-68.89629,47.17676],[-69.05354,47.24847],[-69.04924,47.41798],[-69.22425,47.45961],[-69.99729,46.69558],[-70.0569,46.4149],[-70.25551,46.10871],[-70.29001,46.09431],[-70.39919,45.80667],[-70.83229,45.40062],[-70.80794,45.37878],[-70.82663,45.2367],[-70.87538,45.23453],[-70.92138,45.28099],[-70.90645,45.30918],[-71.0109,45.34798],[-71.08429,45.30556],[-71.1454,45.24226],[-71.20525,45.25278],[-71.28925,45.30097],[-71.41405,45.23513],[-71.43044,45.12381],[-71.49692,45.06991],[-71.50623,45.04878],[-71.49284,45.03629],[-71.50027,45.01372],[-71.79359,45.01075],[-72.08774,45.00581],[-72.14155,45.00568],[-72.15282,45.00609],[-72.17142,45.00584],[-72.25847,45.00436],[-72.38795,45.00626],[-72.4496,45.00863],[-72.5356,45.00936],[-72.66257,45.01523],[-72.82537,45.01642],[-73.08466,45.01561],[-73.45219,45.00875],[-74.14699,44.99145],[-74.33753,44.9923],[-74.50786,44.99798],[-74.66158,44.99949],[-74.71244,44.99734],[-74.75887,44.98708],[-74.76368,45.00632],[-74.78977,45.00365],[-74.82376,45.01773],[-74.94186,44.98229],[-75.30098,44.83883],[-75.30304,44.82836],[-75.59418,44.6457],[-75.97269,44.33502],[-75.97295,44.34595],[-76.00059,44.34797],[-76.17645,44.2865],[-76.18744,44.22158],[-76.88782,43.82759],[-79.16851,43.32168],[-79.05487,43.25371],[-79.05092,43.169],[-79.04603,43.16093],[-79.04208,43.13942],[-79.07002,43.12038],[-79.06015,43.114],[-79.0568,43.10474],[-79.0774,43.07861],[-78.9996,43.05484],[-79.02311,43.02071],[-79.02552,42.99473],[-78.96235,42.9573],[-78.91188,42.9426],[-78.90398,42.89181],[-82.42767,41.47978],[-83.14316,42.03807],[-83.12805,42.23843],[-83.09715,42.29052],[-83.07252,42.31515],[-82.94575,42.34332],[-82.59676,42.5479],[-82.51368,42.61785],[-82.5108,42.66464],[-82.4675,42.76415],[-82.48055,42.80573],[-82.45497,42.9284],[-82.41334,42.97099],[-82.42596,42.99536],[-82.15851,43.39507],[-83.53729,46.098],[-83.96301,46.05036],[-84.11021,46.23851],[-84.09794,46.25656],[-84.11613,46.26878],[-84.11905,46.31516],[-84.10721,46.3218],[-84.14394,46.41076],[-84.11682,46.51576],[-84.13536,46.53218],[-84.16162,46.5284],[-84.21621,46.53891],[-84.26994,46.49189],[-84.36092,46.50997],[-84.55284,46.4407],[-84.95178,46.77185],[-89.59179,48.00307],[-89.67547,48.00371],[-90.87204,48.25943],[-91.41312,48.06753],[-92.99377,48.62474],[-93.34877,48.62604],[-93.35529,48.61124],[-93.37074,48.60584],[-93.39812,48.60369],[-93.40542,48.61089],[-93.43846,48.59478],[-93.46859,48.59205],[-93.45735,48.56667],[-93.46533,48.54593],[-93.64763,48.51751],[-93.80625,48.51888],[-93.80642,48.58047],[-93.83328,48.62582],[-93.84865,48.63064],[-93.93388,48.6326],[-94.01327,48.64471],[-94.16176,48.64697],[-94.25025,48.65463],[-94.24931,48.67827],[-94.26046,48.69816],[-94.30578,48.71073],[-94.32758,48.70433],[-94.36123,48.70478],[-94.38406,48.71135],[-94.41629,48.71067],[-94.44294,48.69266],[-94.53615,48.7024],[-94.55031,48.71419],[-94.58894,48.71928],[-94.69425,48.77938],[-94.70129,48.83376],[-94.68996,48.83953],[-94.68395,48.99914],[-111.96064,48.99841]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[180,55],[170,53],[180,49],[180,55]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[143,22],[147,22],[147,12],[143,12],[143,22]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-171.5,-10],[-171,-15],[-167,-15],[-171.5,-10]]]}}];
23630 var dataImperial = {
23631         type: type$2,
23632         features: features
23633 };
23634
23635 var type$3 = "FeatureCollection";
23636 var features$1 = [{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[113.573,22.186],[114,22.5],[114.05534,22.503],[114.0595,22.51422],[114.07345,22.51934],[114.0786,22.53012],[114.08512,22.53228],[114.09034,22.53717],[114.09611,22.53486],[114.10602,22.53472],[114.1115,22.52929],[114.11522,22.5308],[114.11649,22.53418],[114.11979,22.53511],[114.1244,22.5393],[114.12729,22.53947],[114.13018,22.54132],[114.13807,22.5432],[114.14429,22.54176],[114.14441,22.54114],[114.14846,22.54179],[114.14855,22.54397],[114.15042,22.54593],[114.14964,22.54954],[114.15166,22.55168],[114.15192,22.55438],[114.15642,22.55495],[114.15841,22.55909],[114.16032,22.56153],[114.16162,22.56187],[114.1634,22.55931],[114.16553,22.5593],[114.16733,22.56119],[114.16934,22.56093],[114.17061,22.5597],[114.17702,22.56],[114.17798,22.55546],[114.18401,22.5552],[114.18673,22.55468],[114.1878,22.55545],[114.18979,22.55446],[114.1955,22.55564],[114.19674,22.55691],[114.20005,22.55717],[114.20376,22.55623],[114.20884,22.55672],[114.22438,22.55055],[114.2264,22.5476],[114.22545,22.54528],[114.22661,22.54339],[114.32,22.576],[114.45,22.43],[114.45,22.14],[113.9,22.14],[113.75,22.22],[113.553,22.095],[113.54678,22.1207],[113.5456,22.1207],[113.54076,22.12373],[113.54016,22.13618],[113.54701,22.13651],[113.5475,22.14583],[113.52456,22.17978],[113.53623,22.20191],[113.53299,22.21232],[113.53497,22.21351],[113.53735,22.21377],[113.54156,22.21315],[113.54385,22.21709],[113.55849,22.21565],[113.573,22.186]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-75,18],[-80,20.5],[-83,19],[-77,16],[-75,18]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-64.33594,32.86113],[-79.39819,27.21067],[-80.63965,23.71998],[-73.39966,20.40642],[-65.1709,19.20743],[-65.09399,16.23577],[-59.13391,16.80454],[-62.64404,15.16228],[-59.43054,14.85985],[-62.83081,13.64599],[-61.80359,10.73752],[-62.08649,10.04729],[-61.06201,9.85522],[-59.81369,8.31274],[-59.8027,8.27469],[-59.83498,8.22712],[-59.94141,8.21149],[-59.99771,8.15576],[-59.97986,8.13265],[-59.99771,8.12041],[-60.00183,8.07147],[-60.05127,8.02524],[-60.09933,8.03747],[-60.12268,8.02388],[-60.14053,7.98988],[-60.36163,7.83345],[-60.53467,7.81713],[-60.5896,7.6375],[-60.72144,7.54493],[-60.5896,7.31888],[-60.63904,7.24532],[-60.54703,7.12542],[-60.46875,7.20309],[-60.37262,7.18401],[-60.29984,7.1445],[-60.2916,7.06819],[-60.39871,6.95097],[-60.66513,6.83235],[-60.71869,6.75053],[-60.91232,6.81735],[-60.94254,6.72053],[-61.14441,6.72326],[-61.23093,6.5773],[-61.1554,6.45314],[-61.14441,6.20199],[-61.39709,5.95619],[-60.71045,5.20036],[-60.21606,5.23319],[-59.99634,5.06906],[-60.13916,4.51071],[-59.69971,4.40118],[-59.5459,3.93002],[-59.87549,3.56825],[-59.7876,3.37086],[-60.01831,2.83332],[-59.90845,2.38335],[-59.69971,2.2626],[-59.77661,1.87833],[-59.65302,1.85087],[-59.69147,1.75754],[-59.61456,1.71361],[-59.55139,1.73283],[-59.36188,1.49123],[-59.26575,1.39238],[-58.92242,1.30726],[-58.83728,1.17271],[-58.71918,1.23037],[-58.71094,1.29902],[-58.49121,1.26058],[-58.461,1.37591],[-58.50494,1.38689],[-58.51044,1.46102],[-58.38135,1.4775],[-58.32642,1.57359],[-58.00507,1.49946],[-57.99133,1.65321],[-57.79907,1.69165],[-57.70844,1.71087],[-57.54364,1.68341],[-57.41455,1.94421],[-57.10693,1.97715],[-56.8103,1.85636],[-56.48071,1.92225],[-55.90942,1.81244],[-55.90942,2.04302],[-56.14014,2.26534],[-55.94788,2.53701],[-55.70892,2.39981],[-55.37933,2.43274],[-55.19257,2.53976],[-54.98108,2.57268],[-54.88495,2.43548],[-54.71191,2.46293],[-54.69543,2.34767],[-54.58832,2.32846],[-54.43451,2.43548],[-54.20654,2.76748],[-54.17358,3.12955],[-53.96484,3.57921],[-54.33838,4.00674],[-54.44412,4.52577],[-54.46884,4.91036],[-54.36653,5.13061],[-54.27727,5.26191],[-54.19968,5.3084],[-54.01222,5.54457],[-54.0239,5.64605],[-53.86322,5.94936],[-64.33594,32.86113]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-14.5,-6],[11.79657,-17.27197],[12.03415,-17.14866],[12.38159,-17.22213],[12.58484,-17.22476],[13.01193,-16.97405],[13.24951,-17.00098],[13.38135,-16.98522],[13.93341,-17.38734],[18.42476,-17.38996],[18.47763,-17.46857],[18.62663,-17.64599],[18.79211,-17.76177],[18.92944,-17.82061],[19.33044,-17.84806],[19.66278,-17.8644],[19.74792,-17.90557],[19.85161,-17.87486],[20.10361,-17.90296],[20.18394,-17.88401],[20.34737,-17.88466],[20.44693,-17.91733],[20.51697,-17.96698],[20.83008,-18.03032],[20.95711,-17.97285],[21.16997,-17.93497],[21.42677,-18.0264],[23.45032,-17.63879],[22.00012,-16.38866],[21.99944,-13.00523],[24.03809,-12.99118],[24.03809,-10.91962],[24.43359,-11.09217],[24.45557,-11.48002],[25.37842,-11.19996],[25.42236,-11.60919],[26.96045,-11.97484],[27.18018,-11.60919],[28.125,-12.42048],[29.11377,-13.36824],[29.1687,-13.43771],[29.55872,-13.19716],[29.68506,-13.2239],[29.62463,-13.41099],[29.80591,-13.44305],[29.81415,-12.14809],[29.31152,-12.55456],[28.41064,-11.78133],[28.63037,-10.70379],[28.65234,-9.73071],[28.37219,-9.24309],[28.89748,-8.47916],[30.78644,-8.26857],[29.39941,-6.05316],[29.4873,-4.45595],[29.75922,-4.46759],[29.81415,-4.36421],[29.88007,-4.36832],[30.04074,-4.26699],[30.07919,-4.1629],[30.18356,-4.08311],[30.1918,-4.05126],[30.21566,-4.04595],[30.22923,-4.01136],[30.21326,-3.99612],[30.25978,-3.88755],[30.29274,-3.86288],[30.34424,-3.77245],[30.39848,-3.79095],[30.40878,-3.76765],[30.39548,-3.7304],[30.39054,-3.72821],[30.3896,-3.71918],[30.39093,-3.7101],[30.39514,-3.70444],[30.42028,-3.64963],[30.46886,-3.53501],[30.67108,-3.41335],[30.63297,-3.34892],[30.84206,-3.25535],[30.84549,-3.16108],[30.83485,-3.09698],[30.7933,-3.06235],[30.82111,-3.02258],[30.84515,-2.9739],[30.74764,-2.99618],[30.7037,-2.97013],[30.66422,-2.98967],[30.57632,-2.90738],[30.49393,-2.94441],[30.41016,-2.87172],[30.52002,-2.39432],[30.77545,-2.38883],[30.8606,-2.31199],[30.84961,-2.19398],[30.89081,-2.07322],[30.81116,-1.96068],[30.83862,-1.6587],[30.73425,-1.4418],[30.56259,-1.33884],[30.4541,-1.05737],[30.35797,-1.06287],[30.34149,-1.13152],[30.16571,-1.34296],[29.91852,-1.48024],[29.83887,-1.31824],[29.58344,-1.39238],[29.729,0.05493],[29.96796,0.5136],[29.9707,0.8569],[30.22339,0.92281],[30.24536,1.15349],[30.47745,1.20772],[31.30966,2.15693],[31.20255,2.22211],[31.20255,2.29278],[31.16409,2.27906],[31.13937,2.28318],[31.13113,2.26534],[31.07826,2.30033],[31.0714,2.34767],[31.00479,2.4005],[30.97183,2.40461],[30.94711,2.38746],[30.94849,2.36276],[30.9375,2.33532],[30.88531,2.34012],[30.83038,2.42176],[30.74112,2.43274],[30.76035,2.5864],[30.90179,2.88132],[30.76447,3.04178],[30.93613,3.40239],[30.94059,3.50588],[30.85236,3.48601],[30.90866,3.5936],[30.95055,3.63918],[30.94677,3.65391],[30.9866,3.70187],[31.00582,3.70701],[31.02058,3.69708],[31.16547,3.7954],[31.28838,3.79643],[31.52699,3.66282],[31.7038,3.72449],[31.82671,3.82794],[31.96198,3.65596],[31.95854,3.57099],[32.04987,3.59155],[32.07733,3.57099],[32.0842,3.53672],[32.20093,3.50657],[32.21672,3.56448],[32.19578,3.59977],[32.41516,3.74504],[32.72055,3.76782],[32.89307,3.81219],[33.02782,3.89371],[33.18146,3.7793],[33.51173,3.75258],[33.98758,4.23309],[34.05762,4.28342],[34.38721,4.61065],[35.94452,4.62023],[35.95688,4.53467],[36.04134,4.44568],[36.89621,4.4491],[38.14728,3.62992],[38.55927,3.62033],[38.92181,3.51068],[39.56039,3.43392],[39.87076,3.87522],[40.76752,4.28753],[41.16371,3.94372],[41.89774,3.97797],[41.31271,3.14463],[40.98896,2.82869],[40.99548,-0.84042],[41.7,-1.8],[41.7,-49],[-27,-60],[-65.7,-52.5],[-14.5,-6]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[31.33301,35.47856],[33.0249,33.75175],[35.44189,36.02245],[31.33301,35.47856]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[14,36.5],[15,36],[14,35],[14,36.5]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[0,62],[2.5,51.3],[-2,50],[-1.9,49],[-20,53],[0,62]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[180,-35],[161,-19],[167,-12],[180,-22],[180,4],[170,3.7],[127,5.7],[118,2.7],[119.5,5.4],[117.2,7.5],[102.6,8],[102.9158,11.74099],[102.76268,12.07357],[102.70226,12.17158],[102.74139,12.46474],[102.53128,12.68857],[102.49557,12.9256],[102.49763,13.0064],[102.4597,13.08199],[102.43412,13.09026],[102.39155,13.16407],[102.35481,13.29341],[102.35893,13.30945],[102.34503,13.34837],[102.35928,13.39797],[102.3567,13.48095],[102.36168,13.50582],[102.33559,13.53787],[102.33971,13.56023],[102.35498,13.5649],[102.36511,13.5785],[102.40047,13.5679],[102.42537,13.56891],[102.44614,13.56123],[102.48047,13.57091],[102.53849,13.56757],[102.5699,13.58526],[102.57806,13.60486],[102.62501,13.60845],[102.62132,13.61295],[102.60767,13.61562],[102.57231,13.63331],[102.56922,13.64082],[102.54879,13.658],[102.56252,13.68552],[102.5972,13.70803],[102.67084,13.74472],[102.68818,13.75172],[102.7014,13.7684],[102.73161,13.77082],[102.76543,13.85541],[102.78397,13.93207],[102.80388,13.94406],[102.81607,13.96639],[102.90705,14.02119],[102.89726,14.0535],[102.90095,14.0838],[102.92421,14.10744],[102.92378,14.12838],[102.94147,14.15035],[102.92953,14.17952],[103.17535,14.33774],[103.19939,14.32992],[103.68553,14.44],[103.94508,14.34157],[104.05756,14.34589],[104.06636,14.3419],[104.26025,14.37749],[104.50058,14.36984],[104.57817,14.36019],[104.6422,14.42387],[104.66632,14.40234],[104.68357,14.39877],[104.71138,14.43169],[104.72305,14.42188],[104.71687,14.40043],[104.75344,14.40459],[104.80408,14.43867],[104.83429,14.41573],[104.99239,14.3838],[105.05402,14.19783],[105.47905,14.49186],[105.60883,15.0005],[105.46703,15.13005],[105.48866,15.20237],[105.59269,15.2716],[105.58617,15.32823],[105.50308,15.31912],[105.46703,15.33948],[105.49175,15.37921],[105.59372,15.42869],[105.59372,15.50927],[105.60986,15.54871],[105.62616,15.56492],[105.62702,15.59129],[105.63518,15.62742],[105.63612,15.66056],[105.5975,15.72088],[105.49965,15.76681],[105.46291,15.74517],[105.43819,15.75459],[105.40489,15.79424],[105.34241,15.92039],[105.37811,15.98344],[105.39167,15.99136],[105.41931,15.98608],[105.42652,15.99764],[105.41468,16.01661],[105.21263,16.05076],[105.04955,16.10552],[105.01316,16.24401],[104.88235,16.37812],[104.8391,16.45782],[104.77936,16.49041],[104.73919,16.53287],[104.74228,16.62205],[104.76391,16.70953],[104.73953,16.80323],[104.76425,16.85088],[104.73782,16.90968],[104.744,17.0128],[104.81266,17.21853],[104.79841,17.39274],[104.70348,17.52833],[104.46384,17.65515],[104.34368,17.83564],[104.27776,17.8559],[104.22661,17.98069],[104.1116,18.10735],[104.06525,18.21174],[103.97392,18.33823],[103.9286,18.33237],[103.88809,18.29456],[103.85582,18.28673],[103.83659,18.32715],[103.79128,18.3467],[103.70201,18.34214],[103.60931,18.40405],[103.57292,18.40437],[103.51593,18.42978],[103.45963,18.42587],[103.41568,18.44802],[103.30479,18.43206],[103.24265,18.37082],[103.24333,18.34133],[103.29123,18.32357],[103.28899,18.29521],[103.23595,18.28299],[103.16608,18.25511],[103.02429,17.98135],[102.6535,17.83237],[102.40631,17.99963],[102.10968,18.22413],[101.548,17.81538],[101.30493,17.64991],[101.14563,17.46595],[100.95886,17.61654],[101.01757,17.88858],[101.18752,18.05121],[101.16863,18.10409],[101.18134,18.33595],[101.08727,18.38287],[101.05499,18.43988],[101.23215,18.73015],[101.35265,19.04524],[101.25927,19.12733],[101.2373,19.32637],[101.25824,19.58438],[101.11954,19.56836],[101.08898,19.58777],[101.08624,19.59715],[101.03165,19.6185],[100.89844,19.62125],[100.77827,19.49249],[100.63751,19.56432],[100.58258,19.49313],[100.47478,19.5944],[100.42929,19.67152],[100.43341,19.7024],[100.4147,19.7255],[100.40525,19.7646],[100.43907,19.80345],[100.45555,19.84843],[100.50636,19.87264],[100.51709,19.93027],[100.58653,20.1599],[100.56576,20.1757],[100.54945,20.17473],[100.52731,20.14379],[100.51065,20.14895],[100.48697,20.17956],[100.46774,20.196],[100.45246,20.20147],[100.45521,20.22129],[100.44783,20.23546],[100.41607,20.25286],[100.40594,20.28184],[100.38397,20.31082],[100.37556,20.35187],[100.36165,20.35638],[100.35736,20.37408],[100.33195,20.39902],[100.27805,20.40224],[100.25917,20.39677],[100.2475,20.37263],[100.22535,20.35509],[100.22346,20.31839],[100.16579,20.29988],[100.17162,20.24545],[100.10845,20.25221],[100.09266,20.2696],[100.09798,20.31485],[100.07961,20.3678],[99.9567,20.46417],[99.91636,20.44925],[99.90765,20.44977],[99.89121,20.44511],[99.87276,20.44406],[99.86212,20.44326],[99.80186,20.33948],[99.46472,20.3884],[99.56085,20.20035],[99.43691,20.08882],[99.27727,20.11623],[99.06921,20.1101],[98.97789,19.74538],[98.24387,19.68656],[97.85934,19.57014],[97.76733,18.57336],[97.39655,18.47179],[97.62451,18.30238],[97.73849,17.97743],[97.66502,17.87943],[97.90947,17.56745],[98.52951,16.82557],[98.51303,16.69276],[98.69293,16.26873],[98.87421,16.43609],[98.93394,16.3353],[98.84743,16.13356],[98.74512,16.12037],[98.58307,16.07287],[98.5762,15.79754],[98.54736,15.37557],[98.17383,15.15167],[98.3606,14.63674],[99.08295,13.89208],[99.16534,13.72204],[99.18182,13.00723],[99.39331,12.56797],[99.64153,11.78973],[99.32156,11.30266],[98.77859,10.67849],[98.80597,10.47642],[98.76657,10.40459],[98.74924,10.34194],[96.85547,6.40265],[92.42523,20.54794],[92.2728,20.96272],[92.187,21.16],[92.26,21.36],[92.27,21.4328],[92.62,21.43],[92.6,22],[93.22,22.25],[93.4,23.7],[93.34,23.95],[94.155,23.847],[94.17,23.92],[94.25171,24.07405],[94.28,24.23],[94.30175,24.2371],[94.3256,24.2731],[94.6,24.7],[94.78,25.47],[95.2,26],[95.1,26.6],[97.3,27.9],[96.14,29.38],[95.4,29.1],[94.8,29.2],[92.5,27.8],[91.64,27.76],[91.4,28],[89.58,28.18],[88.9,27.32],[88.74,27.47],[88.9,27.86],[88.7,28.1],[88.1,27.87],[85.93,27.942],[81.6,30.5],[81.2,30],[78.73,31.5],[78.77,31.99],[78.4,32.5],[79.3,32.5],[79,34.3],[78.3,34.6],[78,35.5],[76.1,35.8],[76,36.55],[75.15,37],[72.5,36.9],[71.1,36.1],[71.65,35.44],[71.45,35],[70.985,34.54],[71.18,34.36],[71.092,34.118],[70.88,33.97],[70.5,33.94],[69.908,34.04],[69.869,33.96],[70,33.75],[70.13,33.73],[70.34,33.34],[70.013,33.14],[69.57,33.09],[69.24,32.45],[69.3,31.9],[68.1,31.6],[66.393,30.934],[66.2,29.8],[62.5,29.4],[60.87,29.86],[61.53,29.0165],[61.66,28.77],[61.96,28.54],[62.43,28.42],[62.6,28.25],[62.795,28.28],[62.86,27.25],[63.24,27.25],[63.327,27.13],[63.25,27.1],[63.25,26.84],[63.18,26.83],[63.18,26.65],[62.3,26.5],[62.2,26.28],[61.85,26.22],[61.84,25.75],[61.68,25.67],[56.5,-21],[180,-65],[180,-35]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[138.7,46.7],[145.5,44.5],[145.2,43.7],[146,43.3],[142,18],[122,24.3],[138.7,46.7]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-180,7],[-148,7],[-151,-12],[-171.5,-10.75],[-171,-16],[-152,-19],[-180,-55],[-180,7]]]}}];
23637 var dataDriveLeft = {
23638         type: type$3,
23639         features: features$1
23640 };
23641
23642 var en = {"modes":{"add_area":{"title":"Area","description":"Add parks, buildings, lakes or other areas to the map.","tail":"Click on the map to start drawing an area, like a park, lake, or building."},"add_line":{"title":"Line","description":"Add highways, streets, pedestrian paths, canals or other lines to the map.","tail":"Click on the map to start drawing a road, path, or route."},"add_point":{"title":"Point","description":"Add restaurants, monuments, postal boxes or other points to the map.","tail":"Click on the map to add a point."},"browse":{"title":"Browse","description":"Pan and zoom the map."},"draw_area":{"tail":"Click to add nodes to your area. Click the first node to finish the area."},"draw_line":{"tail":"Click to add more nodes to the line. Click on other lines to connect to them, and double-click to end the line."},"drag_node":{"connected_to_hidden":"This can't be edited because it is connected to a hidden feature."}},"operations":{"add":{"annotation":{"point":"Added a point.","vertex":"Added a node to a way.","relation":"Added a relation."}},"start":{"annotation":{"line":"Started a line.","area":"Started an area."}},"continue":{"key":"A","title":"Continue","description":"Continue this line.","not_eligible":"No line can be continued here.","multiple":"Several lines can be continued here. To choose a line, press the Shift key and click on it to select it.","annotation":{"line":"Continued a line.","area":"Continued an area."}},"cancel_draw":{"annotation":"Canceled drawing."},"change_role":{"annotation":"Changed the role of a relation member."},"change_tags":{"annotation":"Changed tags."},"circularize":{"title":"Circularize","description":{"line":"Make this line circular.","area":"Make this area circular."},"key":"O","annotation":{"line":"Made a line circular.","area":"Made an area circular."},"not_closed":"This can't be made circular because it's not a loop.","too_large":"This can't be made circular because not enough of it is currently visible.","connected_to_hidden":"This can't be made circular because it is connected to a hidden feature."},"orthogonalize":{"title":"Square","description":{"line":"Square the corners of this line.","area":"Square the corners of this area."},"key":"S","annotation":{"line":"Squared the corners of a line.","area":"Squared the corners of an area."},"not_squarish":"This can't be made square because it is not squarish.","too_large":"This can't be made square because not enough of it is currently visible.","connected_to_hidden":"This can't be made square because it is connected to a hidden feature."},"straighten":{"title":"Straighten","description":"Straighten this line.","key":"S","annotation":"Straightened a line.","too_bendy":"This can't be straightened because it bends too much.","connected_to_hidden":"This line can't be straightened because it is connected to a hidden feature."},"delete":{"title":"Delete","description":{"single":"Delete this feature permanently.","multiple":"Delete these features permanently."},"annotation":{"point":"Deleted a point.","vertex":"Deleted a node from a way.","line":"Deleted a line.","area":"Deleted an area.","relation":"Deleted a relation.","multiple":"Deleted {n} features."},"too_large":{"single":"This feature can't be deleted because not enough of it is currently visible.","multiple":"These features can't be deleted because not enough of them are currently visible."},"incomplete_relation":{"single":"This feature can't be deleted because it hasn't been fully downloaded.","multiple":"These features can't be deleted because they haven't been fully downloaded."},"part_of_relation":{"single":"This feature can't be deleted because it is part of a larger relation. You must remove it from the relation first.","multiple":"These features can't be deleted because they are part of larger relations. You must remove them from the relations first."},"connected_to_hidden":{"single":"This feature can't be deleted because it is connected to a hidden feature.","multiple":"These features can't be deleted because some are connected to hidden features."}},"add_member":{"annotation":"Added a member to a relation."},"delete_member":{"annotation":"Removed a member from a relation."},"connect":{"annotation":{"point":"Connected a way to a point.","vertex":"Connected a way to another.","line":"Connected a way to a line.","area":"Connected a way to an area."}},"disconnect":{"title":"Disconnect","description":"Disconnect these lines/areas from each other.","key":"D","annotation":"Disconnected lines/areas.","not_connected":"There aren't enough lines/areas here to disconnect.","connected_to_hidden":"This can't be disconnected because it is connected to a hidden feature.","relation":"This can't be disconnected because it connects members of a relation."},"merge":{"title":"Merge","description":"Merge these features.","key":"C","annotation":"Merged {n} features.","not_eligible":"These features can't be merged.","not_adjacent":"These features can't be merged because their endpoints aren't connected.","restriction":"These features can't be merged because at least one is a member of a \"{relation}\" relation.","incomplete_relation":"These features can't be merged because at least one hasn't been fully downloaded.","conflicting_tags":"These features can't be merged because some of their tags have conflicting values."},"move":{"title":"Move","description":{"single":"Move this feature to a different location.","multiple":"Move these features to a different location."},"key":"M","annotation":{"point":"Moved a point.","vertex":"Moved a node in a way.","line":"Moved a line.","area":"Moved an area.","multiple":"Moved multiple features."},"incomplete_relation":{"single":"This feature can't be moved because it hasn't been fully downloaded.","multiple":"These features can't be moved because they haven't been fully downloaded."},"too_large":{"single":"This feature can't be moved because not enough of it is currently visible.","multiple":"These features can't be moved because not enough of them are currently visible."},"connected_to_hidden":{"single":"This feature can't be moved because it is connected to a hidden feature.","multiple":"These features can't be moved because some are connected to hidden features."}},"reflect":{"title":{"long":"Reflect Long","short":"Reflect Short"},"description":{"long":{"single":"Reflect this feature across its long axis.","multiple":"Reflect these features across their long axis."},"short":{"single":"Reflect this feature across its short axis.","multiple":"Reflect these features across their short axis."}},"key":{"long":"T","short":"Y"},"annotation":{"long":{"single":"Reflected a feature across its long axis.","multiple":"Reflected multiple features across their long axis."},"short":{"single":"Reflected a feature across its short axis.","multiple":"Reflected multiple features across their short axis."}},"incomplete_relation":{"single":"This feature can't be reflected because it hasn't been fully downloaded.","multiple":"These features can't be reflected because they haven't been fully downloaded."},"too_large":{"single":"This feature can't be reflected because not enough of it is currently visible.","multiple":"These features can't be reflected because not enough of them are currently visible."},"connected_to_hidden":{"single":"This feature can't be reflected because it is connected to a hidden feature.","multiple":"These features can't be reflected because some are connected to hidden features."}},"rotate":{"title":"Rotate","description":{"single":"Rotate this feature around its center point.","multiple":"Rotate these features around their center point."},"key":"R","annotation":{"line":"Rotated a line.","area":"Rotated an area.","multiple":"Rotated multiple features."},"incomplete_relation":{"single":"This feature can't be rotated because it hasn't been fully downloaded.","multiple":"These features can't be rotated because they haven't been fully downloaded."},"too_large":{"single":"This feature can't be rotated because not enough of it is currently visible.","multiple":"These features can't be rotated because not enough of them are currently visible."},"connected_to_hidden":{"single":"This feature can't be rotated because it is connected to a hidden feature.","multiple":"These features can't be rotated because some are connected to hidden features."}},"reverse":{"title":"Reverse","description":"Make this line go in the opposite direction.","key":"V","annotation":"Reversed a line."},"split":{"title":"Split","description":{"line":"Split this line into two at this node.","area":"Split the boundary of this area into two.","multiple":"Split the lines/area boundaries at this node into two."},"key":"X","annotation":{"line":"Split a line.","area":"Split an area boundary.","multiple":"Split {n} lines/area boundaries."},"not_eligible":"Lines can't be split at their beginning or end.","multiple_ways":"There are too many lines here to split.","connected_to_hidden":"This can't be split because it is connected to a hidden feature."},"restriction":{"annotation":{"create":"Added a turn restriction","delete":"Deleted a turn restriction"}}},"restriction":{"controls":{"distance":"Distance","distance_up_to":"Up to {distance}","via":"Via","via_node_only":"Node only","via_up_to_one":"Up to 1 way","via_up_to_two":"Up to 2 ways"},"help":{"indirect":"(indirect)","turn":{"no_left_turn":"NO Left Turn {indirect}","no_right_turn":"NO Right Turn {indirect}","no_u_turn":"NO U-Turn {indirect}","no_straight_on":"NO Straight On {indirect}","only_left_turn":"ONLY Left Turn {indirect}","only_right_turn":"ONLY Right Turn {indirect}","only_u_turn":"ONLY U-Turn {indirect}","only_straight_on":"ONLY Straight On {indirect}","allowed_left_turn":"Left Turn Allowed {indirect}","allowed_right_turn":"Right Turn Allowed {indirect}","allowed_u_turn":"U-Turn Allowed {indirect}","allowed_straight_on":"Straight On Allowed {indirect}"},"from":"FROM","via":"VIA","to":"TO","from_name":"{from} {fromName}","from_name_to_name":"{from} {fromName} {to} {toName}","via_names":"{via} {viaNames}","select_from":"Click to select a {from} segment","select_from_name":"Click to select {from} {fromName}","toggle":"Click for \"{turn}\""}},"undo":{"tooltip":"Undo: {action}","nothing":"Nothing to undo."},"redo":{"tooltip":"Redo: {action}","nothing":"Nothing to redo."},"tooltip_keyhint":"Shortcut:","browser_notice":"This editor is supported in Firefox, Chrome, Safari, Opera, and Internet Explorer 11 and above. Please upgrade your browser or use Potlatch 2 to edit the map.","translate":{"translate":"Translate","localized_translation_label":"Multilingual name","localized_translation_language":"Choose language","localized_translation_name":"Name"},"zoom_in_edit":"Zoom in to edit","login":"login","logout":"logout","loading_auth":"Connecting to OpenStreetMap...","report_a_bug":"Report a bug","help_translate":"Help translate","feature_info":{"hidden_warning":"{count} hidden features","hidden_details":"These features are currently hidden: {details}"},"status":{"error":"Unable to connect to API.","offline":"The API is offline. Please try editing later.","readonly":"The API is read-only. You will need to wait to save your changes.","rateLimit":"The API is limiting anonymous connections.  You can fix this by logging in."},"commit":{"title":"Upload to OpenStreetMap","upload_explanation":"The changes you upload will be visible on all maps that use OpenStreetMap data.","upload_explanation_with_user":"The changes you upload as {user} will be visible on all maps that use OpenStreetMap data.","request_review":"I would like someone to review my edits.","save":"Upload","cancel":"Cancel","changes":"{count} Changes","download_changes":"Download osmChange file","warnings":"Warnings","modified":"Modified","deleted":"Deleted","created":"Created","about_changeset_comments":"About changeset comments","about_changeset_comments_link":"//wiki.openstreetmap.org/wiki/Good_changeset_comments","google_warning":"You mentioned Google in this comment: remember that copying from Google Maps is strictly forbidden.","google_warning_link":"https://www.openstreetmap.org/copyright"},"contributors":{"list":"Edits by {users}","truncated_list":"Edits by {users} and {count} others"},"info_panels":{"key":"I","background":{"key":"B","title":"Background","zoom":"Zoom","vintage":"Vintage","source":"Source","description":"Description","resolution":"Resolution","accuracy":"Accuracy","unknown":"Unknown","show_tiles":"Show Tiles","hide_tiles":"Hide Tiles","show_vintage":"Show Vintage","hide_vintage":"Hide Vintage"},"history":{"key":"H","title":"History","selected":"{n} selected","version":"Version","last_edit":"Last Edit","edited_by":"Edited By","changeset":"Changeset","unknown":"Unknown","link_text":"History on openstreetmap.org"},"location":{"key":"L","title":"Location","unknown_location":"Unknown Location"},"measurement":{"key":"M","title":"Measurement","selected":"{n} selected","geometry":"Geometry","closed_line":"closed line","closed_area":"closed area","center":"Center","perimeter":"Perimeter","length":"Length","area":"Area","centroid":"Centroid","location":"Location","metric":"Metric","imperial":"Imperial","node_count":"Number of nodes"}},"geometry":{"point":"point","vertex":"vertex","line":"line","area":"area","relation":"relation"},"geocoder":{"search":"Search worldwide...","no_results_visible":"No results in visible map area","no_results_worldwide":"No results found"},"geolocate":{"title":"Show My Location","locating":"Locating, please wait..."},"inspector":{"no_documentation_combination":"There is no documentation available for this tag combination","no_documentation_key":"There is no documentation available for this key","documentation_redirect":"This documentation has been redirected to a new page","show_more":"Show More","view_on_osm":"View on openstreetmap.org","all_fields":"All fields","all_tags":"All tags","all_members":"All members","all_relations":"All relations","new_relation":"New relation...","role":"Role","choose":"Select feature type","results":"{n} results for {search}","reference":"View on OpenStreetMap Wiki","back_tooltip":"Change feature","remove":"Remove","search":"Search","multiselect":"Selected features","unknown":"Unknown","incomplete":"<not downloaded>","feature_list":"Search features","edit":"Edit feature","check":{"yes":"Yes","no":"No","reverser":"Change Direction"},"radio":{"structure":{"type":"Type","default":"Default","layer":"Layer"}},"add":"Add","none":"None","node":"Node","way":"Way","relation":"Relation","location":"Location","add_fields":"Add field:"},"background":{"title":"Background","description":"Background settings","key":"B","backgrounds":"Backgrounds","none":"None","best_imagery":"Best known imagery source for this location","switch":"Switch back to this background","custom":"Custom","custom_button":"Edit custom background","custom_prompt":"Enter a tile URL template. Valid tokens are:\n   - {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n   - {-y} or {ty} for flipped TMS-style Y coordinates\n   - {u} for quadtile scheme\n   - {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}","overlays":"Overlays","imagery_source_faq":"Imagery Info / Report a Problem","reset":"reset","display_options":"Display Options","brightness":"Brightness","contrast":"Contrast","saturation":"Saturation","sharpness":"Sharpness","minimap":{"description":"Show Minimap","tooltip":"Show a zoomed out map to help locate the area currently displayed.","key":"/"},"fix_misalignment":"Adjust imagery offset","offset":"Drag anywhere in the gray area below to adjust the imagery offset, or enter the offset values in meters."},"map_data":{"title":"Map Data","description":"Map Data","key":"F","data_layers":"Data Layers","layers":{"osm":{"tooltip":"Map data from OpenStreetMap","title":"OpenStreetMap data"}},"fill_area":"Fill Areas","map_features":"Map Features","autohidden":"These features have been automatically hidden because too many would be shown on the screen.  You can zoom in to edit them.","osmhidden":"These features have been automatically hidden because the OpenStreetMap layer is hidden."},"feature":{"points":{"description":"Points","tooltip":"Points of Interest"},"traffic_roads":{"description":"Traffic Roads","tooltip":"Highways, Streets, etc."},"service_roads":{"description":"Service Roads","tooltip":"Service Roads, Parking Aisles, Tracks, etc."},"paths":{"description":"Paths","tooltip":"Sidewalks, Foot Paths, Cycle Paths, etc."},"buildings":{"description":"Buildings","tooltip":"Buildings, Shelters, Garages, etc."},"landuse":{"description":"Landuse Features","tooltip":"Forests, Farmland, Parks, Residential, Commercial, etc."},"boundaries":{"description":"Boundaries","tooltip":"Administrative Boundaries"},"water":{"description":"Water Features","tooltip":"Rivers, Lakes, Ponds, Basins, etc."},"rail":{"description":"Rail Features","tooltip":"Railways"},"power":{"description":"Power Features","tooltip":"Power Lines, Power Plants, Substations, etc."},"past_future":{"description":"Past/Future","tooltip":"Proposed, Construction, Abandoned, Demolished, etc."},"others":{"description":"Others","tooltip":"Everything Else"}},"area_fill":{"wireframe":{"description":"No Fill (Wireframe)","tooltip":"Enabling wireframe mode makes it easy to see the background imagery.","key":"W"},"partial":{"description":"Partial Fill","tooltip":"Areas are drawn with fill only around their inner edges. (Recommended for beginner mappers)"},"full":{"description":"Full Fill","tooltip":"Areas are drawn fully filled."}},"restore":{"heading":"You have unsaved changes","description":"Do you wish to restore unsaved changes from a previous editing session?","restore":"Restore my changes","reset":"Discard my changes"},"save":{"title":"Save","help":"Review your changes and upload them to OpenStreetMap, making them visible to other users.","no_changes":"No changes to save.","error":"Errors occurred while trying to save","status_code":"Server returned status code {code}","unknown_error_details":"Please ensure you are connected to the internet.","uploading":"Uploading changes to OpenStreetMap...","conflict_progress":"Checking for conflicts: {num} of {total}","unsaved_changes":"You have unsaved changes","conflict":{"header":"Resolve conflicting edits","count":"Conflict {num} of {total}","previous":"< Previous","next":"Next >","keep_local":"Keep mine","keep_remote":"Use theirs","restore":"Restore","delete":"Leave Deleted","download_changes":"Or download osmChange file","done":"All conflicts resolved!","help":"Another user changed some of the same map features you changed.\nClick on each feature below for more details about the conflict, and choose whether to keep\nyour changes or the other user's changes.\n"}},"merge_remote_changes":{"conflict":{"deleted":"This feature has been deleted by {user}.","location":"This feature was moved by both you and {user}.","nodelist":"Nodes were changed by both you and {user}.","memberlist":"Relation members were changed by both you and {user}.","tags":"You changed the <b>{tag}</b> tag to \"{local}\" and {user} changed it to \"{remote}\"."}},"success":{"edited_osm":"Edited OSM!","just_edited":"You just edited OpenStreetMap!","view_on_osm":"View on OSM","facebook":"Share on Facebook","twitter":"Share on Twitter","google":"Share on Google+","help_html":"Your changes should appear in the \"Standard\" layer in a few minutes. Other layers, and certain features, may take longer.","help_link_text":"Details","help_link_url":"https://wiki.openstreetmap.org/wiki/FAQ#I_have_just_made_some_changes_to_the_map._How_do_I_get_to_see_my_changes.3F"},"confirm":{"okay":"OK","cancel":"Cancel"},"splash":{"welcome":"Welcome to the iD OpenStreetMap editor","text":"iD is a friendly but powerful tool for contributing to the world's best free world map. This is version {version}. For more information see {website} and report bugs at {github}.","walkthrough":"Start the Walkthrough","start":"Edit now"},"source_switch":{"live":"live","lose_changes":"You have unsaved changes. Switching the map server will discard them. Are you sure you want to switch servers?","dev":"dev"},"version":{"whats_new":"What's new in iD {version}"},"tag_reference":{"description":"Description","on_wiki":"{tag} on wiki.osm.org","used_with":"used with {type}"},"validations":{"disconnected_highway":"Disconnected highway","disconnected_highway_tooltip":"Roads should be connected to other roads or building entrances.","old_multipolygon":"Multipolygon tags on outer way","old_multipolygon_tooltip":"This style of multipolygon is deprecated. Please assign the tags to the parent multipolygon instead of the outer way.","untagged_point":"Untagged point","untagged_point_tooltip":"Select a feature type that describes what this point is.","untagged_line":"Untagged line","untagged_line_tooltip":"Select a feature type that describes what this line is.","untagged_area":"Untagged area","untagged_area_tooltip":"Select a feature type that describes what this area is.","untagged_relation":"Untagged relation","untagged_relation_tooltip":"Select a feature type that describes what this relation is.","many_deletions":"You're deleting {n} features: {p} nodes, {l} lines, {a} areas, {r} relations. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.","tag_suggests_area":"The tag {tag} suggests line should be area, but it is not an area","deprecated_tags":"Deprecated tags: {tags}"},"zoom":{"in":"Zoom in","out":"Zoom out"},"cannot_zoom":"Cannot zoom out further in current mode.","full_screen":"Toggle Full Screen","gpx":{"local_layer":"Local file","drag_drop":"Drag and drop a .gpx, .geojson or .kml file on the page, or click the button to the right to browse","zoom":"Zoom to layer","browse":"Browse for a file"},"mapillary_images":{"tooltip":"Street-level photos from Mapillary","title":"Photo Overlay (Mapillary)"},"mapillary_signs":{"tooltip":"Traffic signs from Mapillary (must enable Photo Overlay)","title":"Traffic Sign Overlay (Mapillary)"},"mapillary":{"view_on_mapillary":"View this image on Mapillary"},"openstreetcam_images":{"tooltip":"Street-level photos from OpenStreetCam","title":"Photo Overlay (OpenStreetCam)"},"openstreetcam":{"view_on_openstreetcam":"View this image on OpenStreetCam"},"help":{"title":"Help","key":"H","help":{"title":"Help","welcome":"Welcome to the iD editor for [OpenStreetMap](https://www.openstreetmap.org/). With this editor you can update OpenStreetMap right from your web browser.","open_data_h":"Open Data","open_data":"Edits that you make on this map will be visible to everyone who uses OpenStreetMap. Your edits can be based on personal knowledge, on-the-ground surveying, or imagery collected from aerial or street level photos. Copying from commercial sources, like Google Maps, [is strictly forbidden](https://www.openstreetmap.org/copyright).","before_start_h":"Before you start","before_start":"You should be familiar with OpenStreetMap and this editor before you start editing. iD contains a walkthrough to teach you the basics of editing OpenStreetMap. Click \"Start the Walkthrough\" on this screen to take the tutorial - it takes only about 15 minutes.","open_source_h":"Open Source","open_source":"The iD editor is a collaborative open source project, and you are using version {version} now. The source code is available [on GitHub](https://github.com/openstreetmap/iD).","open_source_help":"You can help iD by [translating](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) or [reporting bugs](https://github.com/openstreetmap/iD/issues)."},"overview":{"title":"Overview","navigation_h":"Navigation","navigation_drag":"You can drag the map by pressing and holding down the {leftclick} left mouse button and moving the mouse around. You can also use the `↓`, `↑`, `←`, `→` arrow keys on your keyboard.","navigation_zoom":"You can zoom in or out by scrolling with the mouse wheel or trackpad, or by clicking the {plus} / {minus} buttons along the side of the map. You can also use the `+`, `-` keys on your keyboard.","features_h":"Map Features","features":"We use the word *features* to describe things that appear on the map, such as roads, buildings, or points of interest. Anything in the real world can be mapped as a feature on OpenStreetMap. Map features are represented on the map using *points*, *lines*, or *areas*.","nodes_ways":"In OpenStreetmap, points are sometimes called *nodes*, and lines and areas are sometimes called *ways*."},"editing":{"title":"Editing & Saving","select_h":"Select","select_left_click":"{leftclick} Left-click on a feature to select it. This will highlight it with a pulsing glow, and the sidebar will display details about that feature, such as its name or address.","select_right_click":"{rightclick} Right-click on a feature to display the editing menu, which shows the commands that are available, such as rotating, moving, and deleting.","multiselect_h":"Multiselect","multiselect_shift_click":"`{shift}`+{leftclick} left-click to select several features together.  This makes it easier to move or delete multiple items.","multiselect_lasso":"Another way to select multiple features is to hold down the `{shift}` key, then press and hold down the {leftclick} left mouse button and drag the mouse to draw a selection lasso. All of the points inside the lasso area will be selected.","undo_redo_h":"Undo & Redo","undo_redo":"Your edits are stored locally in your browser until you choose to save them to the OpenStreetMap server. You can undo edits by clicking the {undo} **Undo** button, and redo them by clicking the {redo} **Redo** button.","save_h":"Save","save":"Click {save} **Save** to finish your edits and send them to OpenStreetMap. You should remember to save your work frequently!","save_validation":"On the save screen, you'll have a chance to review what you've done. iD will also perform some basic checks for missing data and may offer helpful suggestions and warnings if something doesn't seem right.","upload_h":"Upload","upload":"Before uploading your changes you must enter a [changeset comment](https://wiki.openstreetmap.org/wiki/Good_changeset_comments). Then click **Upload** to send your changes to OpenStreetMap, where they will be merged into the map and publicly visible to everyone.","backups_h":"Automatic Backups","backups":"If you can't finish your edits in one sitting, for example if your computer crashes or you close the browser tab, your edits are still saved in your browser's storage. You can come back later (on the same browser and computer), and iD will offer to restore your work.","keyboard_h":"Keyboard Shortcuts","keyboard":"You can view a list of keyboard shortcuts by pressing the `?` key."},"feature_editor":{"title":"Feature Editor","intro":"The *feature editor* appears alongside the map, and allows you to see and edit all of the information for the selected feature.","definitions":"The top section displays the feature's type. The middle section contains *fields* showing the feature's attributes, such as its name or address.","type_h":"Feature Type","type":"You can click on the feature type to change the feature to a different type. Everything that exists in the real world can be added to OpenStreetMap, so there are thousands of feature types to choose from.","type_picker":"The type picker displays the most common feature types, such as parks, hospitals, restaurants, roads, and buildings. You can search for anything by typing what you're looking for in the search box. You can also click the {inspect} **Info** icon next to the feature type to learn more about it.","fields_h":"Fields","fields_all_fields":"The \"All fields\" section contains all of the feature's details that you may edit. In OpenStreetMap, all of the fields are optional, and it's OK to leave a field blank if you are unsure.","fields_example":"Each feature type will display different fields. For example, a road may display fields for its surface and speed limit, but a restaurant may display fields for the type of food it serves and the hours it is open.","fields_add_field":"You can also click the \"Add field\" dropdown to add more fields, such as a description, Wikipedia link, wheelchair access, and more.","tags_h":"Tags","tags_all_tags":"Below the fields section, you can expand the \"All tags\" section to edit any of the OpenStreetMap *tags* for the selected feature. Each tag consists of a *key* and *value*, data elements that define all of the features stored in OpenStreetMap.","tags_resources":"Editing a feature's tags requires intermediate knowledge about OpenStreetMap. You should consult resources like the [OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/Main_Page) or [Taginfo](https://taginfo.openstreetmap.org/) to learn more about accepted OpenStreetMap tagging practices."},"points":{"title":"Points","intro":"*Points* can be used to represent features such as shops, restaurants, and monuments. They mark a specific location, and describe what's there.","add_point_h":"Adding Points","add_point":"To add a point, click the {point} **Point** button on the toolbar above the map, or press the shortcut key `1`. This will change the mouse cursor to a cross symbol.","add_point_finish":"To place the new point on the map, position the mouse cursor where the point should go, then {leftclick} left-click or press `Space`.","move_point_h":"Moving Points","move_point":"To move a point, place the mouse cursor over the point, then press and hold the {leftclick} left mouse button while dragging the point to its new location.","delete_point_h":"Deleting Points","delete_point":"It's OK to delete features that don't exist in the real world. Deleting a feature from OpenStreetMap removes it from the map that everyone uses, so you should make sure a feature is really gone before you delete it.","delete_point_command":"To delete a point, {rightclick} right-click on the point to select it and show the edit menu, then use the {delete} **Delete** command."},"lines":{"title":"Lines","intro":"*Lines* are used to represent features such as roads, railroads, and rivers. Lines should be drawn down the center of the feature that they represent.","add_line_h":"Adding Lines","add_line":"To add a line, click the {line} **Line** button on the toolbar above the map, or press the shortcut key `2`. This will change the mouse cursor to a cross symbol.","add_line_draw":"Next, position the mouse cursor where the line should begin and {leftclick} left-click or press `Space` to begin placing nodes along the line. Continue placing more nodes by clicking or pressing `Space`. While drawing, you can zoom in or drag the map in order to add more detail.","add_line_finish":"To finish a line, press `{return}` or click again on the last node.","modify_line_h":"Modifying Lines","modify_line_dragnode":"Often you'll see lines that aren't shaped correctly, for example a road that does not match up with the background imagery. To adjust the shape of a line, first {leftclick} left-click to select it. All nodes of the line will be drawn as small circles. You can then drag the nodes to better locations.","modify_line_addnode":"You can also create new nodes along a line either by {leftclick}**x2** double-clicking on the line or by dragging the small triangles at the midpoints between nodes.","connect_line_h":"Connecting Lines","connect_line":"Having roads connected properly is important for the map and essential for providing driving directions.","connect_line_display":"The connections between roads are drawn with gray circles. The endpoints of a line are drawn with larger white circles if they don't connect to anything.","connect_line_drag":"To connect a line to another feature, drag one of the line's nodes onto the other feature until both features snap together. Tip: You can hold down the `{alt}` key to prevent nodes from connecting to other features.","connect_line_tag":"If you know that the connection has traffic lights or crosswalks, you can add them by selecting the connecting node and using the feature editor to select the correct feature's type.","disconnect_line_h":"Disconnecting Lines","disconnect_line_command":"To disconnect a road from another feature, {rightclick} right-click the connecting node and select the {disconnect} **Disconnect** command from the editing menu.","move_line_h":"Moving Lines","move_line_command":"To move an entire line, {rightclick} right-click the line and select the {move} **Move** command from the editing menu. Then move the mouse, and {leftclick} left-click to place the line in a new location.","move_line_connected":"Lines that are connected to other features will stay connected as you move the line to a new location. iD may prevent you from moving a line across another connected line.","delete_line_h":"Deleting Lines","delete_line":"If a line is entirely incorrect, for example a road that doesn't exist in the real world, it's OK to delete it. Be careful when deleting features: the background imagery you are using might be outdated, and a road that looks wrong could simply be newly built.","delete_line_command":"To delete a line, {rightclick} right-click on the line to select it and show the edit menu, then use the {delete} **Delete** command."},"areas":{"title":"Areas","intro":"*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas. Areas should be traced around the edge of the feature that they represent, for example, around the base of a building.","point_or_area_h":"Points or Areas?","point_or_area":"Many features can be represented as points or areas. You should map buildings and property outlines as areas whenever possible. Place points inside a building area to represent businesses, amenities, and other features located inside the building.","add_area_h":"Adding Areas","add_area_command":"To add an area, click the {area} **Area** button on the toolbar above the map, or press the shortcut key `3`. This will change the mouse cursor to a cross symbol.","add_area_draw":"Next, position the mouse cursor at one of the corners of the feature and {leftclick} left-click or press `Space` to begin placing nodes around the outer edge of the area. Continue placing more nodes by clicking or pressing `Space`. While drawing, you can zoom in or drag the map in order to add more detail.","add_area_finish":"To finish an area, press `{return}` or click again on either the first or last node.","square_area_h":"Square Corners","square_area_command":"Many area features like buildings have square corners. To square the corners of an area, {rightclick} right-click the edge of the area and select the {orthogonalize} **Square** command from the editing menu.","modify_area_h":"Modifying Areas","modify_area_dragnode":"Often you'll see areas that aren't shaped correctly, for example a building that does not match up with the background imagery. To adjust the shape of an area, first {leftclick} left-click to select it. All nodes of the area will be drawn as small circles. You can then drag the nodes to better locations.","modify_area_addnode":"You can also create new nodes along an area either by {leftclick}**x2** double-clicking on the edge of the area or by dragging the small triangles at the midpoints between nodes.","delete_area_h":"Deleting Areas","delete_area":"If an area is entirely incorrect, for example a building that doesn't exist in the real world, it's OK to delete it. Be cautious when deleting features - the background imagery you are using might be outdated, and a building that looks wrong could simply be newly built.","delete_area_command":"To delete an area, {rightclick} right-click on the area to select it and show the edit menu, then use the {delete} **Delete** command."},"relations":{"title":"Relations","intro":"A *relation* is a special type of feature in OpenStreetMap that groups together other features. The features that belong to a relation are called *members*, and each member can have a *role* in the relation.","edit_relation_h":"Editing Relations","edit_relation":"At the bottom of the feature editor, you can expand the \"All relations\" section to see if the selected feature is a member of any relations. You can then click on the relation to select and edit it.","edit_relation_add":"To add a feature to a relation, select the feature, then click the {plus} add button in the \"All relations\" section of the feature editor. You can choose from a list of nearby relations, or choose the \"New relation...\" option.","edit_relation_delete":"You can also click the {delete} **Delete** button to remove the selected feature from the relation. If you remove all of the members from a relation, the relation will be deleted automatically.","maintain_relation_h":"Maintaining Relations","maintain_relation":"For the most part, iD will maintain relations automatically as you edit. You should take care when replacing features that might be members of relations. For example if you delete a section of road and draw a new section of road to replace it, you should add the new section to the same relations (routes, turn restrictions, etc.) as the original.","relation_types_h":"Relation Types","multipolygon_h":"Multipolygons","multipolygon":"A *multipolygon* relation is a group of one or more *outer* features and one or more inner features. The outer features define the outer edges of the multipolygon, and the inner features define sub-areas or holes cut out from the inside of the multipolygon.","multipolygon_create":"To create a multipolygon, for example a building with a hole in it, draw the outer edge as an area and the inner edge as a line or different kind of area. Then `{shift}`+{leftclick} left-click to select both features, {rightclick} right-click to show the edit menu, and select the {merge} **Merge** command.","multipolygon_merge":"Merging several lines or areas will create a new multipolygon relation with all selected areas as members. iD will choose the inner and outer roles automatically, based on which features are contained inside other features.","turn_restriction_h":"Turn restrictions","turn_restriction":"A *turn restriction* relation is a group of several road segments in an intersection. Turn restrictions consist of a *from* road, *via* node or roads, and a *to* road.","turn_restriction_field":"To edit turn restrictions, select a junction node where two or more roads meet. The feature editor will display a special \"Turn Restrictions\" field containing a model of the intersection.","turn_restriction_editing":"In the \"Turn Restrictions\" field, click to select a \"from\" road, and see whether turns are allowed or restricted to any of the \"to\" roads. You can click on the turn icons to toggle them between allowed and restricted. iD will create relations automatically and set the from, via, and to roles based on your choices.","route_h":"Routes","route":"A *route* relation is a group of one or more line features that together form a route network, like a bus route, train route, or highway route.","route_add":"To add a feature to a route relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation.","boundary_h":"Boundaries","boundary":"A *boundary* relation is a group of one or more line features that together form an administrative boundary.","boundary_add":"To add a feature to a boundary relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation."},"imagery":{"title":"Background Imagery","intro":"The background imagery that appears beneath the map data is an important resource for mapping. This imagery can be aerial photos collected from satellites, airplanes, and drones, or it can be scanned historical maps or other freely available source data.","sources_h":"Imagery Sources","choosing":"To see which imagery sources are available for editing, click the {layers} **Background settings** button on the side of the map.","sources":"By default, a [Bing Maps](https://www.bing.com/maps/) satellite layer is chosen as the background image. Depending on where you are editing, other imagery sources will be available. Some may be newer or have higher resolution, so it is always useful to check and see which layer is the best one to use as a mapping reference.","offsets_h":"Adjusting Imagery Offset","offset":"Imagery is sometimes offset slightly from accurate map data. If you see a lot of roads or buildings shifted from the background imagery, it may be the imagery that's incorrect, so don't move them all to match the background. Instead, you can adjust the background so that it matches the existing data by expanding the \"Adjust Imagery Offset\" section at the bottom of the Background Settings pane.","offset_change":"Click on the small triangles to adjust the imagery offset in small steps, or hold the left mouse button and drag within the gray square to slide the imagery into alignment."},"streetlevel":{"title":"Street Level Photos","intro":"Street level photos are useful for mapping traffic signs, businesses, and other details that you can't see from satellite and aerial images. The iD editor supports street level photos from [Mapillary](https://www.mapillary.com) and [OpenStreetCam](https://www.openstreetcam.org).","using_h":"Using Street Level Photos","using":"To use street level photos for mapping, click the {data} **Map data** panel on the side of the map to enable or disable the available photo layers.","photos":"When enabled, the photo layer displays a line along the sequence of photos. At higher zoom levels, a circle marks at each photo location, and at even higher zoom levels, a cone indicates the direction the camera was facing when the photo was taken.","viewer":"When you click on one of the photo locations, a photo viewer appears in the bottom corner of the map. The photo viewer contains controls to step forward and backward in the image sequence. It also shows the username of the person who captured the image, the date it was captured, and a link to view the image on the original site."},"gps":{"title":"GPS Traces","intro":"Collected GPS traces are a valuable source of data for OpenStreetMap. This editor supports *.gpx*, *.geojson*, and *.kml* files on your local computer. You can collect GPS traces with a smartphone, sports watch, or other GPS device.","survey":"For information on how to perform a GPS survey, read [Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/).","using_h":"Using GPS Traces","using":"To use a GPS trace for mapping, drag and drop the data file onto the map editor. If it's recognized, it will be drawn on the map as a bright purple line. Click the {data} **Map data** panel on the side of the map to enable, disable, or zoom to your GPS data.","tracing":"The GPS track isn't sent to OpenStreetMap - the best way to use it is to draw on the map, using it as a guide for the new features that you add.","upload":"You can also [upload your GPS data to OpenStreetMap](https://www.openstreetmap.org/trace/create) for other users to use."},"field":{"restrictions":{"title":"Turn Restrictions Help","about":{"title":"About","about":"This field allows you to inspect and modify turn restrictions. It displays a model of the selected intersection including other nearby connected roads.","from_via_to":"A turn restriction always contains: one **FROM way**, one **TO way**, and either one **VIA node** or one or more **VIA ways**.","maxdist":"The \"{distField}\" slider controls how far to search for additional connected roads.","maxvia":"The \"{viaField}\" slider adjusts how many via ways may be included in the search. (Tip: simple is better)"},"inspecting":{"title":"Inspecting","about":"Hover over any **FROM** segment to see whether it has any turn restrictions. Each possible **TO** destination will be drawn with a colored shadow showing whether a restriction exists.","from_shadow":"{fromShadow} **FROM segment**","allow_shadow":"{allowShadow} **TO Allowed**","restrict_shadow":"{restrictShadow} **TO Restricted**","only_shadow":"{onlyShadow} **TO Only**","restricted":"\"Restricted\" means that there is a turn restriction, for example \"No Left Turn\".","only":"\"Only\" means that a vehicle taking that path may only make that choice, for example \"Only Straight On\"."},"modifying":{"title":"Modifying","about":"To modify turn restrictions, first click on any starting **FROM** segment to select it. The selected segment will pulse, and all possible **TO** destinations will appear as turn symbols.","indicators":"Then, click on a turn symbol to toggle it between \"Allowed\", \"Restricted\", and \"Only\".","allow_turn":"{allowTurn} **TO Allowed**","restrict_turn":"{restrictTurn} **TO Restricted**","only_turn":"{onlyTurn} **TO Only**"},"tips":{"title":"Tips","simple":"**Prefer simple restrictions over complex ones.**","simple_example":"For example, avoid creating a via-way restriction if a simpler via-node turn restriction will do.","indirect":"**Some restrictions display the text \"(indirect)\" and are drawn lighter.**","indirect_example":"These restrictions exist because of another nearby restriction. For example, an \"Only Straight On\" restriction will indirectly create \"No Turn\" restrictions for all other paths through the intersection.","indirect_noedit":"You may not edit indirect restrictions. Instead, edit the nearby direct restriction."}}}},"intro":{"done":"done","ok":"OK","graph":{"block_number":"<value for addr:block_number>","city":"Three Rivers","county":"<value for addr:county>","district":"<value for addr:district>","hamlet":"<value for addr:hamlet>","neighbourhood":"<value for addr:neighbourhood>","postcode":"49093","province":"<value for addr:province>","quarter":"<value for addr:quarter>","state":"MI","subdistrict":"<value for addr:subdistrict>","suburb":"<value for addr:suburb>","countrycode":"us","name":{"1st-avenue":"1st Avenue","2nd-avenue":"2nd Avenue","4th-avenue":"4th Avenue","5th-avenue":"5th Avenue","6th-avenue":"6th Avenue","6th-street":"6th Street","7th-avenue":"7th Avenue","8th-avenue":"8th Avenue","9th-avenue":"9th Avenue","10th-avenue":"10th Avenue","11th-avenue":"11th Avenue","12th-avenue":"12th Avenue","access-point-employment":"Access Point Employment","adams-street":"Adams Street","andrews-elementary-school":"Andrews Elementary School","andrews-street":"Andrews Street","armitage-street":"Armitage Street","barrows-school":"Barrows School","battle-street":"Battle Street","bennett-street":"Bennett Street","bowman-park":"Bowman Park","collins-drive":"Collins Drive","conrail-railroad":"Conrail Railroad","conservation-park":"Conservation Park","constantine-street":"Constantine Street","cushman-street":"Cushman Street","dollar-tree":"Dollar Tree","douglas-avenue":"Douglas Avenue","east-street":"East Street","elm-street":"Elm Street","flower-street":"Flower Street","foster-street":"Foster Street","french-street":"French Street","garden-street":"Garden Street","gem-pawnbroker":"Gem Pawnbroker","golden-finch-framing":"Golden Finch Framing","grant-avenue":"Grant Avenue","hoffman-pond":"Hoffman Pond","hoffman-street":"Hoffman Street","hook-avenue":"Hook Avenue","jefferson-street":"Jefferson Street","kelsey-street":"Kelsey Street","lafayette-park":"LaFayette Park","las-coffee-cafe":"L.A.'s Coffee Cafe","lincoln-avenue":"Lincoln Avenue","lowrys-books":"Lowry's Books","lynns-garage":"Lynn's Garage","main-street-barbell":"Main Street Barbell","main-street-cafe":"Main Street Cafe","main-street-fitness":"Main Street Fitness","main-street":"Main Street","maple-street":"Maple Street","marina-park":"Marina Park","market-street":"Market Street","memory-isle-park":"Memory Isle Park","memory-isle":"Memory Isle","michigan-avenue":"Michigan Avenue","middle-street":"Middle Street","millard-street":"Millard Street","moore-street":"Moore Street","morris-avenue":"Morris Avenue","mural-mall":"Mural Mall","paisanos-bar-and-grill":"Paisano's Bar and Grill","paisley-emporium":"Paisley Emporium","paparazzi-tattoo":"Paparazzi Tattoo","pealer-street":"Pealer Street","pine-street":"Pine Street","pizza-hut":"Pizza Hut","portage-avenue":"Portage Avenue","portage-river":"Portage River","preferred-insurance-services":"Preferred Insurance Services","railroad-drive":"Railroad Drive","river-city-appliance":"River City Appliance","river-drive":"River Drive","river-road":"River Road","river-street":"River Street","riverside-cemetery":"Riverside Cemetery","riverwalk-trail":"Riverwalk Trail","riviera-theatre":"Riviera Theatre","rocky-river":"Rocky River","saint-joseph-river":"Saint Joseph River","scidmore-park-petting-zoo":"Scidmore Park Petting Zoo","scidmore-park":"Scidmore Park","scouter-park":"Scouter Park","sherwin-williams":"Sherwin-Williams","south-street":"South Street","southern-michigan-bank":"Southern Michigan Bank","spring-street":"Spring Street","sturgeon-river-road":"Sturgeon River Road","three-rivers-city-hall":"Three Rivers City Hall","three-rivers-elementary-school":"Three Rivers Elementary School","three-rivers-fire-department":"Three Rivers Fire Department","three-rivers-high-school":"Three Rivers High School","three-rivers-middle-school":"Three Rivers Middle School","three-rivers-municipal-airport":"Three Rivers Municipal Airport","three-rivers-post-office":"Three Rivers Post Office","three-rivers-public-library":"Three Rivers Public Library","three-rivers":"Three Rivers","unique-jewelry":"Unique Jewelry","walnut-street":"Walnut Street","washington-street":"Washington Street","water-street":"Water Street","west-street":"West Street","wheeler-street":"Wheeler Street","william-towing":"William Towing","willow-drive":"Willow Drive","wood-street":"Wood Street","world-fare":"World Fare"}},"welcome":{"title":"Welcome","welcome":"Welcome! This walkthrough will teach you the basics of editing on OpenStreetMap.","practice":"All of the data in this walkthrough is just for practicing, and any edits that you make in the walkthrough will not be saved.","words":"This walkthrough will introduce some new words and concepts. When we introduce a new word, we'll use *italics*.","mouse":"You can use any input device to edit the map, but this walkthrough assumes you have a mouse with left and right buttons. **If you want to attach a mouse, do so now, then click OK.**","leftclick":"When this tutorial asks you to click or double-click, we mean with the left button. On a trackpad it might be a single-click or single-finger tap. **Left-click {num} times.**","rightclick":"Sometimes we'll also ask you to right-click. This might be the same as control-click, or two-finger tap on a trackpad. Your keyboard might even have a 'menu' key that works like right-click. **Right-click {num} times.**","chapters":"So far, so good! You can use the buttons below to skip chapters at any time or to restart a chapter if you get stuck. Let's begin! **Click '{next}' to continue.**"},"navigation":{"title":"Navigation","drag":"The main map area shows OpenStreetMap data on top of a background.{br}You can drag the map by pressing and holding the left mouse button while moving the mouse around. You can also use the arrow keys on your keyboard. **Drag the map!**","zoom":"You can zoom in or out by scrolling with the mouse wheel or trackpad, or by clicking the {plus} / {minus} buttons. **Zoom the map!**","features":"We use the word *features* to describe the things that appear on the map. Anything in the real world can be mapped as a feature on OpenStreetMap.","points_lines_areas":"Map features are represented using *points, lines, or areas.*","nodes_ways":"In OpenStreetMap, points are sometimes called *nodes*, and lines and areas are sometimes called *ways*.","click_townhall":"All features on the map can be selected by clicking on them. **Click on the point to select it.**","selected_townhall":"Great! The point is now selected. Selected features are drawn with a pulsing glow.","editor_townhall":"When a feature is selected, the *feature editor* is displayed alongside the map.","preset_townhall":"The top part of the feature editor shows the feature's type. This point is a {preset}.","fields_townhall":"The middle part of the feature editor contains *fields* showing the feature's attributes, such as its name and address.","close_townhall":"**Close the feature editor by hitting escape or pressing the {button} button in the upper corner.**","search_street":"You can also search for features in the current view, or worldwide. **Search for '{name}'.**","choose_street":"**Choose {name} from the list to select it.**","selected_street":"Great! {name} is now selected.","editor_street":"The fields shown for a street are different than the fields that were shown for the town hall.{br}For this selected street, the feature editor shows fields like '{field1}' and '{field2}'. **Close the feature editor by hitting escape or pressing the {button} button.**","play":"Try moving the map and clicking on some other features to see what kinds of things can be added to OpenStreetMap. **When you are ready to continue to the next chapter, click '{next}'.**"},"points":{"title":"Points","add_point":"*Points* can be used to represent features such as shops, restaurants, and monuments.{br}They mark a specific location, and describe what's there. **Click the {button} Point button to add a new point.**","place_point":"To place the new point on the map, position your mouse cursor where the point should go, then left-click or press the spacebar. **Move the mouse pointer over this building, then left-click or press the spacebar.**","search_cafe":"There are many different features that can be represented by points. The point you just added is a cafe. **Search for '{preset}'.**","choose_cafe":"**Choose {preset} from the list.**","feature_editor":"The point is now marked as a cafe. Using the feature editor, we can add more information about the cafe.","add_name":"In OpenStreetMap, all of the fields are optional, and it's OK to leave a field blank if you are unsure.{br}Let's pretend that you have local knowledge of this cafe, and you know its name. **Add a name for the cafe.**","add_close":"The feature editor will remember all of your changes automatically. **When you are finished adding the name, hit escape, enter, or click the {button} button to close the feature editor.**","reselect":"Often points will already exist, but have mistakes or be incomplete. We can edit existing points. **Click to select the cafe you just created.**","update":"Let's fill in some more details for this cafe. You can change its name, add a cuisine, or add an address. **Change the cafe details.**","update_close":"**When you are finished updating the cafe, hit escape, enter, or click the {button} button to close the feature editor.**","rightclick":"You can right-click on any feature to see the *edit menu*, which shows a list of editing operations that can be performed. **Right-click to select the point you created and show the edit menu.**","delete":"It's OK to delete features that don't exist in the real world.{br}Deleting a feature from OpenStreetMap removes it from the map that everyone uses, so you should make sure a feature is really gone before you delete it. **Click on the {button} button to delete the point.**","undo":"You can always undo any changes up until you save your edits to OpenStreetMap. **Click on the {button} button to undo the delete and get the point back.**","play":"Now that you know how to create and edit points, try creating a few more points for practice! **When you are ready to continue to the next chapter, click '{next}'.**"},"areas":{"title":"Areas","add_playground":"*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas.{br}They can also be used for more detailed mapping of many features you might normally map as points. **Click the {button} Area button to add a new area.**","start_playground":"Let's add this playground to the map by drawing an area. Areas are drawn by placing *nodes* along the outer edge of the feature. **Click or press spacebar to place a starting node on one of the corners of the playground.**","continue_playground":"Continue drawing the area by placing more nodes along the playground's edge. It is OK to connect the area to the existing walking paths.{br}Tip: You can hold down the '{alt}' key to prevent nodes from connecting to other features. **Continue drawing an area for the playground.**","finish_playground":"Finish the area by pressing enter, or clicking again on either the first or last node. **Finish drawing an area for the playground.**","search_playground":"**Search for '{preset}'.**","choose_playground":"**Choose {preset} from the list.**","add_field":"This playground doesn't have an official name, so we won't add anything in the Name field.{br}Instead let's add some additional details about the playground to the Description field. **Open the Add Field list.**","choose_field":"**Choose {field} from the list.**","retry_add_field":"You didn't select the {field} field. Let's try again.","describe_playground":"**Add a description, then click the {button} button to close the feature editor.**","play":"Good job! Try drawing a few more areas, and see what other kinds of area features you can add to OpenStreetMap. **When you are ready to continue to the next chapter, click '{next}'.**"},"lines":{"title":"Lines","add_line":"*Lines* are used to represent features such as roads, railroads, and rivers. **Click the {button} Line button to add a new line.**","start_line":"Here is a road that is missing. Let's add it!{br}In OpenStreetMap, lines should be drawn down the center of the road. You can drag and zoom the map while drawing if necessary. **Start a new line by clicking at the top end of this missing road.**","intersect":"Click or press spacebar to add more nodes to the line.{br}Roads, and many other types of lines, are part of a larger network. It is important for these lines to be connected properly in order for routing applications to work. **Click on {name} to create an intersection connecting the two lines.**","retry_intersect":"The road needs to intersect {name}. Let's try again!","continue_line":"Continue drawing the line for the new road. Remember that you can drag and zoom the map if needed.{br}When you are finished drawing, click on the last node again. **Finish drawing the road.**","choose_category_road":"**Select {category} from the list.**","choose_preset_residential":"There are many different types of roads, but this one is a residential road. **Choose the {preset} type.**","retry_preset_residential":"You didn't select the {preset} type. **Click here to choose again.**","name_road":"**Give this road a name, then hit escape, enter, or click the {button} button to close the feature editor.**","did_name_road":"Looks good! Next we will learn how to update the shape of a line.","update_line":"Sometimes you will need to change the shape of an existing line. Here is a road that doesn't look quite right.","add_node":"We can add some nodes to this line to improve its shape. One way to add a node is to double-click the line where you want to add a node. **Double-click on the line to create a new node.**","start_drag_endpoint":"When a line is selected, you can drag any of its nodes by clicking and holding down the left mouse button while you drag. **Drag the endpoint to the place where these roads should intersect.**","finish_drag_endpoint":"This spot looks good. **Release the left mouse button to finish dragging.**","start_drag_midpoint":"Small triangles are drawn at the *midpoints* between nodes. Another way to create a new node is to drag a midpoint to a new location. **Drag the midpoint triangle to create a new node along the curve of the road.**","continue_drag_midpoint":"This line is looking much better! Continue to adjust this line by double-clicking or dragging midpoints until the curve matches the road shape. **When you're happy with how the line looks, click OK.**","delete_lines":"It's OK to delete lines for roads that don't exist in the real world.{br}Here's an example where the city planned a {street} but never built it. We can improve this part of the map by deleting the extra lines.","rightclick_intersection":"The last real street is {street1}, so we will *split* {street2} at this intersection and remove everything above it. **Right click on the intersection node.**","split_intersection":"**Click on the {button} button to split {street}.**","retry_split":"You didn't click the Split button. Try again.","did_split_multi":"Good job! {street1} is now split into two pieces. The top part can be removed. **Click the top part of {street2} to select it.**","did_split_single":"**Click the top part of {street2} to select it.**","multi_select":"{selected} is now selected. Let's also select {other1}. You can shift-click to select multiple things. **Shift-click on {other2}.**","multi_rightclick":"Good! Both lines to delete are now selected. **Right-click on one of the lines to show the edit menu.**","multi_delete":"**Click on the {button} button to delete the extra lines.**","retry_delete":"You didn't click the Delete button. Try again.","play":"Great! Use the skills that you've learned in this chapter to practice editing some more lines. **When you are ready to continue to the next chapter, click '{next}'.**"},"buildings":{"title":"Buildings","add_building":"OpenStreetMap is the world's largest database of buildings.{br}You can help improve this database by tracing buildings that aren't already mapped. **Click the {button} Area button to add a new area.**","start_building":"Let's add this house to the map by tracing its outline.{br}Buildings should be traced around their footprint as accurately as possible. **Click or press spacebar to place a starting node on one of the corners of the building.**","continue_building":"Continue adding more nodes to trace the outline of the building. Remember that you can zoom in if you want to add more details.{br}Finish the building by pressing enter, or clicking again on either the first or last node. **Finish tracing the building.**","retry_building":"It looks like you had some trouble placing the nodes at the building corners. Try again!","choose_category_building":"**Choose {category} from the list.**","choose_preset_house":"There are many different types of buildings, but this one is clearly a house.{br}If you're not sure of the type, it's OK to just choose the generic Building type. **Choose the {preset} type.**","close":"**Hit escape or click the {button} button to close the feature editor.**","rightclick_building":"**Right-click to select the building you created and show the edit menu.**","square_building":"The house that you just added will look even better with perfectly square corners. **Click on the {button} button to square the building shape.**","retry_square":"You didn't click the Square button. Try again.","done_square":"See how the corners of the building moved into place? Let's learn another useful trick.","add_tank":"Next we'll trace this circular storage tank. **Click the {button} Area button to add a new area.**","start_tank":"Don't worry, you won't need to draw a perfect circle. Just draw an area inside the tank that touches its edge. **Click or press spacebar to place a starting node on the edge of the tank.**","continue_tank":"Add a few more nodes around the edge. The circle will be created outside the nodes that you draw.{br}Finish the area by pressing enter, or clicking again on either the first or last node. **Finish tracing the tank.**","search_tank":"**Search for '{preset}'.**","choose_tank":"**Choose {preset} from the list.**","rightclick_tank":"**Right-click to select the storage tank you created and show the edit menu.**","circle_tank":"**Click on the {button} button to make the tank a circle.**","retry_circle":"You didn't click the Circularize button. Try again.","play":"Great Job! Practice tracing a few more buildings, and try some of the other commands on the edit menu. **When you are ready to continue to the next chapter, click '{next}'.**"},"startediting":{"title":"Start Editing","help":"You're now ready to edit OpenStreetMap!{br}You can replay this walkthrough anytime or view more documentation by clicking the {button} Help button or pressing the '{key}' key.","shortcuts":"You can view a list of commands along with their keyboard shortcuts by pressing the '{key}' key.","save":"Don't forget to regularly save your changes!","start":"Start mapping!"}},"shortcuts":{"title":"Keyboard shortcuts","tooltip":"Show the keyboard shortcuts screen.","toggle":{"key":"?"},"key":{"alt":"Alt","backspace":"Backspace","cmd":"Cmd","ctrl":"Ctrl","delete":"Delete","del":"Del","end":"End","enter":"Enter","esc":"Esc","home":"Home","option":"Option","pause":"Pause","pgdn":"PgDn","pgup":"PgUp","return":"Return","shift":"Shift","space":"Space"},"gesture":{"drag":"drag"},"or":"-or-","browsing":{"title":"Browsing","navigation":{"title":"Navigation","pan":"Pan map","pan_more":"Pan map by one screenful","zoom":"Zoom in / Zoom out","zoom_more":"Zoom in / Zoom out by a lot"},"help":{"title":"Help","help":"Show help/documentation","keyboard":"Show keyboard shortcuts"},"display_options":{"title":"Display options","background":"Show background options","background_switch":"Switch back to last background","map_data":"Show map data options","fullscreen":"Enter full screen mode","wireframe":"Toggle wireframe mode","minimap":"Toggle minimap"},"selecting":{"title":"Selecting features","select_one":"Select a single feature","select_multi":"Select multiple features","lasso":"Draw a selection lasso around features","search":"Find features matching search text"},"with_selected":{"title":"With feature selected","edit_menu":"Toggle edit menu"},"vertex_selected":{"title":"With node selected","previous":"Jump to previous node","next":"Jump to next node","first":"Jump to first node","last":"Jump to last node","change_parent":"Switch parent way"}},"editing":{"title":"Editing","drawing":{"title":"Drawing","add_point":"'Add point' mode","add_line":"'Add line' mode","add_area":"'Add area' mode","place_point":"Place a point","disable_snap":"Hold to disable point snapping","stop_line":"Finish drawing a line or area"},"operations":{"title":"Operations","continue_line":"Continue a line at the selected node","merge":"Combine (merge) selected features","disconnect":"Disconnect features at the selected node","split":"Split a line into two at the selected node","reverse":"Reverse a line","move":"Move selected features","rotate":"Rotate selected features","orthogonalize":"Straighten line / Square area corners","circularize":"Circularize a closed line or area","reflect_long":"Reflect features across the longer axis","reflect_short":"Reflect features across the shorter axis","delete":"Delete selected features"},"commands":{"title":"Commands","copy":"Copy selected features","paste":"Paste copied features","undo":"Undo last action","redo":"Redo last action","save":"Save changes"}},"tools":{"title":"Tools","info":{"title":"Information","all":"Toggle all information panels","background":"Toggle background panel","history":"Toggle history panel","location":"Toggle location panel","measurement":"Toggle measurement panel"}}},"units":{"feet":"{quantity} ft","miles":"{quantity} mi","square_feet":"{quantity} sq ft","square_miles":"{quantity} sq mi","acres":"{quantity} ac","meters":"{quantity} m","kilometers":"{quantity} km","square_meters":"{quantity} m²","square_kilometers":"{quantity} km²","hectares":"{quantity} ha","area_pair":"{area1} ({area2})","arcdegrees":"{quantity}°","arcminutes":"{quantity}′","arcseconds":"{quantity}″","north":"N","south":"S","east":"E","west":"W","coordinate":"{coordinate}{direction}","coordinate_pair":"{latitude}, {longitude}"},"presets":{"categories":{"category-barrier":{"name":"Barrier Features"},"category-building":{"name":"Building Features"},"category-golf":{"name":"Golf Features"},"category-landuse":{"name":"Land Use Features"},"category-natural-area":{"name":"Natural Features"},"category-natural-line":{"name":"Natural Features"},"category-natural-point":{"name":"Natural Features"},"category-path":{"name":"Path Features"},"category-rail":{"name":"Rail Features"},"category-restriction":{"name":"Restriction Features"},"category-road":{"name":"Road Features"},"category-route":{"name":"Route Features"},"category-water-area":{"name":"Water Features"},"category-water-line":{"name":"Water Features"}},"fields":{"access_simple":{"label":"Allowed Access"},"access":{"label":"Allowed Access","placeholder":"Not Specified","types":{"access":"All","foot":"Foot","motor_vehicle":"Motor Vehicles","bicycle":"Bicycles","horse":"Horses"},"options":{"yes":{"title":"Allowed","description":"Access permitted by law; a right of way"},"no":{"title":"Prohibited","description":"Access not permitted to the general public"},"permissive":{"title":"Permissive","description":"Access permitted until such time as the owner revokes the permission"},"private":{"title":"Private","description":"Access permitted only with permission of the owner on an individual basis"},"designated":{"title":"Designated","description":"Access permitted according to signs or specific local laws"},"destination":{"title":"Destination","description":"Access permitted only to reach a destination"},"dismount":{"title":"Dismount","description":"Access permitted but rider must dismount"}}},"address":{"label":"Address","placeholders":{"block_number":"Block Number","block_number!jp":"Block No.","city":"City","city!jp":"City/Town/Village/Tokyo Special Ward","city!vn":"City/Town","conscriptionnumber":"123","country":"Country","county":"County","county!jp":"District","district":"District","district!vn":"Arrondissement/Town/District","floor":"Floor","hamlet":"Hamlet","housename":"Housename","housenumber":"123","housenumber!jp":"Building No./Lot No.","neighbourhood":"Neighbourhood","neighbourhood!jp":"Chōme/Aza/Koaza","place":"Place","postcode":"Postcode","province":"Province","province!jp":"Prefecture","quarter":"Quarter","quarter!jp":"Ōaza/Machi","state":"State","street":"Street","subdistrict":"Subdistrict","subdistrict!vn":"Ward/Commune/Townlet","suburb":"Suburb","suburb!jp":"Ward","unit":"Unit"}},"admin_level":{"label":"Admin Level"},"aerialway":{"label":"Type"},"aerialway/access":{"label":"Access","options":{"entry":"Entry","exit":"Exit","both":"Both"}},"aerialway/bubble":{"label":"Bubble"},"aerialway/capacity":{"label":"Capacity (per hour)","placeholder":"500, 2500, 5000..."},"aerialway/duration":{"label":"Duration (minutes)","placeholder":"1, 2, 3..."},"aerialway/heating":{"label":"Heated"},"aerialway/occupancy":{"label":"Occupancy","placeholder":"2, 4, 8..."},"aerialway/summer/access":{"label":"Access (summer)","options":{"entry":"Entry","exit":"Exit","both":"Both"}},"aeroway":{"label":"Type"},"agrarian":{"label":"Products"},"amenity":{"label":"Type"},"animal_boarding":{"label":"For Animals"},"animal_breeding":{"label":"For Animals"},"animal_shelter":{"label":"For Animals"},"area/highway":{"label":"Type"},"artist":{"label":"Artist"},"artwork_type":{"label":"Type"},"atm":{"label":"ATM"},"backrest":{"label":"Backrest"},"barrier":{"label":"Type"},"bath/open_air":{"label":"Open Air"},"bath/sand_bath":{"label":"Sand Bath"},"bath/type":{"label":"Specialty","options":{"onsen":"Japanese Onsen","foot_bath":"Foot Bath","hot_spring":"Hot Spring"}},"beauty":{"label":"Shop Type"},"bench":{"label":"Bench"},"bicycle_parking":{"label":"Type"},"bin":{"label":"Waste Bin"},"blood_components":{"label":"Blood Components","options":{"whole":"whole blood","plasma":"plasma","platelets":"platelets","stemcells":"stem cell samples"}},"board_type":{"label":"Type"},"boules":{"label":"Type"},"boundary":{"label":"Type"},"brand":{"label":"Brand"},"brewery":{"label":"Draft Beers"},"bridge":{"label":"Type","placeholder":"Default"},"building_area":{"label":"Building"},"building":{"label":"Building"},"bunker_type":{"label":"Type"},"cables":{"label":"Cables","placeholder":"1, 2, 3..."},"camera/direction":{"label":"Direction (Degrees Clockwise)","placeholder":"45, 90, 180, 270"},"camera/mount":{"label":"Camera Mount"},"camera/type":{"label":"Camera Type","options":{"fixed":"Fixed","panning":"Panning","dome":"Dome"}},"capacity":{"label":"Capacity","placeholder":"50, 100, 200..."},"castle_type":{"label":"Type"},"clothes":{"label":"Clothes"},"club":{"label":"Type"},"collection_times":{"label":"Collection Times"},"comment":{"label":"Changeset Comment","placeholder":"Brief description of your contributions (required)"},"communication_multi":{"label":"Communication Types"},"construction":{"label":"Type"},"contact/webcam":{"label":"Webcam URL","placeholder":"http://example.com/"},"content":{"label":"Content"},"country":{"label":"Country"},"covered":{"label":"Covered"},"craft":{"label":"Type"},"crane/type":{"label":"Crane Type","options":{"portal_crane":"Portal Crane","floor-mounted_crane":"Floor-mounted Crane","travel_lift":"Travel Lift"}},"crop":{"label":"Crops"},"crossing":{"label":"Type"},"cuisine":{"label":"Cuisines"},"currency_multi":{"label":"Currency Types"},"cutting":{"label":"Type","placeholder":"Default"},"cycle_network":{"label":"Network"},"cycleway":{"label":"Bike Lanes","placeholder":"none","types":{"cycleway:left":"Left side","cycleway:right":"Right side"},"options":{"none":{"title":"None","description":"No bike lane"},"lane":{"title":"Standard bike lane","description":"A bike lane separated from auto traffic by a painted line"},"shared_lane":{"title":"Shared bike lane","description":"A bike lane with no separation from auto traffic"},"track":{"title":"Bike track","description":"A bike lane separated from traffic by a physical barrier"},"share_busway":{"title":"Bike lane shared with bus","description":"A bike lane shared with a bus lane"},"opposite_lane":{"title":"Opposite bike lane","description":"A bike lane that travels in the opposite direction of traffic"},"opposite":{"title":"Contraflow bike lane","description":"A bike lane that travels in both directions on a one-way street"}}},"dance/style":{"label":"Dance Styles"},"date":{"label":"Date"},"delivery":{"label":"Delivery"},"denomination":{"label":"Denomination"},"denotation":{"label":"Denotation"},"description":{"label":"Description"},"devices":{"label":"Devices","placeholder":"1, 2, 3..."},"diaper":{"label":"Diaper Changing Available"},"direction_cardinal":{"label":"Direction","options":{"N":"North","E":"East","S":"South","W":"West","NE":"Northeast","SE":"Southeast","SW":"Southwest","NW":"Northwest","NNE":"North-northeast","ENE":"East-northeast","ESE":"East-southeast","SSE":"South-southeast","SSW":"South-southwest","WSW":"West-southwest","WNW":"West-northwest","NNW":"North-northwest"}},"direction_clock":{"label":"Direction","options":{"clockwise":"Clockwise","anticlockwise":"Counterclockwise"}},"direction_vertex":{"label":"Direction","options":{"forward":"Forward","backward":"Backward","both":"Both / All"}},"direction":{"label":"Direction (Degrees Clockwise)","placeholder":"45, 90, 180, 270"},"dispensing":{"label":"Dispenses Prescriptions"},"display":{"label":"Display"},"dock":{"label":"Type"},"drive_through":{"label":"Drive-Through"},"duration":{"label":"Duration","placeholder":"00:00"},"electrified":{"label":"Electrification","placeholder":"Contact Line, Electrified Rail...","options":{"contact_line":"Contact Line","rail":"Electrified Rail","yes":"Yes (unspecified)","no":"No"}},"elevation":{"label":"Elevation"},"email":{"label":"Email","placeholder":"example@example.com"},"embankment":{"label":"Type","placeholder":"Default"},"emergency":{"label":"Emergency"},"entrance":{"label":"Type"},"except":{"label":"Exceptions"},"fax":{"label":"Fax","placeholder":"+31 42 123 4567"},"fee":{"label":"Fee"},"fence_type":{"label":"Type"},"fire_hydrant/position":{"label":"Position","options":{"lane":"Lane","parking_lot":"Parking Lot","sidewalk":"Sidewalk","green":"Green"}},"fire_hydrant/type":{"label":"Type","options":{"pillar":"Pillar/Aboveground","underground":"Underground","wall":"Wall","pond":"Pond"}},"fitness_station":{"label":"Equipment Type"},"fixme":{"label":"Fix Me"},"ford":{"label":"Type","placeholder":"Default"},"frequency":{"label":"Operating Frequency"},"fuel_multi":{"label":"Fuel Types"},"fuel":{"label":"Fuel"},"gauge":{"label":"Gauge"},"gender":{"label":"Gender","placeholder":"Unknown","options":{"male":"Male","female":"Female","unisex":"Unisex"}},"generator/method":{"label":"Method"},"generator/output/electricity":{"label":"Power Output","placeholder":"50 MW, 100 MW, 200 MW..."},"generator/source":{"label":"Source"},"generator/type":{"label":"Type"},"government":{"label":"Type"},"grape_variety":{"label":"Grape Varieties"},"handicap":{"label":"Handicap","placeholder":"1-18"},"handrail":{"label":"Handrail"},"hashtags":{"label":"Suggested Hashtags","placeholder":"#example"},"healthcare":{"label":"Type"},"healthcare/speciality":{"label":"Specialties"},"height":{"label":"Height (Meters)"},"highway":{"label":"Type"},"historic":{"label":"Type"},"historic/civilization":{"label":"Historic Civilization"},"hoops":{"label":"Hoops","placeholder":"1, 2, 4..."},"iata":{"label":"IATA"},"icao":{"label":"ICAO"},"incline_steps":{"label":"Incline","options":{"up":"Up","down":"Down"}},"incline":{"label":"Incline"},"indoor":{"label":"Indoor"},"information":{"label":"Type"},"inscription":{"label":"Inscription"},"intermittent":{"label":"Intermittent"},"internet_access":{"label":"Internet Access","options":{"yes":"Yes","no":"No","wlan":"Wifi","wired":"Wired","terminal":"Terminal"}},"internet_access/fee":{"label":"Internet Access Fee"},"internet_access/ssid":{"label":"SSID (Network Name)"},"kerb":{"label":"Curb"},"label":{"label":"Label"},"lamp_type":{"label":"Type"},"landuse":{"label":"Type"},"lanes":{"label":"Lanes","placeholder":"1, 2, 3..."},"layer":{"label":"Layer","placeholder":"0"},"leaf_cycle_singular":{"label":"Leaf Cycle","options":{"evergreen":"Evergreen","deciduous":"Deciduous","semi_evergreen":"Semi-Evergreen","semi_deciduous":"Semi-Deciduous"}},"leaf_cycle":{"label":"Leaf Cycle","options":{"evergreen":"Evergreen","deciduous":"Deciduous","semi_evergreen":"Semi-Evergreen","semi_deciduous":"Semi-Deciduous","mixed":"Mixed"}},"leaf_type_singular":{"label":"Leaf Type","options":{"broadleaved":"Broadleaved","needleleaved":"Needleleaved","leafless":"Leafless"}},"leaf_type":{"label":"Leaf Type","options":{"broadleaved":"Broadleaved","needleleaved":"Needleleaved","mixed":"Mixed","leafless":"Leafless"}},"leisure":{"label":"Type"},"length":{"label":"Length (Meters)"},"level":{"label":"Level"},"levels":{"label":"Levels","placeholder":"2, 4, 6..."},"lit":{"label":"Lit"},"location":{"label":"Location"},"man_made":{"label":"Type"},"manhole":{"label":"Type"},"map_size":{"label":"Coverage"},"map_type":{"label":"Type"},"maxheight":{"label":"Max Height","placeholder":"4, 4.5, 5, 14'0\", 14'6\", 15'0\""},"maxspeed":{"label":"Speed Limit","placeholder":"40, 50, 60..."},"maxstay":{"label":"Max Stay"},"maxweight":{"label":"Max Weight"},"memorial":{"label":"Type"},"monitoring_multi":{"label":"Monitoring"},"mtb/scale":{"label":"Mountain Biking Difficulty","placeholder":"0, 1, 2, 3...","options":{"0":"0: Solid gravel/packed earth, no obstacles, wide curves","1":"1: Some loose surface, small obstacles, wide curves","2":"2: Much loose surface, large obstacles, easy hairpins","3":"3: Slippery surface, large obstacles, tight hairpins","4":"4: Loose surface or boulders, dangerous hairpins","5":"5: Maximum difficulty, boulder fields, landslides","6":"6: Not rideable except by the very best mountain bikers"}},"mtb/scale/imba":{"label":"IMBA Trail Difficulty","placeholder":"Easy, Medium, Difficult...","options":{"0":"Easiest (white circle)","1":"Easy (green circle)","2":"Medium (blue square)","3":"Difficult (black diamond)","4":"Extremely Difficult (double black diamond)"}},"mtb/scale/uphill":{"label":"Mountain Biking Uphill Difficulty","placeholder":"0, 1, 2, 3...","options":{"0":"0: Avg. incline <10%, gravel/packed earth, no obstacles","1":"1: Avg. incline <15%, gravel/packed earth, few small objects","2":"2: Avg. incline <20%, stable surface, fistsize rocks/roots","3":"3: Avg. incline <25%, variable surface, fistsize rocks/branches","4":"4: Avg. incline <30%, poor condition, big rocks/branches","5":"5: Very steep, bike generally needs to be pushed or carried"}},"name":{"label":"Name","placeholder":"Common name (if any)"},"natural":{"label":"Natural"},"network_bicycle":{"label":"Network Type","placeholder":"Local, Regional, National, International","options":{"lcn":"Local","rcn":"Regional","ncn":"National","icn":"International"}},"network_foot":{"label":"Network Type","placeholder":"Local, Regional, National, International","options":{"lwn":"Local","rwn":"Regional","nwn":"National","iwn":"International"}},"network_horse":{"label":"Network Type","placeholder":"Local, Regional, National, International","options":{"lhn":"Local","rhn":"Regional","nhn":"National","ihn":"International"}},"network_road":{"label":"Network"},"network":{"label":"Network"},"note":{"label":"Note"},"office":{"label":"Type"},"oneway_yes":{"label":"One Way","options":{"undefined":"Assumed to be Yes","yes":"Yes","no":"No","reversible":"Reversible","alternating":"Alternating"}},"oneway":{"label":"One Way","options":{"undefined":"Assumed to be No","yes":"Yes","no":"No","reversible":"Reversible","alternating":"Alternating"}},"opening_hours":{"label":"Hours"},"operator":{"label":"Operator"},"outdoor_seating":{"label":"Outdoor Seating"},"par":{"label":"Par","placeholder":"3, 4, 5..."},"park_ride":{"label":"Park and Ride"},"parking":{"label":"Type","options":{"surface":"Surface","multi-storey":"Multilevel","underground":"Underground","sheds":"Sheds","carports":"Carports","garage_boxes":"Garage Boxes","lane":"Roadside Lane"}},"payment_multi":{"label":"Payment Types"},"phases":{"label":"Phases","placeholder":"1, 2, 3..."},"phone":{"label":"Phone","placeholder":"+31 42 123 4567"},"piste/difficulty":{"label":"Difficulty","placeholder":"Easy, Intermediate, Advanced...","options":{"novice":"Novice (instructional)","easy":"Easy (green circle)","intermediate":"Intermediate (blue square)","advanced":"Advanced (black diamond)","expert":"Expert (double black diamond)","freeride":"Freeride (off-piste)","extreme":"Extreme (climbing equipment required)"}},"piste/grooming":{"label":"Grooming","options":{"classic":"Classic","mogul":"Mogul","backcountry":"Backcountry","classic+skating":"Classic and Skating","scooter":"Scooter/Snowmobile","skating":"Skating"}},"piste/type":{"label":"Type","options":{"downhill":"Downhill","nordic":"Nordic","skitour":"Skitour","sled":"Sled","hike":"Hike","sleigh":"Sleigh","ice_skate":"Ice Skate","snow_park":"Snow Park","playground":"Playground"}},"place":{"label":"Type"},"plant":{"label":"Plant"},"plant/output/electricity":{"label":"Power Output","placeholder":"500 MW, 1000 MW, 2000 MW..."},"playground/baby":{"label":"Baby Seat"},"playground/max_age":{"label":"Maximum Age"},"playground/min_age":{"label":"Minimum Age"},"population":{"label":"Population"},"power_supply":{"label":"Power Supply"},"power":{"label":"Type"},"produce":{"label":"Produce"},"product":{"label":"Products"},"railway":{"label":"Type"},"railway/position":{"label":"Milestone Position","placeholder":"Distance to one decimal (123.4)"},"railway/signal/direction":{"label":"Direction","options":{"forward":"Forward","backward":"Backward","both":"Both / All"}},"rating":{"label":"Power Rating"},"recycling_accepts":{"label":"Accepts"},"ref_aeroway_gate":{"label":"Gate Number"},"ref_golf_hole":{"label":"Hole Number","placeholder":"1-18"},"ref_highway_junction":{"label":"Junction Number"},"ref_platform":{"label":"Platform Number"},"ref_road_number":{"label":"Road Number"},"ref_route":{"label":"Route Number"},"ref_runway":{"label":"Runway Number","placeholder":"e.g. 01L/19R"},"ref_stop_position":{"label":"Stop Number"},"ref_taxiway":{"label":"Taxiway Name","placeholder":"e.g. A5"},"ref":{"label":"Reference Code"},"ref/isil":{"label":"ISIL Code"},"relation":{"label":"Type"},"religion":{"label":"Religion"},"restriction":{"label":"Type"},"restrictions":{"label":"Turn Restrictions"},"rooms":{"label":"Rooms"},"route_master":{"label":"Type"},"route":{"label":"Type"},"sac_scale":{"label":"Hiking Difficulty","placeholder":"Mountain Hiking, Alpine Hiking...","options":{"hiking":"T1: Hiking","mountain_hiking":"T2: Mountain Hiking","demanding_mountain_hiking":"T3: Demanding Mountain Hiking","alpine_hiking":"T4: Alpine Hiking","demanding_alpine_hiking":"T5: Demanding Alpine Hiking","difficult_alpine_hiking":"T6: Difficult Alpine Hiking"}},"sanitary_dump_station":{"label":"Toilet Disposal"},"seasonal":{"label":"Seasonal"},"second_hand":{"label":"Sells Used","placeholder":"Yes, No, Only","options":{"yes":"Yes","no":"No","only":"Only"}},"service_rail":{"label":"Service Type","options":{"spur":"Spur","yard":"Yard","siding":"Siding","crossover":"Crossover"}},"service_times":{"label":"Service Times"},"service":{"label":"Type"},"service/bicycle":{"label":"Services"},"service/vehicle":{"label":"Services"},"shelter_type":{"label":"Type"},"shelter":{"label":"Shelter"},"shop":{"label":"Type"},"site":{"label":"Type"},"smoking":{"label":"Smoking","placeholder":"No, Separated, Yes...","options":{"no":"No smoking anywhere","separated":"In smoking areas, not physically isolated","isolated":"In smoking areas, physically isolated","outside":"Allowed outside","yes":"Allowed everywhere","dedicated":"Dedicated to smokers (e.g. smokers' club)"}},"smoothness":{"label":"Smoothness","placeholder":"Thin Rollers, Wheels, Off-Road...","options":{"excellent":"Thin Rollers: rollerblade, skateboard","good":"Thin Wheels: racing bike","intermediate":"Wheels: city bike, wheelchair, scooter","bad":"Robust Wheels: trekking bike, car, rickshaw","very_bad":"High Clearance: light duty off-road vehicle","horrible":"Off-Road: heavy duty off-road vehicle","very_horrible":"Specialized off-road: tractor, ATV","impassable":"Impassable / No wheeled vehicle"}},"social_facility_for":{"label":"People Served"},"social_facility":{"label":"Type"},"source":{"label":"Sources"},"sport_ice":{"label":"Sports"},"sport_racing_motor":{"label":"Sports"},"sport_racing_nonmotor":{"label":"Sports"},"sport":{"label":"Sports"},"stars":{"label":"Stars"},"start_date":{"label":"Start Date"},"step_count":{"label":"Number of Steps"},"stop":{"label":"Stop Type","options":{"all":"All Ways","minor":"Minor Road"}},"structure_waterway":{"label":"Structure","placeholder":"Unknown","options":{"tunnel":"Tunnel"}},"structure":{"label":"Structure","placeholder":"Unknown","options":{"bridge":"Bridge","tunnel":"Tunnel","embankment":"Embankment","cutting":"Cutting","ford":"Ford"}},"studio":{"label":"Type"},"substance":{"label":"Substance"},"substation":{"label":"Type"},"supervised":{"label":"Supervised"},"support":{"label":"Support"},"surface":{"label":"Surface"},"surveillance":{"label":"Surveillance Kind"},"surveillance/type":{"label":"Surveillance Type","options":{"camera":"Camera","guard":"Guard","ALPR":"Automatic License Plate Reader"}},"surveillance/zone":{"label":"Surveillance Zone"},"switch":{"label":"Type","options":{"mechanical":"Mechanical","circuit_breaker":"Circuit Breaker","disconnector":"Disconnector","earthing":"Earthing"}},"tactile_paving":{"label":"Tactile Paving"},"takeaway":{"label":"Takeaway","placeholder":"Yes, No, Takeaway Only...","options":{"yes":"Yes","no":"No","only":"Takeaway Only"}},"toilets/disposal":{"label":"Disposal","options":{"flush":"Flush","pitlatrine":"Pit/Latrine","chemical":"Chemical","bucket":"Bucket"}},"toll":{"label":"Toll"},"tomb":{"label":"Type"},"tourism_attraction":{"label":"Tourism"},"tourism":{"label":"Type"},"tower/construction":{"label":"Construction","placeholder":"Guyed, Lattice, Concealed, ..."},"tower/type":{"label":"Type"},"tracktype":{"label":"Track Type","placeholder":"Solid, Mostly Solid, Soft...","options":{"grade1":"Solid: paved or heavily compacted hardcore surface","grade2":"Mostly Solid: gravel/rock with some soft material mixed in","grade3":"Even mixture of hard and soft materials","grade4":"Mostly Soft: soil/sand/grass with some hard material mixed in","grade5":"Soft: soil/sand/grass"}},"trade":{"label":"Type"},"traffic_calming":{"label":"Type"},"traffic_signals":{"label":"Type"},"traffic_signals/direction":{"label":"Direction","options":{"forward":"Forward","backward":"Backward","both":"Both / All"}},"trail_visibility":{"label":"Trail Visibility","placeholder":"Excellent, Good, Bad...","options":{"excellent":"Excellent: unambiguous path or markers everywhere","good":"Good: markers visible, sometimes require searching","intermediate":"Intermediate: few markers, path mostly visible","bad":"Bad: no markers, path sometimes invisible/pathless","horrible":"Horrible: often pathless, some orientation skills required","no":"No: pathless, excellent orientation skills required"}},"transformer":{"label":"Type","options":{"distribution":"Distribution","generator":"Generator","converter":"Converter","traction":"Traction","auto":"Autotransformer","phase_angle_regulator":"Phase Angle Regulator","auxiliary":"Auxiliary","yes":"Unknown"}},"trees":{"label":"Trees"},"tunnel":{"label":"Type","placeholder":"Default"},"vending":{"label":"Type of Goods"},"visibility":{"label":"Visibility","options":{"house":"Up to 5m (16ft)","street":"5 to 20m (16 to 65ft)","area":"Over 20m (65ft)"}},"volcano/status":{"label":"Volcano Status","options":{"active":"Active","dormant":"Dormant","extinct":"Extinct"}},"volcano/type":{"label":"Volcano Type","options":{"stratovolcano":"Stratovolcano","shield":"Shield","scoria":"Scoria"}},"voltage":{"label":"Voltage"},"voltage/primary":{"label":"Primary Voltage"},"voltage/secondary":{"label":"Secondary Voltage"},"voltage/tertiary":{"label":"Tertiary Voltage"},"wall":{"label":"Type"},"water_point":{"label":"Water Point"},"water":{"label":"Type"},"waterway":{"label":"Type"},"website":{"label":"Website","placeholder":"http://example.com/"},"wetland":{"label":"Type"},"wheelchair":{"label":"Wheelchair Access"},"wholesale":{"label":"Wholesale"},"width":{"label":"Width (Meters)"},"wikipedia":{"label":"Wikipedia"},"windings":{"label":"Windings","placeholder":"1, 2, 3..."},"windings/configuration":{"label":"Windings Configuration","options":{"star":"Star / Wye","delta":"Delta","open-delta":"Open Delta","zigzag":"Zig Zag","open":"Open","scott":"Scott","leblanc":"Leblanc"}}},"presets":{"aerialway":{"name":"Aerialway","terms":"ski lift,funifor,funitel"},"aeroway":{"name":"Aeroway","terms":""},"amenity":{"name":"Amenity","terms":""},"circular":{"name":"Traffic Circle","terms":""},"highway":{"name":"Highway","terms":""},"place":{"name":"Place","terms":""},"power":{"name":"Power","terms":""},"railway":{"name":"Railway","terms":""},"roundabout":{"name":"Roundabout","terms":""},"waterway":{"name":"Waterway","terms":""},"address":{"name":"Address","terms":""},"advertising/billboard":{"name":"Billboard","terms":""},"aerialway/station":{"name":"Aerialway Station","terms":""},"aerialway/cable_car":{"name":"Cable Car","terms":"tramway,ropeway"},"aerialway/chair_lift":{"name":"Chair Lift","terms":""},"aerialway/drag_lift":{"name":"Drag Lift","terms":""},"aerialway/gondola":{"name":"Gondola","terms":""},"aerialway/goods":{"name":"Goods Aerialway","terms":""},"aerialway/magic_carpet":{"name":"Magic Carpet Lift","terms":""},"aerialway/mixed_lift":{"name":"Mixed Lift","terms":""},"aerialway/platter":{"name":"Platter Lift","terms":"button lift,poma lift"},"aerialway/pylon":{"name":"Aerialway Pylon","terms":""},"aerialway/rope_tow":{"name":"Rope Tow Lift","terms":"handle tow,bugel lift"},"aerialway/t-bar":{"name":"T-bar Lift","terms":"tbar"},"aeroway/aerodrome":{"name":"Airport","terms":"airplane,airport,aerodrome"},"aeroway/apron":{"name":"Apron","terms":"ramp"},"aeroway/gate":{"name":"Airport Gate","terms":""},"aeroway/hangar":{"name":"Hangar","terms":""},"aeroway/helipad":{"name":"Helipad","terms":"helicopter,helipad,heliport"},"aeroway/runway":{"name":"Runway","terms":"landing strip"},"aeroway/taxiway":{"name":"Taxiway","terms":""},"aeroway/terminal":{"name":"Airport Terminal","terms":"airport,aerodrome"},"amenity/bus_station":{"name":"Bus Station / Terminal","terms":""},"amenity/coworking_space":{"name":"Coworking Space","terms":""},"amenity/ferry_terminal":{"name":"Ferry Station / Terminal","terms":""},"amenity/nursing_home":{"name":"Nursing Home","terms":""},"amenity/register_office":{"name":"Register Office","terms":""},"amenity/scrapyard":{"name":"Scrap Yard","terms":""},"amenity/swimming_pool":{"name":"Swimming Pool","terms":""},"amenity/animal_boarding":{"name":"Animal Boarding Facility","terms":"boarding,cat,cattery,dog,horse,kennel,kitten,pet,pet boarding,pet care,pet hotel,puppy,reptile"},"amenity/animal_breeding":{"name":"Animal Breeding Facility","terms":"breeding,bull,cat,cow,dog,horse,husbandry,kitten,livestock,pet breeding,puppy,reptile"},"amenity/animal_shelter":{"name":"Animal Shelter","terms":"adoption,aspca,cat,dog,horse,kitten,pet care,pet rescue,puppy,raptor,reptile,rescue,spca"},"amenity/arts_centre":{"name":"Arts Center","terms":""},"amenity/atm":{"name":"ATM","terms":"money,cash,machine"},"amenity/bank":{"name":"Bank","terms":"credit union,check,deposit,fund,investment,repository,reserve,safe,savings,stock,treasury,trust,vault"},"amenity/bar":{"name":"Bar","terms":"dive,beer,bier,booze"},"amenity/bbq":{"name":"Barbecue/Grill","terms":"bbq,grill"},"amenity/bench":{"name":"Bench","terms":"seat"},"amenity/bicycle_parking":{"name":"Bicycle Parking","terms":"bike"},"amenity/bicycle_rental":{"name":"Bicycle Rental","terms":"bike"},"amenity/bicycle_repair_station":{"name":"Bicycle Repair Tool Stand","terms":"bike,repair,chain,pump"},"amenity/biergarten":{"name":"Beer Garden","terms":"beer,bier,booze"},"amenity/boat_rental":{"name":"Boat Rental","terms":""},"amenity/bureau_de_change":{"name":"Currency Exchange","terms":"bureau de change,money changer"},"amenity/cafe":{"name":"Cafe","terms":"bistro,coffee,tea"},"amenity/car_pooling":{"name":"Car Pooling","terms":""},"amenity/car_rental":{"name":"Car Rental","terms":""},"amenity/car_sharing":{"name":"Car Sharing","terms":""},"amenity/car_wash":{"name":"Car Wash","terms":""},"amenity/casino":{"name":"Casino","terms":"gambling,roulette,craps,poker,blackjack"},"amenity/charging_station":{"name":"Charging Station","terms":"EV,Electric Vehicle,Supercharger"},"amenity/childcare":{"name":"Nursery/Childcare","terms":"daycare,orphanage,playgroup"},"amenity/cinema":{"name":"Cinema","terms":"drive-in,film,flick,movie,theater,picture,show,screen"},"amenity/clinic":{"name":"Clinic","terms":"medical,urgentcare"},"amenity/clinic/abortion":{"name":"Abortion Clinic","terms":""},"amenity/clinic/fertility":{"name":"Fertility Clinic","terms":"egg,fertility,reproductive,sperm,ovulation"},"amenity/clock":{"name":"Clock","terms":""},"amenity/college":{"name":"College Grounds","terms":"university"},"amenity/community_centre":{"name":"Community Center","terms":"event,hall"},"amenity/compressed_air":{"name":"Compressed Air","terms":""},"amenity/courthouse":{"name":"Courthouse","terms":""},"amenity/crematorium":{"name":"Crematorium","terms":"cemetery,funeral"},"amenity/dentist":{"name":"Dentist","terms":"tooth,teeth"},"amenity/doctors":{"name":"Doctor","terms":"medic*,physician"},"amenity/dojo":{"name":"Dojo / Martial Arts Academy","terms":"martial arts,dojang"},"amenity/drinking_water":{"name":"Drinking Water","terms":"fountain,potable"},"amenity/driving_school":{"name":"Driving School","terms":""},"amenity/embassy":{"name":"Embassy","terms":""},"amenity/fast_food":{"name":"Fast Food","terms":"restaurant,takeaway"},"amenity/fire_station":{"name":"Fire Station","terms":""},"amenity/food_court":{"name":"Food Court","terms":"fast food,restaurant,food"},"amenity/fountain":{"name":"Fountain","terms":""},"amenity/fuel":{"name":"Gas Station","terms":"petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel"},"amenity/grave_yard":{"name":"Graveyard","terms":""},"amenity/grit_bin":{"name":"Grit Bin","terms":"salt,sand"},"amenity/hospital":{"name":"Hospital Grounds","terms":"clinic,doctor,emergency room,health,infirmary,institution,sanatorium,sanitarium,sick,surgery,ward"},"amenity/hunting_stand":{"name":"Hunting Stand","terms":"game,gun,lookout,rifle,shoot*,wild,watch"},"amenity/ice_cream":{"name":"Ice Cream Shop","terms":"gelato,sorbet,sherbet,frozen,yogurt"},"amenity/internet_cafe":{"name":"Internet Cafe","terms":"cybercafe,taxiphone,teleboutique,coffee,cafe,net,lanhouse"},"amenity/kindergarten":{"name":"Preschool/Kindergarten Grounds","terms":"kindergarden,pre-school"},"amenity/library":{"name":"Library","terms":"book"},"amenity/love_hotel":{"name":"Love Hotel","terms":""},"amenity/marketplace":{"name":"Marketplace","terms":""},"amenity/motorcycle_parking":{"name":"Motorcycle Parking","terms":""},"amenity/music_school":{"name":"Music School","terms":"school of music"},"amenity/nightclub":{"name":"Nightclub","terms":"disco*,night club,dancing,dance club"},"amenity/parking_entrance":{"name":"Parking Garage Entrance/Exit","terms":""},"amenity/parking_space":{"name":"Parking Space","terms":""},"amenity/parking":{"name":"Car Parking","terms":""},"amenity/pavilion":{"name":"Pavilion","terms":""},"amenity/pharmacy":{"name":"Pharmacy","terms":"drug*,med*,prescription"},"amenity/place_of_worship":{"name":"Place of Worship","terms":"abbey,basilica,bethel,cathedral,chancel,chantry,chapel,church,fold,house of God,house of prayer,house of worship,minster,mission,mosque,oratory,parish,sacellum,sanctuary,shrine,synagogue,tabernacle,temple"},"amenity/place_of_worship/buddhist":{"name":"Buddhist Temple","terms":"stupa,vihara,monastery,temple,pagoda,zendo,dojo"},"amenity/place_of_worship/christian":{"name":"Church","terms":"christian,abbey,basilica,bethel,cathedral,chancel,chantry,chapel,fold,house of God,house of prayer,house of worship,minster,mission,oratory,parish,sacellum,sanctuary,shrine,tabernacle,temple"},"amenity/place_of_worship/hindu":{"name":"Hindu Temple","terms":"kovil,devasthana,mandir,kshetram,alayam,shrine,temple"},"amenity/place_of_worship/jewish":{"name":"Synagogue","terms":"jewish"},"amenity/place_of_worship/muslim":{"name":"Mosque","terms":"muslim"},"amenity/place_of_worship/shinto":{"name":"Shinto Shrine","terms":"kami,torii"},"amenity/place_of_worship/sikh":{"name":"Sikh Temple","terms":"gurudwara,temple"},"amenity/place_of_worship/taoist":{"name":"Taoist Temple","terms":"daoist,monastery,temple"},"amenity/planetarium":{"name":"Planetarium","terms":"museum,astronomy,observatory"},"amenity/police":{"name":"Police","terms":"badge,constable,constabulary,cop,detective,fed,law,enforcement,officer,patrol"},"amenity/post_box":{"name":"Mailbox","terms":"letter,post"},"amenity/post_office":{"name":"Post Office","terms":"letter,mail"},"amenity/prison":{"name":"Prison Grounds","terms":"cell,jail"},"amenity/pub":{"name":"Pub","terms":"alcohol,drink,dive,beer,bier,booze"},"amenity/public_bath":{"name":"Public Bath","terms":"onsen,foot bath,hot springs"},"amenity/public_bookcase":{"name":"Public Bookcase","terms":"library,bookcrossing"},"amenity/ranger_station":{"name":"Ranger Station","terms":"visitor center,visitor centre,permit center,permit centre,backcountry office,warden office,warden center"},"amenity/recycling_centre":{"name":"Recycling Center","terms":"bottle,can,dump,glass,garbage,rubbish,scrap,trash"},"amenity/recycling":{"name":"Recycling Container","terms":"bin,can,bottle,glass,garbage,rubbish,scrap,trash"},"amenity/restaurant":{"name":"Restaurant","terms":"bar,breakfast,cafe,café,canteen,coffee,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/sanitary_dump_station":{"name":"RV Toilet Disposal","terms":"Motor Home,Camper,Sanitary,Dump Station,Elsan,CDP,CTDP,Chemical Toilet"},"amenity/school":{"name":"School Grounds","terms":"academy,elementary school,middle school,high school"},"amenity/shelter":{"name":"Shelter","terms":"lean-to,gazebo,picnic"},"amenity/shower":{"name":"Shower","terms":"rain closet"},"amenity/smoking_area":{"name":"Smoking Area","terms":""},"amenity/social_facility":{"name":"Social Facility","terms":""},"amenity/social_facility/food_bank":{"name":"Food Bank","terms":""},"amenity/social_facility/group_home":{"name":"Elderly Group Home","terms":"old,senior,living,care home,assisted living"},"amenity/social_facility/homeless_shelter":{"name":"Homeless Shelter","terms":"houseless,unhoused,displaced"},"amenity/social_facility/nursing_home":{"name":"Nursing Home","terms":"elderly,living,nursing,old,senior,assisted living"},"amenity/studio":{"name":"Studio","terms":"recording,radio,television"},"amenity/taxi":{"name":"Taxi Stand","terms":"cab"},"amenity/telephone":{"name":"Telephone","terms":"phone"},"amenity/theatre":{"name":"Theater","terms":"theatre,performance,play,musical"},"amenity/toilets":{"name":"Toilets","terms":"bathroom,restroom,outhouse,privy,head,lavatory,latrine,water closet,WC,W.C."},"amenity/townhall":{"name":"Town Hall","terms":"village,city,government,courthouse,municipal"},"amenity/university":{"name":"University Grounds","terms":"college"},"amenity/vending_machine":{"name":"Vending Machine","terms":""},"amenity/vending_machine/news_papers":{"name":"Newspaper Vending Machine","terms":"newspaper"},"amenity/vending_machine/cigarettes":{"name":"Cigarette Vending Machine","terms":"cigarette"},"amenity/vending_machine/condoms":{"name":"Condom Vending Machine","terms":"condom"},"amenity/vending_machine/drinks":{"name":"Drink Vending Machine","terms":"drink,soda,beverage,juice,pop"},"amenity/vending_machine/excrement_bags":{"name":"Excrement Bag Vending Machine","terms":"excrement bags,poop,dog,animal"},"amenity/vending_machine/feminine_hygiene":{"name":"Feminine Hygiene Vending Machine","terms":"condom,tampon,pad,woman,women,menstrual hygiene products,personal care"},"amenity/vending_machine/newspapers":{"name":"Newspaper Vending Machine","terms":"newspaper"},"amenity/vending_machine/parcel_pickup_dropoff":{"name":"Parcel Pickup/Dropoff Vending Machine","terms":"parcel,mail,pickup"},"amenity/vending_machine/parking_tickets":{"name":"Parking Ticket Vending Machine","terms":"parking,ticket"},"amenity/vending_machine/public_transport_tickets":{"name":"Transit Ticket Vending Machine","terms":"bus,train,ferry,rail,ticket,transportation"},"amenity/vending_machine/sweets":{"name":"Snack Vending Machine","terms":"candy,gum,chip,pretzel,cookie,cracker"},"amenity/veterinary":{"name":"Veterinary","terms":"pet clinic,veterinarian,animal hospital,pet doctor"},"amenity/waste_basket":{"name":"Waste Basket","terms":"bin,garbage,rubbish,litter,trash"},"amenity/waste_disposal":{"name":"Garbage Dumpster","terms":"garbage,rubbish,litter,trash"},"amenity/waste_transfer_station":{"name":"Waste Transfer Station","terms":"dump,garbage,recycling,rubbish,scrap,trash"},"amenity/waste/dog_excrement":{"name":"Dog Excrement Bin","terms":"bin,garbage,rubbish,litter,trash,poo,dog"},"amenity/water_point":{"name":"RV Drinking Water","terms":""},"amenity/watering_place":{"name":"Animal Watering Place","terms":""},"area":{"name":"Area","terms":""},"area/highway":{"name":"Road Surface","terms":""},"attraction/amusement_ride":{"name":"Amusement Ride","terms":"theme park,carnival ride"},"attraction/animal":{"name":"Animal","terms":"zoo,theme park,animal park,lion,tiger,bear"},"attraction/big_wheel":{"name":"Big Wheel","terms":"ferris wheel,theme park,amusement ride"},"attraction/bumper_car":{"name":"Bumper Car","terms":"theme park,dodgem cars,autoscooter"},"attraction/bungee_jumping":{"name":"Bungee Jumping","terms":"theme park,bungy jumping,jumping platform"},"attraction/carousel":{"name":"Carousel","terms":"theme park,roundabout,merry-go-round,galloper,jumper,horseabout,flying horses"},"attraction/dark_ride":{"name":"Dark Ride","terms":"theme park,ghost train"},"attraction/drop_tower":{"name":"Drop Tower","terms":"theme park,amusement ride,gondola,tower,big drop"},"attraction/pirate_ship":{"name":"Pirate Ship","terms":"theme park,carnival ride,amusement ride"},"attraction/river_rafting":{"name":"River Rafting","terms":"theme park,aquatic park,water park,rafting simulator,river rafting ride,river rapids ride"},"attraction/roller_coaster":{"name":"Roller Coaster","terms":"theme park,amusement ride"},"attraction/train":{"name":"Tourist Train","terms":"theme park,rackless train,road train,Tschu-Tschu train,dotto train,park train"},"attraction/water_slide":{"name":"Water Slide","terms":"theme park,aquatic park,water park,flumes,water chutes,hydroslides"},"barrier":{"name":"Barrier","terms":""},"barrier/entrance":{"name":"Entrance","terms":""},"barrier/block":{"name":"Block","terms":""},"barrier/bollard":{"name":"Bollard","terms":""},"barrier/border_control":{"name":"Border Control","terms":""},"barrier/cattle_grid":{"name":"Cattle Grid","terms":""},"barrier/city_wall":{"name":"City Wall","terms":""},"barrier/cycle_barrier":{"name":"Cycle Barrier","terms":""},"barrier/ditch":{"name":"Trench","terms":""},"barrier/fence":{"name":"Fence","terms":""},"barrier/gate":{"name":"Gate","terms":""},"barrier/hedge":{"name":"Hedge","terms":""},"barrier/kerb":{"name":"Kerb","terms":""},"barrier/kissing_gate":{"name":"Kissing Gate","terms":""},"barrier/lift_gate":{"name":"Lift Gate","terms":""},"barrier/retaining_wall":{"name":"Retaining Wall","terms":""},"barrier/stile":{"name":"Stile","terms":""},"barrier/toll_booth":{"name":"Toll Booth","terms":""},"barrier/wall":{"name":"Wall","terms":""},"boundary/administrative":{"name":"Administrative Boundary","terms":""},"building":{"name":"Building","terms":""},"building/bunker":{"name":"Bunker","terms":""},"building/entrance":{"name":"Entrance/Exit","terms":""},"building/train_station":{"name":"Train Station","terms":""},"building/apartments":{"name":"Apartments","terms":""},"building/barn":{"name":"Barn","terms":""},"building/boathouse":{"name":"Boathouse","terms":""},"building/bungalow":{"name":"Bungalow","terms":"home,detached"},"building/cabin":{"name":"Cabin","terms":""},"building/cathedral":{"name":"Cathedral Building","terms":""},"building/chapel":{"name":"Chapel Building","terms":""},"building/church":{"name":"Church Building","terms":""},"building/civic":{"name":"Civic Building","terms":""},"building/college":{"name":"College Building","terms":"university"},"building/commercial":{"name":"Commercial Building","terms":""},"building/construction":{"name":"Building Under Construction","terms":""},"building/detached":{"name":"Detached House","terms":"home,single,family,residence,dwelling"},"building/dormitory":{"name":"Dormitory","terms":""},"building/farm_auxiliary":{"name":"Farm Building","terms":""},"building/farm":{"name":"Farm House","terms":""},"building/garage":{"name":"Garage","terms":""},"building/garages":{"name":"Garages","terms":""},"building/greenhouse":{"name":"Greenhouse","terms":""},"building/hospital":{"name":"Hospital Building","terms":""},"building/hotel":{"name":"Hotel Building","terms":""},"building/house":{"name":"House","terms":"home,family,residence,dwelling"},"building/hut":{"name":"Hut","terms":""},"building/industrial":{"name":"Industrial Building","terms":""},"building/kindergarten":{"name":"Preschool/Kindergarten Building","terms":"kindergarden,pre-school"},"building/mosque":{"name":"Mosque Building","terms":""},"building/public":{"name":"Public Building","terms":""},"building/residential":{"name":"Residential Building","terms":""},"building/retail":{"name":"Retail Building","terms":""},"building/roof":{"name":"Roof","terms":""},"building/ruins":{"name":"Building Ruins","terms":""},"building/school":{"name":"School Building","terms":"academy,elementary school,middle school,high school"},"building/semidetached_house":{"name":"Semi-Detached House","terms":"home,double,duplex,twin,family,residence,dwelling"},"building/service":{"name":"Service Building","terms":""},"building/shed":{"name":"Shed","terms":""},"building/stable":{"name":"Stable","terms":""},"building/stadium":{"name":"Stadium Building","terms":""},"building/static_caravan":{"name":"Static Mobile Home","terms":""},"building/temple":{"name":"Temple Building","terms":""},"building/terrace":{"name":"Row Houses","terms":"home,terrace,brownstone,family,residence,dwelling"},"building/transportation":{"name":"Transportation Building","terms":""},"building/university":{"name":"University Building","terms":"college"},"building/warehouse":{"name":"Warehouse","terms":""},"camp_site/camp_pitch":{"name":"Camp Pitch","terms":"tent,rv"},"club":{"name":"Club","terms":"social"},"craft":{"name":"Craft","terms":""},"craft/jeweler":{"name":"Jeweler","terms":""},"craft/locksmith":{"name":"Locksmith","terms":""},"craft/optician":{"name":"Optician","terms":""},"craft/tailor":{"name":"Tailor","terms":"clothes,suit"},"craft/basket_maker":{"name":"Basket Maker","terms":""},"craft/beekeeper":{"name":"Beekeeper","terms":""},"craft/blacksmith":{"name":"Blacksmith","terms":""},"craft/boatbuilder":{"name":"Boat Builder","terms":""},"craft/bookbinder":{"name":"Bookbinder","terms":"book repair"},"craft/brewery":{"name":"Brewery","terms":"alcohol,beer,beverage,bier,booze,cider"},"craft/carpenter":{"name":"Carpenter","terms":"woodworker"},"craft/carpet_layer":{"name":"Carpet Layer","terms":""},"craft/caterer":{"name":"Caterer","terms":""},"craft/chimney_sweeper":{"name":"Chimney Sweeper","terms":""},"craft/clockmaker":{"name":"Clockmaker","terms":""},"craft/confectionery":{"name":"Candy Maker","terms":"sweet,candy"},"craft/distillery":{"name":"Distillery","terms":"alcohol,beverage,bourbon,booze,brandy,gin,hooch,liquor,mezcal,moonshine,rum,scotch,spirits,still,tequila,vodka,whiskey,whisky"},"craft/dressmaker":{"name":"Dressmaker","terms":"seamstress"},"craft/electrician":{"name":"Electrician","terms":"power,wire"},"craft/electronics_repair":{"name":"Electronics Repair Shop","terms":""},"craft/gardener":{"name":"Gardener","terms":"landscaper,grounds keeper"},"craft/glaziery":{"name":"Glaziery","terms":"glass,stained-glass,window"},"craft/handicraft":{"name":"Handicraft","terms":""},"craft/hvac":{"name":"HVAC","terms":"heat*,vent*,air conditioning"},"craft/insulator":{"name":"Insulator","terms":""},"craft/key_cutter":{"name":"Key Cutter","terms":""},"craft/metal_construction":{"name":"Metal Construction","terms":""},"craft/painter":{"name":"Painter","terms":""},"craft/photographer":{"name":"Photographer","terms":""},"craft/photographic_laboratory":{"name":"Photographic Laboratory","terms":"film"},"craft/plasterer":{"name":"Plasterer","terms":""},"craft/plumber":{"name":"Plumber","terms":"pipe"},"craft/pottery":{"name":"Pottery","terms":"ceramic"},"craft/rigger":{"name":"Rigger","terms":""},"craft/roofer":{"name":"Roofer","terms":""},"craft/saddler":{"name":"Saddler","terms":""},"craft/sailmaker":{"name":"Sailmaker","terms":""},"craft/sawmill":{"name":"Sawmill","terms":"lumber"},"craft/scaffolder":{"name":"Scaffolder","terms":""},"craft/sculptor":{"name":"Sculptor","terms":""},"craft/shoemaker":{"name":"Shoemaker","terms":"cobbler"},"craft/stonemason":{"name":"Stonemason","terms":"masonry"},"craft/tiler":{"name":"Tiler","terms":""},"craft/tinsmith":{"name":"Tinsmith","terms":""},"craft/upholsterer":{"name":"Upholsterer","terms":""},"craft/watchmaker":{"name":"Watchmaker","terms":""},"craft/window_construction":{"name":"Window Construction","terms":"glass"},"craft/winery":{"name":"Winery","terms":""},"embankment":{"name":"Embankment","terms":""},"emergency/designated":{"name":"Emergency Access Designated","terms":""},"emergency/destination":{"name":"Emergency Access Destination","terms":""},"emergency/no":{"name":"Emergency Access No","terms":""},"emergency/official":{"name":"Emergency Access Official","terms":""},"emergency/private":{"name":"Emergency Access Private","terms":""},"emergency/yes":{"name":"Emergency Access Yes","terms":""},"emergency/ambulance_station":{"name":"Ambulance Station","terms":"EMS,EMT,rescue"},"emergency/defibrillator":{"name":"Defibrillator","terms":"AED"},"emergency/fire_hydrant":{"name":"Fire Hydrant","terms":"fire plug"},"emergency/life_ring":{"name":"Life Ring","terms":"life buoy,kisby ring,kisbie ring,perry buoy"},"emergency/phone":{"name":"Emergency Phone","terms":""},"emergency/water_tank":{"name":"Emergency Water Tank","terms":"water tank,cistern,reservoir"},"entrance":{"name":"Entrance/Exit","terms":""},"footway/crossing-raised":{"name":"Raised Street Crossing","terms":"flat top,hump,speed,slow"},"footway/crossing":{"name":"Street Crossing","terms":""},"footway/crosswalk-raised":{"name":"Raised Pedestrian Crosswalk","terms":"zebra crossing,flat top,hump,speed,slow"},"footway/crosswalk":{"name":"Pedestrian Crosswalk","terms":"zebra crossing"},"footway/sidewalk":{"name":"Sidewalk","terms":""},"ford":{"name":"Ford","terms":""},"golf/bunker":{"name":"Sand Trap","terms":"hazard,bunker"},"golf/fairway":{"name":"Fairway","terms":""},"golf/green":{"name":"Putting Green","terms":""},"golf/hole":{"name":"Golf Hole","terms":""},"golf/lateral_water_hazard_area":{"name":"Lateral Water Hazard","terms":""},"golf/lateral_water_hazard_line":{"name":"Lateral Water Hazard","terms":""},"golf/rough":{"name":"Rough","terms":""},"golf/tee":{"name":"Tee Box","terms":"teeing ground"},"golf/water_hazard_area":{"name":"Water Hazard","terms":""},"golf/water_hazard_line":{"name":"Water Hazard","terms":""},"healthcare":{"name":"Healthcare Facility","terms":"clinic,doctor,disease,health,institution,sick,surgery,wellness"},"healthcare/alternative":{"name":"Alternative Medicine","terms":"acupuncture,anthroposophical,applied kinesiology,aromatherapy,ayurveda,herbalism,homeopathy,hydrotherapy,hypnosis,naturopathy,osteopathy,reflexology,reiki,shiatsu,traditional,tuina,unani"},"healthcare/alternative/chiropractic":{"name":"Chiropractor","terms":"back,pain,spine"},"healthcare/audiologist":{"name":"Audiologist","terms":"ear,hearing,sound"},"healthcare/birthing_center":{"name":"Birthing Center","terms":"baby,childbirth,delivery,labour,labor,pregnancy"},"healthcare/blood_donation":{"name":"Blood Donor Center","terms":"blood bank,blood donation,blood transfusion,apheresis,plasmapheresis,plateletpheresis,stem cell donation"},"healthcare/hospice":{"name":"Hospice","terms":"terminal,illness"},"healthcare/midwife":{"name":"Midwife","terms":"baby,childbirth,delivery,labour,labor,pregnancy"},"healthcare/occupational_therapist":{"name":"Occupational Therapist","terms":"therapist,therapy"},"healthcare/optometrist":{"name":"Optometrist","terms":"eye,glasses,lasik,lenses,vision"},"healthcare/physiotherapist":{"name":"Physiotherapist","terms":"physical,therapist,therapy"},"healthcare/podiatrist":{"name":"Podiatrist","terms":"foot,feet,nails"},"healthcare/psychotherapist":{"name":"Psychotherapist","terms":"anxiety,counselor,depression,mental health,mind,suicide,therapist,therapy"},"healthcare/rehabilitation":{"name":"Rehabilitation Facility","terms":"rehab,therapist,therapy"},"healthcare/speech_therapist":{"name":"Speech Therapist","terms":"speech,therapist,therapy,voice"},"highway/bus_stop":{"name":"Bus Stop / Platform","terms":""},"highway/bridleway":{"name":"Bridle Path","terms":"bridleway,equestrian,horse"},"highway/bus_guideway":{"name":"Bus Guideway","terms":""},"highway/corridor":{"name":"Indoor Corridor","terms":"gallery,hall,hallway,indoor,passage,passageway"},"highway/crossing-raised":{"name":"Raised Street Crossing","terms":"flat top,hump,speed,slow"},"highway/crossing":{"name":"Street Crossing","terms":""},"highway/crosswalk-raised":{"name":"Raised Pedestrian Crosswalk","terms":"zebra crossing,flat top,hump,speed,slow"},"highway/crosswalk":{"name":"Pedestrian Crosswalk","terms":"zebra crossing"},"highway/cycleway":{"name":"Cycle Path","terms":"bike"},"highway/elevator":{"name":"Elevator","terms":"lift"},"highway/footway":{"name":"Foot Path","terms":"hike,hiking,trackway,trail,walk"},"highway/give_way":{"name":"Yield Sign","terms":"give way,yield,sign"},"highway/living_street":{"name":"Living Street","terms":""},"highway/mini_roundabout":{"name":"Mini-Roundabout","terms":""},"highway/motorway_junction":{"name":"Motorway Junction / Exit","terms":""},"highway/motorway_link":{"name":"Motorway Link","terms":"ramp,on ramp,off ramp"},"highway/motorway":{"name":"Motorway","terms":"autobahn,expressway,freeway,highway,interstate,parkway,thruway,turnpike"},"highway/path":{"name":"Path","terms":"hike,hiking,trackway,trail,walk"},"highway/pedestrian_area":{"name":"Pedestrian Area","terms":"center,centre,plaza,quad,square,walkway"},"highway/pedestrian_line":{"name":"Pedestrian Street","terms":"center,centre,plaza,quad,square,walkway"},"highway/primary_link":{"name":"Primary Link","terms":"ramp,on ramp,off ramp"},"highway/primary":{"name":"Primary Road","terms":""},"highway/raceway":{"name":"Racetrack (Motorsport)","terms":"auto*,formula one,kart,motocross,nascar,race*,track"},"highway/residential":{"name":"Residential Road","terms":""},"highway/rest_area":{"name":"Rest Area","terms":"rest stop"},"highway/road":{"name":"Unknown Road","terms":""},"highway/secondary_link":{"name":"Secondary Link","terms":"ramp,on ramp,off ramp"},"highway/secondary":{"name":"Secondary Road","terms":""},"highway/service":{"name":"Service Road","terms":""},"highway/service/alley":{"name":"Alley","terms":""},"highway/service/drive-through":{"name":"Drive-Through","terms":""},"highway/service/driveway":{"name":"Driveway","terms":""},"highway/service/emergency_access":{"name":"Emergency Access","terms":""},"highway/service/parking_aisle":{"name":"Parking Aisle","terms":""},"highway/services":{"name":"Service Area","terms":"services,travel plaza,service station"},"highway/speed_camera":{"name":"Speed Camera","terms":""},"highway/steps":{"name":"Steps","terms":"stairs,staircase"},"highway/stop":{"name":"Stop Sign","terms":"stop,halt,sign"},"highway/street_lamp":{"name":"Street Lamp","terms":"streetlight,street light,lamp,light,gaslight"},"highway/tertiary_link":{"name":"Tertiary Link","terms":"ramp,on ramp,off ramp"},"highway/tertiary":{"name":"Tertiary Road","terms":""},"highway/track":{"name":"Unmaintained Track Road","terms":"woods road,forest road,logging road,fire road,farm road,agricultural road,ranch road,carriage road,primitive,unmaintained,rut,offroad,4wd,4x4,four wheel drive,atv,quad,jeep,double track,two track"},"highway/traffic_mirror":{"name":"Traffic Mirror","terms":"blind spot,convex,corner,curved,roadside,round,safety,sphere,visibility"},"highway/traffic_signals":{"name":"Traffic Signals","terms":"light,stoplight,traffic light"},"highway/trunk_link":{"name":"Trunk Link","terms":"ramp,on ramp,off ramp"},"highway/trunk":{"name":"Trunk Road","terms":""},"highway/turning_circle":{"name":"Turning Circle","terms":"cul-de-sac"},"highway/turning_loop":{"name":"Turning Loop (Island)","terms":"cul-de-sac"},"highway/unclassified":{"name":"Minor/Unclassified Road","terms":""},"historic":{"name":"Historic Site","terms":""},"historic/archaeological_site":{"name":"Archaeological Site","terms":""},"historic/boundary_stone":{"name":"Boundary Stone","terms":""},"historic/castle":{"name":"Castle","terms":""},"historic/memorial":{"name":"Memorial","terms":""},"historic/monument":{"name":"Monument","terms":""},"historic/ruins":{"name":"Ruins","terms":""},"historic/tomb":{"name":"Tomb","terms":""},"historic/wayside_cross":{"name":"Wayside Cross","terms":""},"historic/wayside_shrine":{"name":"Wayside Shrine","terms":""},"junction":{"name":"Junction","terms":""},"landuse":{"name":"Land Use","terms":""},"landuse/farm":{"name":"Farmland","terms":""},"landuse/allotments":{"name":"Community Garden","terms":"allotment,garden"},"landuse/aquaculture":{"name":"Aquaculture","terms":"fish farm,crustacean,algae,aquafarming,shrimp farm,oyster farm,mariculture,algaculture"},"landuse/basin":{"name":"Basin","terms":""},"landuse/brownfield":{"name":"Brownfield","terms":""},"landuse/cemetery":{"name":"Cemetery","terms":""},"landuse/churchyard":{"name":"Churchyard","terms":""},"landuse/commercial":{"name":"Commercial Area","terms":""},"landuse/construction":{"name":"Construction","terms":""},"landuse/farmland":{"name":"Farmland","terms":"crop,grow,plant"},"landuse/farmyard":{"name":"Farmyard","terms":"crop,grow,plant"},"landuse/forest":{"name":"Forest","terms":"tree"},"landuse/garages":{"name":"Garage Landuse","terms":""},"landuse/grass":{"name":"Grass","terms":""},"landuse/greenfield":{"name":"Greenfield","terms":""},"landuse/greenhouse_horticulture":{"name":"Greenhouse Horticulture","terms":"flower,greenhouse,horticulture,grow,vivero"},"landuse/harbour":{"name":"Harbor","terms":"boat"},"landuse/industrial":{"name":"Industrial Area","terms":""},"landuse/industrial/scrap_yard":{"name":"Scrap Yard","terms":"car,junk,metal,salvage,scrap,u-pull-it,vehicle,wreck,yard"},"landuse/industrial/slaughterhouse":{"name":"Slaughterhouse","terms":"abattoir,beef,butchery,calf,chicken,cow,killing house,meat,pig,pork,poultry,shambles,stockyard"},"landuse/landfill":{"name":"Landfill","terms":"dump"},"landuse/meadow":{"name":"Meadow","terms":""},"landuse/military":{"name":"Military Area","terms":""},"landuse/military/airfield":{"name":"Military Airfield","terms":"air force,army,base,bomb,fight,force,guard,heli*,jet,marine,navy,plane,troop,war"},"landuse/military/barracks":{"name":"Barracks","terms":"air force,army,base,fight,force,guard,marine,navy,troop,war"},"landuse/military/bunker":{"name":"Military Bunker","terms":"air force,army,base,fight,force,guard,marine,navy,troop,war"},"landuse/military/checkpoint":{"name":"Checkpoint","terms":"air force,army,base,force,guard,marine,navy,troop,war"},"landuse/military/danger_area":{"name":"Danger Area","terms":"air force,army,base,blast,bomb,explo*,force,guard,mine,marine,navy,troop,war"},"landuse/military/naval_base":{"name":"Naval Base","terms":"base,fight,force,guard,marine,navy,ship,sub,troop,war"},"landuse/military/nuclear_explosion_site":{"name":"Nuclear Explosion Site","terms":"atom,blast,bomb,detonat*,nuke,site,test"},"landuse/military/obstacle_course":{"name":"Obstacle Course","terms":"army,base,force,guard,marine,navy,troop,war"},"landuse/military/office":{"name":"Military Office","terms":"air force,army,base,enlist,fight,force,guard,marine,navy,recruit,troop,war"},"landuse/military/range":{"name":"Military Range","terms":"air force,army,base,fight,fire,force,guard,gun,marine,navy,rifle,shoot*,snip*,train,troop,war"},"landuse/military/training_area":{"name":"Training Area","terms":"air force,army,base,fight,fire,force,guard,gun,marine,navy,rifle,shoot*,snip*,train,troop,war"},"landuse/orchard":{"name":"Orchard","terms":"fruit"},"landuse/plant_nursery":{"name":"Plant Nursery","terms":"flower,garden,grow,vivero"},"landuse/quarry":{"name":"Quarry","terms":""},"landuse/railway":{"name":"Railway Corridor","terms":"rail,train,track"},"landuse/recreation_ground":{"name":"Recreation Ground","terms":"playing fields"},"landuse/religious":{"name":"Religious Area","terms":""},"landuse/residential":{"name":"Residential Area","terms":""},"landuse/retail":{"name":"Retail Area","terms":""},"landuse/vineyard":{"name":"Vineyard","terms":"grape,wine"},"leisure":{"name":"Leisure","terms":""},"leisure/adult_gaming_centre":{"name":"Adult Gaming Center","terms":"gambling,slot machine"},"leisure/amusement_arcade":{"name":"Amusement Arcade","terms":"pay-to-play games,video games,driving simulators,pinball machines"},"leisure/bird_hide":{"name":"Bird Hide","terms":"machan,ornithology"},"leisure/bowling_alley":{"name":"Bowling Alley","terms":"bowling center"},"leisure/common":{"name":"Common","terms":"open space"},"leisure/dance":{"name":"Dance Hall","terms":"ballroom,jive,swing,tango,waltz"},"leisure/dancing_school":{"name":"Dance School","terms":"jive,swing,tango,waltz,dance teaching"},"leisure/dog_park":{"name":"Dog Park","terms":""},"leisure/firepit":{"name":"Firepit","terms":"fireplace,campfire"},"leisure/fitness_centre":{"name":"Gym / Fitness Center","terms":"health,gym,leisure,studio"},"leisure/fitness_centre/yoga":{"name":"Yoga Studio","terms":"studio"},"leisure/fitness_station":{"name":"Outdoor Fitness Station","terms":"exercise,fitness,gym,trim trail"},"leisure/fitness_station/balance_beam":{"name":"Exercise Balance Beam","terms":"balance,exercise,fitness,gym,trim trail"},"leisure/fitness_station/box":{"name":"Exercise Box","terms":"box,exercise,fitness,gym,jump,trim trail"},"leisure/fitness_station/horizontal_bar":{"name":"Exercise Horizontal Bar","terms":"bar,chinup,chin up,exercise,fitness,gym,pullup,pull up,trim trail"},"leisure/fitness_station/horizontal_ladder":{"name":"Exercise Monkey Bars","terms":"bar,chinup,chin up,exercise,fitness,gym,ladder,monkey bars,pullup,pull up,trim trail"},"leisure/fitness_station/hyperextension":{"name":"Hyperextension Station","terms":"back,exercise,extension,fitness,gym,roman chair,trim trail"},"leisure/fitness_station/parallel_bars":{"name":"Parallel Bars","terms":"bar,dip,exercise,fitness,gym,trim trail"},"leisure/fitness_station/push-up":{"name":"Push-Up Station","terms":"bar,exercise,fitness,gym,pushup,push up,trim trail"},"leisure/fitness_station/rings":{"name":"Exercise Rings","terms":"exercise,fitness,gym,muscle up,pullup,pull up,trim trail"},"leisure/fitness_station/sign":{"name":"Exercise Instruction Sign","terms":"exercise,fitness,gym,trim trail"},"leisure/fitness_station/sit-up":{"name":"Sit-Up Station","terms":"crunch,exercise,fitness,gym,situp,sit up,trim trail"},"leisure/fitness_station/stairs":{"name":"Exercise Stairs","terms":"exercise,fitness,gym,steps,trim trail"},"leisure/garden":{"name":"Garden","terms":""},"leisure/golf_course":{"name":"Golf Course","terms":"links"},"leisure/hackerspace":{"name":"Hackerspace","terms":"makerspace,hackspace,hacklab"},"leisure/horse_riding":{"name":"Horseback Riding Facility","terms":"equestrian,stable"},"leisure/ice_rink":{"name":"Ice Rink","terms":"hockey,skating,curling"},"leisure/marina":{"name":"Marina","terms":"boat"},"leisure/miniature_golf":{"name":"Miniature Golf","terms":"crazy golf,mini golf,putt-putt"},"leisure/nature_reserve":{"name":"Nature Reserve","terms":"protected,wildlife"},"leisure/park":{"name":"Park","terms":"esplanade,estate,forest,garden,grass,green,grounds,lawn,lot,meadow,parkland,place,playground,plaza,pleasure garden,recreation area,square,tract,village green,woodland"},"leisure/picnic_table":{"name":"Picnic Table","terms":"bench"},"leisure/pitch":{"name":"Sport Pitch","terms":"field"},"leisure/pitch/american_football":{"name":"American Football Field","terms":""},"leisure/pitch/baseball":{"name":"Baseball Diamond","terms":""},"leisure/pitch/basketball":{"name":"Basketball Court","terms":""},"leisure/pitch/beachvolleyball":{"name":"Beach Volleyball Court","terms":"volleyball"},"leisure/pitch/boules":{"name":"Boules/Bocce Court","terms":"bocce,lyonnaise,pétanque"},"leisure/pitch/bowls":{"name":"Bowling Green","terms":""},"leisure/pitch/cricket":{"name":"Cricket Field","terms":""},"leisure/pitch/equestrian":{"name":"Riding Arena","terms":"dressage,equestrian,horse,horseback,riding"},"leisure/pitch/rugby_league":{"name":"Rugby League Field","terms":""},"leisure/pitch/rugby_union":{"name":"Rugby Union Field","terms":""},"leisure/pitch/skateboard":{"name":"Skate Park","terms":""},"leisure/pitch/soccer":{"name":"Soccer Field","terms":"football"},"leisure/pitch/table_tennis":{"name":"Ping Pong Table","terms":"table tennis,ping pong"},"leisure/pitch/tennis":{"name":"Tennis Court","terms":""},"leisure/pitch/volleyball":{"name":"Volleyball Court","terms":""},"leisure/playground":{"name":"Playground","terms":"jungle gym,play area"},"leisure/resort":{"name":"Resort","terms":""},"leisure/running_track":{"name":"Racetrack (Running)","terms":"race*,running,sprint,track"},"leisure/sauna":{"name":"Sauna","terms":""},"leisure/slipway":{"name":"Slipway","terms":"boat launch,boat ramp"},"leisure/sports_centre":{"name":"Sports Center / Complex","terms":""},"leisure/sports_centre/swimming":{"name":"Swimming Pool Facility","terms":"dive,water"},"leisure/stadium":{"name":"Stadium","terms":""},"leisure/swimming_pool":{"name":"Swimming Pool","terms":"dive,water"},"leisure/track":{"name":"Racetrack (Non-Motorsport)","terms":"cycle,dog,greyhound,horse,race*,track"},"leisure/water_park":{"name":"Water Park","terms":"swim,pool,dive"},"line":{"name":"Line","terms":""},"man_made":{"name":"Man Made","terms":""},"man_made/embankment":{"name":"Embankment","terms":""},"man_made/adit":{"name":"Adit","terms":"entrance,underground,mine,cave"},"man_made/breakwater":{"name":"Breakwater","terms":""},"man_made/bridge":{"name":"Bridge","terms":""},"man_made/chimney":{"name":"Chimney","terms":""},"man_made/crane":{"name":"Crane","terms":""},"man_made/cutline":{"name":"Cut line","terms":""},"man_made/flagpole":{"name":"Flagpole","terms":""},"man_made/gasometer":{"name":"Gasometer","terms":"gas holder"},"man_made/groyne":{"name":"Groyne","terms":""},"man_made/lighthouse":{"name":"Lighthouse","terms":""},"man_made/mast":{"name":"Mast","terms":"antenna,broadcast tower,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,radio mast,radio tower,television tower,transmission mast,transmission tower,tv tower"},"man_made/monitoring_station":{"name":"Monitoring Station","terms":"weather,earthquake,seismology,air,gps"},"man_made/observation":{"name":"Observation Tower","terms":"lookout tower,fire tower"},"man_made/petroleum_well":{"name":"Oil Well","terms":"drilling rig,oil derrick,oil drill,oil horse,oil rig,oil pump,petroleum well,pumpjack"},"man_made/pier":{"name":"Pier","terms":"dock,jetty"},"man_made/pipeline":{"name":"Pipeline","terms":""},"man_made/pumping_station":{"name":"Pumping Station","terms":""},"man_made/silo":{"name":"Silo","terms":"grain,corn,wheat"},"man_made/storage_tank":{"name":"Storage Tank","terms":"water,oil,gas,petrol"},"man_made/surveillance_camera":{"name":"Surveillance Camera","terms":"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"man_made/surveillance":{"name":"Surveillance","terms":"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"man_made/survey_point":{"name":"Survey Point","terms":"trig point,triangulation pillar,trigonometrical station"},"man_made/tower":{"name":"Tower","terms":""},"man_made/wastewater_plant":{"name":"Wastewater Plant","terms":"sewage*,water treatment plant,reclamation plant"},"man_made/water_tower":{"name":"Water Tower","terms":""},"man_made/water_well":{"name":"Water Well","terms":""},"man_made/water_works":{"name":"Water Works","terms":""},"man_made/watermill":{"name":"Watermill","terms":"water,wheel,mill"},"man_made/windmill":{"name":"Windmill","terms":"wind,wheel,mill"},"man_made/works":{"name":"Factory","terms":"assembly,build,brewery,car,plant,plastic,processing,manufacture,refinery"},"manhole":{"name":"Manhole","terms":"cover,hole,sewer,sewage,telecom"},"manhole/drain":{"name":"Storm Drain","terms":"cover,drain,hole,rain,sewer,sewage,storm"},"manhole/telecom":{"name":"Telecom Manhole","terms":"cover,phone,hole,telecom,telephone,bt"},"natural":{"name":"Natural","terms":""},"natural/bare_rock":{"name":"Bare Rock","terms":"rock"},"natural/bay":{"name":"Bay","terms":""},"natural/beach":{"name":"Beach","terms":"shore"},"natural/cave_entrance":{"name":"Cave Entrance","terms":"cavern,hollow,grotto,shelter,cavity"},"natural/cliff":{"name":"Cliff","terms":"escarpment"},"natural/coastline":{"name":"Coastline","terms":"shore"},"natural/fell":{"name":"Fell","terms":""},"natural/glacier":{"name":"Glacier","terms":""},"natural/grassland":{"name":"Grassland","terms":"prairie,savanna"},"natural/heath":{"name":"Heath","terms":""},"natural/peak":{"name":"Peak","terms":"acme,aiguille,alp,climax,crest,crown,hill,mount,mountain,pinnacle,summit,tip,top"},"natural/ridge":{"name":"Ridge","terms":"crest"},"natural/saddle":{"name":"Saddle","terms":"pass,mountain pass,top"},"natural/sand":{"name":"Sand","terms":"desert"},"natural/scree":{"name":"Scree","terms":"loose rocks"},"natural/scrub":{"name":"Scrub","terms":"bush,shrubs"},"natural/spring":{"name":"Spring","terms":""},"natural/tree_row":{"name":"Tree row","terms":""},"natural/tree":{"name":"Tree","terms":""},"natural/volcano":{"name":"Volcano","terms":"mountain,crater"},"natural/water":{"name":"Water","terms":""},"natural/water/lake":{"name":"Lake","terms":"lakelet,loch,mere"},"natural/water/pond":{"name":"Pond","terms":"lakelet,millpond,tarn,pool,mere"},"natural/water/reservoir":{"name":"Reservoir","terms":""},"natural/wetland":{"name":"Wetland","terms":"bog,marsh,reedbed,swamp,tidalflat"},"natural/wood":{"name":"Wood","terms":"tree"},"noexit/yes":{"name":"No Exit","terms":"no exit,road end,dead end"},"office":{"name":"Office","terms":""},"office/administrative":{"name":"Administrative Office","terms":""},"office/physician":{"name":"Physician","terms":""},"office/travel_agent":{"name":"Travel Agency","terms":""},"office/accountant":{"name":"Accountant Office","terms":""},"office/adoption_agency":{"name":"Adoption Agency","terms":""},"office/advertising_agency":{"name":"Advertising Agency","terms":"ad,ad agency,advert agency,advertising,marketing"},"office/architect":{"name":"Architect Office","terms":""},"office/association":{"name":"Nonprofit Organization Office","terms":"association,non-profit,nonprofit,organization,society"},"office/charity":{"name":"Charity Office","terms":"charitable organization"},"office/company":{"name":"Corporate Office","terms":""},"office/coworking":{"name":"Coworking Space","terms":"coworking,office"},"office/educational_institution":{"name":"Educational Institution","terms":""},"office/employment_agency":{"name":"Employment Agency","terms":"job"},"office/energy_supplier":{"name":"Energy Supplier Office","terms":"electricity,energy company,energy utility,gas utility"},"office/estate_agent":{"name":"Real Estate Office","terms":""},"office/financial":{"name":"Financial Office","terms":""},"office/forestry":{"name":"Forestry Office","terms":"forest,ranger"},"office/foundation":{"name":"Foundation Office","terms":""},"office/government":{"name":"Government Office","terms":""},"office/government/register_office":{"name":"Register Office","terms":"clerk,marriage,death,birth,certificate"},"office/government/tax":{"name":"Tax and Revenue Office","terms":"fiscal authorities,revenue office,tax office"},"office/guide":{"name":"Tour Guide Office","terms":"dive guide,mountain guide,tour guide"},"office/insurance":{"name":"Insurance Office","terms":""},"office/it":{"name":"Information Technology Office","terms":"computer,information,software,technology"},"office/lawyer":{"name":"Law Office","terms":""},"office/lawyer/notary":{"name":"Notary Office","terms":""},"office/moving_company":{"name":"Moving Company Office","terms":"relocation"},"office/newspaper":{"name":"Newspaper Office","terms":""},"office/ngo":{"name":"NGO Office","terms":"ngo,non government,non-government,organization,organisation"},"office/notary":{"name":"Notary Office","terms":"clerk,deeds,estate,signature,wills"},"office/political_party":{"name":"Political Party","terms":""},"office/private_investigator":{"name":"Private Investigator Office","terms":"PI,private eye,private detective"},"office/quango":{"name":"Quasi-NGO Office","terms":"ngo,non government,non-government,organization,organisation,quasi autonomous,quasi-autonomous"},"office/research":{"name":"Research Office","terms":""},"office/surveyor":{"name":"Surveyor Office","terms":""},"office/tax_advisor":{"name":"Tax Advisor Office","terms":"tax,tax consultant"},"office/telecommunication":{"name":"Telecom Office","terms":"communication,internet,phone,voice"},"office/therapist":{"name":"Therapist Office","terms":"therapy"},"office/water_utility":{"name":"Water Utility Office","terms":"water board,utility"},"piste":{"name":"Piste/Ski Trail","terms":"ski,sled,sleigh,snowboard,nordic,downhill,snowmobile"},"place/farm":{"name":"Farm","terms":""},"place/city":{"name":"City","terms":""},"place/hamlet":{"name":"Hamlet","terms":""},"place/island":{"name":"Island","terms":"archipelago,atoll,bar,cay,isle,islet,key,reef"},"place/islet":{"name":"Islet","terms":"archipelago,atoll,bar,cay,isle,islet,key,reef"},"place/isolated_dwelling":{"name":"Isolated Dwelling","terms":""},"place/locality":{"name":"Locality","terms":""},"place/neighbourhood":{"name":"Neighborhood","terms":"neighbourhood"},"place/plot":{"name":"Plot","terms":"tract,land,lot,parcel"},"place/quarter":{"name":"Sub-Borough / Quarter","terms":"boro,borough,quarter"},"place/square":{"name":"Square","terms":""},"place/suburb":{"name":"Borough / Suburb","terms":"boro,borough,quarter"},"place/town":{"name":"Town","terms":""},"place/village":{"name":"Village","terms":""},"playground/balance_beam":{"name":"Play Balance Beam","terms":""},"playground/basket_spinner":{"name":"Basket Spinner","terms":"basket rotator"},"playground/basket_swing":{"name":"Basket Swing","terms":""},"playground/climbing_frame":{"name":"Climbing Frame","terms":""},"playground/cushion":{"name":"Bouncy Cushion","terms":""},"playground/horizontal_bar":{"name":"Play Horizontal Bar","terms":"high bar"},"playground/rocker":{"name":"Spring Rider","terms":"spring rocker,springy rocker"},"playground/roundabout":{"name":"Play Roundabout","terms":"merry-go-round"},"playground/sandpit":{"name":"Sandpit","terms":""},"playground/seesaw":{"name":"Seesaw","terms":""},"playground/slide":{"name":"Slide","terms":""},"playground/structure":{"name":"Play Structure","terms":""},"playground/swing":{"name":"Swing","terms":""},"playground/zipwire":{"name":"Zip Wire","terms":""},"point":{"name":"Point","terms":""},"power/sub_station":{"name":"Substation","terms":""},"power/generator":{"name":"Power Generator","terms":"hydro,solar,turbine,wind"},"power/generator/source_nuclear":{"name":"Nuclear Reactor","terms":"fission,generator,nuclear,nuke,reactor"},"power/generator/source_wind":{"name":"Wind Turbine","terms":"generator,turbine,windmill,wind"},"power/line":{"name":"Power Line","terms":""},"power/minor_line":{"name":"Minor Power Line","terms":""},"power/plant":{"name":"Power Station Grounds","terms":"coal,gas,generat*,hydro,nuclear,power,station"},"power/pole":{"name":"Power Pole","terms":""},"power/substation":{"name":"Substation","terms":""},"power/switch":{"name":"Power Switch","terms":""},"power/tower":{"name":"High-Voltage Tower","terms":""},"power/transformer":{"name":"Transformer","terms":""},"public_transport/linear_platform_aerialway":{"name":"Aerialway Stop / Platform","terms":"aerialway,cable car,platform,public transit,public transportation,transit,transportation"},"public_transport/linear_platform_bus":{"name":"Bus Stop / Platform","terms":"bus,platform,public transit,public transportation,transit,transportation"},"public_transport/linear_platform_ferry":{"name":"Ferry Stop / Platform","terms":"boat,dock,ferry,pier,platform,public transit,public transportation,transit,transportation"},"public_transport/linear_platform_light_rail":{"name":"Light Rail Stop / Platform","terms":"electric,light rail,platform,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/linear_platform_monorail":{"name":"Monorail Stop / Platform","terms":"monorail,platform,public transit,public transportation,rail,transit,transportation"},"public_transport/linear_platform_subway":{"name":"Subway Stop / Platform","terms":"metro,platform,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/linear_platform_train":{"name":"Train Stop / Platform","terms":"platform,public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/linear_platform_tram":{"name":"Tram Stop / Platform","terms":"electric,light rail,platform,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/linear_platform_trolleybus":{"name":"Trolleybus Stop / Platform","terms":"bus,electric,platform,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/linear_platform":{"name":"Transit Stop / Platform","terms":"platform,public transit,public transportation,transit,transportation"},"public_transport/platform_aerialway":{"name":"Aerialway Stop / Platform","terms":"aerialway,cable car,platform,public transit,public transportation,transit,transportation"},"public_transport/platform_bus":{"name":"Bus Stop / Platform","terms":"bus,platform,public transit,public transportation,transit,transportation"},"public_transport/platform_ferry":{"name":"Ferry Stop / Platform","terms":"boat,dock,ferry,pier,platform,public transit,public transportation,transit,transportation"},"public_transport/platform_light_rail":{"name":"Light Rail Stop / Platform","terms":"electric,light rail,platform,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/platform_monorail":{"name":"Monorail Stop / Platform","terms":"monorail,platform,public transit,public transportation,rail,transit,transportation"},"public_transport/platform_subway":{"name":"Subway Stop / Platform","terms":"metro,platform,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/platform_train":{"name":"Train Stop / Platform","terms":"platform,public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/platform_tram":{"name":"Tram Stop / Platform","terms":"electric,light rail,platform,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/platform_trolleybus":{"name":"Trolleybus Stop / Platform","terms":"bus,electric,platform,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/platform":{"name":"Transit Stop / Platform","terms":"platform,public transit,public transportation,transit,transportation"},"public_transport/station_aerialway":{"name":"Aerialway Station","terms":"aerialway,cable car,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_bus":{"name":"Bus Station / Terminal","terms":"bus,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_ferry":{"name":"Ferry Station / Terminal","terms":"boat,dock,ferry,pier,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_light_rail":{"name":"Light Rail Station","terms":"electric,light rail,public transit,public transportation,rail,station,terminal,track,tram,trolley,transit,transportation"},"public_transport/station_monorail":{"name":"Monorail Station","terms":"monorail,public transit,public transportation,rail,station,terminal,transit,transportation"},"public_transport/station_subway":{"name":"Subway Station","terms":"metro,public transit,public transportation,rail,station,subway,terminal,track,transit,transportation,underground"},"public_transport/station_train_halt":{"name":"Train Station (Halt / Request)","terms":"halt,public transit,public transportation,rail,station,track,train,transit,transportation,whistle stop"},"public_transport/station_train":{"name":"Train Station","terms":"public transit,public transportation,rail,station,terminal,track,train,transit,transportation"},"public_transport/station_tram":{"name":"Tram Station","terms":"electric,light rail,public transit,public transportation,rail,station,streetcar,terminal,track,tram,trolley,transit,transportation"},"public_transport/station_trolleybus":{"name":"Trolleybus Station / Terminal","terms":"bus,electric,public transit,public transportation,station,streetcar,terminal,trackless,tram,trolley,transit,transportation"},"public_transport/station":{"name":"Transit Station","terms":"public transit,public transportation,station,terminal,transit,transportation"},"public_transport/stop_area":{"name":"Transit Stop Area","terms":""},"public_transport/stop_position_aerialway":{"name":"Aerialway Stopping Location","terms":"aerialway,cable car,public transit,public transportation,transit,transportation"},"public_transport/stop_position_bus":{"name":"Bus Stopping Location","terms":"bus,public transit,public transportation,transit,transportation"},"public_transport/stop_position_ferry":{"name":"Ferry Stopping Location","terms":"boat,dock,ferry,pier,public transit,public transportation,transit,transportation"},"public_transport/stop_position_light_rail":{"name":"Light Rail Stopping Location","terms":"electric,light rail,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/stop_position_monorail":{"name":"Monorail Stopping Location","terms":"monorail,public transit,public transportation,rail,transit,transportation"},"public_transport/stop_position_subway":{"name":"Subway Stopping Location","terms":"metro,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/stop_position_train":{"name":"Train Stopping Location","terms":"public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/stop_position_tram":{"name":"Tram Stopping Location","terms":"electric,light rail,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/stop_position_trolleybus":{"name":"Trolleybus Stopping Location","terms":"bus,electric,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/stop_position":{"name":"Transit Stopping Location","terms":"public transit,public transportation,transit,transportation"},"railway/halt":{"name":"Train Station (Halt / Request)","terms":"break,interrupt,rest,wait,interruption"},"railway/platform":{"name":"Train Stop / Platform","terms":""},"railway/station":{"name":"Train Station","terms":"train station,station"},"railway/tram_stop":{"name":"Tram Stopping Position","terms":"light rail,streetcar,tram,trolley"},"railway/abandoned":{"name":"Abandoned Railway","terms":""},"railway/buffer_stop":{"name":"Buffer Stop","terms":"stop,halt,buffer"},"railway/crossing":{"name":"Railway Crossing (Path)","terms":"crossing,pedestrian crossing,railroad crossing,level crossing,grade crossing,path through railroad,train crossing"},"railway/derail":{"name":"Railway Derailer","terms":"derailer"},"railway/disused":{"name":"Disused Railway","terms":""},"railway/funicular":{"name":"Funicular","terms":"venicular,cliff railway,cable car,cable railway,funicular railway"},"railway/level_crossing":{"name":"Railway Crossing (Road)","terms":"crossing,railroad crossing,level crossing,grade crossing,road through railroad,train crossing"},"railway/light_rail":{"name":"Light Rail","terms":"light rail,streetcar,trolley"},"railway/milestone":{"name":"Railway Milestone","terms":"milestone,marker"},"railway/miniature":{"name":"Miniature Railway","terms":"rideable miniature railway,narrow gauge railway,minimum gauge railway"},"railway/monorail":{"name":"Monorail","terms":""},"railway/narrow_gauge":{"name":"Narrow Gauge Rail","terms":"narrow gauge railway,narrow gauge railroad"},"railway/rail":{"name":"Rail","terms":""},"railway/signal":{"name":"Railway Signal","terms":"signal,lights"},"railway/subway_entrance":{"name":"Subway Entrance","terms":"metro,transit"},"railway/subway":{"name":"Subway","terms":"metro,transit"},"railway/switch":{"name":"Railway Switch","terms":"switch,points"},"railway/train_wash":{"name":"Train Wash","terms":"wash,clean"},"railway/tram":{"name":"Tram","terms":"light rail,streetcar,tram,trolley"},"relation":{"name":"Relation","terms":""},"route/ferry":{"name":"Ferry Route","terms":""},"shop":{"name":"Shop","terms":""},"shop/fishmonger":{"name":"Fishmonger","terms":""},"shop/furnace":{"name":"Furnace Store","terms":"oven,stove"},"shop/vacant":{"name":"Vacant Shop","terms":""},"shop/agrarian":{"name":"Farm Supply Shop","terms":"agricultural inputs,agricultural machines,seeds,pesticides,fertilizer,agricultural tools"},"shop/alcohol":{"name":"Liquor Store","terms":"alcohol,beer,booze,wine"},"shop/anime":{"name":"Anime Shop","terms":"manga,japan,cosplay,figurine,dakimakura"},"shop/antiques":{"name":"Antiques Shop","terms":""},"shop/appliance":{"name":"Appliance Store","terms":"air conditioner,appliance,dishwasher,dryer,freezer,fridge,grill,kitchen,oven,refrigerator,stove,washer,washing machine"},"shop/art":{"name":"Art Store","terms":"art*,exhibit*,gallery"},"shop/baby_goods":{"name":"Baby Goods Store","terms":""},"shop/bag":{"name":"Bag/Luggage Store","terms":"handbag,purse"},"shop/bakery":{"name":"Bakery","terms":""},"shop/bathroom_furnishing":{"name":"Bathroom Furnishing Store","terms":""},"shop/beauty":{"name":"Beauty Shop","terms":"spa,salon,tanning"},"shop/beauty/nails":{"name":"Nail Salon","terms":"manicure,pedicure"},"shop/beauty/tanning":{"name":"Tanning Salon","terms":""},"shop/bed":{"name":"Bedding/Mattress Store","terms":""},"shop/beverages":{"name":"Beverage Store","terms":""},"shop/bicycle":{"name":"Bicycle Shop","terms":"bike,repair"},"shop/bookmaker":{"name":"Bookmaker","terms":"betting"},"shop/books":{"name":"Book Store","terms":""},"shop/boutique":{"name":"Boutique","terms":""},"shop/butcher":{"name":"Butcher","terms":"meat"},"shop/candles":{"name":"Candle Shop","terms":""},"shop/car_parts":{"name":"Car Parts Store","terms":"auto"},"shop/car_repair":{"name":"Car Repair Shop","terms":"auto,garage,service"},"shop/car":{"name":"Car Dealership","terms":"auto"},"shop/carpet":{"name":"Carpet Store","terms":"rug"},"shop/charity":{"name":"Charity Store","terms":"thrift,op shop,nonprofit"},"shop/cheese":{"name":"Cheese Store","terms":""},"shop/chemist":{"name":"Drugstore","terms":"med*,drug*,gift"},"shop/chocolate":{"name":"Chocolate Store","terms":""},"shop/clothes":{"name":"Clothing Store","terms":""},"shop/coffee":{"name":"Coffee Store","terms":""},"shop/computer":{"name":"Computer Store","terms":""},"shop/confectionery":{"name":"Candy Store","terms":"sweet"},"shop/convenience":{"name":"Convenience Store","terms":""},"shop/copyshop":{"name":"Copy Store","terms":""},"shop/cosmetics":{"name":"Cosmetics Store","terms":""},"shop/craft":{"name":"Arts and Crafts Store","terms":"art*,paint*,frame"},"shop/curtain":{"name":"Curtain Store","terms":"drape*,window"},"shop/dairy":{"name":"Dairy Store","terms":"milk,egg,cheese"},"shop/deli":{"name":"Deli","terms":"lunch,meat,sandwich"},"shop/department_store":{"name":"Department Store","terms":""},"shop/doityourself":{"name":"DIY Store","terms":""},"shop/dry_cleaning":{"name":"Dry Cleaner","terms":""},"shop/e-cigarette":{"name":"E-Cigarette Shop","terms":"electronic,vapor"},"shop/electronics":{"name":"Electronics Store","terms":"appliance,audio,blueray,camera,computer,dvd,home theater,radio,speaker,tv,video"},"shop/erotic":{"name":"Erotic Store","terms":"sex,porn"},"shop/fabric":{"name":"Fabric Store","terms":"sew"},"shop/farm":{"name":"Produce Stand","terms":"farm shop,farm stand"},"shop/fashion":{"name":"Fashion Store","terms":""},"shop/florist":{"name":"Florist","terms":"flower"},"shop/frame":{"name":"Framing Shop","terms":"art*,paint*,photo*,frame"},"shop/funeral_directors":{"name":"Funeral Home","terms":"undertaker,memorial home"},"shop/furniture":{"name":"Furniture Store","terms":"chair,sofa,table"},"shop/garden_centre":{"name":"Garden Center","terms":"landscape,mulch,shrub,tree"},"shop/gas":{"name":"Bottled Gas Shop","terms":"cng,lpg,natural gas,propane,refill,tank"},"shop/gift":{"name":"Gift Shop","terms":"souvenir"},"shop/greengrocer":{"name":"Greengrocer","terms":"fruit,vegetable"},"shop/hairdresser":{"name":"Hairdresser","terms":"barber"},"shop/hardware":{"name":"Hardware Store","terms":""},"shop/health_food":{"name":"Health Food Shop","terms":"wholefood,vitamins,vegetarian,vegan"},"shop/hearing_aids":{"name":"Hearing Aids Store","terms":""},"shop/herbalist":{"name":"Herbalist","terms":""},"shop/hifi":{"name":"Hifi Store","terms":"stereo,video"},"shop/houseware":{"name":"Houseware Store","terms":"home,household"},"shop/interior_decoration":{"name":"Interior Decoration Store","terms":""},"shop/jewelry":{"name":"Jeweler","terms":"diamond,gem,ring"},"shop/kiosk":{"name":"Kiosk","terms":""},"shop/kitchen":{"name":"Kitchen Design Store","terms":""},"shop/laundry":{"name":"Laundry","terms":""},"shop/leather":{"name":"Leather Store","terms":""},"shop/locksmith":{"name":"Locksmith","terms":"key,lockpick"},"shop/lottery":{"name":"Lottery Shop","terms":""},"shop/mall":{"name":"Mall","terms":"shopping"},"shop/massage":{"name":"Massage Shop","terms":""},"shop/medical_supply":{"name":"Medical Supply Store","terms":""},"shop/mobile_phone":{"name":"Mobile Phone Store","terms":""},"shop/money_lender":{"name":"Money Lender","terms":""},"shop/motorcycle":{"name":"Motorcycle Dealership","terms":"bike"},"shop/music":{"name":"Music Store","terms":"CD,vinyl"},"shop/musical_instrument":{"name":"Musical Instrument Store","terms":"guitar"},"shop/newsagent":{"name":"Newspaper/Magazine Shop","terms":""},"shop/nutrition_supplements":{"name":"Nutrition Supplements Store","terms":""},"shop/optician":{"name":"Optician","terms":"eye,glasses"},"shop/organic":{"name":"Organic Goods Store","terms":""},"shop/outdoor":{"name":"Outdoors Store","terms":"camping,climbing,hiking"},"shop/paint":{"name":"Paint Store","terms":""},"shop/pastry":{"name":"Pastry Shop","terms":"patisserie,cake shop,cakery"},"shop/pawnbroker":{"name":"Pawn Shop","terms":""},"shop/perfumery":{"name":"Perfume Store","terms":""},"shop/pet":{"name":"Pet Store","terms":"animal,cat,dog,fish,kitten,puppy,reptile"},"shop/photo":{"name":"Photography Store","terms":"camera,film"},"shop/pyrotechnics":{"name":"Fireworks Store","terms":""},"shop/radiotechnics":{"name":"Radio/Electronic Component Store","terms":""},"shop/religion":{"name":"Religious Store","terms":""},"shop/scuba_diving":{"name":"Scuba Diving Shop","terms":""},"shop/seafood":{"name":"Seafood Shop","terms":"fishmonger"},"shop/second_hand":{"name":"Consignment/Thrift Store","terms":"secondhand,second hand,resale,thrift,used"},"shop/shoes":{"name":"Shoe Store","terms":""},"shop/sports":{"name":"Sporting Goods Store","terms":""},"shop/stationery":{"name":"Stationery Store","terms":"card,paper"},"shop/storage_rental":{"name":"Storage Rental","terms":""},"shop/supermarket":{"name":"Supermarket","terms":"grocery,store,shop"},"shop/tailor":{"name":"Tailor","terms":"clothes,suit"},"shop/tattoo":{"name":"Tattoo Parlor","terms":""},"shop/tea":{"name":"Tea Store","terms":""},"shop/ticket":{"name":"Ticket Seller","terms":""},"shop/tiles":{"name":"Tile Shop","terms":""},"shop/tobacco":{"name":"Tobacco Shop","terms":""},"shop/toys":{"name":"Toy Store","terms":""},"shop/trade":{"name":"Trade Shop","terms":""},"shop/travel_agency":{"name":"Travel Agency","terms":""},"shop/tyres":{"name":"Tire Store","terms":""},"shop/vacuum_cleaner":{"name":"Vacuum Cleaner Store","terms":""},"shop/variety_store":{"name":"Variety Store","terms":""},"shop/video_games":{"name":"Video Game Store","terms":""},"shop/video":{"name":"Video Store","terms":"DVD"},"shop/watches":{"name":"Watches Shop","terms":""},"shop/water_sports":{"name":"Watersport/Swim Shop","terms":""},"shop/weapons":{"name":"Weapon Shop","terms":"ammo,gun,knife,knives"},"shop/wholesale":{"name":"Wholesale Store","terms":"warehouse club,cash and carry"},"shop/window_blind":{"name":"Window Blind Store","terms":""},"shop/wine":{"name":"Wine Shop","terms":""},"tourism":{"name":"Tourism","terms":""},"tourism/alpine_hut":{"name":"Alpine Hut","terms":"climbing hut"},"tourism/apartment":{"name":"Guest Apartment / Condo","terms":""},"tourism/aquarium":{"name":"Aquarium","terms":"fish,sea,water"},"tourism/artwork":{"name":"Artwork","terms":"mural,sculpture,statue"},"tourism/attraction":{"name":"Tourist Attraction","terms":""},"tourism/camp_site":{"name":"Campground","terms":"tent,rv"},"tourism/caravan_site":{"name":"RV Park","terms":"Motor Home,Camper"},"tourism/chalet":{"name":"Holiday Cottage","terms":"holiday,holiday cottage,holiday home,vacation,vacation home"},"tourism/gallery":{"name":"Art Gallery","terms":"art*,exhibit*,paint*,photo*,sculpt*"},"tourism/guest_house":{"name":"Guest House","terms":"B&B,Bed and Breakfast"},"tourism/hostel":{"name":"Hostel","terms":""},"tourism/hotel":{"name":"Hotel","terms":""},"tourism/information":{"name":"Information","terms":""},"tourism/information/board":{"name":"Information Board","terms":""},"tourism/information/guidepost":{"name":"Guidepost","terms":"signpost"},"tourism/information/map":{"name":"Map","terms":""},"tourism/information/office":{"name":"Tourist Information Office","terms":""},"tourism/motel":{"name":"Motel","terms":""},"tourism/museum":{"name":"Museum","terms":"art*,exhibit*,gallery,foundation,hall,institution,paint*,photo*,sculpt*"},"tourism/picnic_site":{"name":"Picnic Site","terms":"camp"},"tourism/theme_park":{"name":"Theme Park","terms":""},"tourism/viewpoint":{"name":"Viewpoint","terms":""},"tourism/wilderness_hut":{"name":"Wilderness Hut","terms":"wilderness hut,backcountry hut,bothy"},"tourism/zoo":{"name":"Zoo","terms":"animal"},"traffic_calming":{"name":"Traffic Calming","terms":"bump,hump,slow,speed"},"traffic_calming/bump":{"name":"Speed Bump","terms":"hump,speed,slow"},"traffic_calming/chicane":{"name":"Traffic Chicane","terms":"driveway link,speed,slow"},"traffic_calming/choker":{"name":"Traffic Choker","terms":"speed,slow"},"traffic_calming/cushion":{"name":"Speed Cushion","terms":"bump,hump,speed,slow"},"traffic_calming/dip":{"name":"Dip","terms":"speed,slow"},"traffic_calming/hump":{"name":"Speed Hump","terms":"bump,speed,slow"},"traffic_calming/island":{"name":"Traffic Island","terms":"circle,roundabout,slow"},"traffic_calming/rumble_strip":{"name":"Rumble Strip","terms":"audible lines,sleeper lines,growlers"},"traffic_calming/table":{"name":"Speed Table","terms":"flat top,hump,speed,slow"},"type/multipolygon":{"name":"Multipolygon","terms":""},"type/boundary":{"name":"Boundary","terms":""},"type/boundary/administrative":{"name":"Administrative Boundary","terms":""},"type/restriction":{"name":"Restriction","terms":""},"type/restriction/no_left_turn":{"name":"No Left Turn","terms":""},"type/restriction/no_right_turn":{"name":"No Right Turn","terms":""},"type/restriction/no_straight_on":{"name":"No Straight On","terms":""},"type/restriction/no_u_turn":{"name":"No U-turn","terms":""},"type/restriction/only_left_turn":{"name":"Left Turn Only","terms":""},"type/restriction/only_right_turn":{"name":"Right Turn Only","terms":""},"type/restriction/only_straight_on":{"name":"No Turns","terms":""},"type/route_master":{"name":"Route Master","terms":""},"type/route":{"name":"Route","terms":""},"type/route/bicycle":{"name":"Cycle Route","terms":""},"type/route/bus":{"name":"Bus Route","terms":""},"type/route/detour":{"name":"Detour Route","terms":""},"type/route/ferry":{"name":"Ferry Route","terms":""},"type/route/foot":{"name":"Foot Route","terms":""},"type/route/hiking":{"name":"Hiking Route","terms":""},"type/route/horse":{"name":"Riding Route","terms":""},"type/route/light_rail":{"name":"Light Rail Route","terms":""},"type/route/pipeline":{"name":"Pipeline Route","terms":""},"type/route/piste":{"name":"Piste/Ski Route","terms":""},"type/route/power":{"name":"Power Route","terms":""},"type/route/road":{"name":"Road Route","terms":""},"type/route/subway":{"name":"Subway Route","terms":""},"type/route/train":{"name":"Train Route","terms":""},"type/route/tram":{"name":"Tram Route","terms":""},"type/site":{"name":"Site","terms":""},"type/waterway":{"name":"Waterway","terms":""},"vertex":{"name":"Other","terms":""},"waterway/boatyard":{"name":"Boatyard","terms":""},"waterway/canal":{"name":"Canal","terms":""},"waterway/dam":{"name":"Dam","terms":""},"waterway/ditch":{"name":"Ditch","terms":""},"waterway/dock":{"name":"Wet Dock / Dry Dock","terms":"boat,ship,vessel,marine"},"waterway/drain":{"name":"Drain","terms":""},"waterway/fuel":{"name":"Marine Fuel Station","terms":"petrol,gas,diesel,boat"},"waterway/river":{"name":"River","terms":"beck,branch,brook,course,creek,estuary,rill,rivulet,run,runnel,stream,tributary,watercourse"},"waterway/riverbank":{"name":"Riverbank","terms":""},"waterway/sanitary_dump_station":{"name":"Marine Toilet Disposal","terms":"Boat,Watercraft,Sanitary,Dump Station,Pumpout,Pump out,Elsan,CDP,CTDP,Chemical Toilet"},"waterway/stream_intermittent":{"name":"Intermittent Stream","terms":"arroyo,beck,branch,brook,burn,course,creek,drift,flood,flow,gully,run,runnel,rush,spate,spritz,tributary,wadi,wash,watercourse"},"waterway/stream":{"name":"Stream","terms":"beck,branch,brook,burn,course,creek,current,drift,flood,flow,freshet,race,rill,rindle,rivulet,run,runnel,rush,spate,spritz,surge,tide,torrent,tributary,watercourse"},"waterway/water_point":{"name":"Marine Drinking Water","terms":""},"waterway/waterfall":{"name":"Waterfall","terms":"fall"},"waterway/weir":{"name":"Weir","terms":""}}},"imagery":{"Bing":{"description":"Satellite and aerial imagery.","name":"Bing aerial imagery"},"DigitalGlobe-Premium":{"attribution":{"text":"Terms & Feedback"},"description":"Premium DigitalGlobe satellite imagery.","name":"DigitalGlobe Premium Imagery"},"DigitalGlobe-Premium-vintage":{"attribution":{"text":"Terms & Feedback"},"description":"Imagery boundaries and capture dates. Labels appear at zoom level 14 and higher.","name":"DigitalGlobe Premium Imagery Vintage"},"DigitalGlobe-Standard":{"attribution":{"text":"Terms & Feedback"},"description":"Standard DigitalGlobe satellite imagery.","name":"DigitalGlobe Standard Imagery"},"DigitalGlobe-Standard-vintage":{"attribution":{"text":"Terms & Feedback"},"description":"Imagery boundaries and capture dates. Labels appear at zoom level 14 and higher.","name":"DigitalGlobe Standard Imagery Vintage"},"EsriWorldImagery":{"attribution":{"text":"Terms & Feedback"},"description":"Esri world imagery.","name":"Esri World Imagery"},"EsriWorldImageryClarity":{"attribution":{"text":"Terms & Feedback"},"description":"Esri archive imagery that may be clearer and more accurate than the default layer.","name":"Esri World Imagery (Clarity) Beta"},"MAPNIK":{"attribution":{"text":"© OpenStreetMap contributors, CC-BY-SA"},"description":"The default OpenStreetMap layer.","name":"OpenStreetMap (Standard)"},"Mapbox":{"attribution":{"text":"Terms & Feedback"},"description":"Satellite and aerial imagery.","name":"Mapbox Satellite"},"OSM_Inspector-Addresses":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Addresses"},"OSM_Inspector-Geometry":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Geometry"},"OSM_Inspector-Highways":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Highways"},"OSM_Inspector-Multipolygon":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Area"},"OSM_Inspector-Places":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Places"},"OSM_Inspector-Routing":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Routing"},"OSM_Inspector-Tagging":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Tagging"},"US-TIGER-Roads-2012":{"name":"TIGER Roads 2012"},"US-TIGER-Roads-2014":{"description":"At zoom level 16+, public domain map data from the US Census. At lower zooms, only changes since 2006 minus changes already incorporated into OpenStreetMap","name":"TIGER Roads 2014"},"US-TIGER-Roads-2017":{"description":"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap","name":"TIGER Roads 2017"},"Waymarked_Trails-Cycling":{"attribution":{"text":"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},"name":"Waymarked Trails: Cycling"},"Waymarked_Trails-Hiking":{"attribution":{"text":"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},"name":"Waymarked Trails: Hiking"},"Waymarked_Trails-MTB":{"attribution":{"text":"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},"name":"Waymarked Trails: MTB"},"Waymarked_Trails-Skating":{"attribution":{"text":"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},"name":"Waymarked Trails: Skating"},"Waymarked_Trails-Winter_Sports":{"attribution":{"text":"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},"name":"Waymarked Trails: Winter Sports"},"basemap.at":{"attribution":{"text":"basemap.at"},"description":"Basemap of Austria, based on goverment data.","name":"basemap.at"},"basemap.at-orthofoto":{"attribution":{"text":"basemap.at"},"description":"Orthofoto layer provided by basemap.at. \"Successor\" of geoimage.at imagery.","name":"basemap.at Orthofoto"},"hike_n_bike":{"attribution":{"text":"© OpenStreetMap contributors"},"name":"Hike & Bike"},"mapbox_locator_overlay":{"attribution":{"text":"Terms & Feedback"},"description":"Shows major features to help orient you.","name":"Locator Overlay"},"openpt_map":{"attribution":{"text":"© OpenStreetMap contributors, CC-BY-SA"},"name":"OpenPT Map (overlay)"},"osm-gps":{"attribution":{"text":"© OpenStreetMap contributors"},"description":"Public GPS traces uploaded to OpenStreetMap.","name":"OpenStreetMap GPS traces"},"osm-mapnik-black_and_white":{"attribution":{"text":"© OpenStreetMap contributors, CC-BY-SA"},"name":"OpenStreetMap (Standard Black & White)"},"osm-mapnik-german_style":{"attribution":{"text":"© OpenStreetMap contributors, CC-BY-SA"},"name":"OpenStreetMap (German Style)"},"qa_no_address":{"attribution":{"text":"Simon Poole, Data ©OpenStreetMap contributors"},"name":"QA No Address"},"skobbler":{"attribution":{"text":"© Tiles: skobbler Map data: OpenStreetMap contributors"},"name":"skobbler"},"stamen-terrain-background":{"attribution":{"text":"Map tiles by Stamen Design, under CC BY 3.0"},"name":"Stamen Terrain"},"tf-cycle":{"attribution":{"text":"Maps © Thunderforest, Data © OpenStreetMap contributors"},"name":"Thunderforest OpenCycleMap"},"tf-landscape":{"attribution":{"text":"Maps © Thunderforest, Data © OpenStreetMap contributors"},"name":"Thunderforest Landscape"}}};
23643
23644 var dataImagery = [{"id":"sjcgis.org-Aerials_2013_WM","name":"2013 aerial imagery for San Juan County WA","type":"tms","template":"http://sjcgis.org/arcgis/rest/services/Basemaps/Aerials_2013_WM/MapServer/tile/{zoom}/{y}/{x}","endDate":"2013-06-01T00:00:00.000Z","startDate":"2013-05-01T00:00:00.000Z","scaleExtent":[0,19],"polygon":[[[-123.02167396992,48.44667085335],[-122.9466579482,48.44780949945],[-122.90151100606,48.41306930778],[-122.80263405293,48.40771378918],[-122.79199104756,48.44279926564],[-122.8088138625,48.47865708877],[-122.73911934346,48.49572334021],[-122.78546791524,48.62160819278],[-122.73087959737,48.6361306644],[-122.75559883565,48.71207854113],[-122.95747261494,48.71592956034],[-122.97086220235,48.695765074],[-122.99970131367,48.69780454658],[-123.00347786397,48.73427448605],[-123.04330330342,48.74310484148],[-123.0762622878,48.70528190578],[-123.08484535664,48.66334903433],[-123.12844734639,48.66380254936],[-123.22698097676,48.70301615666],[-123.24655037373,48.68352650341],[-123.17445259541,48.64701977542],[-123.21513634175,48.60106537642],[-123.21393471211,48.57335906966],[-123.18080406636,48.56574853208],[-123.16621284932,48.52006125122],[-123.10235481709,48.47683634964],[-123.02167396992,48.44667085335]],[[-122.98339348286,48.78214357977],[-122.93498497456,48.76653172572],[-122.91181068867,48.73857664785],[-122.80229073018,48.73982194177],[-122.81945686787,48.75498940888],[-122.93429832906,48.79571515892],[-122.98373680562,48.79435816618],[-122.98339348286,48.78214357977]]],"terms_url":"https://www.arcgis.com/home/item.html?id=7bf69831861d438d8365cf9f46662523","terms_text":"Pictometry Inc, San Juan County GIS","description":"Public domain aerial imagery taken in May/June 2013 from San Juan County, WA. Resolution is 9 inch."},{"id":"sjcgis.org-Aerials_2016_WM","name":"2016 aerial imagery for San Juan County WA","type":"tms","template":"http://sjcgis.org/arcgis/rest/services/Basemaps/Aerials_2016_WM/MapServer/tile/{zoom}/{y}/{x}","endDate":"2016-07-01T00:00:00.000Z","startDate":"2016-05-01T00:00:00.000Z","scaleExtent":[0,19],"polygon":[[[-123.02167396992,48.44667085335],[-122.9466579482,48.44780949945],[-122.90151100606,48.41306930778],[-122.80263405293,48.40771378918],[-122.79199104756,48.44279926564],[-122.8088138625,48.47865708877],[-122.73911934346,48.49572334021],[-122.78546791524,48.62160819278],[-122.73087959737,48.6361306644],[-122.75559883565,48.71207854113],[-122.95747261494,48.71592956034],[-122.97086220235,48.695765074],[-122.99970131367,48.69780454658],[-123.00347786397,48.73427448605],[-123.04330330342,48.74310484148],[-123.0762622878,48.70528190578],[-123.08484535664,48.66334903433],[-123.12844734639,48.66380254936],[-123.22698097676,48.70301615666],[-123.24655037373,48.68352650341],[-123.17445259541,48.64701977542],[-123.21513634175,48.60106537642],[-123.21393471211,48.57335906966],[-123.18080406636,48.56574853208],[-123.16621284932,48.52006125122],[-123.10235481709,48.47683634964],[-123.02167396992,48.44667085335]],[[-122.98339348286,48.78214357977],[-122.93498497456,48.76653172572],[-122.91181068867,48.73857664785],[-122.80229073018,48.73982194177],[-122.81945686787,48.75498940888],[-122.93429832906,48.79571515892],[-122.98373680562,48.79435816618],[-122.98339348286,48.78214357977]]],"best":true,"description":"Public domain aerial imagery taken in May, June, and July from San Juan County, WA. Resolution is 6 inch countywide."},{"id":"OS7","name":"7th Series (OS7)","type":"tms","template":"https://ooc.openstreetmap.org/os7/{zoom}/{x}/{y}.jpg","polygon":[[[-3.046968,54.839473],[-3.058641,55.2415704],[-4.0446639,55.2329572],[-4.0707564,55.6365416],[-4.6190429,55.6253005],[-4.6492553,56.0283381],[-4.4896102,56.0321747],[-4.5239425,56.4367031],[-3.8675094,56.4458128],[-3.8417602,56.049435],[-3.445909,56.0498185],[-3.4349227,55.6442923],[-2.7949691,55.6504917],[-2.8080153,56.0574872],[-3.2066131,56.0532696],[-3.2141662,56.4568175],[-3.7380767,56.4507463],[-3.7418532,56.8617541],[-5.0766921,56.8317131],[-5.0365233,56.4294897],[-5.1601195,56.4249331],[-5.1299071,56.0179772],[-5.9260726,55.994559],[-5.8551764,55.2333487],[-5.2280974,55.2513559],[-5.2102447,55.027647],[-4.659555,55.0418131],[-4.6454787,54.8163344],[-3.046968,54.839473]],[[-1.7483497,57.7642809],[-1.7406468,57.3599979],[-2.5802193,57.3553698],[-2.5743689,57.0452643],[-2.0840782,57.0479899],[-2.0765057,56.6427564],[-2.734497,56.6390587],[-2.737815,56.8171751],[-3.2388513,56.8143725],[-3.2489563,57.351683],[-3.7562947,57.3488858],[-3.7621877,57.6586785],[-4.7658688,57.6447324],[-4.810078,58.2698422],[-5.2511001,58.2654711],[-5.2737594,58.6676722],[-3.5581778,58.6988712],[-3.566072,58.9316035],[-3.3765578,58.9344382],[-3.3858372,59.2017095],[-3.187134,59.2021481],[-3.1874677,59.2417623],[-3.0675673,59.2420266],[-3.0785537,59.4213467],[-2.3713088,59.4276337],[-2.3685622,59.0221982],[-2.678926,59.0207845],[-2.6734328,58.8393493],[-2.8656936,58.8365068],[-2.8602004,58.5353109],[-3.0346084,58.5331604],[-3.0195022,58.1315879],[-3.6155983,58.1198177],[-3.6127639,57.9775439],[-3.7109154,57.9756153],[-3.699316,57.7536442],[-1.7483497,57.7642809]],[[-7.0749164,56.7631857],[-7.7347099,56.7356573],[-7.7911007,57.1399384],[-7.7066243,57.1434261],[-7.7629881,57.5431114],[-7.6021787,57.5496778],[-7.6213373,57.6845215],[-7.724988,57.6803049],[-7.7301746,57.7167278],[-7.6026437,57.7219106],[-7.5996413,57.7008338],[-7.4863439,57.7054402],[-7.49528,57.7681282],[-7.3749316,57.7730121],[-7.3933722,57.9020139],[-7.2359063,57.9083804],[-7.2432312,57.9594843],[-7.1391571,57.9636854],[-7.1450794,58.0049464],[-7.2374247,58.001223],[-7.2329687,57.9701789],[-7.3113276,57.9670164],[-7.3153794,57.9952475],[-7.2490415,57.9979228],[-7.2808211,58.218564],[-7.0735459,58.2268701],[-7.0827038,58.2901845],[-6.807432,58.3011927],[-6.8276802,58.4407359],[-6.5030498,58.4536624],[-6.5153194,58.5379206],[-6.1647379,58.5518417],[-6.1063084,58.1489361],[-6.3346892,58.139764],[-6.2775862,57.7414459],[-6.9613783,57.7136632],[-6.9333168,57.5161471],[-7.100168,57.5093277],[-7.0521806,57.169002],[-7.1311072,57.1657457],[-7.0749164,56.7631857]],[[0.4107642,50.8208689],[0.9810233,50.8061178],[0.9943731,51.0117337],[1.4506241,50.9999804],[1.4771216,51.4055151],[0.8961869,51.4203486],[0.882435,51.2103932],[0.5050041,51.2200721],[0.5227271,51.4904202],[-0.6339669,51.5106322],[-0.6367135,51.4456291],[-1.0995126,51.4524759],[-1.1148479,51.0481357],[-0.5298744,51.0394048],[-0.5275085,51.10203],[0.4280611,51.0877836],[0.4107642,50.8208689]],[[-5.3945661,51.9618998],[-4.7958112,51.9805124],[-4.7887332,51.8940308],[-4.2026458,51.9122773],[-4.2294099,52.2382823],[-3.6551984,52.2560218],[-3.6222764,51.8548323],[-4.2134157,51.836405],[-4.1855134,51.4934202],[-4.776615,51.4748465],[-4.7847576,51.5752482],[-5.0879928,51.5657379],[-5.0942224,51.6424172],[-5.3678001,51.6338498],[-5.3945661,51.9618998]],[[-1.2389016,54.0353696],[-0.6277871,54.0281103],[-0.6200376,54.2525704],[-0.5726819,54.2520109],[-0.5586479,54.6554165],[-1.17998,54.6626853],[-1.1878192,54.4378771],[-1.2322093,54.4383992],[-1.2389016,54.0353696]],[[-2.6722741,50.9767709],[-2.0996118,50.9802295],[-2.1057212,51.3794917],[-1.5887659,51.3825866],[-1.594992,51.7858908],[-2.1756313,51.7889106],[-2.1715392,51.3839176],[-2.6784576,51.3808828],[-2.6722741,50.9767709]],[[-2.6015496,53.2715461],[-3.2297251,53.2685042],[-3.2352183,53.6723131],[-2.6070428,53.6753262],[-2.6015496,53.2715461]],[[-0.0394177,51.7727994],[-0.6156335,51.7757705],[-0.6046472,52.5841377],[-0.0284314,52.5812201],[-0.0394177,51.7727994]],[[-2.9152892,54.0352257],[-3.5322877,54.0286638],[-3.5448438,54.4339736],[-2.9278454,54.4404713],[-2.9152892,54.0352257]],[[-6.3058305,57.1968949],[-6.3538957,57.6001458],[-5.6911121,57.6229455],[-5.643047,57.2199469],[-6.3058305,57.1968949]],[[1.171145,52.5723589],[1.1986505,52.9759408],[1.7978754,52.9610616],[1.7703699,52.5573411],[1.171145,52.5723589]],[[-2.4022508,55.5631737],[-2.4008775,55.9656986],[-1.7608445,55.965011],[-1.7622178,55.562479],[-2.4022508,55.5631737]],[[-6.3257432,56.3853727],[-7.0196021,56.3574652],[-7.0731605,56.7638392],[-6.3793015,56.7914485],[-6.3257432,56.3853727]],[[-2.422577,54.4430983],[-2.4257397,54.841885],[-1.7993058,54.8435404],[-1.7961431,54.4447701],[-2.422577,54.4430983]],[[-3.0270123,51.3793548],[-3.6058877,51.370168],[-3.6223672,51.7730401],[-3.0434918,51.7821458],[-3.0270123,51.3793548]],[[-3.0537915,52.1897924],[-3.0661511,52.5937352],[-2.4836401,52.600342],[-2.4712805,52.1964599],[-3.0537915,52.1897924]],[[-5.676726,51.7042466],[-5.6788616,51.731006],[-5.4635982,51.7375973],[-5.4614627,51.7108418],[-5.676726,51.7042466]],[[-5.8442675,59.1088192],[-5.8469031,59.1357806],[-5.7955763,59.1371015],[-5.7929408,59.1101412],[-5.8442675,59.1088192]],[[-8.648442,57.7786066],[-8.6659651,57.87717],[-8.4664946,57.8872093],[-8.4489714,57.7886733],[-8.648442,57.7786066]],[[-4.5271098,59.0153156],[-4.5285904,59.0331938],[-4.4762337,59.034342],[-4.4747531,59.0164644],[-4.5271098,59.0153156]],[[-7.6806151,58.2583811],[-7.6865455,58.2938023],[-7.5344535,58.3008387],[-7.5285231,58.2654246],[-7.6806151,58.2583811]],[[-6.1910235,59.080087],[-6.1954619,59.1158563],[-6.125424,59.1181472],[-6.1209857,59.0823803],[-6.1910235,59.080087]],[[-4.4266879,59.0711219],[-4.4280472,59.0886998],[-4.3762055,59.089758],[-4.3748462,59.0721806],[-4.4266879,59.0711219]]]},{"id":"AGIV10cm","name":"AGIV Flanders 2013-2015 aerial imagery 10cm","type":"wms","template":"https://geoservices.informatievlaanderen.be/raadpleegdiensten/OGW/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OGWRGB13_15VL&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2015-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","polygon":[[[5.9849448,50.7072276],[5.9849448,50.7671973],[5.9107871,50.8227527],[5.7556052,50.8353303],[5.7542319,50.8626424],[5.8331961,50.9332328],[5.8551688,51.026611],[5.9094138,51.0775439],[5.9121604,51.1822548],[5.8785147,51.2080728],[5.7741446,51.2368858],[5.684194,51.2407548],[5.6230826,51.2699769],[5.6230826,51.2978925],[5.5399985,51.34724],[5.4473013,51.3485267],[5.3985495,51.321071],[5.3120322,51.3232166],[5.2667136,51.3618196],[5.1994223,51.3725369],[5.1829428,51.3961061],[5.1589102,51.4923992],[5.0833792,51.5308596],[5.0325675,51.539829],[4.9556632,51.5052229],[4.9014182,51.5056503],[4.8382468,51.5436725],[4.7709555,51.5586163],[4.711904,51.5470886],[4.6404929,51.4966741],[4.6144003,51.4971016],[4.5656485,51.5317139],[4.4825644,51.5304324],[4.4262595,51.5218884],[4.3006034,51.4697351],[4.2951102,51.4256575],[4.181127,51.4243731],[4.1371817,51.3952492],[4.138555,51.3506709],[4.0520377,51.3004685],[3.933248,51.272984],[3.8652701,51.2708361],[3.8632102,51.2901637],[3.7629599,51.3240748],[3.5933585,51.359247],[3.4773154,51.3313688],[3.425817,51.3973913],[3.2356162,51.3515286],[3.2260031,51.3656781],[3.1779379,51.3618196],[3.1600852,51.3322268],[3.0625815,51.3021857],[2.7508444,51.1702014],[2.4700064,51.0745241],[2.4926657,50.9937771],[2.5311179,50.9557299],[2.5091452,50.9115907],[2.5304312,50.8214514],[2.5990958,50.7641572],[2.6650138,50.7645915],[2.7700705,50.66677],[2.8970999,50.6589354],[2.991857,50.7254874],[3.1133933,50.7263567],[3.2369895,50.7059231],[3.3626456,50.6585001],[3.4711356,50.7020092],[3.6393637,50.6672052],[3.6984152,50.681565],[3.727941,50.7124454],[3.8185782,50.6841754],[3.8748831,50.6415206],[4.0925498,50.642827],[4.150228,50.6632881],[4.2065329,50.6441333],[4.3136496,50.642827],[4.452352,50.6876557],[4.5347495,50.6780842],[4.6130271,50.6954855],[4.6768851,50.6959204],[4.7270102,50.732007],[4.7805686,50.732007],[4.7997946,50.7128802],[4.8622794,50.7128802],[4.8856253,50.6954855],[4.9611563,50.6954855],[5.0311942,50.6576295],[5.1074118,50.6502288],[5.2007956,50.6489227],[5.2358145,50.6654643],[5.3250784,50.6658995],[5.3669638,50.6820001],[5.4212088,50.6641586],[5.5221457,50.6746032],[5.622396,50.7241834],[5.6752677,50.69853],[5.7398123,50.6972252],[5.7727713,50.6719923],[5.8125968,50.6602413],[5.9080405,50.659806],[5.9849448,50.7072276]]],"terms_text":"Orthophoto Flanders © AGIV","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABm0lEQVQ4y6WTPUgCYRjHf5oFJVfRUZKVHYFBoBAUFLZE0FBD0NQHRENESzS019LSFNHWx1DQEhGRg0JFREM11FJuLWem4GB5HULdwdkgHprn5LO97/O8v+fj/7y2bDabpQKzFx5S6ntlgE81xvHtclHAbuSNloNT5q/uywP021cAvO4hAPYu5/hI5e6GWpsBCEfjxNSMNUALPvJ7eA3AQPcML3KIzbNhlvdEWmu+6RCcAISiCWtA3fosPztBfrYvAGgX/QCIggdR8DDe6Qbg5E0uAdjyKhhykq+uBeySi9qVCfSAB61HRBQ8RFJpRs6vALiZHMUnNpYO0Ujn+jPkJJnVfbTBNeqfFQB8YqP56H8VJqBKcuHcWsQuuXIOyUX1sN8MnPJKlnOwWS2SIScx0hkcvV3mXUzN0HcSAuBoNMBYZxsADittVXcT/XcPKE/PltqHowkTYLcMkOMoml52+wr9jnIZAJZ8XjYGe0vaUDSdsBxnulsqrUDRdMLReNHg8tYhOAs2M2HdQiSVBqChprpI7/9q5JPYKv3OfxL1n52ATYYBAAAAAElFTkSuQmCC"},{"id":"AGRI-black_and_white-2.5m","name":"AGRI black-and-white 2.5m","type":"tms","template":"https://{switch:a,b,c}.agri.openstreetmap.org/layer/au_ga_agri/{zoom}/{x}/{y}.png","polygon":[[[112.28778,-28.784589],[112.71488,-31.13894],[114.11263,-34.178287],[113.60788,-37.39012],[117.17992,-37.451794],[119.31538,-37.42096],[121.72262,-36.708394],[123.81925,-35.76893],[125.9547,-34.3066],[127.97368,-33.727398],[130.07031,-33.24166],[130.10913,-33.888704],[131.00214,-34.049705],[131.0798,-34.72257],[132.28342,-35.39],[134.18591,-35.61126],[133.8753,-37.1119],[134.8459,-37.6365],[139.7769,-37.82075],[139.93223,-39.4283],[141.6017,-39.8767],[142.3783,-39.368294],[142.3783,-40.64702],[142.49478,-42.074874],[144.009,-44.060127],[147.23161,-44.03222],[149.05645,-42.534313],[149.52237,-40.99959],[149.9494,-40.852921],[150.8036,-38.09627],[151.81313,-38.12682],[156.20052,-22.667706],[156.20052,-20.10109],[156.62761,-17.417627],[155.26869,-17.19521],[154.14272,-19.51662],[153.5215,-18.34139],[153.05558,-16.5636],[152.78379,-15.256768],[152.27905,-13.4135],[151.3472,-12.391767],[149.48354,-12.05024],[146.9598,-9.992408],[135.9719,-9.992408],[130.3032,-10.33636],[128.09016,-12.164136],[125.91588,-12.315912],[124.3239,-11.860326],[122.03323,-11.974295],[118.26706,-16.9353],[115.93747,-19.11357],[114.0738,-21.11863],[113.49141,-22.596033],[112.28778,-28.784589]]],"terms_text":"AGRI"},{"id":"alagoas_litoral","name":"Alagoas Litoral 2006","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Ortofotos%202006&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-35.523842344,-9.48089222803],[-35.52360077082,-9.44514935417],[-35.51571944592,-9.44517914145],[-35.51584023251,-9.44228976382],[-35.50542238925,-9.44237912638],[-35.50518081607,-9.43064264549],[-35.4933437304,-9.43073201107],[-35.49304176392,-9.39820141319],[-35.48929737968,-9.39817162186],[-35.48920678974,-9.38628467767],[-35.4854020122,-9.38634426236],[-35.48525102896,-9.37809168429],[-35.48126507154,-9.37812147735],[-35.48114428495,-9.36986870367],[-35.47697714765,-9.36995808494],[-35.47685636106,-9.36385031181],[-35.47459161253,-9.36388010609],[-35.47447082594,-9.36152635042],[-35.47211548746,-9.36140717249],[-35.47205509417,-9.35917257881],[-35.46976014899,-9.35920237349],[-35.46966955904,-9.35681879126],[-35.46652910774,-9.3567592015],[-35.46640832115,-9.35288584487],[-35.46387180279,-9.35276666399],[-35.46387180279,-9.35118751337],[-35.44134510403,-9.3513066948],[-35.44125451409,-9.34540716508],[-35.43177276689,-9.34537736922],[-35.4317123736,-9.33602134361],[-35.39463089092,-9.33631931008],[-35.39441951439,-9.30124690873],[-35.38164633265,-9.30142570645],[-35.38146515277,-9.28637657868],[-35.37799253835,-9.28625737508],[-35.3779623417,-9.28110178087],[-35.36941669056,-9.28122098621],[-35.36920531403,-9.27260829561],[-35.35966317354,-9.2727573059],[-35.35969337019,-9.2646510545],[-35.35051358946,-9.26474046271],[-35.35036260622,-9.25562070859],[-35.34115262885,-9.25565051209],[-35.34118282549,-9.24501050089],[-35.31775022732,-9.24518932726],[-35.31759924408,-9.22566691185],[-35.30292367358,-9.22578613599],[-35.30283308363,-9.2113001083],[-35.307936317,-9.2113597228],[-35.30784572706,-9.19979432149],[-35.29102619461,-9.19988374615],[-35.29090540802,-9.19660482728],[-35.29018068849,-9.19669425274],[-35.28996931196,-9.16515547298],[-35.27758868663,-9.16521509525],[-35.27749809669,-9.16417170413],[-35.27541452804,-9.16420151535],[-35.27535413474,-9.16151849576],[-35.27375371245,-9.16148868432],[-35.2736631225,-9.15838828064],[-35.27182112703,-9.15841809234],[-35.27185132368,-9.15728524588],[-35.27148896391,-9.15728524588],[-35.27142857062,-9.15469161013],[-35.26964696844,-9.1546319861],[-35.26958657514,-9.15361837601],[-35.26919401873,-9.15361837601],[-35.26907323214,-9.13158654923],[-35.26403039207,-9.13164617712],[-35.26400019542,-9.12317891652],[-35.26055777765,-9.12320873117],[-35.260527581,-9.11781223884],[-35.25599808393,-9.11784205394],[-35.25572631411,-9.08945695375],[-35.25113642374,-9.08954640613],[-35.25107603045,-9.08650501259],[-35.25026072098,-9.08647519487],[-35.25029091762,-9.08474576336],[-35.24449316137,-9.08477558121],[-35.24449316137,-9.07988541975],[-35.24092995701,-9.07997487452],[-35.24080917042,-9.0731166106],[-35.237336556,-9.0731166106],[-35.23718557277,-9.06321662455],[-35.23655144318,-9.06321662455],[-35.23652124653,-9.04654705576],[-35.23322981199,-9.04651723473],[-35.23332040193,-9.04344565539],[-35.23060270369,-9.04347547668],[-35.23060270369,-9.04013547745],[-35.22897208475,-9.04007583433],[-35.22900228139,-9.03834617941],[-35.22504652062,-9.03825671427],[-35.22501632397,-9.03166605486],[-35.22229862573,-9.03160641033],[-35.22232882238,-9.02012465516],[-35.21834286496,-9.02009483194],[-35.21831266831,-9.01341436936],[-35.21671224601,-9.01341436936],[-35.21668204936,-9.00998461959],[-35.21175999588,-9.00998461959],[-35.21172979923,-9.00646536424],[-35.20970662388,-9.00652501292],[-35.20973682052,-9.00437765419],[-35.20765325187,-9.00431800516],[-35.20768344852,-9.00226010741],[-35.20566027316,-9.00226010741],[-35.20563007651,-8.99987412434],[-35.20390886763,-8.99987412434],[-35.20393906427,-8.99784602637],[-35.20212726545,-8.99790567647],[-35.20212726545,-8.9957880918],[-35.1984432745,-8.99581791702],[-35.1984432745,-8.99361084394],[-35.19433653049,-8.99361084394],[-35.19427613719,-8.99122480384],[-35.19065253954,-8.99131428063],[-35.19062234289,-8.98833170914],[-35.18766307147,-8.98842118664],[-35.18763287482,-8.98543859134],[-35.1847339967,-8.98540876526],[-35.1846736034,-8.98254545043],[-35.18237865822,-8.98251562411],[-35.18234846157,-8.9805172554],[-35.17950997674,-8.98060673484],[-35.1794797801,-8.97741528813],[-35.17809073433,-8.97744511486],[-35.17803034103,-8.97306055853],[-35.17558441262,-8.97303073144],[-35.17549382268,-8.96912336076],[-35.17292710767,-8.96909353334],[-35.17283651773,-8.96291920489],[-35.17063216249,-8.96288937697],[-35.17048117925,-8.95579026036],[-35.16851839719,-8.95564111777],[-35.16851839719,-8.94806459361],[-35.16794466089,-8.94800493531],[-35.16791446424,-8.9399509755],[-35.16244887111,-8.9399509755],[-35.16241867447,-8.92977886806],[-35.15870448687,-8.9298086987],[-35.15873468352,-8.92661680615],[-35.15547344563,-8.92667646795],[-35.15550364227,-8.92378285946],[-35.15348046692,-8.92381269059],[-35.15338987697,-8.92065057698],[-35.15130630832,-8.92062074559],[-35.15121571838,-8.91193970728],[-35.1526349608,-8.91193970728],[-35.1526349608,-8.90821067559],[-35.15438636633,-8.908240508],[-35.15429577639,-8.90215464709],[-35.15592639533,-8.90212481419],[-35.15592639533,-8.90051383392],[-35.15767780087,-8.90048400089],[-35.15773819416,-8.89905201236],[-35.15958018964,-8.89908184551],[-35.15954999299,-8.89747085185],[-35.16139198846,-8.89750068513],[-35.16133159517,-8.89624768526],[-35.16362654035,-8.89624768526],[-35.1635963437,-8.89526318235],[-35.16552892912,-8.89526318235],[-35.16549873247,-8.89314500045],[-35.16794466089,-8.89314500045],[-35.16791446424,-8.89147431313],[-35.17023960607,-8.89153398066],[-35.17026980272,-8.89040029582],[-35.17301769761,-8.89043012968],[-35.17301769761,-8.88875942997],[-35.17790955445,-8.88875942997],[-35.17793975109,-8.88795391132],[-35.17893624045,-8.88792407726],[-35.17893624045,-8.8889085999],[-35.17966095998,-8.88893843387],[-35.17978174657,-8.88858042598],[-35.18098961245,-8.88861025998],[-35.18098961245,-8.88816274965],[-35.1851869464,-8.88816274965],[-35.1851869464,-8.88896826785],[-35.18591166594,-8.88899810182],[-35.18591166594,-8.88971411645],[-35.18932388706,-8.88971411645],[-35.1894748703,-8.88929644142],[-35.19013919653,-8.88926660747],[-35.19016939318,-8.88831191982],[-35.19071293283,-8.88831191982],[-35.19077332612,-8.8878942432],[-35.1915282423,-8.88792407726],[-35.19155843895,-8.88619369772],[-35.19753737508,-8.8860743609],[-35.19756757173,-8.88729756147],[-35.19968133703,-8.88729756147],[-35.19974173032,-8.88777490693],[-35.20079861297,-8.88777490693],[-35.20079861297,-8.88822241773],[-35.20330493468,-8.88822241773],[-35.20336532798,-8.88869976198],[-35.20563007651,-8.88861025998],[-35.20556968322,-8.88983345208],[-35.20741167869,-8.88980361818],[-35.20744187534,-8.89022129263],[-35.21124665288,-8.8902511265],[-35.21127684953,-8.8876854047],[-35.21245451877,-8.88777490693],[-35.21248471541,-8.88861025998],[-35.21622909966,-8.88858042598],[-35.21622909966,-8.88747656609],[-35.21870522472,-8.887446732],[-35.21870522472,-8.88896826785],[-35.22136252967,-8.88896826785],[-35.22263078885,-8.88792407726],[-35.22401983462,-8.88747656609],[-35.22453317762,-8.88762573654],[-35.22643556639,-8.88717822501],[-35.22706969598,-8.88598485826],[-35.2331090254,-8.88446331002],[-35.23932953471,-8.88338927217],[-35.24129231678,-8.88416496649],[-35.25010973774,-8.88514949923],[-35.25623965711,-8.88505999636],[-35.26167505359,-8.88294175546],[-35.2616146603,-8.88094284086],[-35.26406058872,-8.88109201397],[-35.26877126567,-8.87930193267],[-35.27420666215,-8.87748200772],[-35.27810202963,-8.87518471252],[-35.28498686518,-8.87506537212],[-35.28501706183,-8.875811249],[-35.28809711983,-8.87578141395],[-35.29404585932,-8.87545322829],[-35.30781553041,-8.87208184942],[-35.31756904744,-8.86960550716],[-35.32783590746,-8.86715898394],[-35.33206343806,-8.8661445671],[-35.34103184226,-8.86375769289],[-35.34710136833,-8.86244490546],[-35.3522046017,-8.86113211335],[-35.35256696146,-8.86390687298],[-35.34903395375,-8.86611473127],[-35.34495740639,-8.87205201407],[-35.34326639415,-8.87488636144],[-35.3431758042,-8.8756919088],[-35.34380993379,-8.87667646429],[-35.34480642315,-8.87679580417],[-35.34888297051,-8.87721349344],[-35.35042299952,-8.87781019157],[-35.35253676482,-8.87891408057],[-35.35398620388,-8.88010747033],[-35.35576780606,-8.88252407272],[-35.35754940824,-8.88395612587],[-35.36035769642,-8.88511966494],[-35.36114280925,-8.88508983065],[-35.36120320254,-8.88586552137],[-35.36174674219,-8.8858953556],[-35.36177693884,-8.88777490693],[-35.36253185502,-8.88783457507],[-35.36247146172,-8.89099697249],[-35.36310559131,-8.89111630771],[-35.36310559131,-8.89481568015],[-35.36440404714,-8.89487534714],[-35.36506837338,-8.8966951857],[-35.3663668292,-8.90021550347],[-35.36754449844,-8.90427277684],[-35.36793705485,-8.90782285411],[-35.36863157774,-8.90916531133],[-35.37207399551,-8.91155188976],[-35.37409717087,-8.91349097325],[-35.37276851839,-8.91599685052],[-35.37261753516,-8.91817456324],[-35.37083593298,-8.92229129973],[-35.37062455645,-8.92485677869],[-35.37234576533,-8.93037548043],[-35.37153045586,-8.93192666805],[-35.37153045586,-8.93362700074],[-35.37171163574,-8.93386564329],[-35.37171163574,-8.94362002373],[-35.36817862803,-8.94376917125],[-35.36814843138,-8.9450518374],[-35.36926570733,-8.94511149618],[-35.36920531403,-8.94863134694],[-35.37077553968,-8.94872083423],[-35.37080573633,-8.95182304658],[-35.3721947821,-8.9517633889],[-35.37222497875,-8.9552831753],[-35.37319127145,-8.95531300385],[-35.37313087816,-8.95737116808],[-35.37439913734,-8.95737116808],[-35.37445953063,-8.96011536892],[-35.37566739652,-8.96017502523],[-35.37569759317,-8.96205419397],[-35.3768752624,-8.96208402197],[-35.3769356557,-8.964440426],[-35.37781135847,-8.964440426],[-35.37775096517,-8.96617043441],[-35.38074043324,-8.96617043441],[-35.38074043324,-8.96330696774],[-35.38288439518,-8.96327713984],[-35.38291459183,-8.95981708722],[-35.38542091354,-8.9598469154],[-35.38542091354,-8.95722202613],[-35.38723271237,-8.95722202613],[-35.38720251572,-8.95406020253],[-35.38946726426,-8.95409003118],[-35.38946726426,-8.9508386936],[-35.39158102956,-8.95086852252],[-35.39158102956,-8.94791544785],[-35.39586895345,-8.94791544785],[-35.39580856016,-8.94651347472],[-35.39719760593,-8.94654330399],[-35.39710701598,-8.94472371393],[-35.39837527516,-8.94469388451],[-35.39837527516,-8.93914556972],[-35.4010741005,-8.93915302719],[-35.40106277676,-8.93895167547],[-35.4016667097,-8.93893676052],[-35.40172710299,-8.93687849204],[-35.40236123258,-8.93687849204],[-35.40236123258,-8.9362818903],[-35.40323693535,-8.93640121073],[-35.40329732865,-8.93583443836],[-35.40426362135,-8.93580460821],[-35.40420322806,-8.93362700074],[-35.40574325706,-8.93359717041],[-35.40577345371,-8.93124056665],[-35.40809859554,-8.93133005821],[-35.40803820225,-8.92927174677],[-35.40936685472,-8.92930157745],[-35.40927626478,-8.92739240878],[-35.41084649043,-8.92742223962],[-35.41084649043,-8.92542356812],[-35.41238651943,-8.92545339912],[-35.41235632279,-8.92390218397],[-35.41335281214,-8.92387235285],[-35.41329241885,-8.92193332448],[-35.41522500426,-8.92196315577],[-35.41522500426,-8.91999428582],[-35.41655365674,-8.92002411726],[-35.41655365674,-8.91754809927],[-35.4196035181,-8.91754809927],[-35.41966391139,-8.91963630832],[-35.42183806999,-8.91963630832],[-35.42186826663,-8.92264927462],[-35.42389144199,-8.92267910584],[-35.42392163864,-8.92512525801],[-35.4253710777,-8.92512525801],[-35.4253710777,-8.92766088623],[-35.42724326982,-8.92766088623],[-35.42727346647,-8.92986835998],[-35.42814916924,-8.92983852934],[-35.42817936588,-8.93159853276],[-35.42987037812,-8.93153887177],[-35.42990057477,-8.93407445539],[-35.43141040713,-8.93407445539],[-35.43141040713,-8.9355957971],[-35.43225591325,-8.93556596693],[-35.43228610989,-8.93586426851],[-35.43340338584,-8.93583443836],[-35.43340338584,-8.94001063511],[-35.4343394819,-8.94004046492],[-35.4343394819,-8.94096518765],[-35.43530577461,-8.94096518765],[-35.43533597125,-8.94260581897],[-35.43566813437,-8.94263564856],[-35.43569833102,-8.94329189897],[-35.43627206732,-8.94332172851],[-35.43624187067,-8.94421661344],[-35.43729875332,-8.94421661344],[-35.43726855667,-8.94520098434],[-35.43823484938,-8.94520098434],[-35.43826504603,-8.94684159657],[-35.4390199622,-8.94687142582],[-35.4390199622,-8.94797510616],[-35.44025802474,-8.94797510616],[-35.44031841803,-8.94952621882],[-35.44158667721,-8.94955604785],[-35.4416470705,-8.95152475808],[-35.4427341498,-8.95152475808],[-35.4427341498,-8.95334431412],[-35.44436476875,-8.95334431412],[-35.44436476875,-8.95498488964],[-35.44569342122,-8.95501471821],[-35.44563302793,-8.9567447715],[-35.44720325358,-8.95680442836],[-35.44717305693,-8.95865378627],[-35.44895465911,-8.95871344282],[-35.44892446246,-8.95999605627],[-35.45100803112,-8.95993639993],[-35.45097783447,-8.96101021254],[-35.45469202207,-8.96095055636],[-35.45466182542,-8.96235247383],[-35.46048977832,-8.96235247383],[-35.46055017161,-8.96557388071],[-35.46652910774,-8.96548439758],[-35.46658950104,-8.9688549139],[-35.46770677698,-8.96882508646],[-35.46773697363,-8.97052524668],[-35.47389708964,-8.97052524668],[-35.47398767958,-8.97529758369],[-35.47791324371,-8.97520810295],[-35.47797363701,-8.97816095576],[-35.48410355637,-8.97813112908],[-35.48416394967,-8.98200857638],[-35.49083740868,-8.98194892366],[-35.49083740868,-8.98561754775],[-35.49720890123,-8.98561754775],[-35.49720890123,-8.99068794266],[-35.5022517413,-8.99056864006],[-35.50234233124,-8.99566879088],[-35.5064792719,-8.99566879088],[-35.50650946855,-8.99856182695],[-35.51203545497,-8.99850217696],[-35.51206565162,-9.00163378838],[-35.51662534534,-9.00166361312],[-35.51665554198,-9.00616712068],[-35.52118503905,-9.00613729631],[-35.5212152357,-9.00738991769],[-35.5312707192,-9.00733026915],[-35.5312707192,-9.01064074815],[-35.54818084159,-9.01049162813],[-35.54818084159,-9.01359331193],[-35.56968085435,-9.01344419313],[-35.56974124764,-9.01738090893],[-35.58574547062,-9.01732126204],[-35.58577566727,-9.01994571582],[-35.60957062521,-9.01982642288],[-35.60954042856,-9.02301749544],[-35.62910785591,-9.02286838053],[-35.62904746261,-9.02507527493],[-35.65220829096,-9.02489633805],[-35.65223848761,-9.02758038195],[-35.67552010255,-9.02740144631],[-35.6755502992,-9.03056262951],[-35.68294847774,-9.03056262951],[-35.68297867439,-9.03435004835],[-35.69128275235,-9.03432022631],[-35.69128275235,-9.03766027947],[-35.69949624037,-9.03760063593],[-35.69949624037,-9.04034422831],[-35.70668304239,-9.04031440677],[-35.70671323904,-9.04517528582],[-35.71115214617,-9.04517528582],[-35.71133332605,-9.06691424164],[-35.70870621775,-9.06691424164],[-35.70876661104,-9.07869268732],[-35.7065622558,-9.07872250568],[-35.7065622558,-9.08653483029],[-35.70429750727,-9.08653483029],[-35.70432770391,-9.09103727588],[-35.69991899343,-9.09106709321],[-35.69988879679,-9.09559929877],[-35.69535929972,-9.09556948181],[-35.69541969301,-9.1000121806],[-35.69092039259,-9.10013144692],[-35.69101098253,-9.10206951907],[-35.63366754962,-9.10245713224],[-35.63369774627,-9.10540894182],[-35.62584661802,-9.10552820634],[-35.62590701131,-9.10964280796],[-35.6223136103,-9.10964280796],[-35.62234380695,-9.11202806257],[-35.61989787853,-9.11199824698],[-35.61989787853,-9.11500960843],[-35.61473425187,-9.11506923909],[-35.61473425187,-9.11706686056],[-35.61177498045,-9.11700723023],[-35.6118051771,-9.11819983493],[-35.60960082186,-9.11825946506],[-35.60963101851,-9.12571315292],[-35.59975671489,-9.12583241066],[-35.59978691154,-9.12923123948],[-35.59634449377,-9.12926105363],[-35.59640488706,-9.13501513686],[-35.59196597993,-9.13507476418],[-35.59208676652,-9.14899746988],[-35.59018437775,-9.14896765739],[-35.5901541811,-9.15108433815],[-35.60159871037,-9.15105452583],[-35.60153831707,-9.14911671983],[-35.60552427449,-9.14911671983],[-35.60549407785,-9.14556901687],[-35.61183537375,-9.14553920409],[-35.61183537375,-9.14234922223],[-35.61760293335,-9.14237903528],[-35.6175727367,-9.13853313161],[-35.62400462254,-9.13853313161],[-35.62397442589,-9.13465737274],[-35.63176516085,-9.13465737274],[-35.63164437426,-9.13063250159],[-35.6392237327,-9.13060268756],[-35.63919353605,-9.12878402702],[-35.66386419676,-9.12869458446],[-35.66380380346,-9.12610074043],[-35.71278276511,-9.12577278179],[-35.71275256846,-9.12407335495],[-35.72425749102,-9.12401372579],[-35.71963740401,-9.15323081845],[-35.72111703972,-9.15320100631],[-35.72123782631,-9.17257836825],[-35.72066409001,-9.17254855774],[-35.72081507325,-9.18557551362],[-35.71211843887,-9.18566494187],[-35.71329610811,-9.34415573683],[-35.69040704959,-9.34433451257],[-35.69064862276,-9.3718946735],[-35.68898780717,-9.3718946735],[-35.68901800382,-9.37597637093],[-35.68756856476,-9.37597637093],[-35.6876591547,-9.38232227231],[-35.6849716531,-9.38235206501],[-35.6850320464,-9.39093225328],[-35.68168021856,-9.39099183718],[-35.68177080851,-9.39936327296],[-35.67715072149,-9.39933348173],[-35.67724131144,-9.40889633403],[-35.6729231909,-9.40892612443],[-35.67301378084,-9.41753544361],[-35.6697223463,-9.41759502292],[-35.66978273959,-9.42498277846],[-35.66721602459,-9.42498277846],[-35.66727641788,-9.43269804791],[-35.6607539421,-9.43287677797],[-35.6607539421,-9.43704711987],[-35.65130239155,-9.43707690785],[-35.65142317814,-9.44211103864],[-35.64514227553,-9.44217061371],[-35.64523286547,-9.44651956613],[-35.63644564116,-9.44660892759],[-35.63644564116,-9.44991528532],[-35.62711487719,-9.4500046459],[-35.62726586043,-9.46504667925],[-35.62086417124,-9.46510625035],[-35.62092456453,-9.47219513764],[-35.60938944533,-9.47222492257],[-35.60938944533,-9.47529275674],[-35.59673705018,-9.47535232607],[-35.59673705018,-9.47350567221],[-35.57843788202,-9.47371416589],[-35.57846807866,-9.47594801874],[-35.57267032241,-9.47603737255],[-35.57270051906,-9.48041568084],[-35.56823141529,-9.48047524927],[-35.56826161193,-9.48881472807],[-35.54168856246,-9.48893386201],[-35.54162816916,-9.48071352291],[-35.523842344,-9.48089222803]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"arapiraca_al","name":"Arapiraca AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Arapiraca&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.60875162133,-9.83071802463],[-36.60783704041,-9.74047303963],[-36.61718167158,-9.74051223078],[-36.61630685505,-9.65075247124],[-36.70736730351,-9.64977242883],[-36.70832164882,-9.74043384847],[-36.69897701764,-9.74047303963],[-36.69997112734,-9.82967973955],[-36.60875162133,-9.83071802463]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"CRAIG-Auvergne-2013","name":"Auvergne 2013 25cm CRAIG","type":"tms","template":"http://tiles.craig.fr/osm/tms/1.0.0/ortho_2013/webmercator/{zoom-1}/{x}/{-y}.jpeg","endDate":"2013-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","polygon":[[[2.9401192,44.6338837],[2.9971896,44.633931],[2.9971676,44.6473385],[3.0159744,44.6473541],[3.0159305,44.6741168],[3.0349486,44.6741326],[3.0349036,44.7015216],[3.0536338,44.7015371],[3.0535675,44.7418954],[3.0723301,44.741911],[3.0722196,44.8091687],[3.0921583,44.8091852],[3.092137,44.8221252],[3.1301398,44.8221567],[3.1300495,44.8770722],[3.1485587,44.8770875],[3.1485807,44.8636964],[3.1682313,44.8637126],[3.1682538,44.8500261],[3.2064,44.8500576],[3.2063789,44.8628393],[3.2439492,44.8628704],[3.2439263,44.8767893],[3.2631452,44.8768052],[3.2630782,44.9175197],[3.3200437,44.9175667],[3.3200227,44.9303336],[3.3390815,44.9303493],[3.3390586,44.9441978],[3.3769989,44.9442292],[3.3770218,44.9302879],[3.396031,44.9303036],[3.39612,44.8762713],[3.4148252,44.8762867],[3.4148923,44.8355255],[3.4333371,44.8355408],[3.4333819,44.8082784],[3.4525549,44.8082943],[3.4525774,44.7946344],[3.5089262,44.7946811],[3.508904,44.8081469],[3.604265,44.8082258],[3.6042213,44.8348239],[3.6236136,44.83484],[3.6235695,44.8616583],[3.6424823,44.8616739],[3.642549,44.821102],[3.6610055,44.8211172],[3.6610275,44.8077696],[3.6992999,44.8078013],[3.6992782,44.820994],[3.7361139,44.8210245],[3.7361819,44.7797075],[3.7751058,44.7797397],[3.775151,44.7522344],[3.8118352,44.7522648],[3.8118567,44.7392021],[3.8311822,44.7392181],[3.8312061,44.7246766],[3.887824,44.7247235],[3.8878019,44.7381833],[3.925626,44.7382146],[3.9256039,44.7516682],[3.9454097,44.7516846],[3.9453656,44.7784691],[3.9643737,44.7784848],[3.9643516,44.7919273],[4.0033183,44.7919596],[4.0032964,44.8052575],[4.0216937,44.8052727],[4.0216718,44.8185687],[4.0596515,44.8186001],[4.0596082,44.8449216],[4.0798132,44.8449383],[4.0797928,44.8573502],[4.173882,44.857428],[4.1738604,44.8705468],[4.1932576,44.8705628],[4.193235,44.8842744],[4.2140385,44.8842916],[4.2139961,44.9100242],[4.2324138,44.9100394],[4.2323689,44.9373093],[4.2715486,44.9373416],[4.2715273,44.9502971],[4.3288672,44.9503445],[4.3287793,45.0036659],[4.3489259,45.0036825],[4.3489038,45.0170656],[4.4060793,45.0171127],[4.4059904,45.0710024],[4.3884707,45.0709879],[4.3884482,45.0845976],[4.407943,45.0846137],[4.4079231,45.09663],[4.4843608,45.0966929],[4.4842941,45.1370472],[4.4663631,45.1370324],[4.4663413,45.1502035],[4.4864469,45.15022],[4.4864022,45.1772415],[4.5065524,45.177258],[4.5064402,45.2450058],[4.4881342,45.2449908],[4.4881106,45.2592077],[4.4698588,45.2591927],[4.469836,45.2729835],[4.4508849,45.2729679],[4.4508626,45.2864203],[4.3936753,45.2863733],[4.3936303,45.3135182],[4.3750893,45.3135029],[4.3750662,45.3274054],[4.3950734,45.3274218],[4.3950283,45.3545849],[4.3767871,45.35457],[4.3767639,45.3685486],[4.3576564,45.3685329],[4.3576335,45.3823359],[4.2814576,45.3822734],[4.2814334,45.3968834],[4.2444556,45.3968531],[4.2444325,45.4107893],[4.1481178,45.4107104],[4.1481388,45.3980659],[4.1291913,45.3980504],[4.1292145,45.3840899],[4.0902138,45.3840579],[4.0902351,45.3712093],[4.0135507,45.3711464],[4.0135259,45.3860975],[3.9170932,45.3860185],[3.9170704,45.3997355],[3.9375703,45.3997523],[3.9375481,45.4131142],[3.975277,45.4131451],[3.9752552,45.4262061],[3.9953725,45.4262226],[3.9956999,45.5209568],[3.9777821,45.5209421],[3.977693,45.5743873],[3.9581755,45.5743714],[3.9581522,45.5883658],[3.9396019,45.5883506],[3.9395781,45.6026212],[3.9202279,45.6026054],[3.9202048,45.6164603],[3.8818916,45.616429],[3.8818468,45.643276],[3.8441329,45.6432453],[3.8441098,45.6570896],[3.8261689,45.657075],[3.8261241,45.6838865],[3.8072175,45.6838711],[3.8071277,45.7375802],[3.7882101,45.7375648],[3.7881863,45.7517966],[3.7688482,45.7517809],[3.7688028,45.7789651],[3.750719,45.7789504],[3.7505822,45.8606554],[3.7696692,45.8606709],[3.7695793,45.914333],[3.751661,45.9143185],[3.7516379,45.9280879],[3.7328974,45.9280727],[3.7328527,45.9547155],[3.8101795,45.9547782],[3.8101569,45.9682278],[3.8495994,45.9682598],[3.8495098,46.0216192],[3.8318849,46.0216049],[3.8317936,46.0759058],[3.8505037,46.0759209],[3.8504583,46.1029545],[3.8324727,46.10294],[3.8323353,46.1845598],[3.8142194,46.1845452],[3.8141522,46.2244234],[3.8336864,46.2244392],[3.8336634,46.2381001],[3.8528929,46.2381156],[3.8528703,46.2514729],[3.8931424,46.2515054],[3.8931205,46.2644677],[3.9130562,46.2644838],[3.9130335,46.2779317],[3.9518926,46.2779631],[3.9518709,46.2908227],[3.971523,46.2908386],[3.9715012,46.3036947],[4.0105021,46.3037261],[4.0104784,46.3177638],[4.0298278,46.3177794],[4.029783,46.3442827],[4.0116018,46.344268],[4.0114647,46.4253437],[4.031532,46.4253598],[4.0314635,46.4657978],[4.0132435,46.4657832],[4.0132204,46.479378],[3.9943703,46.4793629],[3.9943461,46.4936113],[3.9745971,46.4935955],[3.9745735,46.5075278],[3.8775423,46.5074499],[3.8774959,46.5347758],[3.8583577,46.5347605],[3.8583347,46.5483156],[3.8186897,46.5482838],[3.8187114,46.5355316],[3.7992386,46.535516],[3.7992156,46.5490706],[3.7610377,46.5490399],[3.7609226,46.6168059],[3.7423295,46.616791],[3.7422834,46.6439624],[3.7228558,46.6439468],[3.7228098,46.6710357],[3.7038706,46.6710206],[3.7038474,46.6846709],[3.6841096,46.6846551],[3.6840631,46.711998],[3.6648359,46.7119826],[3.6647898,46.7390375],[3.6457623,46.7390222],[3.6457158,46.7663375],[3.6257542,46.7663216],[3.6257314,46.7797093],[3.5672301,46.7796626],[3.5672528,46.7663082],[3.5471462,46.7662922],[3.5471922,46.7392824],[3.5271621,46.7392664],[3.5272308,46.6988967],[3.4877399,46.6988651],[3.4877618,46.685943],[3.4679636,46.6859272],[3.4679407,46.6994059],[3.4679179,46.7127907],[3.4486497,46.7127753],[3.4486258,46.7267878],[3.350433,46.7267092],[3.3504786,46.6999004],[3.3303913,46.6998843],[3.3303448,46.7271984],[3.2327174,46.7271203],[3.2327406,46.7135148],[3.2129042,46.7134989],[3.212927,46.7001302],[3.1735446,46.7000987],[3.173498,46.7275094],[3.1541227,46.7274939],[3.1541002,46.7407271],[3.1147772,46.7406957],[3.114754,46.7542756],[3.0753432,46.7542441],[3.0752971,46.7813548],[3.05597,46.7813394],[3.055924,46.8083069],[2.99704,46.8082598],[2.9970166,46.8219593],[2.9379443,46.8219121],[2.9379675,46.8082604],[2.8986634,46.808229],[2.8986872,46.7942392],[2.878991,46.7942234],[2.8790134,46.7810427],[2.8594188,46.781027],[2.8594415,46.7677056],[2.8400446,46.7676901],[2.8400671,46.754466],[2.7414032,46.7543871],[2.741382,46.7668245],[2.7023351,46.7667932],[2.7023571,46.7538869],[2.6826621,46.7538711],[2.6826849,46.7404752],[2.6634875,46.7404599],[2.6635123,46.7258966],[2.6434164,46.7258805],[2.6434382,46.7130938],[2.6241432,46.7130784],[2.6241658,46.6998093],[2.6039699,46.6997931],[2.6039936,46.6858433],[2.5651245,46.6858122],[2.5651469,46.6726126],[2.5459278,46.6725972],[2.5459966,46.6321534],[2.5659222,46.6321694],[2.565946,46.6181104],[2.5456397,46.6180941],[2.5456862,46.5907192],[2.5664225,46.5907358],[2.5664449,46.5775417],[2.5854963,46.577557],[2.5855181,46.5647199],[2.5661318,46.5647044],[2.5661557,46.5506246],[2.468279,46.5505461],[2.4683039,46.5358205],[2.3321246,46.5357112],[2.3321701,46.5088566],[2.3126474,46.5088409],[2.3126703,46.4953444],[2.2928767,46.4953285],[2.2928996,46.4818182],[2.2748687,46.4818037],[2.2749151,46.4544154],[2.2553921,46.4543997],[2.255529,46.3734888],[2.275948,46.3735052],[2.276037,46.3208741],[2.3145615,46.3209052],[2.3145849,46.3070421],[2.3537075,46.3070737],[2.3537313,46.2929669],[2.3938428,46.2929992],[2.3938862,46.2672854],[2.4515727,46.267332],[2.451596,46.2534921],[2.4709353,46.2535077],[2.4709807,46.2265552],[2.4915062,46.2265718],[2.4915521,46.199329],[2.5108806,46.1993446],[2.5109254,46.1727799],[2.5311728,46.1727963],[2.5313772,46.051352],[2.5516349,46.0513684],[2.5516577,46.0377665],[2.5705635,46.0377818],[2.5706774,45.9699434],[2.5514356,45.9699278],[2.551458,45.9566151],[2.5322621,45.9565995],[2.5322849,45.9430066],[2.5130653,45.942991],[2.513134,45.9020279],[2.4749412,45.9019969],[2.4749633,45.8888235],[2.4361947,45.888792],[2.4362172,45.8753288],[2.417209,45.8753133],[2.4172548,45.8479368],[2.3784736,45.8479053],[2.378497,45.8339746],[2.3595157,45.8339592],[2.3595606,45.8070849],[2.3787254,45.8071005],[2.3787481,45.7935783],[2.3986981,45.7935945],[2.3987203,45.7803477],[2.4182486,45.7803636],[2.4183161,45.7400007],[2.4572171,45.7400324],[2.4572394,45.7266956],[2.4758919,45.7267107],[2.4759144,45.7132391],[2.49533,45.7132549],[2.4954204,45.6591268],[2.4576942,45.659096],[2.4577622,45.618343],[2.4391188,45.6183278],[2.4391866,45.5776619],[2.4585044,45.5776777],[2.4585496,45.5505348],[2.4780887,45.5505508],[2.4781108,45.5372464],[2.4975506,45.5372623],[2.4975949,45.5106757],[2.4785536,45.5106601],[2.4786444,45.4561337],[2.4597798,45.4561183],[2.4598701,45.401757],[2.4224876,45.4017264],[2.4224651,45.4152816],[2.4023154,45.4152651],[2.4022929,45.4288193],[2.3256006,45.4287565],[2.3256684,45.3879609],[2.3456182,45.3879773],[2.3456629,45.3611091],[2.326256,45.3610932],[2.326279,45.3472146],[2.3073819,45.3471991],[2.3074045,45.3335972],[2.2881095,45.3335813],[2.2881307,45.3208191],[2.2696332,45.3208039],[2.2696574,45.306212],[2.2506602,45.3061964],[2.2506828,45.2925147],[2.2316866,45.2924992],[2.2317086,45.2792355],[2.2130009,45.2792202],[2.213046,45.2520355],[2.1937387,45.2520197],[2.1937617,45.2381134],[2.1756091,45.2380985],[2.1757423,45.1576822],[2.1573543,45.157667],[2.1574448,45.1029478],[2.1202408,45.1029172],[2.1202629,45.0895468],[2.1006669,45.0895306],[2.1006902,45.0754441],[2.0824591,45.0754291],[2.082548,45.0215961],[2.1025534,45.0216126],[2.1025982,44.994453],[2.0457406,44.9944061],[2.0458508,44.9275321],[2.0657794,44.9275486],[2.0658912,44.8596881],[2.0856964,44.8597044],[2.0857193,44.8458126],[2.1055593,44.8458291],[2.1056029,44.8193264],[2.124743,44.8193422],[2.1247657,44.805512],[2.1435067,44.8055275],[2.143551,44.778597],[2.1256091,44.7785822],[2.1256984,44.7242739],[2.1066459,44.7242581],[2.1067116,44.6842263],[2.1263414,44.6842426],[2.1263635,44.670735],[2.14598,44.6707513],[2.146069,44.6164441],[2.1839622,44.6164756],[2.183983,44.6037819],[2.2404173,44.6038288],[2.2403728,44.6309515],[2.25948,44.6309674],[2.2594571,44.644934],[2.316678,44.6449815],[2.3167011,44.6308801],[2.3361516,44.6308963],[2.3361734,44.6175824],[2.3724238,44.6176125],[2.3724009,44.6315823],[2.4110495,44.6316144],[2.4110701,44.6190741],[2.4492173,44.6191058],[2.4491956,44.6323197],[2.5048575,44.6323659],[2.5048126,44.6597555],[2.5246119,44.6597719],[2.524567,44.6871739],[2.5422544,44.6871886],[2.5422313,44.70122],[2.5807101,44.701252],[2.5805999,44.7683374],[2.61769,44.7683681],[2.6176235,44.808838],[2.6367564,44.8088539],[2.6366899,44.8492948],[2.6733105,44.8493251],[2.6732888,44.8625164],[2.6933766,44.862533],[2.6933323,44.8894303],[2.7305201,44.8894611],[2.7304757,44.9164461],[2.7499202,44.9164622],[2.7500519,44.8364688],[2.8073346,44.8365162],[2.8073139,44.8491017],[2.8263796,44.8491175],[2.8264007,44.8362845],[2.8457039,44.8363004],[2.8457707,44.7957107],[2.8642166,44.795726],[2.8642611,44.7686452],[2.8839885,44.7686615],[2.8840323,44.7419697],[2.9020315,44.7419846],[2.9021426,44.6743192],[2.9219777,44.6743357],[2.9220221,44.6472986],[2.9400972,44.6473136],[2.9401192,44.6338837]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_France/CRAIG","terms_text":"Orthophotographie CRAIG/Sintegra/IGN 2013"},{"id":"CRAIG-Auvergne-2016","name":"Auvergne 2016 25cm CRAIG","type":"tms","template":"http://tiles.craig.fr/ortho/tms/1.0.0/ortho_2016/webmercator/{zoom-1}/{x}/{-y}.jpeg","endDate":"2016-01-01T00:00:00.000Z","startDate":"2016-01-01T00:00:00.000Z","polygon":[[[2.493891,46.6682909],[2.7136176,46.8414109],[3.6474555,46.8075834],[4.0484565,46.4832686],[4.0374701,46.2482538],[4.4604438,46.2596487],[4.4934028,46.1455925],[4.3835395,46.0922853],[4.4549506,45.6908367],[4.7625678,45.5717589],[4.8120063,45.344428],[4.2242377,44.8441895],[3.8616889,44.6959969],[3.3782905,44.8052283],[3.3343451,44.8909082],[3.1805365,44.8247122],[3.0322211,44.6061167],[2.927851,44.6022057],[2.7191108,44.8519786],[2.5103705,44.6022057],[2.125849,44.5826468],[2.0049994,44.9725746],[2.3071235,45.4678399],[2.4334662,45.4408666],[2.4114936,45.7291949],[2.3455756,45.8240183],[2.5488227,45.9797905],[2.4609321,46.2216563],[2.2137397,46.3393472],[2.2782844,46.5390305],[2.5488227,46.5664179],[2.493891,46.6682909]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_France/CRAIG","terms_text":"CRAIG - IGN -TopoGEODIS - Feder Auvergne-Rhône-Alpes 2016"},{"id":"BANO","name":"BANO","type":"tms","template":"http://{switch:a,b,c}.layers.openstreetmap.fr/bano/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.358164,51.32937],[2.548804,51.09759],[2.570482,51.07409],[2.587412,51.01763],[2.598448,51.0051],[2.615575,50.99749],[2.639859,50.95766],[2.642247,50.94578],[2.624519,50.9256],[2.61962,50.91067],[2.623964,50.86071],[2.627811,50.85054],[2.637859,50.83696],[2.651102,50.82906],[2.732666,50.81738],[2.79995,50.73795],[2.816552,50.73092],[2.852648,50.73335],[2.890719,50.7162],[2.904925,50.71536],[2.916096,50.72418],[2.935084,50.75592],[3.007184,50.78377],[3.082183,50.78749],[3.092439,50.79092],[3.114119,50.80566],[3.148768,50.80195],[3.215401,50.73111],[3.221487,50.7267],[3.270507,50.70375],[3.275448,50.67757],[3.265761,50.6604],[3.265877,50.64054],[3.289219,50.60028],[3.292195,50.55037],[3.305598,50.53267],[3.375514,50.50839],[3.389804,50.50884],[3.474798,50.54445],[3.52173,50.53459],[3.532662,50.51873],[3.547788,50.51012],[3.615234,50.50558],[3.673778,50.45642],[3.684152,50.35277],[3.690097,50.34044],[3.702583,50.33482],[3.715758,50.33854],[3.749349,50.36279],[3.841089,50.36558],[3.901887,50.3436],[3.913173,50.34291],[4.026717,50.36904],[4.13761,50.29984],[4.143881,50.29727],[4.214438,50.28167],[4.229037,50.26664],[4.230782,50.25233],[4.170843,50.18579],[4.166015,50.16888],[4.176401,50.1547],[4.211948,50.13602],[4.240742,50.07102],[4.231934,50.05551],[4.181645,50.03436],[4.17177,50.02537],[4.169755,50.01217],[4.176498,50.00065],[4.206331,49.97546],[4.221639,49.97089],[4.308774,49.98145],[4.445423,49.9523],[4.454691,49.95251],[4.658098,50.00609],[4.669358,50.01392],[4.672929,50.02716],[4.66924,50.06972],[4.695168,50.10472],[4.831227,50.17941],[4.881497,50.16436],[4.904786,50.14451],[4.904264,50.12639],[4.880762,50.0815],[4.862772,50.0745],[4.851037,50.06216],[4.843307,50.03884],[4.843307,50.03883],[4.843295,50.03881],[4.826781,49.989],[4.826618,49.97692],[4.833433,49.96696],[4.896542,49.91753],[4.897546,49.89424],[4.879134,49.86942],[4.876249,49.85111],[4.889238,49.81266],[4.897691,49.80204],[4.910979,49.79926],[4.995343,49.81116],[5.01867,49.79272],[5.026862,49.78886],[5.099438,49.77323],[5.134584,49.73462],[5.141201,49.72984],[5.187609,49.70906],[5.196025,49.70732],[5.281572,49.70836],[5.333628,49.67308],[5.343996,49.65049],[5.354398,49.64041],[5.431412,49.60791],[5.482051,49.52815],[5.492943,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.607602,49.53761],[5.640997,49.56095],[5.706759,49.55267],[5.715782,49.55361],[5.775261,49.57414],[5.839902,49.55321],[5.861263,49.52038],[5.875997,49.5114],[5.975162,49.50129],[5.998015,49.47317],[6.016266,49.46597],[6.08635,49.47562],[6.093186,49.47787],[6.173966,49.52187],[6.246435,49.52511],[6.333999,49.48235],[6.344229,49.48037],[6.435145,49.487],[6.5451,49.44384],[6.606389,49.37868],[6.604972,49.33739],[6.616267,49.31869],[6.670133,49.29269],[6.729955,49.22917],[6.743276,49.19086],[6.760259,49.17752],[6.809042,49.17284],[6.824733,49.17826],[6.830928,49.19366],[6.829819,49.21802],[6.851186,49.23136],[6.884528,49.2239],[6.893221,49.22389],[6.937527,49.23369],[7.040549,49.19794],[7.046296,49.17503],[7.054777,49.16313],[7.069081,49.16018],[7.104945,49.16634],[7.143153,49.14159],[7.153499,49.13839],[7.286827,49.13488],[7.29893,49.13856],[7.360948,49.18259],[7.450116,49.19517],[7.50113,49.17672],[7.543788,49.10572],[7.557903,49.09626],[7.629604,49.08527],[7.647217,49.06722],[7.661197,49.06119],[7.754008,49.05963],[7.760731,49.06067],[7.802913,49.07489],[7.855253,49.05329],[7.867297,49.05227],[7.93826,49.06832],[8.080685,49.00688],[8.222498,48.98787],[8.23704,48.97683],[8.235894,48.95817],[8.208878,48.94863],[8.200888,48.94339],[8.158243,48.89753],[8.100873,48.7993],[7.990709,48.74478],[7.985341,48.7409],[7.904217,48.65865],[7.856051,48.63606],[7.848405,48.62977],[7.818424,48.58883],[7.81456,48.57704],[7.814491,48.50968],[7.785465,48.48337],[7.780554,48.47652],[7.745059,48.39484],[7.743573,48.38427],[7.751593,48.32322],[7.71085,48.29841],[7.702411,48.28803],[7.676613,48.21555],[7.596051,48.11698],[7.591652,48.10648],[7.585216,48.04694],[7.591268,48.03035],[7.624373,47.99865],[7.632049,47.97081],[7.575545,47.87436],[7.572802,47.86435],[7.572673,47.83631],[7.545808,47.78793],[7.544185,47.77232],[7.557581,47.72899],[7.535257,47.6989],[7.531364,47.68564],[7.536998,47.67302],[7.600164,47.60822],[7.589675,47.56755],[7.554237,47.55128],[7.54511,47.54283],[7.512557,47.48439],[7.387471,47.42111],[7.326527,47.4273],[7.244354,47.40939],[7.167083,47.4335],[7.152115,47.47612],[7.14279,47.48707],[7.128529,47.48893],[7.080105,47.47718],[7.035575,47.48695],[7.021019,47.48458],[7.012048,47.47287],[7.002995,47.44095],[6.955099,47.40808],[6.947157,47.39698],[6.94818,47.38337],[6.957691,47.37359],[6.971263,47.37218],[7.018004,47.38386],[7.05623,47.37035],[7.070073,47.35005],[7.05958,47.32257],[6.974243,47.27856],[6.963469,47.26233],[6.961339,47.23479],[6.89443,47.19393],[6.889128,47.18922],[6.855453,47.14636],[6.769073,47.10751],[6.760108,47.09953],[6.725613,47.0418],[6.623551,46.9811],[6.481204,46.9445],[6.46892,46.93522],[6.466862,46.91997],[6.475476,46.88771],[6.453496,46.8239],[6.45644,46.80534],[6.467224,46.79104],[6.460984,46.76887],[6.15817,46.59343],[6.148724,46.58069],[6.15152,46.56508],[6.165489,46.54399],[6.158111,46.52456],[6.101739,46.46979],[6.095717,46.45418],[6.097044,46.43317],[6.108289,46.41643],[6.166216,46.38839],[6.178173,46.36922],[6.137482,46.31297],[6.133713,46.30227],[6.130383,46.23737],[6.110298,46.22344],[6.088648,46.23081],[6.077173,46.23123],[6.018573,46.21601],[6.006813,46.20752],[6.003882,46.19332],[6.007866,46.16977],[6.017834,46.15564],[6.03509,46.15456],[6.055639,46.16288],[6.124683,46.15415],[6.137776,46.15702],[6.240258,46.22094],[6.249058,46.23299],[6.247073,46.24777],[6.21148,46.31057],[6.212186,46.32485],[6.239462,46.36705],[6.316478,46.41557],[6.410826,46.42495],[6.417483,46.42682],[6.504978,46.46871],[6.630473,46.47435],[6.746646,46.45695],[6.822442,46.42925],[6.818324,46.38181],[6.804843,46.36179],[6.801885,46.34639],[6.810949,46.33359],[6.864911,46.30038],[6.875036,46.28007],[6.860917,46.2439],[6.826978,46.21188],[6.820746,46.19862],[6.818627,46.16592],[6.822593,46.15261],[6.834266,46.14509],[6.903819,46.12971],[6.904911,46.09595],[6.909323,46.08406],[6.920006,46.07721],[6.948976,46.0699],[7.015561,46.00883],[7.051911,45.93066],[7.045335,45.92217],[7.044967,45.92064],[7.043936,45.92036],[6.995822,45.85822],[6.940965,45.83551],[6.843757,45.82387],[6.831016,45.81711],[6.826141,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.841405,45.71373],[6.907294,45.69124],[6.92419,45.66935],[6.942468,45.66172],[6.971313,45.66528],[7.00597,45.64945],[7.011511,45.63652],[6.997797,45.60877],[6.996431,45.59465],[7.015803,45.52354],[7.027743,45.5102],[7.107198,45.47877],[7.122797,45.44924],[7.13304,45.44001],[7.185604,45.41894],[7.19515,45.40409],[7.170749,45.35069],[7.142319,45.32298],[7.136488,45.30576],[7.14458,45.25048],[7.084166,45.20279],[6.992792,45.19823],[6.981064,45.19368],[6.900091,45.12689],[6.85843,45.11699],[6.782826,45.14228],[6.770557,45.14242],[6.677507,45.11356],[6.665295,45.10289],[6.665008,45.08667],[6.68237,45.04558],[6.696016,45.03395],[6.757442,45.01884],[6.783751,44.9146],[6.794195,44.90161],[6.866981,44.86519],[6.879801,44.86346],[6.936325,44.87461],[7.017954,44.84402],[7.034535,44.82282],[7.037114,44.75009],[7.049604,44.73226],[7.072236,44.72311],[7.086508,44.6968],[7.086656,44.68085],[7.07671,44.67134],[6.990071,44.67203],[6.974128,44.66431],[6.970564,44.64696],[6.978189,44.61784],[6.94659,44.57124],[6.882347,44.53479],[6.872327,44.5195],[6.878925,44.50245],[6.958945,44.43129],[6.958723,44.42908],[6.921668,44.41436],[6.912225,44.40659],[6.909075,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.999091,44.29414],[7.011806,44.256],[7.019835,44.24558],[7.032595,44.2424],[7.073117,44.2461],[7.165097,44.22112],[7.245331,44.18544],[7.260526,44.16682],[7.275371,44.15947],[7.338779,44.1574],[7.362775,44.13834],[7.377763,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.564785,44.15817],[7.605476,44.1634],[7.616198,44.16827],[7.639891,44.18928],[7.686079,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.694448,44.12276],[7.727862,44.08615],[7.724032,44.05704],[7.686028,44.02371],[7.680769,44.0164],[7.660161,43.9672],[7.596244,43.94466],[7.584187,43.93287],[7.568576,43.89159],[7.527096,43.87434],[7.516489,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.369681,41.35052],[9.273114,41.29196],[8.941857,41.27688],[5.8,41.64],[3.173576,42.41768],[3.160814,42.42757],[3.094399,42.41457],[3.034016,42.45331],[3.022142,42.45645],[2.878221,42.4487],[2.870188,42.44653],[2.784238,42.40256],[2.741304,42.41128],[2.729276,42.40998],[2.693308,42.39417],[2.683779,42.3854],[2.681621,42.37263],[2.685852,42.34679],[2.66719,42.33008],[2.581057,42.34418],[2.567769,42.34173],[2.533803,42.32197],[2.477948,42.32986],[2.419327,42.37658],[2.41222,42.38021],[2.267193,42.42055],[2.259731,42.42117],[2.206944,42.41558],[2.206525,42.41526],[2.205257,42.41541],[2.160278,42.41065],[2.148808,42.40545],[2.093931,42.35474],[2.008614,42.33818],[1.964998,42.36473],[1.930762,42.42442],[1.920889,42.43302],[1.884665,42.44761],[1.884588,42.44762],[1.884444,42.4477],[1.827736,42.47056],[1.725668,42.48452],[1.715606,42.50125],[1.727195,42.56103],[1.724794,42.57499],[1.710109,42.59992],[1.69377,42.60975],[1.602827,42.61382],[1.560687,42.6392],[1.546365,42.64166],[1.504443,42.6331],[1.492096,42.62502],[1.472384,42.59703],[1.437922,42.59264],[1.419356,42.60643],[1.38032,42.67415],[1.373353,42.68127],[1.333134,42.70563],[1.323642,42.7085],[1.232212,42.71248],[1.165543,42.69928],[1.085465,42.76635],[1.075637,42.77079],[0.9593748,42.78852],[0.9507323,42.78794],[0.9226515,42.7797],[0.8460624,42.8157],[0.7151135,42.8464],[0.7001699,42.84402],[0.6911674,42.83186],[0.6740937,42.76479],[0.6747382,42.75286],[0.6919171,42.70684],[0.6689955,42.67901],[0.4302428,42.67863],[0.3715037,42.70308],[0.3595376,42.70415],[0.3491168,42.69817],[0.3256688,42.67274],[0.2957095,42.66388],[0.2459353,42.70175],[0.2397249,42.70494],[0.189669,42.72039],[0.1791886,42.72075],[-0.01993262,42.67389],[-0.06725834,42.6848],[-0.1694885,42.77157],[-0.2998662,42.82697],[-0.3168349,42.82635],[-0.3920752,42.78766],[-0.4435404,42.78453],[-0.488418,42.80255],[-0.508683,42.79935],[-0.5449894,42.76906],[-0.5672068,42.76937],[-0.6744552,42.86392],[-0.6809365,42.86775],[-0.7337233,42.88666],[-0.747598,42.93879],[-0.757105,42.95107],[-0.7725328,42.95284],[-0.8211401,42.93865],[-0.9450847,42.94192],[-1.023131,42.98206],[-1.108517,43.00409],[-1.115597,43.00461],[-1.147753,43.00124],[-1.158452,43.01452],[-1.167362,43.02083],[-1.216216,43.0381],[-1.226121,43.03898],[-1.262362,43.03303],[-1.306428,43.05531],[-1.319918,43.05696],[-1.331346,43.0496],[-1.354196,43.0197],[-1.438684,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.476407,43.10248],[-1.434786,43.13087],[-1.427318,43.1404],[-1.394112,43.22935],[-1.395313,43.24596],[-1.408677,43.25591],[-1.526287,43.28099],[-1.546257,43.2737],[-1.571485,43.2412],[-1.610526,43.24223],[-1.650003,43.29323],[-1.669527,43.30065],[-1.733594,43.28856],[-1.756061,43.31966],[-1.762973,43.32565],[-1.791557,43.34067],[-1.800991,43.37017],[-1.785091,43.39037],[-1.783502,43.39686],[-2.7,43.9]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_France/WikiProject_Base_Adresses_Nationale_Ouverte_(BANO)","terms_text":"Tiles © cquest@Openstreetmap France, data © OpenStreetMap contributors, ODBL","description":"French address registry or Base Adresses Nationale Ouverte","overlay":true},{"id":"lu.geoportail.opendata.basemap","name":"Basemap geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/basemap/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png","endDate":"2010-07-20T00:00:00.000Z","startDate":"2013-07-19T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/carte-de-base-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"basemap.at","name":"basemap.at","type":"tms","template":"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/geolandbasemap/normal/google3857/{zoom}/{y}/{x}.png","scaleExtent":[0,19],"polygon":[[[16.5073284,46.9929304],[16.283417,46.9929304],[16.135839,46.8713046],[15.9831722,46.8190947],[16.0493278,46.655175],[15.8610387,46.7180116],[15.7592608,46.6900933],[15.5607938,46.6796202],[15.5760605,46.6342132],[15.4793715,46.6027553],[15.4335715,46.6516819],[15.2249267,46.6342132],[15.0468154,46.6481886],[14.9908376,46.5887681],[14.9603042,46.6237293],[14.8534374,46.6027553],[14.8330818,46.5012666],[14.7516595,46.4977636],[14.6804149,46.4381781],[14.6142593,46.4381781],[14.578637,46.3785275],[14.4412369,46.4311638],[14.1613476,46.4276563],[14.1257253,46.4767409],[14.0188585,46.4767409],[13.9119917,46.5257813],[13.8254805,46.5047694],[13.4438134,46.560783],[13.3064132,46.5502848],[13.1283019,46.5887681],[12.8433237,46.6132433],[12.7262791,46.6412014],[12.5125455,46.6656529],[12.3598787,46.7040543],[12.3649676,46.7703197],[12.2886341,46.7772902],[12.2733674,46.8852187],[12.2072118,46.8747835],[12.1308784,46.9026062],[12.1156117,46.9998721],[12.2530119,47.0657733],[12.2123007,47.0934969],[11.9833004,47.0449712],[11.7339445,46.9616816],[11.6321666,47.010283],[11.5405665,46.9755722],[11.4998553,47.0068129],[11.418433,46.9651546],[11.2555884,46.9755722],[11.1130993,46.913036],[11.0418548,46.7633482],[10.8891879,46.7598621],[10.7416099,46.7842599],[10.7059877,46.8643462],[10.5787653,46.8399847],[10.4566318,46.8504267],[10.4769874,46.9269392],[10.3853873,46.9894592],[10.2327204,46.8643462],[10.1207647,46.8330223],[9.8663199,46.9408389],[9.9019422,47.0033426],[9.6831197,47.0588402],[9.6118752,47.0380354],[9.6322307,47.128131],[9.5813418,47.1662025],[9.5406306,47.2664422],[9.6067863,47.3492559],[9.6729419,47.369939],[9.6424085,47.4457079],[9.5660751,47.4801122],[9.7136531,47.5282405],[9.7848976,47.5969187],[9.8357866,47.5454185],[9.9477423,47.538548],[10.0902313,47.4491493],[10.1105869,47.3664924],[10.2428982,47.3871688],[10.1869203,47.2698953],[10.3243205,47.2975125],[10.4820763,47.4491493],[10.4311873,47.4869904],[10.4413651,47.5900549],[10.4871652,47.5522881],[10.5482319,47.5351124],[10.5991209,47.5660246],[10.7568766,47.5316766],[10.8891879,47.5454185],[10.9400769,47.4869904],[10.9960547,47.3906141],[11.2352328,47.4422662],[11.2810328,47.3975039],[11.4235219,47.5144941],[11.5761888,47.5076195],[11.6067221,47.5900549],[11.8357224,47.5866227],[12.003656,47.6243647],[12.2072118,47.6037815],[12.1614117,47.6963421],[12.2581008,47.7442718],[12.2530119,47.6792136],[12.4311232,47.7100408],[12.4921899,47.631224],[12.5685234,47.6277944],[12.6295901,47.6894913],[12.7720792,47.6689338],[12.8331459,47.5419833],[12.975635,47.4732332],[13.0417906,47.4938677],[13.0367017,47.5557226],[13.0977685,47.6415112],[13.0316128,47.7100408],[12.9043905,47.7203125],[13.0061684,47.84683],[12.9451016,47.9355501],[12.8636793,47.9594103],[12.8636793,48.0036929],[12.7517236,48.0989418],[12.8738571,48.2109733],[12.9603683,48.2109733],[13.0417906,48.2652035],[13.1842797,48.2990682],[13.2606131,48.2922971],[13.3980133,48.3565867],[13.4438134,48.417418],[13.4387245,48.5523383],[13.509969,48.5860123],[13.6117469,48.5725454],[13.7287915,48.5118999],[13.7847694,48.5725454],[13.8203916,48.6263915],[13.7949471,48.7171267],[13.850925,48.7741724],[14.0595697,48.6633774],[14.0137696,48.6331182],[14.0748364,48.5927444],[14.2173255,48.5961101],[14.3649034,48.5489696],[14.4666813,48.6499311],[14.5582815,48.5961101],[14.5989926,48.6263915],[14.7211261,48.5759124],[14.7211261,48.6868997],[14.822904,48.7271983],[14.8178151,48.777526],[14.9647227,48.7851754],[14.9893637,49.0126611],[15.1485933,48.9950306],[15.1943934,48.9315502],[15.3063491,48.9850128],[15.3928603,48.9850128],[15.4844604,48.9282069],[15.749083,48.8545973],[15.8406831,48.8880697],[16.0086166,48.7808794],[16.2070835,48.7339115],[16.3953727,48.7372678],[16.4920617,48.8110498],[16.6905286,48.7741724],[16.7057953,48.7339115],[16.8991733,48.713769],[16.9755067,48.515271],[16.8482844,48.4511817],[16.8533733,48.3464411],[16.9551512,48.2516513],[16.9907734,48.1498955],[17.0925513,48.1397088],[17.0823736,48.0241182],[17.1739737,48.0207146],[17.0823736,47.8741447],[16.9856845,47.8673174],[17.0823736,47.8092489],[17.0925513,47.7031919],[16.7414176,47.6792136],[16.7057953,47.7511153],[16.5378617,47.7545368],[16.5480395,47.7066164],[16.4208172,47.6689338],[16.573484,47.6175045],[16.670173,47.631224],[16.7108842,47.538548],[16.6599952,47.4491493],[16.5429506,47.3940591],[16.4615283,47.3940591],[16.4920617,47.276801],[16.425906,47.1973317],[16.4717061,47.1489007],[16.5480395,47.1489007],[16.476795,47.0796369],[16.527684,47.0588402],[16.5073284,46.9929304]]],"terms_url":"http://basemap.at/","terms_text":"basemap.at","description":"Basemap of Austria, based on goverment data.","icon":"https://www.basemap.at/images/logo_basemap.jpg"},{"id":"basemap.at-orthofoto","name":"basemap.at Orthofoto","type":"tms","template":"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmaporthofoto30cm/normal/google3857/{zoom}/{y}/{x}.jpeg","scaleExtent":[0,19],"polygon":[[[16.5073284,46.9929304],[16.283417,46.9929304],[16.135839,46.8713046],[15.9831722,46.8190947],[16.0493278,46.655175],[15.8610387,46.7180116],[15.7592608,46.6900933],[15.5607938,46.6796202],[15.5760605,46.6342132],[15.4793715,46.6027553],[15.4335715,46.6516819],[15.2249267,46.6342132],[15.0468154,46.6481886],[14.9908376,46.5887681],[14.9603042,46.6237293],[14.8534374,46.6027553],[14.8330818,46.5012666],[14.7516595,46.4977636],[14.6804149,46.4381781],[14.6142593,46.4381781],[14.578637,46.3785275],[14.4412369,46.4311638],[14.1613476,46.4276563],[14.1257253,46.4767409],[14.0188585,46.4767409],[13.9119917,46.5257813],[13.8254805,46.5047694],[13.4438134,46.560783],[13.3064132,46.5502848],[13.1283019,46.5887681],[12.8433237,46.6132433],[12.7262791,46.6412014],[12.5125455,46.6656529],[12.3598787,46.7040543],[12.3649676,46.7703197],[12.2886341,46.7772902],[12.2733674,46.8852187],[12.2072118,46.8747835],[12.1308784,46.9026062],[12.1156117,46.9998721],[12.2530119,47.0657733],[12.2123007,47.0934969],[11.9833004,47.0449712],[11.7339445,46.9616816],[11.6321666,47.010283],[11.5405665,46.9755722],[11.4998553,47.0068129],[11.418433,46.9651546],[11.2555884,46.9755722],[11.1130993,46.913036],[11.0418548,46.7633482],[10.8891879,46.7598621],[10.7416099,46.7842599],[10.7059877,46.8643462],[10.5787653,46.8399847],[10.4566318,46.8504267],[10.4769874,46.9269392],[10.3853873,46.9894592],[10.2327204,46.8643462],[10.1207647,46.8330223],[9.8663199,46.9408389],[9.9019422,47.0033426],[9.6831197,47.0588402],[9.6118752,47.0380354],[9.6322307,47.128131],[9.5813418,47.1662025],[9.5406306,47.2664422],[9.6067863,47.3492559],[9.6729419,47.369939],[9.6424085,47.4457079],[9.5660751,47.4801122],[9.7136531,47.5282405],[9.7848976,47.5969187],[9.8357866,47.5454185],[9.9477423,47.538548],[10.0902313,47.4491493],[10.1105869,47.3664924],[10.2428982,47.3871688],[10.1869203,47.2698953],[10.3243205,47.2975125],[10.4820763,47.4491493],[10.4311873,47.4869904],[10.4413651,47.5900549],[10.4871652,47.5522881],[10.5482319,47.5351124],[10.5991209,47.5660246],[10.7568766,47.5316766],[10.8891879,47.5454185],[10.9400769,47.4869904],[10.9960547,47.3906141],[11.2352328,47.4422662],[11.2810328,47.3975039],[11.4235219,47.5144941],[11.5761888,47.5076195],[11.6067221,47.5900549],[11.8357224,47.5866227],[12.003656,47.6243647],[12.2072118,47.6037815],[12.1614117,47.6963421],[12.2581008,47.7442718],[12.2530119,47.6792136],[12.4311232,47.7100408],[12.4921899,47.631224],[12.5685234,47.6277944],[12.6295901,47.6894913],[12.7720792,47.6689338],[12.8331459,47.5419833],[12.975635,47.4732332],[13.0417906,47.4938677],[13.0367017,47.5557226],[13.0977685,47.6415112],[13.0316128,47.7100408],[12.9043905,47.7203125],[13.0061684,47.84683],[12.9451016,47.9355501],[12.8636793,47.9594103],[12.8636793,48.0036929],[12.7517236,48.0989418],[12.8738571,48.2109733],[12.9603683,48.2109733],[13.0417906,48.2652035],[13.1842797,48.2990682],[13.2606131,48.2922971],[13.3980133,48.3565867],[13.4438134,48.417418],[13.4387245,48.5523383],[13.509969,48.5860123],[13.6117469,48.5725454],[13.7287915,48.5118999],[13.7847694,48.5725454],[13.8203916,48.6263915],[13.7949471,48.7171267],[13.850925,48.7741724],[14.0595697,48.6633774],[14.0137696,48.6331182],[14.0748364,48.5927444],[14.2173255,48.5961101],[14.3649034,48.5489696],[14.4666813,48.6499311],[14.5582815,48.5961101],[14.5989926,48.6263915],[14.7211261,48.5759124],[14.7211261,48.6868997],[14.822904,48.7271983],[14.8178151,48.777526],[14.9647227,48.7851754],[14.9893637,49.0126611],[15.1485933,48.9950306],[15.1943934,48.9315502],[15.3063491,48.9850128],[15.3928603,48.9850128],[15.4844604,48.9282069],[15.749083,48.8545973],[15.8406831,48.8880697],[16.0086166,48.7808794],[16.2070835,48.7339115],[16.3953727,48.7372678],[16.4920617,48.8110498],[16.6905286,48.7741724],[16.7057953,48.7339115],[16.8991733,48.713769],[16.9755067,48.515271],[16.8482844,48.4511817],[16.8533733,48.3464411],[16.9551512,48.2516513],[16.9907734,48.1498955],[17.0925513,48.1397088],[17.0823736,48.0241182],[17.1739737,48.0207146],[17.0823736,47.8741447],[16.9856845,47.8673174],[17.0823736,47.8092489],[17.0925513,47.7031919],[16.7414176,47.6792136],[16.7057953,47.7511153],[16.5378617,47.7545368],[16.5480395,47.7066164],[16.4208172,47.6689338],[16.573484,47.6175045],[16.670173,47.631224],[16.7108842,47.538548],[16.6599952,47.4491493],[16.5429506,47.3940591],[16.4615283,47.3940591],[16.4920617,47.276801],[16.425906,47.1973317],[16.4717061,47.1489007],[16.5480395,47.1489007],[16.476795,47.0796369],[16.527684,47.0588402],[16.5073284,46.9929304]]],"terms_url":"http://basemap.at/","terms_text":"basemap.at","best":true,"description":"Orthofoto layer provided by basemap.at. \"Successor\" of geoimage.at imagery.","icon":"https://www.basemap.at/images/logo_basemap.jpg"},{"id":"bavaria-2m","name":"Bavaria (2 m)","type":"wms","template":"http://geodaten.bayern.de/ogc/ogc_dop200_oa.cgi?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=adv_dop200c&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:4326","scaleExtent":[8,18],"polygon":[[[10.1235886,50.568462],[10.1428576,50.5507804],[10.2028056,50.5574195],[10.2520485,50.5179575],[10.3269835,50.4934473],[10.4104825,50.4184762],[10.6031724,50.3310874],[10.6224414,50.2271041],[10.7252093,50.2106649],[10.7294913,50.2476451],[10.8515282,50.2435376],[10.7187863,50.3201525],[10.7123633,50.3652428],[10.8558102,50.3966441],[10.9371682,50.3966441],[10.9906932,50.3666085],[11.1277171,50.3666085],[11.1791011,50.3133169],[11.1619731,50.294172],[11.24119,50.2928042],[11.249754,50.3734364],[11.24119,50.479825],[11.358945,50.5234025],[11.4381619,50.5097889],[11.4424439,50.4893611],[11.425316,50.4771001],[11.425316,50.4416618],[11.4895459,50.4225686],[11.4916869,50.3980089],[11.5195199,50.3980089],[11.5259429,50.3761673],[11.5987369,50.4034677],[11.6372748,50.3884544],[11.7935678,50.4212045],[11.8363877,50.3925494],[11.9220277,50.4280246],[11.9862577,50.3870894],[11.9841167,50.3570478],[12.0483466,50.3310874],[12.0933076,50.3297207],[12.1297046,50.2982751],[12.1404096,50.2722826],[12.1061536,50.255859],[12.1125766,50.2353216],[12.1489736,50.236691],[12.1982166,50.2010728],[12.2239086,50.1640565],[12.2046396,50.1434795],[12.2067806,50.1077916],[12.2431775,50.0995522],[12.2774335,50.0720772],[12.4936744,49.985428],[12.4979564,49.9413559],[12.5557634,49.9220616],[12.5493404,49.8682726],[12.4808284,49.7881677],[12.4101755,49.7577484],[12.4615594,49.7065456],[12.5471994,49.6802313],[12.5878784,49.552613],[12.6542493,49.534553],[12.6628133,49.4330153],[12.7527353,49.4107323],[12.7976963,49.3466124],[12.9047462,49.3563752],[12.9968092,49.3368477],[13.0546161,49.2754251],[13.1316921,49.2195199],[13.1916401,49.1439475],[13.236601,49.1215335],[13.296549,49.1229347],[13.371484,49.0808823],[13.414304,49.0289687],[13.414304,48.9798112],[13.5791609,48.9699739],[13.6348268,48.9432629],[13.6776468,48.8869823],[13.7375948,48.8926132],[13.7846968,48.8334571],[13.8403627,48.774231],[13.8168118,48.7064584],[13.8446447,48.7008065],[13.8425037,48.6003807],[13.7654278,48.5422972],[13.7525818,48.5040106],[13.6712238,48.5054291],[13.6433908,48.5437146],[13.4571239,48.5508013],[13.4571239,48.4159838],[13.40574,48.3605338],[13.283703,48.2751083],[13.0931541,48.2694081],[12.9582712,48.1909669],[12.8769132,48.1852574],[12.7720043,48.0938188],[12.8640672,48.0136764],[12.8983232,47.9549216],[12.9454252,47.9563555],[12.9968092,47.8846147],[13.0139372,47.834337],[12.9347202,47.7321953],[13.0588981,47.7249947],[13.1188461,47.6385093],[13.0653211,47.5692178],[13.0567571,47.473792],[13.0032322,47.4520801],[12.7677223,47.5504355],[12.7698633,47.6327385],[12.7398893,47.6731207],[12.6670953,47.6702373],[12.5750324,47.621195],[12.4808284,47.6197519],[12.4144575,47.6702373],[12.2431775,47.6774455],[12.2132036,47.6918589],[12.1917936,47.6817699],[12.2132036,47.6659119],[12.2110626,47.603875],[12.1746656,47.5952129],[12.1382686,47.603875],[11.8920537,47.603875],[11.8513747,47.5793285],[11.6394158,47.5822169],[11.5944549,47.5489905],[11.5901729,47.5128508],[11.5173789,47.498388],[11.4403029,47.5041736],[11.395342,47.4752392],[11.427457,47.4448409],[11.346099,47.4433929],[11.279728,47.3955873],[11.2133571,47.3883402],[11.247613,47.4318076],[11.1020251,47.3926886],[10.9650012,47.3897897],[10.9778472,47.4361524],[10.9178992,47.4752392],[10.8707972,47.4752392],[10.8558102,47.4940484],[10.9007712,47.5142969],[10.8729382,47.5359831],[10.8108493,47.5128508],[10.6438513,47.5489905],[10.5946084,47.5547705],[10.5796214,47.5287553],[10.4618664,47.5403192],[10.4661484,47.4839212],[10.4875584,47.4781333],[10.4875584,47.4129762],[10.4597254,47.4028333],[10.4597254,47.375293],[10.4104825,47.3738431],[10.4083415,47.3433862],[10.3205605,47.2867768],[10.2820225,47.2780622],[10.2841635,47.2620819],[10.1471396,47.2620819],[10.1921006,47.3027497],[10.1942416,47.3738431],[10.1664086,47.3738431],[10.1664086,47.3462876],[10.1000376,47.3433862],[10.0614996,47.3636928],[10.0679226,47.4187712],[10.0936146,47.426014],[10.0957556,47.4419449],[9.9780007,47.485368],[9.9565907,47.5273097],[9.8945017,47.5287553],[9.8559637,47.5085124],[9.8174258,47.544655],[9.8217078,47.5764399],[9.7746058,47.5822169],[9.7382088,47.525864],[9.6739788,47.5345376],[9.5840569,47.564884],[9.6397228,47.6053186],[9.7167988,47.603875],[9.8559637,47.6760039],[9.9780007,47.6558179],[10.0293846,47.6817699],[10.1000376,47.6673537],[10.1321526,47.6760039],[10.1428576,47.7019459],[10.0614996,47.7725005],[10.1128836,47.8098988],[10.0829096,47.8530173],[10.1086016,47.9090177],[10.0764866,47.9649577],[10.1300116,48.020837],[10.1342936,48.1066872],[10.1000376,48.1281274],[10.0550766,48.2622821],[9.9694367,48.3676462],[10.0315256,48.4259299],[10.0293846,48.461436],[10.1235886,48.4770509],[10.1535626,48.4514968],[10.2349205,48.5125212],[10.3162785,48.516776],[10.2991505,48.6187835],[10.2456255,48.6682961],[10.2734585,48.7064584],[10.3698035,48.6838472],[10.4318924,48.6993935],[10.4511614,48.7276471],[10.4019185,48.7460035],[10.4404564,48.8489571],[10.4340334,48.9587289],[10.3376885,49.0205451],[10.2499075,49.0359872],[10.2499075,49.0738701],[10.2006646,49.1033147],[10.2520485,49.1327418],[10.1235886,49.1971401],[10.1193066,49.2628519],[10.1514216,49.2893915],[10.1043196,49.3452175],[10.1407166,49.3940134],[10.1086016,49.445545],[10.1107426,49.5053651],[10.0722046,49.5331635],[10.0165387,49.4761598],[9.9266167,49.478942],[9.9244757,49.5567797],[9.8987837,49.5817727],[9.8559637,49.5387213],[9.8067208,49.5567797],[9.8666687,49.6067529],[9.8538227,49.6441991],[9.8174258,49.6608327],[9.8345537,49.6899277],[9.7960158,49.7203895],[9.7574778,49.7079302],[9.7403498,49.6857723],[9.7060938,49.7162368],[9.6782608,49.7162368],[9.6825428,49.6885426],[9.6204539,49.6913127],[9.6461458,49.78955],[9.5583649,49.7743431],[9.5712109,49.7356133],[9.5069809,49.7522156],[9.4919939,49.7798735],[9.4684429,49.7605146],[9.425623,49.7784909],[9.404213,49.7646636],[9.33356,49.770195],[9.329278,49.7342295],[9.408495,49.725926],[9.427764,49.6982374],[9.414918,49.6441991],[9.380662,49.6386533],[9.359252,49.6497443],[9.339983,49.6372668],[9.31215,49.648358],[9.277894,49.626173],[9.284317,49.6081403],[9.241497,49.5748315],[9.0980501,49.5720547],[9.0659351,49.6081403],[9.1001911,49.6511305],[9.0916271,49.6926978],[9.1301651,49.7120837],[9.1387291,49.7425316],[9.1087551,49.7563653],[9.1365881,49.7909322],[9.1001911,49.78955],[9.0723581,49.8282367],[9.0359611,49.8351418],[9.0166922,50.0267091],[8.9631672,50.0308352],[8.9567442,50.0597083],[9.0017052,50.0707031],[9.0209742,50.1105378],[9.1216011,50.1228936],[9.1558571,50.1132838],[9.1965361,50.1187753],[9.1858311,50.1352462],[9.235074,50.1475956],[9.37638,50.1270115],[9.408495,50.0816953],[9.5219679,50.095432],[9.5048399,50.1421073],[9.5326729,50.1640565],[9.4898529,50.1695422],[9.4941349,50.2435376],[9.6140309,50.221625],[9.6654148,50.2353216],[9.6354408,50.2490142],[9.6675558,50.2722826],[9.7424908,50.3092151],[9.7296448,50.3584137],[9.7703238,50.4293885],[9.8688097,50.4007384],[9.9180527,50.4089259],[10.0358076,50.479825],[10.0379486,50.5111504],[10.1235886,50.568462]]],"terms_url":"www.geodaten.bayern.de","terms_text":"Bayerische Vermessungsverwaltung"},{"id":"bavaria-DOP80","name":"Bavaria DOP 80cm","type":"tms","template":"https://mapproxy.osm.ch/tiles/BAYERNDOP80/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[7,18],"polygon":[[[10.1235886,50.568462],[10.1428576,50.5507804],[10.2028056,50.5574195],[10.2520485,50.5179575],[10.3269835,50.4934473],[10.4104825,50.4184762],[10.6031724,50.3310874],[10.6224414,50.2271041],[10.7252093,50.2106649],[10.7294913,50.2476451],[10.8515282,50.2435376],[10.7187863,50.3201525],[10.7123633,50.3652428],[10.8558102,50.3966441],[10.9371682,50.3966441],[10.9906932,50.3666085],[11.1277171,50.3666085],[11.1791011,50.3133169],[11.1619731,50.294172],[11.24119,50.2928042],[11.249754,50.3734364],[11.24119,50.479825],[11.358945,50.5234025],[11.4381619,50.5097889],[11.4424439,50.4893611],[11.425316,50.4771001],[11.425316,50.4416618],[11.4895459,50.4225686],[11.4916869,50.3980089],[11.5195199,50.3980089],[11.5259429,50.3761673],[11.5987369,50.4034677],[11.6372748,50.3884544],[11.7935678,50.4212045],[11.8363877,50.3925494],[11.9220277,50.4280246],[11.9862577,50.3870894],[11.9841167,50.3570478],[12.0483466,50.3310874],[12.0933076,50.3297207],[12.1297046,50.2982751],[12.1404096,50.2722826],[12.1061536,50.255859],[12.1125766,50.2353216],[12.1489736,50.236691],[12.1982166,50.2010728],[12.2239086,50.1640565],[12.2046396,50.1434795],[12.2067806,50.1077916],[12.2431775,50.0995522],[12.2774335,50.0720772],[12.4936744,49.985428],[12.4979564,49.9413559],[12.5557634,49.9220616],[12.5493404,49.8682726],[12.4808284,49.7881677],[12.4101755,49.7577484],[12.4615594,49.7065456],[12.5471994,49.6802313],[12.5878784,49.552613],[12.6542493,49.534553],[12.6628133,49.4330153],[12.7527353,49.4107323],[12.7976963,49.3466124],[12.9047462,49.3563752],[12.9968092,49.3368477],[13.0546161,49.2754251],[13.1316921,49.2195199],[13.1916401,49.1439475],[13.236601,49.1215335],[13.296549,49.1229347],[13.371484,49.0808823],[13.414304,49.0289687],[13.414304,48.9798112],[13.5791609,48.9699739],[13.6348268,48.9432629],[13.6776468,48.8869823],[13.7375948,48.8926132],[13.7846968,48.8334571],[13.8403627,48.774231],[13.8168118,48.7064584],[13.8446447,48.7008065],[13.8425037,48.6003807],[13.7654278,48.5422972],[13.7525818,48.5040106],[13.6712238,48.5054291],[13.6433908,48.5437146],[13.4571239,48.5508013],[13.4571239,48.4159838],[13.40574,48.3605338],[13.283703,48.2751083],[13.0931541,48.2694081],[12.9582712,48.1909669],[12.8769132,48.1852574],[12.7720043,48.0938188],[12.8640672,48.0136764],[12.8983232,47.9549216],[12.9454252,47.9563555],[12.9968092,47.8846147],[13.0139372,47.834337],[12.9347202,47.7321953],[13.0588981,47.7249947],[13.1188461,47.6385093],[13.0653211,47.5692178],[13.0567571,47.473792],[13.0032322,47.4520801],[12.7677223,47.5504355],[12.7698633,47.6327385],[12.7398893,47.6731207],[12.6670953,47.6702373],[12.5750324,47.621195],[12.4808284,47.6197519],[12.4144575,47.6702373],[12.2431775,47.6774455],[12.2132036,47.6918589],[12.1917936,47.6817699],[12.2132036,47.6659119],[12.2110626,47.603875],[12.1746656,47.5952129],[12.1382686,47.603875],[11.8920537,47.603875],[11.8513747,47.5793285],[11.6394158,47.5822169],[11.5944549,47.5489905],[11.5901729,47.5128508],[11.5173789,47.498388],[11.4403029,47.5041736],[11.395342,47.4752392],[11.427457,47.4448409],[11.346099,47.4433929],[11.279728,47.3955873],[11.2133571,47.3883402],[11.247613,47.4318076],[11.1020251,47.3926886],[10.9650012,47.3897897],[10.9778472,47.4361524],[10.9178992,47.4752392],[10.8707972,47.4752392],[10.8558102,47.4940484],[10.9007712,47.5142969],[10.8729382,47.5359831],[10.8108493,47.5128508],[10.6438513,47.5489905],[10.5946084,47.5547705],[10.5796214,47.5287553],[10.4618664,47.5403192],[10.4661484,47.4839212],[10.4875584,47.4781333],[10.4875584,47.4129762],[10.4597254,47.4028333],[10.4597254,47.375293],[10.4104825,47.3738431],[10.4083415,47.3433862],[10.3205605,47.2867768],[10.2820225,47.2780622],[10.2841635,47.2620819],[10.1471396,47.2620819],[10.1921006,47.3027497],[10.1942416,47.3738431],[10.1664086,47.3738431],[10.1664086,47.3462876],[10.1000376,47.3433862],[10.0614996,47.3636928],[10.0679226,47.4187712],[10.0936146,47.426014],[10.0957556,47.4419449],[9.9780007,47.485368],[9.9565907,47.5273097],[9.8945017,47.5287553],[9.8559637,47.5085124],[9.8174258,47.544655],[9.8217078,47.5764399],[9.7746058,47.5822169],[9.7382088,47.525864],[9.6739788,47.5345376],[9.5840569,47.564884],[9.6397228,47.6053186],[9.7167988,47.603875],[9.8559637,47.6760039],[9.9780007,47.6558179],[10.0293846,47.6817699],[10.1000376,47.6673537],[10.1321526,47.6760039],[10.1428576,47.7019459],[10.0614996,47.7725005],[10.1128836,47.8098988],[10.0829096,47.8530173],[10.1086016,47.9090177],[10.0764866,47.9649577],[10.1300116,48.020837],[10.1342936,48.1066872],[10.1000376,48.1281274],[10.0550766,48.2622821],[9.9694367,48.3676462],[10.0315256,48.4259299],[10.0293846,48.461436],[10.1235886,48.4770509],[10.1535626,48.4514968],[10.2349205,48.5125212],[10.3162785,48.516776],[10.2991505,48.6187835],[10.2456255,48.6682961],[10.2734585,48.7064584],[10.3698035,48.6838472],[10.4318924,48.6993935],[10.4511614,48.7276471],[10.4019185,48.7460035],[10.4404564,48.8489571],[10.4340334,48.9587289],[10.3376885,49.0205451],[10.2499075,49.0359872],[10.2499075,49.0738701],[10.2006646,49.1033147],[10.2520485,49.1327418],[10.1235886,49.1971401],[10.1193066,49.2628519],[10.1514216,49.2893915],[10.1043196,49.3452175],[10.1407166,49.3940134],[10.1086016,49.445545],[10.1107426,49.5053651],[10.0722046,49.5331635],[10.0165387,49.4761598],[9.9266167,49.478942],[9.9244757,49.5567797],[9.8987837,49.5817727],[9.8559637,49.5387213],[9.8067208,49.5567797],[9.8666687,49.6067529],[9.8538227,49.6441991],[9.8174258,49.6608327],[9.8345537,49.6899277],[9.7960158,49.7203895],[9.7574778,49.7079302],[9.7403498,49.6857723],[9.7060938,49.7162368],[9.6782608,49.7162368],[9.6825428,49.6885426],[9.6204539,49.6913127],[9.6461458,49.78955],[9.5583649,49.7743431],[9.5712109,49.7356133],[9.5069809,49.7522156],[9.4919939,49.7798735],[9.4684429,49.7605146],[9.425623,49.7784909],[9.404213,49.7646636],[9.33356,49.770195],[9.329278,49.7342295],[9.408495,49.725926],[9.427764,49.6982374],[9.414918,49.6441991],[9.380662,49.6386533],[9.359252,49.6497443],[9.339983,49.6372668],[9.31215,49.648358],[9.277894,49.626173],[9.284317,49.6081403],[9.241497,49.5748315],[9.0980501,49.5720547],[9.0659351,49.6081403],[9.1001911,49.6511305],[9.0916271,49.6926978],[9.1301651,49.7120837],[9.1387291,49.7425316],[9.1087551,49.7563653],[9.1365881,49.7909322],[9.1001911,49.78955],[9.0723581,49.8282367],[9.0359611,49.8351418],[9.0166922,50.0267091],[8.9631672,50.0308352],[8.9567442,50.0597083],[9.0017052,50.0707031],[9.0209742,50.1105378],[9.1216011,50.1228936],[9.1558571,50.1132838],[9.1965361,50.1187753],[9.1858311,50.1352462],[9.235074,50.1475956],[9.37638,50.1270115],[9.408495,50.0816953],[9.5219679,50.095432],[9.5048399,50.1421073],[9.5326729,50.1640565],[9.4898529,50.1695422],[9.4941349,50.2435376],[9.6140309,50.221625],[9.6654148,50.2353216],[9.6354408,50.2490142],[9.6675558,50.2722826],[9.7424908,50.3092151],[9.7296448,50.3584137],[9.7703238,50.4293885],[9.8688097,50.4007384],[9.9180527,50.4089259],[10.0358076,50.479825],[10.0379486,50.5111504],[10.1235886,50.568462]]],"terms_url":"www.geodaten.bayern.de","terms_text":"Bayerische Vermessungsverwaltung","best":true},{"id":"route500hydro","name":"BD Carthage","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.fr/route500hydro/{zoom}/{x}/{y}.png","scaleExtent":[6,20],"polygon":[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.358164,51.32937],[2.548804,51.09759],[2.570482,51.07409],[2.587412,51.01763],[2.598448,51.0051],[2.615575,50.99749],[2.639859,50.95766],[2.642247,50.94578],[2.624519,50.9256],[2.61962,50.91067],[2.623964,50.86071],[2.627811,50.85054],[2.637859,50.83696],[2.651102,50.82906],[2.732666,50.81738],[2.79995,50.73795],[2.816552,50.73092],[2.852648,50.73335],[2.890719,50.7162],[2.904925,50.71536],[2.916096,50.72418],[2.935084,50.75592],[3.007184,50.78377],[3.082183,50.78749],[3.092439,50.79092],[3.114119,50.80566],[3.148768,50.80195],[3.215401,50.73111],[3.221487,50.7267],[3.270507,50.70375],[3.275448,50.67757],[3.265761,50.6604],[3.265877,50.64054],[3.289219,50.60028],[3.292195,50.55037],[3.305598,50.53267],[3.375514,50.50839],[3.389804,50.50884],[3.474798,50.54445],[3.52173,50.53459],[3.532662,50.51873],[3.547788,50.51012],[3.615234,50.50558],[3.673778,50.45642],[3.684152,50.35277],[3.690097,50.34044],[3.702583,50.33482],[3.715758,50.33854],[3.749349,50.36279],[3.841089,50.36558],[3.901887,50.3436],[3.913173,50.34291],[4.026717,50.36904],[4.13761,50.29984],[4.143881,50.29727],[4.214438,50.28167],[4.229037,50.26664],[4.230782,50.25233],[4.170843,50.18579],[4.166015,50.16888],[4.176401,50.1547],[4.211948,50.13602],[4.240742,50.07102],[4.231934,50.05551],[4.181645,50.03436],[4.17177,50.02537],[4.169755,50.01217],[4.176498,50.00065],[4.206331,49.97546],[4.221639,49.97089],[4.308774,49.98145],[4.445423,49.9523],[4.454691,49.95251],[4.658098,50.00609],[4.669358,50.01392],[4.672929,50.02716],[4.66924,50.06972],[4.695168,50.10472],[4.831227,50.17941],[4.881497,50.16436],[4.904786,50.14451],[4.904264,50.12639],[4.880762,50.0815],[4.862772,50.0745],[4.851037,50.06216],[4.843307,50.03884],[4.843307,50.03883],[4.843295,50.03881],[4.826781,49.989],[4.826618,49.97692],[4.833433,49.96696],[4.896542,49.91753],[4.897546,49.89424],[4.879134,49.86942],[4.876249,49.85111],[4.889238,49.81266],[4.897691,49.80204],[4.910979,49.79926],[4.995343,49.81116],[5.01867,49.79272],[5.026862,49.78886],[5.099438,49.77323],[5.134584,49.73462],[5.141201,49.72984],[5.187609,49.70906],[5.196025,49.70732],[5.281572,49.70836],[5.333628,49.67308],[5.343996,49.65049],[5.354398,49.64041],[5.431412,49.60791],[5.482051,49.52815],[5.492943,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.607602,49.53761],[5.640997,49.56095],[5.706759,49.55267],[5.715782,49.55361],[5.775261,49.57414],[5.839902,49.55321],[5.861263,49.52038],[5.875997,49.5114],[5.975162,49.50129],[5.998015,49.47317],[6.016266,49.46597],[6.08635,49.47562],[6.093186,49.47787],[6.173966,49.52187],[6.246435,49.52511],[6.333999,49.48235],[6.344229,49.48037],[6.435145,49.487],[6.5451,49.44384],[6.606389,49.37868],[6.604972,49.33739],[6.616267,49.31869],[6.670133,49.29269],[6.729955,49.22917],[6.743276,49.19086],[6.760259,49.17752],[6.809042,49.17284],[6.824733,49.17826],[6.830928,49.19366],[6.829819,49.21802],[6.851186,49.23136],[6.884528,49.2239],[6.893221,49.22389],[6.937527,49.23369],[7.040549,49.19794],[7.046296,49.17503],[7.054777,49.16313],[7.069081,49.16018],[7.104945,49.16634],[7.143153,49.14159],[7.153499,49.13839],[7.286827,49.13488],[7.29893,49.13856],[7.360948,49.18259],[7.450116,49.19517],[7.50113,49.17672],[7.543788,49.10572],[7.557903,49.09626],[7.629604,49.08527],[7.647217,49.06722],[7.661197,49.06119],[7.754008,49.05963],[7.760731,49.06067],[7.802913,49.07489],[7.855253,49.05329],[7.867297,49.05227],[7.93826,49.06832],[8.080685,49.00688],[8.222498,48.98787],[8.23704,48.97683],[8.235894,48.95817],[8.208878,48.94863],[8.200888,48.94339],[8.158243,48.89753],[8.100873,48.7993],[7.990709,48.74478],[7.985341,48.7409],[7.904217,48.65865],[7.856051,48.63606],[7.848405,48.62977],[7.818424,48.58883],[7.81456,48.57704],[7.814491,48.50968],[7.785465,48.48337],[7.780554,48.47652],[7.745059,48.39484],[7.743573,48.38427],[7.751593,48.32322],[7.71085,48.29841],[7.702411,48.28803],[7.676613,48.21555],[7.596051,48.11698],[7.591652,48.10648],[7.585216,48.04694],[7.591268,48.03035],[7.624373,47.99865],[7.632049,47.97081],[7.575545,47.87436],[7.572802,47.86435],[7.572673,47.83631],[7.545808,47.78793],[7.544185,47.77232],[7.557581,47.72899],[7.535257,47.6989],[7.531364,47.68564],[7.536998,47.67302],[7.600164,47.60822],[7.589675,47.56755],[7.554237,47.55128],[7.54511,47.54283],[7.512557,47.48439],[7.387471,47.42111],[7.326527,47.4273],[7.244354,47.40939],[7.167083,47.4335],[7.152115,47.47612],[7.14279,47.48707],[7.128529,47.48893],[7.080105,47.47718],[7.035575,47.48695],[7.021019,47.48458],[7.012048,47.47287],[7.002995,47.44095],[6.955099,47.40808],[6.947157,47.39698],[6.94818,47.38337],[6.957691,47.37359],[6.971263,47.37218],[7.018004,47.38386],[7.05623,47.37035],[7.070073,47.35005],[7.05958,47.32257],[6.974243,47.27856],[6.963469,47.26233],[6.961339,47.23479],[6.89443,47.19393],[6.889128,47.18922],[6.855453,47.14636],[6.769073,47.10751],[6.760108,47.09953],[6.725613,47.0418],[6.623551,46.9811],[6.481204,46.9445],[6.46892,46.93522],[6.466862,46.91997],[6.475476,46.88771],[6.453496,46.8239],[6.45644,46.80534],[6.467224,46.79104],[6.460984,46.76887],[6.15817,46.59343],[6.148724,46.58069],[6.15152,46.56508],[6.165489,46.54399],[6.158111,46.52456],[6.101739,46.46979],[6.095717,46.45418],[6.097044,46.43317],[6.108289,46.41643],[6.166216,46.38839],[6.178173,46.36922],[6.137482,46.31297],[6.133713,46.30227],[6.130383,46.23737],[6.110298,46.22344],[6.088648,46.23081],[6.077173,46.23123],[6.018573,46.21601],[6.006813,46.20752],[6.003882,46.19332],[6.007866,46.16977],[6.017834,46.15564],[6.03509,46.15456],[6.055639,46.16288],[6.124683,46.15415],[6.137776,46.15702],[6.240258,46.22094],[6.249058,46.23299],[6.247073,46.24777],[6.21148,46.31057],[6.212186,46.32485],[6.239462,46.36705],[6.316478,46.41557],[6.410826,46.42495],[6.417483,46.42682],[6.504978,46.46871],[6.630473,46.47435],[6.746646,46.45695],[6.822442,46.42925],[6.818324,46.38181],[6.804843,46.36179],[6.801885,46.34639],[6.810949,46.33359],[6.864911,46.30038],[6.875036,46.28007],[6.860917,46.2439],[6.826978,46.21188],[6.820746,46.19862],[6.818627,46.16592],[6.822593,46.15261],[6.834266,46.14509],[6.903819,46.12971],[6.904911,46.09595],[6.909323,46.08406],[6.920006,46.07721],[6.948976,46.0699],[7.015561,46.00883],[7.051911,45.93066],[7.045335,45.92217],[7.044967,45.92064],[7.043936,45.92036],[6.995822,45.85822],[6.940965,45.83551],[6.843757,45.82387],[6.831016,45.81711],[6.826141,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.841405,45.71373],[6.907294,45.69124],[6.92419,45.66935],[6.942468,45.66172],[6.971313,45.66528],[7.00597,45.64945],[7.011511,45.63652],[6.997797,45.60877],[6.996431,45.59465],[7.015803,45.52354],[7.027743,45.5102],[7.107198,45.47877],[7.122797,45.44924],[7.13304,45.44001],[7.185604,45.41894],[7.19515,45.40409],[7.170749,45.35069],[7.142319,45.32298],[7.136488,45.30576],[7.14458,45.25048],[7.084166,45.20279],[6.992792,45.19823],[6.981064,45.19368],[6.900091,45.12689],[6.85843,45.11699],[6.782826,45.14228],[6.770557,45.14242],[6.677507,45.11356],[6.665295,45.10289],[6.665008,45.08667],[6.68237,45.04558],[6.696016,45.03395],[6.757442,45.01884],[6.783751,44.9146],[6.794195,44.90161],[6.866981,44.86519],[6.879801,44.86346],[6.936325,44.87461],[7.017954,44.84402],[7.034535,44.82282],[7.037114,44.75009],[7.049604,44.73226],[7.072236,44.72311],[7.086508,44.6968],[7.086656,44.68085],[7.07671,44.67134],[6.990071,44.67203],[6.974128,44.66431],[6.970564,44.64696],[6.978189,44.61784],[6.94659,44.57124],[6.882347,44.53479],[6.872327,44.5195],[6.878925,44.50245],[6.958945,44.43129],[6.958723,44.42908],[6.921668,44.41436],[6.912225,44.40659],[6.909075,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.999091,44.29414],[7.011806,44.256],[7.019835,44.24558],[7.032595,44.2424],[7.073117,44.2461],[7.165097,44.22112],[7.245331,44.18544],[7.260526,44.16682],[7.275371,44.15947],[7.338779,44.1574],[7.362775,44.13834],[7.377763,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.564785,44.15817],[7.605476,44.1634],[7.616198,44.16827],[7.639891,44.18928],[7.686079,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.694448,44.12276],[7.727862,44.08615],[7.724032,44.05704],[7.686028,44.02371],[7.680769,44.0164],[7.660161,43.9672],[7.596244,43.94466],[7.584187,43.93287],[7.568576,43.89159],[7.527096,43.87434],[7.516489,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.369681,41.35052],[9.273114,41.29196],[8.941857,41.27688],[5.8,41.64],[3.173576,42.41768],[3.160814,42.42757],[3.094399,42.41457],[3.034016,42.45331],[3.022142,42.45645],[2.878221,42.4487],[2.870188,42.44653],[2.784238,42.40256],[2.741304,42.41128],[2.729276,42.40998],[2.693308,42.39417],[2.683779,42.3854],[2.681621,42.37263],[2.685852,42.34679],[2.66719,42.33008],[2.581057,42.34418],[2.567769,42.34173],[2.533803,42.32197],[2.477948,42.32986],[2.419327,42.37658],[2.41222,42.38021],[2.267193,42.42055],[2.259731,42.42117],[2.206944,42.41558],[2.206525,42.41526],[2.205257,42.41541],[2.160278,42.41065],[2.148808,42.40545],[2.093931,42.35474],[2.008614,42.33818],[1.964998,42.36473],[1.930762,42.42442],[1.920889,42.43302],[1.884665,42.44761],[1.884588,42.44762],[1.884444,42.4477],[1.827736,42.47056],[1.725668,42.48452],[1.715606,42.50125],[1.727195,42.56103],[1.724794,42.57499],[1.710109,42.59992],[1.69377,42.60975],[1.602827,42.61382],[1.560687,42.6392],[1.546365,42.64166],[1.504443,42.6331],[1.492096,42.62502],[1.472384,42.59703],[1.437922,42.59264],[1.419356,42.60643],[1.38032,42.67415],[1.373353,42.68127],[1.333134,42.70563],[1.323642,42.7085],[1.232212,42.71248],[1.165543,42.69928],[1.085465,42.76635],[1.075637,42.77079],[0.9593748,42.78852],[0.9507323,42.78794],[0.9226515,42.7797],[0.8460624,42.8157],[0.7151135,42.8464],[0.7001699,42.84402],[0.6911674,42.83186],[0.6740937,42.76479],[0.6747382,42.75286],[0.6919171,42.70684],[0.6689955,42.67901],[0.4302428,42.67863],[0.3715037,42.70308],[0.3595376,42.70415],[0.3491168,42.69817],[0.3256688,42.67274],[0.2957095,42.66388],[0.2459353,42.70175],[0.2397249,42.70494],[0.189669,42.72039],[0.1791886,42.72075],[-0.01993262,42.67389],[-0.06725834,42.6848],[-0.1694885,42.77157],[-0.2998662,42.82697],[-0.3168349,42.82635],[-0.3920752,42.78766],[-0.4435404,42.78453],[-0.488418,42.80255],[-0.508683,42.79935],[-0.5449894,42.76906],[-0.5672068,42.76937],[-0.6744552,42.86392],[-0.6809365,42.86775],[-0.7337233,42.88666],[-0.747598,42.93879],[-0.757105,42.95107],[-0.7725328,42.95284],[-0.8211401,42.93865],[-0.9450847,42.94192],[-1.023131,42.98206],[-1.108517,43.00409],[-1.115597,43.00461],[-1.147753,43.00124],[-1.158452,43.01452],[-1.167362,43.02083],[-1.216216,43.0381],[-1.226121,43.03898],[-1.262362,43.03303],[-1.306428,43.05531],[-1.319918,43.05696],[-1.331346,43.0496],[-1.354196,43.0197],[-1.438684,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.476407,43.10248],[-1.434786,43.13087],[-1.427318,43.1404],[-1.394112,43.22935],[-1.395313,43.24596],[-1.408677,43.25591],[-1.526287,43.28099],[-1.546257,43.2737],[-1.571485,43.2412],[-1.610526,43.24223],[-1.650003,43.29323],[-1.669527,43.30065],[-1.733594,43.28856],[-1.756061,43.31966],[-1.762973,43.32565],[-1.791557,43.34067],[-1.800991,43.37017],[-1.785091,43.39037],[-1.783502,43.39686],[-2.7,43.9]]],"terms_url":"http://www.sandre.eaufrance.fr/actualite/la-bd-carthage-en-licence-ouverte-open-licence","terms_text":"Tiles © cquest@Openstreetmap France, data © Onema - IGN, LO/OL","description":"Réseau hydrographique: cours et plans d'eau et POI","overlay":true},{"id":"fr.ign.bdortho","name":"BDOrtho IGN","type":"tms","template":"https://proxy-ign.openstreetmap.fr/94GjiyqD/bdortho/{zoom}/{x}/{y}.jpg","scaleExtent":[2,21],"polygon":[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.358164,51.32937],[2.548804,51.09759],[2.570482,51.07409],[2.587412,51.01763],[2.598448,51.0051],[2.615575,50.99749],[2.639859,50.95766],[2.642247,50.94578],[2.624519,50.9256],[2.61962,50.91067],[2.623964,50.86071],[2.627811,50.85054],[2.637859,50.83696],[2.651102,50.82906],[2.732666,50.81738],[2.79995,50.73795],[2.816552,50.73092],[2.852648,50.73335],[2.890719,50.7162],[2.904925,50.71536],[2.916096,50.72418],[2.935084,50.75592],[3.007184,50.78377],[3.082183,50.78749],[3.092439,50.79092],[3.114119,50.80566],[3.148768,50.80195],[3.215401,50.73111],[3.221487,50.7267],[3.270507,50.70375],[3.275448,50.67757],[3.265761,50.6604],[3.265877,50.64054],[3.289219,50.60028],[3.292195,50.55037],[3.305598,50.53267],[3.375514,50.50839],[3.389804,50.50884],[3.474798,50.54445],[3.52173,50.53459],[3.532662,50.51873],[3.547788,50.51012],[3.615234,50.50558],[3.673778,50.45642],[3.684152,50.35277],[3.690097,50.34044],[3.702583,50.33482],[3.715758,50.33854],[3.749349,50.36279],[3.841089,50.36558],[3.901887,50.3436],[3.913173,50.34291],[4.026717,50.36904],[4.13761,50.29984],[4.143881,50.29727],[4.214438,50.28167],[4.229037,50.26664],[4.230782,50.25233],[4.170843,50.18579],[4.166015,50.16888],[4.176401,50.1547],[4.211948,50.13602],[4.240742,50.07102],[4.231934,50.05551],[4.181645,50.03436],[4.17177,50.02537],[4.169755,50.01217],[4.176498,50.00065],[4.206331,49.97546],[4.221639,49.97089],[4.308774,49.98145],[4.445423,49.9523],[4.454691,49.95251],[4.658098,50.00609],[4.669358,50.01392],[4.672929,50.02716],[4.66924,50.06972],[4.695168,50.10472],[4.831227,50.17941],[4.881497,50.16436],[4.904786,50.14451],[4.904264,50.12639],[4.880762,50.0815],[4.862772,50.0745],[4.851037,50.06216],[4.843307,50.03884],[4.843307,50.03883],[4.843295,50.03881],[4.826781,49.989],[4.826618,49.97692],[4.833433,49.96696],[4.896542,49.91753],[4.897546,49.89424],[4.879134,49.86942],[4.876249,49.85111],[4.889238,49.81266],[4.897691,49.80204],[4.910979,49.79926],[4.995343,49.81116],[5.01867,49.79272],[5.026862,49.78886],[5.099438,49.77323],[5.134584,49.73462],[5.141201,49.72984],[5.187609,49.70906],[5.196025,49.70732],[5.281572,49.70836],[5.333628,49.67308],[5.343996,49.65049],[5.354398,49.64041],[5.431412,49.60791],[5.482051,49.52815],[5.492943,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.607602,49.53761],[5.640997,49.56095],[5.706759,49.55267],[5.715782,49.55361],[5.775261,49.57414],[5.839902,49.55321],[5.861263,49.52038],[5.875997,49.5114],[5.975162,49.50129],[5.998015,49.47317],[6.016266,49.46597],[6.08635,49.47562],[6.093186,49.47787],[6.173966,49.52187],[6.246435,49.52511],[6.333999,49.48235],[6.344229,49.48037],[6.435145,49.487],[6.5451,49.44384],[6.606389,49.37868],[6.604972,49.33739],[6.616267,49.31869],[6.670133,49.29269],[6.729955,49.22917],[6.743276,49.19086],[6.760259,49.17752],[6.809042,49.17284],[6.824733,49.17826],[6.830928,49.19366],[6.829819,49.21802],[6.851186,49.23136],[6.884528,49.2239],[6.893221,49.22389],[6.937527,49.23369],[7.040549,49.19794],[7.046296,49.17503],[7.054777,49.16313],[7.069081,49.16018],[7.104945,49.16634],[7.143153,49.14159],[7.153499,49.13839],[7.286827,49.13488],[7.29893,49.13856],[7.360948,49.18259],[7.450116,49.19517],[7.50113,49.17672],[7.543788,49.10572],[7.557903,49.09626],[7.629604,49.08527],[7.647217,49.06722],[7.661197,49.06119],[7.754008,49.05963],[7.760731,49.06067],[7.802913,49.07489],[7.855253,49.05329],[7.867297,49.05227],[7.93826,49.06832],[8.080685,49.00688],[8.222498,48.98787],[8.23704,48.97683],[8.235894,48.95817],[8.208878,48.94863],[8.200888,48.94339],[8.158243,48.89753],[8.100873,48.7993],[7.990709,48.74478],[7.985341,48.7409],[7.904217,48.65865],[7.856051,48.63606],[7.848405,48.62977],[7.818424,48.58883],[7.81456,48.57704],[7.814491,48.50968],[7.785465,48.48337],[7.780554,48.47652],[7.745059,48.39484],[7.743573,48.38427],[7.751593,48.32322],[7.71085,48.29841],[7.702411,48.28803],[7.676613,48.21555],[7.596051,48.11698],[7.591652,48.10648],[7.585216,48.04694],[7.591268,48.03035],[7.624373,47.99865],[7.632049,47.97081],[7.575545,47.87436],[7.572802,47.86435],[7.572673,47.83631],[7.545808,47.78793],[7.544185,47.77232],[7.557581,47.72899],[7.535257,47.6989],[7.531364,47.68564],[7.536998,47.67302],[7.600164,47.60822],[7.589675,47.56755],[7.554237,47.55128],[7.54511,47.54283],[7.512557,47.48439],[7.387471,47.42111],[7.326527,47.4273],[7.244354,47.40939],[7.167083,47.4335],[7.152115,47.47612],[7.14279,47.48707],[7.128529,47.48893],[7.080105,47.47718],[7.035575,47.48695],[7.021019,47.48458],[7.012048,47.47287],[7.002995,47.44095],[6.955099,47.40808],[6.947157,47.39698],[6.94818,47.38337],[6.957691,47.37359],[6.971263,47.37218],[7.018004,47.38386],[7.05623,47.37035],[7.070073,47.35005],[7.05958,47.32257],[6.974243,47.27856],[6.963469,47.26233],[6.961339,47.23479],[6.89443,47.19393],[6.889128,47.18922],[6.855453,47.14636],[6.769073,47.10751],[6.760108,47.09953],[6.725613,47.0418],[6.623551,46.9811],[6.481204,46.9445],[6.46892,46.93522],[6.466862,46.91997],[6.475476,46.88771],[6.453496,46.8239],[6.45644,46.80534],[6.467224,46.79104],[6.460984,46.76887],[6.15817,46.59343],[6.148724,46.58069],[6.15152,46.56508],[6.165489,46.54399],[6.158111,46.52456],[6.101739,46.46979],[6.095717,46.45418],[6.097044,46.43317],[6.108289,46.41643],[6.166216,46.38839],[6.178173,46.36922],[6.137482,46.31297],[6.133713,46.30227],[6.130383,46.23737],[6.110298,46.22344],[6.088648,46.23081],[6.077173,46.23123],[6.018573,46.21601],[6.006813,46.20752],[6.003882,46.19332],[6.007866,46.16977],[6.017834,46.15564],[6.03509,46.15456],[6.055639,46.16288],[6.124683,46.15415],[6.137776,46.15702],[6.240258,46.22094],[6.249058,46.23299],[6.247073,46.24777],[6.21148,46.31057],[6.212186,46.32485],[6.239462,46.36705],[6.316478,46.41557],[6.410826,46.42495],[6.417483,46.42682],[6.504978,46.46871],[6.630473,46.47435],[6.746646,46.45695],[6.822442,46.42925],[6.818324,46.38181],[6.804843,46.36179],[6.801885,46.34639],[6.810949,46.33359],[6.864911,46.30038],[6.875036,46.28007],[6.860917,46.2439],[6.826978,46.21188],[6.820746,46.19862],[6.818627,46.16592],[6.822593,46.15261],[6.834266,46.14509],[6.903819,46.12971],[6.904911,46.09595],[6.909323,46.08406],[6.920006,46.07721],[6.948976,46.0699],[7.015561,46.00883],[7.051911,45.93066],[7.045335,45.92217],[7.044967,45.92064],[7.043936,45.92036],[6.995822,45.85822],[6.940965,45.83551],[6.843757,45.82387],[6.831016,45.81711],[6.826141,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.841405,45.71373],[6.907294,45.69124],[6.92419,45.66935],[6.942468,45.66172],[6.971313,45.66528],[7.00597,45.64945],[7.011511,45.63652],[6.997797,45.60877],[6.996431,45.59465],[7.015803,45.52354],[7.027743,45.5102],[7.107198,45.47877],[7.122797,45.44924],[7.13304,45.44001],[7.185604,45.41894],[7.19515,45.40409],[7.170749,45.35069],[7.142319,45.32298],[7.136488,45.30576],[7.14458,45.25048],[7.084166,45.20279],[6.992792,45.19823],[6.981064,45.19368],[6.900091,45.12689],[6.85843,45.11699],[6.782826,45.14228],[6.770557,45.14242],[6.677507,45.11356],[6.665295,45.10289],[6.665008,45.08667],[6.68237,45.04558],[6.696016,45.03395],[6.757442,45.01884],[6.783751,44.9146],[6.794195,44.90161],[6.866981,44.86519],[6.879801,44.86346],[6.936325,44.87461],[7.017954,44.84402],[7.034535,44.82282],[7.037114,44.75009],[7.049604,44.73226],[7.072236,44.72311],[7.086508,44.6968],[7.086656,44.68085],[7.07671,44.67134],[6.990071,44.67203],[6.974128,44.66431],[6.970564,44.64696],[6.978189,44.61784],[6.94659,44.57124],[6.882347,44.53479],[6.872327,44.5195],[6.878925,44.50245],[6.958945,44.43129],[6.958723,44.42908],[6.921668,44.41436],[6.912225,44.40659],[6.909075,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.999091,44.29414],[7.011806,44.256],[7.019835,44.24558],[7.032595,44.2424],[7.073117,44.2461],[7.165097,44.22112],[7.245331,44.18544],[7.260526,44.16682],[7.275371,44.15947],[7.338779,44.1574],[7.362775,44.13834],[7.377763,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.564785,44.15817],[7.605476,44.1634],[7.616198,44.16827],[7.639891,44.18928],[7.686079,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.694448,44.12276],[7.727862,44.08615],[7.724032,44.05704],[7.686028,44.02371],[7.680769,44.0164],[7.660161,43.9672],[7.596244,43.94466],[7.584187,43.93287],[7.568576,43.89159],[7.527096,43.87434],[7.516489,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.369681,41.35052],[9.273114,41.29196],[8.941857,41.27688],[5.8,41.64],[3.173576,42.41768],[3.160814,42.42757],[3.094399,42.41457],[3.034016,42.45331],[3.022142,42.45645],[2.878221,42.4487],[2.870188,42.44653],[2.784238,42.40256],[2.741304,42.41128],[2.729276,42.40998],[2.693308,42.39417],[2.683779,42.3854],[2.681621,42.37263],[2.685852,42.34679],[2.66719,42.33008],[2.581057,42.34418],[2.567769,42.34173],[2.533803,42.32197],[2.477948,42.32986],[2.419327,42.37658],[2.41222,42.38021],[2.267193,42.42055],[2.259731,42.42117],[2.206944,42.41558],[2.206525,42.41526],[2.205257,42.41541],[2.160278,42.41065],[2.148808,42.40545],[2.093931,42.35474],[2.008614,42.33818],[1.964998,42.36473],[1.930762,42.42442],[1.920889,42.43302],[1.884665,42.44761],[1.884588,42.44762],[1.884444,42.4477],[1.827736,42.47056],[1.725668,42.48452],[1.715606,42.50125],[1.727195,42.56103],[1.724794,42.57499],[1.710109,42.59992],[1.69377,42.60975],[1.602827,42.61382],[1.560687,42.6392],[1.546365,42.64166],[1.504443,42.6331],[1.492096,42.62502],[1.472384,42.59703],[1.437922,42.59264],[1.419356,42.60643],[1.38032,42.67415],[1.373353,42.68127],[1.333134,42.70563],[1.323642,42.7085],[1.232212,42.71248],[1.165543,42.69928],[1.085465,42.76635],[1.075637,42.77079],[0.9593748,42.78852],[0.9507323,42.78794],[0.9226515,42.7797],[0.8460624,42.8157],[0.7151135,42.8464],[0.7001699,42.84402],[0.6911674,42.83186],[0.6740937,42.76479],[0.6747382,42.75286],[0.6919171,42.70684],[0.6689955,42.67901],[0.4302428,42.67863],[0.3715037,42.70308],[0.3595376,42.70415],[0.3491168,42.69817],[0.3256688,42.67274],[0.2957095,42.66388],[0.2459353,42.70175],[0.2397249,42.70494],[0.189669,42.72039],[0.1791886,42.72075],[-0.01993262,42.67389],[-0.06725834,42.6848],[-0.1694885,42.77157],[-0.2998662,42.82697],[-0.3168349,42.82635],[-0.3920752,42.78766],[-0.4435404,42.78453],[-0.488418,42.80255],[-0.508683,42.79935],[-0.5449894,42.76906],[-0.5672068,42.76937],[-0.6744552,42.86392],[-0.6809365,42.86775],[-0.7337233,42.88666],[-0.747598,42.93879],[-0.757105,42.95107],[-0.7725328,42.95284],[-0.8211401,42.93865],[-0.9450847,42.94192],[-1.023131,42.98206],[-1.108517,43.00409],[-1.115597,43.00461],[-1.147753,43.00124],[-1.158452,43.01452],[-1.167362,43.02083],[-1.216216,43.0381],[-1.226121,43.03898],[-1.262362,43.03303],[-1.306428,43.05531],[-1.319918,43.05696],[-1.331346,43.0496],[-1.354196,43.0197],[-1.438684,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.476407,43.10248],[-1.434786,43.13087],[-1.427318,43.1404],[-1.394112,43.22935],[-1.395313,43.24596],[-1.408677,43.25591],[-1.526287,43.28099],[-1.546257,43.2737],[-1.571485,43.2412],[-1.610526,43.24223],[-1.650003,43.29323],[-1.669527,43.30065],[-1.733594,43.28856],[-1.756061,43.31966],[-1.762973,43.32565],[-1.791557,43.34067],[-1.800991,43.37017],[-1.785091,43.39037],[-1.783502,43.39686],[-2.7,43.9]],[[-61.2750098,14.9021787],[-60.7236843,14.9010106],[-60.7248947,14.3668637],[-61.2762202,14.3680347],[-61.2750098,14.9021787]],[[-61.9280191,16.5861824],[-61.9268639,15.7393966],[-60.8812792,15.7407152],[-60.8824344,16.5874955],[-61.9280191,16.5861824]],[[-53.8934381,6.0040017],[-52.4652154,5.4464962],[-51.5203912,4.5107197],[-51.5368707,4.1163329],[-52.2345025,3.1021265],[-52.6409967,2.251623],[-52.9266412,2.0759672],[-53.7286431,2.2186891],[-54.2010552,2.0320501],[-54.8053033,2.2735786],[-54.3109185,2.8058902],[-54.3164117,3.2008539],[-54.124151,3.4640797],[-54.1296441,3.5956655],[-54.4207818,4.0012658],[-54.5800836,4.9596205],[-53.8934381,6.0040017]],[[55.088162,-20.7793549],[55.9595858,-20.7728126],[55.9657599,-21.4900002],[55.0943361,-21.496511],[55.088162,-20.7793549]],[[44.9205447,-12.5736261],[45.3482619,-12.5702887],[45.3527389,-13.116298],[44.9250218,-13.1196281],[44.9205447,-12.5736261]],[[-178.577276,-14.7058162],[-178.4256804,-14.0033368],[-176.3415582,-12.8385765],[-175.7153375,-12.9189012],[-175.9185845,-13.587255],[-177.8463838,-14.6498253],[-178.577276,-14.7058162]]],"terms_url":"http://openstreetmap.fr/bdortho","terms_text":"BDOrtho IGN","best":true,"icon":"http://www.ign.fr/institut/sites/all/themes/ign_institut/logo.png"},{"id":"GRB","name":"Belgium AGIV GRB Flanders","type":"tms","template":"http://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=grb_bsk&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={zoom}&tileRow={y}&tileCol={x}","scaleExtent":[0,21],"polygon":[[[5.9849448,50.7072276],[5.9849448,50.7671973],[5.9107871,50.8227527],[5.7556052,50.8353303],[5.7542319,50.8626424],[5.8331961,50.9332328],[5.8551688,51.026611],[5.9094138,51.0775439],[5.9121604,51.1822548],[5.8785147,51.2080728],[5.7741446,51.2368858],[5.684194,51.2407548],[5.6230826,51.2699769],[5.6230826,51.2978925],[5.5399985,51.34724],[5.4473013,51.3485267],[5.3985495,51.321071],[5.3120322,51.3232166],[5.2667136,51.3618196],[5.1994223,51.3725369],[5.1829428,51.3961061],[5.1589102,51.4923992],[5.0833792,51.5308596],[5.0325675,51.539829],[4.9556632,51.5052229],[4.9014182,51.5056503],[4.8382468,51.5436725],[4.7709555,51.5586163],[4.711904,51.5470886],[4.6404929,51.4966741],[4.6144003,51.4971016],[4.5656485,51.5317139],[4.4825644,51.5304324],[4.4262595,51.5218884],[4.3006034,51.4697351],[4.2951102,51.4256575],[4.181127,51.4243731],[4.1371817,51.3952492],[4.138555,51.3506709],[4.0520377,51.3004685],[3.933248,51.272984],[3.8652701,51.2708361],[3.8632102,51.2901637],[3.7629599,51.3240748],[3.5933585,51.359247],[3.4773154,51.3313688],[3.425817,51.3973913],[3.2356162,51.3515286],[3.2260031,51.3656781],[3.1779379,51.3618196],[3.1600852,51.3322268],[3.0625815,51.3021857],[2.7508444,51.1702014],[2.4700064,51.0745241],[2.4926657,50.9937771],[2.5311179,50.9557299],[2.5091452,50.9115907],[2.5304312,50.8214514],[2.5990958,50.7641572],[2.6650138,50.7645915],[2.7700705,50.66677],[2.8970999,50.6589354],[2.991857,50.7254874],[3.1133933,50.7263567],[3.2369895,50.7059231],[3.3626456,50.6585001],[3.4711356,50.7020092],[3.6393637,50.6672052],[3.6984152,50.681565],[3.727941,50.7124454],[3.8185782,50.6841754],[3.8748831,50.6415206],[4.0925498,50.642827],[4.150228,50.6632881],[4.2065329,50.6441333],[4.3136496,50.642827],[4.452352,50.6876557],[4.5347495,50.6780842],[4.6130271,50.6954855],[4.6768851,50.6959204],[4.7270102,50.732007],[4.7805686,50.732007],[4.7997946,50.7128802],[4.8622794,50.7128802],[4.8856253,50.6954855],[4.9611563,50.6954855],[5.0311942,50.6576295],[5.1074118,50.6502288],[5.2007956,50.6489227],[5.2358145,50.6654643],[5.3250784,50.6658995],[5.3669638,50.6820001],[5.4212088,50.6641586],[5.5221457,50.6746032],[5.622396,50.7241834],[5.6752677,50.69853],[5.7398123,50.6972252],[5.7727713,50.6719923],[5.8125968,50.6602413],[5.9080405,50.659806],[5.9849448,50.7072276]]],"terms_text":"GRB Flanders © AGIV","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABm0lEQVQ4y6WTPUgCYRjHf5oFJVfRUZKVHYFBoBAUFLZE0FBD0NQHRENESzS019LSFNHWx1DQEhGRg0JFREM11FJuLWem4GB5HULdwdkgHprn5LO97/O8v+fj/7y2bDabpQKzFx5S6ntlgE81xvHtclHAbuSNloNT5q/uywP021cAvO4hAPYu5/hI5e6GWpsBCEfjxNSMNUALPvJ7eA3AQPcML3KIzbNhlvdEWmu+6RCcAISiCWtA3fosPztBfrYvAGgX/QCIggdR8DDe6Qbg5E0uAdjyKhhykq+uBeySi9qVCfSAB61HRBQ8RFJpRs6vALiZHMUnNpYO0Ujn+jPkJJnVfbTBNeqfFQB8YqP56H8VJqBKcuHcWsQuuXIOyUX1sN8MnPJKlnOwWS2SIScx0hkcvV3mXUzN0HcSAuBoNMBYZxsADittVXcT/XcPKE/PltqHowkTYLcMkOMoml52+wr9jnIZAJZ8XjYGe0vaUDSdsBxnulsqrUDRdMLReNHg8tYhOAs2M2HdQiSVBqChprpI7/9q5JPYKv3OfxL1n52ATYYBAAAAAElFTkSuQmCC"},{"id":"AGIV","name":"Belgium AGIV Orthophoto Flanders","type":"tms","template":"http://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=omwrgbmrvl&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={zoom}&tileRow={y}&tileCol={x}","scaleExtent":[0,21],"polygon":[[[2.522393220658428,51.101723961331],[3.1260610915867457,51.34117672029327],[3.174929443042849,51.382459567439525],[3.3761520666856217,51.38784154353026],[3.410647373595811,51.33040116175589],[3.4020235468682634,51.28547573497245],[3.4911364230529203,51.256700377228974],[3.4825125963253734,51.30345118353617],[3.5773746903283947,51.323216048914524],[3.813092620881357,51.27288873325703],[3.8217164476089045,51.236906864834886],[3.9309515861578386,51.236906864834886],[4.054559769252684,51.27468708752057],[4.20116482362099,51.35194974615148],[4.169544125619984,51.38066543475199],[4.342020660170932,51.395016527087456],[4.3650175314443915,51.46491366130351],[4.5374940659953396,51.50071687469512],[4.571989372905529,51.479238319799464],[4.560490937268798,51.44879304380801],[4.638105377816725,51.45058450468522],[4.750215125274841,51.5239738914927],[4.8364533925503155,51.507874144493115],[5.080795149830825,51.49892738159079],[5.135412719105292,51.447001512638565],[5.106666630013469,51.391429175957505],[5.264770120018504,51.31782647548482],[5.264770120018504,51.28727359653538],[5.4085005654776275,51.292666758936925],[5.486115006025553,51.325012432665545],[5.5809771000285755,51.28367780302667],[5.583851708937758,51.23510703218069],[5.767826679125435,51.20449910348059],[5.8770618176743685,51.161253258857485],[5.704585283123422,50.80292546633848],[5.905807906766195,50.7865720955422],[5.9374286047672005,50.732019528192964],[5.902933297857012,50.70107817444857],[5.8138204216723555,50.69379488717487],[5.615472406938765,50.761122144578216],[5.500488050571466,50.71200098472672],[5.204403332925673,50.70289881954383],[5.164158808197117,50.67558172042608],[5.037676016193088,50.70107817444857],[4.988807664736986,50.750210783384084],[4.916942442007425,50.72656077355532],[4.790459650003396,50.766576871275696],[4.681224511454462,50.77021300246129],[4.6697260758177315,50.73565834458533],[4.287403090896464,50.67922491935501],[3.91082932379356,50.677403355240585],[3.718230526878334,50.752029520237265],[3.6549891308763196,50.71200098472672],[3.5342555566906557,50.710180693059606],[3.514133294326379,50.741116039142966],[3.45664111614273,50.74384464791457],[3.373277457776438,50.69561581502901],[3.310036061774423,50.70745012302645],[3.2899137994101473,50.7365680045137],[3.1648683118607086,50.742935129324266],[3.1318103094051106,50.77203096207303],[3.080067349039826,50.76021296163662],[2.8745328120332805,50.73929687829333],[2.8960923788521487,50.71109084772858],[2.8745328120332805,50.69561581502901],[2.796918371485353,50.70289881954383],[2.699181668573149,50.80020030189157],[2.6201299235706315,50.79747497850781],[2.5698242676599374,50.85830267681076],[2.5669496587507554,50.923581424665855],[2.6028822701155367,50.94984841176044],[2.549702005295661,50.996006093918574],[2.522393220658428,51.101723961331]]],"terms_text":"Orthophoto Flanders most recent © AGIV","best":true,"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABm0lEQVQ4y6WTPUgCYRjHf5oFJVfRUZKVHYFBoBAUFLZE0FBD0NQHRENESzS019LSFNHWx1DQEhGRg0JFREM11FJuLWem4GB5HULdwdkgHprn5LO97/O8v+fj/7y2bDabpQKzFx5S6ntlgE81xvHtclHAbuSNloNT5q/uywP021cAvO4hAPYu5/hI5e6GWpsBCEfjxNSMNUALPvJ7eA3AQPcML3KIzbNhlvdEWmu+6RCcAISiCWtA3fosPztBfrYvAGgX/QCIggdR8DDe6Qbg5E0uAdjyKhhykq+uBeySi9qVCfSAB61HRBQ8RFJpRs6vALiZHMUnNpYO0Ujn+jPkJJnVfbTBNeqfFQB8YqP56H8VJqBKcuHcWsQuuXIOyUX1sN8MnPJKlnOwWS2SIScx0hkcvV3mXUzN0HcSAuBoNMBYZxsADittVXcT/XcPKE/PltqHowkTYLcMkOMoml52+wr9jnIZAJZ8XjYGe0vaUDSdsBxnulsqrUDRdMLReNHg8tYhOAs2M2HdQiSVBqChprpI7/9q5JPYKv3OfxL1n52ATYYBAAAAAElFTkSuQmCC"},{"id":"Benin_cotonou_pleiade_2016","name":"Benin: Cotonou Pleiade 2016","type":"tms","template":"http://geoxxx.agrocampus-ouest.fr/owsifl/gwc/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=Benin:cotonou_pleiade_2016&STYLE=&FORMAT=image/jpeg&tileMatrixSet=EPSG:3857&tileMatrix=EPSG:3857:{zoom}&tileRow={y}&tileCol={x}","endDate":"2016-01-01T00:00:00.000Z","startDate":"2016-01-01T00:00:00.000Z","scaleExtent":[0,21],"polygon":[[[2.31953818544,6.55745092536],[2.33645249928,6.56023631702],[2.36377172444,6.56211241002],[2.36737717181,6.56067658005],[2.37777373205,6.54939665325],[2.3777926612,6.53484752744],[2.36994151563,6.4933195729],[2.37038356708,6.45527010853],[2.36958186167,6.45269435578],[2.36188103586,6.44177160245],[2.35391742884,6.40545220189],[2.3674929737,6.40149524022],[2.39525870424,6.40071623744],[2.40128040262,6.40374371884],[2.40587684694,6.40340733291],[2.42045897749,6.39382909301],[2.42485054154,6.3979366042],[2.42949152505,6.39887495342],[2.43625257397,6.39628121034],[2.43958410532,6.40041525877],[2.44439433776,6.40189359345],[2.45375647532,6.39899446003],[2.47144744127,6.3963166199],[2.48162019208,6.3910582748],[2.49453210303,6.38739776192],[2.50893162289,6.38888498676],[2.50719014059,6.39228876781],[2.50120407357,6.39162040687],[2.4963025358,6.39521449649],[2.49509997769,6.40123077776],[2.49543290813,6.40400928653],[2.49830345887,6.41022131795],[2.50191336015,6.41281720321],[2.5108701911,6.41321333458],[2.52218648559,6.40849403999],[2.53352059576,6.4051656109],[2.53809922441,6.40960941297],[2.5411100736,6.41090182623],[2.54650822333,6.41099034757],[2.54654385468,6.40651114868],[2.57638511144,6.40723702943],[2.57642074279,6.41176933466],[2.58575615684,6.41196408125],[2.58867792765,6.41095493903],[2.60877400982,6.39413560832],[2.62569890171,6.39487921149],[2.64554556441,6.39728706193],[2.65039142819,6.39339200408],[2.6536650586,6.36823275735],[2.6431181786,6.3665949733],[2.61251084779,6.3628944474],[2.56867983171,6.3607044406],[2.54682890549,6.36055393954],[2.54687344468,6.35546343647],[2.50206702036,6.35461353888],[2.47064016846,6.35595920942],[2.46777184468,6.35202842507],[2.46422652522,6.35020467258],[2.45253944198,6.35006302163],[2.4511320036,6.34813302357],[2.44737289603,6.34629155079],[2.43757427441,6.34653944174],[2.43297783009,6.33841209773],[2.43016295333,6.33706638135],[2.42244876576,6.33706638135],[2.39236031651,6.34114999999],[2.39315311407,6.34114999999],[2.3652849434,6.34445228474],[2.35386064137,6.34529777247],[2.34377474198,6.34457844399],[2.34093759563,6.34533982549],[2.31086028117,6.36567095094],[2.28434610184,6.37465215648],[2.28146887022,6.37761782314],[2.27599054995,6.39517244756],[2.27611525968,6.39819996182],[2.31528747657,6.4926104105],[2.31579967725,6.5530659484],[2.31953818544,6.55745092536]],[[1.69563043958,6.25076170066],[1.70009994721,6.24711901182],[1.70417862346,6.24697179839],[1.75874803806,6.25835802546],[1.77079143482,6.25995187823],[1.81712109941,6.27161341959],[1.84456614779,6.27656750346],[1.85767848509,6.27944518918],[1.88843363033,6.28325588467],[1.90481876292,6.28594870029],[1.90617692982,6.29435189983],[1.90083111364,6.29721233234],[1.89880903445,6.29953873942],[1.89404334121,6.30085024405],[1.89047742238,6.29969866569],[1.88747882146,6.29636150888],[1.88344050885,6.29622344016],[1.86969682855,6.29226563906],[1.8564007671,6.29198230539],[1.85206654725,6.28674503171],[1.84991419093,6.28906373821],[1.84691224958,6.29202989661],[1.8435272712,6.29332703219],[1.84040507404,6.29315437611],[1.83626738336,6.29129499924],[1.83409832485,6.28733273348],[1.83416513363,6.2851988527],[1.83229560117,6.28456355663],[1.82785949792,6.28644177291],[1.82182443779,6.2908379014],[1.81562903657,6.28997904337],[1.81211044063,6.29143113241],[1.80757635117,6.29570768815],[1.80471693522,6.29692955475],[1.80073513171,6.29709778253],[1.79775991387,6.29612383144],[1.79625448928,6.29491967121],[1.79490049792,6.28965143736],[1.79641483036,6.28608317469],[1.80097564333,6.28338261222],[1.79566657198,6.28013306439],[1.79156005874,6.28174455931],[1.78498607441,6.28122215216],[1.78092410036,6.27752986974],[1.77588226414,6.27550220232],[1.76744654171,6.27696318619],[1.75653444036,6.27496207997],[1.74833032171,6.27238985028],[1.74761769468,6.27726423691],[1.74572477914,6.27938486862],[1.73948038482,6.27984972411],[1.73680357955,6.27761398678],[1.73572127725,6.27891558552],[1.72901812928,6.27911038233],[1.72435487617,6.27422273126],[1.72449294765,6.2678607472],[1.72555966124,6.26683029328],[1.69933944056,6.26159387355],[1.69572953928,6.25725948175],[1.69563043958,6.25076170066]]],"best":true},{"id":"Bing","name":"Bing aerial imagery","type":"bing","template":"http://www.bing.com/maps/","scaleExtent":[0,22],"default":true,"description":"Satellite and aerial imagery.","icon":"data:image/png;base64,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"},{"id":"Bordeaux_2012","name":"Bordeaux - 2012","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/bordeaux_2012/{zoom}/{x}/{y}","endDate":"2012-01-01T00:00:00.000Z","startDate":"2012-01-01T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[-0.5992269128228901,45.041932410852176],[-0.542312560140509,45.02756808640373],[-0.509790072893434,45.006014839274926],[-0.4772675856463589,45.002062530648324],[-0.47066145542429677,44.97366975755017],[-0.4554165395272304,44.95101733966983],[-0.4645634890654702,44.91792155099146],[-0.47320227474047455,44.91936089493768],[-0.48793902677430534,44.90928473014602],[-0.49810230403901634,44.89056716544938],[-0.48946351836401203,44.87796537368711],[-0.46659614451841236,44.87076311041642],[-0.4762512579198878,44.84734952959955],[-0.4950533208596031,44.839783107079846],[-0.4909880099537187,44.83185531284354],[-0.46964512769782574,44.825368124499924],[-0.4970859763125452,44.80445999547304],[-0.5245268249272648,44.80013322923096],[-0.5102982367566694,44.76767213918935],[-0.5346901021919757,44.76514662270613],[-0.5621309508066953,44.75107386670688],[-0.5600982953537531,44.7416901252491],[-0.5728023919346418,44.741329181695264],[-0.5946534380537702,44.760095258488434],[-0.6342902193861429,44.73988538494593],[-0.650043299146445,44.7770516622697],[-0.6790086393508712,44.77488729214841],[-0.688155588889111,44.779215951267936],[-0.7150882736405949,44.76839369504671],[-0.7516760717935543,44.74710400814933],[-0.7633638406479719,44.755765166198834],[-0.7384638113494302,44.77560875786918],[-0.7420209583920789,44.785708331523864],[-0.7277923702214837,44.81239155746571],[-0.7399883029391369,44.828611809936305],[-0.7643801683744431,44.82933260413425],[-0.8030006219803447,44.821763815493405],[-0.8400965839965395,44.82753060173851],[-0.8390802562700685,44.840143435448645],[-0.875668054423028,44.8502317148731],[-0.8853231678245034,44.85851719417739],[-0.88684765941421,44.887686999278294],[-0.8660129410215526,44.88696693520083],[-0.8456863864921306,44.8966870397005],[-0.8334904537744775,44.92763642292355],[-0.818245537877411,44.92763642292355],[-0.8019842942538735,44.92223947466319],[-0.7984271472112248,44.94849985224626],[-0.7872475422200427,44.948140202171814],[-0.7557413826994388,44.97007473283782],[-0.7216944038626572,44.95784996320919],[-0.6957780468376442,44.930874348504034],[-0.6886637527523465,44.93447182951288],[-0.6713861814023379,44.93267311717697],[-0.6693535259493957,44.940946727451696],[-0.6251432698479031,44.95065770536977],[-0.6322575639332009,44.95892872413991],[-0.6312412362067297,44.96719855081702],[-0.6002432405493613,44.967558081456815],[-0.5514595096787488,44.97834295278015],[-0.5407880685508023,44.97726455691398],[-0.5545084928581621,44.99739126890938],[-0.5936371103272993,45.01751091397198],[-0.6078656984978945,45.0340324785955],[-0.5992269128228901,45.041932410852176]]],"terms_text":"Communauté urbaine de Bordeaux - 2012"},{"id":"Bordeaux_2016","name":"Bordeaux 2016","type":"tms","template":"http://tms.bordeaux.inria.fr/bdx2016/{zoom}/{x}/{y}.jpg","endDate":"2016-01-01T00:00:00.000Z","startDate":"2016-01-01T00:00:00.000Z","scaleExtent":[14,20],"polygon":[[[-0.5992269128228901,45.041932410852176],[-0.542312560140509,45.02756808640373],[-0.509790072893434,45.006014839274926],[-0.4772675856463589,45.002062530648324],[-0.47066145542429677,44.97366975755017],[-0.4554165395272304,44.95101733966983],[-0.4645634890654702,44.91792155099146],[-0.47320227474047455,44.91936089493768],[-0.48793902677430534,44.90928473014602],[-0.49810230403901634,44.89056716544938],[-0.48946351836401203,44.87796537368711],[-0.46659614451841236,44.87076311041642],[-0.4762512579198878,44.84734952959955],[-0.4950533208596031,44.839783107079846],[-0.4909880099537187,44.83185531284354],[-0.46964512769782574,44.825368124499924],[-0.4970859763125452,44.80445999547304],[-0.5245268249272648,44.80013322923096],[-0.5102982367566694,44.76767213918935],[-0.5346901021919757,44.76514662270613],[-0.5621309508066953,44.75107386670688],[-0.5600982953537531,44.7416901252491],[-0.5728023919346418,44.741329181695264],[-0.5946534380537702,44.760095258488434],[-0.6342902193861429,44.73988538494593],[-0.650043299146445,44.7770516622697],[-0.6790086393508712,44.77488729214841],[-0.688155588889111,44.779215951267936],[-0.7150882736405949,44.76839369504671],[-0.7516760717935543,44.74710400814933],[-0.7633638406479719,44.755765166198834],[-0.7384638113494302,44.77560875786918],[-0.7420209583920789,44.785708331523864],[-0.7277923702214837,44.81239155746571],[-0.7399883029391369,44.828611809936305],[-0.7643801683744431,44.82933260413425],[-0.8030006219803447,44.821763815493405],[-0.8400965839965395,44.82753060173851],[-0.8390802562700685,44.840143435448645],[-0.875668054423028,44.8502317148731],[-0.8853231678245034,44.85851719417739],[-0.88684765941421,44.887686999278294],[-0.8660129410215526,44.88696693520083],[-0.8456863864921306,44.8966870397005],[-0.8334904537744775,44.92763642292355],[-0.818245537877411,44.92763642292355],[-0.8019842942538735,44.92223947466319],[-0.7984271472112248,44.94849985224626],[-0.7872475422200427,44.948140202171814],[-0.7557413826994388,44.97007473283782],[-0.7216944038626572,44.95784996320919],[-0.6957780468376442,44.930874348504034],[-0.6886637527523465,44.93447182951288],[-0.6713861814023379,44.93267311717697],[-0.6693535259493957,44.940946727451696],[-0.6251432698479031,44.95065770536977],[-0.6322575639332009,44.95892872413991],[-0.6312412362067297,44.96719855081702],[-0.6002432405493613,44.967558081456815],[-0.5514595096787488,44.97834295278015],[-0.5407880685508023,44.97726455691398],[-0.5545084928581621,44.99739126890938],[-0.5936371103272993,45.01751091397198],[-0.6078656984978945,45.0340324785955],[-0.5992269128228901,45.041932410852176]]],"terms_text":"Bordeaux Métropole - 2016"},{"id":"branquinha_al","name":"Branquinha AL","type":"wms","template":"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?service=WMS&version=1.1.0&request=GetMap&layers=Branquinha&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-35.96968237108,-9.29279539826],[-35.97062650865,-9.20260556139],[-35.97726765817,-9.20263733363],[-35.98365131562,-9.20270087809],[-35.98765317147,-9.20265851512],[-35.99159065431,-9.20274324105],[-36.00498024171,-9.20283855771],[-36.01473275369,-9.20293387434],[-36.01651374048,-9.20295505581],[-36.01871315187,-9.20293387434],[-36.02487150377,-9.20285973919],[-36.02891627496,-9.20296564655],[-36.03307906335,-9.2028915114],[-36.03769246286,-9.20294446508],[-36.04581419175,-9.20299741875],[-36.05160776323,-9.20305037241],[-36.05456892198,-9.20300800948],[-36.06022301858,-9.20303978168],[-36.06190744584,-9.20303978168],[-36.06180015748,-9.21318555747],[-36.06167141145,-9.21805712081],[-36.06156412309,-9.21914791817],[-36.06162849611,-9.22156248675],[-36.06143537706,-9.22276976485],[-36.06139246171,-9.22716464584],[-36.06133881753,-9.23226899309],[-36.06140319055,-9.23391041686],[-36.06144610589,-9.23493762655],[-36.06130663102,-9.23646255088],[-36.0613280887,-9.23773331611],[-36.06142464822,-9.23904643537],[-36.06144610589,-9.24133379272],[-36.0613602752,-9.24229744345],[-36.06141391938,-9.24357877714],[-36.06139246171,-9.24530486392],[-36.06126371568,-9.24726390922],[-36.06123152917,-9.24948767715],[-36.06127444452,-9.25106548492],[-36.0612100715,-9.25517410549],[-36.06118861383,-9.25794845615],[-36.06107059663,-9.2594521027],[-36.0610920543,-9.26183462807],[-36.06105986779,-9.26492659247],[-36.06085601991,-9.27145986606],[-36.06083456224,-9.27510235154],[-36.06073800271,-9.28273662427],[-36.06080237573,-9.29234011263],[-36.06073800271,-9.29363185173],[-36.05477276986,-9.29356832368],[-36.04621115869,-9.29349420762],[-36.03940907663,-9.29348361961],[-36.03501025384,-9.29338832751],[-36.02978531068,-9.29340950353],[-36.02167431062,-9.29332479942],[-36.01278010553,-9.29328244736],[-36.0046798343,-9.29320833124],[-35.99678341096,-9.29314480312],[-35.98969165033,-9.29312362708],[-35.98483148759,-9.29304951092],[-35.98305050081,-9.29289069053],[-35.98173085397,-9.29294363067],[-35.97884479707,-9.29281657433],[-35.96968237108,-9.29279539826]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"British_Columbia_Mosaic","name":"British Columbia Mosaic","type":"tms","template":"http://{switch:a,b,c,d}.imagery.paulnorman.ca/tiles/bc_mosaic/{zoom}/{x}/{y}.png","endDate":"2013-06-01T00:00:00.000Z","startDate":"2009-01-01T00:00:00.000Z","scaleExtent":[9,20],"polygon":[[[-123.3176032,49.3272567],[-123.4405258,49.3268222],[-123.440717,49.3384429],[-123.4398375,49.3430357],[-123.4401258,49.3435398],[-123.4401106,49.3439946],[-123.4406265,49.3444493],[-123.4404747,49.3455762],[-123.4397768,49.3460606],[-123.4389726,49.3461298],[-123.4372904,49.3567236],[-123.4374774,49.3710843],[-123.4335292,49.3709446],[-123.4330357,49.373725],[-123.4332717,49.3751221],[-123.4322847,49.3761001],[-123.4317482,49.3791736],[-123.4314264,49.3795927],[-123.4307826,49.3823866],[-123.4313405,49.3827358],[-123.4312118,49.3838533],[-123.4300415,49.3845883],[-123.4189858,49.3847087],[-123.4192235,49.4135198],[-123.3972532,49.4135691],[-123.3972758,49.4243473],[-123.4006929,49.4243314],[-123.4007741,49.5703491],[-123.4000812,49.570345],[-123.4010761,49.5933838],[-123.3760399,49.5932848],[-123.3769811,49.6756063],[-123.3507288,49.6756396],[-123.3507969,49.7086751],[-123.332887,49.708722],[-123.3327888,49.7256288],[-123.3007111,49.7255625],[-123.3009164,49.7375384],[-123.2885986,49.737638],[-123.2887823,49.8249207],[-123.2997955,49.8249207],[-123.3011721,49.8497814],[-123.3218218,49.850669],[-123.3273284,49.8577696],[-123.3276726,49.9758852],[-123.3008279,49.9752212],[-123.3007204,50.0997002],[-123.2501716,50.100735],[-123.25091,50.2754901],[-123.0224338,50.2755598],[-123.0224879,50.3254853],[-123.0009318,50.3254689],[-123.0007778,50.3423899],[-122.9775023,50.3423408],[-122.9774766,50.3504306],[-122.9508137,50.3504961],[-122.950795,50.3711984],[-122.9325221,50.3711521],[-122.9321048,50.399793],[-122.8874234,50.3999748],[-122.8873385,50.4256108],[-122.6620152,50.4256959],[-122.6623083,50.3994506],[-122.5990316,50.3992413],[-122.5988274,50.3755206],[-122.5724832,50.3753706],[-122.5735621,50.2493891],[-122.5990415,50.2494643],[-122.5991504,50.2265663],[-122.6185016,50.2266359],[-122.6185741,50.2244081],[-122.6490609,50.2245126],[-122.6492181,50.1993528],[-122.7308575,50.1993758],[-122.7311583,50.1244287],[-122.7490352,50.1245109],[-122.7490541,50.0903032],[-122.7687806,50.0903435],[-122.7689801,49.9494546],[-122.999047,49.9494706],[-122.9991199,49.8754553],[-122.9775894,49.8754553],[-122.9778145,49.6995098],[-122.9992362,49.6994781],[-122.9992524,49.6516526],[-123.0221525,49.6516526],[-123.0221162,49.5995096],[-123.0491898,49.5994625],[-123.0491898,49.5940523],[-123.0664647,49.5940405],[-123.0663594,49.5451868],[-123.0699906,49.5451202],[-123.0699008,49.5413153],[-123.0706835,49.5392837],[-123.0708888,49.5379931],[-123.0711454,49.5368773],[-123.0711069,49.5358115],[-123.0713764,49.532822],[-123.0716458,49.5321141],[-123.07171,49.5313896],[-123.0720308,49.5304153],[-123.0739554,49.5303486],[-123.0748023,49.5294992],[-123.0748151,49.5288079],[-123.0743403,49.5280584],[-123.073532,49.5274588],[-123.0733652,49.5270423],[-123.0732882,49.5255932],[-123.0737116,49.5249602],[-123.0736218,49.5244938],[-123.0992583,49.5244854],[-123.0991649,49.4754502],[-123.071052,49.4755252],[-123.071088,49.4663034],[-123.0739204,49.4663054],[-123.07422,49.4505028],[-123.0746319,49.4500858],[-123.074651,49.449329],[-123.0745999,49.449018],[-123.0744619,49.4486927],[-123.0743336,49.4479899],[-123.0742427,49.4477688],[-123.0743061,49.4447473],[-123.0747103,49.4447556],[-123.0746384,49.4377306],[-122.9996506,49.4377363],[-122.9996506,49.4369214],[-122.8606163,49.4415314],[-122.8102616,49.4423972],[-122.8098984,49.3766739],[-122.4036093,49.3766617],[-122.4036341,49.3771944],[-122.264739,49.3773028],[-122.263542,49.2360088],[-122.2155742,49.236139],[-122.0580956,49.235878],[-121.9538274,49.2966525],[-121.9400911,49.3045389],[-121.9235761,49.3142257],[-121.8990871,49.3225436],[-121.8883447,49.3259752],[-121.8552982,49.3363575],[-121.832697,49.3441519],[-121.7671336,49.3654361],[-121.6736683,49.3654589],[-121.6404153,49.3743775],[-121.5961976,49.3860493],[-121.5861178,49.3879193],[-121.5213684,49.3994649],[-121.5117375,49.4038378],[-121.4679302,49.4229024],[-121.4416803,49.4345607],[-121.422429,49.4345788],[-121.3462885,49.3932312],[-121.3480144,49.3412388],[-121.5135035,49.320577],[-121.6031683,49.2771727],[-121.6584065,49.1856125],[-121.679953,49.1654109],[-121.7815793,49.0702559],[-121.8076228,49.0622471],[-121.9393997,49.0636219],[-121.9725524,49.0424179],[-121.9921394,49.0332869],[-122.0035289,49.0273413],[-122.0178564,49.0241067],[-122.1108634,48.9992786],[-122.1493067,48.9995305],[-122.1492705,48.9991498],[-122.1991447,48.9996019],[-122.199181,48.9991974],[-122.234365,48.9994829],[-122.234365,49.000173],[-122.3994722,49.0012385],[-122.4521338,49.0016326],[-122.4521338,49.000883],[-122.4584089,49.0009306],[-122.4584814,48.9993124],[-122.4992458,48.9995022],[-122.4992458,48.9992906],[-122.5492618,48.9995107],[-122.5492564,48.9993206],[-122.6580785,48.9994212],[-122.6581061,48.9954007],[-122.7067604,48.9955344],[-122.7519761,48.9956392],[-122.7922063,48.9957204],[-122.7921907,48.9994331],[-123.0350417,48.9995724],[-123.0350437,49.0000958],[-123.0397091,49.0000536],[-123.0397444,49.0001812],[-123.0485506,49.0001348],[-123.0485329,49.0004712],[-123.0557122,49.000448],[-123.0556324,49.0002284],[-123.0641365,49.0001293],[-123.064158,48.9999421],[-123.074899,48.9996928],[-123.0750717,49.0006218],[-123.0899573,49.0003726],[-123.109229,48.9999421],[-123.1271193,49.0003046],[-123.1359953,48.9998741],[-123.1362716,49.0005765],[-123.153851,48.9998061],[-123.1540533,49.0006806],[-123.1710015,49.0001274],[-123.2000916,48.9996849],[-123.2003446,49.0497785],[-123.2108845,49.0497232],[-123.2112218,49.051989],[-123.2070479,49.0520857],[-123.2078911,49.0607884],[-123.2191688,49.0600978],[-123.218958,49.0612719],[-123.2251766,49.0612719],[-123.2253874,49.0622388],[-123.2297088,49.0620316],[-123.2298142,49.068592],[-123.2331869,49.0687301],[-123.2335031,49.0705945],[-123.249313,49.0702493],[-123.2497346,49.0802606],[-123.2751358,49.0803986],[-123.2751358,49.0870947],[-123.299483,49.0873018],[-123.29944,49.080253],[-123.3254508,49.0803944],[-123.3254353,49.1154662],[-123.2750966,49.1503341],[-123.275181,49.1873267],[-123.2788067,49.1871063],[-123.278891,49.1910741],[-123.3004767,49.1910741],[-123.3004186,49.2622933],[-123.3126185,49.2622416],[-123.3125958,49.2714948],[-123.3154251,49.2714727],[-123.3156628,49.2818906],[-123.3174735,49.2818832],[-123.3174961,49.2918488],[-123.3190353,49.2918488],[-123.3190692,49.298602],[-123.3202349,49.2985651],[-123.3202786,49.3019749],[-123.3222679,49.3019605],[-123.3223943,49.3118263],[-123.3254002,49.3118086],[-123.3253898,49.3201721],[-123.3192695,49.3201957],[-123.3192242,49.3246748],[-123.3179437,49.3246596],[-123.3179861,49.3254065],[-123.3176032,49.3272567]]],"terms_url":"http://imagery.paulnorman.ca/tiles/about.html","terms_text":"Copyright Province of British Columbia, City of Surrey"},{"id":"Budapest_XI_2015","name":"Budapest district XI orthophoto 2015","type":"wms","template":"http://terinfo.ujbuda.hu/mapproxy/service?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=orto2015_20160304&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:4326","startDate":"2015-01-01T00:00:00.000Z","polygon":[[[19.047674,47.487889],[19.051565,47.489898],[19.064336,47.479203],[19.066498,47.476323],[19.067662,47.473428],[19.068374,47.470774],[19.06846,47.468765],[19.067223,47.465006],[19.056829,47.452588],[19.054896,47.449065],[19.05176,47.434991],[19.048625,47.428997],[19.043844,47.429684],[19.040234,47.429319],[19.035087,47.438181],[19.032205,47.437794],[19.025205,47.442004],[19.020705,47.445763],[19.019153,47.446579],[19.015447,47.447588],[19.01347,47.443613],[19.012663,47.44271],[19.011776,47.442473],[19.011903,47.441883],[19.009799,47.439443],[19.005705,47.431105],[19.000464,47.430974],[18.995338,47.428211],[18.975454,47.428179],[18.973426,47.429037],[18.973615,47.429982],[18.975482,47.430671],[18.977187,47.434024],[18.978227,47.438171],[18.977329,47.446572],[18.970039,47.449876],[18.968611,47.451422],[18.975678,47.455063],[18.975859,47.455563],[18.976247,47.455842],[18.97658,47.455945],[18.977633,47.455967],[18.980167,47.456049],[18.981619,47.460669],[18.977933,47.468574],[18.968669,47.476431],[18.977448,47.481943],[18.980348,47.481687],[18.985653,47.478204],[18.989075,47.478377],[18.991166,47.47898],[18.991766,47.481021],[18.992875,47.481817],[18.998357,47.482378],[18.999022,47.483001],[19.003999,47.481886],[19.004156,47.483992],[19.010272,47.485348],[19.012373,47.484043],[19.0138,47.483506],[19.016739,47.484651],[19.016303,47.485392],[19.016889,47.485946],[19.018085,47.486054],[19.021081,47.484921],[19.021239,47.486124],[19.023013,47.487414],[19.026373,47.488854],[19.029954,47.489037],[19.031349,47.488554],[19.031889,47.487587],[19.032855,47.48712],[19.03364,47.487018],[19.035138,47.487249],[19.035851,47.487292],[19.03616,47.487507],[19.036651,47.487668],[19.037475,47.487738],[19.038474,47.487368],[19.039179,47.486793],[19.041049,47.486492],[19.04181,47.487373],[19.04387,47.488104],[19.045423,47.488169],[19.046945,47.488104],[19.047674,47.487889]]],"terms_url":"http://terinfo.ujbuda.hu/","terms_text":"Budapest XI. kerület önkormányzata","description":"5 cm resolution bald image"},{"id":"Budapest_XI_2017","name":"Budapest district XI orthophoto 2017","type":"wms","template":"http://terinfo.ujbuda.hu/mapproxy/service?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=orto_2017&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:4326","startDate":"2017-03-01T00:00:00.000Z","polygon":[[[19.047674,47.487889],[19.051565,47.489898],[19.064336,47.479203],[19.066498,47.476323],[19.067662,47.473428],[19.068374,47.470774],[19.06846,47.468765],[19.067223,47.465006],[19.056829,47.452588],[19.054896,47.449065],[19.05176,47.434991],[19.048625,47.428997],[19.043844,47.429684],[19.040234,47.429319],[19.035087,47.438181],[19.032205,47.437794],[19.025205,47.442004],[19.020705,47.445763],[19.019153,47.446579],[19.015447,47.447588],[19.01347,47.443613],[19.012663,47.44271],[19.011776,47.442473],[19.011903,47.441883],[19.009799,47.439443],[19.005705,47.431105],[19.000464,47.430974],[18.995338,47.428211],[18.975454,47.428179],[18.973426,47.429037],[18.973615,47.429982],[18.975482,47.430671],[18.977187,47.434024],[18.978227,47.438171],[18.977329,47.446572],[18.970039,47.449876],[18.968611,47.451422],[18.975678,47.455063],[18.975859,47.455563],[18.976247,47.455842],[18.97658,47.455945],[18.977633,47.455967],[18.980167,47.456049],[18.981619,47.460669],[18.977933,47.468574],[18.968669,47.476431],[18.977448,47.481943],[18.980348,47.481687],[18.985653,47.478204],[18.989075,47.478377],[18.991166,47.47898],[18.991766,47.481021],[18.992875,47.481817],[18.998357,47.482378],[18.999022,47.483001],[19.003999,47.481886],[19.004156,47.483992],[19.010272,47.485348],[19.012373,47.484043],[19.0138,47.483506],[19.016739,47.484651],[19.016303,47.485392],[19.016889,47.485946],[19.018085,47.486054],[19.021081,47.484921],[19.021239,47.486124],[19.023013,47.487414],[19.026373,47.488854],[19.029954,47.489037],[19.031349,47.488554],[19.031889,47.487587],[19.032855,47.48712],[19.03364,47.487018],[19.035138,47.487249],[19.035851,47.487292],[19.03616,47.487507],[19.036651,47.487668],[19.037475,47.487738],[19.038474,47.487368],[19.039179,47.486793],[19.041049,47.486492],[19.04181,47.487373],[19.04387,47.488104],[19.045423,47.488169],[19.046945,47.488104],[19.047674,47.487889]]],"terms_url":"http://terinfo.ujbuda.hu/","terms_text":"Budapest XI. kerület önkormányzata","best":true,"description":"5 cm resolution bald image"},{"id":"Cadastre","name":"Cadastre","type":"tms","template":"http://tms.cadastre.openstreetmap.fr/*/tout/{zoom}/{x}/{y}.png","scaleExtent":[12,22],"polygon":[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.358164,51.32937],[2.548804,51.09759],[2.570482,51.07409],[2.587412,51.01763],[2.598448,51.0051],[2.615575,50.99749],[2.639859,50.95766],[2.642247,50.94578],[2.624519,50.9256],[2.61962,50.91067],[2.623964,50.86071],[2.627811,50.85054],[2.637859,50.83696],[2.651102,50.82906],[2.732666,50.81738],[2.79995,50.73795],[2.816552,50.73092],[2.852648,50.73335],[2.890719,50.7162],[2.904925,50.71536],[2.916096,50.72418],[2.935084,50.75592],[3.007184,50.78377],[3.082183,50.78749],[3.092439,50.79092],[3.114119,50.80566],[3.148768,50.80195],[3.215401,50.73111],[3.221487,50.7267],[3.270507,50.70375],[3.275448,50.67757],[3.265761,50.6604],[3.265877,50.64054],[3.289219,50.60028],[3.292195,50.55037],[3.305598,50.53267],[3.375514,50.50839],[3.389804,50.50884],[3.474798,50.54445],[3.52173,50.53459],[3.532662,50.51873],[3.547788,50.51012],[3.615234,50.50558],[3.673778,50.45642],[3.684152,50.35277],[3.690097,50.34044],[3.702583,50.33482],[3.715758,50.33854],[3.749349,50.36279],[3.841089,50.36558],[3.901887,50.3436],[3.913173,50.34291],[4.026717,50.36904],[4.13761,50.29984],[4.143881,50.29727],[4.214438,50.28167],[4.229037,50.26664],[4.230782,50.25233],[4.170843,50.18579],[4.166015,50.16888],[4.176401,50.1547],[4.211948,50.13602],[4.240742,50.07102],[4.231934,50.05551],[4.181645,50.03436],[4.17177,50.02537],[4.169755,50.01217],[4.176498,50.00065],[4.206331,49.97546],[4.221639,49.97089],[4.308774,49.98145],[4.445423,49.9523],[4.454691,49.95251],[4.658098,50.00609],[4.669358,50.01392],[4.672929,50.02716],[4.66924,50.06972],[4.695168,50.10472],[4.831227,50.17941],[4.881497,50.16436],[4.904786,50.14451],[4.904264,50.12639],[4.880762,50.0815],[4.862772,50.0745],[4.851037,50.06216],[4.843307,50.03884],[4.843307,50.03883],[4.843295,50.03881],[4.826781,49.989],[4.826618,49.97692],[4.833433,49.96696],[4.896542,49.91753],[4.897546,49.89424],[4.879134,49.86942],[4.876249,49.85111],[4.889238,49.81266],[4.897691,49.80204],[4.910979,49.79926],[4.995343,49.81116],[5.01867,49.79272],[5.026862,49.78886],[5.099438,49.77323],[5.134584,49.73462],[5.141201,49.72984],[5.187609,49.70906],[5.196025,49.70732],[5.281572,49.70836],[5.333628,49.67308],[5.343996,49.65049],[5.354398,49.64041],[5.431412,49.60791],[5.482051,49.52815],[5.492943,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.607602,49.53761],[5.640997,49.56095],[5.706759,49.55267],[5.715782,49.55361],[5.775261,49.57414],[5.839902,49.55321],[5.861263,49.52038],[5.875997,49.5114],[5.975162,49.50129],[5.998015,49.47317],[6.016266,49.46597],[6.08635,49.47562],[6.093186,49.47787],[6.173966,49.52187],[6.246435,49.52511],[6.333999,49.48235],[6.344229,49.48037],[6.435145,49.487],[6.5451,49.44384],[6.606389,49.37868],[6.604972,49.33739],[6.616267,49.31869],[6.670133,49.29269],[6.729955,49.22917],[6.743276,49.19086],[6.760259,49.17752],[6.809042,49.17284],[6.824733,49.17826],[6.830928,49.19366],[6.829819,49.21802],[6.851186,49.23136],[6.884528,49.2239],[6.893221,49.22389],[6.937527,49.23369],[7.040549,49.19794],[7.046296,49.17503],[7.054777,49.16313],[7.069081,49.16018],[7.104945,49.16634],[7.143153,49.14159],[7.153499,49.13839],[7.286827,49.13488],[7.29893,49.13856],[7.360948,49.18259],[7.450116,49.19517],[7.50113,49.17672],[7.543788,49.10572],[7.557903,49.09626],[7.629604,49.08527],[7.647217,49.06722],[7.661197,49.06119],[7.754008,49.05963],[7.760731,49.06067],[7.802913,49.07489],[7.855253,49.05329],[7.867297,49.05227],[7.93826,49.06832],[8.080685,49.00688],[8.222498,48.98787],[8.23704,48.97683],[8.235894,48.95817],[8.208878,48.94863],[8.200888,48.94339],[8.158243,48.89753],[8.100873,48.7993],[7.990709,48.74478],[7.985341,48.7409],[7.904217,48.65865],[7.856051,48.63606],[7.848405,48.62977],[7.818424,48.58883],[7.81456,48.57704],[7.814491,48.50968],[7.785465,48.48337],[7.780554,48.47652],[7.745059,48.39484],[7.743573,48.38427],[7.751593,48.32322],[7.71085,48.29841],[7.702411,48.28803],[7.676613,48.21555],[7.596051,48.11698],[7.591652,48.10648],[7.585216,48.04694],[7.591268,48.03035],[7.624373,47.99865],[7.632049,47.97081],[7.575545,47.87436],[7.572802,47.86435],[7.572673,47.83631],[7.545808,47.78793],[7.544185,47.77232],[7.557581,47.72899],[7.535257,47.6989],[7.531364,47.68564],[7.536998,47.67302],[7.600164,47.60822],[7.589675,47.56755],[7.554237,47.55128],[7.54511,47.54283],[7.512557,47.48439],[7.387471,47.42111],[7.326527,47.4273],[7.244354,47.40939],[7.167083,47.4335],[7.152115,47.47612],[7.14279,47.48707],[7.128529,47.48893],[7.080105,47.47718],[7.035575,47.48695],[7.021019,47.48458],[7.012048,47.47287],[7.002995,47.44095],[6.955099,47.40808],[6.947157,47.39698],[6.94818,47.38337],[6.957691,47.37359],[6.971263,47.37218],[7.018004,47.38386],[7.05623,47.37035],[7.070073,47.35005],[7.05958,47.32257],[6.974243,47.27856],[6.963469,47.26233],[6.961339,47.23479],[6.89443,47.19393],[6.889128,47.18922],[6.855453,47.14636],[6.769073,47.10751],[6.760108,47.09953],[6.725613,47.0418],[6.623551,46.9811],[6.481204,46.9445],[6.46892,46.93522],[6.466862,46.91997],[6.475476,46.88771],[6.453496,46.8239],[6.45644,46.80534],[6.467224,46.79104],[6.460984,46.76887],[6.15817,46.59343],[6.148724,46.58069],[6.15152,46.56508],[6.165489,46.54399],[6.158111,46.52456],[6.101739,46.46979],[6.095717,46.45418],[6.097044,46.43317],[6.108289,46.41643],[6.166216,46.38839],[6.178173,46.36922],[6.137482,46.31297],[6.133713,46.30227],[6.130383,46.23737],[6.110298,46.22344],[6.088648,46.23081],[6.077173,46.23123],[6.018573,46.21601],[6.006813,46.20752],[6.003882,46.19332],[6.007866,46.16977],[6.017834,46.15564],[6.03509,46.15456],[6.055639,46.16288],[6.124683,46.15415],[6.137776,46.15702],[6.240258,46.22094],[6.249058,46.23299],[6.247073,46.24777],[6.21148,46.31057],[6.212186,46.32485],[6.239462,46.36705],[6.316478,46.41557],[6.410826,46.42495],[6.417483,46.42682],[6.504978,46.46871],[6.630473,46.47435],[6.746646,46.45695],[6.822442,46.42925],[6.818324,46.38181],[6.804843,46.36179],[6.801885,46.34639],[6.810949,46.33359],[6.864911,46.30038],[6.875036,46.28007],[6.860917,46.2439],[6.826978,46.21188],[6.820746,46.19862],[6.818627,46.16592],[6.822593,46.15261],[6.834266,46.14509],[6.903819,46.12971],[6.904911,46.09595],[6.909323,46.08406],[6.920006,46.07721],[6.948976,46.0699],[7.015561,46.00883],[7.051911,45.93066],[7.045335,45.92217],[7.044967,45.92064],[7.043936,45.92036],[6.995822,45.85822],[6.940965,45.83551],[6.843757,45.82387],[6.831016,45.81711],[6.826141,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.841405,45.71373],[6.907294,45.69124],[6.92419,45.66935],[6.942468,45.66172],[6.971313,45.66528],[7.00597,45.64945],[7.011511,45.63652],[6.997797,45.60877],[6.996431,45.59465],[7.015803,45.52354],[7.027743,45.5102],[7.107198,45.47877],[7.122797,45.44924],[7.13304,45.44001],[7.185604,45.41894],[7.19515,45.40409],[7.170749,45.35069],[7.142319,45.32298],[7.136488,45.30576],[7.14458,45.25048],[7.084166,45.20279],[6.992792,45.19823],[6.981064,45.19368],[6.900091,45.12689],[6.85843,45.11699],[6.782826,45.14228],[6.770557,45.14242],[6.677507,45.11356],[6.665295,45.10289],[6.665008,45.08667],[6.68237,45.04558],[6.696016,45.03395],[6.757442,45.01884],[6.783751,44.9146],[6.794195,44.90161],[6.866981,44.86519],[6.879801,44.86346],[6.936325,44.87461],[7.017954,44.84402],[7.034535,44.82282],[7.037114,44.75009],[7.049604,44.73226],[7.072236,44.72311],[7.086508,44.6968],[7.086656,44.68085],[7.07671,44.67134],[6.990071,44.67203],[6.974128,44.66431],[6.970564,44.64696],[6.978189,44.61784],[6.94659,44.57124],[6.882347,44.53479],[6.872327,44.5195],[6.878925,44.50245],[6.958945,44.43129],[6.958723,44.42908],[6.921668,44.41436],[6.912225,44.40659],[6.909075,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.999091,44.29414],[7.011806,44.256],[7.019835,44.24558],[7.032595,44.2424],[7.073117,44.2461],[7.165097,44.22112],[7.245331,44.18544],[7.260526,44.16682],[7.275371,44.15947],[7.338779,44.1574],[7.362775,44.13834],[7.377763,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.564785,44.15817],[7.605476,44.1634],[7.616198,44.16827],[7.639891,44.18928],[7.686079,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.694448,44.12276],[7.727862,44.08615],[7.724032,44.05704],[7.686028,44.02371],[7.680769,44.0164],[7.660161,43.9672],[7.596244,43.94466],[7.584187,43.93287],[7.568576,43.89159],[7.527096,43.87434],[7.516489,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.369681,41.35052],[9.273114,41.29196],[8.941857,41.27688],[5.8,41.64],[3.173576,42.41768],[3.160814,42.42757],[3.094399,42.41457],[3.034016,42.45331],[3.022142,42.45645],[2.878221,42.4487],[2.870188,42.44653],[2.784238,42.40256],[2.741304,42.41128],[2.729276,42.40998],[2.693308,42.39417],[2.683779,42.3854],[2.681621,42.37263],[2.685852,42.34679],[2.66719,42.33008],[2.581057,42.34418],[2.567769,42.34173],[2.533803,42.32197],[2.477948,42.32986],[2.419327,42.37658],[2.41222,42.38021],[2.267193,42.42055],[2.259731,42.42117],[2.206944,42.41558],[2.206525,42.41526],[2.205257,42.41541],[2.160278,42.41065],[2.148808,42.40545],[2.093931,42.35474],[2.008614,42.33818],[1.964998,42.36473],[1.930762,42.42442],[1.920889,42.43302],[1.884665,42.44761],[1.884588,42.44762],[1.884444,42.4477],[1.827736,42.47056],[1.725668,42.48452],[1.715606,42.50125],[1.727195,42.56103],[1.724794,42.57499],[1.710109,42.59992],[1.69377,42.60975],[1.602827,42.61382],[1.560687,42.6392],[1.546365,42.64166],[1.504443,42.6331],[1.492096,42.62502],[1.472384,42.59703],[1.437922,42.59264],[1.419356,42.60643],[1.38032,42.67415],[1.373353,42.68127],[1.333134,42.70563],[1.323642,42.7085],[1.232212,42.71248],[1.165543,42.69928],[1.085465,42.76635],[1.075637,42.77079],[0.9593748,42.78852],[0.9507323,42.78794],[0.9226515,42.7797],[0.8460624,42.8157],[0.7151135,42.8464],[0.7001699,42.84402],[0.6911674,42.83186],[0.6740937,42.76479],[0.6747382,42.75286],[0.6919171,42.70684],[0.6689955,42.67901],[0.4302428,42.67863],[0.3715037,42.70308],[0.3595376,42.70415],[0.3491168,42.69817],[0.3256688,42.67274],[0.2957095,42.66388],[0.2459353,42.70175],[0.2397249,42.70494],[0.189669,42.72039],[0.1791886,42.72075],[-0.01993262,42.67389],[-0.06725834,42.6848],[-0.1694885,42.77157],[-0.2998662,42.82697],[-0.3168349,42.82635],[-0.3920752,42.78766],[-0.4435404,42.78453],[-0.488418,42.80255],[-0.508683,42.79935],[-0.5449894,42.76906],[-0.5672068,42.76937],[-0.6744552,42.86392],[-0.6809365,42.86775],[-0.7337233,42.88666],[-0.747598,42.93879],[-0.757105,42.95107],[-0.7725328,42.95284],[-0.8211401,42.93865],[-0.9450847,42.94192],[-1.023131,42.98206],[-1.108517,43.00409],[-1.115597,43.00461],[-1.147753,43.00124],[-1.158452,43.01452],[-1.167362,43.02083],[-1.216216,43.0381],[-1.226121,43.03898],[-1.262362,43.03303],[-1.306428,43.05531],[-1.319918,43.05696],[-1.331346,43.0496],[-1.354196,43.0197],[-1.438684,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.476407,43.10248],[-1.434786,43.13087],[-1.427318,43.1404],[-1.394112,43.22935],[-1.395313,43.24596],[-1.408677,43.25591],[-1.526287,43.28099],[-1.546257,43.2737],[-1.571485,43.2412],[-1.610526,43.24223],[-1.650003,43.29323],[-1.669527,43.30065],[-1.733594,43.28856],[-1.756061,43.31966],[-1.762973,43.32565],[-1.791557,43.34067],[-1.800991,43.37017],[-1.785091,43.39037],[-1.783502,43.39686],[-2.7,43.9]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_Cadastre_Fran%C3%A7ais/Conditions_d%27utilisation","terms_text":"cadastre-dgi-fr source : Direction Générale des Impôts - Cadastre. Mise à jour : 2015","description":"French land registry","icon":"https://svn.openstreetmap.org/applications/editors/josm/plugins/cadastre-fr/images/cadastre_small.png"},{"id":"lu.geoportail.opendata.cadastre","name":"Cadastre geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/cadastre/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/plan-cadastral-numerise-pcn-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"cajueiro_al","name":"Cajueiro AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Cajueiro&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.10752645677,-9.43884254591],[-36.10751572793,-9.43420690643],[-36.10766593164,-9.42959237236],[-36.10779467767,-9.42361243708],[-36.10768738931,-9.41927295015],[-36.10780540651,-9.41390672873],[-36.10803071206,-9.41094309933],[-36.10809508508,-9.40965179571],[-36.10810581392,-9.40747138685],[-36.1081594581,-9.40693157477],[-36.1081916446,-9.4041795785],[-36.10810581392,-9.40175568673],[-36.10817018693,-9.40001978874],[-36.10826674646,-9.39952230418],[-36.10826674646,-9.39646328763],[-36.10833111947,-9.39474853296],[-36.10832039064,-9.39272680513],[-36.10836330598,-9.39039809877],[-36.10840622133,-9.38447041196],[-36.10847059434,-9.38165472521],[-36.10845986551,-9.37767461773],[-36.10835257714,-9.37572688892],[-36.10844913667,-9.37431901292],[-36.10849205201,-9.37233950842],[-36.10844913667,-9.36970368011],[-36.10867444223,-9.36278056588],[-36.10863152688,-9.36102330087],[-36.10872808641,-9.35927661299],[-36.10873881524,-9.35736053922],[-36.10854569619,-9.35478811418],[-36.1086958999,-9.35230035993],[-36.10870662873,-9.34996079609],[-36.10872808641,-9.34893392374],[-36.11268702691,-9.34908213231],[-36.11725751107,-9.3491244776],[-36.12137738412,-9.34905037333],[-36.12806144899,-9.34910330495],[-36.1321705932,-9.34906095966],[-36.13694492524,-9.34914565024],[-36.14024940675,-9.34913506392],[-36.14134374803,-9.34931503136],[-36.14458385652,-9.34915623657],[-36.14683691209,-9.34913506392],[-36.14842477983,-9.34905037333],[-36.1527592296,-9.34907154598],[-36.15400377458,-9.34921975449],[-36.15626755899,-9.34923034081],[-36.160258686,-9.34920916817],[-36.16085950082,-9.34929385872],[-36.16599861329,-9.34932561767],[-36.16937819665,-9.34942089451],[-36.17175999826,-9.34935737662],[-36.17627683824,-9.34945265345],[-36.18027869409,-9.34936796294],[-36.1822742576,-9.34946323976],[-36.18826094812,-9.34937854925],[-36.19038525766,-9.34945265345],[-36.19353953546,-9.34946323976],[-36.19552437013,-9.3494103082],[-36.19918290323,-9.34950558501],[-36.19925800508,-9.35146404706],[-36.19912925904,-9.35234270483],[-36.19911853021,-9.35352836],[-36.19919363206,-9.35646072192],[-36.19921508973,-9.35770987942],[-36.19930092042,-9.35832387044],[-36.19933310693,-9.3611185745],[-36.19921508973,-9.36177490326],[-36.19918290323,-9.36257943359],[-36.19931164926,-9.36399794306],[-36.19925800508,-9.36499301341],[-36.19921508973,-9.36562816321],[-36.19927946275,-9.36660205731],[-36.19917217439,-9.36795703586],[-36.19917217439,-9.36867686607],[-36.19921508973,-9.36911088062],[-36.19911853021,-9.37016945042],[-36.19887176698,-9.37149265813],[-36.19886103814,-9.37263590554],[-36.19902197068,-9.37321811341],[-36.19915071672,-9.37503882993],[-36.19910780137,-9.37688070785],[-36.19895759767,-9.37747349407],[-36.19898978418,-9.37914599257],[-36.19917217439,-9.38053267826],[-36.19919363206,-9.38124189704],[-36.19925800508,-9.38174999318],[-36.19927946275,-9.38302023029],[-36.19912925904,-9.38374002925],[-36.19907561486,-9.38592058756],[-36.19878593629,-9.38786825912],[-36.19880739396,-9.3893501758],[-36.19902197068,-9.39091676655],[-36.19904342836,-9.39199643982],[-36.19898978418,-9.39347833885],[-36.19879666513,-9.39450507945],[-36.19866791909,-9.39704545549],[-36.19845334237,-9.39949054982],[-36.19863573259,-9.40313169724],[-36.19865719026,-9.40476173338],[-36.19864646142,-9.40836048727],[-36.19875374978,-9.40901672659],[-36.19857135957,-9.41058322831],[-36.19859281724,-9.4127318644],[-36.19874302095,-9.41445711425],[-36.19867864793,-9.41711377049],[-36.19860354608,-9.41901892972],[-36.19846407121,-9.41965398046],[-36.19849625772,-9.42235293308],[-36.19871083444,-9.42428981548],[-36.19858208841,-9.42696756397],[-36.19839969819,-9.42894675602],[-36.19857135957,-9.43412223664],[-36.19871083444,-9.43470434105],[-36.19864646142,-9.43595321629],[-36.19857135957,-9.43626014256],[-36.19859281724,-9.43667290505],[-36.19876447862,-9.43748784493],[-36.19889322465,-9.43905421746],[-36.1988181228,-9.43995382008],[-36.1784977073,-9.43977389974],[-36.17717806047,-9.43967864776],[-36.17265049165,-9.43966806421],[-36.17098752206,-9.43971039843],[-36.16396013444,-9.43962572998],[-36.15386429971,-9.43949872728],[-36.13983098214,-9.43929763957],[-36.12874809449,-9.43912830247],[-36.11497226899,-9.43891663097],[-36.10752645677,-9.43884254591]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"osm-cambodia_laos_thailand_vietnam-bilingual","name":"Cambodia, Laos, Thailand, Vietnam, Malaysia, Myanmar bilingual","type":"tms","template":"http://{switch:a,b,c,d}.tile.osm-tools.org/osm/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"polygon":[[[92.1023798,20.8135629],[93.5690546,24.0975527],[94.1733026,23.9269484],[95.1950312,26.707274],[96.7550898,27.5286657],[97.5845575,28.5805966],[98.738122,27.514051],[98.7436151,25.8799151],[97.6779413,24.7577376],[97.9635858,24.042382],[98.8205194,24.1627239],[99.5236444,22.9593356],[100.3695917,21.5051376],[101.7923212,22.4830518],[105.3628778,23.3331079],[106.8185663,22.8480137],[108.1973505,21.3619661],[107.4389505,18.8539792],[117.1453714,7.4656173],[119.6172953,5.2875389],[118.1231546,4.0502277],[117.2552347,4.3624942],[115.8654642,4.3460623],[115.5084085,3.0249771],[114.552598,1.5100953],[113.5418558,1.2574836],[112.9650736,1.5704982],[112.2454691,1.5100953],[111.67418,1.0158321],[110.4546976,0.9004918],[109.4988871,1.9218969],[103.2256937,1.1256762],[100.4626322,3.2388904],[97.6721048,8.0588831],[93.892808,15.9398659],[92.1023798,20.8135629]]],"terms_url":"http://www.osm-tools.org/","terms_text":"© osm-tools.org & OpenStreetMap contributors, CC-BY-SA"},{"id":"campo_alegre_al","name":"Campo Alegre AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Campo%20Alegre&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.30642834848,-9.82332496055],[-36.30602585634,-9.78597356977],[-36.30602065271,-9.78263262201],[-36.30608502572,-9.7816810657],[-36.30604211038,-9.78081408979],[-36.30590263551,-9.77530556809],[-36.30585972017,-9.76496494896],[-36.3054520244,-9.73335957439],[-36.39633599466,-9.73248189831],[-36.39627162164,-9.73744126654],[-36.39635745233,-9.74336280376],[-36.39644328302,-9.7553535947],[-36.39660421556,-9.75855741026],[-36.3966471309,-9.75979451892],[-36.39655057138,-9.76243789809],[-36.39661494439,-9.76489093519],[-36.39658275789,-9.76647694093],[-36.39661494439,-9.76683643452],[-36.39659348672,-9.76959606352],[-36.39670077508,-9.77896382877],[-36.39675441926,-9.78464145418],[-36.39684024995,-9.7906678778],[-36.39692608064,-9.79681048826],[-36.397033369,-9.80298470156],[-36.39719430154,-9.82033320249],[-36.39721575921,-9.82234180629],[-36.39392200654,-9.82233123473],[-36.35375324434,-9.8227858118],[-36.34821716493,-9.82285981267],[-36.31697479432,-9.82316638748],[-36.3119107837,-9.82324038826],[-36.30878869241,-9.82327210287],[-36.30642834848,-9.82332496055]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"Geneve-SITG-2011","name":"Canton de Génève 5cm (SITG 2011)","type":"wms","template":"http://etat.geneve.ch/ags2/services/Orthophotos_2011/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2011-01-01T00:00:00.000Z","startDate":"2011-01-01T00:00:00.000Z","polygon":[[[6.126755,46.140923],[6.137654,46.141979],[6.143259,46.146112],[6.146397,46.145461],[6.150278,46.150561],[6.179239,46.16006],[6.19068,46.167201],[6.188283,46.176608],[6.189304,46.180941],[6.199386,46.183905],[6.207892,46.192481],[6.213824,46.193335],[6.219192,46.198334],[6.223522,46.199301],[6.223947,46.201286],[6.229577,46.202887],[6.234054,46.206246],[6.243581,46.204849],[6.250976,46.205426],[6.257218,46.210407],[6.27856,46.216044],[6.296258,46.225677],[6.311314,46.243494],[6.311526,46.251427],[6.308503,46.253043],[6.311779,46.25767],[6.309369,46.258698],[6.303094,46.257032],[6.297211,46.258037],[6.296141,46.259574],[6.298698,46.264455],[6.297309,46.266398],[6.29208,46.265404],[6.28949,46.261738],[6.283231,46.257845],[6.283958,46.256179],[6.268083,46.25019],[6.262682,46.253393],[6.263327,46.256461],[6.251851,46.26392],[6.240021,46.278615],[6.240599,46.28224],[6.243996,46.285534],[6.25049,46.287004],[6.255025,46.291635],[6.251397,46.295795],[6.250494,46.303987],[6.245616,46.306228],[6.240885,46.306036],[6.241482,46.299003],[6.235141,46.290823],[6.22845,46.287853],[6.21,46.267619],[6.201241,46.266946],[6.197483,46.26476],[6.193593,46.258897],[6.191105,46.246299],[6.193034,46.24105],[6.190084,46.234562],[6.181586,46.22644],[6.175418,46.217192],[6.164591,46.210825],[6.157743,46.212251],[6.154675,46.214794],[6.153646,46.218593],[6.155639,46.222746],[6.151095,46.227975],[6.155884,46.246685],[6.153735,46.25231],[6.163857,46.263563],[6.168381,46.263711],[6.172824,46.27372],[6.173199,46.276216],[6.169149,46.282836],[6.171033,46.286509],[6.173558,46.28752],[6.172275,46.29639],[6.154827,46.301212],[6.142821,46.306545],[6.126372,46.319634],[6.115664,46.316386],[6.010923,46.247101],[5.979715,46.219401],[5.972945,46.215415],[5.9687,46.208214],[5.972311,46.20425],[5.965603,46.20153],[5.963283,46.197831],[5.981455,46.191643],[5.983876,46.189335],[5.990526,46.188139],[5.994304,46.183363],[5.990734,46.180491],[5.988186,46.174182],[5.983853,46.176298],[5.980843,46.17465],[5.979577,46.168441],[5.964504,46.147603],[5.963805,46.143652],[5.965833,46.139681],[5.956025,46.134032],[5.956731,46.129325],[5.974342,46.132072],[5.983657,46.138085],[5.985233,46.143589],[5.988073,46.14294],[5.994177,46.144445],[6.003944,46.142112],[6.017712,46.143144],[6.030847,46.13943],[6.036377,46.134682],[6.040866,46.140179],[6.043575,46.141312],[6.046297,46.140367],[6.049486,46.142973],[6.050433,46.147997],[6.053703,46.151663],[6.075433,46.149173],[6.092211,46.152187],[6.098635,46.144226],[6.12516,46.141824],[6.126755,46.140923]],[[6.1883445,46.3490083],[6.1869587,46.3486226],[6.1819521,46.35015],[6.1796053,46.3520013],[6.1714248,46.3544387],[6.1702178,46.3591128],[6.1741516,46.3603622],[6.1727212,46.3618892],[6.1734811,46.3628764],[6.1799852,46.3654676],[6.1876963,46.3613185],[6.1944686,46.3617504],[6.1990506,46.3608558],[6.2011339,46.3563388],[6.202582,46.3556728],[6.2079112,46.3558251],[6.213743,46.3537853],[6.2124652,46.3508462],[6.2084644,46.3466497],[6.2085985,46.3399069],[6.2065869,46.3379163],[6.2049329,46.3386107],[6.2034801,46.3379318],[6.1918129,46.3433324],[6.1931763,46.3478686],[6.1907624,46.3476988],[6.1883445,46.3490083]],[[6.181818,46.3428059],[6.180164,46.3431762],[6.1752021,46.3453209],[6.173414,46.3439785],[6.1732352,46.3405377],[6.1714024,46.3395192],[6.1658818,46.3425436],[6.1656359,46.3433922],[6.1709107,46.3505357],[6.173414,46.3502888],[6.1745763,46.3519241],[6.1758726,46.3520476],[6.1857942,46.345934],[6.181818,46.3428059]]],"terms_text":"Orthophotos du SITG 2011"},{"id":"Canvec","name":"Canvec","type":"wms","template":"http://wms.sst-sw.rncan.gc.ca/wms/toporama_fr?REQUEST=GetMap&SERVICE=wms&VERSION=1.1.1&EXCEPTIONS=application/vnd.ogc.se_inimage&SRS={proj}&FORMAT=image/png&transparent=true&layers=SCW-Toporama&WIDTH={width}&height={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.1923701,48.6550408],[-122.9958159,48.5106543],[-122.4868966,48.4098005],[-122.3291531,48.4527983],[-122.229391,48.5064943],[-122.1790836,48.5296509],[-122.1841996,48.566905],[-121.7783298,48.5759321],[-121.6657777,48.4279093],[-121.3306793,48.3571354],[-121.0271296,48.3497692],[-121.0305403,48.4940645],[-120.6979999,48.5149675],[-120.510413,48.8718034],[-119.9757904,48.8813368],[-119.9544737,48.5149675],[-119.907577,48.2942056],[-119.7319275,48.1550316],[-119.7438648,48.0741943],[-119.622786,48.1095051],[-119.602322,48.1470674],[-119.2527283,48.1624259],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{"id":"capela_al","name":"Capela AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Capela&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.03320780938,-9.4574082918],[-36.03321853822,-9.45581025359],[-36.03335801309,-9.45482602768],[-36.03340092843,-9.45291048318],[-36.0332721824,-9.45140767284],[-36.03335801309,-9.44286692894],[-36.03349748796,-9.43821017639],[-36.03352967447,-9.42881181147],[-36.03362623399,-9.42027050777],[-36.03389445489,-9.41091399212],[-36.03389445489,-9.40031880838],[-36.03401247209,-9.38880239663],[-36.03413048928,-9.38527753599],[-36.03428069299,-9.38265239127],[-36.03417340463,-9.37849234301],[-36.03444162553,-9.3668799342],[-36.05245534127,-9.36710223556],[-36.05790558999,-9.36711282133],[-36.0715955848,-9.36727160792],[-36.08621898835,-9.367313951],[-36.10299888795,-9.36750449479],[-36.11651722139,-9.36754683784],[-36.12515393441,-9.36768445271],[-36.12521830743,-9.37473449571],[-36.12520757859,-9.37721150385],[-36.12511101907,-9.38037654408],[-36.12514320558,-9.38528812121],[-36.12504664605,-9.39026313917],[-36.12503591722,-9.39477234906],[-36.12505737489,-9.40171599404],[-36.12499300187,-9.40382234661],[-36.12479988282,-9.40678603705],[-36.12462822145,-9.41123152509],[-36.12473550981,-9.41360242867],[-36.12456384843,-9.41630142857],[-36.1245853061,-9.42460998216],[-36.12466040796,-9.42690670628],[-36.12464967912,-9.42924575062],[-36.12457457727,-9.42970085695],[-36.12463895028,-9.4353843436],[-36.12438145822,-9.44108890357],[-36.12445656007,-9.44387235589],[-36.12452093309,-9.44578795069],[-36.12438145822,-9.4473648688],[-36.12447801774,-9.44856078174],[-36.12447801774,-9.45095259517],[-36.12436000055,-9.45391588079],[-36.12433854287,-9.45790569291],[-36.11757937616,-9.45783161194],[-36.10889974778,-9.45777869695],[-36.10418978875,-9.45779986294],[-36.10116425699,-9.45772578195],[-36.09529558366,-9.45772578195],[-36.08460966295,-9.45767286695],[-36.07361260598,-9.45756703691],[-36.05726185983,-9.4574082918],[-36.04816380685,-9.45747178985],[-36.04176942056,-9.45738712578],[-36.03767100518,-9.45738712578],[-36.03320780938,-9.4574082918]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"Catastro-Spain","name":"Catastro Spain","type":"wms","template":"http://ovc.catastro.meh.es/Cartografia/WMS/ServidorWMS.aspx?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=Catastro&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-17.8846298,28.4460601],[-17.8939535,28.5225529],[-18.0212548,28.7481927],[-18.0224091,28.8038375],[-17.9424017,28.8726124],[-17.8911792,28.8737099],[-17.8903302,28.8515102],[-17.7675902,28.8537764],[-17.7669837,28.8312183],[-17.7412714,28.8319975],[-17.7394926,28.7642235],[-17.7139824,28.7649677],[-17.7129312,28.7303731],[-17.7574427,28.6931782],[-17.7570788,28.6741254],[-17.7457913,28.6743524],[-17.7457266,28.6165627],[-17.7519687,28.5833675],[-17.7622536,28.5591958],[-17.7833086,28.541667],[-17.7831575,28.4936643],[-17.808611,28.4925024],[-17.8060072,28.4468974],[-17.8846298,28.4460601]],[[-18.1661033,27.7851643],[-18.163494,27.6949247],[-18.0889827,27.6963366],[-18.0873398,27.6738724],[-18.0364092,27.6753701],[-18.0350079,27.6302571],[-17.9589987,27.6323976],[-17.8603269,27.7926025],[-17.8630328,27.8368793],[-17.8884015,27.8364947],[-17.8891263,27.8590536],[-17.9906491,27.8567467],[-18.0386803,27.7655831],[-18.1146412,27.7637873],[-18.1154627,27.7863613],[-18.1661033,27.7851643]],[[-17.36038,28.0639801],[-17.3629657,28.1757247],[-17.3375583,28.1763688],[-17.3384577,28.2213012],[-17.1857883,28.2238767],[-17.0820788,28.1351849],[-17.0808422,28.0679977],[-17.1315446,28.0668073],[-17.1563337,28.0214628],[-17.2321063,28.0203711],[-17.2319938,27.9980388],[-17.2576823,27.9978403],[-17.257851,28.0199741],[-17.3086658,28.0192298],[-17.36038,28.0639801]],[[-16.9278171,28.3275779],[-16.9286591,28.3721879],[-16.8776666,28.3729288],[-16.8780707,28.3954191],[-16.5214259,28.4226146],[-16.4457117,28.491135],[-16.4462506,28.535972],[-16.4205859,28.5362679],[-16.4209227,28.5588419],[-16.3443329,28.5597589],[-16.3446023,28.5822095],[-16.1912541,28.5837179],[-16.1916246,28.6068435],[-16.1279344,28.6078193],[-16.1277997,28.5921762],[-16.0995079,28.5925015],[-16.0993395,28.5163822],[-16.1648148,28.5161158],[-16.1647474,28.4938583],[-16.2385755,28.4484704],[-16.2653516,28.4476116],[-16.2658569,28.4030038],[-16.3167484,28.4017594],[-16.3163105,28.380189],[-16.3420763,28.3795075],[-16.3408301,28.2892963],[-16.415837,28.1976134],[-16.415096,28.1311312],[-16.5153297,28.0164796],[-16.6168433,28.01532],[-16.6168096,27.9930469],[-16.7184243,27.9919168],[-16.7190979,28.0371426],[-16.7446952,28.0367859],[-16.7453351,28.0818146],[-16.7706967,28.0816065],[-16.8223966,28.1259036],[-16.8231712,28.1708652],[-16.8487012,28.1707464],[-16.8502842,28.260791],[-16.8756457,28.2605537],[-16.8760836,28.2832162],[-16.9015125,28.2827713],[-16.9023882,28.3279337],[-16.9278171,28.3275779]],[[-15.8537427,27.9008901],[-15.8542032,27.9901812],[-15.828953,27.9906555],[-15.8291065,28.035578],[-15.7782992,28.0363232],[-15.7532793,28.0814298],[-15.7278756,28.0815652],[-15.7282593,28.1718567],[-15.4989741,28.1728039],[-15.4987438,28.1504075],[-15.4497785,28.1507459],[-15.4501622,28.1961425],[-15.3972827,28.1961425],[-15.3964385,28.0383554],[-15.3710348,28.0380167],[-15.3706511,28.0153212],[-15.3457847,28.0153212],[-15.3454777,27.9254406],[-15.3708046,27.9252372],[-15.3705743,27.8352137],[-15.395978,27.8347387],[-15.4209979,27.7879673],[-15.4718052,27.7893932],[-15.471882,27.7666454],[-15.522766,27.7667813],[-15.5477092,27.7216112],[-15.6236132,27.7213395],[-15.6241504,27.741991],[-15.7007451,27.7433495],[-15.801669,27.8110501],[-15.8537427,27.9008901]],[[-14.5215621,28.0467778],[-14.5224358,28.1184131],[-14.4157526,28.1156076],[-14.2168794,28.2278805],[-14.2153651,28.33903],[-14.1641672,28.4528287],[-14.1115132,28.4747955],[-14.0335806,28.7226671],[-13.9565217,28.7449351],[-13.9561722,28.7665857],[-13.8290221,28.7664325],[-13.8289639,28.7879765],[-13.8000741,28.7879255],[-13.8012972,28.7189894],[-13.827566,28.719347],[-13.8278572,28.6517968],[-13.8025786,28.651899],[-13.8033941,28.5384172],[-13.8288474,28.5384684],[-13.8315061,28.3970177],[-13.9158189,28.2241438],[-13.9856445,28.2235696],[-14.0369588,28.1795787],[-14.1387139,28.1799894],[-14.1386556,28.1579103],[-14.2153651,28.1578076],[-14.2147244,28.1118888],[-14.2913173,28.0452356],[-14.3319673,28.0368713],[-14.4457846,28.0469834],[-14.4466583,28.0657961],[-14.4962835,28.0682631],[-14.495934,28.0458525],[-14.5215621,28.0467778]],[[-13.800662,28.8456579],[-13.8009273,28.8231121],[-13.775688,28.8230539],[-13.69729,28.8898184],[-13.69729,28.9127744],[-13.6072498,28.9117991],[-13.4388551,29.0002417],[-13.4374559,29.1351289],[-13.4117005,29.1349931],[-13.4105556,29.2229789],[-13.4592801,29.255586],[-13.4597392,29.2942023],[-13.5091254,29.2945638],[-13.5100581,29.3163453],[-13.5635382,29.3172941],[-13.5640564,29.2713764],[-13.5389228,29.2711956],[-13.5389747,29.2500375],[-13.5661293,29.2501279],[-13.5665956,29.2030039],[-13.5156549,29.2022349],[-13.5156549,29.1820579],[-13.5398038,29.1827819],[-13.5408921,29.137528],[-13.65782,29.1368528],[-13.713222,29.0935079],[-13.7663353,29.0934533],[-13.8502463,29.0165937],[-13.8518224,28.983425],[-13.8524443,28.914861],[-13.9013122,28.89245],[-13.9024005,28.8469779],[-13.800662,28.8456579]],[[1.6479916,38.9990693],[1.7321668,38.9993635],[1.7314703,39.0441733],[1.6489512,39.0431944],[1.6481552,39.1276358],[1.3948608,39.1265691],[1.3954412,39.0864199],[1.2281145,39.0852615],[1.2291095,39.0028958],[1.1448657,39.0018003],[1.1452803,38.8319988],[1.3113632,38.8331615],[1.3121924,38.7906483],[1.3946949,38.7916178],[1.3951924,38.7529597],[1.3112803,38.7519251],[1.3125919,38.6238804],[1.6489036,38.6251112],[1.6480745,38.7111504],[1.58456,38.7101152],[1.5811604,38.7005387],[1.5491544,38.7002798],[1.5197188,38.7092094],[1.50355,38.7253185],[1.4813282,38.9155064],[1.5518906,38.9254411],[1.5667328,38.9566554],[1.6487378,38.9583318],[1.6479916,38.9990693]],[[2.5450749,39.4166673],[2.43933,39.4161122],[2.438714,39.4846853],[2.439022,39.4993424],[2.3122308,39.4993424],[2.3119228,39.5417911],[2.2290722,39.5409994],[2.2283536,39.6260571],[2.3460076,39.6270851],[2.9270445,39.9601558],[3.1456647,39.9600498],[3.1460753,40.0019797],[3.2313899,40.0019797],[3.2312872,39.8329231],[3.1482313,39.8331596],[3.1484366,39.7935717],[3.4814817,39.7931773],[3.4803472,39.5959027],[3.3150618,39.4784606],[3.3146179,39.3785504],[3.0830178,39.2499355],[2.9798608,39.2501482],[2.9790395,39.3334971],[2.7287424,39.3334177],[2.7288451,39.4581361],[2.6456865,39.4577397],[2.6453785,39.4996593],[2.5452802,39.4994216],[2.5450749,39.4166673]],[[3.8120402,40.0434431],[3.729082,40.0437979],[3.7286185,39.9584155],[3.8126633,39.9576011],[3.8122771,39.9164393],[3.9608975,39.9159813],[4.1938142,39.791308],[4.3150279,39.7905799],[4.3159934,39.8329294],[4.3987393,39.8320396],[4.3973664,39.9185834],[4.3158003,39.9193274],[4.3161865,40.0433985],[4.2318959,40.0443594],[4.2324752,40.0847793],[4.1491501,40.086109],[4.1490623,40.1255157],[4.0627981,40.1272166],[4.0624217,40.0849941],[3.8128687,40.085294],[3.8120402,40.0434431]],[[-8.8910646,41.8228891],[-9.1092038,42.5751065],[-9.0365469,42.730656],[-9.0883419,42.7269569],[-9.1466113,42.7750272],[-9.2185488,42.9016271],[-9.2760988,42.8605106],[-9.3099094,42.9311297],[-9.2789763,42.9821991],[-9.3099094,43.0600377],[-9.2523594,43.1041725],[-9.2314975,43.1703151],[-9.1473307,43.210176],[-9.06748,43.1991644],[-9.0336694,43.2426748],[-8.99842,43.2447709],[-8.9998588,43.2955793],[-8.9372732,43.3055265],[-8.92936,43.326986],[-8.8638969,43.3290792],[-8.8761263,43.3740655],[-8.8221732,43.3735426],[-8.785485,43.3191358],[-8.7063538,43.305003],[-8.6099575,43.3296025],[-8.5509688,43.3233227],[-8.5243519,43.3364048],[-8.5250713,43.3646525],[-8.45745,43.3918416],[-8.3610538,43.4111803],[-8.3603344,43.4634161],[-8.3344369,43.5797394],[-8.2776063,43.5708796],[-8.0646713,43.7239184],[-7.9992081,43.7233986],[-7.9171994,43.7826357],[-7.8560525,43.7914643],[-7.83591,43.7374337],[-7.6628443,43.809819],[-7.3188932,43.6782695],[-7.1997467,43.5830817],[-6.2488228,43.6075032],[-6.1229322,43.5790105],[-5.8520425,43.6798953],[-5.6036334,43.5708672],[-5.2855347,43.5619084],[-5.1787525,43.4991591],[-4.9089869,43.4836655],[-4.6156167,43.4192021],[-4.1839917,43.4249168],[-3.8029478,43.5195394],[-3.7400025,43.4869277],[-3.5612827,43.5423572],[-3.1083013,43.3816347],[-2.9385737,43.4624573],[-2.7452417,43.4755094],[-2.3046245,43.3170625],[-1.9854018,43.3563045],[-1.8552841,43.3972545],[-1.769802,43.3964383],[-1.7700492,43.3760501],[-1.7100474,43.3756908],[-1.7113451,43.3312527],[-1.7225915,43.3131806],[-1.6890375,43.3129108],[-1.6881106,43.3341294],[-1.6446695,43.3337248],[-1.6449785,43.3133155],[-1.6029903,43.3129528],[-1.6034352,43.2926624],[-1.5635905,43.2921227],[-1.5630468,43.3133844],[-1.4779905,43.3128355],[-1.3667723,43.2761368],[-1.3568809,43.2381533],[-1.3703692,43.1712972],[-1.4423067,43.0833554],[-1.4198262,43.0603647],[-1.3730668,43.051166],[-1.3640746,43.1115893],[-1.3020285,43.135217],[-1.2354864,43.1332484],[-1.2795481,43.0774443],[-1.1923239,43.0649635],[-1.0061856,43.0077821],[-0.942341,42.9748951],[-0.7562028,42.9821318],[-0.7148387,42.9610774],[-0.6968543,42.9031405],[-0.5511809,42.8220693],[-0.5044215,42.8484456],[-0.4288871,42.8200906],[-0.3164848,42.8655842],[-0.1456332,42.810856],[-0.0314324,42.7124874],[0.1861785,42.7540985],[0.3021777,42.7177729],[0.3642238,42.7428729],[0.4487504,42.7144695],[0.6276949,42.7223973],[0.6411832,42.8576747],[0.7149192,42.882718],[0.9675996,42.8181119],[1.108777,42.7989808],[1.1753192,42.7342872],[1.3632559,42.7415521],[1.4113736,42.7093914],[1.4806054,42.7103407],[1.4813006,42.5010664],[1.6443591,42.5020345],[1.6432777,42.5424539],[1.730407,42.5434214],[1.7316429,42.5011803],[2.0638621,42.5016359],[2.0645572,42.4590247],[2.3969309,42.4599364],[2.3976786,42.4178363],[2.4804823,42.4179732],[2.4809767,42.3759441],[2.6447922,42.3762636],[2.6444832,42.4592447],[2.8113266,42.4596094],[2.8112648,42.5010358],[3.063878,42.5008535],[3.063878,42.4591535],[3.2307832,42.4593359],[3.2304935,42.3764363],[3.3141469,42.3760369],[3.3141243,42.3339864],[3.397855,42.3340435],[3.3973912,42.290094],[3.3138923,42.2908368],[3.3139695,42.2070151],[3.1475896,42.2073012],[3.1475896,42.1260612],[3.2305478,42.1260039],[3.2466753,41.9529359],[3.1945206,41.8558943],[3.060537,41.7647419],[2.7835777,41.6371796],[2.26293,41.4271601],[2.1649151,41.2989297],[1.86008,41.2232228],[1.3763003,41.116273],[1.1793714,41.0464585],[1.0858526,41.048493],[0.758537,40.8195599],[0.9114042,40.733761],[0.8781331,40.6751363],[0.6650182,40.5358666],[0.5580112,40.5502166],[0.433919,40.3757589],[0.2675635,40.1919192],[0.1641534,40.0647234],[0.0751307,40.0144671],[0.010387,39.8952188],[-0.0939224,39.8116904],[-0.1847435,39.6311716],[-0.2908513,39.5036254],[-0.2863552,39.333431],[-0.1856427,39.1774612],[-0.2135185,39.1558487],[-0.1110076,38.9722246],[0.0094878,38.8826835],[0.1218901,38.872183],[0.2342925,38.798636],[0.2558737,38.7264162],[0.0958128,38.6133825],[-0.0022021,38.6070586],[-0.0570544,38.5269073],[-0.2719677,38.4762395],[-0.379874,38.3931234],[-0.3834708,38.3381297],[-0.4509122,38.3310763],[-0.5048654,38.2830943],[-0.4823849,38.1948095],[-0.429331,38.1658287],[-0.4545091,38.148859],[-0.5839966,38.1721913],[-0.6136708,38.1198599],[-0.6370505,37.9612228],[-0.6811123,37.9456238],[-0.7323677,37.8810656],[-0.7215771,37.7830562],[-0.688306,37.7340026],[-0.6641461,37.6231485],[-0.7193941,37.5878413],[-0.9196258,37.5375806],[-1.1107098,37.5164093],[-1.3383246,37.5286671],[-1.4408917,37.3903714],[-1.6766966,37.2765189],[-1.8540816,36.9122889],[-2.0683486,36.6929117],[-2.2158766,36.6619233],[-2.3721861,36.7801753],[-2.6812926,36.6591056],[-2.9201476,36.6675585],[-3.09402,36.712625],[-3.4610839,36.6548788],[-3.7280395,36.6929117],[-4.3743529,36.6633322],[-4.6571151,36.4404171],[-4.9188018,36.4531321],[-5.1699508,36.3513541],[-5.2841094,36.1970201],[-5.2680911,36.1241812],[-5.3524784,36.1224654],[-5.3516094,36.0401413],[-5.4365759,36.0388921],[-5.4353207,36.0034384],[-5.6888562,36.0036518],[-5.6899635,36.0405317],[-5.85506,36.0385595],[-5.8566821,36.1242077],[-5.9384817,36.1221487],[-5.9400265,36.1655625],[-5.9983445,36.1645024],[-6.0357297,36.1780957],[-6.0775178,36.2224132],[-6.1506113,36.2864561],[-6.231541,36.3770075],[-6.3358504,36.5310643],[-6.3214629,36.5816265],[-6.404191,36.6234958],[-6.4743301,36.7489673],[-6.4158808,36.7993866],[-6.490516,36.9173818],[-6.6298949,37.0194012],[-6.8744824,37.1083766],[-7.0426363,37.1850699],[-7.2647434,37.1843535],[-7.3753473,37.1535419],[-7.408316,37.1682196],[-7.4202886,37.2118318],[-7.4249231,37.2350505],[-7.4380543,37.2451969],[-7.4459717,37.3326142],[-7.4480958,37.3909382],[-7.4696271,37.4075829],[-7.4647029,37.4530494],[-7.5019723,37.516411],[-7.5191587,37.5229203],[-7.5219588,37.5723727],[-7.4501271,37.6695835],[-7.4249019,37.7599222],[-7.316662,37.839974],[-7.268329,37.988952],[-7.1536786,38.0155235],[-7.1177098,38.0553626],[-7.0142997,38.0243785],[-6.9963153,38.1075633],[-6.9614706,38.201254],[-7.080617,38.1570753],[-7.3402665,38.4402363],[-7.2638329,38.7380741],[-7.0435243,38.8729667],[-7.0615086,38.907962],[-6.9693387,39.0198308],[-7.0008114,39.0887867],[-7.1536786,39.0957658],[-7.1525545,39.1602899],[-7.2447245,39.1968854],[-7.2559647,39.2813308],[-7.3368944,39.3535074],[-7.3279022,39.4559917],[-7.5144901,39.5886496],[-7.5527069,39.6795427],[-7.0502684,39.6752171],[-6.9951913,39.8195433],[-6.9221297,39.8790868],[-6.886161,40.0229854],[-7.0412762,40.1347927],[-7.0176717,40.266146],[-6.8086034,40.3450071],[-6.8681766,40.4451649],[-6.8535643,40.6066433],[-6.837828,40.8757589],[-6.9536024,41.0370445],[-6.8018592,41.0395879],[-6.7681385,41.138706],[-6.6411239,41.2655616],[-6.5624422,41.2630269],[-6.217367,41.5791017],[-6.3162811,41.644652],[-6.5152332,41.6412921],[-6.5871707,41.6883151],[-6.5478299,41.8559743],[-6.6298836,41.9112057],[-7.1334461,41.9404756],[-7.1682909,41.8718791],[-7.4256922,41.7847727],[-7.9539833,41.8459271],[-8.130455,41.7805819],[-8.2518495,41.9078597],[-8.1293309,42.0348842],[-8.2484774,42.1008034],[-8.3676239,42.0557521],[-8.6070409,42.0340493],[-8.8910646,41.8228891]]]},{"id":"South_Africa-CapeTown-Aerial-2013","name":"City of Cape Town 2013 Aerial","type":"tms","template":"https://{switch:a,b,c}.coct.aerial.openstreetmap.org.za/layer/za_coct_aerial_2013/{zoom}/{x}/{y}.jpg","endDate":"2015-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[1,21],"polygon":[[[18.4486565,-33.893623],[18.4485868,-33.902644],[18.4702,-33.9027665],[18.4813902,-33.8472383],[18.4492466,-33.801069],[18.4281537,-33.7356408],[18.43914,-33.7177232],[18.4071895,-33.6589917],[18.3322379,-33.5775191],[18.3324525,-33.5504487],[18.353996,-33.5505918],[18.3542535,-33.5236025],[18.3652398,-33.5236561],[18.3650252,-33.5148009],[18.3760115,-33.5147652],[18.3760545,-33.5058017],[18.4296557,-33.5059449],[18.4296986,-33.4878541],[18.4404919,-33.4878899],[18.4405991,-33.4698849],[18.4943721,-33.4700997],[18.4943292,-33.4791564],[18.5158297,-33.4791743],[18.5157439,-33.4881941],[18.5264727,-33.4883015],[18.5263225,-33.5243538],[18.5479304,-33.5244253],[18.5479519,-33.5153913],[18.5693666,-33.5154987],[18.5693666,-33.524479],[18.5801169,-33.5245327],[18.580074,-33.5425978],[18.5907814,-33.5425978],[18.5907385,-33.5606413],[18.5799453,-33.5605341],[18.5798809,-33.569617],[18.5906956,-33.569617],[18.5906526,-33.5786811],[18.6230108,-33.5787347],[18.622925,-33.5877264],[18.6659691,-33.5878872],[18.6659262,-33.614928],[18.6767194,-33.6149726],[18.6765772,-33.6510279],[18.687298,-33.6510167],[18.6873409,-33.6600365],[18.6980697,-33.6600901],[18.6980697,-33.6690733],[18.7520358,-33.6692519],[18.7520787,-33.6421924],[18.7736437,-33.642246],[18.773708,-33.6331886],[18.8274595,-33.6332958],[18.8275239,-33.6603044],[18.8166663,-33.6602866],[18.8166019,-33.6783233],[18.8058087,-33.6783055],[18.8058087,-33.7053892],[18.8273951,-33.7054428],[18.8273308,-33.7234701],[18.838124,-33.7234344],[18.8380381,-33.7413865],[18.8165161,-33.7413687],[18.8163659,-33.7955057],[18.8055941,-33.7955057],[18.8055083,-33.8135675],[18.794758,-33.8135497],[18.7947151,-33.8315364],[18.7731072,-33.8315186],[18.7731287,-33.8405194],[18.7623569,-33.8405194],[18.7622711,-33.903588],[18.7514564,-33.9035167],[18.7510809,-33.9847823],[18.7619063,-33.9848001],[18.7617776,-34.0298785],[18.772603,-34.0298963],[18.7725815,-34.0389073],[18.7940338,-34.0389406],[18.7938756,-34.0406987],[18.7984461,-34.0411855],[18.8032445,-34.0411788],[18.8034055,-34.0389206],[18.8159367,-34.038974],[18.8163444,-34.0299318],[18.8379845,-34.0316479],[18.8380006,-34.030003],[18.8484183,-34.0300074],[18.8484666,-34.0218491],[18.859925,-34.0234675],[18.8598606,-34.0210132],[18.868272,-34.0220803],[18.8681862,-34.0211733],[18.8854596,-34.0234319],[18.8851806,-34.0213156],[18.9025184,-34.021031],[18.9025828,-34.0119958],[18.9134189,-34.0119958],[18.9134833,-33.9939582],[18.9458844,-33.9940294],[18.9458629,-34.003102],[18.9674279,-34.0029953],[18.9674708,-34.0120848],[18.9782211,-34.0120848],[18.9783284,-34.0211377],[18.9891431,-34.0211377],[18.9891645,-34.039134],[19.0000167,-34.0391251],[19.0000221,-34.0571798],[19.0108368,-34.0572509],[19.0107939,-34.0841436],[19.0000007,-34.0841258],[19.0000221,-34.0931977],[18.9891538,-34.0931711],[18.9891753,-34.1021976],[18.9783177,-34.1021798],[18.9783177,-34.111232],[18.967503,-34.1112143],[18.9674923,-34.1292536],[18.9566025,-34.1292358],[18.9565596,-34.1382408],[18.9674172,-34.1383118],[18.9674172,-34.1473157],[18.9891753,-34.147298],[18.9891753,-34.165303],[18.9782748,-34.1652852],[18.9783177,-34.1742863],[18.9674172,-34.1742685],[18.9674601,-34.1833042],[18.9565596,-34.1833219],[18.9565596,-34.1923565],[18.9457449,-34.192321],[18.945702,-34.2013192],[18.9348659,-34.2013725],[18.9348873,-34.2193305],[18.9023575,-34.2193482],[18.9017567,-34.2362557],[18.8878414,-34.2373467],[18.8894185,-34.2554123],[18.8805887,-34.2553414],[18.8792744,-34.2644348],[18.8696882,-34.2644126],[18.8697097,-34.2734386],[18.8371369,-34.2734208],[18.8371155,-34.2643771],[18.848016,-34.2644037],[18.8480267,-34.237391],[18.8154861,-34.210281],[18.8156471,-34.1741265],[18.8548824,-34.1562743],[18.7617561,-34.0840547],[18.6533734,-34.077479],[18.4797433,-34.1101217],[18.4463713,-34.1342269],[18.4444508,-34.1640868],[18.4359965,-34.1640513],[18.435975,-34.1820172],[18.4468111,-34.182106],[18.4467253,-34.1911052],[18.4659299,-34.1912117],[18.4866151,-34.2453911],[18.4788904,-34.2543659],[18.4860036,-34.2543748],[18.4677109,-34.2994116],[18.4892222,-34.3445792],[18.500112,-34.3445837],[18.4999189,-34.3626174],[18.467432,-34.3625111],[18.4673676,-34.3534947],[18.3916005,-34.3170651],[18.3917722,-34.2900161],[18.3701643,-34.2808678],[18.370682,-34.2178866],[18.3492324,-34.1816178],[18.3274743,-34.1814936],[18.3276674,-34.1634565],[18.3118746,-34.1543832],[18.3114025,-34.1435331],[18.3236656,-34.1346886],[18.3499297,-34.1042053],[18.3393189,-34.0882843],[18.3612487,-34.0597219],[18.3550474,-34.0553843],[18.3427522,-34.064326],[18.3199963,-34.0644326],[18.296071,-34.045126],[18.3068213,-34.0252637],[18.3287725,-34.0191992],[18.3289227,-34.001252],[18.3397374,-34.0012698],[18.3398017,-33.9866282],[18.3628687,-33.9735145],[18.3638129,-33.9292474],[18.3726212,-33.9292741],[18.3728358,-33.917763],[18.3977267,-33.8933469],[18.4486565,-33.893623]]],"terms_url":"https://www.capetown.gov.za","terms_text":"City of Cape Town Aerial - OPENSTREETMAP USE ONLY","description":"OpenStreetMap use only. City of Cape Town Aerial ortho-photography of the municipal area. 12cm ground sample distance"},{"id":"South_Africa-CapeTown-Aerial","name":"City of Cape Town 2015 Aerial","type":"tms","template":"https://{switch:a,b,c}.coct.aerial.openstreetmap.org.za/layer/za_coct_aerial_2015/{zoom}/{x}/{y}.jpg","endDate":"2016-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[1,21],"polygon":[[[18.4486565,-33.893623],[18.4485868,-33.902644],[18.4702,-33.9027665],[18.4813902,-33.8472383],[18.4492466,-33.801069],[18.4281537,-33.7356408],[18.43914,-33.7177232],[18.4071895,-33.6589917],[18.3322379,-33.5775191],[18.3324525,-33.5504487],[18.353996,-33.5505918],[18.3542535,-33.5236025],[18.3652398,-33.5236561],[18.3650252,-33.5148009],[18.3760115,-33.5147652],[18.3760545,-33.5058017],[18.4296557,-33.5059449],[18.4296986,-33.4878541],[18.4404919,-33.4878899],[18.4405991,-33.4698849],[18.4943721,-33.4700997],[18.4943292,-33.4791564],[18.5158297,-33.4791743],[18.5157439,-33.4881941],[18.5264727,-33.4883015],[18.5263225,-33.5243538],[18.5479304,-33.5244253],[18.5479519,-33.5153913],[18.5693666,-33.5154987],[18.5693666,-33.524479],[18.5801169,-33.5245327],[18.580074,-33.5425978],[18.5907814,-33.5425978],[18.5907385,-33.5606413],[18.5799453,-33.5605341],[18.5798809,-33.569617],[18.5906956,-33.569617],[18.5906526,-33.5786811],[18.6230108,-33.5787347],[18.622925,-33.5877264],[18.6659691,-33.5878872],[18.6659262,-33.614928],[18.6767194,-33.6149726],[18.6765772,-33.6510279],[18.687298,-33.6510167],[18.6873409,-33.6600365],[18.6980697,-33.6600901],[18.6980697,-33.6690733],[18.7520358,-33.6692519],[18.7520787,-33.6421924],[18.7736437,-33.642246],[18.773708,-33.6331886],[18.8274595,-33.6332958],[18.8275239,-33.6603044],[18.8166663,-33.6602866],[18.8166019,-33.6783233],[18.8058087,-33.6783055],[18.8058087,-33.7053892],[18.8273951,-33.7054428],[18.8273308,-33.7234701],[18.838124,-33.7234344],[18.8380381,-33.7413865],[18.8165161,-33.7413687],[18.8163659,-33.7955057],[18.8055941,-33.7955057],[18.8055083,-33.8135675],[18.794758,-33.8135497],[18.7947151,-33.8315364],[18.7731072,-33.8315186],[18.7731287,-33.8405194],[18.7623569,-33.8405194],[18.7622711,-33.903588],[18.7514564,-33.9035167],[18.7510809,-33.9847823],[18.7619063,-33.9848001],[18.7617776,-34.0298785],[18.772603,-34.0298963],[18.7725815,-34.0389073],[18.7940338,-34.0389406],[18.7938756,-34.0406987],[18.7984461,-34.0411855],[18.8032445,-34.0411788],[18.8034055,-34.0389206],[18.8159367,-34.038974],[18.8163444,-34.0299318],[18.8379845,-34.0316479],[18.8380006,-34.030003],[18.8484183,-34.0300074],[18.8484666,-34.0218491],[18.859925,-34.0234675],[18.8598606,-34.0210132],[18.868272,-34.0220803],[18.8681862,-34.0211733],[18.8854596,-34.0234319],[18.8851806,-34.0213156],[18.9025184,-34.021031],[18.9025828,-34.0119958],[18.9134189,-34.0119958],[18.9134833,-33.9939582],[18.9458844,-33.9940294],[18.9458629,-34.003102],[18.9674279,-34.0029953],[18.9674708,-34.0120848],[18.9782211,-34.0120848],[18.9783284,-34.0211377],[18.9891431,-34.0211377],[18.9891645,-34.039134],[19.0000167,-34.0391251],[19.0000221,-34.0571798],[19.0108368,-34.0572509],[19.0107939,-34.0841436],[19.0000007,-34.0841258],[19.0000221,-34.0931977],[18.9891538,-34.0931711],[18.9891753,-34.1021976],[18.9783177,-34.1021798],[18.9783177,-34.111232],[18.967503,-34.1112143],[18.9674923,-34.1292536],[18.9566025,-34.1292358],[18.9565596,-34.1382408],[18.9674172,-34.1383118],[18.9674172,-34.1473157],[18.9891753,-34.147298],[18.9891753,-34.165303],[18.9782748,-34.1652852],[18.9783177,-34.1742863],[18.9674172,-34.1742685],[18.9674601,-34.1833042],[18.9565596,-34.1833219],[18.9565596,-34.1923565],[18.9457449,-34.192321],[18.945702,-34.2013192],[18.9348659,-34.2013725],[18.9348873,-34.2193305],[18.9023575,-34.2193482],[18.9017567,-34.2362557],[18.8878414,-34.2373467],[18.8894185,-34.2554123],[18.8805887,-34.2553414],[18.8792744,-34.2644348],[18.8696882,-34.2644126],[18.8697097,-34.2734386],[18.8371369,-34.2734208],[18.8371155,-34.2643771],[18.848016,-34.2644037],[18.8480267,-34.237391],[18.8154861,-34.210281],[18.8156471,-34.1741265],[18.8548824,-34.1562743],[18.7617561,-34.0840547],[18.6533734,-34.077479],[18.4797433,-34.1101217],[18.4463713,-34.1342269],[18.4444508,-34.1640868],[18.4359965,-34.1640513],[18.435975,-34.1820172],[18.4468111,-34.182106],[18.4467253,-34.1911052],[18.4659299,-34.1912117],[18.4866151,-34.2453911],[18.4788904,-34.2543659],[18.4860036,-34.2543748],[18.4677109,-34.2994116],[18.4892222,-34.3445792],[18.500112,-34.3445837],[18.4999189,-34.3626174],[18.467432,-34.3625111],[18.4673676,-34.3534947],[18.3916005,-34.3170651],[18.3917722,-34.2900161],[18.3701643,-34.2808678],[18.370682,-34.2178866],[18.3492324,-34.1816178],[18.3274743,-34.1814936],[18.3276674,-34.1634565],[18.3118746,-34.1543832],[18.3114025,-34.1435331],[18.3236656,-34.1346886],[18.3499297,-34.1042053],[18.3393189,-34.0882843],[18.3612487,-34.0597219],[18.3550474,-34.0553843],[18.3427522,-34.064326],[18.3199963,-34.0644326],[18.296071,-34.045126],[18.3068213,-34.0252637],[18.3287725,-34.0191992],[18.3289227,-34.001252],[18.3397374,-34.0012698],[18.3398017,-33.9866282],[18.3628687,-33.9735145],[18.3638129,-33.9292474],[18.3726212,-33.9292741],[18.3728358,-33.917763],[18.3977267,-33.8933469],[18.4486565,-33.893623]]],"terms_url":"https://www.capetown.gov.za","terms_text":"City of Cape Town Aerial - OPENSTREETMAP USE ONLY","best":true,"description":"OpenStreetMap use only. City of Cape Town Aerial ortho-photography of the municipal area. 8cm ground sample distance"},{"id":"Czech_CUZK-KM","name":"Czech CUZK:KM","type":"wms","template":"http://wms.cuzk.cz/wms.asp?service=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&LAYERS=parcelni_cisla_i,obrazy_parcel_i,RST_KMD_I,hranice_parcel_i,DEF_BUDOVY,RST_KN_I,dalsi_p_mapy_i,prehledka_kat_prac,prehledka_kat_uz,prehledka_kraju-linie&FORMAT=image/png&transparent=TRUE&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[15.0063684,49.0177392],[15.1559854,49.0013828],[15.190896,48.9424551],[15.3105895,48.9882938],[15.4053469,48.9752013],[15.5400022,48.9162426],[15.7145553,48.8670572],[15.8342488,48.880178],[15.968904,48.8178233],[16.0885976,48.7455261],[16.3978059,48.7455261],[16.4875761,48.8145394],[16.6721036,48.7784014],[16.6820781,48.7356594],[16.9015163,48.7126294],[16.9464014,48.6237005],[17.1159672,48.8375227],[17.2107246,48.880178],[17.4052266,48.8178233],[17.4800351,48.8539329],[17.5299074,48.8178233],[17.7044605,48.8670572],[17.8141796,48.9359033],[17.8840008,48.9359033],[17.9438476,49.0210099],[18.0635412,49.0340903],[18.1184007,49.0994409],[18.1981964,49.3047337],[18.3877112,49.3339917],[18.577226,49.5091747],[18.7567663,49.4994587],[18.8465365,49.5253637],[18.8764598,49.5706645],[18.7966641,49.693412],[18.64206,49.7095399],[18.5872004,49.8351543],[18.6121366,49.8833809],[18.5622643,49.9347695],[18.512392,49.9058702],[18.362775,49.9540261],[18.3278644,49.9219275],[18.2630304,49.9732751],[18.1184007,50.0053395],[18.0635412,50.075806],[17.9139242,49.9796897],[17.779269,50.0309757],[17.714435,50.1237921],[17.6047159,50.1653411],[17.7593201,50.21962],[17.7343839,50.3439092],[17.6396265,50.2802117],[17.3802905,50.2802117],[17.3503671,50.3439092],[17.2805459,50.3375433],[17.1857885,50.4075214],[16.9015163,50.4615247],[16.8666057,50.4138779],[16.9663503,50.3184404],[17.0361715,50.2323826],[16.8366823,50.21962],[16.7120015,50.1046034],[16.5823335,50.1589513],[16.5623846,50.2387626],[16.4327166,50.3375433],[16.3529209,50.3916263],[16.2781124,50.3916263],[16.2082911,50.4456477],[16.3978059,50.5344899],[16.4476782,50.5978464],[16.3529209,50.670601],[16.2382145,50.6769221],[16.2182656,50.6326561],[16.1284954,50.6832425],[16.0486997,50.6073425],[15.988853,50.7021983],[15.8741467,50.6832425],[15.8292616,50.7653291],[15.729517,50.743243],[15.450232,50.8157725],[15.3903852,50.7747914],[15.3804108,50.8598659],[15.2956278,50.8850434],[15.2956278,50.9887568],[15.1709471,51.0201394],[14.9914067,51.0013124],[15.0063684,50.8881896],[14.8417898,50.8756034],[14.7969047,50.8252246],[14.6323261,50.8567177],[14.6622495,50.9353576],[14.5724793,50.9227841],[14.6123772,50.9856174],[14.4976708,51.0483657],[14.4178751,51.0232765],[14.3081561,51.0671736],[14.2532965,51.0044508],[14.4029134,50.9322145],[14.3729901,50.897627],[14.2433221,50.9070625],[14.2084114,50.844123],[14.0338583,50.8126214],[13.9789988,50.8252246],[13.9041903,50.7968626],[13.8742669,50.740087],[13.5351352,50.7243038],[13.530148,50.6579561],[13.4703012,50.6136722],[13.3905055,50.664279],[13.3256715,50.5883483],[13.250863,50.6105074],[13.1960035,50.5059517],[13.0513738,50.5218084],[12.9665909,50.4106997],[12.8269484,50.4710483],[12.7022676,50.4138779],[12.5077656,50.401164],[12.343187,50.2547088],[12.323238,50.1845054],[12.2484296,50.2738373],[12.1736211,50.3311765],[12.0988126,50.33436],[12.1187616,50.25152],[12.2234934,50.1653411],[12.2035445,50.1237921],[12.5027784,49.9732751],[12.4778422,49.9379795],[12.5476634,49.9155052],[12.4678677,49.8029766],[12.408021,49.7611134],[12.4828294,49.6869593],[12.5327017,49.6869593],[12.5177401,49.6288466],[12.6075102,49.5415474],[12.6723442,49.4378793],[12.8119867,49.3469896],[12.9466419,49.3437405],[13.2309141,49.1288206],[13.3256715,49.1059712],[13.4353906,49.0438984],[13.4154417,48.9948387],[13.5002246,48.949006],[13.5650586,48.9882938],[13.6847522,48.8834577],[13.7445989,48.9031312],[13.8243946,48.7751149],[13.8992031,48.7751149],[14.0587945,48.676418],[14.0438328,48.6302932],[14.1435774,48.5907241],[14.3729901,48.5610269],[14.4827091,48.6500662],[14.5774665,48.607215],[14.6273389,48.6335892],[14.7071346,48.5808269],[14.7470324,48.7027561],[14.8118664,48.7389485],[14.8168536,48.794831],[14.9864195,48.7652539],[15.0063684,49.0177392]]]},{"id":"Czech_CUZK-KM-tms","name":"Czech CUZK:KM tiles proxy","type":"tms","template":"http://osm-{switch:a,b,c}.zby.cz/tiles_cuzk.php/{zoom}/{x}/{y}.png","scaleExtent":[13,18],"polygon":[[[15.0063684,49.0177392],[15.1559854,49.0013828],[15.190896,48.9424551],[15.3105895,48.9882938],[15.4053469,48.9752013],[15.5400022,48.9162426],[15.7145553,48.8670572],[15.8342488,48.880178],[15.968904,48.8178233],[16.0885976,48.7455261],[16.3978059,48.7455261],[16.4875761,48.8145394],[16.6721036,48.7784014],[16.6820781,48.7356594],[16.9015163,48.7126294],[16.9464014,48.6237005],[17.1159672,48.8375227],[17.2107246,48.880178],[17.4052266,48.8178233],[17.4800351,48.8539329],[17.5299074,48.8178233],[17.7044605,48.8670572],[17.8141796,48.9359033],[17.8840008,48.9359033],[17.9438476,49.0210099],[18.0635412,49.0340903],[18.1184007,49.0994409],[18.1981964,49.3047337],[18.3877112,49.3339917],[18.577226,49.5091747],[18.7567663,49.4994587],[18.8465365,49.5253637],[18.8764598,49.5706645],[18.7966641,49.693412],[18.64206,49.7095399],[18.5872004,49.8351543],[18.6121366,49.8833809],[18.5622643,49.9347695],[18.512392,49.9058702],[18.362775,49.9540261],[18.3278644,49.9219275],[18.2630304,49.9732751],[18.1184007,50.0053395],[18.0635412,50.075806],[17.9139242,49.9796897],[17.779269,50.0309757],[17.714435,50.1237921],[17.6047159,50.1653411],[17.7593201,50.21962],[17.7343839,50.3439092],[17.6396265,50.2802117],[17.3802905,50.2802117],[17.3503671,50.3439092],[17.2805459,50.3375433],[17.1857885,50.4075214],[16.9015163,50.4615247],[16.8666057,50.4138779],[16.9663503,50.3184404],[17.0361715,50.2323826],[16.8366823,50.21962],[16.7120015,50.1046034],[16.5823335,50.1589513],[16.5623846,50.2387626],[16.4327166,50.3375433],[16.3529209,50.3916263],[16.2781124,50.3916263],[16.2082911,50.4456477],[16.3978059,50.5344899],[16.4476782,50.5978464],[16.3529209,50.670601],[16.2382145,50.6769221],[16.2182656,50.6326561],[16.1284954,50.6832425],[16.0486997,50.6073425],[15.988853,50.7021983],[15.8741467,50.6832425],[15.8292616,50.7653291],[15.729517,50.743243],[15.450232,50.8157725],[15.3903852,50.7747914],[15.3804108,50.8598659],[15.2956278,50.8850434],[15.2956278,50.9887568],[15.1709471,51.0201394],[14.9914067,51.0013124],[15.0063684,50.8881896],[14.8417898,50.8756034],[14.7969047,50.8252246],[14.6323261,50.8567177],[14.6622495,50.9353576],[14.5724793,50.9227841],[14.6123772,50.9856174],[14.4976708,51.0483657],[14.4178751,51.0232765],[14.3081561,51.0671736],[14.2532965,51.0044508],[14.4029134,50.9322145],[14.3729901,50.897627],[14.2433221,50.9070625],[14.2084114,50.844123],[14.0338583,50.8126214],[13.9789988,50.8252246],[13.9041903,50.7968626],[13.8742669,50.740087],[13.5351352,50.7243038],[13.530148,50.6579561],[13.4703012,50.6136722],[13.3905055,50.664279],[13.3256715,50.5883483],[13.250863,50.6105074],[13.1960035,50.5059517],[13.0513738,50.5218084],[12.9665909,50.4106997],[12.8269484,50.4710483],[12.7022676,50.4138779],[12.5077656,50.401164],[12.343187,50.2547088],[12.323238,50.1845054],[12.2484296,50.2738373],[12.1736211,50.3311765],[12.0988126,50.33436],[12.1187616,50.25152],[12.2234934,50.1653411],[12.2035445,50.1237921],[12.5027784,49.9732751],[12.4778422,49.9379795],[12.5476634,49.9155052],[12.4678677,49.8029766],[12.408021,49.7611134],[12.4828294,49.6869593],[12.5327017,49.6869593],[12.5177401,49.6288466],[12.6075102,49.5415474],[12.6723442,49.4378793],[12.8119867,49.3469896],[12.9466419,49.3437405],[13.2309141,49.1288206],[13.3256715,49.1059712],[13.4353906,49.0438984],[13.4154417,48.9948387],[13.5002246,48.949006],[13.5650586,48.9882938],[13.6847522,48.8834577],[13.7445989,48.9031312],[13.8243946,48.7751149],[13.8992031,48.7751149],[14.0587945,48.676418],[14.0438328,48.6302932],[14.1435774,48.5907241],[14.3729901,48.5610269],[14.4827091,48.6500662],[14.5774665,48.607215],[14.6273389,48.6335892],[14.7071346,48.5808269],[14.7470324,48.7027561],[14.8118664,48.7389485],[14.8168536,48.794831],[14.9864195,48.7652539],[15.0063684,49.0177392]]],"overlay":true},{"id":"Czech_RUIAN-budovy","name":"Czech RUIAN budovy","type":"tms","template":"http://tile.poloha.net/budovy/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[15.0063684,49.0177392],[15.1559854,49.0013828],[15.190896,48.9424551],[15.3105895,48.9882938],[15.4053469,48.9752013],[15.5400022,48.9162426],[15.7145553,48.8670572],[15.8342488,48.880178],[15.968904,48.8178233],[16.0885976,48.7455261],[16.3978059,48.7455261],[16.4875761,48.8145394],[16.6721036,48.7784014],[16.6820781,48.7356594],[16.9015163,48.7126294],[16.9464014,48.6237005],[17.1159672,48.8375227],[17.2107246,48.880178],[17.4052266,48.8178233],[17.4800351,48.8539329],[17.5299074,48.8178233],[17.7044605,48.8670572],[17.8141796,48.9359033],[17.8840008,48.9359033],[17.9438476,49.0210099],[18.0635412,49.0340903],[18.1184007,49.0994409],[18.1981964,49.3047337],[18.3877112,49.3339917],[18.577226,49.5091747],[18.7567663,49.4994587],[18.8465365,49.5253637],[18.8764598,49.5706645],[18.7966641,49.693412],[18.64206,49.7095399],[18.5872004,49.8351543],[18.6121366,49.8833809],[18.5622643,49.9347695],[18.512392,49.9058702],[18.362775,49.9540261],[18.3278644,49.9219275],[18.2630304,49.9732751],[18.1184007,50.0053395],[18.0635412,50.075806],[17.9139242,49.9796897],[17.779269,50.0309757],[17.714435,50.1237921],[17.6047159,50.1653411],[17.7593201,50.21962],[17.7343839,50.3439092],[17.6396265,50.2802117],[17.3802905,50.2802117],[17.3503671,50.3439092],[17.2805459,50.3375433],[17.1857885,50.4075214],[16.9015163,50.4615247],[16.8666057,50.4138779],[16.9663503,50.3184404],[17.0361715,50.2323826],[16.8366823,50.21962],[16.7120015,50.1046034],[16.5823335,50.1589513],[16.5623846,50.2387626],[16.4327166,50.3375433],[16.3529209,50.3916263],[16.2781124,50.3916263],[16.2082911,50.4456477],[16.3978059,50.5344899],[16.4476782,50.5978464],[16.3529209,50.670601],[16.2382145,50.6769221],[16.2182656,50.6326561],[16.1284954,50.6832425],[16.0486997,50.6073425],[15.988853,50.7021983],[15.8741467,50.6832425],[15.8292616,50.7653291],[15.729517,50.743243],[15.450232,50.8157725],[15.3903852,50.7747914],[15.3804108,50.8598659],[15.2956278,50.8850434],[15.2956278,50.9887568],[15.1709471,51.0201394],[14.9914067,51.0013124],[15.0063684,50.8881896],[14.8417898,50.8756034],[14.7969047,50.8252246],[14.6323261,50.8567177],[14.6622495,50.9353576],[14.5724793,50.9227841],[14.6123772,50.9856174],[14.4976708,51.0483657],[14.4178751,51.0232765],[14.3081561,51.0671736],[14.2532965,51.0044508],[14.4029134,50.9322145],[14.3729901,50.897627],[14.2433221,50.9070625],[14.2084114,50.844123],[14.0338583,50.8126214],[13.9789988,50.8252246],[13.9041903,50.7968626],[13.8742669,50.740087],[13.5351352,50.7243038],[13.530148,50.6579561],[13.4703012,50.6136722],[13.3905055,50.664279],[13.3256715,50.5883483],[13.250863,50.6105074],[13.1960035,50.5059517],[13.0513738,50.5218084],[12.9665909,50.4106997],[12.8269484,50.4710483],[12.7022676,50.4138779],[12.5077656,50.401164],[12.343187,50.2547088],[12.323238,50.1845054],[12.2484296,50.2738373],[12.1736211,50.3311765],[12.0988126,50.33436],[12.1187616,50.25152],[12.2234934,50.1653411],[12.2035445,50.1237921],[12.5027784,49.9732751],[12.4778422,49.9379795],[12.5476634,49.9155052],[12.4678677,49.8029766],[12.408021,49.7611134],[12.4828294,49.6869593],[12.5327017,49.6869593],[12.5177401,49.6288466],[12.6075102,49.5415474],[12.6723442,49.4378793],[12.8119867,49.3469896],[12.9466419,49.3437405],[13.2309141,49.1288206],[13.3256715,49.1059712],[13.4353906,49.0438984],[13.4154417,48.9948387],[13.5002246,48.949006],[13.5650586,48.9882938],[13.6847522,48.8834577],[13.7445989,48.9031312],[13.8243946,48.7751149],[13.8992031,48.7751149],[14.0587945,48.676418],[14.0438328,48.6302932],[14.1435774,48.5907241],[14.3729901,48.5610269],[14.4827091,48.6500662],[14.5774665,48.607215],[14.6273389,48.6335892],[14.7071346,48.5808269],[14.7470324,48.7027561],[14.8118664,48.7389485],[14.8168536,48.794831],[14.9864195,48.7652539],[15.0063684,49.0177392]]],"terms_url":"http://poloha.net/","terms_text":"Czech RUIAN"},{"id":"Czech_RUIAN-parcely","name":"Czech RUIAN parcely","type":"tms","template":"http://tile.poloha.net/parcely/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[15.0063684,49.0177392],[15.1559854,49.0013828],[15.190896,48.9424551],[15.3105895,48.9882938],[15.4053469,48.9752013],[15.5400022,48.9162426],[15.7145553,48.8670572],[15.8342488,48.880178],[15.968904,48.8178233],[16.0885976,48.7455261],[16.3978059,48.7455261],[16.4875761,48.8145394],[16.6721036,48.7784014],[16.6820781,48.7356594],[16.9015163,48.7126294],[16.9464014,48.6237005],[17.1159672,48.8375227],[17.2107246,48.880178],[17.4052266,48.8178233],[17.4800351,48.8539329],[17.5299074,48.8178233],[17.7044605,48.8670572],[17.8141796,48.9359033],[17.8840008,48.9359033],[17.9438476,49.0210099],[18.0635412,49.0340903],[18.1184007,49.0994409],[18.1981964,49.3047337],[18.3877112,49.3339917],[18.577226,49.5091747],[18.7567663,49.4994587],[18.8465365,49.5253637],[18.8764598,49.5706645],[18.7966641,49.693412],[18.64206,49.7095399],[18.5872004,49.8351543],[18.6121366,49.8833809],[18.5622643,49.9347695],[18.512392,49.9058702],[18.362775,49.9540261],[18.3278644,49.9219275],[18.2630304,49.9732751],[18.1184007,50.0053395],[18.0635412,50.075806],[17.9139242,49.9796897],[17.779269,50.0309757],[17.714435,50.1237921],[17.6047159,50.1653411],[17.7593201,50.21962],[17.7343839,50.3439092],[17.6396265,50.2802117],[17.3802905,50.2802117],[17.3503671,50.3439092],[17.2805459,50.3375433],[17.1857885,50.4075214],[16.9015163,50.4615247],[16.8666057,50.4138779],[16.9663503,50.3184404],[17.0361715,50.2323826],[16.8366823,50.21962],[16.7120015,50.1046034],[16.5823335,50.1589513],[16.5623846,50.2387626],[16.4327166,50.3375433],[16.3529209,50.3916263],[16.2781124,50.3916263],[16.2082911,50.4456477],[16.3978059,50.5344899],[16.4476782,50.5978464],[16.3529209,50.670601],[16.2382145,50.6769221],[16.2182656,50.6326561],[16.1284954,50.6832425],[16.0486997,50.6073425],[15.988853,50.7021983],[15.8741467,50.6832425],[15.8292616,50.7653291],[15.729517,50.743243],[15.450232,50.8157725],[15.3903852,50.7747914],[15.3804108,50.8598659],[15.2956278,50.8850434],[15.2956278,50.9887568],[15.1709471,51.0201394],[14.9914067,51.0013124],[15.0063684,50.8881896],[14.8417898,50.8756034],[14.7969047,50.8252246],[14.6323261,50.8567177],[14.6622495,50.9353576],[14.5724793,50.9227841],[14.6123772,50.9856174],[14.4976708,51.0483657],[14.4178751,51.0232765],[14.3081561,51.0671736],[14.2532965,51.0044508],[14.4029134,50.9322145],[14.3729901,50.897627],[14.2433221,50.9070625],[14.2084114,50.844123],[14.0338583,50.8126214],[13.9789988,50.8252246],[13.9041903,50.7968626],[13.8742669,50.740087],[13.5351352,50.7243038],[13.530148,50.6579561],[13.4703012,50.6136722],[13.3905055,50.664279],[13.3256715,50.5883483],[13.250863,50.6105074],[13.1960035,50.5059517],[13.0513738,50.5218084],[12.9665909,50.4106997],[12.8269484,50.4710483],[12.7022676,50.4138779],[12.5077656,50.401164],[12.343187,50.2547088],[12.323238,50.1845054],[12.2484296,50.2738373],[12.1736211,50.3311765],[12.0988126,50.33436],[12.1187616,50.25152],[12.2234934,50.1653411],[12.2035445,50.1237921],[12.5027784,49.9732751],[12.4778422,49.9379795],[12.5476634,49.9155052],[12.4678677,49.8029766],[12.408021,49.7611134],[12.4828294,49.6869593],[12.5327017,49.6869593],[12.5177401,49.6288466],[12.6075102,49.5415474],[12.6723442,49.4378793],[12.8119867,49.3469896],[12.9466419,49.3437405],[13.2309141,49.1288206],[13.3256715,49.1059712],[13.4353906,49.0438984],[13.4154417,48.9948387],[13.5002246,48.949006],[13.5650586,48.9882938],[13.6847522,48.8834577],[13.7445989,48.9031312],[13.8243946,48.7751149],[13.8992031,48.7751149],[14.0587945,48.676418],[14.0438328,48.6302932],[14.1435774,48.5907241],[14.3729901,48.5610269],[14.4827091,48.6500662],[14.5774665,48.607215],[14.6273389,48.6335892],[14.7071346,48.5808269],[14.7470324,48.7027561],[14.8118664,48.7389485],[14.8168536,48.794831],[14.9864195,48.7652539],[15.0063684,49.0177392]]],"terms_url":"http://poloha.net/","terms_text":"Czech RUIAN"},{"id":"Duna_2013","name":"Danube flood orthophoto 2013","type":"tms","template":"http://e.tile.openstreetmap.hu/dunai-arviz-2013/{zoom}/{x}/{y}.jpg","endDate":"2013-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[10,20],"polygon":[[[19.0773152,47.6959718],[19.0779881,47.6959835],[19.0946205,47.6944562],[19.0805603,47.595874],[19.0743376,47.5890907],[19.0795196,47.5888284],[19.07717,47.5724109],[19.0577884,47.5720924],[19.0773152,47.6959718]]],"terms_url":"http://fototerkep.hu/","terms_text":"Fotótérkép.hu","description":"Riverbank of Danube at Budapest, Szentendre and Szigetmonostor"},{"id":"Delaware2012Orthophotography","name":"Delaware 2012 Orthophotography","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/0/https://firstmap.delaware.gov/arcgis/services/DE_Imagery/DE_Imagery_2012/ImageServer/WMSServer","endDate":"2012-01-01T00:00:00.000Z","startDate":"2012-01-01T00:00:00.000Z","polygon":[[[-75.01770587603,38.45188674427],[-75.74173524589,38.4499581145],[-75.80699639658,39.73907123636],[-75.75558784863,39.80106251053],[-75.64692187603,39.8563815616],[-75.47114773904,39.84645578141],[-75.37725787603,39.81477822231],[-75.48746302671,39.6718115509],[-75.50901151986,39.43446011595],[-75.39326532808,39.27784018498],[-75.30707135548,39.01666513594],[-75.1931721774,38.82218696272],[-75.05341480753,38.80875503297],[-75.01770587603,38.45188674427]]],"terms_url":"https://firstmap.delaware.gov/arcgis/rest/services/DE_Imagery/DE_Imagery_2012/ImageServer","terms_text":"Digital Aerial Solutions, LLC","description":"This data set consists of 0.3-meter pixel resolution (approximately 1-foot), 4-band true color and near infrared (R, G, B, IR) orthoimages covering New Castle, Kent and Sussex Counties in Delaware."},{"id":"delmiro_gouveia","name":"Delmiro Gouveia AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Delmiro%20Gouveia&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-37.94962469285,-9.42956855866],[-37.94833723253,-9.33972104942],[-38.03902808374,-9.33834478757],[-38.04033700174,-9.42845725102],[-37.94962469285,-9.42956855866]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"der-es","name":"DER-ES","type":"wms","template":"http://portal.der.es.gov.br/geoserver/wms?SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=deres-ext:TRECHOINFO&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-40.94577071764,-21.31403802661],[-40.62309586758,-20.86277859527],[-40.38881524148,-20.65176928183],[-40.22208792475,-20.29831315792],[-39.80383232847,-19.66412347768],[-39.69603449437,-19.42573412636],[-39.6730376231,-19.30437313323],[-39.70537697333,-18.61383779319],[-39.65291536073,-18.33096390659],[-40.22280657698,-17.97586605847],[-40.34282149894,-17.91980423648],[-40.45277528971,-17.91501764849],[-40.46499237758,-17.92048802421],[-40.48367733549,-17.90407639054],[-40.50164364117,-17.90681176832],[-40.51601668572,-17.8890310587],[-40.53326433917,-17.8890310587],[-40.54548142703,-17.90134097056],[-40.5893192129,-17.91501764849],[-40.5893192129,-17.93211201178],[-40.61519069308,-17.9341632245],[-40.62956373763,-17.98680287756],[-40.64609273886,-17.98680287756],[-40.65902847895,-18.00730758632],[-40.68777456804,-18.00594067991],[-40.70574087372,-18.01755904646],[-40.71364604822,-18.00183989709],[-40.72155122272,-17.9977390189],[-40.75101596404,-18.00252336752],[-40.76754496527,-17.99842250522],[-40.76754496527,-17.98133455271],[-40.80922679445,-17.94852104795],[-40.82431849123,-17.96014319437],[-40.8315050135,-17.94988839894],[-40.86528166818,-17.9827016498],[-40.88396662609,-17.9676629996],[-40.90911945405,-17.98475227559],[-40.77760609645,-18.1077461392],[-40.77832474868,-18.15145652556],[-40.79054183654,-18.15350518192],[-40.83509827463,-18.14531041238],[-40.89546506173,-18.10364773093],[-40.93283497755,-18.12755376077],[-40.95583184882,-18.12550480038],[-40.95295723991,-18.14462749757],[-40.96014376218,-18.1500907413],[-40.96373702332,-18.14326165996],[-40.97954737232,-18.13643231189],[-40.99248311241,-18.1500907413],[-40.99104580796,-18.16306526069],[-41.00901211364,-18.16306526069],[-41.0578804651,-18.16579661567],[-41.0578804651,-18.17535602159],[-41.09596903314,-18.19242508686],[-41.09596903314,-18.20539645898],[-41.10890477323,-18.21290575936],[-41.09812498982,-18.22997114669],[-41.1053115121,-18.23270145336],[-41.09884364205,-18.25590732904],[-41.1290270356,-18.27501572272],[-41.16136638583,-18.30572123183],[-41.15058660242,-18.37393619787],[-41.16424099474,-18.3793922314],[-41.16424099474,-18.40189654461],[-41.15058660242,-18.407351693],[-41.15849177692,-18.41144294087],[-41.17358347369,-18.41144294087],[-41.18867517046,-18.44485115689],[-41.0212292015,-18.46666526175],[-41.04638202946,-18.60362157901],[-41.03775820273,-18.61451885232],[-41.0578804651,-18.6267774504],[-41.04710068169,-18.64856833073],[-41.03488359382,-18.65401561396],[-40.99895098246,-18.67716461675],[-40.94505206541,-18.69418392578],[-40.94433341318,-18.76972898283],[-40.92133654191,-18.81055006856],[-40.93714689091,-18.82347468178],[-40.94720802209,-18.82143401943],[-40.97092354559,-18.83571813552],[-41.08375194528,-18.83231726565],[-41.10674881655,-18.83571813552],[-41.11752859996,-18.80782897078],[-41.13118299228,-18.79286214638],[-41.23610621747,-18.79490315535],[-41.25119791424,-18.81667237761],[-41.2476046531,-18.85544182257],[-41.22029586847,-18.8799231739],[-41.2080787806,-18.8799231739],[-41.20664147615,-18.86632286449],[-41.16424099474,-18.86700290617],[-41.15633582024,-18.88876278307],[-41.1290270356,-18.90440094845],[-41.1211218611,-18.92411655188],[-41.03919550719,-18.98664720231],[-41.07584677078,-19.00567361403],[-41.06506698737,-19.06341902698],[-40.96876758891,-19.12725524781],[-40.96158106664,-19.15101775756],[-40.92996036864,-19.20599786475],[-40.94648936987,-19.2229633254],[-40.94792667432,-19.24264106543],[-40.92564845527,-19.262994866],[-40.94936397877,-19.27859773554],[-40.92277384636,-19.31047723804],[-40.94361476096,-19.352521543],[-40.934272282,-19.38099701507],[-40.95726915327,-19.39184350499],[-40.9737981545,-19.42641186672],[-40.95439454437,-19.46165046782],[-40.97882872009,-19.50297829748],[-41.013324027,-19.50297829748],[-41.04638202946,-19.48333195583],[-41.05428720396,-19.48400945558],[-41.04135146387,-19.56664313353],[-41.09237577201,-19.58966465422],[-41.14627468905,-19.6560023745],[-41.16495964696,-19.65870945459],[-41.17933269151,-19.69389733589],[-41.19658034496,-19.74598826039],[-41.16999021255,-19.80617607525],[-41.18939382269,-19.82375473895],[-41.18867517046,-19.88526474348],[-41.21239069396,-19.89742873112],[-41.22963834742,-19.90215891837],[-41.24688600088,-19.93323948769],[-41.25479117538,-19.92918584689],[-41.26988287215,-19.93796860383],[-41.30653413574,-19.93391508438],[-41.31515796247,-19.9697175726],[-41.32450044142,-19.97647184801],[-41.31300200579,-20.01226467389],[-41.33671752929,-20.05547534637],[-41.34821596492,-20.08652567207],[-41.3554024872,-20.12094384129],[-41.37768070624,-20.1580529872],[-41.3870231852,-20.1863849412],[-41.4107387087,-20.19447883957],[-41.42079983988,-20.2025723174],[-41.7635969523,-20.20459562113],[-41.78515651912,-20.28483210523],[-41.8505538718,-20.32459783588],[-41.86348961189,-20.37513273815],[-41.85127252403,-20.38186947551],[-41.84336734953,-20.40948702116],[-41.80887204262,-20.4249776227],[-41.80671608594,-20.47211333219],[-41.83115026167,-20.4788458242],[-41.8110279993,-20.54211679742],[-41.83115026167,-20.55086497994],[-41.86205230744,-20.61814193832],[-41.82108913048,-20.64437190401],[-41.85342848071,-20.68068284947],[-41.87139478639,-20.72101815833],[-41.86780152526,-20.73849345818],[-41.88001861312,-20.73983762845],[-41.88289322203,-20.76739048664],[-41.85414713294,-20.77478186241],[-41.83330621835,-20.79829746931],[-41.80887204262,-20.80904624047],[-41.78443786689,-20.80568733178],[-41.75137986444,-20.82382454951],[-41.74706795107,-20.87486573082],[-41.72335242757,-20.87553720984],[-41.74131873325,-20.92723207622],[-41.72335242757,-20.97756707786],[-41.74347468994,-21.09763138917],[-41.72910164539,-21.12578887114],[-41.59399502666,-21.16332386392],[-41.57243545984,-21.18677840236],[-41.49050910593,-21.18878861828],[-41.48332258366,-21.20084933958],[-41.43948479779,-21.22094835332],[-41.41289466538,-21.20955924815],[-41.34965326938,-21.21290907619],[-41.27994400333,-21.24640317418],[-41.24473004419,-21.2323365795],[-41.17717673483,-21.25511039335],[-41.09237577201,-21.22429792287],[-41.04853798614,-21.25912893631],[-41.01547998369,-21.25578015812],[-41.00254424359,-21.28725566578],[-40.94577071764,-21.31403802661]]],"terms_url":"https://der.es.gov.br/","terms_text":"Departamento de Estradas de Rodagem do Estado do Espírito Santo"},{"id":"DigitalGlobe-Premium","name":"DigitalGlobe Premium Imagery","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.316c9a2e/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqZGFrZ2c2dzFlMWgyd2x0ZHdmMDB6NzYifQ.9Pl3XOO82ArX94fHV289Pg","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/DigitalGlobe","terms_text":"Terms & Feedback","default":true,"description":"Premium DigitalGlobe satellite imagery.","icon":"data:image/png;base64,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"},{"id":"DigitalGlobe-Premium-vintage","name":"DigitalGlobe Premium Imagery Vintage","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.2850d66c/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOTBkcmZjNzJ5ZnozNHF6NnVkOGd6ODYifQ.grAnqgpCjOaeq-ozqt4QNw","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/DigitalGlobe","terms_text":"Terms & Feedback","description":"Imagery boundaries and capture dates. Labels appear at zoom level 14 and higher.","icon":"data:image/png;base64,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","overlay":true},{"id":"DigitalGlobe-Standard","name":"DigitalGlobe Standard Imagery","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.0a8e44ba/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqZGFrZ3pjczNpaHYycXFyMGo0djY3N2IifQ.90uebT4-ow1uqZKTUrf6RQ","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/DigitalGlobe","terms_text":"Terms & Feedback","default":true,"description":"Standard DigitalGlobe satellite imagery.","icon":"data:image/png;base64,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"},{"id":"DigitalGlobe-Standard-vintage","name":"DigitalGlobe Standard Imagery Vintage","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.1412531a/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOTBlYWJ1ZDAza2YyeG14NWVodTA4OWUifQ.wVc8ZOuPuYVw39lhS2j3_g","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/DigitalGlobe","terms_text":"Terms & Feedback","description":"Imagery boundaries and capture dates. Labels appear at zoom level 14 and higher.","icon":"data:image/png;base64,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","overlay":true},{"id":"Erlangen-2011","name":"Erlangen Luftbild (2011 5,0 cm)","type":"wms","template":"https://secure.erlangen.de/arcgiser/services/Luftbilder2011/MapServer/WmsServer?FORMAT=image/bmp&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Erlangen_ratio10_5cm_gk4.jp2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2011-01-01T00:00:00.000Z","startDate":"2011-01-01T00:00:00.000Z","polygon":[[[10.909347,49.529292],[10.909347,49.65211],[11.077808,49.65211],[11.077808,49.529292],[10.909347,49.529292]]],"terms_text":"© Stadt Erlangen | © Aerowest GmbH"},{"id":"Erlangen-2013","name":"Erlangen Luftbild (2013 6,25 cm)","type":"wms","template":"https://secure.erlangen.de/arcgiser/services/Luftbilder2013/MapServer/WmsServer?FORMAT=image/bmp&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Erlangen_ratio5_6.25cm.jp2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2013-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","polygon":[[[10.905885,49.529259],[10.905885,49.65197],[11.060541,49.65197],[11.060541,49.529259],[10.905885,49.529259]]],"terms_text":"© Stadt Erlangen | © Aerowest GmbH"},{"id":"Erlangen-2016","name":"Erlangen Luftbild (2016 5,0 cm)","type":"wms","template":"https://secure.erlangen.de/arcgiser/services/Luftbild2016/MapServer/WmsServer?FORMAT=image/bmp&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2016-03-18T00:00:00.000Z","startDate":"2016-03-18T00:00:00.000Z","polygon":[[[10.97664,49.537646],[10.9910133,49.5339157],[10.9938879,49.538346],[11.0278442,49.532545],[11.034604,49.5346153],[11.034065,49.537588],[11.0431829,49.543213],[11.035569,49.5530346],[11.0383994,49.5584249],[11.0350756,49.569291],[11.037905,49.5865909],[11.047966,49.5902015],[11.0492241,49.5936954],[11.0574886,49.595209],[11.056231,49.5990522],[11.0512678,49.600304],[11.053513,49.609036],[11.043093,49.613809],[11.040757,49.618232],[11.0284955,49.61735],[11.0192878,49.6189603],[11.0152,49.613722],[11.005813,49.6144788],[11.00639,49.6193095],[11.0008274,49.622103],[10.9856009,49.616515],[10.978369,49.617534],[10.973698,49.6249544],[10.9653888,49.6255654],[10.9606278,49.6285622],[10.9638168,49.6317624],[10.9547438,49.6379],[10.9483658,49.636998],[10.941853,49.643775],[10.9273003,49.648371],[10.9206303,49.639631],[10.9113552,49.6377259],[10.9242909,49.6050488],[10.9220451,49.580038],[10.9122086,49.5700778],[10.914409,49.5618046],[10.9235273,49.5584249],[10.9271206,49.559765],[10.9334537,49.55892],[10.9307139,49.544671],[10.930669,49.5322541],[10.9405953,49.533245],[10.9548785,49.5302135],[10.9719915,49.531263],[10.97664,49.537646]]],"terms_text":"© Stadt Erlangen | © Geocart GmbH"},{"id":"EsriWorldImagery","name":"Esri World Imagery","type":"tms","template":"https://{switch:services,server}.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/Esri","terms_text":"Terms & Feedback","default":true,"description":"Esri world imagery.","icon":"data:image/png;base64,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"},{"id":"EsriWorldImageryClarity","name":"Esri World Imagery (Clarity) Beta","type":"tms","template":"https://clarity.maptiles.arcgis.com/arcgis/rest/services/World_Imagery/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/Esri","terms_text":"Terms & Feedback","default":true,"description":"Esri archive imagery that may be clearer and more accurate than the default layer.","icon":"data:image/png;base64,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"},{"id":"maaamet.ee-pohi_vr2","name":"Estonia Basemap (Maaamet)","type":"wms","template":"http://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=pohi_vr2&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:4326","polygon":[[[22.3536433,58.8538478],[22.0941083,58.8503765],[22.09179,58.8950979],[22.0050343,58.8937111],[21.9997875,58.9837386],[22.3475423,58.9884539],[22.3453459,59.0333735],[22.5193454,59.0353825],[22.5155628,59.1251033],[22.6901723,59.1268565],[22.6921246,59.0821845],[22.7791243,59.0829995],[22.7808326,59.0381447],[22.8680763,59.0387725],[22.8692965,58.9939856],[22.9562963,58.9948656],[22.954954,59.0395885],[23.1289535,59.0409695],[23.1278553,59.0858205],[23.4767083,59.0877011],[23.4741459,59.2672589],[23.6492435,59.2678824],[23.6488774,59.3128106],[23.7369753,59.3129974],[23.7364872,59.3578039],[23.9115848,59.3578661],[23.9120729,59.4027997],[24.1760005,59.4027997],[24.1763666,59.4477979],[24.2644645,59.4476738],[24.2647085,59.4923646],[24.7060521,59.490816],[24.7089805,59.6255274],[24.7974445,59.6249721],[24.7965903,59.5800862],[24.9732742,59.5788506],[24.9746164,59.6238615],[24.8860304,59.6247253],[24.8872506,59.6691818],[24.9762027,59.6686273],[24.9773008,59.7134564],[25.0660088,59.7125949],[25.0632024,59.6230593],[25.2403743,59.621455],[25.2418385,59.6664705],[25.3305465,59.6654845],[25.3288383,59.6207762],[25.4175462,59.6197889],[25.4193765,59.6646834],[25.6855005,59.6614786],[25.6875748,59.7061327],[25.8651128,59.7038552],[25.8627944,59.6590132],[26.1285523,59.6550682],[26.1257459,59.6100991],[26.3911377,59.6056544],[26.3880872,59.5609901],[26.8296748,59.552149],[26.8262583,59.5072897],[26.9142342,59.5054941],[26.9105736,59.4605107],[27.9668941,59.4330327],[27.9718969,59.4778048],[28.0366891,59.4756977],[28.0437662,59.472227],[28.0476708,59.4657804],[28.0518195,59.4634246],[28.0691462,59.4625567],[28.0845206,59.4593946],[28.1217365,59.4409124],[28.1357687,59.4276958],[28.1371109,59.4226684],[28.1416256,59.419006],[28.1665176,59.4120525],[28.1722525,59.4078922],[28.1927517,59.4014954],[28.2106885,59.383603],[28.2106885,59.3799364],[28.2038555,59.3745911],[28.2105665,59.3723533],[28.2110546,59.3693693],[28.2067839,59.3671933],[28.207028,59.3637736],[28.1997068,59.3609133],[28.2020252,59.3573064],[28.1926297,59.3522685],[28.1939719,59.3464212],[28.1696901,59.3335411],[28.1362568,59.2924414],[28.1251531,59.2890141],[28.1172218,59.2889518],[28.1099006,59.2906343],[28.0535278,59.2901981],[28.0202165,59.2833429],[27.998253,59.2753018],[27.9798281,59.2729328],[27.9643317,59.2726834],[27.95335,59.2686307],[27.9492013,59.2653258],[27.9056404,59.2404352],[27.9011257,59.2348807],[27.9010037,59.2263912],[27.8978312,59.2174624],[27.9023459,59.207282],[27.8923404,59.1922244],[27.8897779,59.1837868],[27.8764779,59.1737214],[27.8718411,59.1684062],[27.8681805,59.161589],[27.8441428,59.1481382],[27.8320629,59.1440081],[27.820349,59.133618],[27.8098553,59.1290479],[27.8059507,59.1216592],[27.8053406,59.1127031],[27.8107095,59.1081928],[27.8100994,59.1060627],[27.8020461,59.1028047],[27.788868,59.0908979],[27.7906983,59.0811186],[27.7937488,59.0784226],[27.7941149,59.0756636],[27.7927727,59.0729044],[27.7930167,59.069267],[27.788502,59.06657],[27.7826451,59.0650019],[27.7750799,59.0581013],[27.7731276,59.0510739],[27.7766661,59.0474341],[27.769833,59.0332479],[27.7660504,59.0315527],[27.7515302,59.0301714],[27.7462833,59.0271573],[27.7456732,59.0170459],[27.7416466,59.0095074],[27.7478696,58.9926656],[27.7427448,58.9884539],[27.7321291,58.9854991],[27.6544028,58.9878252],[27.6550129,58.9924142],[27.3941358,58.9996422],[27.3897431,58.9547414],[27.1293541,58.9613481],[27.1255715,58.9163975],[27.0388158,58.9184133],[27.027102,58.784103],[27.1136136,58.7818263],[27.1093429,58.7370852],[27.1953665,58.7351221],[27.1873132,58.6453349],[27.2730927,58.6430491],[27.2525935,58.4188307],[27.5339699,58.4114172],[27.5552012,58.3657519],[27.5176193,58.3326492],[27.5140807,58.322142],[27.4999265,58.3224624],[27.4868704,58.1880305],[27.528723,58.1868727],[27.592051,58.1187543],[27.6369541,58.0973519],[27.6093777,58.053992],[27.6226778,58.0057957],[27.6448853,58.0020458],[27.6529386,58.0064422],[27.6478138,58.0142638],[27.6478138,58.020856],[27.661724,58.0186587],[27.6685571,58.0104502],[27.6839315,58.0084463],[27.6964995,58.0045027],[27.7006481,57.9986189],[27.6988178,57.9882713],[27.6912527,57.9854899],[27.680637,57.9744915],[27.6821012,57.9719031],[27.6889343,57.9718384],[27.6858838,57.9592823],[27.6589176,57.955398],[27.6675809,57.9509954],[27.6716076,57.9462684],[27.6691672,57.9417351],[27.6764883,57.9355171],[27.6824673,57.9365535],[27.6861278,57.9279374],[27.6824673,57.9243737],[27.7107757,57.9239202],[27.7202932,57.9203561],[27.7205373,57.9117361],[27.7083353,57.9061612],[27.6988178,57.9061612],[27.706139,57.9013635],[27.7289566,57.9073929],[27.7467714,57.9016877],[27.7536045,57.9040866],[27.7573871,57.9031789],[27.7559228,57.8980566],[27.769589,57.8956572],[27.7809368,57.8983159],[27.7989956,57.8996128],[27.8185187,57.8957869],[27.8209591,57.890469],[27.8194949,57.8880043],[27.8105875,57.8861232],[27.8182747,57.8824905],[27.8116856,57.8720446],[27.8158343,57.8716552],[27.8183967,57.8651005],[27.8163224,57.8613359],[27.7987516,57.8520525],[27.7946029,57.8463384],[27.8005819,57.8441954],[27.7957011,57.8401688],[27.788624,57.8418575],[27.7841093,57.837246],[27.7771542,57.8325041],[27.7584853,57.8353623],[27.7416466,57.8267869],[27.7238318,57.8317895],[27.7054069,57.8419224],[27.6877141,57.8341931],[27.6663607,57.8365315],[27.6602598,57.8389348],[27.6481799,57.8377007],[27.636344,57.8397792],[27.6248742,57.8375058],[27.6220677,57.8387399],[27.5979079,57.8332836],[27.5625224,57.8302303],[27.5562994,57.8312698],[27.5522727,57.8211338],[27.5444635,57.8220436],[27.5451956,57.8180795],[27.5505645,57.8176896],[27.5566654,57.81366],[27.5408029,57.81288],[27.5447076,57.8080049],[27.5372644,57.8064447],[27.5395827,57.8014386],[27.5359222,57.7966269],[27.5386066,57.7939607],[27.5292111,57.7885626],[27.5174973,57.7887577],[27.5184734,57.7920097],[27.502977,57.7879772],[27.5000485,57.7897333],[27.4958999,57.7886927],[27.5077357,57.783489],[27.5145688,57.7751615],[27.5081018,57.7715827],[27.5111523,57.7641637],[27.515911,57.7639034],[27.5201817,57.7599329],[27.5281129,57.7581753],[27.5300652,57.7536834],[27.5311634,57.7407253],[27.5480021,57.7332999],[27.5419011,57.7303684],[27.5279909,57.7294564],[27.5235982,57.7161637],[27.5276249,57.708994],[27.5235982,57.7080162],[27.5165211,57.7087333],[27.5106642,57.7110147],[27.5085899,57.707234],[27.4999265,57.7049523],[27.4952898,57.7074947],[27.4871145,57.7190963],[27.4735703,57.7154468],[27.4706419,57.7080162],[27.4614904,57.706191],[27.4480683,57.7161637],[27.4308636,57.7075599],[27.4281792,57.6990193],[27.4134149,57.6991498],[27.4164653,57.6952374],[27.4074359,57.6927593],[27.4023111,57.6849328],[27.3913294,57.6853894],[27.3937698,57.679127],[27.3914514,57.676713],[27.3819339,57.6733202],[27.3777852,57.668361],[27.3836422,57.6605944],[27.3801036,57.658832],[27.3875468,57.6555028],[27.3804697,57.6494964],[27.3835201,57.6479947],[27.3815678,57.643685],[27.3907193,57.6430972],[27.3881569,57.6400931],[27.4008469,57.6374154],[27.4031652,57.6290542],[27.401823,57.6237622],[27.3959661,57.6211486],[27.3902312,57.6203644],[27.3908413,57.616901],[27.401945,57.6177506],[27.4063377,57.6154633],[27.4068258,57.6124569],[27.3857165,57.603044],[27.3782733,57.5951327],[27.35692,57.5969636],[27.3413015,57.5898357],[27.3417896,57.5853883],[27.3288555,57.5796974],[27.3214124,57.5789778],[27.3341024,57.5659571],[27.331784,57.5606559],[27.3377629,57.5600668],[27.3388611,57.5467119],[27.3438639,57.5454024],[27.3547236,57.5257533],[27.3513071,57.516318],[27.3456942,57.5210359],[27.3244628,57.5227395],[27.2966424,57.5385919],[27.2801699,57.5364306],[27.2737028,57.5431105],[27.2643074,57.5437654],[27.2636973,57.5484143],[27.2577183,57.5497892],[27.2479568,57.5476941],[27.2248951,57.5538482],[27.1932922,57.5496583],[27.1614451,57.5592159],[27.1165421,57.5611795],[27.1009236,57.5653027],[27.0850611,57.5753796],[27.0726151,57.5773423],[27.0722491,57.5798936],[27.0558985,57.5825102],[27.052848,57.5808749],[27.0468691,57.5804824],[27.0449168,57.5825102],[27.0332029,57.5853229],[27.0412562,57.5876121],[27.0441847,57.596702],[27.0310066,57.604613],[26.9951329,57.604613],[26.9923265,57.6107575],[26.9869576,57.6086659],[26.9836631,57.6117379],[26.9754878,57.6119994],[26.9709731,57.6044822],[26.9595033,57.6062473],[26.957795,57.6046784],[26.9459592,57.6027171],[26.9396142,57.6093195],[26.951328,57.61579],[26.9499858,57.6205605],[26.9405903,57.6197763],[26.9296086,57.6237622],[26.9264361,57.6331044],[26.906791,57.6330391],[26.8997139,57.6305568],[26.900568,57.6291849],[26.8958093,57.6257223],[26.8884881,57.6235662],[26.8889762,57.6219327],[26.8745779,57.6190575],[26.8727476,57.6173585],[26.8655485,57.6159207],[26.8578613,57.6099732],[26.8646944,57.6084044],[26.8581053,57.6004943],[26.8599356,57.5959828],[26.8643283,57.5941518],[26.8617659,57.5910783],[26.8468795,57.5883969],[26.8350437,57.5824448],[26.8158867,57.581529],[26.8095417,57.5847342],[26.7968517,57.5817907],[26.799292,57.5800245],[26.792947,57.573155],[26.7868461,57.5752487],[26.7765965,57.5599359],[26.7691533,57.5603941],[26.7635404,57.563143],[26.7536569,57.5624885],[26.7581716,57.5653027],[26.7689093,57.5704069],[26.77379,57.5747253],[26.7676891,57.5775385],[26.748044,57.5778002],[26.7531688,57.5800899],[26.7381604,57.5877429],[26.729009,57.5801553],[26.7382824,57.5758375],[26.7307172,57.5690328],[26.7238842,57.5724353],[26.7110721,57.5659571],[26.6997244,57.5710612],[26.697528,57.5706032],[26.697406,57.5673314],[26.6915491,57.5661534],[26.6756866,57.5666769],[26.6710498,57.5632739],[26.671904,57.5538482],[26.6653149,57.5528663],[26.646524,57.5539137],[26.6426194,57.546581],[26.6344441,57.5435689],[26.6144329,57.5290944],[26.6171173,57.5088466],[26.6046714,57.5121237],[26.6047934,57.5144175],[26.5953979,57.5137621],[26.5947878,57.5159248],[26.5880768,57.5161869],[26.5901511,57.5251637],[26.5869786,57.5262119],[26.5877107,57.537806],[26.5838061,57.5395743],[26.5797794,57.5369546],[26.5796574,57.5337452],[26.5612325,57.5285048],[26.5618426,57.5226085],[26.5666014,57.5194633],[26.557938,57.5136966],[26.5258469,57.5161869],[26.4996128,57.5245085],[26.4909494,57.5453369],[26.4699621,57.5755104],[26.4015093,57.5723699],[26.3448924,57.5840801],[26.3347648,57.5796974],[26.3278097,57.579632],[26.3263455,57.5827719],[26.3117032,57.5847342],[26.3085307,57.5929094],[26.3005994,57.5934325],[26.2929122,57.5911437],[26.2835167,57.5923208],[26.2821745,57.5951981],[26.2775378,57.5950019],[26.2703387,57.600102],[26.2702166,57.604613],[26.2542321,57.6138294],[26.247155,57.6208219],[26.2481312,57.6277476],[26.2394678,57.6340842],[26.2420302,57.6353906],[26.2466669,57.6355865],[26.2395898,57.6464929],[26.2323907,57.6461011],[26.2311705,57.6490394],[26.2421522,57.6514551],[26.2362953,57.6575265],[26.2303164,57.6580487],[26.2104272,57.6660116],[26.2137217,57.668883],[26.2109153,57.6707102],[26.2101832,57.6790617],[26.2007877,57.6810188],[26.1989574,57.6835629],[26.1944427,57.6851937],[26.1854133,57.6845414],[26.177116,57.687607],[26.1887078,57.6947157],[26.1985914,57.7090592],[26.2056685,57.7148602],[26.1726013,57.7286746],[26.1409983,57.7327788],[26.1356294,57.7392273],[26.139046,57.7454793],[26.1355074,57.7502978],[26.1053687,57.7570036],[26.0803547,57.7654654],[26.0797446,57.7638383],[26.0732776,57.7637081],[26.0704712,57.7655956],[26.0591234,57.7598678],[26.0489958,57.7611046],[26.0435049,57.7670274],[26.0332553,57.7705416],[26.0237378,57.7676131],[26.0177589,57.7722985],[26.0245919,57.7751615],[26.024958,57.7816025],[26.0225176,57.7835541],[26.0277644,57.7897984],[26.0308149,57.7909691],[26.0333773,57.8010485],[26.0367939,57.8059246],[26.0360617,57.8108],[26.0485077,57.8228883],[26.057049,57.8384152],[26.0555848,57.8476372],[26.0366718,57.8492605],[26.0200772,57.8451696],[26.0095836,57.8573112],[25.9984798,57.8581552],[25.9627282,57.8449098],[25.9310032,57.8524421],[25.8953736,57.849715],[25.8882964,57.8459488],[25.8808533,57.8494553],[25.885734,57.8527667],[25.8842698,57.8559479],[25.8756064,57.8579604],[25.8747523,57.8632183],[25.8594999,57.8561427],[25.8192336,57.8641919],[25.7831159,57.8994831],[25.7862884,57.9042811],[25.7716461,57.9120602],[25.7510248,57.9169213],[25.7372366,57.9229482],[25.7283292,57.9213281],[25.7224723,57.9124491],[25.7035593,57.9033086],[25.6791555,57.9046052],[25.6754949,57.9127732],[25.6620728,57.9151066],[25.6560938,57.9143936],[25.6488947,57.9166621],[25.6498709,57.9184119],[25.638279,57.9305937],[25.5798318,57.9441961],[25.593986,57.9596059],[25.5893493,57.9650431],[25.5823942,57.9678261],[25.5804419,57.9720973],[25.574829,57.9741033],[25.5655556,57.9671789],[25.5660436,57.9625835],[25.5571362,57.9603827],[25.555672,57.9671142],[25.5507912,57.9725502],[25.5372471,57.9713855],[25.5256553,57.9718384],[25.5226048,57.9680203],[25.5163818,57.9673731],[25.5121111,57.9697676],[25.5221167,57.9748797],[25.5194323,57.9803146],[25.4853889,57.9747503],[25.4784338,57.9800558],[25.4784338,57.9826436],[25.4421941,57.9961616],[25.4481731,58.0011406],[25.4664759,58.0051492],[25.4481731,58.0169784],[25.4069306,58.0289329],[25.371545,58.0292559],[25.3637358,58.0317109],[25.3533641,58.0433376],[25.3448228,58.0467603],[25.3360374,58.0570909],[25.3292043,58.0585757],[25.3266419,58.0638042],[25.3198088,58.0659987],[25.3190767,58.0692901],[25.295527,58.0816142],[25.2868636,58.0814852],[25.2811287,58.0701936],[25.2659983,58.0671604],[25.2650222,58.0599959],[25.2799085,58.0506346],[25.2930866,58.0466957],[25.3043124,58.0344888],[25.3011399,58.0150395],[25.2974793,58.014587],[25.3028482,58.0001061],[25.295771,57.9997181],[25.2973573,57.9966143],[25.3035803,57.9939628],[25.3013839,57.9927341],[25.2918664,57.9928634],[25.283081,57.9896296],[25.2672185,57.9945449],[25.2561148,57.9938982],[25.2550166,58.0034682],[25.2454991,58.0030157],[25.2276843,58.0178186],[25.2458652,58.0187234],[25.2356156,58.0228592],[25.2363477,58.02441],[25.2273182,58.0243454],[25.2253659,58.0219545],[25.2190209,58.0297728],[25.2165806,58.0408834],[25.2269522,58.0479872],[25.2281724,58.0534755],[25.2212173,58.0530236],[25.2214613,58.0505055],[25.2178007,58.0490849],[25.2159705,58.059544],[25.2121879,58.0622551],[25.2052328,58.0612223],[25.2038906,58.0650951],[25.2162145,58.07413],[25.2120658,58.0805175],[25.1996199,58.0853558],[25.1894923,58.0800659],[25.1916886,58.0761302],[25.1534966,58.0747752],[25.1515443,58.0770335],[25.1339735,58.0797433],[25.1057871,58.0774852],[25.105177,58.0664505],[25.0766245,58.0664505],[25.0203736,58.0176893],[24.9951156,58.010838],[24.9486263,58.0094159],[24.832342,57.9717737],[24.8080602,57.9906644],[24.7422918,57.9818673],[24.74339,57.9649137],[24.7328963,57.9623894],[24.7150815,57.962713],[24.6918978,57.9465274],[24.6733509,57.9589586],[24.6446764,57.9588939],[24.64187,57.9542327],[24.6457746,57.9526788],[24.6286919,57.9419294],[24.6161239,57.943678],[24.6089248,57.9512544],[24.5846429,57.9617421],[24.5731731,57.9543622],[24.5479151,57.9493766],[24.5435225,57.9447789],[24.5301003,57.9470455],[24.5207049,57.9430304],[24.5183865,57.9367478],[24.5096011,57.9344158],[24.5132617,57.9306585],[24.4625017,57.9249569],[24.445785,57.9079764],[24.4601833,57.906615],[24.4522521,57.8994183],[24.4600613,57.8797658],[24.4113756,57.8649058],[24.4090573,57.8719148],[24.3370659,57.8739264],[24.3382861,58.0109027],[24.4227234,58.0109673],[24.42614,58.280018],[24.5115534,58.2796972],[24.5121635,58.324705],[24.426384,58.3250254],[24.4271161,58.3697196],[24.3418247,58.3701675],[24.3404825,58.2354672],[24.1701436,58.2357242],[24.1701436,58.1907961],[24.0848522,58.1909248],[24.0850962,58.2360454],[24.0006589,58.2357884],[23.9999268,58.2809162],[23.8297099,58.2804671],[23.8294659,58.325538],[23.658639,58.3249613],[23.6579069,58.4149324],[23.5722493,58.4146768],[23.5712732,58.5043556],[23.3993481,58.5035906],[23.4010564,58.4139098],[23.1442059,58.4123759],[23.1456701,58.3673518],[23.0598906,58.3670318],[23.0617209,58.3222061],[22.9756973,58.3215653],[22.9771615,58.2768102],[22.8918701,58.2759761],[22.8935784,58.2310348],[22.808653,58.2301996],[22.8101172,58.1853932],[22.8952866,58.1861008],[22.8966288,58.1413032],[22.726412,58.1398218],[22.7249478,58.18475],[22.555219,58.1827558],[22.5569273,58.1374387],[22.6417307,58.1388557],[22.6434389,58.0939986],[22.3890288,58.0909029],[22.3852462,58.1806329],[22.2999548,58.1796678],[22.3067879,58.045275],[22.2219845,58.0435959],[22.2262552,57.9540384],[22.1420619,57.9528083],[22.1445023,57.9080412],[22.060065,57.9068095],[22.0626274,57.8618552],[21.978068,57.8604272],[21.9683065,58.0400438],[22.0527438,58.0413355],[22.0450566,58.1758075],[21.9603753,58.1747137],[21.9578129,58.219405],[21.78723,58.2163845],[21.7821052,58.3063113],[21.6968137,58.304901],[21.6940073,58.3497486],[21.7794207,58.3512212],[21.7679509,58.5307369],[22.0256555,58.5348771],[22.0279739,58.4900096],[22.1137534,58.4916676],[22.1114351,58.5362146],[22.1970926,58.5374247],[22.1945302,58.5822952],[22.4523568,58.5857297],[22.4463779,58.7203003],[22.3602323,58.7191599],[22.3536433,58.8538478]],[[23.4741459,59.2672589],[23.2986822,59.2663235],[23.2979501,59.3113783],[23.4729257,59.3119388],[23.4741459,59.2672589]],[[24.1701436,58.1907961],[24.255069,58.1907318],[24.2545809,58.1458112],[24.1700216,58.1458756],[24.1701436,58.1907961]],[[24.0848522,58.1909248],[24.0849742,58.1012852],[23.9996827,58.1011563],[23.9999268,58.0563162],[23.9152454,58.0561225],[23.9150014,58.1461332],[23.83032,58.1460044],[23.8297099,58.2357242],[23.9145133,58.2358527],[23.9147573,58.1909891],[24.0848522,58.1909248]],[[24.6185366,59.5361187],[24.4418254,59.5367966],[24.4430922,59.6265878],[24.6201552,59.6258049],[24.6185366,59.5361187]],[[26.4040316,59.7851966],[26.3150064,59.7866741],[26.3181415,59.8315183],[26.4073159,59.8299428],[26.4040316,59.7851966]],[[26.4830816,59.6490028],[26.4864655,59.6938311],[26.5751422,59.692023],[26.5716589,59.6471923],[26.4830816,59.6490028]],[[23.1594369,57.784083],[23.2434645,57.7846083],[23.2444497,57.73971],[23.3284773,57.740311],[23.3267883,57.8299754],[23.1584517,57.8288513],[23.1594369,57.784083]]],"terms_text":"Maa-Ameti põhikaart"},{"id":"maaamet.ee-cir_ngr","name":"Estonia Forestry (Maaamet)","type":"wms","template":"http://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=cir_ngr&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:4326","polygon":[[[21.6940073,57.5025466],[21.6940073,59.8274564],[28.2110546,59.8274564],[28.2110546,57.5025466],[21.6940073,57.5025466]]],"terms_text":"Maa-Ameti metsanduslik ortofoto"},{"id":"maaamet.ee-reljeef","name":"Estonia Hillshading (Maaamet)","type":"wms","template":"http://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=reljeef&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:4326","polygon":[[[21.6940073,57.5025466],[21.6940073,59.8274564],[28.2110546,59.8274564],[28.2110546,57.5025466],[21.6940073,57.5025466]]],"terms_text":"Maa-Ameti reljeefikaart"},{"id":"maaamet.ee-orto","name":"Estonia Ortho (Maaamet)","type":"tms","template":"http://tiles.maaamet.ee/tm/tms/1.0.0/foto@GMC/{zoom}/{x}/{-y}.png","scaleExtent":[14,18],"polygon":[[[21.6940073,57.5025466],[21.6940073,59.8274564],[28.2110546,59.8274564],[28.2110546,57.5025466],[21.6940073,57.5025466]]],"terms_text":"Maa-Ameti ortofoto"},{"id":"estrela_de_alagoas","name":"Estrela de Alagoas","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Estrela%20de%20Alagoas&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.71382371133,-9.43475990551],[-36.7147678489,-9.34442676518],[-36.80585566705,-9.34497726095],[-36.80525485223,-9.43541609465],[-36.71382371133,-9.43475990551]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"FOMI_2000","name":"FÖMI orthophoto 2000","type":"tms","template":"http://e.tile.openstreetmap.hu/ortofoto2000/{zoom}/{x}/{y}.jpg","endDate":"2000-01-01T00:00:00.000Z","startDate":"2000-01-01T00:00:00.000Z","scaleExtent":[0,17],"polygon":[[[16.1139147,46.8691038],[16.1789749,46.90662],[16.2000429,46.9415079],[16.2217547,46.9355441],[16.2462784,46.9463851],[16.2553226,46.9642125],[16.2764694,46.9626082],[16.290583,47.0139849],[16.3016199,46.9992329],[16.3414618,46.9965225],[16.3505162,47.0106313],[16.3734016,46.9985929],[16.412765,47.00475],[16.4332705,46.9927417],[16.4478119,47.003893],[16.479997,46.9941169],[16.5121988,47.0011695],[16.4635584,47.0322699],[16.4478586,47.0227481],[16.439123,47.029663],[16.445673,47.038872],[16.520323,47.056103],[16.473213,47.0736169],[16.4637199,47.09392],[16.500798,47.110058],[16.500035,47.123295],[16.5295349,47.1287419],[16.5171609,47.1496938],[16.454951,47.1425878],[16.4648728,47.1683349],[16.4555643,47.1875584],[16.4305559,47.1847022],[16.4195013,47.1949147],[16.4189215,47.2107114],[16.4371293,47.2097043],[16.4426335,47.2337117],[16.4313127,47.2527554],[16.4671512,47.2531652],[16.4892319,47.2798885],[16.4646338,47.3338455],[16.4337002,47.3528101],[16.458513,47.3670496],[16.4454619,47.4070195],[16.4831657,47.4093628],[16.4963821,47.3892659],[16.5170941,47.4100218],[16.5749054,47.4054243],[16.5807291,47.4191699],[16.661847,47.455595],[16.6706419,47.47422],[16.6523395,47.500342],[16.6895619,47.510161],[16.7147797,47.540199],[16.663545,47.567733],[16.673199,47.6049544],[16.6595343,47.6061018],[16.652758,47.622852],[16.6314207,47.6283176],[16.5739108,47.619667],[16.5147382,47.6461964],[16.4967504,47.6393149],[16.425464,47.6621679],[16.4437449,47.674205],[16.4480507,47.6964725],[16.4746984,47.6811576],[16.4872245,47.6979767],[16.5521729,47.7225519],[16.5363779,47.736785],[16.5479799,47.751544],[16.6095193,47.7603722],[16.6344148,47.7590843],[16.65729,47.7414879],[16.7209405,47.7353565],[16.7534062,47.6828165],[16.8301587,47.681058],[16.8394284,47.7045139],[16.8668943,47.7211462],[16.876679,47.6876452],[17.0937421,47.7077706],[17.0706562,47.7285366],[17.0516019,47.7938499],[17.0749479,47.8084997],[17.047139,47.8285635],[17.0519452,47.8377691],[17.0105513,47.8581765],[17.0163878,47.8673325],[17.0857537,47.8746239],[17.113171,47.9271605],[17.0917133,47.9342916],[17.1183782,47.9601083],[17.094657,47.9708775],[17.2010289,48.019992],[17.241769,48.0224651],[17.257955,47.998655],[17.334651,47.993125],[17.4029929,47.947849],[17.4539199,47.8852579],[17.5267369,47.865509],[17.5675779,47.8151289],[17.608402,47.8218859],[17.7085789,47.756678],[17.7798739,47.739487],[17.8660959,47.74575],[17.9001292,47.7392633],[17.946867,47.744668],[17.9708709,47.7578392],[18.0044103,47.7463402],[18.0380583,47.7576812],[18.2958774,47.7314616],[18.4540681,47.7651226],[18.4931553,47.7527552],[18.5590761,47.7659963],[18.6460866,47.7590921],[18.7260691,47.7890411],[18.7411784,47.8138245],[18.7920013,47.8230869],[18.8485417,47.8167221],[18.855876,47.826077],[18.828014,47.834291],[18.8135749,47.85555],[18.76353,47.8716049],[18.756858,47.896838],[18.776746,47.955092],[18.7552499,47.9763469],[18.8157429,47.993442],[18.819998,48.039676],[18.833268,48.048239],[18.8749364,48.0470707],[18.886674,48.058682],[18.9089819,48.051139],[18.9439039,48.058865],[18.9816099,48.0536009],[19.0148639,48.078179],[19.0585249,48.0573529],[19.0843619,48.072781],[19.107402,48.065596],[19.1352889,48.074146],[19.2413679,48.0536529],[19.2557819,48.0715559],[19.3031119,48.088711],[19.3865969,48.091914],[19.400018,48.082304],[19.454053,48.101436],[19.467354,48.083933],[19.4944199,48.109906],[19.492377,48.1396639],[19.5128219,48.154663],[19.504518,48.173443],[19.528967,48.190358],[19.526044,48.20313],[19.577502,48.2160149],[19.6308263,48.2500725],[19.6445239,48.2391719],[19.669857,48.239212],[19.691219,48.203894],[19.721125,48.201473],[19.74618,48.2165119],[19.7871629,48.19253],[19.7987329,48.19482],[19.8052829,48.183733],[19.782415,48.165039],[19.794812,48.153529],[19.821331,48.169081],[19.8452819,48.162742],[19.8551729,48.178431],[19.8601309,48.169409],[19.898745,48.1663119],[19.9145359,48.146863],[19.898298,48.1249019],[19.937383,48.131118],[19.9743939,48.1660049],[19.988706,48.1621679],[20.029038,48.1776849],[20.049449,48.1671999],[20.0729859,48.179606],[20.0700369,48.1917019],[20.1340909,48.225182],[20.1331879,48.253982],[20.206162,48.250979],[20.2038299,48.261906],[20.228466,48.262779],[20.2349469,48.279933],[20.286858,48.26164],[20.3257109,48.272794],[20.3374649,48.301667],[20.3656579,48.316606],[20.384077,48.3511809],[20.4098349,48.365857],[20.402532,48.382565],[20.4205349,48.403858],[20.416228,48.418536],[20.507929,48.489363],[20.5065069,48.534415],[20.537471,48.527878],[20.5464939,48.544292],[20.586595,48.535759],[20.6538739,48.561413],[20.836359,48.58284],[20.8378,48.57421],[20.8504359,48.5816329],[20.8453301,48.5665046],[20.8681549,48.551818],[20.922323,48.559453],[20.9346349,48.538341],[20.955882,48.533963],[20.9561979,48.521666],[20.9815849,48.5177669],[21.0151139,48.532313],[21.0663209,48.525894],[21.1174479,48.4910549],[21.1608749,48.521499],[21.179634,48.518232],[21.221061,48.537497],[21.305488,48.5222489],[21.313377,48.550841],[21.326875,48.554129],[21.319384,48.561201],[21.4154499,48.558951],[21.4226649,48.578821],[21.4406099,48.585104],[21.514091,48.551065],[21.5420199,48.508395],[21.6139329,48.509416],[21.6201879,48.469826],[21.663549,48.417961],[21.6645609,48.392164],[21.7017409,48.380695],[21.711871,48.357617],[21.8174139,48.332787],[21.8352029,48.3346409],[21.837213,48.363253],[21.8842979,48.356047],[21.8848429,48.367539],[21.897883,48.36256],[21.8997959,48.3702229],[21.9281859,48.3615969],[21.9268059,48.370899],[21.949198,48.378728],[21.994463,48.377323],[22.0213259,48.392749],[22.0546049,48.377528],[22.0764859,48.387241],[22.086743,48.371564],[22.1359089,48.380519],[22.131056,48.3912329],[22.152768,48.3962409],[22.1561913,48.4093076],[22.2125722,48.4256468],[22.2371405,48.4100396],[22.2654858,48.4098675],[22.2398761,48.3870055],[22.2675722,48.3611612],[22.3178106,48.3545437],[22.3132861,48.3250712],[22.3372944,48.3079113],[22.3384267,48.2792074],[22.3847547,48.2339632],[22.4006407,48.249198],[22.4328384,48.2525166],[22.456386,48.2423109],[22.4899029,48.2534237],[22.4972201,48.2395546],[22.5161491,48.237965],[22.5311088,48.2094282],[22.5711442,48.1961428],[22.5616362,48.1816066],[22.5982449,48.144756],[22.5902763,48.1073414],[22.6754492,48.091997],[22.7347192,48.119848],[22.7576242,48.1200599],[22.7703914,48.1090162],[22.772319,48.1218742],[22.8027688,48.1221112],[22.8025285,48.1070813],[22.8254256,48.1175119],[22.8364365,48.080249],[22.8611284,48.0750312],[22.8677955,48.0524256],[22.8820424,48.0548053],[22.8659692,48.0113165],[22.835562,47.9905988],[22.8407599,47.9813636],[22.8725729,47.9752683],[22.8697274,47.9659593],[22.8915652,47.9672446],[22.897435,47.9540629],[22.8473299,47.9077579],[22.7928135,47.8908586],[22.7586924,47.8941446],[22.77775,47.8422508],[22.7136344,47.8360928],[22.6801938,47.7877527],[22.6111171,47.7717455],[22.5490018,47.7722246],[22.4812121,47.8108886],[22.4513078,47.803389],[22.4313319,47.7398119],[22.3566167,47.7486206],[22.3177714,47.7660887],[22.3176236,47.7433657],[22.2851369,47.7292757],[22.264325,47.7310675],[22.2589955,47.6979057],[22.2306796,47.693196],[22.1796501,47.5916115],[22.1289245,47.5978984],[22.0942787,47.5583628],[22.0782587,47.5621299],[22.0534529,47.5474795],[22.0712176,47.5380742],[22.0617872,47.5288029],[22.0451278,47.5398919],[22.0367222,47.5326653],[22.0071886,47.48362],[22.0327909,47.4508372],[22.0238835,47.3908631],[22.0119849,47.3758016],[21.9627373,47.381053],[21.9382461,47.3725317],[21.8777922,47.2857763],[21.8872845,47.2730473],[21.8534909,47.2397622],[21.8580662,47.1873597],[21.8124804,47.1667511],[21.7924092,47.1059751],[21.7268258,47.0983882],[21.6976037,47.057915],[21.6504151,47.0408303],[21.6888701,47.0019977],[21.6678744,46.9712337],[21.6814917,46.9652089],[21.6381964,46.9330487],[21.5984455,46.9274708],[21.6142857,46.8867275],[21.6016694,46.8668202],[21.520328,46.8373749],[21.5186086,46.8000703],[21.4831761,46.7650246],[21.5263389,46.7393249],[21.529369,46.7209721],[21.4923253,46.6859652],[21.4728438,46.6959075],[21.4299047,46.693937],[21.4309553,46.6781367],[21.4546661,46.660863],[21.4162375,46.6426231],[21.4097959,46.6218052],[21.3657038,46.6379501],[21.3300499,46.6318155],[21.3139733,46.617666],[21.3012351,46.5908672],[21.3207905,46.5828562],[21.2743045,46.5407362],[21.2600254,46.5021583],[21.2744188,46.4767333],[21.2964506,46.4762973],[21.3174343,46.4507288],[21.2895176,46.4154784],[21.2963256,46.4069601],[21.2250116,46.4136899],[21.2064214,46.4033825],[21.1992563,46.3479034],[21.1762269,46.3357664],[21.180497,46.3044494],[21.1155437,46.3018529],[21.1030549,46.2624637],[21.0708792,46.2539014],[21.0660827,46.2429394],[21.0366237,46.2480392],[21.0246723,46.2665329],[20.960817,46.2623039],[20.9465849,46.2793024],[20.9250701,46.2766191],[20.9218133,46.2618129],[20.8732713,46.2877555],[20.7756538,46.2759602],[20.7490474,46.2508489],[20.7618619,46.204563],[20.727401,46.2077485],[20.7341052,46.1939355],[20.7140487,46.1660531],[20.6843592,46.1447802],[20.6549178,46.1497739],[20.6394471,46.1267602],[20.5450486,46.1790935],[20.5014839,46.190334],[20.4949436,46.1709908],[20.4592293,46.1428837],[20.3975133,46.1574709],[20.3685325,46.1528554],[20.3557074,46.1696256],[20.2968136,46.1521542],[20.2549024,46.1158522],[20.2484757,46.1300956],[20.2330132,46.1241668],[20.1817362,46.1601137],[20.1364966,46.1449476],[20.1009667,46.1772756],[20.0636156,46.1437275],[20.0346142,46.1458888],[20.0158072,46.1768354],[19.9354075,46.1764243],[19.8533469,46.1500005],[19.8179747,46.1281652],[19.7585403,46.1479754],[19.6982054,46.1879317],[19.6827672,46.1800388],[19.661508,46.1904394],[19.6317396,46.1692993],[19.5676482,46.179106],[19.5604013,46.1665762],[19.5026585,46.1424492],[19.5271208,46.1210269],[19.4645033,46.0953827],[19.4665828,46.0820437],[19.4160037,46.0460453],[19.3803957,46.0358749],[19.3640923,46.0522965],[19.2819012,46.0148048],[19.2965348,45.9881173],[19.2856472,45.9968981],[19.1479857,45.9963445],[19.1338422,46.0370993],[19.104873,46.0401673],[19.0660427,46.0001999],[19.0796791,45.9636376],[19.0059803,45.9590674],[19.0092745,45.9236559],[18.9061334,45.9353801],[18.8794572,45.9166827],[18.8647137,45.9208493],[18.8685629,45.9113361],[18.8276792,45.9051714],[18.8220041,45.9145893],[18.8075092,45.9036055],[18.809247,45.8796189],[18.7956242,45.8784488],[18.7048857,45.9181883],[18.6700246,45.9108439],[18.6596602,45.9168934],[18.6651348,45.899279],[18.6412808,45.8890396],[18.6550179,45.8742393],[18.6277704,45.8733782],[18.6148449,45.8531438],[18.6236656,45.8398531],[18.5732391,45.8137578],[18.5749849,45.8004344],[18.559716,45.8037961],[18.5223504,45.7826858],[18.4906706,45.7947167],[18.4821905,45.7655032],[18.4562828,45.7695229],[18.4450763,45.7605195],[18.446853,45.737128],[18.40763,45.7397119],[18.3918949,45.7616983],[18.3642257,45.7729364],[18.3394214,45.7471605],[18.2968157,45.7612196],[18.2440473,45.7612305],[18.2307311,45.7790328],[18.1908702,45.7878759],[18.1681939,45.7762712],[18.1246514,45.7896277],[18.1068067,45.7708256],[18.0818922,45.7645205],[17.9958808,45.7957311],[17.9302095,45.7863301],[17.9066757,45.7925692],[17.8653145,45.7670064],[17.8262748,45.8099957],[17.8089784,45.8040989],[17.7809054,45.8174884],[17.7603399,45.811923],[17.7408624,45.8295975],[17.6632915,45.8381849],[17.6276211,45.8979446],[17.5700676,45.9358204],[17.4378254,45.9503823],[17.4258964,45.9272681],[17.4108059,45.9399665],[17.392149,45.9302149],[17.3828713,45.9475733],[17.3476208,45.9423413],[17.3438769,45.9605329],[17.3537711,45.9525011],[17.3905375,45.9581914],[17.387423,45.9661823],[17.3583539,45.9642737],[17.3754852,45.9686921],[17.3751895,45.9881054],[17.3635685,45.9915442],[17.3567202,45.9735836],[17.3339583,45.9960781],[17.3319847,45.9728948],[17.3129974,45.9665347],[17.323647,45.9887776],[17.2987653,45.9838652],[17.3041996,46.0021128],[17.2579726,46.0110256],[17.29632,46.0285169],[17.2541514,46.030005],[17.270955,46.0567055],[17.2324767,46.0592034],[17.2525145,46.0664725],[17.2313144,46.0790345],[17.2019916,46.0765488],[17.2331299,46.0989644],[17.2104017,46.1001693],[17.2129734,46.113855],[17.175927,46.1084583],[17.1743424,46.1287608],[17.1865197,46.1332308],[17.1810983,46.1505485],[17.1562307,46.1585819],[17.1592857,46.1696818],[17.1261012,46.1684495],[17.1227409,46.1789791],[17.0752482,46.1889531],[17.0661614,46.2022984],[16.9735401,46.2251982],[16.973954,46.2431113],[16.9504085,46.2415285],[16.8862356,46.2814598],[16.8713682,46.3252767],[16.8802109,46.3356966],[16.8615374,46.3452401],[16.8656232,46.3556489],[16.8521959,46.3517189],[16.8498589,46.3626245],[16.8352859,46.3638195],[16.8376499,46.3748032],[16.8261732,46.3670994],[16.7933444,46.387385],[16.7592072,46.3776563],[16.7298672,46.40149],[16.7182119,46.3898704],[16.6772872,46.4494536],[16.6631785,46.4486958],[16.6663732,46.4582995],[16.6187915,46.4619875],[16.604468,46.4760773],[16.5235997,46.5053761],[16.5325768,46.5314027],[16.5176728,46.5363516],[16.5084107,46.5652692],[16.4829969,46.5660383],[16.4834008,46.5786011],[16.4455713,46.610952],[16.4248583,46.6131645],[16.385941,46.6442485],[16.3915424,46.6637257],[16.4198454,46.6584771],[16.4286335,46.6939737],[16.3689211,46.7040082],[16.3798266,46.7153869],[16.3710856,46.7222945],[16.3570587,46.7142387],[16.3185954,46.7541449],[16.3305417,46.7752119],[16.3121626,46.7780033],[16.3127666,46.797314],[16.3406373,46.8051851],[16.3508404,46.8300552],[16.3403309,46.8468762],[16.3015007,46.8595142],[16.2913867,46.8728341],[16.2332296,46.8766702],[16.1560866,46.8537074],[16.126571,46.8569079],[16.1139147,46.8691038]]],"terms_url":"http://www.fomi.hu/","terms_text":"Földmérési és Távérzékelési Intézet"},{"id":"FOMI_2005","name":"FÖMI orthophoto 2005","type":"tms","template":"http://e.tile.openstreetmap.hu/ortofoto2005/{zoom}/{x}/{y}.jpg","endDate":"2005-01-01T00:00:00.000Z","startDate":"2005-01-01T00:00:00.000Z","scaleExtent":[0,17],"polygon":[[[16.1139147,46.8691038],[16.1789749,46.90662],[16.2000429,46.9415079],[16.2217547,46.9355441],[16.2462784,46.9463851],[16.2553226,46.9642125],[16.2764694,46.9626082],[16.290583,47.0139849],[16.3016199,46.9992329],[16.3414618,46.9965225],[16.3505162,47.0106313],[16.3734016,46.9985929],[16.412765,47.00475],[16.4332705,46.9927417],[16.4478119,47.003893],[16.479997,46.9941169],[16.5121988,47.0011695],[16.4635584,47.0322699],[16.4478586,47.0227481],[16.439123,47.029663],[16.445673,47.038872],[16.520323,47.056103],[16.473213,47.0736169],[16.4637199,47.09392],[16.500798,47.110058],[16.500035,47.123295],[16.5295349,47.1287419],[16.5171609,47.1496938],[16.454951,47.1425878],[16.4648728,47.1683349],[16.4555643,47.1875584],[16.4305559,47.1847022],[16.4195013,47.1949147],[16.4189215,47.2107114],[16.4371293,47.2097043],[16.4426335,47.2337117],[16.4313127,47.2527554],[16.4671512,47.2531652],[16.4892319,47.2798885],[16.4646338,47.3338455],[16.4337002,47.3528101],[16.458513,47.3670496],[16.4454619,47.4070195],[16.4831657,47.4093628],[16.4963821,47.3892659],[16.5170941,47.4100218],[16.5749054,47.4054243],[16.5807291,47.4191699],[16.661847,47.455595],[16.6706419,47.47422],[16.6523395,47.500342],[16.6895619,47.510161],[16.7147797,47.540199],[16.663545,47.567733],[16.673199,47.6049544],[16.6595343,47.6061018],[16.652758,47.622852],[16.6314207,47.6283176],[16.5739108,47.619667],[16.5147382,47.6461964],[16.4967504,47.6393149],[16.425464,47.6621679],[16.4437449,47.674205],[16.4480507,47.6964725],[16.4746984,47.6811576],[16.4872245,47.6979767],[16.5521729,47.7225519],[16.5363779,47.736785],[16.5479799,47.751544],[16.6095193,47.7603722],[16.6344148,47.7590843],[16.65729,47.7414879],[16.7209405,47.7353565],[16.7534062,47.6828165],[16.8301587,47.681058],[16.8394284,47.7045139],[16.8668943,47.7211462],[16.876679,47.6876452],[17.0937421,47.7077706],[17.0706562,47.7285366],[17.0516019,47.7938499],[17.0749479,47.8084997],[17.047139,47.8285635],[17.0519452,47.8377691],[17.0105513,47.8581765],[17.0163878,47.8673325],[17.0857537,47.8746239],[17.113171,47.9271605],[17.0917133,47.9342916],[17.1183782,47.9601083],[17.094657,47.9708775],[17.2010289,48.019992],[17.241769,48.0224651],[17.257955,47.998655],[17.334651,47.993125],[17.4029929,47.947849],[17.4539199,47.8852579],[17.5267369,47.865509],[17.5675779,47.8151289],[17.608402,47.8218859],[17.7085789,47.756678],[17.7798739,47.739487],[17.8660959,47.74575],[17.9001292,47.7392633],[17.946867,47.744668],[17.9708709,47.7578392],[18.0044103,47.7463402],[18.0380583,47.7576812],[18.2958774,47.7314616],[18.4540681,47.7651226],[18.4931553,47.7527552],[18.5590761,47.7659963],[18.6460866,47.7590921],[18.7260691,47.7890411],[18.7411784,47.8138245],[18.7920013,47.8230869],[18.8485417,47.8167221],[18.855876,47.826077],[18.828014,47.834291],[18.8135749,47.85555],[18.76353,47.8716049],[18.756858,47.896838],[18.776746,47.955092],[18.7552499,47.9763469],[18.8157429,47.993442],[18.819998,48.039676],[18.833268,48.048239],[18.8749364,48.0470707],[18.886674,48.058682],[18.9089819,48.051139],[18.9439039,48.058865],[18.9816099,48.0536009],[19.0148639,48.078179],[19.0585249,48.0573529],[19.0843619,48.072781],[19.107402,48.065596],[19.1352889,48.074146],[19.2413679,48.0536529],[19.2557819,48.0715559],[19.3031119,48.088711],[19.3865969,48.091914],[19.400018,48.082304],[19.454053,48.101436],[19.467354,48.083933],[19.4944199,48.109906],[19.492377,48.1396639],[19.5128219,48.154663],[19.504518,48.173443],[19.528967,48.190358],[19.526044,48.20313],[19.577502,48.2160149],[19.6308263,48.2500725],[19.6445239,48.2391719],[19.669857,48.239212],[19.691219,48.203894],[19.721125,48.201473],[19.74618,48.2165119],[19.7871629,48.19253],[19.7987329,48.19482],[19.8052829,48.183733],[19.782415,48.165039],[19.794812,48.153529],[19.821331,48.169081],[19.8452819,48.162742],[19.8551729,48.178431],[19.8601309,48.169409],[19.898745,48.1663119],[19.9145359,48.146863],[19.898298,48.1249019],[19.937383,48.131118],[19.9743939,48.1660049],[19.988706,48.1621679],[20.029038,48.1776849],[20.049449,48.1671999],[20.0729859,48.179606],[20.0700369,48.1917019],[20.1340909,48.225182],[20.1331879,48.253982],[20.206162,48.250979],[20.2038299,48.261906],[20.228466,48.262779],[20.2349469,48.279933],[20.286858,48.26164],[20.3257109,48.272794],[20.3374649,48.301667],[20.3656579,48.316606],[20.384077,48.3511809],[20.4098349,48.365857],[20.402532,48.382565],[20.4205349,48.403858],[20.416228,48.418536],[20.507929,48.489363],[20.5065069,48.534415],[20.537471,48.527878],[20.5464939,48.544292],[20.586595,48.535759],[20.6538739,48.561413],[20.836359,48.58284],[20.8378,48.57421],[20.8504359,48.5816329],[20.8453301,48.5665046],[20.8681549,48.551818],[20.922323,48.559453],[20.9346349,48.538341],[20.955882,48.533963],[20.9561979,48.521666],[20.9815849,48.5177669],[21.0151139,48.532313],[21.0663209,48.525894],[21.1174479,48.4910549],[21.1608749,48.521499],[21.179634,48.518232],[21.221061,48.537497],[21.305488,48.5222489],[21.313377,48.550841],[21.326875,48.554129],[21.319384,48.561201],[21.4154499,48.558951],[21.4226649,48.578821],[21.4406099,48.585104],[21.514091,48.551065],[21.5420199,48.508395],[21.6139329,48.509416],[21.6201879,48.469826],[21.663549,48.417961],[21.6645609,48.392164],[21.7017409,48.380695],[21.711871,48.357617],[21.8174139,48.332787],[21.8352029,48.3346409],[21.837213,48.363253],[21.8842979,48.356047],[21.8848429,48.367539],[21.897883,48.36256],[21.8997959,48.3702229],[21.9281859,48.3615969],[21.9268059,48.370899],[21.949198,48.378728],[21.994463,48.377323],[22.0213259,48.392749],[22.0546049,48.377528],[22.0764859,48.387241],[22.086743,48.371564],[22.1359089,48.380519],[22.131056,48.3912329],[22.152768,48.3962409],[22.1561913,48.4093076],[22.2125722,48.4256468],[22.2371405,48.4100396],[22.2654858,48.4098675],[22.2398761,48.3870055],[22.2675722,48.3611612],[22.3178106,48.3545437],[22.3132861,48.3250712],[22.3372944,48.3079113],[22.3384267,48.2792074],[22.3847547,48.2339632],[22.4006407,48.249198],[22.4328384,48.2525166],[22.456386,48.2423109],[22.4899029,48.2534237],[22.4972201,48.2395546],[22.5161491,48.237965],[22.5311088,48.2094282],[22.5711442,48.1961428],[22.5616362,48.1816066],[22.5982449,48.144756],[22.5902763,48.1073414],[22.6754492,48.091997],[22.7347192,48.119848],[22.7576242,48.1200599],[22.7703914,48.1090162],[22.772319,48.1218742],[22.8027688,48.1221112],[22.8025285,48.1070813],[22.8254256,48.1175119],[22.8364365,48.080249],[22.8611284,48.0750312],[22.8677955,48.0524256],[22.8820424,48.0548053],[22.8659692,48.0113165],[22.835562,47.9905988],[22.8407599,47.9813636],[22.8725729,47.9752683],[22.8697274,47.9659593],[22.8915652,47.9672446],[22.897435,47.9540629],[22.8473299,47.9077579],[22.7928135,47.8908586],[22.7586924,47.8941446],[22.77775,47.8422508],[22.7136344,47.8360928],[22.6801938,47.7877527],[22.6111171,47.7717455],[22.5490018,47.7722246],[22.4812121,47.8108886],[22.4513078,47.803389],[22.4313319,47.7398119],[22.3566167,47.7486206],[22.3177714,47.7660887],[22.3176236,47.7433657],[22.2851369,47.7292757],[22.264325,47.7310675],[22.2589955,47.6979057],[22.2306796,47.693196],[22.1796501,47.5916115],[22.1289245,47.5978984],[22.0942787,47.5583628],[22.0782587,47.5621299],[22.0534529,47.5474795],[22.0712176,47.5380742],[22.0617872,47.5288029],[22.0451278,47.5398919],[22.0367222,47.5326653],[22.0071886,47.48362],[22.0327909,47.4508372],[22.0238835,47.3908631],[22.0119849,47.3758016],[21.9627373,47.381053],[21.9382461,47.3725317],[21.8777922,47.2857763],[21.8872845,47.2730473],[21.8534909,47.2397622],[21.8580662,47.1873597],[21.8124804,47.1667511],[21.7924092,47.1059751],[21.7268258,47.0983882],[21.6976037,47.057915],[21.6504151,47.0408303],[21.6888701,47.0019977],[21.6678744,46.9712337],[21.6814917,46.9652089],[21.6381964,46.9330487],[21.5984455,46.9274708],[21.6142857,46.8867275],[21.6016694,46.8668202],[21.520328,46.8373749],[21.5186086,46.8000703],[21.4831761,46.7650246],[21.5263389,46.7393249],[21.529369,46.7209721],[21.4923253,46.6859652],[21.4728438,46.6959075],[21.4299047,46.693937],[21.4309553,46.6781367],[21.4546661,46.660863],[21.4162375,46.6426231],[21.4097959,46.6218052],[21.3657038,46.6379501],[21.3300499,46.6318155],[21.3139733,46.617666],[21.3012351,46.5908672],[21.3207905,46.5828562],[21.2743045,46.5407362],[21.2600254,46.5021583],[21.2744188,46.4767333],[21.2964506,46.4762973],[21.3174343,46.4507288],[21.2895176,46.4154784],[21.2963256,46.4069601],[21.2250116,46.4136899],[21.2064214,46.4033825],[21.1992563,46.3479034],[21.1762269,46.3357664],[21.180497,46.3044494],[21.1155437,46.3018529],[21.1030549,46.2624637],[21.0708792,46.2539014],[21.0660827,46.2429394],[21.0366237,46.2480392],[21.0246723,46.2665329],[20.960817,46.2623039],[20.9465849,46.2793024],[20.9250701,46.2766191],[20.9218133,46.2618129],[20.8732713,46.2877555],[20.7756538,46.2759602],[20.7490474,46.2508489],[20.7618619,46.204563],[20.727401,46.2077485],[20.7341052,46.1939355],[20.7140487,46.1660531],[20.6843592,46.1447802],[20.6549178,46.1497739],[20.6394471,46.1267602],[20.5450486,46.1790935],[20.5014839,46.190334],[20.4949436,46.1709908],[20.4592293,46.1428837],[20.3975133,46.1574709],[20.3685325,46.1528554],[20.3557074,46.1696256],[20.2968136,46.1521542],[20.2549024,46.1158522],[20.2484757,46.1300956],[20.2330132,46.1241668],[20.1817362,46.1601137],[20.1364966,46.1449476],[20.1009667,46.1772756],[20.0636156,46.1437275],[20.0346142,46.1458888],[20.0158072,46.1768354],[19.9354075,46.1764243],[19.8533469,46.1500005],[19.8179747,46.1281652],[19.7585403,46.1479754],[19.6982054,46.1879317],[19.6827672,46.1800388],[19.661508,46.1904394],[19.6317396,46.1692993],[19.5676482,46.179106],[19.5604013,46.1665762],[19.5026585,46.1424492],[19.5271208,46.1210269],[19.4645033,46.0953827],[19.4665828,46.0820437],[19.4160037,46.0460453],[19.3803957,46.0358749],[19.3640923,46.0522965],[19.2819012,46.0148048],[19.2965348,45.9881173],[19.2856472,45.9968981],[19.1479857,45.9963445],[19.1338422,46.0370993],[19.104873,46.0401673],[19.0660427,46.0001999],[19.0796791,45.9636376],[19.0059803,45.9590674],[19.0092745,45.9236559],[18.9061334,45.9353801],[18.8794572,45.9166827],[18.8647137,45.9208493],[18.8685629,45.9113361],[18.8276792,45.9051714],[18.8220041,45.9145893],[18.8075092,45.9036055],[18.809247,45.8796189],[18.7956242,45.8784488],[18.7048857,45.9181883],[18.6700246,45.9108439],[18.6596602,45.9168934],[18.6651348,45.899279],[18.6412808,45.8890396],[18.6550179,45.8742393],[18.6277704,45.8733782],[18.6148449,45.8531438],[18.6236656,45.8398531],[18.5732391,45.8137578],[18.5749849,45.8004344],[18.559716,45.8037961],[18.5223504,45.7826858],[18.4906706,45.7947167],[18.4821905,45.7655032],[18.4562828,45.7695229],[18.4450763,45.7605195],[18.446853,45.737128],[18.40763,45.7397119],[18.3918949,45.7616983],[18.3642257,45.7729364],[18.3394214,45.7471605],[18.2968157,45.7612196],[18.2440473,45.7612305],[18.2307311,45.7790328],[18.1908702,45.7878759],[18.1681939,45.7762712],[18.1246514,45.7896277],[18.1068067,45.7708256],[18.0818922,45.7645205],[17.9958808,45.7957311],[17.9302095,45.7863301],[17.9066757,45.7925692],[17.8653145,45.7670064],[17.8262748,45.8099957],[17.8089784,45.8040989],[17.7809054,45.8174884],[17.7603399,45.811923],[17.7408624,45.8295975],[17.6632915,45.8381849],[17.6276211,45.8979446],[17.5700676,45.9358204],[17.4378254,45.9503823],[17.4258964,45.9272681],[17.4108059,45.9399665],[17.392149,45.9302149],[17.3828713,45.9475733],[17.3476208,45.9423413],[17.3438769,45.9605329],[17.3537711,45.9525011],[17.3905375,45.9581914],[17.387423,45.9661823],[17.3583539,45.9642737],[17.3754852,45.9686921],[17.3751895,45.9881054],[17.3635685,45.9915442],[17.3567202,45.9735836],[17.3339583,45.9960781],[17.3319847,45.9728948],[17.3129974,45.9665347],[17.323647,45.9887776],[17.2987653,45.9838652],[17.3041996,46.0021128],[17.2579726,46.0110256],[17.29632,46.0285169],[17.2541514,46.030005],[17.270955,46.0567055],[17.2324767,46.0592034],[17.2525145,46.0664725],[17.2313144,46.0790345],[17.2019916,46.0765488],[17.2331299,46.0989644],[17.2104017,46.1001693],[17.2129734,46.113855],[17.175927,46.1084583],[17.1743424,46.1287608],[17.1865197,46.1332308],[17.1810983,46.1505485],[17.1562307,46.1585819],[17.1592857,46.1696818],[17.1261012,46.1684495],[17.1227409,46.1789791],[17.0752482,46.1889531],[17.0661614,46.2022984],[16.9735401,46.2251982],[16.973954,46.2431113],[16.9504085,46.2415285],[16.8862356,46.2814598],[16.8713682,46.3252767],[16.8802109,46.3356966],[16.8615374,46.3452401],[16.8656232,46.3556489],[16.8521959,46.3517189],[16.8498589,46.3626245],[16.8352859,46.3638195],[16.8376499,46.3748032],[16.8261732,46.3670994],[16.7933444,46.387385],[16.7592072,46.3776563],[16.7298672,46.40149],[16.7182119,46.3898704],[16.6772872,46.4494536],[16.6631785,46.4486958],[16.6663732,46.4582995],[16.6187915,46.4619875],[16.604468,46.4760773],[16.5235997,46.5053761],[16.5325768,46.5314027],[16.5176728,46.5363516],[16.5084107,46.5652692],[16.4829969,46.5660383],[16.4834008,46.5786011],[16.4455713,46.610952],[16.4248583,46.6131645],[16.385941,46.6442485],[16.3915424,46.6637257],[16.4198454,46.6584771],[16.4286335,46.6939737],[16.3689211,46.7040082],[16.3798266,46.7153869],[16.3710856,46.7222945],[16.3570587,46.7142387],[16.3185954,46.7541449],[16.3305417,46.7752119],[16.3121626,46.7780033],[16.3127666,46.797314],[16.3406373,46.8051851],[16.3508404,46.8300552],[16.3403309,46.8468762],[16.3015007,46.8595142],[16.2913867,46.8728341],[16.2332296,46.8766702],[16.1560866,46.8537074],[16.126571,46.8569079],[16.1139147,46.8691038]]],"terms_url":"http://www.fomi.hu/","terms_text":"Földmérési és Távérzékelési Intézet"},{"id":"Freemap.sk-Car","name":"Freemap.sk Car","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/A/{zoom}/{x}/{y}.jpeg","scaleExtent":[8,16],"polygon":[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],"terms_text":"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.","icon":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Freemap.sk-Cyclo","name":"Freemap.sk Cyclo","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/C/{zoom}/{x}/{y}.jpeg","scaleExtent":[8,16],"polygon":[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],"terms_text":"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.","icon":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Freemap.sk-Hiking","name":"Freemap.sk Hiking","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/T/{zoom}/{x}/{y}.jpeg","scaleExtent":[8,16],"polygon":[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],"terms_text":"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.","icon":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Freemap.sk-Ski","name":"Freemap.sk Ski","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/K/{zoom}/{x}/{y}.jpeg","scaleExtent":[8,16],"polygon":[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],"terms_text":"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.","icon":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Geobase_Hydrography","name":"Geobase Hydrography","type":"wms","template":"http://ows.geobase.ca/wms/geobase_en?service=wms&request=GetMap&version=1.1.1&SRS={proj}&style=&format=image/png&transparent=true&layers=nhn:hydrography,nhn:network&WIDTH={width}&height={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.1923701,48.6550408],[-122.9958159,48.5106543],[-122.4868966,48.4098005],[-122.3291531,48.4527983],[-122.229391,48.5064943],[-122.1790836,48.5296509],[-122.1841996,48.566905],[-121.7783298,48.5759321],[-121.6657777,48.4279093],[-121.3306793,48.3571354],[-121.0271296,48.3497692],[-121.0305403,48.4940645],[-120.6979999,48.5149675],[-120.510413,48.8718034],[-119.9757904,48.8813368],[-119.9544737,48.5149675],[-119.907577,48.2942056],[-119.7319275,48.1550316],[-119.7438648,48.0741943],[-119.622786,48.1095051],[-119.602322,48.1470674],[-119.2527283,48.1624259],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{"id":"Geobase_Roads","name":"Geobase Roads","type":"wms","template":"http://ows.geobase.ca/wms/geobase_en?service=wms&request=GetMap&version=1.1.1&SRS={proj}&style=&format=image/png&transparent=true&layers=nrn:addressrange,nrn:streetnames,nrn:streetnames:streetnames_primary,nrn:streetnames:streetnames_secondary,nrn:streetnames:streetnames_other,nhn:hydrography,nrn:roadnetwork&WIDTH={width}&height={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.1923701,48.6550408],[-122.9958159,48.5106543],[-122.4868966,48.4098005],[-122.3291531,48.4527983],[-122.229391,48.5064943],[-122.1790836,48.5296509],[-122.1841996,48.566905],[-121.7783298,48.5759321],[-121.6657777,48.4279093],[-121.3306793,48.3571354],[-121.0271296,48.3497692],[-121.0305403,48.4940645],[-120.6979999,48.5149675],[-120.510413,48.8718034],[-119.9757904,48.8813368],[-119.9544737,48.5149675],[-119.907577,48.2942056],[-119.7319275,48.1550316],[-119.7438648,48.0741943],[-119.622786,48.1095051],[-119.602322,48.1470674],[-119.2527283,48.1624259],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{"id":"geoimage.at","name":"Geoimage.at MaxRes","type":"wms","template":"http://gis.lebensministerium.at/wmsgw/?key=4d80de696cd562a63ce463a58a61488d&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=Luftbild_MR,Luftbild_1m,Luftbild_8m,Satellitenbild_30m&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[16.5073284,46.9929304],[16.283417,46.9929304],[16.135839,46.8713046],[15.9831722,46.8190947],[16.0493278,46.655175],[15.8610387,46.7180116],[15.7592608,46.6900933],[15.5607938,46.6796202],[15.5760605,46.6342132],[15.4793715,46.6027553],[15.4335715,46.6516819],[15.2249267,46.6342132],[15.0468154,46.6481886],[14.9908376,46.5887681],[14.9603042,46.6237293],[14.8534374,46.6027553],[14.8330818,46.5012666],[14.7516595,46.4977636],[14.6804149,46.4381781],[14.6142593,46.4381781],[14.578637,46.3785275],[14.4412369,46.4311638],[14.1613476,46.4276563],[14.1257253,46.4767409],[14.0188585,46.4767409],[13.9119917,46.5257813],[13.8254805,46.5047694],[13.4438134,46.560783],[13.3064132,46.5502848],[13.1283019,46.5887681],[12.8433237,46.6132433],[12.7262791,46.6412014],[12.5125455,46.6656529],[12.3598787,46.7040543],[12.3649676,46.7703197],[12.2886341,46.7772902],[12.2733674,46.8852187],[12.2072118,46.8747835],[12.1308784,46.9026062],[12.1156117,46.9998721],[12.2530119,47.0657733],[12.2123007,47.0934969],[11.9833004,47.0449712],[11.7339445,46.9616816],[11.6321666,47.010283],[11.5405665,46.9755722],[11.4998553,47.0068129],[11.418433,46.9651546],[11.2555884,46.9755722],[11.1130993,46.913036],[11.0418548,46.7633482],[10.8891879,46.7598621],[10.7416099,46.7842599],[10.7059877,46.8643462],[10.5787653,46.8399847],[10.4566318,46.8504267],[10.4769874,46.9269392],[10.3853873,46.9894592],[10.2327204,46.8643462],[10.1207647,46.8330223],[9.8663199,46.9408389],[9.9019422,47.0033426],[9.6831197,47.0588402],[9.6118752,47.0380354],[9.6322307,47.128131],[9.5813418,47.1662025],[9.5406306,47.2664422],[9.6067863,47.3492559],[9.6729419,47.369939],[9.6424085,47.4457079],[9.5660751,47.4801122],[9.7136531,47.5282405],[9.7848976,47.5969187],[9.8357866,47.5454185],[9.9477423,47.538548],[10.0902313,47.4491493],[10.1105869,47.3664924],[10.2428982,47.3871688],[10.1869203,47.2698953],[10.3243205,47.2975125],[10.4820763,47.4491493],[10.4311873,47.4869904],[10.4413651,47.5900549],[10.4871652,47.5522881],[10.5482319,47.5351124],[10.5991209,47.5660246],[10.7568766,47.5316766],[10.8891879,47.5454185],[10.9400769,47.4869904],[10.9960547,47.3906141],[11.2352328,47.4422662],[11.2810328,47.3975039],[11.4235219,47.5144941],[11.5761888,47.5076195],[11.6067221,47.5900549],[11.8357224,47.5866227],[12.003656,47.6243647],[12.2072118,47.6037815],[12.1614117,47.6963421],[12.2581008,47.7442718],[12.2530119,47.6792136],[12.4311232,47.7100408],[12.4921899,47.631224],[12.5685234,47.6277944],[12.6295901,47.6894913],[12.7720792,47.6689338],[12.8331459,47.5419833],[12.975635,47.4732332],[13.0417906,47.4938677],[13.0367017,47.5557226],[13.0977685,47.6415112],[13.0316128,47.7100408],[12.9043905,47.7203125],[13.0061684,47.84683],[12.9451016,47.9355501],[12.8636793,47.9594103],[12.8636793,48.0036929],[12.7517236,48.0989418],[12.8738571,48.2109733],[12.9603683,48.2109733],[13.0417906,48.2652035],[13.1842797,48.2990682],[13.2606131,48.2922971],[13.3980133,48.3565867],[13.4438134,48.417418],[13.4387245,48.5523383],[13.509969,48.5860123],[13.6117469,48.5725454],[13.7287915,48.5118999],[13.7847694,48.5725454],[13.8203916,48.6263915],[13.7949471,48.7171267],[13.850925,48.7741724],[14.0595697,48.6633774],[14.0137696,48.6331182],[14.0748364,48.5927444],[14.2173255,48.5961101],[14.3649034,48.5489696],[14.4666813,48.6499311],[14.5582815,48.5961101],[14.5989926,48.6263915],[14.7211261,48.5759124],[14.7211261,48.6868997],[14.822904,48.7271983],[14.8178151,48.777526],[14.9647227,48.7851754],[14.9893637,49.0126611],[15.1485933,48.9950306],[15.1943934,48.9315502],[15.3063491,48.9850128],[15.3928603,48.9850128],[15.4844604,48.9282069],[15.749083,48.8545973],[15.8406831,48.8880697],[16.0086166,48.7808794],[16.2070835,48.7339115],[16.3953727,48.7372678],[16.4920617,48.8110498],[16.6905286,48.7741724],[16.7057953,48.7339115],[16.8991733,48.713769],[16.9755067,48.515271],[16.8482844,48.4511817],[16.8533733,48.3464411],[16.9551512,48.2516513],[16.9907734,48.1498955],[17.0925513,48.1397088],[17.0823736,48.0241182],[17.1739737,48.0207146],[17.0823736,47.8741447],[16.9856845,47.8673174],[17.0823736,47.8092489],[17.0925513,47.7031919],[16.7414176,47.6792136],[16.7057953,47.7511153],[16.5378617,47.7545368],[16.5480395,47.7066164],[16.4208172,47.6689338],[16.573484,47.6175045],[16.670173,47.631224],[16.7108842,47.538548],[16.6599952,47.4491493],[16.5429506,47.3940591],[16.4615283,47.3940591],[16.4920617,47.276801],[16.425906,47.1973317],[16.4717061,47.1489007],[16.5480395,47.1489007],[16.476795,47.0796369],[16.527684,47.0588402],[16.5073284,46.9929304]]],"terms_text":"geoimage.at","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QwTFA8gQvGHigAAAwtJREFUOMvtk19oW1Ucx7/nnntukpvGtF2btHG1o52bYxULOp99sYggiM7pVKbbQNCH+SYOFMHCHhR88g9jjPmgm32YMpGNTbpp1W5D7NyfJnYLTdNm3ZI0SZPc5N5zzz3n+CIiCtM9+KQf+D39+H74Pfy+wH8Ocqvlh4enyblMO7JpKHl/X080sbhcnH3r3eNXkR1XtyU8cHiS2Hakf+iuxJ7enq7n4x12ijFDtz3fW11tzBZL1YMnpjKfvrN3m/O3ws+OTRnxmP1gsrf7g2RizUbGLCtkGdSkBnigtPCFaLXc1ZvF8vfZXOG1HdvGcn/M0z8Ln9nx8vBAas0ngwN9dzPGmGlSCkIMrTQxQABCSDjE2B2xyJ2E0A0d/Q+cPP/tMb7v0Kwx+tBz5PcL9350mXZFVuzR4b73Nm3o326HQpYdNonWMEAIgdZQWmvP8yECpZptKetNtzqTLkz8UpBfKmJ1tJo1SgBgfP8V2mhVn2JYet0Osc09Xabp+DFdbpgkV7SQ6jbRdCXaHAgU4AsFj0sQAFGbgguNhsPRqiyeM/d/PkezS4WxRilzpLM5ga5EEu5qGJvXDZFDuXvA4sO4b30MXCi4XCLRGYZhaFQaEtTQ6I5bKNV8HJ3ML1cLM+Pm1fnCaNFZmLhRORkkUltIpl2mI/duxMW8Rk0N4okRG3OLDtb2RlB3AthhgXI9QLbgIp13QQ0CrQSEU57JnX3/OBnbfWBfpVIZjEb7DClb8WRv50jMDqesSNzwpU+UFAiZFIGmaHsKFjNAKNOub8LhkC6XbiD4wvXLR19dOH/wzF9+8McL6Uev31jJNlrc8Xjg+4GSvlBKSKXaLpfFUk3kl5bddOZa7dTk1PTT2194DED3LfqxlZz+7qc35uZvXitXHdf1ROALKX+boO353nKpXr2UyU9/deLMzn9aPfLNDz+/NLC2/0WDhgZNxnqYSUzOA0f4vMg9J33xytzHz2595Ivb6vKet48kHx/b8mQ40vFwNMKS9UbzQmWleHrXK29+XZs/1cD//Cv8CriEgFStQ2K4AAAAAElFTkSuQmCC"},{"id":"Geolittoral-Orthophotos2000","name":"Géolittoral - Orthophotos 2000","type":"wms","template":"http://geolittoral.application.developpement-durable.gouv.fr/wms2/metropole?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortholittorale&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2000-01-01T00:00:00.000Z","startDate":"2000-01-01T00:00:00.000Z","polygon":[[[-1.0796243,46.1095893],[-0.9411452,46.0147437],[-0.5630573,45.1517801],[-0.7265951,45.0842493],[-0.8790355,45.340936],[-0.9979449,45.3377907],[-0.9555838,44.6998247],[-1.1586189,44.1986482],[-1.2151202,44.2055773],[-1.2465448,44.1162047],[-1.2790262,44.0393718],[-1.2882474,44.0230397],[-1.3211693,43.9409384],[-1.321506,43.922956],[-1.3092024,43.9233665],[-1.308503,43.914392],[-1.2836627,43.9151384],[-1.2830152,43.9062373],[-1.2760964,43.9065485],[-1.2821086,43.8925378],[-1.3010173,43.8515886],[-1.3038406,43.8423978],[-1.3092283,43.8349806],[-1.3347421,43.7694562],[-1.3440669,43.7487464],[-1.3455951,43.742141],[-1.3467348,43.7368823],[-1.432844,43.53152],[-1.4280594,43.4681233],[-1.6062745,43.4059107],[-1.6060955,43.3601202],[-1.7744064,43.3035717],[-1.8299531,43.384841],[-1.5855116,43.4685563],[-1.3570598,44.0337366],[-1.4021655,44.0646122],[-1.3358385,44.2283161],[-1.218361,44.2303255],[-1.1679453,44.4109713],[-1.3074387,44.418472],[-1.1697949,45.5910689],[-1.486847,46.0604176],[-1.3636417,46.0914593],[-1.601759,46.1701852],[-1.6444184,46.2237487],[-1.5859481,46.304264],[-1.5100772,46.3388783],[-1.756428,46.4221446],[-2.1871988,46.8185697],[-2.1642284,46.8553436],[-2.2365406,46.9337048],[-2.3976918,46.9671834],[-2.2820042,47.0763113],[-2.1256261,47.018745],[-2.0901262,47.065624],[-2.184872,47.1069799],[-2.2647018,47.1076296],[-2.2448935,47.1856218],[-2.5677926,47.2446686],[-2.6672667,47.4668599],[-2.7478721,47.4712158],[-2.7577135,47.4346122],[-2.8932063,47.4629031],[-2.9036899,47.5090529],[-3.0338252,47.5383308],[-3.0711295,47.5118452],[-3.0165289,47.4987314],[-3.1250228,47.4269256],[-3.1880328,47.4844142],[-3.2279087,47.6113186],[-3.2966969,47.6316051],[-3.2875957,47.6715415],[-3.3407355,47.6689257],[-3.3891187,47.5947342],[-3.55087,47.6382724],[-3.5338384,47.724884],[-3.7657669,47.7647571],[-3.7759528,47.737096],[-3.9116771,47.7591549],[-3.8959022,47.7991129],[-3.9723628,47.8152607],[-3.9972201,47.7975006],[-3.97956,47.7626769],[-3.8945008,47.7219346],[-3.9161956,47.6783103],[-4.1016259,47.7092072],[-4.0898857,47.7894357],[-4.0379763,47.7990868],[-4.0412502,47.8310926],[-4.0876491,47.8422143],[-4.1478057,47.8252534],[-4.1431427,47.7884708],[-4.3516237,47.7414997],[-4.4796232,47.9776016],[-4.9856536,47.9989633],[-4.9693825,48.0897202],[-4.63576,48.0779844],[-4.6014717,48.1146852],[-4.3850007,48.1096154],[-4.3895513,48.1454286],[-4.3092543,48.1500888],[-4.3126821,48.1769373],[-4.4636854,48.1846773],[-4.4974841,48.1453035],[-4.5921009,48.1475763],[-4.5753669,48.22488],[-4.6710089,48.2330974],[-4.654341,48.3104921],[-4.8424298,48.3004956],[-5.1986731,48.4492607],[-5.103461,48.5172155],[-4.81465,48.3941286],[-4.8351542,48.5431896],[-4.6338697,48.6637334],[-3.9669223,48.7797813],[-3.9493945,48.7471474],[-3.6501973,48.7535602],[-3.6585313,48.8252653],[-3.539314,48.8583372],[-3.5444401,48.9029653],[-3.4095425,48.9186584],[-3.4075537,48.8736644],[-3.0276871,48.9275037],[-2.6786137,48.5884071],[-2.2847486,48.7190877],[-2.1754283,48.650163],[-2.0136968,48.7322121],[-1.8095282,48.7317759],[-1.8039194,48.6612609],[-1.6116146,48.6858177],[-1.7164548,49.2478104],[-1.8026014,49.3272144],[-1.8574757,49.3253007],[-1.9262013,49.6557284],[-2.03908,49.6787215],[-2.0044546,49.7608677],[-1.6175855,49.6849834],[-1.2837344,49.7606702],[-1.1492009,49.6350423],[-1.1713375,49.5541159],[-1.2735291,49.5524476],[-1.1327984,49.3933982],[-0.930595,49.4080413],[-0.7482671,49.3597647],[-0.3893456,49.34167],[-0.2470445,49.2999494],[-0.1245368,49.2935335],[0.0273095,49.3761879],[0.0180063,49.5465556],[0.1221093,49.6929183],[0.5171306,49.8646551],[1.057268,49.9490353],[1.4390814,50.1181936],[1.5317687,50.4643666],[1.5254895,50.8586668],[1.6411818,50.9591925],[2.452105,51.1214375],[2.5928557,51.1212359],[2.6068264,51.0577932],[1.7975971,50.8990562],[1.6645759,50.8237878],[1.7078633,50.1282048],[1.0593618,49.85],[0.6160689,49.7906207],[0.2473107,49.6502699],[0.1709048,49.5317374],[0.5706464,49.496223],[0.4111492,49.3395965],[0.1950421,49.3573571],[0.0171786,49.2547917],[-0.2445265,49.2631234],[-0.3840751,49.3049516],[-0.7409079,49.3243829],[-0.995405,49.3713264],[-1.0545337,49.2517481],[-1.27704,49.2902182],[-1.2596644,49.4346254],[-1.3914123,49.5398482],[-1.2753453,49.6205575],[-1.2977482,49.6594602],[-1.490498,49.5713903],[-1.77517,49.6339843],[-1.7460051,49.4815523],[-1.5129407,49.2469097],[-1.4826149,48.7260698],[-1.3057444,48.725312],[-1.283234,48.5973085],[-2.7611439,48.4347142],[-3.0017371,48.6764625],[-3.210615,48.7209691],[-3.9540369,48.5605102],[-4.1564328,48.6079181],[-4.4447478,48.5585184],[-4.6368255,48.482991],[-4.6318979,48.4472691],[-4.2502228,48.43088],[-4.0614098,48.2180466],[-4.1757039,48.0516486],[-4.3190366,48.0140984],[-4.2678092,47.8997734],[-3.8848444,47.9817224],[-3.7637481,47.8640348],[-2.3272701,47.5263402],[-2.3691075,47.3338959],[-1.7406713,47.3350685],[-1.7706224,47.204506],[-2.0367815,47.2194206],[-2.096803,47.1554772],[-1.8878613,47.0123909],[-2.0879728,46.8300739],[-2.0121404,46.8343598],[-1.8407867,46.6965096],[-1.873184,46.654836],[-1.688585,46.5039205],[-1.6211652,46.5151306],[-1.4242755,46.4167482],[-1.0176087,46.3591735],[-1.0796243,46.1095893]],[[-2.4123238,46.6924223],[-2.3719717,46.676112],[-2.2674923,46.680326],[-2.270068,46.7070521],[-2.2982682,46.7328597],[-2.4165505,46.7371145],[-2.4123238,46.6924223]],[[-3.06018,47.4054194],[-2.8258703,47.2963471],[-2.7878715,47.3341715],[-3.0243638,47.4456259],[-3.06018,47.4054194]],[[-3.2648203,47.4295047],[-3.334303,47.3592752],[-3.2961388,47.3413278],[-3.3148902,47.3005706],[-3.1994054,47.2449216],[-3.1656728,47.2775103],[-3.086864,47.2361201],[-3.0063687,47.3085541],[-3.2648203,47.4295047]],[[-1.939663,48.8634633],[-1.9399349,48.9117889],[-1.7009983,48.9110507],[-1.6972613,48.8617305],[-1.939663,48.8634633]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_France/G%C3%A9oLittoral","terms_text":"Ortho littorale 2000"},{"id":"Geolittoral-Sentiers","name":"Géolittoral - Sentiers","type":"wms","template":"http://geolittoral.application.developpement-durable.gouv.fr/wms2/metropole?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=n_sentier_littoral_l&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-0.9838474,46.1880746],[-0.8949679,46.156277],[-0.934552,46.1016299],[-0.843878,46.0694893],[-0.8824065,46.0163689],[-0.5378663,45.8955775],[-0.6349793,45.7644353],[-0.8666589,45.8479032],[-0.7626356,45.6245041],[-0.6969519,45.6265921],[-0.6939663,45.6018445],[-0.6875472,45.6017401],[-0.6879951,45.5098594],[-0.6379859,45.5089178],[-0.6397773,45.4474748],[-0.615743,45.4469511],[-0.6161909,45.3858599],[-0.585439,45.3859647],[-0.5852897,45.3233381],[-0.5537914,45.323443],[-0.5527464,45.1966145],[-0.490944,45.195773],[-0.4918397,45.1331467],[-0.4566094,45.133252],[-0.4551166,45.0716113],[-0.4161067,45.0708893],[-0.4162123,45.0269636],[-0.2907042,44.9827801],[-0.2199988,45.0677104],[-0.1225183,45.0256272],[-0.1892469,44.9459114],[-0.0926621,44.9101881],[-0.145209,44.8392042],[-0.1549123,44.8423797],[-0.1938747,44.7867829],[-0.4354115,44.8731731],[-0.3904779,44.6841324],[-0.5879767,44.6601403],[-0.6662784,44.9912911],[-0.7783806,44.9926348],[-0.7776417,45.0538898],[-0.8158437,45.0532114],[-0.818377,45.1196158],[-0.8839284,45.1205096],[-0.8817117,45.1808092],[-0.9343849,45.1818509],[-0.9328016,45.2448356],[-1.0016252,45.2443896],[-1.0024696,45.3082702],[-1.0523984,45.3101261],[-1.0482817,45.3691125],[-1.0641153,45.3691125],[-1.0503928,45.1825205],[-1.1076051,44.8078702],[-1.0151366,44.8011296],[-1.0194644,44.7691388],[-0.933646,44.7614944],[-0.9404017,44.7018029],[-0.9603521,44.5643388],[-1.014081,44.5676478],[-1.0991605,44.1456002],[-1.2268852,44.140222],[-1.2185281,44.0324931],[-1.3076188,44.029002],[-1.3957164,43.7430052],[-1.3129592,43.7295057],[-1.3743937,43.5310863],[-1.3458932,43.506056],[-1.599642,43.3542258],[-1.7654877,43.255483],[-1.7928061,43.2803753],[-1.8028079,43.4042503],[-1.7283167,43.4503267],[-1.5853054,43.4890037],[-1.3358385,44.2283161],[-1.3074387,44.418472],[-1.2251061,45.4441615],[-1.486847,46.0604176],[-1.601759,46.1701852],[-1.6444184,46.2237487],[-1.756428,46.4221446],[-2.0348287,46.6189544],[-2.3465983,46.6238164],[-2.4656134,46.7119647],[-2.3232967,46.8381171],[-2.4528645,46.9385605],[-2.3173318,47.1621397],[-2.9284827,47.2841337],[-2.967417,47.2214691],[-3.3560228,47.3247359],[-3.1880328,47.4844142],[-3.2279087,47.6113186],[-3.3891187,47.5947342],[-3.9161956,47.6783103],[-4.1016259,47.7092072],[-4.1431427,47.7884708],[-4.3761893,47.7106674],[-4.4796232,47.9776016],[-4.9856536,47.9989633],[-4.9693825,48.0897202],[-4.6014717,48.1146852],[-4.5921009,48.1475763],[-4.6710089,48.2330974],[-4.8424298,48.3004956],[-5.1986731,48.4492607],[-5.103461,48.5172155],[-4.8351542,48.5431896],[-4.6311736,48.6612896],[-3.9669223,48.7797813],[-3.9493945,48.7471474],[-3.6701315,48.895078],[-3.5444401,48.9029653],[-3.4095425,48.9186584],[-3.3334381,48.904579],[-3.0276871,48.9275037],[-2.8020731,48.7979285],[-2.6935289,48.7672208],[-2.4578583,48.7089607],[-2.2847486,48.7190877],[-2.1754283,48.650163],[-2.0136968,48.7322121],[-1.8095282,48.7317759],[-1.7243003,48.7582771],[-1.7055705,48.8451195],[-1.9030442,48.8628775],[-1.9102707,48.9234787],[-1.6871357,48.9324898],[-1.7427683,49.244734],[-1.8574757,49.3253007],[-1.9262013,49.6557284],[-2.03908,49.6787215],[-2.0044546,49.7608677],[-1.6175855,49.6849834],[-1.2837344,49.7606702],[-1.1492009,49.6350423],[-1.1854462,49.5483609],[-0.9646323,49.4250945],[-0.7442883,49.3680181],[-0.3901362,49.3621973],[-0.2497648,49.3157973],[-0.1334235,49.3129316],[0.0273095,49.3761879],[0.0180063,49.5465556],[0.1221093,49.6929183],[0.5171306,49.8646551],[1.057268,49.9490353],[1.4390814,50.1181936],[1.5317687,50.4643666],[1.5254895,50.8586668],[1.6411818,50.9591925],[2.5971186,51.1735455],[2.6607107,51.0195972],[2.0712386,50.9202211],[2.05937,50.9470929],[1.7975971,50.8990562],[1.6808947,50.8717016],[1.6556923,50.5972904],[1.7535714,50.5931978],[1.7229475,50.2470239],[1.8215592,50.2426198],[1.8014852,50.0511647],[1.5456517,50.063112],[1.541549,50.0126688],[1.4246216,50.0174707],[1.426673,50.0527642],[1.0383804,49.8460945],[0.9827008,49.8891609],[0.5796091,49.8213328],[0.420629,49.76297],[0.4281018,49.7544509],[0.2083136,49.6726862],[0.147652,49.5776743],[0.1346112,49.5809045],[0.1111672,49.543649],[0.5659823,49.520445],[0.5631983,49.4998946],[0.6300139,49.496659],[0.6147753,49.3744072],[0.5482527,49.3785094],[0.5425382,49.3346073],[0.4574069,49.3393812],[0.4584326,49.3449183],[0.3259735,49.354559],[0.3284645,49.3812758],[0.280111,49.3843283],[0.2768875,49.363339],[0.210951,49.3665834],[0.208167,49.3508366],[0.1432562,49.3553225],[0.1376883,49.3114953],[0.0720449,49.3153162],[0.0675026,49.2871299],[0.0027383,49.2907616],[0.0050827,49.2571106],[-0.0202662,49.260362],[-0.0349188,49.1973043],[-0.194485,49.2146316],[-0.389657,49.127263],[-0.4536886,49.1879201],[-0.3561026,49.2321443],[-0.8208815,49.2833068],[-0.9977772,49.3014908],[-1.1672818,49.2454506],[-1.1951526,49.2818265],[-1.2676791,49.2409863],[-1.341138,49.2975045],[-1.2476825,49.3502459],[-1.4458287,49.6068946],[-1.8110511,49.6175689],[-1.7747878,49.4433325],[-1.7277493,49.4650871],[-1.5338965,49.2909826],[-1.4790873,49.2923341],[-1.4760826,49.2402747],[-1.4355714,49.2032589],[-1.4722491,49.182201],[-1.4509056,48.7572466],[-1.3115513,48.7640766],[-1.3053347,48.7021631],[-1.2583998,48.7042144],[-1.2522868,48.6435279],[-1.2351913,48.6443494],[-1.2269026,48.5682354],[-1.8521839,48.5308559],[-1.8490756,48.4974996],[-1.9232598,48.4918694],[-1.9281294,48.4409635],[-2.0427212,48.4360144],[-2.0388876,48.4819121],[-2.2895011,48.4610214],[-2.3021023,48.5243337],[-2.4086263,48.5161813],[-2.4203484,48.5695361],[-2.4308411,48.5785185],[-2.4908308,48.5492405],[-2.4735281,48.5332572],[-2.5497844,48.4964697],[-2.5400451,48.4874747],[-2.7068057,48.4074551],[-3.0297895,48.6911498],[-4.0103381,48.5317872],[-4.0534166,48.6441199],[-4.3828059,48.5734929],[-4.3548195,48.5117951],[-4.3885293,48.5047279],[-4.1349543,48.4486809],[-4.1641129,48.389361],[-4.01832,48.3568516],[-4.0473321,48.2991791],[-3.9881358,48.2867008],[-4.0213971,48.216063],[-4.0363427,48.2195777],[-4.0662339,48.160284],[-4.1667504,48.1824662],[-4.1833077,48.149336],[-4.1723183,48.106499],[-4.2011062,48.1028546],[-4.1864321,48.0438867],[-4.1880639,48.0406137],[-4.3568595,48.0230513],[-4.2565705,47.9399726],[-4.2336349,47.9349658],[-4.2137074,47.9759839],[-4.2185428,47.977259],[-4.1805957,48.0556897],[-3.6172022,47.9312353],[-2.1799085,47.5864218],[-2.25449,47.4450059],[-2.3018177,47.4567969],[-2.3204265,47.4209203],[-2.3037225,47.4175495],[-2.3475337,47.3349949],[-2.3621862,47.3383711],[-2.380795,47.3039043],[-2.3585231,47.2985385],[-2.2996198,47.297843],[-2.297422,47.3617996],[-2.1319947,47.3585242],[-2.1347787,47.3910707],[-2.0156534,47.3962286],[-2.0140417,47.3809517],[-1.9286173,47.3825391],[-1.9289103,47.3795626],[-1.8322035,47.3818446],[-1.8298591,47.3416477],[-1.7360828,47.3430378],[-1.734178,47.3049972],[-1.6408412,47.3063882],[-1.6401086,47.2942654],[-1.5835498,47.2956567],[-1.5853081,47.3370802],[-1.461201,47.3396619],[-1.4600288,47.3292351],[-1.3721135,47.3322144],[-1.360538,47.1123893],[-1.4856707,47.1114918],[-1.4858173,47.1187709],[-1.6689741,47.1168765],[-1.6697068,47.1286411],[-1.725533,47.1276442],[-1.7261191,47.1376124],[-1.9397532,47.1326285],[-1.9401928,47.1421971],[-1.9925024,47.1430941],[-1.8106643,47.0058819],[-1.947226,46.9207831],[-1.9289103,46.9067703],[-1.9952864,46.8646098],[-1.7365224,46.6683945],[-1.7753516,46.643855],[-1.8267821,46.6417425],[-1.8247307,46.6207134],[-1.1819234,46.399869],[-0.9126096,46.3048021],[-0.9548089,46.2488984],[-0.9423542,46.2442372],[-0.9838474,46.1880746]],[[3.1476937,42.4007197],[3.1494906,42.4001543],[3.1530531,42.4005236],[3.1580376,42.4024274],[3.1876974,42.4280509],[3.142265,42.5247964],[3.0683711,42.5463547],[3.0488369,42.6941959],[3.0798953,43.0307277],[3.226405,43.1872688],[3.4091582,43.2603206],[3.5210352,43.258773],[3.6642877,43.3762765],[3.738414,43.3905396],[4.0097937,43.536068],[4.1769217,43.4563611],[4.5435531,43.4334906],[4.5494282,43.3540119],[4.8350582,43.3089126],[4.9750606,43.3830905],[5.0321866,43.3192811],[5.2591906,43.3192811],[5.3108165,43.2050388],[5.3568173,43.1864485],[5.3688175,43.1678525],[5.4023181,43.1621085],[5.4138183,43.1712257],[5.4091932,43.1992072],[5.5423205,43.1882713],[5.6058216,43.1479741],[5.6196969,43.1528987],[5.6383222,43.1715904],[5.6715728,43.1673966],[5.6909481,43.13411],[5.7760746,43.1063726],[5.7761996,43.0943247],[5.7540742,43.0832788],[5.7570743,43.0725048],[5.7703245,43.0646514],[5.8593261,43.0346897],[5.8877016,43.0627336],[5.9567028,43.0610897],[5.9638279,43.092773],[6.0003285,43.0918601],[6.0174538,43.068487],[6.1023303,43.0741485],[6.1048304,43.0525954],[6.0665981,43.0431845],[6.0672168,43.0378549],[6.1427018,43.0092284],[6.1567558,42.9871518],[6.1963544,42.9733134],[6.2222085,42.9801037],[6.2689052,42.996508],[6.2551549,43.0362655],[6.201904,43.0271281],[6.1837787,43.0918826],[6.3015307,43.0990937],[6.3247811,43.0797407],[6.3777821,43.0801059],[6.3886572,43.1339501],[6.5134094,43.1460813],[6.5770355,43.1788145],[6.6229113,43.1456253],[6.6977876,43.1996853],[6.6801623,43.2335736],[6.7211631,43.26007],[6.7224131,43.2747245],[6.6705372,43.2919232],[6.6874125,43.3311252],[6.7241631,43.3426718],[6.7529136,43.4089993],[6.7910393,43.3967387],[6.9062913,43.4167176],[6.9676674,43.5027333],[6.9661673,43.5281154],[7.006168,43.5384464],[7.0355435,43.4981997],[7.0689191,43.5001038],[7.0907945,43.5164228],[7.062669,43.5367247],[7.0825444,43.5456046],[7.1237951,43.5307436],[7.1557957,43.5437019],[7.1432954,43.622841],[7.1686709,43.6463635],[7.2137967,43.6346939],[7.2541724,43.6849746],[7.3402989,43.6674354],[7.3644243,43.6894038],[7.3530491,43.7082017],[7.4163002,43.7109124],[7.4540509,43.7450573],[7.4943016,43.7452379],[7.5794281,43.7842366],[7.6055156,43.7860269],[7.6036815,43.7889781],[7.5958811,43.7952788],[7.5962789,43.7954862],[7.5385252,43.8419488],[7.4599632,43.7998784],[7.4478096,43.8093355],[7.3235339,43.7480609],[7.3082211,43.7635679],[6.6487795,43.3885012],[6.6686548,43.3717842],[6.510027,43.2780293],[6.5658405,43.2250863],[6.1268057,43.105272],[5.4822945,43.2493904],[5.4726693,43.2309046],[5.4156683,43.2465678],[5.4526689,43.3450985],[4.8019076,43.4815759],[4.7641569,43.3924419],[4.657155,43.423681],[4.6722803,43.4560836],[4.4320261,43.5241904],[4.4145258,43.4925498],[4.1610214,43.5643292],[4.1445211,43.5706693],[4.141646,43.5739296],[4.1867718,43.5994627],[4.1056454,43.6819639],[3.79689,43.5216525],[3.7785147,43.5131316],[3.7646394,43.5059696],[3.7620144,43.5033403],[3.7422641,43.4932752],[3.7160136,43.5207461],[3.2621307,43.2814311],[3.2463804,43.2973542],[3.1838793,43.2805211],[3.1067529,43.2408312],[3.1547538,43.1941898],[2.9062494,43.1938252],[2.9067495,42.761892],[2.9461251,42.7620755],[2.9465001,42.6151551],[2.992376,42.6149711],[2.992376,42.5125003],[3.0410018,42.5125924],[3.0412052,42.5009317],[3.0908647,42.5008187],[3.1476937,42.4007197]],[[6.3594494,43.0232125],[6.4247695,43.0244403],[6.4524356,43.0350368],[6.4698484,43.0546098],[6.5112149,43.0576453],[6.5215565,43.0431768],[6.4836372,43.0244403],[6.471793,43.0072494],[6.4117762,42.9917993],[6.3985177,42.980484],[6.3517753,42.9990494],[6.3594494,43.0232125]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_France/G%C3%A9oLittoral","terms_text":"Ortho littorale 2000"},{"id":"GeolittoralV2-Orthophotos","name":"Géolittoral V2 - Orthophotos 2011-2014","type":"wms","template":"http://geolittoral.application.developpement-durable.gouv.fr/wms2/metropole?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortholittorale_v2_rvb&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2014-01-01T00:00:00.000Z","startDate":"2011-01-01T00:00:00.000Z","polygon":[[[-0.9838474,46.1880746],[-0.8949679,46.156277],[-0.934552,46.1016299],[-0.843878,46.0694893],[-0.8824065,46.0163689],[-0.5378663,45.8955775],[-0.6349793,45.7644353],[-0.8666589,45.8479032],[-0.7626356,45.6245041],[-0.6969519,45.6265921],[-0.6939663,45.6018445],[-0.6875472,45.6017401],[-0.6879951,45.5098594],[-0.6379859,45.5089178],[-0.6397773,45.4474748],[-0.615743,45.4469511],[-0.6161909,45.3858599],[-0.585439,45.3859647],[-0.5852897,45.3233381],[-0.5537914,45.323443],[-0.5527464,45.1966145],[-0.490944,45.195773],[-0.4918397,45.1331467],[-0.4566094,45.133252],[-0.4551166,45.0716113],[-0.4161067,45.0708893],[-0.4162123,45.0269636],[-0.2907042,44.9827801],[-0.2199988,45.0677104],[-0.1225183,45.0256272],[-0.1892469,44.9459114],[-0.0926621,44.9101881],[-0.145209,44.8392042],[-0.1549123,44.8423797],[-0.1938747,44.7867829],[-0.4354115,44.8731731],[-0.3904779,44.6841324],[-0.5879767,44.6601403],[-0.6662784,44.9912911],[-0.7783806,44.9926348],[-0.7776417,45.0538898],[-0.8158437,45.0532114],[-0.818377,45.1196158],[-0.8839284,45.1205096],[-0.8817117,45.1808092],[-0.9343849,45.1818509],[-0.9328016,45.2448356],[-1.0016252,45.2443896],[-1.0024696,45.3082702],[-1.0523984,45.3101261],[-1.0482817,45.3691125],[-1.0641153,45.3691125],[-1.0503928,45.1825205],[-1.1076051,44.8078702],[-1.0151366,44.8011296],[-1.0194644,44.7691388],[-0.933646,44.7614944],[-0.9404017,44.7018029],[-0.9603521,44.5643388],[-1.014081,44.5676478],[-1.0991605,44.1456002],[-1.2268852,44.140222],[-1.2185281,44.0324931],[-1.3076188,44.029002],[-1.3957164,43.7430052],[-1.3129592,43.7295057],[-1.3743937,43.5310863],[-1.3458932,43.506056],[-1.599642,43.3542258],[-1.7654877,43.255483],[-1.7928061,43.2803753],[-1.8028079,43.4042503],[-1.7283167,43.4503267],[-1.5853054,43.4890037],[-1.3358385,44.2283161],[-1.3074387,44.418472],[-1.2251061,45.4441615],[-1.486847,46.0604176],[-1.601759,46.1701852],[-1.6444184,46.2237487],[-1.756428,46.4221446],[-2.0348287,46.6189544],[-2.3465983,46.6238164],[-2.4656134,46.7119647],[-2.3232967,46.8381171],[-2.4528645,46.9385605],[-2.3173318,47.1621397],[-2.9284827,47.2841337],[-2.967417,47.2214691],[-3.3560228,47.3247359],[-3.1880328,47.4844142],[-3.2279087,47.6113186],[-3.3891187,47.5947342],[-3.9161956,47.6783103],[-4.1016259,47.7092072],[-4.1431427,47.7884708],[-4.3761893,47.7106674],[-4.4796232,47.9776016],[-4.9856536,47.9989633],[-4.9693825,48.0897202],[-4.6014717,48.1146852],[-4.5921009,48.1475763],[-4.6710089,48.2330974],[-4.8424298,48.3004956],[-5.1986731,48.4492607],[-5.103461,48.5172155],[-4.8351542,48.5431896],[-4.6311736,48.6612896],[-3.9669223,48.7797813],[-3.9493945,48.7471474],[-3.6701315,48.895078],[-3.5444401,48.9029653],[-3.4095425,48.9186584],[-3.3334381,48.904579],[-3.0276871,48.9275037],[-2.8020731,48.7979285],[-2.6935289,48.7672208],[-2.4578583,48.7089607],[-2.2847486,48.7190877],[-2.1754283,48.650163],[-2.0136968,48.7322121],[-1.8095282,48.7317759],[-1.7243003,48.7582771],[-1.7055705,48.8451195],[-1.9030442,48.8628775],[-1.9102707,48.9234787],[-1.6871357,48.9324898],[-1.7427683,49.244734],[-1.8574757,49.3253007],[-1.9262013,49.6557284],[-2.03908,49.6787215],[-2.0044546,49.7608677],[-1.6175855,49.6849834],[-1.2837344,49.7606702],[-1.1492009,49.6350423],[-1.1854462,49.5483609],[-0.9646323,49.4250945],[-0.7442883,49.3680181],[-0.3901362,49.3621973],[-0.2497648,49.3157973],[-0.1334235,49.3129316],[0.0273095,49.3761879],[0.0180063,49.5465556],[0.1221093,49.6929183],[0.5171306,49.8646551],[1.057268,49.9490353],[1.4390814,50.1181936],[1.5317687,50.4643666],[1.5254895,50.8586668],[1.6411818,50.9591925],[2.5971186,51.1735455],[2.6607107,51.0195972],[2.0712386,50.9202211],[2.05937,50.9470929],[1.7975971,50.8990562],[1.6808947,50.8717016],[1.6556923,50.5972904],[1.7535714,50.5931978],[1.7229475,50.2470239],[1.8215592,50.2426198],[1.8014852,50.0511647],[1.5456517,50.063112],[1.541549,50.0126688],[1.4246216,50.0174707],[1.426673,50.0527642],[1.0383804,49.8460945],[0.9827008,49.8891609],[0.5796091,49.8213328],[0.420629,49.76297],[0.4281018,49.7544509],[0.2083136,49.6726862],[0.147652,49.5776743],[0.1346112,49.5809045],[0.1111672,49.543649],[0.5659823,49.520445],[0.5631983,49.4998946],[0.6300139,49.496659],[0.6147753,49.3744072],[0.5482527,49.3785094],[0.5425382,49.3346073],[0.4574069,49.3393812],[0.4584326,49.3449183],[0.3259735,49.354559],[0.3284645,49.3812758],[0.280111,49.3843283],[0.2768875,49.363339],[0.210951,49.3665834],[0.208167,49.3508366],[0.1432562,49.3553225],[0.1376883,49.3114953],[0.0720449,49.3153162],[0.0675026,49.2871299],[0.0027383,49.2907616],[0.0050827,49.2571106],[-0.0202662,49.260362],[-0.0349188,49.1973043],[-0.194485,49.2146316],[-0.389657,49.127263],[-0.4536886,49.1879201],[-0.3561026,49.2321443],[-0.8208815,49.2833068],[-0.9977772,49.3014908],[-1.1672818,49.2454506],[-1.1951526,49.2818265],[-1.2676791,49.2409863],[-1.341138,49.2975045],[-1.2476825,49.3502459],[-1.4458287,49.6068946],[-1.8110511,49.6175689],[-1.7747878,49.4433325],[-1.7277493,49.4650871],[-1.5338965,49.2909826],[-1.4790873,49.2923341],[-1.4760826,49.2402747],[-1.4355714,49.2032589],[-1.4722491,49.182201],[-1.4509056,48.7572466],[-1.3115513,48.7640766],[-1.3053347,48.7021631],[-1.2583998,48.7042144],[-1.2522868,48.6435279],[-1.2351913,48.6443494],[-1.2269026,48.5682354],[-1.8521839,48.5308559],[-1.8490756,48.4974996],[-1.9232598,48.4918694],[-1.9281294,48.4409635],[-2.0427212,48.4360144],[-2.0388876,48.4819121],[-2.2895011,48.4610214],[-2.3021023,48.5243337],[-2.4086263,48.5161813],[-2.4203484,48.5695361],[-2.4308411,48.5785185],[-2.4908308,48.5492405],[-2.4735281,48.5332572],[-2.5497844,48.4964697],[-2.5400451,48.4874747],[-2.7068057,48.4074551],[-3.0297895,48.6911498],[-4.0103381,48.5317872],[-4.0534166,48.6441199],[-4.3828059,48.5734929],[-4.3548195,48.5117951],[-4.3885293,48.5047279],[-4.1349543,48.4486809],[-4.1641129,48.389361],[-4.01832,48.3568516],[-4.0473321,48.2991791],[-3.9881358,48.2867008],[-4.0213971,48.216063],[-4.0363427,48.2195777],[-4.0662339,48.160284],[-4.1667504,48.1824662],[-4.1833077,48.149336],[-4.1723183,48.106499],[-4.2011062,48.1028546],[-4.1864321,48.0438867],[-4.1880639,48.0406137],[-4.3568595,48.0230513],[-4.2565705,47.9399726],[-4.2336349,47.9349658],[-4.2137074,47.9759839],[-4.2185428,47.977259],[-4.1805957,48.0556897],[-3.6172022,47.9312353],[-2.1799085,47.5864218],[-2.25449,47.4450059],[-2.3018177,47.4567969],[-2.3204265,47.4209203],[-2.3037225,47.4175495],[-2.3475337,47.3349949],[-2.3621862,47.3383711],[-2.380795,47.3039043],[-2.3585231,47.2985385],[-2.2996198,47.297843],[-2.297422,47.3617996],[-2.1319947,47.3585242],[-2.1347787,47.3910707],[-2.0156534,47.3962286],[-2.0140417,47.3809517],[-1.9286173,47.3825391],[-1.9289103,47.3795626],[-1.8322035,47.3818446],[-1.8298591,47.3416477],[-1.7360828,47.3430378],[-1.734178,47.3049972],[-1.6408412,47.3063882],[-1.6401086,47.2942654],[-1.5835498,47.2956567],[-1.5853081,47.3370802],[-1.461201,47.3396619],[-1.4600288,47.3292351],[-1.3721135,47.3322144],[-1.360538,47.1123893],[-1.4856707,47.1114918],[-1.4858173,47.1187709],[-1.6689741,47.1168765],[-1.6697068,47.1286411],[-1.725533,47.1276442],[-1.7261191,47.1376124],[-1.9397532,47.1326285],[-1.9401928,47.1421971],[-1.9925024,47.1430941],[-1.8106643,47.0058819],[-1.947226,46.9207831],[-1.9289103,46.9067703],[-1.9952864,46.8646098],[-1.7365224,46.6683945],[-1.7753516,46.643855],[-1.8267821,46.6417425],[-1.8247307,46.6207134],[-1.1819234,46.399869],[-0.9126096,46.3048021],[-0.9548089,46.2488984],[-0.9423542,46.2442372],[-0.9838474,46.1880746]],[[3.1476937,42.4007197],[3.1494906,42.4001543],[3.1530531,42.4005236],[3.1580376,42.4024274],[3.1876974,42.4280509],[3.142265,42.5247964],[3.0683711,42.5463547],[3.0488369,42.6941959],[3.0798953,43.0307277],[3.226405,43.1872688],[3.4091582,43.2603206],[3.5210352,43.258773],[3.6642877,43.3762765],[3.738414,43.3905396],[4.0097937,43.536068],[4.1769217,43.4563611],[4.5435531,43.4334906],[4.5494282,43.3540119],[4.8350582,43.3089126],[4.9750606,43.3830905],[5.0321866,43.3192811],[5.2591906,43.3192811],[5.3108165,43.2050388],[5.3568173,43.1864485],[5.3688175,43.1678525],[5.4023181,43.1621085],[5.4138183,43.1712257],[5.4091932,43.1992072],[5.5423205,43.1882713],[5.6058216,43.1479741],[5.6196969,43.1528987],[5.6383222,43.1715904],[5.6715728,43.1673966],[5.6909481,43.13411],[5.7760746,43.1063726],[5.7761996,43.0943247],[5.7540742,43.0832788],[5.7570743,43.0725048],[5.7703245,43.0646514],[5.8593261,43.0346897],[5.8877016,43.0627336],[5.9567028,43.0610897],[5.9638279,43.092773],[6.0003285,43.0918601],[6.0174538,43.068487],[6.1023303,43.0741485],[6.1048304,43.0525954],[6.0665981,43.0431845],[6.0672168,43.0378549],[6.1427018,43.0092284],[6.1567558,42.9871518],[6.1963544,42.9733134],[6.2222085,42.9801037],[6.2689052,42.996508],[6.2551549,43.0362655],[6.201904,43.0271281],[6.1837787,43.0918826],[6.3015307,43.0990937],[6.3247811,43.0797407],[6.3777821,43.0801059],[6.3886572,43.1339501],[6.5134094,43.1460813],[6.5770355,43.1788145],[6.6229113,43.1456253],[6.6977876,43.1996853],[6.6801623,43.2335736],[6.7211631,43.26007],[6.7224131,43.2747245],[6.6705372,43.2919232],[6.6874125,43.3311252],[6.7241631,43.3426718],[6.7529136,43.4089993],[6.7910393,43.3967387],[6.9062913,43.4167176],[6.9676674,43.5027333],[6.9661673,43.5281154],[7.006168,43.5384464],[7.0355435,43.4981997],[7.0689191,43.5001038],[7.0907945,43.5164228],[7.062669,43.5367247],[7.0825444,43.5456046],[7.1237951,43.5307436],[7.1557957,43.5437019],[7.1432954,43.622841],[7.1686709,43.6463635],[7.2137967,43.6346939],[7.2541724,43.6849746],[7.3402989,43.6674354],[7.3644243,43.6894038],[7.3530491,43.7082017],[7.4163002,43.7109124],[7.4540509,43.7450573],[7.4943016,43.7452379],[7.5794281,43.7842366],[7.6055156,43.7860269],[7.6036815,43.7889781],[7.5958811,43.7952788],[7.5962789,43.7954862],[7.5385252,43.8419488],[7.4599632,43.7998784],[7.4478096,43.8093355],[7.3235339,43.7480609],[7.3082211,43.7635679],[6.6487795,43.3885012],[6.6686548,43.3717842],[6.510027,43.2780293],[6.5658405,43.2250863],[6.1268057,43.105272],[5.4822945,43.2493904],[5.4726693,43.2309046],[5.4156683,43.2465678],[5.4526689,43.3450985],[4.8019076,43.4815759],[4.7641569,43.3924419],[4.657155,43.423681],[4.6722803,43.4560836],[4.4320261,43.5241904],[4.4145258,43.4925498],[4.1610214,43.5643292],[4.1445211,43.5706693],[4.141646,43.5739296],[4.1867718,43.5994627],[4.1056454,43.6819639],[3.79689,43.5216525],[3.7785147,43.5131316],[3.7646394,43.5059696],[3.7620144,43.5033403],[3.7422641,43.4932752],[3.7160136,43.5207461],[3.2621307,43.2814311],[3.2463804,43.2973542],[3.1838793,43.2805211],[3.1067529,43.2408312],[3.1547538,43.1941898],[2.9062494,43.1938252],[2.9067495,42.761892],[2.9461251,42.7620755],[2.9465001,42.6151551],[2.992376,42.6149711],[2.992376,42.5125003],[3.0410018,42.5125924],[3.0412052,42.5009317],[3.0908647,42.5008187],[3.1476937,42.4007197]],[[6.3594494,43.0232125],[6.4247695,43.0244403],[6.4524356,43.0350368],[6.4698484,43.0546098],[6.5112149,43.0576453],[6.5215565,43.0431768],[6.4836372,43.0244403],[6.471793,43.0072494],[6.4117762,42.9917993],[6.3985177,42.980484],[6.3517753,42.9990494],[6.3594494,43.0232125]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_France/G%C3%A9oLittoral","terms_text":"Ortho Littorale V2 - MEDDE"},{"id":"lu.geoportail.opendata.ortho_10cm_proto_lidar","name":"geoportail.lu LIDAR prototype Nordstad 2017","type":"tms","template":"http://{switch:wmts1,wmts2}.geoportail.lu/opendata/wmts/ortho_10cm_proto_lidar/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg","endDate":"2017-04-09T00:00:00.000Z","startDate":"2017-04-09T00:00:00.000Z","scaleExtent":[0,21],"polygon":[[[6.050007108761704,49.82175399016297],[6.049789364226169,49.91165980309075],[6.18901175543688,49.91171720394339],[6.188971338193781,49.821811209128995],[6.050007108761704,49.82175399016297]]],"terms_url":"https://act.public.lu/fr/cartographie/lidar/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"Geoportal-PL-aerial_image","name":"Geoportal.gov.pl (Orthophotomap)","type":"tms","template":"http://wms.misek.pl/geoportal.orto/tms/{zoom}/{x}/{y}","scaleExtent":[6,24],"polygon":[[[15.9751041,54.3709213],[16.311164,54.5561775],[17.1391878,54.7845723],[18.3448458,54.9022727],[19.6613689,54.4737213],[20.2815206,54.4213456],[21.4663914,54.3406369],[22.7759855,54.3769755],[22.8625989,54.4233613],[23.2956657,54.2678633],[23.5347186,54.0955258],[23.5208604,53.9775182],[23.7183389,53.4629603],[23.9296755,53.1856735],[23.9296755,52.6887269],[23.732197,52.6067497],[23.5658994,52.5878101],[23.2090523,52.3302642],[23.1951942,52.2370089],[23.5035377,52.1860596],[23.6906226,52.0030113],[23.5970802,51.739903],[23.6629063,51.3888562],[23.9366046,50.9827781],[24.1687284,50.8604752],[24.0197534,50.8035823],[24.1098313,50.6610467],[24.0578633,50.4188439],[23.6178674,50.3083403],[22.6824431,49.5163532],[22.7378756,49.2094935],[22.9041733,49.0780441],[22.8625989,48.9940062],[22.6096878,49.0371785],[22.0761495,49.2004392],[21.8474902,49.3721872],[21.3763135,49.4488281],[21.1026153,49.3721872],[20.9120659,49.3022043],[20.6452967,49.3902311],[20.1845136,49.3315641],[20.1186875,49.2004392],[19.9419962,49.1302123],[19.765305,49.2117568],[19.7479823,49.3992506],[19.6024718,49.4150307],[19.5089294,49.5815389],[19.4292451,49.5905232],[19.2317666,49.4150307],[18.9961783,49.387976],[18.9338167,49.4916048],[18.8368097,49.4938552],[18.8021643,49.6623381],[18.6427958,49.7094091],[18.521537,49.8994693],[18.0815412,50.0109209],[17.8875272,49.9886512],[17.7385522,50.0687739],[17.6068999,50.1709584],[17.7454813,50.2153184],[17.710836,50.3017019],[17.4163505,50.2640668],[16.9486384,50.4453265],[16.8932058,50.4033889],[17.0006064,50.3105529],[17.017929,50.2241854],[16.8135215,50.186489],[16.6402948,50.0976742],[16.4324227,50.2862087],[16.1968344,50.4276731],[16.4220291,50.5885165],[16.3388803,50.6632429],[16.2280152,50.6368824],[16.0547884,50.6127057],[15.5732181,50.7641544],[15.2683391,50.8976368],[15.2440873,50.980597],[15.0292862,51.0133036],[15.0015699,50.8582883],[14.8110205,50.8735944],[14.956531,51.0721176],[15.0188926,51.2914636],[14.9392083,51.4601459],[14.7209426,51.5571799],[14.7521234,51.6260562],[14.5996839,51.8427626],[14.70362,52.0733396],[14.5581095,52.2497371],[14.5165351,52.425436],[14.6031485,52.5878101],[14.1146491,52.8208272],[14.152759,52.9733951],[14.3502374,53.0734212],[14.4229927,53.2665624],[14.1977979,53.8734759],[14.2220497,53.9958517],[15.9751041,54.3709213]]],"terms_text":"Copyright © Główny Urząd Geodezji i Kartografii.","best":true,"icon":"http://i.imgur.com/aFlvMpM.png"},{"id":"girau_do_pnciano","name":"Girau do Ponciano","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Girau%20do%20Ponciano&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.78012791818,-9.92939325541],[-36.78086820787,-9.83891760784],[-36.87233153527,-9.83917131263],[-36.87173072046,-9.90542386241],[-36.87036815828,-9.92988995709],[-36.86155978387,-9.92994279765],[-36.85565892404,-9.92980541218],[-36.85146394914,-9.92973143536],[-36.84574547952,-9.92977370783],[-36.83213058656,-9.92966802665],[-36.81455675309,-9.92960461792],[-36.78012791818,-9.92939325541]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"GRAFCAN-Canary_Islands","name":"GRAFCAN - Canary Islands","type":"wms","template":"http://idecan1.grafcan.es/ServicioWMS/OrtoUrb?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=OU&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:4326","polygon":[[[-17.9291733,28.8910589],[-18.0333424,28.7998146],[-18.0374275,28.7317767],[-17.87811,28.4322434],[-17.8311317,28.4178731],[-17.7269626,28.5632821],[-17.7310476,28.6798232],[-17.6840694,28.7371497],[-17.7535155,28.8678081],[-17.8576846,28.860653],[-17.9291733,28.8910589]],[[-18.0781762,27.7721138],[-18.1370743,27.7875098],[-18.1705392,27.7644149],[-18.1779014,27.7069523],[-18.1578225,27.687989],[-18.0580973,27.6790988],[-18.0065614,27.6257423],[-17.9610492,27.6221843],[-17.9389624,27.7081374],[-17.9075054,27.7193953],[-17.8619932,27.8046798],[-17.872702,27.8407872],[-17.9255764,27.8680077],[-18.0052228,27.8360525],[-18.0139237,27.8034958],[-18.0781762,27.7721138]],[[-17.2687764,28.2399643],[-17.3340329,28.2193251],[-17.3633146,28.1536956],[-17.3666611,28.0880258],[-17.3306864,28.0474233],[-17.2729595,28.0068054],[-17.2001735,28.0053281],[-17.1441199,28.0289625],[-17.0780268,28.0835972],[-17.0872296,28.1536956],[-17.1826044,28.2149019],[-17.2687764,28.2399643]],[[-16.9358012,28.3762297],[-16.945004,28.3357366],[-16.7199529,27.9831662],[-16.6254147,27.9831662],[-16.52753,28.0164074],[-16.3995269,28.146319],[-16.3359437,28.3092236],[-16.3300873,28.3644515],[-16.1025263,28.524082],[-16.0983432,28.5814018],[-16.1426842,28.6254727],[-16.3392902,28.5960942],[-16.4380115,28.5314325],[-16.5392427,28.4402508],[-16.8395897,28.4122923],[-16.9358012,28.3762297]],[[-15.6883306,28.2058483],[-15.4739464,28.1643685],[-15.424272,28.2104562],[-15.3628326,28.1724353],[-15.3837481,28.0559841],[-15.3314593,27.9844367],[-15.3576037,27.8042042],[-15.5915962,27.6977727],[-15.7000956,27.7336471],[-15.7994443,27.8030479],[-15.8713415,27.9243925],[-15.8478115,28.036371],[-15.7471555,28.0894335],[-15.7314689,28.1839582],[-15.6883306,28.2058483]],[[-14.5088179,28.1344754],[-14.4107763,28.1344754],[-14.248681,28.2427804],[-14.2382232,28.3463737],[-14.0395256,28.7391056],[-13.8944241,28.7826519],[-13.7859248,28.7769232],[-13.8212198,28.3843326],[-13.9153397,28.190946],[-14.1859344,28.1356282],[-14.3088131,28.0052882],[-14.5401912,28.0514443],[-14.5088179,28.1344754]],[[-13.5524989,29.3772716],[-13.5086799,29.3682409],[-13.4795521,29.3872775],[-13.4754312,29.4096331],[-13.5003013,29.4280698],[-13.5504986,29.4071183],[-13.5524989,29.3772716]],[[-13.3976004,29.1610205],[-13.4281427,29.1215664],[-13.4417378,28.9908417],[-13.538995,28.9194675],[-13.7084109,28.8846777],[-13.7711575,28.8086488],[-13.9008338,28.8352194],[-13.9071084,28.8892559],[-13.8579569,28.936858],[-13.8569111,29.0365684],[-13.6759918,29.1498834],[-13.567231,29.1571898],[-13.5542776,29.3507259],[-13.399879,29.2180634],[-13.3976004,29.1610205]],[[-13.3379231,29.2866715],[-13.3503484,29.2743558],[-13.3385966,29.2653346],[-13.3261713,29.2776514],[-13.3379231,29.2866715]]],"terms_text":"GRAFCAN OrtoExpress Urbana 2009"},{"id":"GrandNancy_Orthophotographie_2012","name":"GrandNancy - Orthophoto - 2012","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/nancy_2012/{zoom}/{x}/{y}","endDate":"2012-01-01T00:00:00.000Z","startDate":"2012-01-01T00:00:00.000Z","scaleExtent":[0,22],"polygon":[[[6.06066031366,48.60554459242],[6.29717112787,48.59922593248],[6.30611158204,48.74076820528],[6.06896018357,48.74710338225],[6.06066031366,48.60554459242]]],"terms_url":"http://wiki.openstreetmap.org/wiki/Nancy/Orthophotographie","terms_text":"GrandNancy Orthophotographie 2012"},{"id":"hamburg-40cm","name":"Hamburg (40 cm)","type":"wms","template":"http://geodienste.hamburg.de/HH_WMS_DOP40?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[8.4825961,53.9356013],[8.4827386,53.9092447],[8.5274957,53.9094126],[8.5279233,53.9357691],[8.4825961,53.9356013]],[[9.7723167,53.543523],[9.7743354,53.5543296],[9.7631359,53.5552115],[9.7304736,53.5578689],[9.7346453,53.5653605],[9.7579266,53.6182757],[9.7712877,53.6313071],[9.770699,53.6160708],[9.7963361,53.6102995],[9.7899342,53.6038562],[9.8181678,53.5859147],[9.8377278,53.5919808],[9.8449827,53.5949795],[9.8541578,53.5980542],[9.8681371,53.6092959],[9.8693051,53.6132263],[9.885052,53.6219916],[9.8869663,53.6252015],[9.8935594,53.6302636],[9.8963672,53.6312186],[9.8968811,53.6349162],[9.9067823,53.6523063],[9.9311454,53.6526154],[9.9455232,53.6527604],[9.9502445,53.6508457],[9.9515493,53.6506547],[9.9779541,53.6488699],[9.9849181,53.6482971],[9.9873906,53.6507159],[9.9995963,53.6815314],[10.0228185,53.6815708],[10.0433756,53.6819823],[10.0514778,53.6775926],[10.0692494,53.679547],[10.0604009,53.6883344],[10.0709998,53.6958498],[10.0707046,53.7099642],[10.0819849,53.7204444],[10.1190792,53.7132448],[10.1693902,53.7389576],[10.1936896,53.7310028],[10.1779029,53.7099228],[10.1569421,53.7045133],[10.1582858,53.6894414],[10.1434248,53.6805732],[10.1417595,53.6774354],[10.144728,53.6761294],[10.1464311,53.6758841],[10.1495537,53.6754497],[10.1715323,53.6686937],[10.1988496,53.6467523],[10.1897268,53.6383796],[10.2220152,53.6334888],[10.1888726,53.6131597],[10.1923583,53.5947431],[10.2011737,53.5839226],[10.1516942,53.5761904],[10.1506692,53.5697309],[10.1479994,53.5639032],[10.1530759,53.5624246],[10.1594205,53.5609125],[10.1518903,53.5416987],[10.154649,53.5365725],[10.1687379,53.5374002],[10.1632659,53.5218549],[10.1661094,53.5201314],[10.169185,53.5196505],[10.1895059,53.5114835],[10.2104308,53.5199588],[10.218276,53.4992345],[10.2366988,53.4962928],[10.2500849,53.4789784],[10.2659161,53.4707878],[10.2904343,53.4551223],[10.3096151,53.4430928],[10.3122326,53.4522908],[10.3251401,53.4497898],[10.3079865,53.4333199],[10.2559794,53.4162256],[10.2508909,53.4102422],[10.2457816,53.402611],[10.2415493,53.3979725],[10.1655462,53.399327],[10.1450604,53.416136],[10.1094899,53.4264876],[10.1067973,53.4265817],[10.075805,53.4543638],[10.0515477,53.4639369],[10.0351698,53.446896],[10.0144851,53.4420285],[10.0229369,53.4322826],[9.9975402,53.4254609],[9.9824345,53.4147804],[9.9787266,53.4142015],[9.958105,53.4270802],[9.9295317,53.4200676],[9.92552,53.4192417],[9.9066683,53.4159559],[9.9230535,53.4363147],[9.9170421,53.4466391],[9.9043636,53.4570665],[9.8949316,53.4558313],[9.8688468,53.4446225],[9.8621101,53.4294212],[9.8487204,53.4411135],[9.806634,53.4664838],[9.8002119,53.4737243],[9.8028025,53.4938287],[9.7820338,53.4923568],[9.7688507,53.5053032],[9.7710683,53.5218512],[9.7810509,53.5183751],[9.773523,53.527956],[9.7723167,53.543523]]]},{"id":"Hamburg-DK5","name":"Hamburg (DK5)","type":"wms","template":"http://geodienste.hamburg.de/HH_WMS_Geobasisdaten?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=13&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:4326","polygon":[[[8.4825961,53.9356013],[8.4827386,53.9092447],[8.5274957,53.9094126],[8.5279233,53.9357691],[8.4825961,53.9356013]],[[9.7723167,53.543523],[9.7743354,53.5543296],[9.7631359,53.5552115],[9.7304736,53.5578689],[9.7346453,53.5653605],[9.7579266,53.6182757],[9.7712877,53.6313071],[9.770699,53.6160708],[9.7963361,53.6102995],[9.7899342,53.6038562],[9.8181678,53.5859147],[9.8377278,53.5919808],[9.8449827,53.5949795],[9.8541578,53.5980542],[9.8681371,53.6092959],[9.8693051,53.6132263],[9.885052,53.6219916],[9.8869663,53.6252015],[9.8935594,53.6302636],[9.8963672,53.6312186],[9.8968811,53.6349162],[9.9067823,53.6523063],[9.9311454,53.6526154],[9.9455232,53.6527604],[9.9502445,53.6508457],[9.9515493,53.6506547],[9.9779541,53.6488699],[9.9849181,53.6482971],[9.9873906,53.6507159],[9.9995963,53.6815314],[10.0228185,53.6815708],[10.0433756,53.6819823],[10.0514778,53.6775926],[10.0692494,53.679547],[10.0604009,53.6883344],[10.0709998,53.6958498],[10.0707046,53.7099642],[10.0819849,53.7204444],[10.1190792,53.7132448],[10.1693902,53.7389576],[10.1936896,53.7310028],[10.1779029,53.7099228],[10.1569421,53.7045133],[10.1582858,53.6894414],[10.1434248,53.6805732],[10.1417595,53.6774354],[10.144728,53.6761294],[10.1464311,53.6758841],[10.1495537,53.6754497],[10.1715323,53.6686937],[10.1988496,53.6467523],[10.1897268,53.6383796],[10.2220152,53.6334888],[10.1888726,53.6131597],[10.1923583,53.5947431],[10.2011737,53.5839226],[10.1516942,53.5761904],[10.1506692,53.5697309],[10.1479994,53.5639032],[10.1530759,53.5624246],[10.1594205,53.5609125],[10.1518903,53.5416987],[10.154649,53.5365725],[10.1687379,53.5374002],[10.1632659,53.5218549],[10.1661094,53.5201314],[10.169185,53.5196505],[10.1895059,53.5114835],[10.2104308,53.5199588],[10.218276,53.4992345],[10.2366988,53.4962928],[10.2500849,53.4789784],[10.2659161,53.4707878],[10.2904343,53.4551223],[10.3096151,53.4430928],[10.3122326,53.4522908],[10.3251401,53.4497898],[10.3079865,53.4333199],[10.2559794,53.4162256],[10.2508909,53.4102422],[10.2457816,53.402611],[10.2415493,53.3979725],[10.1655462,53.399327],[10.1450604,53.416136],[10.1094899,53.4264876],[10.1067973,53.4265817],[10.075805,53.4543638],[10.0515477,53.4639369],[10.0351698,53.446896],[10.0144851,53.4420285],[10.0229369,53.4322826],[9.9975402,53.4254609],[9.9824345,53.4147804],[9.9787266,53.4142015],[9.958105,53.4270802],[9.9295317,53.4200676],[9.92552,53.4192417],[9.9066683,53.4159559],[9.9230535,53.4363147],[9.9170421,53.4466391],[9.9043636,53.4570665],[9.8949316,53.4558313],[9.8688468,53.4446225],[9.8621101,53.4294212],[9.8487204,53.4411135],[9.806634,53.4664838],[9.8002119,53.4737243],[9.8028025,53.4938287],[9.7820338,53.4923568],[9.7688507,53.5053032],[9.7710683,53.5218512],[9.7810509,53.5183751],[9.773523,53.527956],[9.7723167,53.543523]]]},{"id":"Hampshire-Aerial-FCIR","name":"Hampshire Aerial FCIR","type":"tms","template":"https://{switch:a,b,c}.hampshire.aerial.openstreetmap.org.uk/layer/gb_hampshire_aerial_fcir/{zoom}/{x}/{y}.png","endDate":"2014-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[8,20],"polygon":[[[-1.315673,50.77809],[-1.491387,50.73027],[-1.57113,50.69041],[-1.680953,50.71748],[-1.693378,50.73484],[-1.695277,50.74065],[-1.686891,50.74999],[-1.710684,50.74812],[-1.719504,50.75261],[-1.746001,50.74452],[-1.748452,50.75675],[-1.742869,50.76397],[-1.751012,50.77577],[-1.78525,50.76177],[-1.799108,50.77236],[-1.822565,50.77225],[-1.826778,50.78077],[-1.822497,50.79933],[-1.807317,50.80074],[-1.81566,50.80752],[-1.808894,50.81358],[-1.805787,50.83249],[-1.798157,50.83535],[-1.806491,50.84414],[-1.809882,50.86189],[-1.813783,50.85591],[-1.830516,50.85261],[-1.852711,50.85651],[-1.85655,50.86684],[-1.849205,50.87802],[-1.85082,50.89178],[-1.84077,50.90051],[-1.826931,50.89939],[-1.820062,50.90492],[-1.821513,50.91691],[-1.816889,50.92412],[-1.841137,50.92886],[-1.874458,50.91441],[-1.911294,50.9439],[-1.923386,50.95917],[-1.95751,50.97575],[-1.959101,50.99152],[-1.949071,50.98649],[-1.928787,51.00055],[-1.887094,51.0026],[-1.87393,51.0097],[-1.871695,50.99083],[-1.854331,51.00786],[-1.835675,51.01238],[-1.815019,50.9899],[-1.800312,50.99457],[-1.751838,50.98133],[-1.719271,50.98047],[-1.691416,50.95943],[-1.66829,50.95041],[-1.652596,50.95029],[-1.635362,50.96269],[-1.623972,50.95903],[-1.608898,50.97686],[-1.621721,50.98099],[-1.631149,50.99984],[-1.609836,51.01225],[-1.601734,51.01042],[-1.607874,51.01582],[-1.605696,51.02271],[-1.635423,51.03176],[-1.638583,51.04126],[-1.631067,51.07819],[-1.640253,51.09201],[-1.630602,51.10359],[-1.634078,51.11099],[-1.630674,51.11652],[-1.641093,51.12237],[-1.665249,51.12546],[-1.657236,51.15539],[-1.674737,51.177],[-1.67213,51.18708],[-1.696792,51.20233],[-1.69247,51.21617],[-1.652877,51.22301],[-1.635643,51.22019],[-1.623947,51.24136],[-1.614024,51.24467],[-1.607408,51.25513],[-1.577168,51.25863],[-1.544434,51.24826],[-1.538396,51.25085],[-1.534359,51.25919],[-1.543446,51.25957],[-1.540068,51.27602],[-1.545961,51.28095],[-1.535908,51.28978],[-1.525949,51.28975],[-1.530933,51.29948],[-1.530081,51.3111],[-1.536275,51.31596],[-1.529857,51.34057],[-1.515522,51.34219],[-1.494983,51.33228],[-1.435991,51.33861],[-1.447589,51.3464],[-1.446305,51.35699],[-1.430556,51.35941],[-1.416077,51.37517],[-1.348989,51.37045],[-1.314724,51.37627],[-1.275549,51.3707],[-1.251156,51.37511],[-1.241179,51.36938],[-1.222093,51.37271],[-1.176023,51.36102],[-1.143212,51.36028],[-1.118753,51.36156],[-1.120961,51.36859],[-1.116785,51.3767],[-1.083632,51.38712],[-1.047537,51.36122],[-0.990405,51.36619],[-0.972636,51.36297],[-0.92376,51.36937],[-0.876809,51.3555],[-0.86549,51.35947],[-0.82728,51.35574],[-0.811219,51.34418],[-0.783225,51.34084],[-0.763252,51.32721],[-0.760048,51.32013],[-0.741834,51.31112],[-0.728423,51.28238],[-0.726306,51.25653],[-0.737128,51.23126],[-0.748978,51.2277],[-0.777122,51.23901],[-0.801926,51.23628],[-0.806106,51.24056],[-0.824914,51.23137],[-0.827009,51.22315],[-0.844932,51.20998],[-0.822682,51.18268],[-0.830416,51.15022],[-0.819518,51.15047],[-0.805037,51.15847],[-0.793819,51.15491],[-0.788794,51.14141],[-0.77846,51.13664],[-0.778131,51.13063],[-0.766544,51.11946],[-0.743652,51.11491],[-0.747146,51.10131],[-0.754112,51.10116],[-0.751217,51.09547],[-0.75506,51.08987],[-0.750757,51.0852],[-0.778501,51.07715],[-0.786448,51.06467],[-0.799544,51.06078],[-0.826446,51.05881],[-0.836458,51.0664],[-0.845193,51.06052],[-0.849904,51.0436],[-0.894853,51.01978],[-0.890651,51.00194],[-0.904614,50.99327],[-0.914614,50.97806],[-0.912784,50.9708],[-0.932457,50.94278],[-0.921188,50.9232],[-0.93793,50.91615],[-0.951325,50.89178],[-0.923681,50.86513],[-0.929757,50.85365],[-0.929033,50.84245],[-0.943419,50.82191],[-0.929902,50.78445],[-0.932748,50.77435],[-0.953469,50.73682],[-1.315673,50.77809]]]},{"id":"Hampshire-Aerial-RGB","name":"Hampshire Aerial RGB","type":"tms","template":"https://{switch:a,b,c}.hampshire.aerial.openstreetmap.org.uk/layer/gb_hampshire_aerial_rgb/{zoom}/{x}/{y}.png","endDate":"2013-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[8,20],"polygon":[[[-1.315673,50.77809],[-1.491387,50.73027],[-1.57113,50.69041],[-1.680953,50.71748],[-1.693378,50.73484],[-1.695277,50.74065],[-1.686891,50.74999],[-1.710684,50.74812],[-1.719504,50.75261],[-1.746001,50.74452],[-1.748452,50.75675],[-1.742869,50.76397],[-1.751012,50.77577],[-1.78525,50.76177],[-1.799108,50.77236],[-1.822565,50.77225],[-1.826778,50.78077],[-1.822497,50.79933],[-1.807317,50.80074],[-1.81566,50.80752],[-1.808894,50.81358],[-1.805787,50.83249],[-1.798157,50.83535],[-1.806491,50.84414],[-1.809882,50.86189],[-1.813783,50.85591],[-1.830516,50.85261],[-1.852711,50.85651],[-1.85655,50.86684],[-1.849205,50.87802],[-1.85082,50.89178],[-1.84077,50.90051],[-1.826931,50.89939],[-1.820062,50.90492],[-1.821513,50.91691],[-1.816889,50.92412],[-1.841137,50.92886],[-1.874458,50.91441],[-1.911294,50.9439],[-1.923386,50.95917],[-1.95751,50.97575],[-1.959101,50.99152],[-1.949071,50.98649],[-1.928787,51.00055],[-1.887094,51.0026],[-1.87393,51.0097],[-1.871695,50.99083],[-1.854331,51.00786],[-1.835675,51.01238],[-1.815019,50.9899],[-1.800312,50.99457],[-1.751838,50.98133],[-1.719271,50.98047],[-1.691416,50.95943],[-1.66829,50.95041],[-1.652596,50.95029],[-1.635362,50.96269],[-1.623972,50.95903],[-1.608898,50.97686],[-1.621721,50.98099],[-1.631149,50.99984],[-1.609836,51.01225],[-1.601734,51.01042],[-1.607874,51.01582],[-1.605696,51.02271],[-1.635423,51.03176],[-1.638583,51.04126],[-1.631067,51.07819],[-1.640253,51.09201],[-1.630602,51.10359],[-1.634078,51.11099],[-1.630674,51.11652],[-1.641093,51.12237],[-1.665249,51.12546],[-1.657236,51.15539],[-1.674737,51.177],[-1.67213,51.18708],[-1.696792,51.20233],[-1.69247,51.21617],[-1.652877,51.22301],[-1.635643,51.22019],[-1.623947,51.24136],[-1.614024,51.24467],[-1.607408,51.25513],[-1.577168,51.25863],[-1.544434,51.24826],[-1.538396,51.25085],[-1.534359,51.25919],[-1.543446,51.25957],[-1.540068,51.27602],[-1.545961,51.28095],[-1.535908,51.28978],[-1.525949,51.28975],[-1.530933,51.29948],[-1.530081,51.3111],[-1.536275,51.31596],[-1.529857,51.34057],[-1.515522,51.34219],[-1.494983,51.33228],[-1.435991,51.33861],[-1.447589,51.3464],[-1.446305,51.35699],[-1.430556,51.35941],[-1.416077,51.37517],[-1.348989,51.37045],[-1.314724,51.37627],[-1.275549,51.3707],[-1.251156,51.37511],[-1.241179,51.36938],[-1.222093,51.37271],[-1.176023,51.36102],[-1.143212,51.36028],[-1.118753,51.36156],[-1.120961,51.36859],[-1.116785,51.3767],[-1.083632,51.38712],[-1.047537,51.36122],[-0.990405,51.36619],[-0.972636,51.36297],[-0.92376,51.36937],[-0.876809,51.3555],[-0.86549,51.35947],[-0.82728,51.35574],[-0.811219,51.34418],[-0.783225,51.34084],[-0.763252,51.32721],[-0.760048,51.32013],[-0.741834,51.31112],[-0.728423,51.28238],[-0.726306,51.25653],[-0.737128,51.23126],[-0.748978,51.2277],[-0.777122,51.23901],[-0.801926,51.23628],[-0.806106,51.24056],[-0.824914,51.23137],[-0.827009,51.22315],[-0.844932,51.20998],[-0.822682,51.18268],[-0.830416,51.15022],[-0.819518,51.15047],[-0.805037,51.15847],[-0.793819,51.15491],[-0.788794,51.14141],[-0.77846,51.13664],[-0.778131,51.13063],[-0.766544,51.11946],[-0.743652,51.11491],[-0.747146,51.10131],[-0.754112,51.10116],[-0.751217,51.09547],[-0.75506,51.08987],[-0.750757,51.0852],[-0.778501,51.07715],[-0.786448,51.06467],[-0.799544,51.06078],[-0.826446,51.05881],[-0.836458,51.0664],[-0.845193,51.06052],[-0.849904,51.0436],[-0.894853,51.01978],[-0.890651,51.00194],[-0.904614,50.99327],[-0.914614,50.97806],[-0.912784,50.9708],[-0.932457,50.94278],[-0.921188,50.9232],[-0.93793,50.91615],[-0.951325,50.89178],[-0.923681,50.86513],[-0.929757,50.85365],[-0.929033,50.84245],[-0.943419,50.82191],[-0.929902,50.78445],[-0.932748,50.77435],[-0.953469,50.73682],[-1.315673,50.77809]]]},{"id":"Yverdon_les_Bains-HEIG_VD-2007","name":"HEIG-VD / Orthophoto Yverdon-les-Bains 25cm (2007)","type":"wms","template":"http://ogc.heig-vd.ch/mapserver/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=orthophoto_yverdon&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2007-01-01T00:00:00.000Z","startDate":"2007-01-01T00:00:00.000Z","polygon":[[[6.6620704,46.7757613],[6.6593637,46.7749931],[6.6604976,46.7745171],[6.6596563,46.7733731],[6.658242,46.7710934],[6.6580469,46.7705088],[6.6573276,46.7693898],[6.6554865,46.7697656],[6.6548159,46.7700412],[6.6536333,46.7702917],[6.6488782,46.7683208],[6.6473176,46.7700579],[6.6461837,46.7696153],[6.6454034,46.7704838],[6.645001,46.7703251],[6.6435257,46.7718115],[6.6422821,46.7712771],[6.6406239,46.7729556],[6.6403191,46.7728303],[6.6387097,46.7744336],[6.6373929,46.7738407],[6.6355275,46.7756778],[6.6349057,46.7753772],[6.6327598,46.777473],[6.6314308,46.776947],[6.6286875,46.7798025],[6.6241398,46.7808713],[6.6244202,46.7813138],[6.6207868,46.7823825],[6.6210185,46.7825995],[6.6192872,46.7832006],[6.6208722,46.7847786],[6.6188239,46.7855216],[6.6247738,46.7909228],[6.625993,46.7903385],[6.6261271,46.7904971],[6.6306139,46.7880344],[6.6287729,46.7912985],[6.6362834,46.7938695],[6.6373198,46.7924838],[6.6380087,46.7927176],[6.6387158,46.7917993],[6.6396546,46.7909187],[6.6411238,46.7892533],[6.6414896,46.7894119],[6.6443548,46.7867321],[6.6458057,46.7875169],[6.6468543,46.7866737],[6.6473176,46.7869158],[6.6507923,46.7842933],[6.6511115,46.7844456],[6.6533285,46.7824158],[6.6544349,46.7828427],[6.6560687,46.7809766],[6.6567332,46.7812522],[6.6583609,46.7793736],[6.6589722,46.7796176],[6.6620704,46.7757613]]],"terms_text":"Orthophoto Yverdon 2007 / HEIG-VD"},{"id":"IBGE_DF_Addresses","name":"IBGE Distrito Federal","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/wille/cirnnxni1000jg8nfppc8g7pm/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoid2lsbGUiLCJhIjoicFNVWk5VWSJ9.hluCd0YGvYHNlFi_utWe2g","scaleExtent":[0,20],"polygon":[[[-48.2444,-16.0508],[-48.2444,-15.5005],[-47.5695,-15.5005],[-47.5695,-16.0508],[-48.2444,-16.0508]]],"terms_text":"IBGE","description":"Addresses data from IBGE","overlay":true},{"id":"IBGE_Setores_Rurais","name":"IBGE Mapa de Setores Rurais","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/tmpsantos.i00mo1kj/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw","scaleExtent":[0,14],"polygon":[[[-29.3325,2.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.838943],[-66.52331,-9.985873],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]]},{"id":"IBGE_Setores_Urbanos","name":"IBGE Mapa de Setores Urbanos","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/tmpsantos.hgda0m6h/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw","scaleExtent":[0,19],"polygon":[[[-29.3325,2.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.838943],[-66.52331,-9.985873],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]]},{"id":"IBGE_BC250_Aglomerado_Rural","name":"IBGE-BC250-Aglomerado Rural Isolado","type":"wms","template":"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Aglomerado_Rural_Isolado_P&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE","projection":"EPSG:3857","polygon":[[[-29.3325,2.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.838943],[-66.52331,-9.985873],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]],"terms_text":"IBGE","overlay":true},{"id":"IBGE_BC250_Pista_Pouso","name":"IBGE-BC250-Pista de Pouso","type":"wms","template":"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Pista_Ponto_Pouso_L&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE","projection":"EPSG:3857","polygon":[[[-29.3325,2.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.838943],[-66.52331,-9.985873],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]],"terms_text":"IBGE","overlay":true},{"id":"IBGE_BC250_Rios_Drenagem","name":"IBGE-BC250-Rios Drenagem","type":"wms","template":"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Trecho_Drenagem_L&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE","projection":"EPSG:3857","polygon":[[[-29.3325,2.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.838943],[-66.52331,-9.985873],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]],"terms_text":"IBGE","overlay":true},{"id":"IBGE_BC250_Terra_Indegina","name":"IBGE-BC250-Terra Indigena","type":"wms","template":"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Terra_Indigena_A&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE","projection":"EPSG:3857","polygon":[[[-29.3325,2.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.838943],[-66.52331,-9.985873],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]],"terms_text":"IBGE","overlay":true},{"id":"IBGE_BC250_Rodoviario","name":"IBGE-BC250-Trecho Rodoviario","type":"wms","template":"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Trecho_Rodoviario_L&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image/png&TRANSPARENT=TRUE","projection":"EPSG:3857","polygon":[[[-29.3325,2.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.838943],[-66.52331,-9.985873],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]],"terms_text":"IBGE","overlay":true},{"id":"IBGE_BC250_Uso_Sustentavel","name":"IBGE-BC250-Unidade de Uso Sistentável - APA","type":"wms","template":"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Unidade_Uso_Sustentavel_A&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE","projection":"EPSG:3857","polygon":[[[-29.3325,2.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.838943],[-66.52331,-9.985873],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]],"terms_text":"IBGE","overlay":true},{"id":"IBGE_BC250_Villa","name":"IBGE-BC250-Villa","type":"wms","template":"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Vila_P&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE","projection":"EPSG:3857","polygon":[[[-29.3325,2.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.838943],[-66.52331,-9.985873],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]],"terms_text":"IBGE","overlay":true},{"id":"IBGE_BCIM_Gerador_Eletrica","name":"IBGE-BCIM-Estações Geradora de Energia Elétrica","type":"wms","template":"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BCIM_Est_Gerad_Energia_Eletrica_P&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE","projection":"EPSG:3857","polygon":[[[-29.3325,2.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.838943],[-66.52331,-9.985873],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]],"terms_text":"IBGE","overlay":true},{"id":"IBGE_BCIM_Municipio","name":"IBGE-BCIM-Município","type":"wms","template":"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BCIM_Municipio_A&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE","projection":"EPSG:3857","polygon":[[[-29.3325,2.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.838943],[-66.52331,-9.985873],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]],"terms_text":"IBGE","overlay":true},{"id":"Haiti-Drone","name":"Imagerie Drone (Haiti)","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/iomhaiti/{zoom}/{x}/{y}","polygon":[[[-72.1547401,19.6878969],[-72.162234,19.689011],[-72.164995,19.6932445],[-72.1657838,19.6979977],[-72.161603,19.7035677],[-72.1487449,19.7028993],[-72.1477194,19.7026765],[-72.1485082,19.7001514],[-72.1436963,19.7011169],[-72.1410143,19.7000029],[-72.139476,19.6973664],[-72.1382533,19.6927617],[-72.1386872,19.6923161],[-72.1380561,19.6896423],[-72.1385294,19.6894938],[-72.1388055,19.6901251],[-72.1388844,19.6876741],[-72.1378195,19.6872656],[-72.13778,19.6850003],[-72.1369517,19.6855945],[-72.136794,19.6840719],[-72.135729,19.6835148],[-72.1355713,19.6740817],[-72.1366362,19.6708133],[-72.1487843,19.6710733],[-72.1534779,19.6763843],[-72.1530835,19.6769414],[-72.1533251,19.6769768],[-72.1532807,19.6796525],[-72.1523834,19.6797175],[-72.1522749,19.6803488],[-72.1519101,19.6803395],[-72.1518608,19.6805067],[-72.1528173,19.6806552],[-72.1522299,19.6833011],[-72.1507801,19.6831499],[-72.1504457,19.6847862],[-72.1508591,19.6843492],[-72.1530087,19.6849898],[-72.1546258,19.6854354],[-72.1543103,19.6870694],[-72.1547244,19.6868466],[-72.1548501,19.6877564],[-72.1545814,19.6877982],[-72.1547401,19.6878969]],[[-72.1310601,19.6718929],[-72.1259842,19.6772765],[-72.1255379,19.6776179],[-72.1216891,19.6776442],[-72.1149677,19.672602],[-72.1152745,19.6687152],[-72.1198205,19.6627535],[-72.1227768,19.6625696],[-72.1248965,19.662701],[-72.1285779,19.6645394],[-72.1308091,19.6661677],[-72.1316737,19.668794],[-72.1315621,19.671],[-72.1310601,19.6718929]],[[-71.845795,19.6709758],[-71.8429354,19.6759525],[-71.8410027,19.6759525],[-71.8380249,19.6755254],[-71.8378671,19.6745041],[-71.8390504,19.6743927],[-71.8390109,19.6741141],[-71.8398392,19.673947],[-71.8389123,19.6736127],[-71.8380249,19.67209],[-71.8380052,19.6726285],[-71.8376699,19.6727214],[-71.8376305,19.672545],[-71.8354414,19.6732135],[-71.835333,19.6729999],[-71.8331242,19.6734642],[-71.8326706,19.6716815],[-71.8321579,19.67209],[-71.8307183,19.6694902],[-71.8306009,19.6697594],[-71.8302174,19.6698907],[-71.8291833,19.6672095],[-71.8290749,19.6672095],[-71.8289122,19.6667916],[-71.8289516,19.6666199],[-71.8288333,19.6663506],[-71.8285572,19.6664759],[-71.8288678,19.6672466],[-71.8287593,19.6674138],[-71.8277979,19.6678177],[-71.8277112,19.6678586],[-71.8278263,19.6679637],[-71.8271831,19.6681212],[-71.8271761,19.6680917],[-71.8264405,19.6683921],[-71.8264074,19.6683231],[-71.8261954,19.6684253],[-71.8261806,19.6683556],[-71.8258946,19.6684206],[-71.8258897,19.6686574],[-71.8251551,19.6687549],[-71.8254509,19.6691588],[-71.8229332,19.6695739],[-71.822713,19.6696658],[-71.8227688,19.6697577],[-71.8201751,19.6709855],[-71.8198474,19.6704537],[-71.8197985,19.6706014],[-71.8194674,19.6707557],[-71.8182472,19.6713433],[-71.8181426,19.6711431],[-71.8175813,19.6714254],[-71.816959,19.6707672],[-71.8176388,19.6718965],[-71.8171403,19.6720376],[-71.8158225,19.6718045],[-71.8138354,19.6711874],[-71.8123259,19.6706982],[-71.8121759,19.6704258],[-71.8124304,19.6701467],[-71.8119184,19.6700141],[-71.8118765,19.6705828],[-71.811169,19.6703483],[-71.8095938,19.6698516],[-71.8077992,19.6692829],[-71.8056028,19.668612],[-71.8051443,19.6668942],[-71.8051196,19.6652322],[-71.8052315,19.661979],[-71.8065603,19.6523921],[-71.8073412,19.6482946],[-71.8099686,19.6468292],[-71.8147517,19.6454502],[-71.8147726,19.6455619],[-71.8150027,19.6455093],[-71.8149469,19.6453846],[-71.8159928,19.6450234],[-71.8158882,19.6448855],[-71.8165854,19.6446097],[-71.8190119,19.643802],[-71.8211524,19.643454],[-71.8221564,19.6433292],[-71.8269046,19.643211],[-71.8280481,19.6432241],[-71.8304466,19.6440778],[-71.8306419,19.6448592],[-71.8295263,19.6450365],[-71.8296064,19.6456111],[-71.8299411,19.6455651],[-71.8303699,19.6451744],[-71.830471,19.6453452],[-71.8308092,19.6451974],[-71.8310184,19.6451088],[-71.8312519,19.6458541],[-71.8311125,19.6458245],[-71.831367,19.6465862],[-71.8328939,19.646189],[-71.8344566,19.6457062],[-71.8344664,19.6463052],[-71.834215,19.6461938],[-71.8342002,19.6465513],[-71.8346702,19.6463],[-71.8349118,19.6463905],[-71.8347984,19.6462187],[-71.8354393,19.6458496],[-71.8355034,19.6458032],[-71.8364747,19.6461328],[-71.8376382,19.6472658],[-71.8379143,19.647888],[-71.8390483,19.6508039],[-71.8456942,19.6696203],[-71.845795,19.6709758]],[[-72.098878,18.54843],[-72.096993,18.5501994],[-72.0972888,18.5503209],[-72.0968451,18.5503489],[-72.0955632,18.551854],[-72.0956428,18.5526742],[-72.0959914,18.5533748],[-72.0962145,18.553203],[-72.0962842,18.5535665],[-72.0964446,18.5535533],[-72.0965352,18.5539764],[-72.0965056,18.554173],[-72.0966085,18.5541747],[-72.0965178,18.5542127],[-72.0968769,18.5546588],[-72.0979018,18.5552141],[-72.1006211,18.5555875],[-72.1014926,18.5556206],[-72.1024339,18.5555016],[-72.103417,18.5543515],[-72.1034798,18.5516215],[-72.1030789,18.5516149],[-72.1033752,18.5515224],[-72.1035042,18.5515224],[-72.1035239,18.5502417],[-72.1028701,18.5503062],[-72.1029015,18.55025],[-72.1028457,18.5501773],[-72.1035081,18.5500252],[-72.103491,18.5497396],[-72.1035181,18.5497361],[-72.1035398,18.5489039],[-72.1034317,18.5487056],[-72.102717,18.5481437],[-72.1025601,18.5481536],[-72.10229,18.5482751],[-72.1022891,18.5482569],[-72.1025201,18.5481396],[-72.1023388,18.5481321],[-72.0999082,18.5480901],[-72.09907,18.5483799],[-72.098878,18.54843]],[[-72.2542503,18.568262],[-72.2560252,18.5717765],[-72.2557886,18.5748049],[-72.2535009,18.5755526],[-72.2522782,18.5755526],[-72.2499906,18.5740945],[-72.2473874,18.5698323],[-72.2460069,18.566729],[-72.2458492,18.5629527],[-72.2479396,18.5625414],[-72.2501483,18.5628031],[-72.2519232,18.5650839],[-72.2542503,18.568262]],[[-72.303145,18.5332749],[-72.3031275,18.5331799],[-72.3048311,18.5311081],[-72.3097397,18.5311081],[-72.3164332,18.5324302],[-72.3234056,18.5366083],[-72.3261388,18.5387765],[-72.3261946,18.5426371],[-72.3170468,18.5540596],[-72.3130864,18.5540596],[-72.2987511,18.5453342],[-72.2988627,18.5407333],[-72.2962969,18.5404689],[-72.2954602,18.5395169],[-72.2961853,18.5338582],[-72.2971893,18.5332235],[-72.3007034,18.5332764],[-72.3022652,18.5342284],[-72.3028486,18.5335189],[-72.303104,18.5333361],[-72.303181,18.5334007],[-72.3035793,18.5335614],[-72.3030793,18.5346463],[-72.303715,18.5339873],[-72.3045286,18.5344052],[-72.3044015,18.5345097],[-72.3062747,18.5352571],[-72.3063107,18.5352741],[-72.3061219,18.5357628],[-72.3061219,18.5358196],[-72.30637,18.5358928],[-72.3062726,18.5354869],[-72.3066688,18.5350891],[-72.3061963,18.5349706],[-72.3058869,18.5349385],[-72.3055373,18.5346833],[-72.3054864,18.534613],[-72.3055585,18.5345065],[-72.3046749,18.5342293],[-72.3047617,18.5338817],[-72.3043252,18.5337511],[-72.3042595,18.5336346],[-72.303145,18.5332749]],[[-72.2981405,18.477502],[-72.2935652,18.4948587],[-72.2922242,18.4964297],[-72.2931708,18.4972526],[-72.2892266,18.5057058],[-72.2878067,18.5080996],[-72.2850458,18.5119893],[-72.2840203,18.5113161],[-72.2808649,18.515879],[-72.2773151,18.5175994],[-72.2723454,18.5175246],[-72.2662714,18.5144578],[-72.2665869,18.5066783],[-72.2692643,18.5046154],[-72.2661965,18.5029756],[-72.2688181,18.4965222],[-72.2691528,18.4959403],[-72.2702684,18.4961519],[-72.2702684,18.4955964],[-72.2690691,18.49557],[-72.2692922,18.4937714],[-72.2736988,18.4859951],[-72.2746749,18.4850429],[-72.2751769,18.483403],[-72.2765435,18.4813398],[-72.2773523,18.4814985],[-72.2783006,18.4809694],[-72.2778544,18.4807049],[-72.2771013,18.480123],[-72.2789978,18.4775836],[-72.279723,18.4772927],[-72.2806433,18.4776365],[-72.2813685,18.4771604],[-72.2808386,18.4769752],[-72.2812848,18.4758378],[-72.2823167,18.4751765],[-72.2851615,18.4750971],[-72.2849941,18.4763668],[-72.2854404,18.4769752],[-72.286277,18.4756262],[-72.2869325,18.4754675],[-72.2865978,18.4751897],[-72.2865978,18.4750046],[-72.2909765,18.4747268],[-72.2946579,18.4749384],[-72.2973911,18.476843],[-72.2981405,18.477502]],[[-72.3466657,18.5222375],[-72.346833,18.5244325],[-72.3475303,18.5277645],[-72.3455501,18.5291131],[-72.3403069,18.5292189],[-72.3383267,18.5280289],[-72.3369043,18.530118],[-72.3338086,18.5296684],[-72.3289279,18.5270769],[-72.328649,18.5253316],[-72.3292068,18.5232689],[-72.330406,18.5220524],[-72.3321631,18.5221847],[-72.3322467,18.5191963],[-72.3369183,18.5183633],[-72.3382012,18.5184691],[-72.3381454,18.5181782],[-72.3411993,18.5177947],[-72.3454943,18.5171997],[-72.3492595,18.517279],[-72.3504308,18.5188922],[-72.3503472,18.5206112],[-72.3496778,18.5220392],[-72.3466657,18.5222375]],[[-72.3303078,18.5486462],[-72.3429687,18.5508149],[-72.3433236,18.5530585],[-72.3413121,18.5614341],[-72.3390639,18.5613593],[-72.3384723,18.5638271],[-72.3375257,18.5654348],[-72.3348436,18.5650609],[-72.3311755,18.5638271],[-72.3312149,18.5616211],[-72.3232082,18.5606863],[-72.3212361,18.559602],[-72.3208023,18.5587046],[-72.3208811,18.557882],[-72.3259493,18.5580274],[-72.3266186,18.5581993],[-72.3259214,18.5577498],[-72.3250986,18.5573797],[-72.3233767,18.552263],[-72.3245994,18.5478507],[-72.3288986,18.5483742],[-72.329979,18.5489548],[-72.3303078,18.5486462]],[[-72.3231383,18.5269828],[-72.3223434,18.528067],[-72.3209629,18.5279745],[-72.3207816,18.5271282],[-72.3208513,18.5253697],[-72.3214649,18.5249598],[-72.3225666,18.5248937],[-72.3228454,18.52533],[-72.3232359,18.5264804],[-72.3231383,18.5269828]],[[-72.2160832,18.6457752],[-72.2159649,18.6553795],[-72.2030279,18.6558279],[-72.1947057,18.6553421],[-72.1922208,18.6545573],[-72.1920631,18.6521283],[-72.193483,18.6477559],[-72.201253,18.6385249],[-72.2069327,18.6388239],[-72.2120996,18.6424117],[-72.2118068,18.6430591],[-72.2121693,18.6426892],[-72.2127968,18.6427552],[-72.2134662,18.6431252],[-72.2135638,18.6437462],[-72.2154176,18.6443947],[-72.2158909,18.6450301],[-72.2160832,18.6457752]],[[-72.2867654,18.6482017],[-72.2900977,18.6527446],[-72.28981,18.6536532],[-72.2900738,18.6542664],[-72.290721,18.6537667],[-72.2910327,18.6544709],[-72.2912485,18.654221],[-72.29168,18.6558905],[-72.2912245,18.656606],[-72.2922673,18.65597],[-72.2926869,18.6567536],[-72.2930705,18.6567309],[-72.2941253,18.6581846],[-72.2960192,18.6608421],[-72.2959713,18.6619096],[-72.2932862,18.664567],[-72.2906731,18.6659979],[-72.2895943,18.6661342],[-72.2895943,18.6665657],[-72.2877004,18.6664749],[-72.2875805,18.6676559],[-72.2831214,18.6697227],[-72.2796453,18.6696546],[-72.2784311,18.6690787],[-72.2783972,18.6687736],[-72.277736,18.6691671],[-72.2774394,18.669143],[-72.2770071,18.6683159],[-72.2765575,18.6681125],[-72.2765385,18.6680583],[-72.2752319,18.6685239],[-72.2749292,18.6674649],[-72.2746416,18.6674309],[-72.2734668,18.6682145],[-72.2732271,18.6682712],[-72.2726757,18.6671583],[-72.2719147,18.6674288],[-72.2718808,18.6673405],[-72.2688149,18.6681868],[-72.2688269,18.6671761],[-72.2690786,18.6668241],[-72.2688149,18.66679],[-72.2681077,18.6670739],[-72.2676282,18.6673805],[-72.2675563,18.6666878],[-72.266861,18.666949],[-72.2655904,18.6673578],[-72.2654466,18.6670058],[-72.2647514,18.6674146],[-72.2629893,18.6681868],[-72.2628455,18.6681754],[-72.2626537,18.6676076],[-72.2623001,18.6677098],[-72.2624799,18.6679199],[-72.2624799,18.6682322],[-72.262306,18.6682606],[-72.2620963,18.6679654],[-72.2622761,18.6689193],[-72.2601484,18.6688966],[-72.2542749,18.6687944],[-72.2505388,18.6683476],[-72.2504371,18.669536],[-72.2477926,18.6698893],[-72.2415204,18.669793],[-72.2414187,18.6741933],[-72.2389167,18.6739759],[-72.2387249,18.6734649],[-72.2383653,18.6733059],[-72.2387009,18.6739532],[-72.2375502,18.6738964],[-72.2374183,18.6735103],[-72.237742,18.67334],[-72.2375142,18.6732605],[-72.236843,18.6734876],[-72.2364354,18.6724088],[-72.2355124,18.6726019],[-72.2354045,18.6724202],[-72.2353027,18.6729028],[-72.2345475,18.6726871],[-72.2343077,18.6724599],[-72.2342358,18.6734706],[-72.2334087,18.6734592],[-72.2332889,18.6733003],[-72.2327375,18.6732889],[-72.2327135,18.6735047],[-72.227703,18.6725281],[-72.2265283,18.6716537],[-72.226804,18.6715742],[-72.2274993,18.6715855],[-72.2274873,18.6714493],[-72.2272899,18.6714623],[-72.2272814,18.6712977],[-72.2272094,18.671358],[-72.2261785,18.6713693],[-72.2256032,18.670881],[-72.2255073,18.6694502],[-72.2261066,18.6696886],[-72.2261785,18.6695949],[-72.2259837,18.6695495],[-72.225777,18.6691379],[-72.2253335,18.6694643],[-72.2249739,18.66947],[-72.2245783,18.6678802],[-72.2235525,18.6677046],[-72.2235907,18.6675921],[-72.2224634,18.6676283],[-72.2223659,18.667022],[-72.2223277,18.6670943],[-72.2219209,18.667026],[-72.2208105,18.6669015],[-72.220809,18.6665325],[-72.2208705,18.6663593],[-72.2206023,18.6668107],[-72.2203895,18.6666361],[-72.2184341,18.6650535],[-72.21829,18.6640979],[-72.2183493,18.6608376],[-72.2187223,18.6606541],[-72.2186894,18.660603],[-72.2187253,18.6604525],[-72.2189771,18.6603247],[-72.2187823,18.6601998],[-72.2186984,18.6602367],[-72.2185815,18.6600352],[-72.2186085,18.6600039],[-72.2187823,18.6601345],[-72.218995,18.6600181],[-72.2189111,18.6599131],[-72.2189681,18.6597938],[-72.2183807,18.6595837],[-72.2184728,18.6539662],[-72.2201001,18.6511554],[-72.225796,18.6469472],[-72.2283048,18.6457265],[-72.2379335,18.645855],[-72.237764,18.6446985],[-72.2400355,18.6432529],[-72.2455958,18.6433493],[-72.2482742,18.6450358],[-72.2487488,18.6436705],[-72.2511067,18.6429775],[-72.2512385,18.6433409],[-72.2512625,18.6431592],[-72.2514843,18.6431365],[-72.2513284,18.6429718],[-72.2533602,18.6423471],[-72.253516,18.6426765],[-72.2539535,18.6425402],[-72.2541453,18.642932],[-72.2543851,18.6428696],[-72.2543791,18.6427503],[-72.2564168,18.6423244],[-72.2566925,18.6431365],[-72.2568783,18.6428582],[-72.2568184,18.6425288],[-72.258843,18.6420991],[-72.258885,18.6422467],[-72.2592626,18.6422297],[-72.2596461,18.6424057],[-72.2592206,18.6406907],[-72.2599545,18.6404815],[-72.2601156,18.6406341],[-72.2601156,18.6399393],[-72.2615268,18.6394669],[-72.2626056,18.6391034],[-72.2654465,18.6387286],[-72.2719433,18.6386832],[-72.272201,18.6388649],[-72.2730341,18.6394158],[-72.273166,18.6412558],[-72.2738732,18.6410286],[-72.2742208,18.6416079],[-72.2752187,18.6416987],[-72.2754524,18.6415738],[-72.2755513,18.6416874],[-72.2755394,18.6417527],[-72.2764713,18.6418634],[-72.276753,18.6418975],[-72.2762953,18.6426002],[-72.2774226,18.6429978],[-72.277982,18.6427247],[-72.2785796,18.6431303],[-72.2785669,18.6432307],[-72.2789017,18.6433471],[-72.279851,18.6439655],[-72.2858703,18.6469651],[-72.2867654,18.6482017]],[[-72.5557247,18.5305893],[-72.5555866,18.5367036],[-72.554995,18.537975],[-72.5488026,18.537919],[-72.5486646,18.5372832],[-72.548842,18.5306267],[-72.5493745,18.5301031],[-72.555133,18.5301218],[-72.5557247,18.5305893]],[[-72.6235278,18.5079877],[-72.6234441,18.5095217],[-72.6226074,18.5104341],[-72.6204878,18.511849],[-72.6183403,18.5107514],[-72.6162207,18.5083183],[-72.6162625,18.506467],[-72.618661,18.5044438],[-72.6204041,18.5044967],[-72.6228305,18.506996],[-72.6235278,18.5079877]]]},{"id":"osmim-imagicode-S2A_R119_N09_20160327T050917","name":"imagico.de: Adams Bridge","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R119_N09_20160327T050917&z={zoom}&x={x}&y={-y}","endDate":"2016-03-27T00:00:00.000Z","startDate":"2016-03-27T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[79.01779174804685,8.827572266651268],[79.01401519775389,9.64678471986339],[80.17642021179198,9.650423231331946],[80.17727851867674,8.831304063493132],[79.01779174804685,8.827572266651268]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Supplementing incomplete coverage in other sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80700162014211LGN00","name":"imagico.de: Alaska Range","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80700162014211LGN00&z={zoom}&x={x}&y={-y}","endDate":"2014-07-31T00:00:00.000Z","startDate":"2014-07-31T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[-152.70872943147867,62.30357443926811],[-152.70838610872474,62.58153176976553],[-152.00835101350992,63.54645538851267],[-148.99432055696695,63.53329945446586],[-148.99432055696695,62.30357443926811],[-152.70872943147867,62.30357443926811]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent summer image of the Alaska Range for mapping natural features (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-aral2","name":"imagico.de: Aral Sea (high water level)","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=aral2&z={zoom}&x={x}&y={-y}","endDate":"2016-03-03T00:00:00.000Z","startDate":"2016-03-03T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[58.049,43.2623],[58.049,46.7189],[58.1014,46.8645],[61.5524,46.8629],[61.5524,46.3896],[61.4675,45.3416],[60.6317,43.2623],[58.049,43.2623]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Water and wetland extents, dams etc. - some remaining winter ice in the north (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-aral1","name":"imagico.de: Aral Sea (low water level)","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=aral1&z={zoom}&x={x}&y={-y}","endDate":"2016-09-09T00:00:00.000Z","startDate":"2016-09-09T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[58.049,43.2623],[58.049,46.7334],[58.096,46.8645],[61.5524,46.8629],[61.5524,46.3896],[61.4685,45.3544],[60.6267,43.2623],[58.049,43.2623]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Water and wetland extents, dams etc. (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R067_S40_20170417T140051","name":"imagico.de: Bahía Blanca (high tide)","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R067_S40_20170417T140051&z={zoom}&x={x}&y={-y}","endDate":"2017-04-17T00:00:00.000Z","startDate":"2017-04-17T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-62.9988,-40.7327],[-62.9988,-37.9476],[-61.7505,-37.9474],[-61.7501,-40.7322],[-62.9988,-40.7327]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Tidal flats and islands at the coast (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R067_S40_20170127T140051","name":"imagico.de: Bahía Blanca (low tide)","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R067_S40_20170127T140051&z={zoom}&x={x}&y={-y}","endDate":"2017-01-27T00:00:00.000Z","startDate":"2017-01-27T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-62.9988,-40.7327],[-62.9988,-37.9476],[-61.7505,-37.9474],[-61.7501,-40.7322],[-62.9988,-40.7327]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Tidal flats and islands at the coast (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81190582014075LGN00","name":"imagico.de: Bakun Reservoir","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81190582014075LGN00&z={zoom}&x={x}&y={-y}","endDate":"2014-03-16T00:00:00.000Z","startDate":"2014-03-16T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[114.35999506049737,2.028456548619032],[113.5344754987298,2.030000532161949],[113.53619211249934,3.070767124420059],[114.76511591010677,3.067510236472651],[114.76254098945248,2.088156161702156],[114.35999506049737,2.028456548619032]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in older pre-2011 images (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81250592016107LGN00","name":"imagico.de: Batam","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81250592016107LGN00&z={zoom}&x={x}&y={-y}","endDate":"2016-01-01T00:00:00.000Z","startDate":"2014-01-01T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[104.00154570197358,-0.000078769115171],[104.00137404059662,1.45099139170518],[104.91014937018647,1.451162998032411],[104.91014937018647,-0.000078769115171],[104.00154570197358,-0.000078769115171]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing Islands in OSM (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80770232017156LGN00","name":"imagico.de: Bogoslof Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80770232017156LGN00&z={zoom}&x={x}&y={-y}","endDate":"2017-06-05T00:00:00.000Z","startDate":"2017-06-05T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-168.2544,53.8749],[-168.2544,54.0213],[-167.8591,54.0213],[-167.8591,53.8749],[-168.2544,53.8749]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent image from after the eruption (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81800982013291LGN00","name":"imagico.de: Bouvet Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81800982013291LGN00&z={zoom}&x={x}&y={-y}","endDate":"2013-10-18T00:00:00.000Z","startDate":"2013-10-18T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[3.246529403113632,-54.47046993167111],[3.246529403113632,-54.375391687979096],[3.463852706336288,-54.375391687979096],[3.463852706336288,-54.47046993167111],[3.246529403113632,-54.47046993167111]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","best":true,"description":"For more accurate coastline and glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R017_S67_20170223T022551","name":"imagico.de: Bunger Hills","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R017_S67_20170223T022551&z={zoom}&x={x}&y={-y}","endDate":"2017-02-23T00:00:00.000Z","startDate":"2017-02-23T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[96.1197,-67.6542],[96.1201,-67.1899],[98.7331,-65.044],[105.1028,-65.044],[105.1028,-65.7224],[103.3017,-67.6542],[96.1197,-67.6542]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Largest ice free area at the East Antarctic coast - shows considerable amounts of non-permanent ice. (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R065_N47_20160929T102022","name":"imagico.de: Central Alps in late September 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R065_N47_20160929T102022&z={zoom}&x={x}&y={-y}","endDate":"2016-09-29T00:00:00.000Z","startDate":"2016-09-29T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[10.559062957763668,45.95484945195885],[7.473964691162107,45.95532682303484],[7.555847167968747,46.27080015119853],[8.05469512939453,47.66469371011084],[11.752452850341793,47.664809318453564],[11.752452850341793,46.813336457338615],[11.38423919677734,45.955088138010865],[10.559062957763668,45.95484945195885]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date image for glacier mapping - beware of some fresh snow at higher altitudes (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82050982015344LGN00","name":"imagico.de: Clerke Rocks","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82050982015344LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-12-10T00:00:00.000Z","startDate":"2015-12-10T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-34.17701089820909,-55.29692751183208],[-35.19599283180284,-55.282851769908206],[-35.16663873634385,-54.7209735214882],[-34.12516916236925,-54.73465315976587],[-34.14010370216417,-55.29692751183208],[-34.17701089820909,-55.29692751183208]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R086_N60_20160831T213532","name":"imagico.de: Cook Inlet","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R086_N60_20160831T213532&z={zoom}&x={x}&y={-y}","endDate":"2016-08-31T00:00:00.000Z","startDate":"2016-08-31T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-154.5102,59.4577],[-154.5097,60.6888],[-153.5403,62.1718],[-148.0423,62.1718],[-148.0445,61.5342],[-149.7291,59.4584],[-154.5102,59.4577]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Tidal flats and glaciers in surrounding mountains (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-EO1A0040712016264110KF","name":"imagico.de: Coropuna","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=EO1A0040712016264110KF&z={zoom}&x={x}&y={-y}","endDate":"2016-09-21T00:00:00.000Z","startDate":"2016-09-21T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-72.7594470977783,-15.68684010813036],[-72.7594470977783,-15.49570157136026],[-72.74434089660643,-15.426295586903299],[-72.41286277770995,-15.426295586903299],[-72.41286277770995,-15.652957427428944],[-72.42410659790038,-15.686674840407827],[-72.7594470977783,-15.68684010813036]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date image for glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R022_N06_20151221T103009","name":"imagico.de: Cotonou","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R022_N06_20151221T103009&z={zoom}&x={x}&y={-y}","endDate":"2015-12-21T00:00:00.000Z","startDate":"2015-12-21T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[1.839749701876779,6.257803795151386],[1.839749701876779,7.114271792431897],[2.549397834200998,7.114271792431897],[2.549397834200998,6.489052510574106],[2.497813590426584,6.258059752887941],[1.839749701876779,6.257803795151386]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Patchy and partly cloudy coverage in usual sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R040_N01_20160311T164128","name":"imagico.de: Darwin and Wolf islands, Galapagos","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R040_N01_20160311T164128&z={zoom}&x={x}&y={-y}","endDate":"2016-03-11T00:00:00.000Z","startDate":"2016-03-11T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-92.05216379429558,1.321295617717369],[-92.05216379429558,1.72181118585353],[-91.74849481846549,1.72181118585353],[-91.74849481846549,1.321295617717369],[-92.05216379429558,1.321295617717369]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent image, only old and poor images in other sources currently (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80360072014245LGN00","name":"imagico.de: Eastern Devon Island coast","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80360072014245LGN00&z={zoom}&x={x}&y={-y}","endDate":"2014-09-02T00:00:00.000Z","startDate":"2014-09-02T00:00:00.000Z","scaleExtent":[0,11],"polygon":[[[-84.34798733886554,74.38945823827667],[-84.34798733886554,75.89030323920836],[-79.14870755370929,75.89030323920836],[-79.14870755370929,74.38945823827667],[-84.34798733886554,74.38945823827667]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Coastline mostly mapped meanwhile (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82160152013239LGN00","name":"imagico.de: Eastern Iceland","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82160152013239LGN00&z={zoom}&x={x}&y={-y}","endDate":"2013-08-27T00:00:00.000Z","startDate":"2013-08-27T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[-13.047005598725303,64.2110895294821],[-15.164963667572959,64.22408122727819],[-15.168053572358117,64.81572800422087],[-13.043572371186242,64.80359943673454],[-13.047005598725303,64.2110895294821]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing islets and inaccurate coast (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-AST_L1T_00302052007154424_20150518041444_91492","name":"imagico.de: El Altar","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=AST_L1T_00302052007154424_20150518041444_91492&z={zoom}&x={x}&y={-y}","endDate":"2012-02-05T00:00:00.000Z","startDate":"2012-02-05T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-78.531997745432,-1.805085317123331],[-78.531997745432,-1.608105565001241],[-78.33561713019762,-1.608105565001241],[-78.33561713019762,-1.805085317123331],[-78.531997745432,-1.805085317123331]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"2007 ASTER image offering better glacier coverage than common sources (true color with estimated blue)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R009_S61_20160109","name":"imagico.de: Elephant Island/Clarence Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R009_S61_20160109&z={zoom}&x={x}&y={-y}","endDate":"2016-01-09T00:00:00.000Z","startDate":"2016-01-09T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-56.13476090727487,-61.63471600102006],[-56.13476090727487,-61.199363166283845],[-55.83263688383738,-60.84015069906498],[-53.72343354521433,-60.83981613078141],[-53.72343354521433,-61.63471600102006],[-56.13476090727487,-61.63471600102006]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Fairly clear up-to-date image for updating glacier edges (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-enderby","name":"imagico.de: Enderby Land and Kemp Coast","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=enderby&z={zoom}&x={x}&y={-y}","endDate":"2017-03-27T00:00:00.000Z","startDate":"2017-01-25T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[45.4547,-68.5091],[45.4547,-67.5724],[49.7155,-65.7176],[59.2693,-65.7176],[67.3735,-67.3449],[67.3735,-68.2581],[67.088,-68.5091],[45.4547,-68.5091]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Sentinel-2 images of Enderby Land and Kemp Coast (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82100502015347LGN00","name":"imagico.de: Fogo, Cape Verde","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82100502015347LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-12-13T00:00:00.000Z","startDate":"2015-12-13T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-24.758781955967567,14.748140156641956],[-24.758781955967567,15.092493544965103],[-24.267057941685337,15.092493544965103],[-24.267057941685337,14.748140156641956],[-24.758781955967567,14.748140156641956]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Image from after the 2014/2015 eruption (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-greenland","name":"imagico.de: Greenland mosaic","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=greenland&z={zoom}&x={x}&y={-y}","endDate":"2015-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[-43.9774,59.7171],[-44.545,59.7302],[-44.9203,59.7672],[-45.3587,59.8218],[-45.763,59.8848],[-46.0859,59.9827],[-46.3381,60.119],[-46.577,60.2652],[-46.8114,60.4418],[-47.2635,60.5314],[-47.6937,60.5549],[-48.1457,60.6192],[-48.5771,60.7015],[-48.8689,60.8506],[-49.0578,61.0555],[-49.396,61.2957],[-49.7601,61.4934],[-50.2064,61.7324],[-50.4699,61.9539],[-50.8647,62.1596],[-51.0631,62.3869],[-51.2121,62.6001],[-51.3005,62.8389],[-51.4238,62.9979],[-51.6767,63.1944],[-51.9465,63.4079],[-52.0253,63.6377],[-52.2255,63.8378],[-52.3658,64.0705],[-52.4829,64.3792],[-52.4988,64.6788],[-52.789,64.9063],[-53.2046,65.1321],[-53.6649,65.4753],[-53.9977,65.8019],[-54.1348,66.1568],[-54.1441,66.5235],[-54.2285,66.8319],[-54.4519,67.303],[-54.5141,67.7648],[-54.604,68.2021],[-54.568,68.5698],[-54.598,68.8347],[-54.7606,69.1207],[-55.0028,69.4125],[-55.2735,69.6187],[-55.3808,69.8283],[-55.3945,70.0838],[-55.3094,70.2573],[-55.4307,70.479],[-55.5501,70.6707],[-55.7654,70.861],[-56.2489,71.2343],[-56.5018,71.5429],[-56.5867,71.9015],[-56.5189,72.2355],[-56.5085,72.5258],[-56.8923,72.8144],[-57.4027,73.1054],[-57.8066,73.4566],[-58.1461,73.7696],[-58.3554,74.0972],[-58.5125,74.3783],[-58.7336,74.6328],[-59.3551,74.8869],[-60.1412,75.102],[-61.0067,75.2763],[-61.911,75.3886],[-62.4706,75.5595],[-62.9776,75.7454],[-64.1463,75.779],[-65.4481,75.7235],[-66.7068,75.6792],[-67.8379,75.6525],[-69.0456,75.6195],[-70.055,75.5344],[-71.0898,75.4705],[-72.1119,75.4476],[-74.2311,76.4102],[-74.5601,76.5328],[-74.5601,82.6959],[-14.4462,82.6959],[-14.3994,82.5997],[-13.5339,82.4379],[-12.0312,82.3426],[-10.7796,82.3196],[-10.7796,80.1902],[-11.2123,80.069],[-11.136,79.8103],[-10.7796,79.5176],[-10.7796,79.0441],[-11.2626,78.7128],[-12.2579,78.3558],[-13.2398,78.1272],[-13.7649,77.9279],[-14.1169,77.6779],[-14.7129,77.5278],[-15.5507,77.3655],[-16.0936,77.0771],[-16.0586,76.5548],[-15.838,75.9611],[-15.6879,75.4726],[-16.253,75.058],[-17.0427,74.6425],[-18.3155,74.2702],[-19.4463,73.9378],[-19.8329,73.632],[-20.2938,73.3524],[-20.7831,73.0446],[-21.01,72.6766],[-20.8774,72.2926],[-20.7672,71.8726],[-20.7765,71.4304],[-20.9411,70.9802],[-21.219,70.6126],[-21.5326,70.3001],[-21.8039,70.0911],[-22.166,69.8947],[-22.4831,69.7539],[-22.9027,69.6585],[-23.3545,69.544],[-23.9177,69.4036],[-24.1794,69.3088],[-24.6745,69.1084],[-25.1222,68.9555],[-25.6659,68.7995],[-26.0994,68.583],[-26.6316,68.4043],[-27.7638,68.2813],[-28.4575,68.0023],[-29.353,67.8135],[-30.6456,67.4911],[-31.7673,67.0005],[-32.9783,66.2596],[-33.9313,66.0156],[-34.8956,65.7403],[-35.5914,65.5208],[-36.1483,65.372],[-36.7532,65.2559],[-37.1858,65.1349],[-37.6032,64.9727],[-38.0624,64.4901],[-38.5304,64.1244],[-39.0545,63.7213],[-39.3131,63.4405],[-39.5739,62.7506],[-39.9532,62.2739],[-40.2757,61.8547],[-40.714,61.3365],[-41.2091,60.8495],[-41.821,60.5526],[-42.4368,60.3264],[-42.8643,60.0299],[-43.1131,59.9147],[-43.3282,59.83],[-43.5459,59.7695],[-43.797,59.7284],[-43.9774,59.7171]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Landsat mosaic of Greenland (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R047_S54_20160411T044330","name":"imagico.de: Heard Island coast","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R047_S54_20160411T044330&z={zoom}&x={x}&y={-y}","endDate":"2016-04-12T00:00:00.000Z","startDate":"2016-04-12T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[73.06896521028185,-53.270590689700434],[73.06896521028185,-52.875489636268725],[73.67338491853381,-52.87673289134188],[74.08863378938341,-52.94950473139763],[74.08863378938341,-53.270590689700434],[73.06896521028185,-53.270590689700434]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent image of Heard island with interior mostly cloud covered but mostly well visible coast (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82280982013259LGN00","name":"imagico.de: Isla Londonderry","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82280982013259LGN00&z={zoom}&x={x}&y={-y}","endDate":"2013-09-16T00:00:00.000Z","startDate":"2013-09-16T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[-69.85679747431641,-55.55949231551995],[-72.26520659296875,-55.149427383391455],[-72.26520659296875,-54.51089432315929],[-72.08530546992188,-54.17909103768387],[-69.49115874140625,-54.17889010631196],[-69.49150206416016,-55.28378528847367],[-69.62230803339844,-55.55910398108892],[-69.85679747431641,-55.55949231551995]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"A lot of very coarse coastlines could be improved here, much snow cover though so no use for glacier mapping (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_kangerlussuaq_20151008","name":"imagico.de: Kangerlussuaq Autumn","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=dms_kangerlussuaq_20151008&z={zoom}&x={x}&y={-y}","endDate":"2015-10-08T00:00:00.000Z","startDate":"2015-10-08T00:00:00.000Z","scaleExtent":[0,17],"polygon":[[[-50.6992,66.9888],[-50.721,67.0017],[-50.7341,67.0125],[-50.7396,67.0193],[-50.7396,67.0212],[-50.7158,67.0265],[-50.7017,67.0265],[-50.6829,67.0176],[-50.6686,67.0077],[-50.6638,66.998],[-50.6642,66.9946],[-50.6891,66.9888],[-50.6992,66.9888]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS image of the airport and settlement - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_kangerlussuaq_20160518","name":"imagico.de: Kangerlussuaq Spring","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=dms_kangerlussuaq_20160518&z={zoom}&x={x}&y={-y}","endDate":"2016-05-18T00:00:00.000Z","startDate":"2016-05-18T00:00:00.000Z","scaleExtent":[0,18],"polygon":[[[-50.7519,66.9996],[-50.7555,67.0023],[-50.7555,67.0033],[-50.6395,67.0297],[-50.6162,67.0339],[-50.6097,67.0281],[-50.6331,67.022],[-50.7323,66.9996],[-50.7519,66.9996]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS image of the airport and roads - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R021_N44_20160807T083013","name":"imagico.de: Kerch Strait","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R021_N44_20160807T083013&z={zoom}&x={x}&y={-y}","endDate":"2016-08-07T00:00:00.000Z","startDate":"2016-08-07T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[35.932588577270494,44.96236872935039],[35.932588577270494,45.559256426515695],[37.369909286499016,45.559256426515695],[37.369909286499016,44.96236872935039],[35.932588577270494,44.96236872935039]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"State of bridge construction in August 2016 (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ls_polar2","name":"imagico.de: Landsat off-nadir July 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=ls_polar2&z={zoom}&x={x}&y={-y}","endDate":"2016-07-17T00:00:00.000Z","startDate":"2016-07-17T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-79.05174500251786,81.91484289044183],[-79.05174500251786,83.43338556749623],[-73.60389956385866,83.80224987787145],[-26.424486898081835,83.80224987787145],[-21.492998879371186,83.50352415480617],[-16.888354121159868,83.15094632775453],[-16.888354121159868,81.91484289044183],[-79.05174500251786,81.91484289044183]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Latest images north of the regular Landsat limit (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-larsen_2018","name":"imagico.de: Larsen C ice shelf after calving","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=larsen_2018&z={zoom}&x={x}&y={-y}","endDate":"2018-01-06T00:00:00.000Z","startDate":"2018-01-06T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[-62.7282,-68.9652],[-64.0489,-68.7318],[-64.0486,-68.5373],[-60.8845,-65.9399],[-59.9187,-65.9389],[-59.1088,-66.0775],[-59.1088,-68.8359],[-59.2544,-68.9652],[-62.7282,-68.9652]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"For updating the ice edge after the 2017 iceberg calving (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-AST_L1T_00311162013112731_20150618142416_109190","name":"imagico.de: Leskov Island ASTER","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=AST_L1T_00311162013112731_20150618142416_109190&z={zoom}&x={x}&y={-y}","endDate":"2013-11-16T00:00:00.000Z","startDate":"2013-11-16T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-28.210747081406492,-56.72108048139938],[-28.210747081406492,-56.624975043089115],[-27.96956284678735,-56.624975043089115],[-27.96956284678735,-56.72108048139938],[-28.210747081406492,-56.72108048139938]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color with estimated blue)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81991002015286LGN00","name":"imagico.de: Leskov Island Landsat","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81991002015286LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-10-13T00:00:00.000Z","startDate":"2015-10-13T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-27.992928409215843,-56.73479060902333],[-28.227761172887714,-56.732624892496354],[-28.2241562839717,-56.600752537318456],[-27.969754123327167,-56.60283135691063],[-27.97318735086623,-56.73479060902333],[-27.992928409215843,-56.73479060902333]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ls_polar","name":"imagico.de: May 2013 off-nadir Landsat","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=ls_polar&z={zoom}&x={x}&y={-y}","endDate":"2013-05-17T00:00:00.000Z","startDate":"2013-05-17T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-85.76109385682587,81.39333391115835],[-89.83015512094161,82.14951616258433],[-89.83152841195212,82.24404688557661],[-84.99342418195555,82.73098798225534],[-79.95207288240479,83.13107965605444],[-74.55641250214465,83.46266728201661],[-69.35850602739671,83.70450775086888],[-28.207840897721187,83.70450775086888],[-23.06623935440381,83.46532469372944],[-17.96583654140148,83.15518123848051],[-17.96720983241198,82.72386035102944],[-22.781968115230015,81.44190408358111],[-85.76109385682587,81.39333391115835]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"First available image north of the regular Landsat limit, mostly with seasonal snow cover so difficult to interpret (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R042_S78_20170214T202521","name":"imagico.de: McMurdo Sound and Dry Valleys","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R042_S78_20170214T202521&z={zoom}&x={x}&y={-y}","endDate":"2017-02-14T00:00:00.000Z","startDate":"2017-02-14T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[162.9125,-78.4514],[162.6595,-78.4257],[159.2712,-77.6013],[159.2712,-77.4108],[164.157,-76.477],[169.7813,-76.4764],[169.7813,-78.4514],[162.9125,-78.4514]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date late season image - not ice minimum, be careful with distinguishing sea ice from ice shelves. (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R092_S02_20160613T075613","name":"imagico.de: Mount Kenya 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R092_S02_20160613T075613&z={zoom}&x={x}&y={-y}","endDate":"2016-06-13T00:00:00.000Z","startDate":"2016-06-13T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[37.20665931701659,-0.266846645776291],[37.20665931701659,-0.011930465612033],[37.5655174255371,-0.011930465612033],[37.5655174255371,-0.266846645776291],[37.20665931701659,-0.266846645776291]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date image for glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R092_S05_20160802T075556","name":"imagico.de: Mount Kilimanjaro 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R092_S05_20160802T075556&z={zoom}&x={x}&y={-y}","endDate":"2016-08-02T00:00:00.000Z","startDate":"2016-08-02T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[37.24768638610839,-3.229213650135676],[37.24768638610839,-2.968155849006605],[37.61581420898436,-2.968155849006605],[37.61581420898436,-3.229213650135676],[37.24768638610839,-3.229213650135676]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date image for glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80940622015159LGN00","name":"imagico.de: New Ireland","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80940622015159LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-06-08T00:00:00.000Z","startDate":"2015-06-08T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[150.38853376619625,-2.800534349432724],[150.38853376619625,-2.383396178206425],[150.83348005525875,-2.383396178206425],[150.83348005525875,-2.800534349432724],[150.38853376619625,-2.800534349432724]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Many missing islands in OSM (mostly mapped meanwhile) (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-northsea_s2_2016","name":"imagico.de: North Sea Coast 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2016&z={zoom}&x={x}&y={-y}","endDate":"2016-09-25T00:00:00.000Z","startDate":"2016-09-25T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[5.1562,52.8755],[5.1615,53.0325],[6.4155,55.7379],[9.8813,55.7459],[9.8813,53.2428],[9.6846,52.8877],[5.1562,52.8755]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-northsea_s2_2017","name":"imagico.de: North Sea Coast 2017","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2017&z={zoom}&x={x}&y={-y}","endDate":"2017-06-02T00:00:00.000Z","startDate":"2017-06-02T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[5.1713,53.0918],[6.477,55.8973],[9.8813,55.8973],[9.8813,53.2761],[9.7789,53.0918],[5.1713,53.0918]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ural_s2_2016","name":"imagico.de: Northern and Polar Ural mountains August 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=ural_s2_2016&z={zoom}&x={x}&y={-y}","endDate":"2016-08-12T00:00:00.000Z","startDate":"2016-08-12T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[59.198977223476454,64.8920468958533],[59.198977223476454,66.91656046303187],[60.733286610683486,68.44289182710118],[67.7329509173241,68.44327026354412],[67.7329509173241,67.748828729217],[64.21646761043934,64.9195663902952],[59.198977223476454,64.8920468958533]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date late summer imagery with few clouds - caution: not all visible snow is glaciers (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ndvina","name":"imagico.de: Northern Dvina delta at low tide","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=ndvina&z={zoom}&x={x}&y={-y}","endDate":"2015-09-13T00:00:00.000Z","startDate":"2015-09-13T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[37.7291,64.1971],[37.7291,65.1161],[37.8592,65.2705],[41.3223,65.2705],[41.3223,64.3142],[41.2114,64.1973],[37.7291,64.1971]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Beaches, tidal flats and other costal forms (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-nellesmere_ast","name":"imagico.de: Northern Ellesmere Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=nellesmere_ast&z={zoom}&x={x}&y={-y}","endDate":"2012-07-09T00:00:00.000Z","startDate":"2012-07-09T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-81.62923243782096,82.45969864814401],[-83.03136255954291,82.47985512217643],[-83.03136255954291,83.05876272004272],[-72.80309111332822,83.09567468670448],[-65.65785798568925,83.03232446260982],[-65.8116665788654,82.45969864814401],[-81.62923243782096,82.45969864814401]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Assembled from July 2012 ASTER imagery (true color with estimated blue)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-nellesmere_ast_2016","name":"imagico.de: Northern Ellesmere Island July 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=nellesmere_ast_2016&z={zoom}&x={x}&y={-y}","endDate":"2012-07-15T00:00:00.000Z","startDate":"2012-07-08T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-78.89729497133754,82.17577067162792],[-82.64500613899595,82.19425721404356],[-82.64500613899595,83.08067098163464],[-66.58986093522367,83.08497116318647],[-63.78010752773773,82.98907949583335],[-63.78010752773773,82.72198178031782],[-65.0092029821365,82.17577067162792],[-78.89729497133754,82.17577067162792]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Assembled from July 2016 ASTER imagery (true color with estimated blue)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81960222015233LGN00vis","name":"imagico.de: Northern German west coast tidalflats","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81960222015233LGN00vis&z={zoom}&x={x}&y={-y}","endDate":"2015-08-21T00:00:00.000Z","startDate":"2015-08-21T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[7.63567991501593,53.28027339774928],[7.63567991501593,53.66770140276793],[8.49433012253546,55.502457780526],[9.207754805152648,55.48106268908912],[9.207754805152648,53.28027339774928],[7.63567991501593,53.28027339774928]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81960222015233LGN00ir","name":"imagico.de: Northern German west coast tidalflats (infrared)","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81960222015233LGN00ir&z={zoom}&x={x}&y={-y}","endDate":"2015-08-21T00:00:00.000Z","startDate":"2015-08-21T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[7.63567991501593,53.28027339774928],[7.63567991501593,53.66810821588294],[8.49433012253546,55.502457780526],[9.207754805152648,55.48106268908912],[9.207754805152648,53.28027339774928],[7.63567991501593,53.28027339774928]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ngreenland_ast","name":"imagico.de: Northern Greenland ASTER","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=ngreenland_ast&z={zoom}&x={x}&y={-y}","endDate":"2012-08-13T00:00:00.000Z","startDate":"2005-06-21T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-52.49221819430999,82.48971755550389],[-52.49221819430999,82.94294978186194],[-49.28695697579964,83.47311821807558],[-44.52850362441216,83.7321400994933],[-29.525299334683975,83.7321400994933],[-25.263977329098022,83.58271128961059],[-21.183929736898254,83.39775984253468],[-21.183929736898254,82.74312310369845],[-23.404541300879075,82.48971755550389],[-52.49221819430999,82.48971755550389]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Assembled from mostly 2012 ASTER imagery, some 2005 images mainly in the northeast (true color with estimated blue)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-EO1A1350972013086110KF","name":"imagico.de: Northwest Heard Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=EO1A1350972013086110KF&z={zoom}&x={x}&y={-y}","endDate":"2013-03-13T00:00:00.000Z","startDate":"2013-03-13T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[73.22790413350113,-53.20333324999222],[73.22790413350113,-53.01072925838941],[73.2594898268605,-52.94943913810479],[73.78992348164566,-52.94943913810479],[73.78992348164566,-53.06048282358537],[73.71782570332533,-53.20333324999222],[73.22790413350113,-53.20333324999222]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Glaciers of Northwest Heard Island (mapped meanwhile) (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R111_N09_20160604T154554","name":"imagico.de: Panama Canal","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R111_N09_20160604T154554&z={zoom}&x={x}&y={-y}","endDate":"2016-06-07T00:00:00.000Z","startDate":"2016-06-07T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-80.01653561766223,8.848981570244637],[-80.01653561766223,9.41480707574399],[-79.46859250242785,9.41480707574399],[-79.46859250242785,8.848981570244637],[-80.01653561766223,8.848981570244637]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Images of the new locks (but partly cloudy) (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-EO1A0120532016364110KF","name":"imagico.de: Panama Canal - Pacific side","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=EO1A0120532016364110KF&z={zoom}&x={x}&y={-y}","endDate":"2016-12-30T00:00:00.000Z","startDate":"2016-12-30T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-79.62538719177245,8.770827350748924],[-79.68684196472167,8.821974500616129],[-79.6866703033447,8.93705081902936],[-79.65362548828124,9.0929436313527],[-79.268159866333,9.0929436313527],[-79.32832717895505,8.770827350748924],[-79.62538719177245,8.770827350748924]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"New locks with less clouds than in the Sentinel-2 image - make sure to check image alignment (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R078_N68_20160930T081002","name":"imagico.de: Pechora Sea Coast","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R078_N68_20160930T081002&z={zoom}&x={x}&y={-y}","endDate":"2016-09-30T00:00:00.000Z","startDate":"2016-09-30T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[53.1802,67.5344],[53.1821,68.414],[54.2107,69.3367],[55.3584,70.2786],[59.004,70.2786],[60.6947,69.977],[61.9837,69.7161],[61.9823,68.9395],[59.9153,67.5344],[53.1802,67.5344]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Sentinel-2 image of the Pechora Sea coast in autumn 2016 (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81511242016033LGN00","name":"imagico.de: Pensacola Mountains","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81511242016033LGN00&z={zoom}&x={x}&y={-y}","endDate":"2016-02-02T00:00:00.000Z","startDate":"2016-02-02T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-53.20921946177197,-84.12524693598144],[-60.615377881406225,-83.78609327915953],[-60.615377881406225,-82.29968785439104],[-48.72405102147429,-82.29987186164387],[-44.52178052933989,-82.43683433550413],[-44.51354078327688,-84.12524693598144],[-53.20921946177197,-84.12524693598144]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Outside regular Landsat coverage and therefore not in LIMA and Bing/Mapbox (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R136_N41_20150831T093006","name":"imagico.de: Prokletije Mountains","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R136_N41_20150831T093006&z={zoom}&x={x}&y={-y}","endDate":"2015-08-31T00:00:00.000Z","startDate":"2015-08-31T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[19.112325688609005,42.1531576323006],[19.08425905347717,43.08073531915633],[20.63298799634826,43.09602978090892],[20.637880345591427,42.167791043253985],[19.112325688609005,42.1531576323006]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Late summer imagery where usual sources are severely limited by clouds and snow (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-DMS_1142622_03746_20110415_17533956","name":"imagico.de: Qasigiannguit","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=DMS_1142622_03746_20110415_17533956&z={zoom}&x={x}&y={-y}","endDate":"2011-04-15T00:00:00.000Z","startDate":"2011-04-15T00:00:00.000Z","scaleExtent":[0,15],"polygon":[[[-51.238571767352376,68.79971882076842],[-51.243335370562825,68.85302612951142],[-51.151668195269856,68.85302612951142],[-51.14038145973519,68.80116208175376],[-51.238571767352376,68.79971882076842]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS image of the settlement - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81510432015030LGN00","name":"imagico.de: Rann of Kutch","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81510432015030LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[67.96839858817646,22.36264542957619],[67.86231185721942,22.38391650007107],[67.86231185721942,24.886930816927297],[71.48986007499286,24.886930816927297],[71.48986007499286,22.36264542957619],[67.96839858817646,22.36264542957619]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Land/water distinction difficult to properly map based on Bing/Mapbox images (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R093_N41_20150828T092005","name":"imagico.de: Rila and Pirin Mountains","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R093_N41_20150828T092005&z={zoom}&x={x}&y={-y}","endDate":"2015-08-28T00:00:00.000Z","startDate":"2015-08-28T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[23.808114560320394,41.584878805945024],[22.992379697039144,41.6019534981177],[23.011863263323328,42.29983747360261],[23.99402383156063,42.283393175568236],[23.965613873674886,41.584878805945024],[23.808114560320394,41.584878805945024]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Late summer imagery where usual sources are severely limited by clouds and snow (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81730602015040LGN00","name":"imagico.de: Rwenzori Mountains","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81730602015040LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-02-09T00:00:00.000Z","startDate":"2015-02-09T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[29.766296776846374,0.206886934953159],[29.766296776846374,0.509176367154027],[30.034603509024116,0.509176367154027],[30.034603509024116,0.206886934953159],[29.766296776846374,0.206886934953159]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent image of most of the remaining Rwenzori Mountains glaciers (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R078_N01_20160702T082522","name":"imagico.de: Rwenzori Mountains 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R078_N01_20160702T082522&z={zoom}&x={x}&y={-y}","endDate":"2016-07-02T00:00:00.000Z","startDate":"2016-07-02T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[29.8051357269287,0.235862065771959],[29.8051357269287,0.467085433008179],[30.02503395080565,0.467085433008179],[30.02503395080565,0.235862065771959],[29.8051357269287,0.235862065771959]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date image for glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80611072014036LGN00","name":"imagico.de: Scott Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80611072014036LGN00&z={zoom}&x={x}&y={-y}","endDate":"2014-02-05T00:00:00.000Z","startDate":"2014-02-05T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-180,-67.4263452007858],[-180,-67.32544337276457],[-179.8247337341308,-67.3253771978419],[-179.8247337341308,-67.4263452007858],[-180,-67.4263452007858]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82100972015347LGN00","name":"imagico.de: Shag Rocks","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82100972015347LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-12-13T00:00:00.000Z","startDate":"2015-12-13T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-42.12874872458635,-53.72050213468143],[-42.14625818503558,-53.45782244664258],[-41.67573435080706,-53.445862233424414],[-41.6558216310805,-53.70871763480476],[-42.12874872458635,-53.72050213468143]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81130622013270LGN00","name":"imagico.de: Southeastern Sulawesi","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81130622013270LGN00&z={zoom}&x={x}&y={-y}","endDate":"2013-09-27T00:00:00.000Z","startDate":"2013-09-27T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[120.84382442048364,-3.595452324350203],[120.84382442048364,-3.159848173206955],[120.98184016755395,-2.514681686347053],[122.62618449738794,-2.514681686347053],[122.62618449738794,-3.002148034113534],[122.5007000308352,-3.595452324350203],[120.84382442048364,-3.595452324350203]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing islands and coarse coastline due to cloud cover in Bing, lakes could also use additional detail (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80281222016035LGN00","name":"imagico.de: Southern Transantarctic Mountains","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80281222016035LGN00&z={zoom}&x={x}&y={-y}","endDate":"2016-02-04T00:00:00.000Z","startDate":"2016-02-04T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[156.96951345925345,-84.50097988272655],[154.50857596843485,-84.46255082580927],[154.50857596843485,-82.60681485793681],[175.46774337070775,-82.58504749645738],[177.00582930246938,-83.52806548607914],[177.00582930246938,-84.19262083779002],[171.93838547371908,-84.34632646581997],[166.83798266071676,-84.44370142483508],[161.67028858819987,-84.50045345467909],[156.96951345925345,-84.50097988272655]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Outside regular Landsat coverage and therefore not in LIMA and Bing/Mapbox (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81030632015286LGN00","name":"imagico.de: Sudirman Range 2015","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81030632015286LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-10-13T00:00:00.000Z","startDate":"2015-10-13T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[136.4226,-4.2853],[136.4226,-3.6447],[137.7971,-3.6447],[137.7971,-4.2853],[136.4226,-4.2853]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Older image of the Sudirman Range with no fresh snow showing glacier extent (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R088_S05_20160812T011732","name":"imagico.de: Sudirman Range 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R088_S05_20160812T011732&z={zoom}&x={x}&y={-y}","endDate":"2016-08-12T00:00:00.000Z","startDate":"2016-08-12T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[136.8044,-4.2585],[136.8044,-3.7836],[137.7701,-3.7836],[137.7701,-4.2585],[136.8044,-4.2585]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Cloud free image of the Sudirman Range but with fresh snow (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-s2sval","name":"imagico.de: Svalbard mosaic","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=s2sval&z={zoom}&x={x}&y={-y}","endDate":"2016-01-01T00:00:00.000Z","startDate":"2016-01-01T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[16.6108,76.4137],[16.4731,76.4268],[16.3788,76.4589],[14.4124,77.1324],[14.0784,77.2536],[10.9875,78.4054],[10.631,78.5605],[10.2314,78.8392],[10.3952,79.6074],[10.516,79.7731],[10.9632,79.8707],[20.2294,80.849],[20.4702,80.8493],[25.1752,80.6817],[33.4391,80.3438],[33.7809,80.3016],[34.0395,80.239],[33.977,80.1527],[25.5722,76.5917],[25.2739,76.481],[25.1416,76.4327],[24.937,76.4176],[16.6108,76.4137]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Sentinel-2 mosaic of Svalbard (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-DMS_1142636_160xx_20110507_1822xxxx","name":"imagico.de: Thule Air Base","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=DMS_1142636_160xx_20110507_1822xxxx&z={zoom}&x={x}&y={-y}","endDate":"2011-05-07T00:00:00.000Z","startDate":"2011-05-07T00:00:00.000Z","scaleExtent":[0,15],"polygon":[[[-68.93976917529807,76.51132557714853],[-68.93976917529807,76.54990046497333],[-68.76634826923117,76.55175699880375],[-68.50992908740743,76.55175699880375],[-68.50743999744161,76.51611959755911],[-68.67897262836203,76.51193618208278],[-68.93976917529807,76.51132557714853]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS image - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_thule2_2015.09.25","name":"imagico.de: Thule Airbase DMS low altitude overflight September 2015","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=dms_thule2_2015.09.25&z={zoom}&x={x}&y={-y}","endDate":"2015-09-25T00:00:00.000Z","startDate":"2015-09-25T00:00:00.000Z","scaleExtent":[0,17],"polygon":[[[-68.74291885235837,76.52635852412212],[-68.74446380475094,76.52840070669755],[-68.74806869366695,76.54938731810256],[-68.7461482320123,76.56016657973251],[-68.72275936940244,76.56022393334496],[-68.72017371991207,76.5577475347327],[-68.71853220799495,76.5292079974043],[-68.71977675297786,76.52636602351234],[-68.74291885235837,76.52635852412212]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS aerial images from Thule Airbase - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_thule_2015.10.06","name":"imagico.de: Thule Airbase DMS overflight October 2015","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=dms_thule_2015.10.06&z={zoom}&x={x}&y={-y}","endDate":"2015-10-06T00:00:00.000Z","startDate":"2015-10-06T00:00:00.000Z","scaleExtent":[0,16],"polygon":[[[-68.81923965911197,76.52510098413808],[-68.82651380996036,76.54176603738404],[-68.77344898680974,76.5439032956252],[-68.7021022270136,76.54544610909097],[-68.59176687697696,76.54560088014632],[-68.59183124999333,76.52793072237704],[-68.65970186690618,76.52510098413808],[-68.81923965911197,76.52510098413808]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS aerial images from Thule Airbase - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_thule_2015.09.25","name":"imagico.de: Thule Airbase DMS overflight September 2015","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=dms_thule_2015.09.25&z={zoom}&x={x}&y={-y}","endDate":"2015-09-25T00:00:00.000Z","startDate":"2015-09-25T00:00:00.000Z","scaleExtent":[0,16],"polygon":[[[-68.7777130980429,76.50687742381471],[-68.77661875676482,76.57064446843503],[-68.68115357350676,76.57065443536027],[-68.67630413960784,76.55384487076157],[-68.67619685124725,76.5307435998188],[-68.6852305312094,76.50688243050337],[-68.7777130980429,76.50687742381471]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS aerial images from Thule Airbase - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R094_N79_20160812T105622","name":"imagico.de: Ushakov Island August 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R094_N79_20160812T105622&z={zoom}&x={x}&y={-y}","endDate":"2016-08-12T00:00:00.000Z","startDate":"2016-08-12T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[78.45885691499899,80.72643412860921],[78.45885691499899,80.9098976404357],[80.48892435884663,80.9098976404357],[80.48892435884663,80.72643412860921],[78.45885691499899,80.72643412860921]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date late summer imagery with few clouds (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80910682014358LGN00","name":"imagico.de: Vanatinai","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80910682014358LGN00&z={zoom}&x={x}&y={-y}","endDate":"2014-12-24T00:00:00.000Z","startDate":"2014-12-24T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[153.0613810625655,-11.789228234021259],[153.0613810625655,-11.288690822294749],[153.10927458673538,-11.072292520575749],[154.41201277643268,-11.072292520575749],[154.41201277643268,-11.789228234021259],[153.0613810625655,-11.789228234021259]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Coarse coastline due to cloud cover in Bing/Mapbox (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82330892016031LGN00","name":"imagico.de: Volcán Calbuco","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82330892016031LGN00&z={zoom}&x={x}&y={-y}","endDate":"2016-01-31T00:00:00.000Z","startDate":"2016-01-31T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-72.8669610523419,-41.51741123877955],[-72.8669610523419,-41.045274923011036],[-72.23181395761533,-41.045274923011036],[-71.87510161630674,-41.10829439141359],[-72.00007109872861,-41.51741123877955],[-72.8669610523419,-41.51741123877955]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Image from after the 2015 eruption (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R089_N52_20160623T024048","name":"imagico.de: Vostochny Cosmodrome","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R089_N52_20160623T024048&z={zoom}&x={x}&y={-y}","endDate":"2016-06-23T00:00:00.000Z","startDate":"2016-06-23T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[126.36143429881301,51.375528375017275],[126.34804471141064,52.33932231282816],[128.60762341624462,52.340895519845674],[128.6117432892915,51.375528375017275],[126.36143429881301,51.375528375017275]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent image showing newest features (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-walps_autumn_2017","name":"imagico.de: Western Alps autumn colors 2017","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=walps_autumn_2017&z={zoom}&x={x}&y={-y}","endDate":"2017-10-17T00:00:00.000Z","startDate":"2017-10-17T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[4.6412,43.2493],[4.3118,43.2653],[4.3118,44.2167],[5.2562,46.965],[5.9151,48.7177],[7.3866,48.7467],[10.088,48.7467],[10.088,48.7032],[7.7819,43.2813],[7.76,43.2653],[7.3646,43.2493],[4.6412,43.2493]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Autumn colors in the Alps, Jura and southwestern Germany  (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81490352013282LGN00","name":"imagico.de: Western Karakoram","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81490352013282LGN00&z={zoom}&x={x}&y={-y}","endDate":"2013-10-09T00:00:00.000Z","startDate":"2013-10-09T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[75.98364343730569,34.97850982318471],[73.96164407817483,35.36957188964085],[74.44281091777444,37.09391400468158],[76.50600900737405,36.7026732100855],[75.98364343730569,34.97850982318471]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Represents approximately minimum snow cover so can be well used for glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R039_S15_20160510T145731","name":"imagico.de: Willkanuta Mountains and Quelccaya Ice Cap","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R039_S15_20160510T145731&z={zoom}&x={x}&y={-y}","endDate":"2016-05-10T00:00:00.000Z","startDate":"2016-05-10T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-71.18070648306262,-14.4978507264954],[-71.17976234548938,-13.710292880050797],[-70.5563740550841,-13.71262765059222],[-70.5563740550841,-14.4978507264954],[-71.18070648306262,-14.4978507264954]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Poor and outdated imagery in other sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"IPR-orotofoto-last-tms","name":"IPR ortofoto LAST (tmsproxy)","type":"tms","template":"http://osm-{switch:a,b,c}.zby.cz/tiles_ipr_last.php/{zoom}/{x}/{y}.jpg","scaleExtent":[1,18],"polygon":[[[14.81231552124,49.93089301941],[14.18754582291,49.87687266984],[14.12025456314,50.19881542327],[14.74502426147,50.25247461226],[14.81231552124,49.93089301941]]]},{"id":"IPR-orotofoto-vege-tms","name":"IPR ortofoto Low-Vegetation (tmsproxy)","type":"tms","template":"http://osm-{switch:a,b,c}.zby.cz/tiles_ipr_vege.php/{zoom}/{x}/{y}.jpg","scaleExtent":[1,20],"polygon":[[[14.30454236984,49.99538124382],[14.3160436821,49.94205148763],[14.3499983888,49.94508261663],[14.35383872175,49.92726356386],[14.42385321818,49.93351545169],[14.4200902288,49.95097343212],[14.48865449494,49.95709281879],[14.48479036398,49.9750111737],[14.55385989188,49.98117257481],[14.55011770159,49.99851689993],[14.58455395868,50.0015874108],[14.58829614897,49.98424419323],[14.69168128485,49.99346468175],[14.67633637226,50.06452744171],[14.71278864961,50.06777324036],[14.70115373952,50.12158114828],[14.66470146217,50.11833899243],[14.6610031918,50.13543086714],[14.62755290441,50.13245658485],[14.61965341283,50.16894659259],[14.58542741996,50.16590546732],[14.58162921725,50.18344165464],[14.40776267983,50.167995553],[14.41156088254,50.15045369625],[14.37764851321,50.14743927281],[14.37379555571,50.16523508727],[14.33892816423,50.16213672855],[14.34278112173,50.14433976066],[14.27367931007,50.13819641038],[14.27749028245,50.12058459573],[14.20879964298,50.11447476994],[14.21288816219,50.09557069695],[14.24656290855,50.09856724424],[14.25417384067,50.06335893014],[14.21987061144,50.0603042129],[14.22369648177,50.04259477081],[14.257999711,50.04565061557],[14.26952647673,49.99225864496],[14.30454236984,49.99538124382]]]},{"id":"GSGS3906","name":"Ireland British War Office 1:25k GSGS 3906","type":"tms","template":"http://mapwarper.net/layers/tile/101/{zoom}/{x}/{y}.png","scaleExtent":[0,18],"polygon":[[[-10.71,51.32],[-10.71,55.46],[-5.37,55.46],[-5.37,51.32],[-10.71,51.32]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_Ireland#Trinity_College_Dublin","terms_text":"Glucksman Map Library, Trinity College Dublin","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAB3RJTUUH3gQOFR0YB1KT3QAAAAlwSFlzAAAewQAAHsEBw2lUUwAAAARnQU1BAACxjwv8YQUAAAS/SURBVHjandN7TFNXHAfwzrn/lm3ZHy7LYrJkybK5zMw9fCEoPjbeChoHTtBVRF7l1ZZSaG8flCtvsFVpoZZHC5Y6jDM+UScDaxF5lIfSAaMIlVKBS8EZN4d+d9voZpbMFX/JN7nnnvM7n5xzcxmM5wrPlX1yFmP2adgmXKHc78bsU+j9ZRT3HzzE+D0n7tjuYdo5h38X47/q+UWD1nE0tw/gktEC66gdN/tG0Dc4hnEHhdG7DujOdqGHxi4ae2AZti8ccJXZYoOxawRPnjzGwcpmzM8//ntOe86MickZTEw7ka+99nJAZ/8YWjqs7ufc6ibM/fbQ/fzHo0eoOduJ8UkKljt2nLhk9hj4/Wlm6VA9A2NUa/ew6wNQE1OzVGvPEGUZvkvZHVNUo2mA6ugfpvoGrNT8/Dz1tMfd/yJgKZ13h6zjzFbzvbwO8wDZaR4kzeZbZG/fIHnTbCOvdzrI9h472dnVT97oociO23NkW+9M3pDVsc/V69rjRYA7Su11/dvbfkRJvDeOcMORuj8CpelLkJO6BVs4vQhj3QD5fTQS2PXYndQAblw2yrUt9c/6/xeoqzulK+VEoCTtawgSM5HCr0Nsmg48ngJhYiukonNIybeg8MQEFIZBFBWIoa4z1XoMaOrbtbHci2BtW4RachnOlO/GZW0SjuZEY2eWGYVEFfYJ+kDo/4ThdDPExadQcbxb5zmgb6/xYZlAxPtDmByFS2U+EHM5yBOyEZZ8HkzeZaQmyxFZROGkgUQIMQSNvkPrMXBM31YdFqNDJK8ZHE4FYgSt2Jl0GpKUGAhFjTiQ2QJDgRBGdSTIvEJ8IXDSQJvngEbfWrWacGJDzn1sJ34FkSqFQbgWTcUrcLWIATlnBzYSE8hOOIBQzk9YK56jgRs1CzlBVXD6bcijCYSwTYjhXUFD7nrUlHyFc6pPUCL4BpskUwhn6iGPSMYG3igN3KxeCKDZyulGddReBKV3YbNkGidkIWhQLMeFiuUoE3ths8iOfXFnoQ5nwTt9xHVFVZ5f0XGjxks0A++sIWyNqYM0TYp6qS9+UHxOn+BjqMQfwF8wgg2x5+ErccCboKA5bloAUGc8tk40i2CmGuGhgQhjX0MZwUY5uRJVuX6QcpPhm2TErlBfBLAa4S2epYHrlZ5fke4K6SVyIjRejz1REfhO2Ab2wavgZJ8EU9gEUek1MDMvIIa5DUFpzVhHzECtbRR4DJRrDP5f8h04ILwAmTQLAkEWCgsLIJVIIcwS4uhRBSQSCfi8FGzP6sbKjLsoV+tWewwolUfe+pR1y7GD1YDd4cGIi4uFgM/HulWr4LdpI5ITE5EQH49dOwMRmtmND/ebLMoy+WueA2VyBmO9opSTcx6HimWQHypGBicF+6MjwdzzLSQEH6UlBSjKFyNS1AnGMm6Csuwww2NApVK6hkv2JMptmTkGiPNqEcc+jFiuGsy0SrD4lciQ1kJW3ICAqJIWeu1ilUq1EEDlHr/6vr/XxozBuQD6jw6UUXRm6DgRQCeQfIA1iaZ+BuP191xrXwpw1RtL16zwSfi5PVg2hZAcyp0gqQOr9548TU+/82zdywGvLH429eZnO8rPBNMbB4ps+MhPpvyna9ELgb8ASvKZeuq+E9sAAAAASUVORK5CYII="},{"id":"ITACyL-Castile-and-Leon","name":"ITACyL - Castile and León","type":"wms","template":"http://orto.wms.itacyl.es/WMS?REQUEST=GetMap&SERVICE=WMS&VERSION=1.1.1&LAYERS=Ortofoto_CyL&SRS={proj}&FORMAT=image/jpeg&STYLES=Default&TRANSPARENT=TRUE&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:4326","polygon":[[[-1.9357991,41.4383441],[-1.8960064,41.438692],[-1.895356,41.3968709],[-1.9767014,41.3961593],[-1.9763916,41.376229],[-2.0620081,41.3754798],[-2.0626179,41.4147091],[-2.104577,41.4143421],[-2.103634,41.3536716],[-2.1444816,41.353314],[-2.1418984,41.1868282],[-2.0620415,41.1875291],[-2.0617117,41.1662438],[-2.0204638,41.1666059],[-2.0188653,41.0633378],[-2.100826,41.0626171],[-2.1011407,41.0829596],[-2.2273263,41.0818503],[-2.2270424,41.0634991],[-2.2691206,41.0631291],[-2.2688026,41.0425666],[-2.3532519,41.0418238],[-2.3535559,41.0614821],[-2.3948686,41.0611188],[-2.3945738,41.0420594],[-2.4372246,41.0416842],[-2.4375565,41.0631457],[-2.4792811,41.0627788],[-2.4799141,41.1036906],[-2.5207759,41.1033316],[-2.5211004,41.1242948],[-2.6041532,41.1235652],[-2.6048148,41.1662833],[-2.6470964,41.1659121],[-2.6480789,41.2293052],[-2.728739,41.2285978],[-2.7290669,41.2497401],[-2.8955197,41.2482806],[-2.8964873,41.3106325],[-2.9363011,41.3102838],[-2.9357117,41.2723089],[-3.1469203,41.2704576],[-3.1472307,41.2904534],[-3.2282807,41.2897432],[-3.2276653,41.2500782],[-3.3958112,41.2486039],[-3.3951828,41.2080777],[-3.4349215,41.207729],[-3.4342897,41.166962],[-3.4787658,41.1665716],[-3.4784403,41.1455556],[-3.6033615,41.1444585],[-3.6026994,41.1016871],[-3.6453878,41.101312],[-3.6450826,41.0815903],[-3.6873474,41.0812188],[-3.6867259,41.0410356],[-3.7286604,41.0406667],[-3.7280287,40.9997997],[-3.7689605,40.9994394],[-3.7686426,40.9788648],[-3.8547306,40.9781068],[-3.8543974,40.9565345],[-3.8985743,40.9561454],[-3.8976421,40.8957522],[-3.9390572,40.8953871],[-3.9371558,40.7720359],[-4.061976,40.7709334],[-4.0613345,40.7292585],[-4.1037236,40.7288838],[-4.1031129,40.6891834],[-4.146278,40.6888017],[-4.1449778,40.6042134],[-4.1902455,40.6038125],[-4.1899353,40.5836167],[-4.2294603,40.5832666],[-4.2297921,40.604873],[-4.2705425,40.6045122],[-4.2695844,40.5421064],[-4.3138364,40.5417142],[-4.3116268,40.397575],[-4.3937599,40.3968455],[-4.3934525,40.3767688],[-4.4372265,40.3763799],[-4.4362295,40.3112251],[-4.5219173,40.3104631],[-4.5203662,40.2089652],[-4.5613148,40.2086005],[-4.5609947,40.1876316],[-4.6889523,40.1864916],[-4.6893267,40.2110086],[-4.7319244,40.2106292],[-4.7325206,40.2496574],[-4.7683768,40.2493382],[-4.7680867,40.2303451],[-4.8110432,40.2299626],[-4.8114661,40.2072641],[-4.8542024,40.1841364],[-4.8526373,40.1256293],[-4.9369855,40.1248771],[-4.9363819,40.0852905],[-5.3553832,40.0815518],[-5.3560552,40.1256221],[-5.4402699,40.1248711],[-5.4409085,40.1667265],[-5.6038169,40.1652746],[-5.6044816,40.2088137],[-5.6864643,40.2080835],[-5.6871247,40.2513133],[-6.0216585,40.2483356],[-6.0229464,40.3325684],[-6.1043332,40.3318449],[-6.1055986,40.4145069],[-6.1895128,40.4137618],[-6.1901823,40.4574544],[-6.2697076,40.4567487],[-6.2690913,40.4165255],[-6.35192,40.41579],[-6.3512834,40.374216],[-6.4332493,40.3734877],[-6.4326391,40.3336127],[-6.5224541,40.3328142],[-6.5211648,40.2484909],[-6.599422,40.2477943],[-6.5988642,40.2112799],[-6.8556786,40.2089926],[-6.8563443,40.2525719],[-6.9362181,40.2518609],[-6.9375132,40.3365682],[-6.8511064,40.3373363],[-6.8600092,40.9167165],[-6.9354421,40.9160518],[-6.9374109,41.0435015],[-6.8548179,41.0442279],[-6.8554804,41.0870562],[-6.7701541,41.0878063],[-6.7724533,41.2362299],[-6.6837886,41.2370075],[-6.6043553,41.2377041],[-6.6052401,41.2947359],[-6.5193011,41.295489],[-6.5199114,41.3347937],[-6.4367251,41.3355221],[-6.4380091,41.4181379],[-6.3531841,41.4188797],[-6.3544684,41.501409],[-6.2688882,41.5021564],[-6.2707951,41.6245018],[-6.3566149,41.6237537],[-6.3572432,41.6640106],[-6.435477,41.663329],[-6.4349024,41.6265132],[-6.5227923,41.625747],[-6.523426,41.6663463],[-6.6034046,41.6656495],[-6.60733,41.9166043],[-7.0220912,41.9130049],[-7.0240633,42.0387169],[-7.1054035,42.0380124],[-7.1061291,42.0842081],[-7.0207976,42.0849466],[-7.0227551,42.2093958],[-6.9369897,42.2101367],[-6.9376312,42.25087],[-6.8547973,42.2515851],[-6.8554546,42.2932892],[-6.7734213,42.2939969],[-6.7740277,42.3324438],[-6.853255,42.3317608],[-6.8552311,42.4569007],[-7.1034126,42.4547653],[-7.1081086,42.7511487],[-7.0219933,42.7518861],[-7.0224121,42.7782497],[-6.9397569,42.7789573],[-6.9419944,42.9196184],[-6.7730194,42.9210615],[-6.7736331,42.959583],[-6.5232855,42.9617196],[-6.5239109,43.0009499],[-6.4389317,43.0016747],[-6.4402391,43.0836074],[-5.9378159,43.0878866],[-5.9370816,43.0418887],[-5.854205,43.0425951],[-5.8535667,43.0025804],[-5.7723612,43.003273],[-5.7736346,43.0830757],[-5.6026996,43.0845317],[-5.6020243,43.0422247],[-5.5216051,43.0429102],[-5.5222624,43.0840869],[-5.4375994,43.084808],[-5.4382655,43.1265078],[-5.1044441,43.1293491],[-5.1057321,43.2099008],[-5.0238581,43.2105967],[-5.0245075,43.2511672],[-4.9001667,43.2522234],[-4.899411,43.2050092],[-4.8112607,43.2057585],[-4.8096559,43.105375],[-4.7697514,43.1057148],[-4.7693676,43.0816804],[-4.7294463,43.0820204],[-4.7288105,43.0421933],[-4.5632192,43.0436047],[-4.5635281,43.0629569],[-4.3959936,43.0643843],[-4.395658,43.0433568],[-4.3537016,43.0437144],[-4.3526592,42.978357],[-4.2301346,42.9794024],[-4.2291284,42.9162469],[-4.1877354,42.9166004],[-4.1870583,42.8740657],[-4.1055199,42.8747626],[-4.1048632,42.8334825],[-3.978008,42.8345674],[-3.9773335,42.7921387],[-3.9374989,42.7924796],[-3.9378064,42.8118263],[-3.853966,42.8125436],[-3.8542743,42.8319306],[-3.8957255,42.831576],[-3.8960731,42.8534282],[-3.9382057,42.853068],[-3.9388853,42.8957718],[-3.9805995,42.8954154],[-3.9809315,42.916265],[-4.0221962,42.9159125],[-4.0229008,42.9601447],[-3.9785114,42.9605236],[-3.9794595,43.0199892],[-3.938827,43.0203357],[-3.9391788,43.042387],[-3.8970383,43.0427461],[-3.8973798,43.0641401],[-3.8542367,43.0645077],[-3.8548965,43.1058288],[-3.7708592,43.1065444],[-3.7711564,43.1251478],[-3.7281894,43.1255135],[-3.7285258,43.1465582],[-3.6871289,43.1469104],[-3.6877837,43.1878633],[-3.6036492,43.1885787],[-3.6033117,43.16747],[-3.5227798,43.168155],[-3.5224286,43.1461867],[-3.3966874,43.1472567],[-3.3969871,43.1660054],[-3.3544386,43.1663674],[-3.3547905,43.1883699],[-3.312676,43.188728],[-3.3129888,43.2082817],[-3.2299295,43.2089878],[-3.2295886,43.1876784],[-3.1034303,43.1887511],[-3.1027407,43.1456249],[-3.145455,43.1452614],[-3.1451648,43.1271],[-3.1061749,43.1274319],[-3.1044462,43.0191538],[-3.0207548,43.0198674],[-3.0201036,42.9790294],[-2.9811034,42.9793622],[-2.9797722,42.8957965],[-3.1047595,42.8947286],[-3.1027646,42.7692834],[-3.0219949,42.7699749],[-3.021675,42.7498344],[-2.9802357,42.7501893],[-2.9798754,42.7275008],[-2.8961284,42.7282183],[-2.8967866,42.7696661],[-2.853397,42.7700376],[-2.854046,42.8108748],[-2.6857742,42.8123144],[-2.6854448,42.7915941],[-2.645233,42.7919382],[-2.6448881,42.7702354],[-2.5200461,42.7713042],[-2.5193626,42.7282661],[-2.5607021,42.7279119],[-2.5603797,42.7075982],[-2.5194387,42.7079491],[-2.5181004,42.6235669],[-2.6040367,42.6228294],[-2.6043876,42.6449665],[-2.7715364,42.6435327],[-2.7718838,42.6654388],[-2.8117632,42.6650968],[-2.8120986,42.6862446],[-2.8546876,42.6858795],[-2.853374,42.6030248],[-2.8941263,42.602675],[-2.8937924,42.581594],[-3.0618985,42.5801504],[-3.0603059,42.4795203],[-3.0219106,42.4798505],[-3.0198987,42.3524957],[-3.0625473,42.3521282],[-3.0602922,42.20906],[-3.101203,42.2087066],[-3.1008585,42.1868215],[-3.0617541,42.1871594],[-3.0611,42.1455897],[-3.02029,42.1459425],[-3.0196265,42.1037456],[-2.8960202,42.1048151],[-2.8950131,42.0407115],[-2.8122232,42.0414286],[-2.8135302,42.1246034],[-2.7687117,42.1249911],[-2.7690537,42.1467421],[-2.7269484,42.1471061],[-2.7265985,42.1248518],[-2.6870598,42.1251938],[-2.6860524,42.0610919],[-2.7280396,42.0607283],[-2.7273889,42.0192954],[-2.6034263,42.0203694],[-2.6037558,42.0413549],[-2.561002,42.0417251],[-2.561982,42.1041055],[-2.5226586,42.1044458],[-2.5229938,42.1257676],[-2.4793313,42.1261453],[-2.4796279,42.1450019],[-2.3551669,42.1460781],[-2.3555034,42.1674688],[-2.3118382,42.1678462],[-2.3114953,42.1460516],[-2.2698957,42.1464113],[-2.2692414,42.1048011],[-2.2295004,42.105145],[-2.2298147,42.1251384],[-2.1446652,42.1258749],[-2.1443191,42.1038592],[-2.1038544,42.1042093],[-2.1015605,41.958109],[-1.9768889,41.9591902],[-1.9765512,41.9376488],[-1.9347344,41.9380116],[-1.9350441,41.9577593],[-1.8945308,41.9581106],[-1.8948295,41.9771541],[-1.8540002,41.9775081],[-1.8530417,41.9163796],[-1.8138054,41.9167201],[-1.8115061,41.7698387],[-1.7705981,41.7701945],[-1.7686552,41.6458221],[-1.8533513,41.645084],[-1.8530483,41.6256663],[-1.8947057,41.6253032],[-1.8940326,41.5821499],[-1.9771633,41.5814247],[-1.9768326,41.5602127],[-1.9377021,41.5605541],[-1.9357991,41.4383441]]],"terms_text":"ITACyL"},{"id":"gsi.go.jp","name":"Japan GSI ortho Imagery","type":"tms","template":"https://cyberjapandata.gsi.go.jp/xyz/ort/{zoom}/{x}/{y}.jpg","scaleExtent":[5,19],"polygon":[[[141.85546875,44.64911632343077],[140.2294921875,43.96909818325174],[138.955078125,41.80407814427237],[139.482421875,40.17887331434696],[138.8671875,38.30718056188316],[136.31835937499997,37.19533058280065],[132.1435546875,35.137879119634185],[128.935546875,33.35806161277885],[129.5068359375,32.47269502206151],[129.77050781249997,31.690781806136822],[130.2099609375,30.90222470517144],[131.220703125,30.78903675126116],[131.66015625,32.32427558887655],[132.71484375,32.879587173066305],[133.76953125,33.17434155100208],[136.7578125,33.87041555094183],[139.306640625,35.06597313798418],[140.888671875,35.17380831799959],[141.15234374999997,36.56260003738548],[142.11914062499997,39.9434364619742],[141.767578125,42.68243539838623],[141.85546875,44.64911632343077]]],"terms_url":"http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html","terms_text":"GSI Japan"},{"id":"Aargau-AGIS-2011","name":"Kanton Aargau 25cm (AGIS 2011)","type":"tms","template":"http://tiles.poole.ch/AGIS/OF2011/{zoom}/{x}/{y}.png","endDate":"2011-01-01T00:00:00.000Z","startDate":"2011-01-01T00:00:00.000Z","scaleExtent":[14,19],"polygon":[[[8.222923278808594,47.604774168947614],[8.244209289550781,47.613569753973955],[8.294334411621094,47.60986653003798],[8.300857543945312,47.58625231278527],[8.329353332519531,47.569808674020344],[8.382568359375,47.56702895728551],[8.398017883300781,47.57490443821351],[8.424797058105469,47.56795554592218],[8.415184020996094,47.54663986006874],[8.389778137207031,47.5262428287156],[8.372268676757812,47.51233121261258],[8.358535766601562,47.503286684046664],[8.36402893066406,47.48078455918],[8.371238708496094,47.481016589036074],[8.373985290527344,47.47011007802331],[8.368148803710938,47.46825342516445],[8.387031555175781,47.44852243794931],[8.380851745605469,47.447593738482304],[8.384284973144531,47.4355191531953],[8.376388549804688,47.431803338643334],[8.377761840820312,47.42808726171425],[8.389434814453125,47.42739046807988],[8.391494750976562,47.41902822496511],[8.380165100097656,47.40462347023052],[8.364715576171875,47.4016026187529],[8.367118835449219,47.39881398671558],[8.380851745605469,47.39788440990287],[8.39424133300781,47.39439835079049],[8.399734497070312,47.372314620566925],[8.40728759765625,47.37068703239024],[8.404197692871094,47.34417352612498],[8.416213989257812,47.33416935720614],[8.414497375488281,47.32602502961836],[8.452606201171875,47.33254059215931],[8.444023132324219,47.31927592106609],[8.427543640136719,47.29925625338924],[8.390121459960938,47.28854494625744],[8.41175079345703,47.247076403108416],[8.393898010253906,47.227728840642065],[8.404884338378906,47.194845099780174],[8.401451110839844,47.17757880776958],[8.409690856933594,47.17314466448546],[8.412437438964844,47.13976002139446],[8.379478454589844,47.13929295458033],[8.361968994140625,47.14559801038333],[8.342742919921875,47.177112073280966],[8.3056640625,47.24987305653909],[8.295021057128906,47.26268916206698],[8.300514221191406,47.26991141830738],[8.278884887695312,47.28225686421767],[8.259315490722656,47.285983225286174],[8.243522644042969,47.280859411143915],[8.240432739257812,47.27130916053537],[8.228759765625,47.27270686584952],[8.219146728515625,47.25336866567523],[8.204727172851562,47.245444953748034],[8.203353881835938,47.22679624955806],[8.180007934570312,47.22143353240336],[8.171768188476562,47.2279619858493],[8.155975341796875,47.23961793870555],[8.175888061523436,47.24218190428504],[8.17657470703125,47.25406775981567],[8.136062622070312,47.24730946320093],[8.12164306640625,47.24218190428504],[8.10791015625,47.2447457457832],[8.097267150878906,47.259427174956194],[8.077354431152344,47.2603591917818],[8.059844970703125,47.25569894358661],[8.062591552734375,47.24614415248379],[8.016586303710938,47.242881146090085],[8.015899658203125,47.258961160390896],[7.997016906738281,47.2796948387185],[7.951698303222655,47.274337475394645],[7.960968017578125,47.25430078914495],[7.933845520019531,47.237053849043896],[7.911529541015624,47.24381345414034],[7.859344482421875,47.23425651880584],[7.83977508544922,47.23425651880584],[7.826042175292968,47.24427960201268],[7.828102111816407,47.25966018070071],[7.82398223876953,47.26548499105541],[7.8408050537109375,47.273405704663965],[7.848701477050781,47.28551744450745],[7.860374450683594,47.30461109337307],[7.871704101562499,47.31136207506936],[7.8888702392578125,47.31136207506936],[7.897453308105469,47.31904317780638],[7.895393371582031,47.327653995607086],[7.908439636230469,47.340451266106996],[7.9259490966796875,47.332773275955894],[7.94757843017578,47.331609846720866],[7.94757843017578,47.316715688820764],[8.007316589355467,47.33905535093827],[8.004913330078125,47.34533667855891],[8.011093139648438,47.35719936945847],[8.024139404296875,47.36719917429931],[8.032722473144531,47.38393878966209],[8.026885986328125,47.39602520707679],[8.010749816894531,47.3955603961201],[8.004570007324219,47.40671472747142],[7.975730895996094,47.41507892620099],[7.9657745361328125,47.42181578692778],[7.985343933105469,47.425764580393924],[7.971954345703124,47.46105827584221],[7.957534790039062,47.457344265054225],[7.940711975097656,47.46221885041022],[7.946891784667968,47.48403288391224],[7.907066345214844,47.48588897929538],[7.8936767578125,47.50653361720931],[7.873420715332031,47.51325876844644],[7.875480651855468,47.52253342509336],[7.865180969238281,47.51975120023913],[7.856254577636718,47.533660849056794],[7.833251953125,47.5325018525392],[7.834281921386719,47.51465007145751],[7.789649963378906,47.49377665301097],[7.789649963378906,47.518128167602484],[7.7515411376953125,47.52461999690649],[7.731285095214843,47.53203824675999],[7.708969116210937,47.54015075619555],[7.740898132324219,47.54362716173679],[7.761497497558593,47.54895720250044],[7.781410217285156,47.55289644950155],[7.797546386718749,47.55915229204993],[7.805442810058593,47.56563904359584],[7.814369201660155,47.575136052077276],[7.819175720214843,47.58648387645128],[7.8325653076171875,47.586715439092906],[7.843208312988281,47.581620824334166],[7.859344482421875,47.58602074809481],[7.8847503662109375,47.58764167941513],[7.903633117675781,47.58092606572345],[7.911872863769532,47.56749225365282],[7.90740966796875,47.55776216936179],[7.917709350585938,47.545712894408624],[7.929382324218749,47.54640812019053],[7.941741943359374,47.54432241518175],[7.9520416259765625,47.54965238525127],[7.9561614990234375,47.55683540041267],[7.9767608642578125,47.55544521625339],[7.997360229492187,47.556603705614094],[8.019676208496094,47.54965238525127],[8.049888610839844,47.55637200979099],[8.058815002441406,47.56285910557121],[8.072891235351562,47.56355410390809],[8.086967468261719,47.557067094186735],[8.100700378417969,47.56216409801383],[8.105506896972656,47.57976811421671],[8.113059997558594,47.583473468887405],[8.133659362792969,47.58301031389572],[8.138809204101562,47.59042030203756],[8.15185546875,47.59551406038282],[8.166275024414062,47.5941249027327],[8.177261352539062,47.6017648134425],[8.193740844726562,47.616346999837226],[8.2012939453125,47.62120682516921],[8.219490051269531,47.61958693358351],[8.223953247070312,47.61102381568743],[8.222923278808594,47.604774168947614]]],"terms_text":"AGIS OF2011"},{"id":"Aargau-AGIS-2014","name":"Kanton Aargau 25cm (AGIS 2014)","type":"tms","template":"https://mapproxy.osm.ch/tiles/AGIS2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2014-01-01T00:00:00.000Z","startDate":"2014-01-01T00:00:00.000Z","scaleExtent":[8,19],"polygon":[[[8.222923278808594,47.604774168947614],[8.244209289550781,47.613569753973955],[8.294334411621094,47.60986653003798],[8.300857543945312,47.58625231278527],[8.329353332519531,47.569808674020344],[8.382568359375,47.56702895728551],[8.398017883300781,47.57490443821351],[8.424797058105469,47.56795554592218],[8.415184020996094,47.54663986006874],[8.389778137207031,47.5262428287156],[8.372268676757812,47.51233121261258],[8.358535766601562,47.503286684046664],[8.36402893066406,47.48078455918],[8.371238708496094,47.481016589036074],[8.373985290527344,47.47011007802331],[8.368148803710938,47.46825342516445],[8.387031555175781,47.44852243794931],[8.380851745605469,47.447593738482304],[8.384284973144531,47.4355191531953],[8.376388549804688,47.431803338643334],[8.377761840820312,47.42808726171425],[8.389434814453125,47.42739046807988],[8.391494750976562,47.41902822496511],[8.380165100097656,47.40462347023052],[8.364715576171875,47.4016026187529],[8.367118835449219,47.39881398671558],[8.380851745605469,47.39788440990287],[8.39424133300781,47.39439835079049],[8.399734497070312,47.372314620566925],[8.40728759765625,47.37068703239024],[8.404197692871094,47.34417352612498],[8.416213989257812,47.33416935720614],[8.414497375488281,47.32602502961836],[8.452606201171875,47.33254059215931],[8.444023132324219,47.31927592106609],[8.427543640136719,47.29925625338924],[8.390121459960938,47.28854494625744],[8.41175079345703,47.247076403108416],[8.393898010253906,47.227728840642065],[8.404884338378906,47.194845099780174],[8.401451110839844,47.17757880776958],[8.409690856933594,47.17314466448546],[8.412437438964844,47.13976002139446],[8.379478454589844,47.13929295458033],[8.361968994140625,47.14559801038333],[8.342742919921875,47.177112073280966],[8.3056640625,47.24987305653909],[8.295021057128906,47.26268916206698],[8.300514221191406,47.26991141830738],[8.278884887695312,47.28225686421767],[8.259315490722656,47.285983225286174],[8.243522644042969,47.280859411143915],[8.240432739257812,47.27130916053537],[8.228759765625,47.27270686584952],[8.219146728515625,47.25336866567523],[8.204727172851562,47.245444953748034],[8.203353881835938,47.22679624955806],[8.180007934570312,47.22143353240336],[8.171768188476562,47.2279619858493],[8.155975341796875,47.23961793870555],[8.175888061523436,47.24218190428504],[8.17657470703125,47.25406775981567],[8.136062622070312,47.24730946320093],[8.12164306640625,47.24218190428504],[8.10791015625,47.2447457457832],[8.097267150878906,47.259427174956194],[8.077354431152344,47.2603591917818],[8.059844970703125,47.25569894358661],[8.062591552734375,47.24614415248379],[8.016586303710938,47.242881146090085],[8.015899658203125,47.258961160390896],[7.997016906738281,47.2796948387185],[7.951698303222655,47.274337475394645],[7.960968017578125,47.25430078914495],[7.933845520019531,47.237053849043896],[7.911529541015624,47.24381345414034],[7.859344482421875,47.23425651880584],[7.83977508544922,47.23425651880584],[7.826042175292968,47.24427960201268],[7.828102111816407,47.25966018070071],[7.82398223876953,47.26548499105541],[7.8408050537109375,47.273405704663965],[7.848701477050781,47.28551744450745],[7.860374450683594,47.30461109337307],[7.871704101562499,47.31136207506936],[7.8888702392578125,47.31136207506936],[7.897453308105469,47.31904317780638],[7.895393371582031,47.327653995607086],[7.908439636230469,47.340451266106996],[7.9259490966796875,47.332773275955894],[7.94757843017578,47.331609846720866],[7.94757843017578,47.316715688820764],[8.007316589355467,47.33905535093827],[8.004913330078125,47.34533667855891],[8.011093139648438,47.35719936945847],[8.024139404296875,47.36719917429931],[8.032722473144531,47.38393878966209],[8.026885986328125,47.39602520707679],[8.010749816894531,47.3955603961201],[8.004570007324219,47.40671472747142],[7.975730895996094,47.41507892620099],[7.9657745361328125,47.42181578692778],[7.985343933105469,47.425764580393924],[7.971954345703124,47.46105827584221],[7.957534790039062,47.457344265054225],[7.940711975097656,47.46221885041022],[7.946891784667968,47.48403288391224],[7.907066345214844,47.48588897929538],[7.8936767578125,47.50653361720931],[7.873420715332031,47.51325876844644],[7.875480651855468,47.52253342509336],[7.865180969238281,47.51975120023913],[7.856254577636718,47.533660849056794],[7.833251953125,47.5325018525392],[7.834281921386719,47.51465007145751],[7.789649963378906,47.49377665301097],[7.789649963378906,47.518128167602484],[7.7515411376953125,47.52461999690649],[7.731285095214843,47.53203824675999],[7.708969116210937,47.54015075619555],[7.740898132324219,47.54362716173679],[7.761497497558593,47.54895720250044],[7.781410217285156,47.55289644950155],[7.797546386718749,47.55915229204993],[7.805442810058593,47.56563904359584],[7.814369201660155,47.575136052077276],[7.819175720214843,47.58648387645128],[7.8325653076171875,47.586715439092906],[7.843208312988281,47.581620824334166],[7.859344482421875,47.58602074809481],[7.8847503662109375,47.58764167941513],[7.903633117675781,47.58092606572345],[7.911872863769532,47.56749225365282],[7.90740966796875,47.55776216936179],[7.917709350585938,47.545712894408624],[7.929382324218749,47.54640812019053],[7.941741943359374,47.54432241518175],[7.9520416259765625,47.54965238525127],[7.9561614990234375,47.55683540041267],[7.9767608642578125,47.55544521625339],[7.997360229492187,47.556603705614094],[8.019676208496094,47.54965238525127],[8.049888610839844,47.55637200979099],[8.058815002441406,47.56285910557121],[8.072891235351562,47.56355410390809],[8.086967468261719,47.557067094186735],[8.100700378417969,47.56216409801383],[8.105506896972656,47.57976811421671],[8.113059997558594,47.583473468887405],[8.133659362792969,47.58301031389572],[8.138809204101562,47.59042030203756],[8.15185546875,47.59551406038282],[8.166275024414062,47.5941249027327],[8.177261352539062,47.6017648134425],[8.193740844726562,47.616346999837226],[8.2012939453125,47.62120682516921],[8.219490051269531,47.61958693358351],[8.223953247070312,47.61102381568743],[8.222923278808594,47.604774168947614]]],"terms_text":"AGIS OF2014"},{"id":"Aargau-AGIS-2016","name":"Kanton Aargau 25cm (AGIS 2016)","type":"tms","template":"https://mapproxy.osm.ch/tiles/AGIS2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2016-01-01T00:00:00.000Z","startDate":"2016-01-01T00:00:00.000Z","scaleExtent":[8,19],"polygon":[[[8.222923278808594,47.604774168947614],[8.244209289550781,47.613569753973955],[8.294334411621094,47.60986653003798],[8.300857543945312,47.58625231278527],[8.329353332519531,47.569808674020344],[8.382568359375,47.56702895728551],[8.398017883300781,47.57490443821351],[8.424797058105469,47.56795554592218],[8.415184020996094,47.54663986006874],[8.389778137207031,47.5262428287156],[8.372268676757812,47.51233121261258],[8.358535766601562,47.503286684046664],[8.36402893066406,47.48078455918],[8.371238708496094,47.481016589036074],[8.373985290527344,47.47011007802331],[8.368148803710938,47.46825342516445],[8.387031555175781,47.44852243794931],[8.380851745605469,47.447593738482304],[8.384284973144531,47.4355191531953],[8.376388549804688,47.431803338643334],[8.377761840820312,47.42808726171425],[8.389434814453125,47.42739046807988],[8.391494750976562,47.41902822496511],[8.380165100097656,47.40462347023052],[8.364715576171875,47.4016026187529],[8.367118835449219,47.39881398671558],[8.380851745605469,47.39788440990287],[8.39424133300781,47.39439835079049],[8.399734497070312,47.372314620566925],[8.40728759765625,47.37068703239024],[8.404197692871094,47.34417352612498],[8.416213989257812,47.33416935720614],[8.414497375488281,47.32602502961836],[8.452606201171875,47.33254059215931],[8.444023132324219,47.31927592106609],[8.427543640136719,47.29925625338924],[8.390121459960938,47.28854494625744],[8.41175079345703,47.247076403108416],[8.393898010253906,47.227728840642065],[8.404884338378906,47.194845099780174],[8.401451110839844,47.17757880776958],[8.409690856933594,47.17314466448546],[8.412437438964844,47.13976002139446],[8.379478454589844,47.13929295458033],[8.361968994140625,47.14559801038333],[8.342742919921875,47.177112073280966],[8.3056640625,47.24987305653909],[8.295021057128906,47.26268916206698],[8.300514221191406,47.26991141830738],[8.278884887695312,47.28225686421767],[8.259315490722656,47.285983225286174],[8.243522644042969,47.280859411143915],[8.240432739257812,47.27130916053537],[8.228759765625,47.27270686584952],[8.219146728515625,47.25336866567523],[8.204727172851562,47.245444953748034],[8.203353881835938,47.22679624955806],[8.180007934570312,47.22143353240336],[8.171768188476562,47.2279619858493],[8.155975341796875,47.23961793870555],[8.175888061523436,47.24218190428504],[8.17657470703125,47.25406775981567],[8.136062622070312,47.24730946320093],[8.12164306640625,47.24218190428504],[8.10791015625,47.2447457457832],[8.097267150878906,47.259427174956194],[8.077354431152344,47.2603591917818],[8.059844970703125,47.25569894358661],[8.062591552734375,47.24614415248379],[8.016586303710938,47.242881146090085],[8.015899658203125,47.258961160390896],[7.997016906738281,47.2796948387185],[7.951698303222655,47.274337475394645],[7.960968017578125,47.25430078914495],[7.933845520019531,47.237053849043896],[7.911529541015624,47.24381345414034],[7.859344482421875,47.23425651880584],[7.83977508544922,47.23425651880584],[7.826042175292968,47.24427960201268],[7.828102111816407,47.25966018070071],[7.82398223876953,47.26548499105541],[7.8408050537109375,47.273405704663965],[7.848701477050781,47.28551744450745],[7.860374450683594,47.30461109337307],[7.871704101562499,47.31136207506936],[7.8888702392578125,47.31136207506936],[7.897453308105469,47.31904317780638],[7.895393371582031,47.327653995607086],[7.908439636230469,47.340451266106996],[7.9259490966796875,47.332773275955894],[7.94757843017578,47.331609846720866],[7.94757843017578,47.316715688820764],[8.007316589355467,47.33905535093827],[8.004913330078125,47.34533667855891],[8.011093139648438,47.35719936945847],[8.024139404296875,47.36719917429931],[8.032722473144531,47.38393878966209],[8.026885986328125,47.39602520707679],[8.010749816894531,47.3955603961201],[8.004570007324219,47.40671472747142],[7.975730895996094,47.41507892620099],[7.9657745361328125,47.42181578692778],[7.985343933105469,47.425764580393924],[7.971954345703124,47.46105827584221],[7.957534790039062,47.457344265054225],[7.940711975097656,47.46221885041022],[7.946891784667968,47.48403288391224],[7.907066345214844,47.48588897929538],[7.8936767578125,47.50653361720931],[7.873420715332031,47.51325876844644],[7.875480651855468,47.52253342509336],[7.865180969238281,47.51975120023913],[7.856254577636718,47.533660849056794],[7.833251953125,47.5325018525392],[7.834281921386719,47.51465007145751],[7.789649963378906,47.49377665301097],[7.789649963378906,47.518128167602484],[7.7515411376953125,47.52461999690649],[7.731285095214843,47.53203824675999],[7.708969116210937,47.54015075619555],[7.740898132324219,47.54362716173679],[7.761497497558593,47.54895720250044],[7.781410217285156,47.55289644950155],[7.797546386718749,47.55915229204993],[7.805442810058593,47.56563904359584],[7.814369201660155,47.575136052077276],[7.819175720214843,47.58648387645128],[7.8325653076171875,47.586715439092906],[7.843208312988281,47.581620824334166],[7.859344482421875,47.58602074809481],[7.8847503662109375,47.58764167941513],[7.903633117675781,47.58092606572345],[7.911872863769532,47.56749225365282],[7.90740966796875,47.55776216936179],[7.917709350585938,47.545712894408624],[7.929382324218749,47.54640812019053],[7.941741943359374,47.54432241518175],[7.9520416259765625,47.54965238525127],[7.9561614990234375,47.55683540041267],[7.9767608642578125,47.55544521625339],[7.997360229492187,47.556603705614094],[8.019676208496094,47.54965238525127],[8.049888610839844,47.55637200979099],[8.058815002441406,47.56285910557121],[8.072891235351562,47.56355410390809],[8.086967468261719,47.557067094186735],[8.100700378417969,47.56216409801383],[8.105506896972656,47.57976811421671],[8.113059997558594,47.583473468887405],[8.133659362792969,47.58301031389572],[8.138809204101562,47.59042030203756],[8.15185546875,47.59551406038282],[8.166275024414062,47.5941249027327],[8.177261352539062,47.6017648134425],[8.193740844726562,47.616346999837226],[8.2012939453125,47.62120682516921],[8.219490051269531,47.61958693358351],[8.223953247070312,47.61102381568743],[8.222923278808594,47.604774168947614]]],"terms_text":"AGIS OF2016","best":true},{"id":"Basel-Landschaft-2015","name":"Kanton Basel-Landschaft 10cm (2015)","type":"tms","template":"https://mapproxy.osm.ch/tiles/KTBASELLANDSCHAFT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2015-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[18,21],"polygon":[[[7.370281219482422,47.413684985326796],[7.357578277587891,47.41507892620101],[7.357921600341797,47.41827323486739],[7.353544235229492,47.4196089792119],[7.344875335693359,47.42402250214274],[7.339725494384765,47.42971307765559],[7.332687377929687,47.430235650685475],[7.32685089111328,47.4319194618196],[7.325280543317693,47.43489176778178],[7.33050406703179,47.44175856152086],[7.338990092194756,47.44109169292469],[7.344964876980962,47.43607806019703],[7.352656881264292,47.43435807026775],[7.38119797480828,47.432081698142134],[7.375988960266113,47.414309359238985],[7.378145456314087,47.41399717320828],[7.382040023803711,47.41330745332341],[7.388391494750976,47.41397539271845],[7.413708184603623,47.410929293287566],[7.420743520414262,47.411098781635985],[7.427483310496426,47.41448047082256],[7.438105529405026,47.412739349590474],[7.448396898794484,47.41507114537187],[7.455576414208223,47.42792319548619],[7.45061852232364,47.43534476535272],[7.437842682352891,47.446323188615104],[7.425422575234655,47.443283894442736],[7.420904049355535,47.44594415975335],[7.422417620777747,47.45071647996838],[7.428795928789581,47.45387944195848],[7.430028776685507,47.459491697398036],[7.445765194338128,47.46197276972992],[7.44717015944249,47.456958090215814],[7.456512189239691,47.44925575541638],[7.492356675875099,47.458972279610066],[7.530679075390223,47.46118857622267],[7.527445320030451,47.473906165741866],[7.536326693749955,47.48383279861684],[7.536231113003725,47.49105266753894],[7.532603895549507,47.490968962664795],[7.531789123586811,47.49739885661967],[7.520038351186771,47.49678264400428],[7.512226152318425,47.49891674929323],[7.509348758631863,47.508884893812876],[7.499082452238831,47.51627805213703],[7.497870355425969,47.52124757864722],[7.502278119030558,47.514906577969604],[7.517459288006065,47.51728104695845],[7.522200236749534,47.514091442409054],[7.530955756497733,47.52904526885427],[7.519353655277215,47.53471778813415],[7.510751927105658,47.528989768842564],[7.50229842095598,47.52840455858729],[7.4980383403841,47.536152181750076],[7.505454651706732,47.54438188661593],[7.516758242758337,47.545408295649786],[7.527317399933993,47.552778846515565],[7.554658254426867,47.564368052237306],[7.5645783501094,47.55703599040843],[7.561243624111692,47.55172275211291],[7.558752685660356,47.55235329499035],[7.555882119169953,47.54433555917895],[7.564785321950861,47.54568625396918],[7.587263056821628,47.54190064304111],[7.582688476068778,47.53246814131337],[7.589482524394103,47.5279230654027],[7.590248428005343,47.51978966346127],[7.594781326929009,47.51929395578897],[7.613780785019665,47.53925099543145],[7.622303281783164,47.53977428916004],[7.622854488041502,47.550040256825795],[7.617740918118178,47.554366555487356],[7.617617220103555,47.558648485827725],[7.632727781497729,47.5614887674157],[7.639973682410965,47.55816478484801],[7.648995462809379,47.548295861439875],[7.661308760240334,47.544832242956765],[7.665860164458853,47.53745814872834],[7.674674254363578,47.5337535789565],[7.694938989531916,47.532496041115465],[7.71346844906592,47.53978344629896],[7.715956243413761,47.53582195507857],[7.723622825374551,47.536754165368905],[7.727157067196862,47.53293048764033],[7.733221863174538,47.53275465944404],[7.737974130690588,47.52732498381306],[7.749022330706917,47.5249849998809],[7.757861753102653,47.52605097450287],[7.787633628417415,47.52011695778467],[7.790143521321244,47.51864117486466],[7.788870069574476,47.50682929074843],[7.792799480290271,47.500684271209245],[7.786625359342518,47.49312139201968],[7.798890147748131,47.49565149600841],[7.798162871694108,47.49939947973339],[7.799400121334925,47.497477088945935],[7.807418124234862,47.4971384859743],[7.814709929059118,47.504801278976316],[7.831976267472122,47.51473657456054],[7.833207588232065,47.53382387257594],[7.846527268275818,47.53266095290337],[7.852330295179702,47.53523506225097],[7.862569292788096,47.52692027402488],[7.86395674074442,47.519309183202445],[7.876658649367283,47.52269034821798],[7.87567113137545,47.51319304945735],[7.893993798731052,47.50605656803392],[7.904769180395594,47.49217505264052],[7.904821911502771,47.48490926161113],[7.93328835504665,47.48140776210853],[7.947015241408695,47.48488995686335],[7.940027875634228,47.462021295570224],[7.948854362289874,47.46377967418039],[7.957614193951437,47.45880646812721],[7.957849013566705,47.451279351685564],[7.946784554043733,47.44319336966537],[7.950032053627354,47.431716361052416],[7.96183169437885,47.421834282667845],[7.956570351591289,47.41968057428149],[7.955037646053525,47.415605646331336],[7.948388855309641,47.4162657867356],[7.934927870271696,47.41176694218953],[7.936722434714782,47.408057452805856],[7.932661510641391,47.40527495151619],[7.909737672400531,47.398520997340924],[7.890221593189976,47.407141074214024],[7.883331964118422,47.40609724771633],[7.883443085719068,47.4012049891245],[7.877702761222016,47.401257097623],[7.869136696167237,47.3955142728722],[7.879434713089799,47.38799354849815],[7.878812180597903,47.38351047538804],[7.862650230995195,47.38198499163919],[7.840119046365023,47.374763282921705],[7.830547227518145,47.36512144155488],[7.80216648325237,47.36109584064414],[7.796366151294341,47.3534705803715],[7.793560892325092,47.33905227137494],[7.78528803737905,47.3378822997136],[7.768963133383802,47.33891408469915],[7.766419194330703,47.342734660857005],[7.751518928544542,47.3443274446774],[7.734153146629586,47.35776074638933],[7.727913718160677,47.36885889855421],[7.701953574259492,47.37244716296033],[7.644203220263186,47.36720838530677],[7.641761060331779,47.38046937860509],[7.635580022356337,47.38059279713257],[7.633316986492583,47.38291397270416],[7.633305398225418,47.38533959871929],[7.637251158279386,47.38606854199808],[7.63272275093214,47.41003108104519],[7.664054730400831,47.41001995588381],[7.679802017668389,47.41751395224505],[7.686578998003315,47.43366406703297],[7.682972441800632,47.43872228466388],[7.684853783500164,47.447843589969715],[7.692273418589347,47.45421309996921],[7.698831030331891,47.45585888435835],[7.699930658071183,47.46190517358485],[7.709877972706822,47.469384739707586],[7.699760966314013,47.48063247960835],[7.668326578902932,47.48634665620256],[7.666120855554305,47.49686816039971],[7.65217109717027,47.49581439933043],[7.648646287658441,47.49183004211102],[7.655389581170213,47.49020559719241],[7.650513795302598,47.48826095607083],[7.655925875394832,47.48739459757455],[7.644422678687097,47.485637798180356],[7.640965961473804,47.482734093980326],[7.607299799570857,47.48939839412024],[7.608850381582776,47.48352506892989],[7.605631268762133,47.47935909729055],[7.608148977008936,47.475213682276376],[7.604494899927722,47.47044546774548],[7.618872436050056,47.4674530520825],[7.626072253389216,47.462913883669614],[7.62217338539308,47.46195224188912],[7.616464591762502,47.445234574416695],[7.615798850305441,47.432747890966844],[7.592069133423196,47.43271179535717],[7.581206884670679,47.42878068945942],[7.578423275099778,47.434906655087865],[7.568904367023134,47.43689695884281],[7.56829539909203,47.42233486107083],[7.58074128785892,47.414703988151935],[7.525235194936931,47.41163289737562],[7.531172340312734,47.40352507464003],[7.518616677418122,47.38822295597742],[7.511295677347134,47.38974369796625],[7.502255661148456,47.384806980223004],[7.492327480628366,47.385231761698726],[7.478410241257615,47.39055778320416],[7.47746817801916,47.401277162725364],[7.464484018734026,47.40251498235377],[7.460919593518167,47.40068414452088],[7.450020783333588,47.40392739156406],[7.44951323519806,47.39975827367453],[7.443401098004909,47.40231427489849],[7.441311347159463,47.40017886074712],[7.443566657511773,47.38890284041263],[7.437324174770898,47.3808884773088],[7.411692544769116,47.38057235919037],[7.416276198506335,47.384788794341716],[7.414494030814171,47.39429988358522],[7.398935569419335,47.39683906243558],[7.395920463999715,47.40338304393273],[7.388693876865087,47.403019088497395],[7.384054886906365,47.4123601395877],[7.379679679870605,47.4128137535428],[7.375844120979309,47.41401169352981],[7.370281219482422,47.413684985326796]]],"terms_url":"http://www.geo.bl.ch/fileadmin/user_upload/Geodaten/Nutzungsbedingungen_GBD_BL_V3p1.pdf","terms_text":"Geodaten des Kantons Basel-Landschaft 2015","best":true},{"id":"KTBASELSTADT2015","name":"Kanton Basel-Stadt 2015","type":"tms","template":"https://mapproxy.osm.ch/tiles/KTBASELSTADT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2015-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[8,21],"polygon":[[[7.492,47.4817],[7.492,47.6342],[7.784,47.6342],[7.784,47.4817],[7.492,47.4817]]],"terms_text":"Kanton Basel-Stadt OF 2015"},{"id":"KTBASELSTADT2017","name":"Kanton Basel-Stadt 2017","type":"tms","template":"https://mapproxy.osm.ch/tiles/KTBASELSTADT2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2017-01-01T00:00:00.000Z","startDate":"2017-01-01T00:00:00.000Z","scaleExtent":[8,21],"polygon":[[[7.6713752,47.5952248],[7.6799583,47.6007811],[7.6845073,47.6018228],[7.6943779,47.601707],[7.6939487,47.5966718],[7.6870823,47.5935462],[7.6788425,47.5871208],[7.685709,47.585384],[7.6890564,47.5761205],[7.6941204,47.573399],[7.6924038,47.5669132],[7.6847005,47.5617009],[7.6642513,47.5616429],[7.6487159,47.5568934],[7.6303482,47.558689],[7.6235675,47.5566617],[7.6278591,47.5514483],[7.6273763,47.5365801],[7.6183319,47.5366163],[7.6133537,47.5326179],[7.5996208,47.5191137],[7.5850296,47.5191717],[7.5840854,47.5263589],[7.5771331,47.5316327],[7.581253,47.5398612],[7.5718975,47.5414835],[7.553873,47.5414835],[7.5537872,47.5512166],[7.5565338,47.5582836],[7.5537014,47.5603108],[7.5537872,47.5747308],[7.5643444,47.5812157],[7.5793647,47.579884],[7.583313,47.5901889],[7.5856304,47.5923306],[7.5920677,47.5923885],[7.598505,47.5907098],[7.609148,47.5864261],[7.6092338,47.5810999],[7.6191043,47.580463],[7.6368713,47.593141],[7.6378154,47.595572],[7.6416778,47.5988711],[7.6452827,47.6002602],[7.664938,47.5961798],[7.6713752,47.5952248]]],"terms_text":"Kanton Basel-Stadt OF 2017","best":true},{"id":"Solothurn-sogis2014-tms","name":"Kanton Solothurn (SOGIS)","type":"tms","template":"https://mapproxy.osm.ch/tiles/sogis2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2017-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[15,19],"polygon":[[[7.9559502,47.4716195],[7.9823893,47.4715536],[7.9823893,47.453533],[7.9955263,47.453533],[7.995209,47.4174733],[8.0218003,47.4174304],[8.0215465,47.3993483],[8.0345565,47.3992624],[8.0346835,47.3902835],[8.0478839,47.3902236],[8.0476936,47.3722351],[8.0345565,47.372321],[8.0343661,47.3543954],[8.0211657,47.3542664],[8.0207214,47.3273881],[7.9944474,47.3274741],[7.994257,47.318569],[7.9677291,47.3186551],[7.9676656,47.3096624],[7.9412227,47.3097751],[7.9413282,47.3277752],[7.9148637,47.3278613],[7.9146733,47.3098775],[7.9015998,47.3100497],[7.9014015,47.3009748],[7.8750084,47.3010986],[7.8750084,47.2922321],[7.861655,47.292122],[7.8615371,47.2740879],[7.8483207,47.2741634],[7.8482988,47.2652268],[7.8350156,47.2651964],[7.8350156,47.2562425],[7.7953454,47.2563643],[7.7953005,47.2474089],[7.7292435,47.2475612],[7.7292884,47.2565166],[7.7162295,47.2566689],[7.7161847,47.2655923],[7.7030361,47.2655923],[7.7030361,47.2746055],[7.6897529,47.2746664],[7.6898875,47.2836781],[7.6634108,47.2837085],[7.6633211,47.2746968],[7.6105472,47.2747577],[7.6104126,47.2478658],[7.6235163,47.2477691],[7.6235612,47.2387871],[7.6498584,47.2387566],[7.649993,47.2297678],[7.6499025,47.2208313],[7.6630766,47.220732],[7.6631044,47.2117803],[7.6629675,47.2027317],[7.6761677,47.2026985],[7.6762267,47.1937182],[7.6893753,47.1936878],[7.6892406,47.1757237],[7.7024341,47.1756017],[7.7023444,47.14869],[7.6626742,47.1488121],[7.6628088,47.1397774],[7.6363322,47.1398995],[7.6364668,47.14869],[7.5967967,47.1489341],[7.5968415,47.1399606],[7.5704098,47.1399911],[7.5704216,47.1579174],[7.5573628,47.1579479],[7.5573179,47.1488843],[7.5442142,47.1489453],[7.5441693,47.1399107],[7.5309759,47.1399107],[7.5309535,47.1309652],[7.5176703,47.1309652],[7.5176478,47.121959],[7.5176927,47.1129198],[7.4913057,47.1130114],[7.4913506,47.1040318],[7.478202,47.1040013],[7.4781282,47.0770534],[7.4649349,47.0770839],[7.4649797,47.0680676],[7.4255179,47.0680065],[7.4254282,47.0860069],[7.372789,47.0859763],[7.3728787,47.1040318],[7.3595955,47.1040318],[7.3595506,47.1309967],[7.4122796,47.1309967],[7.4122347,47.1490064],[7.4253833,47.1490064],[7.4255179,47.1580089],[7.3726992,47.157965],[7.3726992,47.1849769],[7.3462674,47.1849159],[7.3463572,47.2028721],[7.333074,47.2029026],[7.333074,47.2209598],[7.346142,47.2209598],[7.346142,47.2299135],[7.3725646,47.2299135],[7.3726992,47.2389023],[7.3989964,47.2389632],[7.399131,47.2479201],[7.4122796,47.2479201],[7.4122796,47.2659206],[7.45186,47.2658901],[7.4519497,47.2749033],[7.4650534,47.2749337],[7.4650983,47.2838541],[7.4782918,47.2838541],[7.4783367,47.2929251],[7.504596,47.2928845],[7.5047307,47.3018322],[7.5312002,47.3018119],[7.53129,47.3197941],[7.5444835,47.3198549],[7.5445283,47.3287981],[7.5576769,47.3288285],[7.5576769,47.3378614],[7.5312451,47.3378614],[7.5313349,47.3558617],[7.5180068,47.3558313],[7.5180965,47.3648291],[7.3987991,47.3648373],[7.3988853,47.3918171],[7.3856422,47.391813],[7.3856361,47.4008028],[7.3723427,47.4007987],[7.3723427,47.4097769],[7.3458375,47.4097769],[7.3458375,47.4187804],[7.3192515,47.4187804],[7.3192515,47.4457788],[7.4121035,47.4457788],[7.4121035,47.4907816],[7.4253513,47.4907816],[7.4253513,47.4998066],[7.4385572,47.4998066],[7.4385572,47.5087647],[7.4917722,47.5087647],[7.4917832,47.6346827],[7.7844981,47.6342779],[7.7841548,47.5712255],[7.8107408,47.5711386],[7.8107408,47.5621621],[7.8239482,47.5620566],[7.8238715,47.5441362],[7.8636799,47.5439699],[7.8636317,47.5349751],[7.8767918,47.5349474],[7.8767504,47.5259917],[7.8900971,47.5259637],[7.8900555,47.5169501],[7.9031858,47.5169225],[7.9031025,47.4988609],[7.9164877,47.4988327],[7.9164458,47.4897557],[7.9561223,47.4896722],[7.9559502,47.4716195]]],"terms_text":"Orthofoto WMS Solothurn","best":true,"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAIVBMVEX///+LKCbMAABycnL+/v7v7+9sbGz39/fz8/Pw8PD8/Pz60siYAAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AIGAsXN84mS+sAAAA4SURBVAjXY2AUBAMBBkYlMCCXwcwABgZYGCwGIJo5AMQGAjYgLgYxLICY05iBwRisjsvY2IGBAQAGpQmjMKkg/wAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNi0wOC0yNFQxMToyMzo1NS0wNDowMLEFqzIAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTYtMDgtMjRUMTE6MjM6NTUtMDQ6MDDAWBOOAAAAAElFTkSuQmCC"},{"id":"Solothurn-infrared-SOGIS","name":"Kanton Solothurn Infrarot (SOGIS)","type":"wms","template":"http://geoweb.so.ch/wms/sogis_orthofoto.wms?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Orthofoto_CIR_SO&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:4326","endDate":"2017-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[15,19],"polygon":[[[7.5704216,47.1579174],[7.5573628,47.1579479],[7.5573179,47.1488843],[7.5442142,47.1489453],[7.5441693,47.1399107],[7.5309759,47.1399107],[7.530931,47.121959],[7.5176478,47.121959],[7.5176927,47.1129198],[7.4913057,47.1130114],[7.4913506,47.1040318],[7.478202,47.1040013],[7.4781572,47.094959],[7.4914404,47.0949896],[7.4913955,47.0770227],[7.4781572,47.0770533],[7.478202,47.068037],[7.4255179,47.0680065],[7.4254282,47.0860069],[7.372789,47.0859763],[7.3728787,47.1040318],[7.3595955,47.1040318],[7.3595506,47.1309967],[7.4122796,47.1309967],[7.4122347,47.1490064],[7.4253833,47.1490064],[7.4255179,47.1580089],[7.399131,47.1580394],[7.399131,47.1490064],[7.3726992,47.1489758],[7.3726992,47.1849769],[7.3462674,47.1849159],[7.3463572,47.1939124],[7.333074,47.1939429],[7.333074,47.2299135],[7.3725646,47.2299135],[7.3726992,47.2389023],[7.3989964,47.2389632],[7.399131,47.2479201],[7.4122796,47.2479201],[7.4122796,47.2659206],[7.45186,47.2658901],[7.4519497,47.2749033],[7.4650534,47.2749337],[7.4650983,47.2838541],[7.4782918,47.2838541],[7.4783367,47.2929251],[7.4914852,47.2928946],[7.4916199,47.3018423],[7.5312002,47.3018119],[7.53129,47.3197941],[7.5444835,47.3198549],[7.5445283,47.3287981],[7.5576769,47.3288285],[7.5576769,47.3378614],[7.5312451,47.3378614],[7.5313349,47.3558617],[7.5180068,47.3558313],[7.5180965,47.3648291],[7.4386216,47.3649203],[7.4386665,47.3738862],[7.4253833,47.373947],[7.4254282,47.4008052],[7.3855786,47.4008963],[7.3856683,47.4097954],[7.3591468,47.4097954],[7.3591468,47.418784],[7.3723851,47.4188447],[7.3724748,47.4368174],[7.3857132,47.4368174],[7.3857132,47.4410365],[7.3956307,47.4401563],[7.3963039,47.4425844],[7.4076125,47.4410972],[7.4079267,47.4422505],[7.403125,47.442463],[7.3973809,47.4433128],[7.3983233,47.4458318],[7.412145,47.4458318],[7.4122796,47.4547839],[7.4386665,47.454875],[7.4388012,47.47053],[7.450065,47.4694076],[7.450065,47.4722287],[7.4464749,47.4722287],[7.4464749,47.473806],[7.4429297,47.473897],[7.4428848,47.4755349],[7.439205,47.4755956],[7.439205,47.4772032],[7.4355701,47.4772941],[7.4354803,47.4789926],[7.4173954,47.4789623],[7.4174403,47.4857254],[7.4209855,47.4857254],[7.4210752,47.4908199],[7.4276271,47.4907289],[7.4285246,47.4934882],[7.4309928,47.4964293],[7.4348521,47.4988852],[7.4418976,47.4955197],[7.4466544,47.4945495],[7.4501098,47.4917599],[7.4508727,47.4906986],[7.4645149,47.4907289],[7.4645598,47.4890308],[7.4681947,47.4890005],[7.4681947,47.4856648],[7.4718746,47.4857254],[7.4719194,47.4823288],[7.4826896,47.4823895],[7.4826447,47.4838755],[7.4862348,47.4839665],[7.4863694,47.4856648],[7.4899146,47.4856648],[7.4900043,47.4906986],[7.4996975,47.4907289],[7.4996526,47.491396],[7.4917545,47.4919418],[7.4917545,47.4951256],[7.4982166,47.494792],[7.4988897,47.4958533],[7.4956587,47.4962777],[7.4917096,47.4962474],[7.4917994,47.4997341],[7.5050377,47.4997038],[7.5050377,47.5087377],[7.5447976,47.5087074],[7.5447426,47.4548204],[7.4916868,47.4546917],[7.4917503,47.445808],[7.4652859,47.4457651],[7.4652224,47.409829],[7.4915599,47.409786],[7.4917503,47.3919161],[7.5048873,47.3918302],[7.5048873,47.40068],[7.5182147,47.4007659],[7.5183416,47.4187616],[7.5579431,47.4187187],[7.5581335,47.445808],[7.5845344,47.4457222],[7.5844075,47.4366653],[7.6109354,47.4366224],[7.6109988,47.4637025],[7.5976714,47.4637025],[7.5979253,47.4996448],[7.6243263,47.4996877],[7.6244532,47.4905972],[7.6377806,47.4905543],[7.6378441,47.4996019],[7.6775724,47.4994733],[7.6774455,47.4904686],[7.7038465,47.4904257],[7.7039099,47.4814623],[7.7171104,47.4812907],[7.7171104,47.45452],[7.7039734,47.45452],[7.7038465,47.4455934],[7.6904556,47.4455076],[7.6903287,47.4095713],[7.6771282,47.4094854],[7.6771282,47.40068],[7.6506638,47.40068],[7.6504734,47.3736534],[7.6770647,47.3735674],[7.6770647,47.3825062],[7.7166661,47.3825062],[7.7167931,47.3734385],[7.7430671,47.3733955],[7.7430671,47.3553843],[7.7562041,47.3553413],[7.7563311,47.3463979],[7.7826051,47.3462689],[7.7829224,47.3643262],[7.7961229,47.3642832],[7.7961863,47.3732666],[7.8226508,47.3731376],[7.8227142,47.3822914],[7.8491152,47.3821195],[7.8492421,47.3910568],[7.8625061,47.3909709],[7.862633,47.4090559],[7.8758969,47.40897],[7.8760239,47.4180316],[7.9024248,47.4179457],[7.9024248,47.40897],[7.9288892,47.4087982],[7.9291431,47.4178169],[7.9421532,47.4176881],[7.9426609,47.4627586],[7.9559248,47.462587],[7.9561152,47.4716394],[7.9823893,47.4715536],[7.9823893,47.453533],[7.9955263,47.453533],[7.995209,47.4174733],[8.0218003,47.4174304],[8.0215465,47.3993483],[8.0345565,47.3992624],[8.0346835,47.3902835],[8.0478839,47.3901546],[8.0476936,47.3722351],[8.0345565,47.372321],[8.0343661,47.3543954],[8.0211657,47.3542664],[8.0207214,47.3273881],[7.9944474,47.3274741],[7.994257,47.318569],[7.9677291,47.3186551],[7.9676656,47.3096624],[7.9412012,47.3099206],[7.9413282,47.3277752],[7.9148637,47.3278613],[7.9146733,47.3098775],[7.9015998,47.3100497],[7.9014015,47.3009748],[7.8750084,47.3010986],[7.8750084,47.2922321],[7.861655,47.292122],[7.8615371,47.2740879],[7.8484334,47.2741488],[7.8482988,47.2652268],[7.8350156,47.2651964],[7.8350156,47.2562425],[7.7953454,47.2563643],[7.7953005,47.2474089],[7.7292435,47.2475612],[7.7292884,47.2565166],[7.7162295,47.2566689],[7.7161847,47.2655923],[7.7030361,47.2655923],[7.7030361,47.2746055],[7.6897529,47.2746664],[7.6898875,47.2836781],[7.6634108,47.2837085],[7.6633211,47.2746968],[7.6105472,47.2747577],[7.6104126,47.2478658],[7.6235163,47.2476526],[7.6235612,47.2387871],[7.6498584,47.2387566],[7.649993,47.2297678],[7.6630518,47.2297068],[7.6631044,47.2117803],[7.6762081,47.2116888],[7.6762267,47.1937182],[7.6893753,47.1936878],[7.6892406,47.1757237],[7.7024341,47.1756017],[7.702479,47.1666326],[7.7156724,47.1666326],[7.7155827,47.1576926],[7.7023892,47.1576621],[7.7023444,47.14869],[7.6626742,47.1488121],[7.6628088,47.1397774],[7.6363322,47.1398995],[7.6364668,47.14869],[7.5967967,47.1489341],[7.5968415,47.1399606],[7.5704098,47.1399911],[7.5704216,47.1579174]]],"terms_text":"Orthofoto WMS Solothurn","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAIVBMVEX///+LKCbMAABycnL+/v7v7+9sbGz39/fz8/Pw8PD8/Pz60siYAAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AIGAsXN84mS+sAAAA4SURBVAjXY2AUBAMBBkYlMCCXwcwABgZYGCwGIJo5AMQGAjYgLgYxLICY05iBwRisjsvY2IGBAQAGpQmjMKkg/wAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNi0wOC0yNFQxMToyMzo1NS0wNDowMLEFqzIAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTYtMDgtMjRUMTE6MjM6NTUtMDQ6MDDAWBOOAAAAAElFTkSuQmCC"},{"id":"KTTHURGAU2017","name":"Kanton Thurgau OF 2017","type":"tms","template":"https://mapproxy.osm.ch/tiles/KTTHURGAU2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[8,21],"polygon":[[[8.63768410076,47.7004145356],[8.78327839646,47.69879895418],[8.78303977274,47.68533252804],[8.87027412213,47.68426691888],[8.8699714813,47.67089514045],[8.89900814897,47.67047199109],[8.89866777324,47.65698230742],[8.92770444091,47.65661195321],[8.92828046137,47.67015462681],[8.95726476355,47.66973147144],[8.95773605301,47.68327074156],[9.19060541482,47.6799391377],[9.1902650391,47.66645190099],[9.21922315852,47.6660287156],[9.21898751379,47.65255552096],[9.24784090222,47.65209694793],[9.24747434375,47.63863780005],[9.30570477557,47.63764983607],[9.30525966885,47.62420461255],[9.33416542278,47.62371049645],[9.33348467133,47.59673879302],[9.39150564117,47.59576769355],[9.3911390827,47.58234701941],[9.42007101938,47.58176420165],[9.41860478548,47.54139270755],[9.44753672216,47.5408447841],[9.44717016368,47.52730395336],[9.47604973486,47.52680892203],[9.47518570418,47.49985802607],[9.5041438236,47.49934504674],[9.50309651368,47.47241544181],[9.41596032792,47.47391975877],[9.41554140395,47.46045016443],[9.35759898235,47.4614060707],[9.35817500281,47.47498160364],[9.32895505591,47.47533554716],[9.32864086293,47.46188401733],[9.18361462107,47.46420288184],[9.18411209329,47.47768921094],[9.15491832913,47.47809622481],[9.15465650165,47.4646277009],[9.0673632194,47.46583133624],[9.06717994017,47.45234196418],[9.0960856941,47.45193475084],[9.09582386661,47.43853036098],[9.06663010246,47.43883142176],[9.06642064047,47.42537055101],[9.00829493964,47.42620309948],[9.00714289872,47.385729558],[8.97810623105,47.38615501083],[8.97739929685,47.3591319418],[8.91940450976,47.35989459356],[8.92032090594,47.38697045248],[8.89136278652,47.38725408141],[8.89285520316,47.44116901155],[8.86397563198,47.44148776574],[8.86604406908,47.52251256102],[8.80783982,47.52316676216],[8.80893949543,47.56372896753],[8.77985046226,47.56402931121],[8.78024320348,47.57750766919],[8.7220913199,47.57814352175],[8.72337427456,47.63212747913],[8.66519620823,47.63272738003],[8.66579841143,47.65980396746],[8.63673556102,47.65999795099],[8.63768410076,47.7004145356]]],"terms_text":"Kanton Thurgau OF 2017","best":true},{"id":"KTZUERICH2015","name":"Kanton Zürich 2015  10cm","type":"tms","template":"https://mapproxy.osm.ch/tiles/KTZUERICH2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2015-01-01T00:00:00.000Z","startDate":"2014-01-01T00:00:00.000Z","scaleExtent":[8,21],"polygon":[[[8.807601928710938,47.66608099332474],[8.808631896972656,47.65475043477393],[8.830604553222656,47.648506014952225],[8.805885314941406,47.597597727711346],[8.749580383300781,47.61565270219988],[8.751983642578125,47.59505101193038],[8.807945251464844,47.585789182379905],[8.811721801757812,47.57467282332527],[8.840904235839844,47.57467282332527],[8.854637145996094,47.56216409801383],[8.8330078125,47.55382328811835],[8.845024108886719,47.53458802782819],[8.899612426757812,47.52786561031842],[8.895835876464844,47.491224888201955],[8.902702331542969,47.48588897929538],[8.887252807617188,47.475911695481756],[8.911285400390625,47.43969913094723],[8.934288024902344,47.43807362350206],[8.935317993164062,47.43017758727173],[8.917121887207031,47.42808726171425],[8.909912109375,47.404855836246135],[8.944587707519531,47.38905261221537],[8.945274353027344,47.379521907289295],[8.963127136230469,47.357664518690434],[8.973083496093748,47.35580389715929],[8.989906311035156,47.31857768821123],[8.973426818847656,47.30367985581531],[8.9593505859375,47.300653220457775],[8.941154479980469,47.2873805430142],[8.950080871582031,47.28458587064588],[8.940467834472656,47.259194168186234],[8.876266479492188,47.24847474828181],[8.876609802246092,47.243114224640834],[8.850173950195312,47.23961793870555],[8.849830627441406,47.247076403108416],[8.825111389160156,47.24824169331652],[8.800048828125,47.24031721435106],[8.804855346679688,47.23425651880584],[8.815155029296875,47.217702626593784],[8.793525695800781,47.21886856286133],[8.71490478515625,47.20021050593422],[8.685722351074219,47.18154588528182],[8.697395324707031,47.163108130899104],[8.660659790039062,47.15633823511178],[8.6572265625,47.16684287656919],[8.618087768554688,47.172444502751944],[8.622550964355469,47.17991241867412],[8.607101440429688,47.201376826785406],[8.595085144042969,47.19834433924206],[8.575859069824219,47.21513747655813],[8.541183471679688,47.2186353776589],[8.471488952636719,47.2053421258966],[8.441619873046875,47.22120035848172],[8.417243957519531,47.22120035848172],[8.383941650390625,47.292270864380086],[8.422050476074219,47.302282968719936],[8.442306518554688,47.32439601339355],[8.413810729980469,47.32299967378833],[8.408660888671875,47.33067908487908],[8.378448486328125,47.39718721653071],[8.360939025878906,47.39695481668995],[8.359222412109375,47.4053205652024],[8.379135131835938,47.40764414848437],[8.377418518066406,47.41624051540972],[8.384284973144531,47.42274494145051],[8.372611999511719,47.42808726171425],[8.372955322265625,47.437376962080776],[8.379478454589844,47.45037978769006],[8.36402893066406,47.46198673754625],[8.352012634277344,47.5079250985124],[8.373985290527344,47.517200697839414],[8.392181396484375,47.5366741201253],[8.417587280273436,47.56610235225701],[8.430290222167967,47.5693453981427],[8.491744995117188,47.581620824334166],[8.487625122070312,47.58648387645128],[8.463935852050781,47.58301031389572],[8.453292846679688,47.60315376826432],[8.479385375976562,47.617504142079596],[8.505821228027344,47.61958693358351],[8.513717651367188,47.635783590864854],[8.542213439941406,47.632776019724375],[8.545646667480469,47.627685889602006],[8.564186096191406,47.6256034207548],[8.566932678222656,47.61935551640258],[8.576202392578125,47.613569753973955],[8.564872741699219,47.60037582174319],[8.535346984863281,47.586715439092906],[8.550109863281248,47.5714301073211],[8.555259704589844,47.55498181333744],[8.581008911132812,47.59551406038282],[8.598861694335936,47.61449551898437],[8.59130859375,47.64642437575518],[8.609848022460938,47.65521295468833],[8.620834350585938,47.646886969413],[8.618431091308594,47.65660048985082],[8.602981567382812,47.666312203609145],[8.610877990722656,47.67856488312544],[8.62323760986328,47.67856488312544],[8.621864318847656,47.69312564683551],[8.64898681640625,47.697516190510555],[8.667526245117188,47.68665469810477],[8.671646118164062,47.67602211074509],[8.692245483398438,47.65197522925437],[8.734817504882812,47.64526787368664],[8.777389526367188,47.65313158281113],[8.785629272460938,47.667930646923494],[8.807601928710938,47.66608099332474]]],"terms_text":"Kanton Zürich OF 2015","best":true},{"id":"kartverket-friluft","name":"Kartverket Hiking Trails","type":"wms","template":"https://wms.geonorge.no/skwms1/wms.friluftsruter2?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Fotrute&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","scaleExtent":[6,24],"polygon":[[[31.904253,70.4368136],[28.4765186,71.3289643],[23.6865015,71.2514263],[16.8090601,70.0730823],[11.1620655,67.5253903],[9.975542,64.811576],[4.2187061,62.1449966],[4.3725367,59.1871966],[6.1743055,57.8915032],[7.932118,57.7393554],[10.777577,58.8649103],[11.7224012,58.762509],[12.722157,60.1141506],[13.0517469,61.3493518],[12.5243921,63.6169922],[14.2382593,63.9856094],[15.1171656,65.9016624],[18.6987085,68.3749083],[20.0610132,68.2612583],[21.0058375,68.7841518],[25.2465601,68.3506025],[26.9384546,69.8472011],[28.7621851,69.6112133],[28.5864039,68.8556004],[31.069314,69.5191547],[31.904253,70.4368136]]],"terms_url":"https://kartverket.no/geodataarbeid/temadata/nasjonal-database-for-tur--og-friluftsruter/","terms_text":"© Kartverket","description":"Hiking trails from the Norwegian database `Tur- og Friluftsruter´, including DNT routes.","icon":"https://www.kartverket.no/Content/Images/logo-graphic-512.png","overlay":true},{"id":"kartverket-topo4","name":"Kartverket N50 topo","type":"tms","template":"http://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=topo4&zoom={zoom}&x={x}&y={y}","scaleExtent":[3,15],"polygon":[[[31.904253,70.4368136],[28.4765186,71.3289643],[23.6865015,71.2514263],[16.8090601,70.0730823],[11.1620655,67.5253903],[9.975542,64.811576],[4.2187061,62.1449966],[4.3725367,59.1871966],[6.1743055,57.8915032],[7.932118,57.7393554],[10.777577,58.8649103],[11.7224012,58.762509],[12.722157,60.1141506],[13.0517469,61.3493518],[12.5243921,63.6169922],[14.2382593,63.9856094],[15.1171656,65.9016624],[18.6987085,68.3749083],[20.0610132,68.2612583],[21.0058375,68.7841518],[25.2465601,68.3506025],[26.9384546,69.8472011],[28.7621851,69.6112133],[28.5864039,68.8556004],[31.069314,69.5191547],[31.904253,70.4368136]]],"terms_url":"https://wiki.openstreetmap.org/wiki/No:Kartverket_import","terms_text":"© Kartverket","description":"Topographic map N50, equivalent to Norway 1:50.000 paper map series.","icon":"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{"id":"kartverket-vegnett","name":"Kartverket Road Network","type":"wms","template":"http://openwms.statkart.no/skwms1/wms.vegnett?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=all&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","scaleExtent":[3,24],"polygon":[[[31.904253,70.4368136],[28.4765186,71.3289643],[23.6865015,71.2514263],[16.8090601,70.0730823],[11.1620655,67.5253903],[9.975542,64.811576],[4.2187061,62.1449966],[4.3725367,59.1871966],[6.1743055,57.8915032],[7.932118,57.7393554],[10.777577,58.8649103],[11.7224012,58.762509],[12.722157,60.1141506],[13.0517469,61.3493518],[12.5243921,63.6169922],[14.2382593,63.9856094],[15.1171656,65.9016624],[18.6987085,68.3749083],[20.0610132,68.2612583],[21.0058375,68.7841518],[25.2465601,68.3506025],[26.9384546,69.8472011],[28.7621851,69.6112133],[28.5864039,68.8556004],[31.069314,69.5191547],[31.904253,70.4368136]]],"terms_url":"https://www.kartverket.no/data/kartdata/vegdata/","terms_text":"© Kartverket","description":"Norwegian road network from the National Road database (NVDB). Colours represent national, county, municipal, private and forest roads + footways/cycleways.","icon":"https://www.kartverket.no/Content/Images/logo-graphic-512.png","overlay":true},{"id":"kelowna_2012","name":"Kelowna 2012","type":"tms","template":"http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna2012/{zoom}/{x}/{y}.png","endDate":"2012-05-14T00:00:00.000Z","startDate":"2012-05-13T00:00:00.000Z","scaleExtent":[9,20],"polygon":[[[-119.5867318,49.7928087],[-119.5465655,49.7928097],[-119.5465661,49.8013837],[-119.5343374,49.8013841],[-119.5343376,49.8047321],[-119.5296211,49.8047322],[-119.5296216,49.8119555],[-119.5104463,49.811956],[-119.5115683,49.8744325],[-119.5108946,49.8744904],[-119.5114111,49.8843312],[-119.5114115,49.9221763],[-119.49386,49.9223477],[-119.4940505,49.9313031],[-119.4803936,49.9317529],[-119.4804572,49.9407474],[-119.4666732,49.9409927],[-119.4692775,49.9913717],[-119.4551337,49.9916078],[-119.4556736,50.0121242],[-119.4416673,50.0123895],[-119.4417308,50.0136345],[-119.4221492,50.0140377],[-119.4221042,50.0119306],[-119.4121303,50.012165],[-119.4126082,50.0216913],[-119.4123387,50.0216913],[-119.4124772,50.0250773],[-119.4120917,50.0250821],[-119.4121954,50.0270769],[-119.4126083,50.0270718],[-119.4128328,50.0321946],[-119.3936313,50.0326418],[-119.393529,50.0307781],[-119.3795727,50.0310116],[-119.3795377,50.0287584],[-119.3735764,50.0288621],[-119.371544,49.9793618],[-119.3573506,49.9793618],[-119.3548353,49.9256081],[-119.3268079,49.9257238],[-119.3256573,49.8804068],[-119.3138893,49.8806528],[-119.3137097,49.8771651],[-119.3132156,49.877223],[-119.3131482,49.8749652],[-119.312452,49.8749073],[-119.3122275,49.87236],[-119.3117558,49.872331],[-119.3115986,49.8696098],[-119.3112169,49.8694217],[-119.3109199,49.8632417],[-119.3103721,49.8632724],[-119.3095139,49.8512388],[-119.3106368,49.8512316],[-119.3103859,49.8462564],[-119.3245344,49.8459957],[-119.3246018,49.8450689],[-119.3367018,49.844875],[-119.3367467,49.8435136],[-119.337937,49.8434702],[-119.3378023,49.8382055],[-119.3383637,49.8381041],[-119.3383749,49.8351202],[-119.3390936,49.8351058],[-119.3388016,49.8321217],[-119.3391497,49.8320565],[-119.3391722,49.8293331],[-119.3394641,49.8293331],[-119.3395879,49.8267878],[-119.3500053,49.8265829],[-119.3493701,49.8180588],[-119.4046964,49.8163785],[-119.4045694,49.8099022],[-119.4101592,49.8099022],[-119.4102862,49.8072787],[-119.4319467,49.8069098],[-119.4322643,49.7907965],[-119.4459847,49.7905504],[-119.445286,49.7820201],[-119.4967376,49.7811587],[-119.4966105,49.7784927],[-119.5418371,49.7775082],[-119.5415892,49.7718277],[-119.5560296,49.7714941],[-119.5561194,49.7718422],[-119.5715704,49.7715086],[-119.5716153,49.7717262],[-119.5819235,49.7714941],[-119.5820133,49.7717697],[-119.5922991,49.7715231],[-119.592344,49.7718132],[-119.6003839,49.7715957],[-119.6011924,49.7839081],[-119.5864365,49.7843863],[-119.5867318,49.7928087]]],"description":"High quality aerial imagery taken for the City of Kelowna"},{"id":"kelowna_roads","name":"Kelowna Roads overlay","type":"tms","template":"http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna_overlay/{zoom}/{x}/{y}.png","scaleExtent":[9,20],"polygon":[[[-119.5867318,49.7928087],[-119.5465655,49.7928097],[-119.5465661,49.8013837],[-119.5343374,49.8013841],[-119.5343376,49.8047321],[-119.5296211,49.8047322],[-119.5296216,49.8119555],[-119.5104463,49.811956],[-119.5115683,49.8744325],[-119.5108946,49.8744904],[-119.5114111,49.8843312],[-119.5114115,49.9221763],[-119.49386,49.9223477],[-119.4940505,49.9313031],[-119.4803936,49.9317529],[-119.4804572,49.9407474],[-119.4666732,49.9409927],[-119.4692775,49.9913717],[-119.4551337,49.9916078],[-119.4556736,50.0121242],[-119.4416673,50.0123895],[-119.4417308,50.0136345],[-119.4221492,50.0140377],[-119.4221042,50.0119306],[-119.4121303,50.012165],[-119.4126082,50.0216913],[-119.4123387,50.0216913],[-119.4124772,50.0250773],[-119.4120917,50.0250821],[-119.4121954,50.0270769],[-119.4126083,50.0270718],[-119.4128328,50.0321946],[-119.3936313,50.0326418],[-119.393529,50.0307781],[-119.3795727,50.0310116],[-119.3795377,50.0287584],[-119.3735764,50.0288621],[-119.371544,49.9793618],[-119.3573506,49.9793618],[-119.3548353,49.9256081],[-119.3268079,49.9257238],[-119.3256573,49.8804068],[-119.3138893,49.8806528],[-119.3137097,49.8771651],[-119.3132156,49.877223],[-119.3131482,49.8749652],[-119.312452,49.8749073],[-119.3122275,49.87236],[-119.3117558,49.872331],[-119.3115986,49.8696098],[-119.3112169,49.8694217],[-119.3109199,49.8632417],[-119.3103721,49.8632724],[-119.3095139,49.8512388],[-119.3106368,49.8512316],[-119.3103859,49.8462564],[-119.3245344,49.8459957],[-119.3246018,49.8450689],[-119.3367018,49.844875],[-119.3367467,49.8435136],[-119.337937,49.8434702],[-119.3378023,49.8382055],[-119.3383637,49.8381041],[-119.3383749,49.8351202],[-119.3390936,49.8351058],[-119.3388016,49.8321217],[-119.3391497,49.8320565],[-119.3391722,49.8293331],[-119.3394641,49.8293331],[-119.3395879,49.8267878],[-119.3500053,49.8265829],[-119.3493701,49.8180588],[-119.4046964,49.8163785],[-119.4045694,49.8099022],[-119.4101592,49.8099022],[-119.4102862,49.8072787],[-119.4319467,49.8069098],[-119.4322643,49.7907965],[-119.4459847,49.7905504],[-119.445286,49.7820201],[-119.4967376,49.7811587],[-119.4966105,49.7784927],[-119.5418371,49.7775082],[-119.5415892,49.7718277],[-119.5560296,49.7714941],[-119.5561194,49.7718422],[-119.5715704,49.7715086],[-119.5716153,49.7717262],[-119.5819235,49.7714941],[-119.5820133,49.7717697],[-119.5922991,49.7715231],[-119.592344,49.7718132],[-119.6003839,49.7715957],[-119.6011924,49.7839081],[-119.5864365,49.7843863],[-119.5867318,49.7928087]]],"overlay":true},{"id":"landsat_233055","name":"Landsat 233055","type":"tms","template":"http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_233055/{zoom}/{x}/{y}.png","endDate":"2013-09-03T00:00:00.000Z","startDate":"2013-09-03T00:00:00.000Z","scaleExtent":[5,14],"polygon":[[[-60.8550011,6.1765004],[-60.4762612,7.9188291],[-62.161689,8.2778675],[-62.5322549,6.5375488],[-60.8550011,6.1765004]]],"description":"Recent Landsat imagery"},{"id":"lu.geoportail.opendata.ortholatest","name":"Latest available ortho geoportail.lu","type":"tms","template":"http://{switch:wmts1,wmts2}.geoportail.lu/opendata/wmts/ortho_latest/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg","endDate":"2017-06-22T00:00:00.000Z","startDate":"2017-06-14T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","best":true,"icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"landsat_047026","name":"Latest southwest British Columbia Landsat","type":"tms","template":"http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_047026/{zoom}/{x}/{y}.png","endDate":"2013-09-12T00:00:00.000Z","startDate":"2013-09-12T00:00:00.000Z","scaleExtent":[5,13],"polygon":[[[-121.9355512,47.7820648],[-121.5720582,48.6410125],[-121.2015461,49.4846247],[-121.8375516,49.6023246],[-122.4767046,49.7161735],[-123.118912,49.8268824],[-123.760228,49.9335836],[-124.0887706,49.0870469],[-124.4128889,48.2252567],[-123.792772,48.1197334],[-123.1727942,48.0109592],[-122.553553,47.8982299],[-121.9355512,47.7820648]]],"description":"Recent lower-resolution landsat imagery for southwest British Columbia"},{"id":"LINZ_NZ_Aerial_Imagery","name":"LINZ NZ Aerial Imagery","type":"tms","template":"https://tiles-a.data-cdn.linz.govt.nz/services;key=3197c6d0e5cb494a95d58dc2de3216c2/tiles/v4/set=2/EPSG:3857/{zoom}/{x}/{y}.png","scaleExtent":[0,21],"polygon":[[[167.2503662109375,-47.21956811231548],[167.244873046875,-47.28016067076474],[167.5030517578125,-47.37975438400816],[168.2501220703125,-47.15610477504402],[168.7445068359375,-46.79629898997744],[169.3267822265625,-46.75491661928188],[169.78271484375,-46.604167162931844],[170.4254150390625,-46.11132565729794],[170.804443359375,-45.95114968669139],[170.9527587890625,-45.440862671781744],[171.309814453125,-44.91035917458493],[171.40869140625,-44.39061697878681],[172.562255859375,-43.92954993561458],[172.90283203125,-43.96909818325171],[173.1610107421875,-43.90976594390799],[173.2598876953125,-43.69567969789881],[172.9742431640625,-43.53660274231031],[172.760009765625,-43.37710501700071],[173.1500244140625,-43.17714134663171],[173.704833984375,-42.63395872267314],[174.36401367187497,-41.78360106648077],[174.320068359375,-41.409775832009544],[174.84741210937497,-41.52914198872309],[175.0726318359375,-41.70572851523751],[175.506591796875,-41.672911819602085],[176.2261962890625,-41.10832999732831],[176.8304443359375,-40.42604212826493],[177.17102050781247,-39.67337039176559],[177.0391845703125,-39.39375459224347],[177.4456787109375,-39.18117526158747],[177.60498046875,-39.3300485529424],[177.978515625,-39.368279149160124],[178.3355712890625,-38.65977773071253],[178.7091064453125,-37.74465712069938],[178.626708984375,-37.54457732085582],[178.3135986328125,-37.43125050179357],[177.6214599609375,-37.37888785004525],[177.0391845703125,-37.39634613318924],[176.561279296875,-37.37015718405751],[176.3360595703125,-37.05956083025124],[176.0064697265625,-36.29741818650809],[175.6768798828125,-36.05354012833974],[174.671630859375,-35.1782983520012],[173.1939697265625,-34.28445325435288],[172.6776123046875,-34.234512362369856],[172.386474609375,-34.40237742424137],[172.4798583984375,-34.71903991764788],[172.9852294921875,-35.32184842037683],[173.56201171875,-36.142310873529986],[174.30908203125,-37.077093191754415],[174.5562744140625,-38.052416771864834],[174.4793701171875,-38.655488159952995],[174.3255615234375,-38.865374851611634],[173.7982177734375,-38.95940879245421],[173.60595703125,-39.232253141714885],[173.6993408203125,-39.56335316582929],[174.5892333984375,-39.95606977009003],[174.9847412109375,-40.216635475391215],[174.9847412109375,-40.49291502689579],[174.7210693359375,-40.805493843894155],[174.1497802734375,-40.65147128144056],[173.2818603515625,-40.43440488077009],[172.5897216796875,-40.350730565917885],[172.0843505859375,-40.534676780615406],[171.7657470703125,-40.826280356677124],[171.57348632812497,-41.3974150664646],[171.2823486328125,-41.652392884268124],[170.8758544921875,-42.53284428171312],[170.35400390625,-42.87193842444846],[168.277587890625,-43.92954993561458],[167.6239013671875,-44.47691085722324],[166.55273437499997,-45.38687734827038],[166.27258300781247,-45.916765867649],[166.4813232421875,-46.22545288226937],[167.6788330078125,-46.471916320870406],[167.2503662109375,-47.21956811231548]]],"terms_url":"http://www.linz.govt.nz/data/licensing-and-using-data/attributing-elevation-or-aerial-imagery-data","terms_text":"Sourced from LINZ CC-BY 3.0","best":true},{"id":"LINZ_NZ_Topo50_Gridless_Maps","name":"LINZ NZ Topo50 Gridless Maps","type":"tms","template":"https://tiles-a.data-cdn.linz.govt.nz/services;key=3197c6d0e5cb494a95d58dc2de3216c2/tiles/v4/layer=2343/EPSG:3857/{zoom}/{x}/{y}.png","scaleExtent":[0,21],"polygon":[[[167.2503662109375,-47.21956811231548],[167.244873046875,-47.28016067076474],[167.5030517578125,-47.37975438400816],[168.2501220703125,-47.15610477504402],[168.7445068359375,-46.79629898997744],[169.3267822265625,-46.75491661928188],[169.78271484375,-46.604167162931844],[170.4254150390625,-46.11132565729794],[170.804443359375,-45.95114968669139],[170.9527587890625,-45.440862671781744],[171.309814453125,-44.91035917458493],[171.40869140625,-44.39061697878681],[172.562255859375,-43.92954993561458],[172.90283203125,-43.96909818325171],[173.1610107421875,-43.90976594390799],[173.2598876953125,-43.69567969789881],[172.9742431640625,-43.53660274231031],[172.760009765625,-43.37710501700071],[173.1500244140625,-43.17714134663171],[173.704833984375,-42.63395872267314],[174.36401367187497,-41.78360106648077],[174.320068359375,-41.409775832009544],[174.84741210937497,-41.52914198872309],[175.0726318359375,-41.70572851523751],[175.506591796875,-41.672911819602085],[176.2261962890625,-41.10832999732831],[176.8304443359375,-40.42604212826493],[177.17102050781247,-39.67337039176559],[177.0391845703125,-39.39375459224347],[177.4456787109375,-39.18117526158747],[177.60498046875,-39.3300485529424],[177.978515625,-39.368279149160124],[178.3355712890625,-38.65977773071253],[178.7091064453125,-37.74465712069938],[178.626708984375,-37.54457732085582],[178.3135986328125,-37.43125050179357],[177.6214599609375,-37.37888785004525],[177.0391845703125,-37.39634613318924],[176.561279296875,-37.37015718405751],[176.3360595703125,-37.05956083025124],[176.0064697265625,-36.29741818650809],[175.6768798828125,-36.05354012833974],[174.671630859375,-35.1782983520012],[173.1939697265625,-34.28445325435288],[172.6776123046875,-34.234512362369856],[172.386474609375,-34.40237742424137],[172.4798583984375,-34.71903991764788],[172.9852294921875,-35.32184842037683],[173.56201171875,-36.142310873529986],[174.30908203125,-37.077093191754415],[174.5562744140625,-38.052416771864834],[174.4793701171875,-38.655488159952995],[174.3255615234375,-38.865374851611634],[173.7982177734375,-38.95940879245421],[173.60595703125,-39.232253141714885],[173.6993408203125,-39.56335316582929],[174.5892333984375,-39.95606977009003],[174.9847412109375,-40.216635475391215],[174.9847412109375,-40.49291502689579],[174.7210693359375,-40.805493843894155],[174.1497802734375,-40.65147128144056],[173.2818603515625,-40.43440488077009],[172.5897216796875,-40.350730565917885],[172.0843505859375,-40.534676780615406],[171.7657470703125,-40.826280356677124],[171.57348632812497,-41.3974150664646],[171.2823486328125,-41.652392884268124],[170.8758544921875,-42.53284428171312],[170.35400390625,-42.87193842444846],[168.277587890625,-43.92954993561458],[167.6239013671875,-44.47691085722324],[166.55273437499997,-45.38687734827038],[166.27258300781247,-45.916765867649],[166.4813232421875,-46.22545288226937],[167.6788330078125,-46.471916320870406],[167.2503662109375,-47.21956811231548]]],"terms_url":"https://data.linz.govt.nz/layer/2343-nz-mainland-topo50-gridless-maps/","terms_text":"Sourced from the LINZ Data Service and licensed by LINZ for re-use under the Creative Commons Attribution 3.0 New Zealand licence."},{"id":"ORT10LT","name":"Lithuania - NŽT ORT10LT","type":"tms","template":"http://ort10lt.openmap.lt/g16/{zoom}/{x}/{y}.jpeg","endDate":"2016-01-01T00:00:00.000Z","startDate":"2010-01-01T00:00:00.000Z","scaleExtent":[4,18],"polygon":[[[26.2138385,55.850748],[26.3858298,55.7045315],[26.6303618,55.6806692],[26.6205349,55.5689227],[26.5242191,55.5099228],[26.5541476,55.388833],[26.4399286,55.3479351],[26.7919694,55.3212027],[26.8291304,55.2763488],[26.7434625,55.2539863],[26.6764846,55.158828],[26.4611191,55.1285624],[26.3577434,55.1505399],[26.2296342,55.1073177],[26.2713814,55.0775905],[26.2085126,54.997414],[26.0619117,54.9416094],[25.8578176,54.9276001],[25.7429827,54.8150641],[25.7626083,54.5769013],[25.5319352,54.3418175],[25.6771618,54.3238109],[25.7857293,54.2336242],[25.7858844,54.1550594],[25.5550843,54.1461918],[25.5109462,54.1750267],[25.5896725,54.2285838],[25.5136246,54.3078472],[25.2689287,54.2744706],[25.0705963,54.1336282],[24.9573726,54.1720575],[24.8133801,54.144862],[24.7790172,54.0999054],[24.8712786,54.034904],[24.819568,53.9977218],[24.6845912,53.9621091],[24.697865,54.0171421],[24.6259068,54.0105048],[24.4342619,53.9014424],[24.3520594,53.8967893],[24.2016059,53.9700069],[23.9683341,53.9266977],[23.9130177,53.9696842],[23.7781192,53.8989169],[23.7097655,53.9394502],[23.5370435,53.9430702],[23.4822428,53.9893848],[23.5273356,54.0473482],[23.4858579,54.1532339],[23.3867851,54.224838],[23.0421216,54.3159745],[23.0102115,54.3827959],[22.8546899,54.4104029],[22.7919963,54.3633227],[22.7023421,54.4528985],[22.6838586,54.585972],[22.7489713,54.6319792],[22.7429727,54.7268221],[22.8866837,54.8135001],[22.8204005,54.9119829],[22.6424041,54.9713362],[22.5892361,55.070243],[22.080597,55.0244812],[22.0324081,55.084098],[21.9130671,55.0816838],[21.6491949,55.1808113],[21.5015124,55.1868198],[21.3843708,55.2936996],[21.2709829,55.2450059],[21.0983616,55.2563884],[20.9421741,55.282453],[21.0863466,55.5618266],[21.0399547,55.8363584],[21.0640261,56.0699542],[21.2047804,56.0811668],[21.2307958,56.1623302],[21.5021038,56.2954952],[21.7235874,56.3138211],[21.8356623,56.37162],[21.9695397,56.3766515],[22.0153001,56.4242811],[22.4372717,56.406405],[22.6800028,56.3515884],[22.9191739,56.3790184],[22.9466759,56.4146477],[23.0932498,56.3046383],[23.1703443,56.3667721],[23.3064522,56.3830535],[23.5571715,56.3338187],[23.7647953,56.3733238],[23.7666897,56.3238079],[24.0189971,56.3297615],[24.1214631,56.2488984],[24.2857421,56.3006367],[24.4541496,56.2581579],[24.5794651,56.2882389],[24.6284061,56.3753322],[24.9023767,56.4805317],[25.1277405,56.2059091],[25.5771398,56.182414],[25.6731232,56.1493667],[26.2138385,55.850748]]],"terms_url":"http://www.geoportal.lt","terms_text":"NŽT ORT10LT","best":true},{"id":"mapbox_locator_overlay","name":"Locator Overlay","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/openstreetmap.map-inh76ba2/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw","scaleExtent":[0,16],"overzoom":false,"terms_url":"http://www.mapbox.com/about/maps/","terms_text":"Terms & Feedback","default":true,"description":"Shows major features to help orient you.","overlay":true},{"id":"Loire_Atlantique-Orthophotos-2012","name":"Loire-Atlantique - Orthophotos 2012 - 20 cm","type":"tms","template":"http://{switch:a,b,c,d,e,f,g,h}.tiles.cg44.makina-corpus.net/ortho-2012/{zoom}/{x}/{-y}.jpg","endDate":"2012-01-01T00:00:00.000Z","startDate":"2012-01-01T00:00:00.000Z","scaleExtent":[0,19],"polygon":[[[-1.4863838,46.8769078],[-1.5443674,46.8487272],[-1.7346797,46.8724645],[-1.8927568,46.9423436],[-1.9547478,46.980844],[-2.070671,47.0852054],[-2.2678023,47.1265555],[-2.2262684,47.1712448],[-2.1921733,47.1691377],[-2.1934131,47.2554621],[-2.2969381,47.2276852],[-2.4165807,47.2533583],[-2.5486216,47.2857476],[-2.6391284,47.4167844],[-2.5057256,47.5081195],[-2.3106273,47.5302088],[-2.2483636,47.5238409],[-2.2322311,47.5149928],[-2.1210893,47.5467415],[-2.117832,47.6012606],[-2.1001019,47.6112276],[-2.099813,47.6200473],[-2.1114061,47.6287298],[-2.1005485,47.6514139],[-2.0812094,47.6657768],[-1.9801641,47.7075082],[-1.8307658,47.7241914],[-1.6745485,47.7254424],[-1.6373539,47.7746256],[-1.4960144,47.8175187],[-1.499114,47.8416565],[-1.3813311,47.8441529],[-1.3459962,47.810858],[-1.230073,47.7858729],[-1.216435,47.7583753],[-1.2263536,47.7362834],[-1.2108558,47.7316971],[-1.1866793,47.7346157],[-1.1519644,47.6933233],[-1.1315073,47.6365449],[-1.0912132,47.6332031],[-0.9926475,47.6026991],[-0.9845887,47.585977],[-1.0317018,47.5500064],[-1.1358467,47.5562822],[-1.1327472,47.5161046],[-1.0317018,47.5177793],[-0.9486339,47.5010301],[-0.9368556,47.4771532],[-0.9337561,47.4385923],[-0.9009008,47.3987442],[-0.926937,47.3748209],[-0.9715706,47.358446],[-1.2833853,47.3273618],[-1.2337925,47.2609316],[-1.2003173,47.2693451],[-1.1649825,47.2495712],[-1.1414259,47.1763017],[-1.1563037,47.1581792],[-1.2065164,47.1240248],[-1.2083762,47.1096818],[-1.1556838,47.1050406],[-1.140806,47.0805621],[-1.0943127,47.0716964],[-1.0998919,47.0319939],[-1.1445254,47.0163582],[-1.2158151,47.0290362],[-1.2672676,47.0632516],[-1.285245,47.0218524],[-1.3497157,47.0239654],[-1.3391772,46.9690007],[-1.3490957,46.9444597],[-1.4501411,46.9118621],[-1.4750393,46.9176026],[-1.4877512,46.9306253],[-1.4923538,46.9843293],[-1.4864362,46.9994285],[-1.4921346,47.0272238],[-1.5276404,47.0054072],[-1.5296129,46.9725161],[-1.5050657,46.944393],[-1.5022165,46.9297273],[-1.5114217,46.9137101],[-1.486217,46.8972388],[-1.4863838,46.8769078]]],"terms_url":"http://data.loire-atlantique.fr/licence/","terms_text":"Département de Loire-Atlantique"},{"id":"Lombardia-Italy-CTR-DBT","name":"Lombardia - Italy (CTR DBT)","type":"wms","template":"http://www.cartografia.servizirl.it/arcgis/services/wms/ctr_wms/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Sfondo%20C.T.R.%2010000&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[8.4815995,45.2893842],[8.6308463,45.0137199],[8.7800932,44.9818911],[8.8677461,45.0271162],[9.0714799,44.8006338],[9.1496568,44.7905472],[9.1946678,44.6710553],[9.3154866,44.6575759],[9.3699736,44.6980046],[9.3794496,44.8275228],[9.3320696,44.9148254],[9.4102465,45.0371613],[9.7869171,45.0438571],[9.7869171,45.0003204],[9.938533,45.0019955],[9.933795,45.0890333],[10.0001269,45.0907058],[10.0001269,44.9969701],[10.2014917,45.0019955],[10.2014917,44.9500447],[10.4052255,44.9533977],[10.4052255,44.9047588],[10.4928784,44.9030808],[10.4928784,44.8627956],[10.6516012,44.8577579],[10.6468633,44.9030808],[11.3528245,44.8946904],[11.3551935,44.9366303],[11.4570604,44.9332763],[11.4475844,44.9735122],[11.3623005,45.0003204],[11.3528245,45.0923782],[11.2580646,45.095723],[11.2580646,45.137516],[11.1609357,45.1425291],[11.1609357,45.1826181],[11.0519618,45.1909664],[11.0519618,45.234358],[10.9572019,45.2326897],[10.9572019,45.2860508],[10.857704,45.284384],[10.855335,45.3227074],[10.7463612,45.3293697],[10.7534681,45.4740809],[10.6468633,45.4807254],[10.6030084,45.5107366],[10.5763572,45.4737864],[10.535492,45.5003598],[10.5911634,45.5314845],[10.6166585,45.613036],[10.874287,45.840014],[10.8221691,45.8598152],[10.6752912,45.8581654],[10.5734243,45.8102989],[10.5862444,46.0077329],[10.5016004,46.015957],[10.593248,46.1152934],[10.6089593,46.3558255],[10.6563392,46.3868822],[10.6468633,46.4603672],[10.4147015,46.5728517],[10.3270486,46.5679659],[10.2512407,46.6542168],[10.0735658,46.6249395],[10.0238169,46.5321233],[10.0285549,46.4358832],[10.0735658,46.3983197],[10.1209458,46.3966859],[10.0783038,46.3280229],[10.1446358,46.2658249],[10.1043628,46.247807],[9.9740679,46.4081214],[9.7111092,46.3689041],[9.6874192,46.3231151],[9.6187183,46.3067526],[9.5571244,46.3247511],[9.5026374,46.3901503],[9.4789475,46.525604],[9.2562617,46.5158234],[9.2254647,46.4407808],[9.2728447,46.3443791],[9.1709778,46.190438],[9.0430519,46.1280838],[9.0620039,46.0919516],[8.974351,46.0459311],[8.988565,46.0015177],[8.938816,45.9735355],[9.0406829,45.8960992],[9.0193619,45.8482654],[8.8487941,46.0080997],[8.8985431,46.0705897],[8.8251041,46.1182319],[8.7090233,46.1165897],[8.6782263,46.0755201],[8.7184992,46.014681],[8.5550384,45.9043422],[8.5976804,45.8383636],[8.5337174,45.7937837],[8.6877023,45.4923513],[8.7800932,45.4159083],[8.6853333,45.379312],[8.7113923,45.3410269],[8.6948093,45.3210417],[8.6284773,45.377648],[8.5123965,45.3576757],[8.4815995,45.2893842]]],"terms_url":"http://www.dati.gov.it/iodl/2.0","terms_text":"CTR DBT 10000 Regione Lombardia"},{"id":"Lombardia-Italy-CTR","name":"Lombardia - Italy (CTR)","type":"wms","template":"http://www.cartografia.regione.lombardia.it/ArcGIS10/services/wms/ctr_wms/MapServer/WMSServer?STYLES=&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=0&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[8.4815995,45.2893842],[8.6308463,45.0137199],[8.7800932,44.9818911],[8.8677461,45.0271162],[9.0714799,44.8006338],[9.1496568,44.7905472],[9.1946678,44.6710553],[9.3154866,44.6575759],[9.3699736,44.6980046],[9.3794496,44.8275228],[9.3320696,44.9148254],[9.4102465,45.0371613],[9.7869171,45.0438571],[9.7869171,45.0003204],[9.938533,45.0019955],[9.933795,45.0890333],[10.0001269,45.0907058],[10.0001269,44.9969701],[10.2014917,45.0019955],[10.2014917,44.9500447],[10.4052255,44.9533977],[10.4052255,44.9047588],[10.4928784,44.9030808],[10.4928784,44.8627956],[10.6516012,44.8577579],[10.6468633,44.9030808],[11.3528245,44.8946904],[11.3551935,44.9366303],[11.4570604,44.9332763],[11.4475844,44.9735122],[11.3623005,45.0003204],[11.3528245,45.0923782],[11.2580646,45.095723],[11.2580646,45.137516],[11.1609357,45.1425291],[11.1609357,45.1826181],[11.0519618,45.1909664],[11.0519618,45.234358],[10.9572019,45.2326897],[10.9572019,45.2860508],[10.857704,45.284384],[10.855335,45.3227074],[10.7463612,45.3293697],[10.7534681,45.4740809],[10.6468633,45.4807254],[10.6030084,45.5107366],[10.5763572,45.4737864],[10.535492,45.5003598],[10.5911634,45.5314845],[10.6166585,45.613036],[10.874287,45.840014],[10.8221691,45.8598152],[10.6752912,45.8581654],[10.5734243,45.8102989],[10.5862444,46.0077329],[10.5016004,46.015957],[10.593248,46.1152934],[10.6089593,46.3558255],[10.6563392,46.3868822],[10.6468633,46.4603672],[10.4147015,46.5728517],[10.3270486,46.5679659],[10.2512407,46.6542168],[10.0735658,46.6249395],[10.0238169,46.5321233],[10.0285549,46.4358832],[10.0735658,46.3983197],[10.1209458,46.3966859],[10.0783038,46.3280229],[10.1446358,46.2658249],[10.1043628,46.247807],[9.9740679,46.4081214],[9.7111092,46.3689041],[9.6874192,46.3231151],[9.6187183,46.3067526],[9.5571244,46.3247511],[9.5026374,46.3901503],[9.4789475,46.525604],[9.2562617,46.5158234],[9.2254647,46.4407808],[9.2728447,46.3443791],[9.1709778,46.190438],[9.0430519,46.1280838],[9.0620039,46.0919516],[8.974351,46.0459311],[8.988565,46.0015177],[8.938816,45.9735355],[9.0406829,45.8960992],[9.0193619,45.8482654],[8.8487941,46.0080997],[8.8985431,46.0705897],[8.8251041,46.1182319],[8.7090233,46.1165897],[8.6782263,46.0755201],[8.7184992,46.014681],[8.5550384,45.9043422],[8.5976804,45.8383636],[8.5337174,45.7937837],[8.6877023,45.4923513],[8.7800932,45.4159083],[8.6853333,45.379312],[8.7113923,45.3410269],[8.6948093,45.3210417],[8.6284773,45.377648],[8.5123965,45.3576757],[8.4815995,45.2893842]]],"terms_url":"http://www.dati.gov.it/iodl/2.0","terms_text":"Regione Lombardia - Infrastruttura per l'informazione territoriale"},{"id":"londrina2011","name":"Londrina Ortofoto 2011","type":"tms","template":"https://siglon.londrina.pr.gov.br/arcgis/rest/services/Imagens/Ortofotos_2011_Paranacidade/MapServer/WMTS/tile/1.0.0/Imagens_Ortofotos_2011_Paranacidade/default/GoogleMapsCompatible/{zoom}/{y}/{x}","polygon":[[[-51.10903142008701,-23.392750890870328],[-51.110147219037096,-23.39111628244602],[-51.111981850003126,-23.389599820448623],[-51.11358044657587,-23.38976722295012],[-51.120999436701226,-23.38592675938185],[-51.12224934611127,-23.385109415587607],[-51.12483499560139,-23.383504255873166],[-51.12538216624037,-23.38186953335707],[-51.12482426676533,-23.37770385409619],[-51.12445948633935,-23.375054689723584],[-51.124373655650885,-23.372297138974446],[-51.12244246516032,-23.37032742475139],[-51.12302182230749,-23.366427304263887],[-51.128557901713755,-23.36548180323493],[-51.12832186732048,-23.358843408308623],[-51.12477062258506,-23.35475580404945],[-51.12703440699343,-23.35091432623551],[-51.12411616358548,-23.34679692655685],[-51.12025378260435,-23.347811512977742],[-51.1176466754421,-23.33969460448754],[-51.11264703783877,-23.341290443649072],[-51.109396200513004,-23.33488726938344],[-51.10756156954697,-23.334089313725826],[-51.10485790286019,-23.333980949007543],[-51.10252974543546,-23.334187827029368],[-51.09986899409291,-23.331015661953632],[-51.09801290545476,-23.329360589233605],[-51.09998701128955,-23.32830645478855],[-51.10322711977927,-23.325321337105603],[-51.10472915682748,-23.323193291476684],[-51.104664783811145,-23.321291814470847],[-51.10514758143378,-23.318444474199904],[-51.1063599399084,-23.3157547161216],[-51.10660670313775,-23.31467091543279],[-51.11050127062705,-23.311665785493048],[-51.111584883068964,-23.30842411016493],[-51.099504213666904,-23.309468549142686],[-51.09740136179941,-23.308631027972474],[-51.09511611971892,-23.307448636164267],[-51.09201548609798,-23.3049360186679],[-51.09036324534495,-23.3037141796735],[-51.09204767260616,-23.29874787986134],[-51.09269140276969,-23.297496421894902],[-51.09407542262125,-23.292953629109174],[-51.10073802981369,-23.293318240761657],[-51.10101697955121,-23.28870632248831],[-51.10068438563339,-23.28837126237015],[-51.10084531817427,-23.28777997775132],[-51.09937546763423,-23.28663682004102],[-51.09631774935752,-23.277914991984613],[-51.10285161051725,-23.273016720553397],[-51.10835550341534,-23.27033590016574],[-51.11309764895328,-23.268404099092194],[-51.13160489115448,-23.265338785827712],[-51.13188384089201,-23.262007272160396],[-51.1317336371872,-23.255058136908826],[-51.13290308031759,-23.254683563301587],[-51.132956724497895,-23.250750476893938],[-51.13473771128364,-23.2512729236245],[-51.13533852610292,-23.25133206840842],[-51.13516686472599,-23.24359373640034],[-51.13534925493897,-23.24117849627157],[-51.137516479822814,-23.24219388826517],[-51.13884685549409,-23.243495156026544],[-51.14108918223035,-23.24521044413634],[-51.1471724322756,-23.243179698340864],[-51.14761231455401,-23.23828015040167],[-51.149082165094036,-23.235884531292832],[-51.14976881060179,-23.236811236789336],[-51.15138886484666,-23.23853646924079],[-51.15289090189487,-23.238842079520833],[-51.15383503946804,-23.238950521710013],[-51.15820167574391,-23.238142132361276],[-51.16045473131624,-23.238161849232945],[-51.160347442955654,-23.24658068718069],[-51.15912435564498,-23.2478326235554],[-51.16131303820094,-23.247773477219496],[-51.166591625541805,-23.245939927797],[-51.17193458589902,-23.245821633420345],[-51.17205260309565,-23.249557713480034],[-51.174241285651625,-23.248404370116877],[-51.17514250788055,-23.2493211310392],[-51.176859121649926,-23.248157927934038],[-51.179466228812196,-23.251686936561047],[-51.18135450395853,-23.253806268366073],[-51.18273852381009,-23.253628837227893],[-51.18378994974384,-23.253264116924615],[-51.18495939287424,-23.253303546194683],[-51.18626831087339,-23.252150235227905],[-51.18665454897149,-23.247477745146526],[-51.191182117788244,-23.249143693933142],[-51.19141815218154,-23.252859966234126],[-51.19369266542598,-23.252781107419985],[-51.1938428691308,-23.26073575534214],[-51.20096681627374,-23.26054847664639],[-51.20126722368338,-23.24259807127726],[-51.209936123218775,-23.242775517090898],[-51.21090171846407,-23.26988252079656],[-51.21968863519614,-23.27221839365197],[-51.225965004290465,-23.2745345140599],[-51.22934458764894,-23.27860487489667],[-51.234515886629225,-23.28160089636689],[-51.23497722657975,-23.283246708422755],[-51.235073786104266,-23.285444377831148],[-51.23371122392482,-23.285897704227196],[-51.232155542696304,-23.28801649191402],[-51.22870085748543,-23.292293383844925],[-51.227402668322334,-23.294599300809004],[-51.22679112466699,-23.295476327114592],[-51.225600223864475,-23.29657013833941],[-51.22392652543933,-23.297210654251764],[-51.220482569064515,-23.30072850975029],[-51.21863720926242,-23.301300029310937],[-51.21668456109974,-23.30211788923888],[-51.21423838647836,-23.30441378240661],[-51.210966091480465,-23.306965823153238],[-51.22328279527583,-23.318296686707587],[-51.224387865389886,-23.31459209321986],[-51.22521398576639,-23.312887551432937],[-51.22511742624187,-23.312582111000477],[-51.22521398576639,-23.312513140483127],[-51.2255251220121,-23.312532846348883],[-51.22595427545445,-23.312385052284572],[-51.22616885217561,-23.31183328632629],[-51.22935531648505,-23.314887676277397],[-51.22802494081377,-23.31661189768144],[-51.227885465945,-23.31901591762422],[-51.22767088922384,-23.320227763653186],[-51.22723100694544,-23.321508564518947],[-51.2273919394863,-23.322227778055023],[-51.22725246461755,-23.322848466059934],[-51.230331640566384,-23.325577488448165],[-51.23046038659909,-23.326710459617892],[-51.229537706698046,-23.32789268010374],[-51.229162197436,-23.330503379743732],[-51.229290943468705,-23.33178408156439],[-51.22681258233914,-23.334473515196468],[-51.2260186484708,-23.336571826694826],[-51.22473118814376,-23.33839427691611],[-51.22210262330938,-23.340226553005806],[-51.22257469209598,-23.34196029634743],[-51.22380850824271,-23.343388647432523],[-51.22384069475089,-23.345309509145306],[-51.22440932306201,-23.347003784611864],[-51.2245380690947,-23.348294177581966],[-51.22404454263601,-23.34968305981433],[-51.22350810083308,-23.35010661675208],[-51.22381923707877,-23.35076657486812],[-51.22304676088255,-23.35174173085325],[-51.22259614976809,-23.35296312824164],[-51.22586844476598,-23.35480505304304],[-51.22650144609346,-23.36705763453823],[-51.22354028734128,-23.369145582171885],[-51.22366903337377,-23.37968330666716],[-51.220375280703756,-23.381633186264455],[-51.216469984378406,-23.38170212087667],[-51.21416328462579,-23.379949201028825],[-51.2092816642191,-23.37395167630701],[-51.20738266023672,-23.368141007697016],[-51.20628831895872,-23.36723491438801],[-51.20472190889416,-23.366269721227162],[-51.198230963078665,-23.366683376299132],[-51.19297383340994,-23.366506095711998],[-51.18986247095292,-23.3654424072124],[-51.18806002649507,-23.36464463523902],[-51.18718026193825,-23.3645264463904],[-51.18579624208668,-23.363738518041337],[-51.183038931219606,-23.36359078095478],[-51.18071077379488,-23.3637582163071],[-51.179069261877906,-23.361581540240305],[-51.177642326682125,-23.35836078207346],[-51.16683838877106,-23.356262814974126],[-51.166141014427254,-23.358538073547532],[-51.16475699457568,-23.360389770338585],[-51.16076586756186,-23.359217688669915],[-51.15983245882475,-23.36660458495632],[-51.162042599052846,-23.36861374957437],[-51.16276143106877,-23.374158492021696],[-51.158448438973174,-23.37580315788644],[-51.155047397942575,-23.376305417047273],[-51.15396378550066,-23.37903334042617],[-51.15298746141932,-23.381052164536694],[-51.15118501696147,-23.382076336717283],[-51.149167995782435,-23.382509637949354],[-51.14721534761976,-23.382155118864866],[-51.14517686876862,-23.382588419839323],[-51.14410398516276,-23.38376029492248],[-51.14512322458833,-23.388083341091015],[-51.141797285410156,-23.389402876058366],[-51.14030597719799,-23.38880219385971],[-51.14068148646006,-23.391608636504017],[-51.14127157244328,-23.393538646762796],[-51.14093897852546,-23.394434713394368],[-51.140456180902824,-23.39536031431835],[-51.13939402613302,-23.395104297688697],[-51.13738773379004,-23.393154616350518],[-51.13608954462695,-23.389796764546077],[-51.13428710016909,-23.389757375749994],[-51.132162790629465,-23.390072485790583],[-51.13172290835106,-23.39285920758337],[-51.12259266886514,-23.38864463742227],[-51.12228153261944,-23.391657871809155],[-51.11882684740854,-23.393174310244916],[-51.115683298443365,-23.393351555162592],[-51.10903142008701,-23.392750890870328]],[[-51.13829432042955,-23.41600741009485],[-51.133310776080314,-23.418665600378624],[-51.132087688769644,-23.416440600302334],[-51.13002238782791,-23.418291487939495],[-51.12868664773901,-23.419010176689888],[-51.12824140104259,-23.42102839134528],[-51.12696466955051,-23.421860280620358],[-51.12532852205271,-23.422692164660027],[-51.1244541219139,-23.420969322085504],[-51.1215144208339,-23.424109801147612],[-51.12063465627703,-23.423268081315832],[-51.11970661195797,-23.423120410617486],[-51.11977098497433,-23.42156985833077],[-51.1188000253111,-23.421545246243184],[-51.11643431696008,-23.420836416154565],[-51.11942766222045,-23.419167696990424],[-51.11787198099193,-23.416775337218567],[-51.116546969738685,-23.41730697646229],[-51.115699391690086,-23.415702207051474],[-51.115120034542905,-23.413088261827834],[-51.119078975048524,-23.411114231305813],[-51.119599323597356,-23.41169512115064],[-51.12052200349841,-23.41489489238112],[-51.12147686990764,-23.417139608782644],[-51.12308619531643,-23.418626220171642],[-51.12754939111684,-23.41653905242448],[-51.12803218873949,-23.417395582795194],[-51.13119719537679,-23.415574218468866],[-51.13080022844262,-23.414766903017576],[-51.13278506311348,-23.41264029239725],[-51.13521514448077,-23.411055157619415],[-51.13585887464424,-23.410956701416854],[-51.13682446988958,-23.411188073376714],[-51.137205343569626,-23.411576974270133],[-51.13730190309418,-23.41324086645236],[-51.137430649126884,-23.414707830961888],[-51.13829432042955,-23.41600741009485]],[[-51.18929065852,-23.61469318354],[-51.18868716149,-23.61385268133],[-51.18817754178,-23.61338573333],[-51.18731118826,-23.61301708899],[-51.18628926663,-23.61314488581],[-51.18401743559,-23.61395590119],[-51.18348904042,-23.61396573165],[-51.18183143525,-23.61283522407],[-51.18140496401,-23.61344471632],[-51.18062980561,-23.61313505529],[-51.18001021533,-23.61409352754],[-51.17865838198,-23.61328742827],[-51.18064589886,-23.61060367181],[-51.17972321896,-23.61018095058],[-51.18061639456,-23.60849005203],[-51.1821157494,-23.60850479833],[-51.18260927586,-23.60775273479],[-51.18319936184,-23.60804274673],[-51.18415154605,-23.60627808786],[-51.18511177687,-23.60666149766],[-51.18649043231,-23.60469528171],[-51.18902243762,-23.60610112912],[-51.18821241049,-23.60741848294],[-51.18918873458,-23.60801816947],[-51.188899056,-23.60953211999],[-51.18962325244,-23.60992535103],[-51.1911896625,-23.6111935131],[-51.1901489654,-23.61244691705],[-51.19054056792,-23.6127565797],[-51.19029380469,-23.61377895281],[-51.18929065852,-23.61469318354]],[[-51.08005769639,-23.52984412096],[-51.07962317853,-23.52205317842],[-51.08468182473,-23.52194496764],[-51.08581908135,-23.52404030606],[-51.0858941832,-23.52703569673],[-51.08579494147,-23.52777346722],[-51.08530141501,-23.52806365581],[-51.08513511805,-23.52856533627],[-51.08512438922,-23.52981952906],[-51.08470864682,-23.53023759067],[-51.08343459754,-23.53023759067],[-51.08329512267,-23.52978018202],[-51.08005769639,-23.52984412096]]],"terms_url":"http://siglon.londrina.pr.gov.br/","terms_text":"Prefeitura do Londrinas, PR"},{"id":"LPI_NSW_Administrative_Boundaries_County","name":"LPI NSW Administrative Boundaries County","type":"wms","template":"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=4&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE","projection":"EPSG:3857","scaleExtent":[0,21],"polygon":[[[159.0033934,-31.4876656],[159.0378887,-31.7055793],[159.3109766,-31.8595241],[159.3727807,-31.7789183],[159.1744327,-31.4373999],[159.0033934,-31.4876656]],[[140.998648,-28.9989332],[148.9451961,-28.9948656],[149.4856226,-28.5615019],[150.2991369,-28.5337256],[151.0954036,-28.7179218],[151.3943629,-28.9797786],[151.9894069,-28.7355674],[151.9290401,-28.4983634],[152.4924635,-28.2353023],[153.5790657,-28.1415563],[153.6969246,-28.6498321],[153.2584694,-30.9735401],[152.7543708,-32.508492],[151.9087862,-33.0553457],[151.2583364,-34.3808144],[151.0144178,-35.1156752],[150.4615355,-36.1202975],[150.4127518,-36.6178579],[149.9784687,-37.5069984],[148.2013511,-36.805656],[148.0791803,-36.8171632],[147.8854228,-36.0901856],[147.6902879,-36.0441802],[146.828442,-36.188678],[145.2348401,-35.9849909],[144.8445703,-36.2149218],[144.5193454,-36.1295974],[143.2021846,-35.1317425],[142.4785593,-34.811943],[140.9937045,-34.070169],[141.0025961,-34.0197399],[140.998648,-28.9989332]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017","overlay":true},{"id":"LPI_NSW_Administrative_Boundaries_LGA","name":"LPI NSW Administrative Boundaries LGA","type":"wms","template":"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=6&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE","projection":"EPSG:3857","scaleExtent":[0,21],"polygon":[[[159.0033934,-31.4876656],[159.0378887,-31.7055793],[159.3109766,-31.8595241],[159.3727807,-31.7789183],[159.1744327,-31.4373999],[159.0033934,-31.4876656]],[[140.998648,-28.9989332],[148.9451961,-28.9948656],[149.4856226,-28.5615019],[150.2991369,-28.5337256],[151.0954036,-28.7179218],[151.3943629,-28.9797786],[151.9894069,-28.7355674],[151.9290401,-28.4983634],[152.4924635,-28.2353023],[153.5790657,-28.1415563],[153.6969246,-28.6498321],[153.2584694,-30.9735401],[152.7543708,-32.508492],[151.9087862,-33.0553457],[151.2583364,-34.3808144],[151.0144178,-35.1156752],[150.4615355,-36.1202975],[150.4127518,-36.6178579],[149.9784687,-37.5069984],[148.2013511,-36.805656],[148.0791803,-36.8171632],[147.8854228,-36.0901856],[147.6902879,-36.0441802],[146.828442,-36.188678],[145.2348401,-35.9849909],[144.8445703,-36.2149218],[144.5193454,-36.1295974],[143.2021846,-35.1317425],[142.4785593,-34.811943],[140.9937045,-34.070169],[141.0025961,-34.0197399],[140.998648,-28.9989332]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017","overlay":true},{"id":"LPI_NSW_Administrative_Boundaries_NPWS_Reserve","name":"LPI NSW Administrative Boundaries NPWS Reserve","type":"wms","template":"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=1&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE","projection":"EPSG:3857","scaleExtent":[0,21],"polygon":[[[159.0033934,-31.4876656],[159.0378887,-31.7055793],[159.3109766,-31.8595241],[159.3727807,-31.7789183],[159.1744327,-31.4373999],[159.0033934,-31.4876656]],[[140.998648,-28.9989332],[148.9451961,-28.9948656],[149.4856226,-28.5615019],[150.2991369,-28.5337256],[151.0954036,-28.7179218],[151.3943629,-28.9797786],[151.9894069,-28.7355674],[151.9290401,-28.4983634],[152.4924635,-28.2353023],[153.5790657,-28.1415563],[153.6969246,-28.6498321],[153.2584694,-30.9735401],[152.7543708,-32.508492],[151.9087862,-33.0553457],[151.2583364,-34.3808144],[151.0144178,-35.1156752],[150.4615355,-36.1202975],[150.4127518,-36.6178579],[149.9784687,-37.5069984],[148.2013511,-36.805656],[148.0791803,-36.8171632],[147.8854228,-36.0901856],[147.6902879,-36.0441802],[146.828442,-36.188678],[145.2348401,-35.9849909],[144.8445703,-36.2149218],[144.5193454,-36.1295974],[143.2021846,-35.1317425],[142.4785593,-34.811943],[140.9937045,-34.070169],[141.0025961,-34.0197399],[140.998648,-28.9989332]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017","overlay":true},{"id":"LPI_NSW_Administrative_Boundaries_Parish","name":"LPI NSW Administrative Boundaries Parish","type":"wms","template":"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=3&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE","projection":"EPSG:3857","scaleExtent":[0,21],"polygon":[[[159.0033934,-31.4876656],[159.0378887,-31.7055793],[159.3109766,-31.8595241],[159.3727807,-31.7789183],[159.1744327,-31.4373999],[159.0033934,-31.4876656]],[[140.998648,-28.9989332],[148.9451961,-28.9948656],[149.4856226,-28.5615019],[150.2991369,-28.5337256],[151.0954036,-28.7179218],[151.3943629,-28.9797786],[151.9894069,-28.7355674],[151.9290401,-28.4983634],[152.4924635,-28.2353023],[153.5790657,-28.1415563],[153.6969246,-28.6498321],[153.2584694,-30.9735401],[152.7543708,-32.508492],[151.9087862,-33.0553457],[151.2583364,-34.3808144],[151.0144178,-35.1156752],[150.4615355,-36.1202975],[150.4127518,-36.6178579],[149.9784687,-37.5069984],[148.2013511,-36.805656],[148.0791803,-36.8171632],[147.8854228,-36.0901856],[147.6902879,-36.0441802],[146.828442,-36.188678],[145.2348401,-35.9849909],[144.8445703,-36.2149218],[144.5193454,-36.1295974],[143.2021846,-35.1317425],[142.4785593,-34.811943],[140.9937045,-34.070169],[141.0025961,-34.0197399],[140.998648,-28.9989332]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017","overlay":true},{"id":"LPI_NSW_Administrative_Boundaries_StateForest","name":"LPI NSW Administrative Boundaries State Forest","type":"wms","template":"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=2&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE","projection":"EPSG:3857","scaleExtent":[0,21],"polygon":[[[159.0033934,-31.4876656],[159.0378887,-31.7055793],[159.3109766,-31.8595241],[159.3727807,-31.7789183],[159.1744327,-31.4373999],[159.0033934,-31.4876656]],[[140.998648,-28.9989332],[148.9451961,-28.9948656],[149.4856226,-28.5615019],[150.2991369,-28.5337256],[151.0954036,-28.7179218],[151.3943629,-28.9797786],[151.9894069,-28.7355674],[151.9290401,-28.4983634],[152.4924635,-28.2353023],[153.5790657,-28.1415563],[153.6969246,-28.6498321],[153.2584694,-30.9735401],[152.7543708,-32.508492],[151.9087862,-33.0553457],[151.2583364,-34.3808144],[151.0144178,-35.1156752],[150.4615355,-36.1202975],[150.4127518,-36.6178579],[149.9784687,-37.5069984],[148.2013511,-36.805656],[148.0791803,-36.8171632],[147.8854228,-36.0901856],[147.6902879,-36.0441802],[146.828442,-36.188678],[145.2348401,-35.9849909],[144.8445703,-36.2149218],[144.5193454,-36.1295974],[143.2021846,-35.1317425],[142.4785593,-34.811943],[140.9937045,-34.070169],[141.0025961,-34.0197399],[140.998648,-28.9989332]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017","overlay":true},{"id":"LPI_NSW_Administrative_Boundaries_Suburb","name":"LPI NSW Administrative Boundaries Suburb","type":"wms","template":"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=7&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE","projection":"EPSG:3857","scaleExtent":[0,21],"polygon":[[[159.0033934,-31.4876656],[159.0378887,-31.7055793],[159.3109766,-31.8595241],[159.3727807,-31.7789183],[159.1744327,-31.4373999],[159.0033934,-31.4876656]],[[140.998648,-28.9989332],[148.9451961,-28.9948656],[149.4856226,-28.5615019],[150.2991369,-28.5337256],[151.0954036,-28.7179218],[151.3943629,-28.9797786],[151.9894069,-28.7355674],[151.9290401,-28.4983634],[152.4924635,-28.2353023],[153.5790657,-28.1415563],[153.6969246,-28.6498321],[153.2584694,-30.9735401],[152.7543708,-32.508492],[151.9087862,-33.0553457],[151.2583364,-34.3808144],[151.0144178,-35.1156752],[150.4615355,-36.1202975],[150.4127518,-36.6178579],[149.9784687,-37.5069984],[148.2013511,-36.805656],[148.0791803,-36.8171632],[147.8854228,-36.0901856],[147.6902879,-36.0441802],[146.828442,-36.188678],[145.2348401,-35.9849909],[144.8445703,-36.2149218],[144.5193454,-36.1295974],[143.2021846,-35.1317425],[142.4785593,-34.811943],[140.9937045,-34.070169],[141.0025961,-34.0197399],[140.998648,-28.9989332]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017","overlay":true},{"id":"NSW_LPI_BaseMap","name":"LPI NSW Base Map","type":"tms","template":"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Base_Map/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,19],"polygon":[[[140.9948644,-28.952966],[148.9611382,-28.8997729],[148.9870097,-28.4862285],[151.013609,-28.4786485],[151.1084711,-28.7032909],[151.8759917,-28.683118],[151.9334839,-28.4078753],[152.25544,-28.2332683],[153.0660798,-28.2104723],[153.1408196,-28.1090981],[153.4735137,-28.1164808],[153.3576523,-27.693606],[159.4938303,-27.699252],[159.4856997,-37.8474137],[149.5256879,-37.8281502],[149.9159578,-37.4869999],[148.0485886,-36.8131741],[147.9680996,-36.1567945],[146.7147701,-36.2866613],[145.3004625,-36.1567945],[144.5300673,-36.1475101],[142.8397973,-35.0254303],[142.356863,-34.7802471],[141.9774146,-34.4016159],[140.9950258,-34.1371824],[140.9948644,-28.952966]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017"},{"id":"NSW_LPI_Imagery","name":"LPI NSW Imagery","type":"tms","template":"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Imagery/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,21],"polygon":[[[140.9868688,-28.9887829],[148.9951472,-28.9727491],[148.9966717,-28.4915066],[151.0029027,-28.4930697],[151.0029027,-28.7261663],[151.4915093,-28.7323921],[151.4918687,-28.7155337],[151.9228213,-28.719635],[151.9251607,-28.4897139],[151.9955886,-28.4898718],[151.9989947,-28.1192742],[152.4967606,-28.122091],[152.4968241,-28.1146398],[153.0044563,-28.1154389],[153.0044563,-28.120397],[153.5038629,-28.119345],[153.5039264,-28.1227063],[153.5919395,-28.1223619],[153.5926582,-28.1776872],[153.6111186,-28.1757867],[153.6113881,-28.1825173],[153.7426846,-28.2162084],[153.7787253,-28.710911],[152.6237954,-32.5877239],[152.3123961,-32.6328837],[151.4141942,-33.5790388],[150.8929925,-35.2648721],[150.4620695,-35.7777256],[150.0156501,-37.5103569],[149.9918121,-37.5126787],[149.519778,-37.5130704],[149.5199577,-37.5216919],[149.4462958,-37.5353701],[149.063344,-37.5357975],[148.9836635,-37.5217631],[148.9816872,-37.5191982],[148.9863847,-37.2584972],[148.4875376,-37.265846],[148.4824774,-37.0092669],[147.994386,-37.014339],[147.988288,-36.5332184],[147.9529707,-36.5260725],[147.9486513,-36.0685992],[147.5034997,-36.0716798],[147.5047701,-36.2651047],[146.4919996,-36.266129],[146.4922536,-36.2565],[145.9929826,-36.2534267],[145.9965866,-36.0188147],[145.9831568,-36.0187058],[145.9624506,-36.0219026],[145.946236,-36.0120936],[145.9454275,-36.0060259],[145.5041534,-36.0013564],[145.5037941,-36.0109125],[145.0072008,-36.0036213],[145.0035404,-36.1520424],[144.4860806,-36.1423149],[144.4874127,-36.0137522],[143.9874676,-36.0024134],[143.9932853,-35.5723753],[143.4971691,-35.5837101],[143.4917967,-35.4065648],[143.4613438,-35.3674934],[143.4585591,-35.3555888],[143.4897755,-35.3396522],[143.4895509,-35.332214],[143.4316994,-35.2570613],[143.2505542,-35.2606556],[143.2438356,-35.0132729],[142.9933305,-35.0177207],[142.9919767,-34.7961882],[142.4971375,-34.8032323],[142.4973172,-34.8007613],[142.4211401,-34.8017571],[142.4209155,-34.7838306],[142.2330892,-34.7859191],[142.2307707,-34.7807542],[142.2269959,-34.5061271],[141.9975302,-34.5083733],[141.9945959,-34.2526687],[141.4982345,-34.2556921],[141.498171,-34.2522794],[140.9945397,-34.2528411],[140.9868688,-28.9887829]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017","best":true},{"id":"NSW_LPI_Imagery_Dates","name":"LPI NSW Imagery Dates","type":"wms","template":"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Imagery_Dates/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=0&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE","projection":"EPSG:3857","scaleExtent":[0,21],"polygon":[[[140.9868688,-28.9887829],[148.9951472,-28.9727491],[148.9966717,-28.4915066],[151.0029027,-28.4930697],[151.0029027,-28.7261663],[151.4915093,-28.7323921],[151.4918687,-28.7155337],[151.9228213,-28.719635],[151.9251607,-28.4897139],[151.9955886,-28.4898718],[151.9989947,-28.1192742],[152.4967606,-28.122091],[152.4968241,-28.1146398],[153.0044563,-28.1154389],[153.0044563,-28.120397],[153.5038629,-28.119345],[153.5039264,-28.1227063],[153.5919395,-28.1223619],[153.5926582,-28.1776872],[153.6111186,-28.1757867],[153.6113881,-28.1825173],[153.7426846,-28.2162084],[153.7787253,-28.710911],[152.6237954,-32.5877239],[152.3123961,-32.6328837],[151.4141942,-33.5790388],[150.8929925,-35.2648721],[150.4620695,-35.7777256],[150.0156501,-37.5103569],[149.9918121,-37.5126787],[149.519778,-37.5130704],[149.5199577,-37.5216919],[149.4462958,-37.5353701],[149.063344,-37.5357975],[148.9836635,-37.5217631],[148.9816872,-37.5191982],[148.9863847,-37.2584972],[148.4875376,-37.265846],[148.4824774,-37.0092669],[147.994386,-37.014339],[147.988288,-36.5332184],[147.9529707,-36.5260725],[147.9486513,-36.0685992],[147.5034997,-36.0716798],[147.5047701,-36.2651047],[146.4919996,-36.266129],[146.4922536,-36.2565],[145.9929826,-36.2534267],[145.9965866,-36.0188147],[145.9831568,-36.0187058],[145.9624506,-36.0219026],[145.946236,-36.0120936],[145.9454275,-36.0060259],[145.5041534,-36.0013564],[145.5037941,-36.0109125],[145.0072008,-36.0036213],[145.0035404,-36.1520424],[144.4860806,-36.1423149],[144.4874127,-36.0137522],[143.9874676,-36.0024134],[143.9932853,-35.5723753],[143.4971691,-35.5837101],[143.4917967,-35.4065648],[143.4613438,-35.3674934],[143.4585591,-35.3555888],[143.4897755,-35.3396522],[143.4895509,-35.332214],[143.4316994,-35.2570613],[143.2505542,-35.2606556],[143.2438356,-35.0132729],[142.9933305,-35.0177207],[142.9919767,-34.7961882],[142.4971375,-34.8032323],[142.4973172,-34.8007613],[142.4211401,-34.8017571],[142.4209155,-34.7838306],[142.2330892,-34.7859191],[142.2307707,-34.7807542],[142.2269959,-34.5061271],[141.9975302,-34.5083733],[141.9945959,-34.2526687],[141.4982345,-34.2556921],[141.498171,-34.2522794],[140.9945397,-34.2528411],[140.9868688,-28.9887829]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017","overlay":true},{"id":"NSW_LPI_TopographicMap","name":"LPI NSW Topographic Map","type":"tms","template":"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Topo_Map/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,16],"polygon":[[[140.9988422,-28.9992444],[148.9502438,-28.9993736],[148.9498845,-28.9665265],[148.9998308,-28.9665265],[149.0000917,-28.8165829],[149.1000729,-28.8165829],[149.0997046,-28.7488533],[148.9998504,-28.7497444],[148.9998169,-28.5000304],[151.0000514,-28.5005192],[151.0005904,-28.7325849],[151.0239466,-28.7327424],[151.0241262,-28.7418794],[151.0329297,-28.7418794],[151.033828,-28.7505431],[151.999984,-28.7495314],[151.999984,-28.7164478],[152.0334014,-28.7166053],[152.0332217,-28.683196],[152.0000739,-28.6833537],[151.9998769,-28.6416273],[151.9829886,-28.6413908],[151.9831683,-28.624912],[151.9331321,-28.6247543],[151.9334122,-28.500071],[151.9998875,-28.5002289],[151.9998556,-28.3749591],[152.2499739,-28.3750718],[152.2499356,-28.2500066],[152.9997192,-28.2498563],[152.9998989,-28.2832447],[153.1165002,-28.2834029],[153.11659,-28.2498563],[153.1666262,-28.2500146],[153.166716,-28.2331582],[153.2499898,-28.2332373],[153.2500265,-28.1249689],[153.6249628,-28.1250833],[153.6248398,-28.4999134],[153.7497955,-28.4999924],[153.7495877,-28.7497976],[153.6248117,-28.7501127],[153.6249745,-28.9999333],[153.4997672,-29.0000612],[153.4998417,-29.4995077],[153.3747962,-29.500055],[153.3754111,-29.8750302],[153.4999113,-29.8751403],[153.4999113,-30.0000922],[153.2498947,-29.9997621],[153.250025,-30.1917704],[153.2748185,-30.1916151],[153.2748185,-30.2168467],[153.2166077,-30.2166139],[153.2166077,-30.250065],[153.250025,-30.250065],[153.2497502,-30.3751935],[153.1243608,-30.3749743],[153.1246457,-30.6250359],[153.0331676,-30.6250482],[153.0333884,-30.8750837],[153.1249214,-30.8750291],[153.1249344,-31.1250505],[153.0082433,-31.1249736],[153.0082914,-31.2499759],[153.0000019,-31.250003],[152.9999392,-31.6249919],[152.8749386,-31.6250491],[152.8749572,-31.749954],[152.7832899,-31.7500034],[152.7831966,-31.8748579],[152.749914,-31.8750105],[152.7500397,-32.0000207],[152.6249044,-31.9999446],[152.6249078,-32.5000047],[152.4999757,-32.4999569],[152.5000336,-32.5666443],[152.4166699,-32.5663415],[152.4167598,-32.6249954],[152.3498477,-32.624991],[152.3498477,-32.6332294],[152.2830786,-32.6332218],[152.2832583,-32.6249755],[152.2494816,-32.6249755],[152.2498101,-32.874906],[151.8745693,-32.8750443],[151.8748535,-33.0000091],[151.7497706,-33.0001533],[151.7504669,-33.2500398],[151.6252418,-33.2497393],[151.6250828,-33.3751621],[151.499585,-33.3751442],[151.5003127,-33.6249385],[151.3741466,-33.6243658],[151.3727902,-34.001962],[151.2477819,-34.0011194],[151.2477819,-34.2493114],[150.9957327,-34.2501515],[151.0008143,-34.62483],[150.8717407,-34.6265026],[150.872757,-35.1242738],[150.7670589,-35.1234425],[150.7690916,-35.2463774],[150.6257894,-35.2496974],[150.6280314,-35.3751485],[150.4999742,-35.3751485],[150.4959088,-35.6275034],[150.3719169,-35.6250251],[150.3749658,-35.7537957],[150.2672351,-35.7513213],[150.2652024,-35.8741232],[150.2479249,-35.870829],[150.2458922,-36.374885],[150.1229166,-36.374885],[150.1259656,-36.6224345],[150.0253491,-36.6240658],[150.0283981,-36.7471337],[149.9928266,-36.7495768],[150.0040062,-37.1224477],[150.0588879,-37.1273097],[150.0568553,-37.37809],[149.9979083,-37.3732441],[149.9999409,-37.4830073],[149.987745,-37.4846202],[149.9857123,-37.5080043],[148.0684571,-36.80624],[147.9930603,-36.1379955],[147.8148345,-36.0055567],[147.3893924,-36.0113701],[147.3822059,-36.1310306],[146.9972549,-36.1275479],[146.9886311,-36.2528271],[146.4956356,-36.2447132],[146.5042595,-36.126387],[145.0011817,-36.0079505],[145.0154103,-36.2542074],[144.5072465,-36.2476506],[144.4991158,-36.0211037],[143.9965422,-35.9810531],[143.3382568,-35.2331794],[142.4097581,-34.7669434],[142.0361436,-34.3758837],[140.9965216,-34.1385805],[140.9988422,-28.9992444]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017"},{"id":"orthophoto_lyon_2012","name":"Lyon Orthophoto 2012-03 10cm","type":"wms","template":"https://download.data.grandlyon.com/wms/grandlyon?language=fre&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1830_5150_10cm_CC46,1830_5155_10cm_CC46,1830_5160_10cm_CC46,1830_5165_10cm_CC46,1830_5170_10cm_CC46,1830_5175_10cm_CC46,1830_5180_10cm_CC46,1830_5185_10cm_CC46,1830_5190_10cm_CC46,1835_5150_10cm_CC46,1835_5155_10cm_CC46,1835_5160_10cm_CC46,1835_5165_10cm_CC46,1835_5170_10cm_CC46,1835_5175_10cm_CC46,1835_5180_10cm_CC46,1835_5185_10cm_CC46,1835_5190_10cm_CC46,1840_5150_10cm_CC46,1840_5155_10cm_CC46,1840_5160_10cm_CC46,1840_5165_10cm_CC46,1840_5170_10cm_CC46,1840_5175_10cm_CC46,1840_5180_10cm_CC46,1840_5185_10cm_CC46,1840_5190_10cm_CC46,1845_5150_10cm_CC46,1845_5155_10cm_CC46,1845_5160_10cm_CC46,1845_5165_10cm_CC46,1845_5170_10cm_CC46,1845_5175_10cm_CC46,1845_5180_10cm_CC46,1845_5185_10cm_CC46,1845_5190_10cm_CC46,1850_5155_10cm_CC46,1850_5160_10cm_CC46,1850_5165_10cm_CC46,1850_5170_10cm_CC46,1850_5175_10cm_CC46,1850_5180_10cm_CC46,1850_5185_10cm_CC46,1855_5155_10cm_CC46,1855_5165_10cm_CC46,1855_5170_10cm_CC46,1855_5175_10cm_CC46,1855_5180_10cm_CC46,1855_5185_10cm_CC46,1860_5155_10cm_CC46,1860_5160_10cm_CC46,1860_5165_10cm_CC46,1860_5170_10cm_CC46,1860_5175_10cm_CC46,1860_5180_10cm_CC46,1860_5185_10cm_CC46,1865_5155_10cm_CC46,1865_5160_10cm_CC46,1865_5165_10cm_CC46,1865_5170_10cm_CC46&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2012-03-01T00:00:00.000Z","startDate":"2012-03-01T00:00:00.000Z","polygon":[[[4.690486,45.546522],[4.831309,45.546522],[4.831309,45.571307],[4.883437,45.571307],[4.883437,45.59745],[5.166222,45.59745],[5.166222,45.745327],[5.107934,45.745327],[5.107934,45.881452],[4.906982,45.881452],[4.906982,45.92107],[4.84377,45.92107],[4.84377,45.940115],[4.715432,45.940115],[4.715432,45.870179],[4.674581,45.870179],[4.674581,45.717805],[4.695675,45.717805],[4.690486,45.546522]]],"terms_url":"http://smartdata.grandlyon.com/imagerie/orthophotographie-2012-du-grand-lyon/","terms_text":"Grand Lyon Smart Data DSIT"},{"id":"orthophoto_lyon_2015_8cm","name":"Lyon Orthophoto 2015-05 8cm","type":"wms","template":"https://download.data.grandlyon.com/wms/grandlyon?language=fre&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1835_5155_8cm_CC46,1835_5160_8cm_CC46,1835_5165_8cm_CC46,1835_5170_8cm_CC46,1835_5180_8cm_CC46,1835_5175_8cm_CC46,1845_5175_8cm_CC46,1845_5180_8cm_CC46,1845_5185_8cm_CC46,1845_5190_8cm_CC46,1850_5165_8cm_CC46,1850_5160_8cm_CC46,1850_5155_8cm_CC46,1850_5170_8cm_CC46,1850_5175_8cm_CC46,1850_5180_8cm_CC46,1850_5185_8cm_CC46,1855_5155_8cm_CC46,1855_5160_8cm_CC46,1855_5185_8cm_CC46,1855_5180_8cm_CC46,1855_5175_8cm_CC46,1855_5170_8cm_CC46,1855_5165_8cm_CC46,1860_5160_8cm_CC46,1860_5155_8cm_CC46,1860_5165_8cm_CC46,1835_5185_8cm_CC46,1835_5190_8cm_CC46,1835_5195_8cm_CC46,1840_5160_8cm_CC46,1840_5155_8cm_CC46,1840_5150_8cm_CC46,1830_5195_8cm_CC46,1830_5190_8cm_CC46,1830_5175_8cm_CC46,1830_5170_8cm_CC46,1830_5165_8cm_CC46,1830_5160_8cm_CC46,1830_5155_8cm_CC46,1830_5180_8cm_CC46,1830_5185_8cm_CC46,1835_5150_8cm_CC46,1860_5170_8cm_CC46,1860_5175_8cm_CC46,1840_5180_8cm_CC46,1840_5175_8cm_CC46,1840_5185_8cm_CC46,1840_5190_8cm_CC46,1840_5195_8cm_CC46,1845_5150_8cm_CC46,1845_5155_8cm_CC46,1845_5160_8cm_CC46,1845_5170_8cm_CC46,1845_5165_8cm_CC46,1840_5170_8cm_CC46,1840_5165_8cm_CC46,1860_5180_8cm_CC46,1860_5185_8cm_CC46,1865_5155_8cm_CC46,1865_5160_8cm_CC46,1865_5165_8cm_CC46,1865_5170_8cm_CC46,1830_5150_8cm_CC46&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2015-05-01T00:00:00.000Z","startDate":"2015-05-01T00:00:00.000Z","polygon":[[[4.664889,45.546882],[4.882528,45.543476],[4.884346,45.597449],[5.166229,45.592416],[5.17217,45.745324],[5.107932,45.746531],[5.113048,45.88145],[4.906978,45.885083],[4.908215,45.921064],[4.84377,45.922124],[4.844965,45.958104],[4.677293,45.96069],[4.664889,45.546882]]],"terms_url":"http://data.grandlyon.com/imagerie/orthophotographie-2015-du-grand-lyon/","terms_text":"Métropole de Lyon DINSI","best":true},{"id":"major_isidoro","name":"Major Isidoro AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Major%20Isidoro&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.94048110193,-9.57587518044],[-36.94106045907,-9.48535688436],[-37.03214827722,-9.48605530547],[-37.03164402192,-9.57639356782],[-36.94048110193,-9.57587518044]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"Mapbox","name":"Mapbox Satellite","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmap/cj8gojt0i1eau2rnn7q4mdgu7/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJhNVlHd29ZIn0.ti6wATGDWOmCnCYen-Ip7Q","scaleExtent":[0,22],"terms_url":"http://www.mapbox.com/about/maps/","terms_text":"Terms & Feedback","default":true,"description":"Satellite and aerial imagery.","icon":"data:image/png;base64,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"},{"id":"mar_vermelho_al","name":"Mar Vermelho AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Mar%20Vermelho&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.34201321548,-9.49288996873],[-36.34219560569,-9.47533412032],[-36.34275350517,-9.4029001574],[-36.344727611,-9.4029001574],[-36.34537134116,-9.40279431056],[-36.34702358192,-9.40293191144],[-36.35080013221,-9.40291074208],[-36.35899696296,-9.40306951227],[-36.36108908599,-9.40299541952],[-36.36289153045,-9.40306951227],[-36.36589560455,-9.40304834292],[-36.36712942069,-9.4030060042],[-36.37571248954,-9.40306951227],[-36.38048682159,-9.40308009695],[-36.38663444465,-9.40319652837],[-36.3885227198,-9.40312243565],[-36.39285716956,-9.40324945173],[-36.396558618,-9.40321769772],[-36.40309247916,-9.40327062108],[-36.41973290389,-9.40337646777],[-36.43368039077,-9.4033976371],[-36.43355164474,-9.41685048724],[-36.43344435638,-9.4238571931],[-36.43337998336,-9.43753150237],[-36.43329415267,-9.45011519778],[-36.4330044741,-9.49358837449],[-36.40839252418,-9.49350371932],[-36.40442285484,-9.49353546501],[-36.40007767623,-9.49351430122],[-36.397867536,-9.49341906413],[-36.3916769976,-9.49328149941],[-36.38756785339,-9.49331324512],[-36.38535771316,-9.49340848223],[-36.37673172897,-9.49331324512],[-36.37427482551,-9.49318626226],[-36.36706504768,-9.49298520596],[-36.36501583999,-9.49299578788],[-36.36043462699,-9.49298520596],[-36.35955486243,-9.49295346022],[-36.35895404762,-9.49303811553],[-36.35703358596,-9.49294287831],[-36.35664734786,-9.49299578788],[-36.35260257667,-9.49299578788],[-36.34766731208,-9.49297462405],[-36.34201321548,-9.49288996873]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"geodata.md.gov-MD_SixInchImagery","name":"MD Latest 6 Inch Aerial Imagery","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/MD_SixInchImagery/http://geodata.md.gov/imap/services/Imagery/MD_SixInchImagery/MapServer/WmsServer","endDate":"2016-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[-76.234131,37.920368],[-76.598053,38.158317],[-76.940002,38.270532],[-77.038193,38.413786],[-77.23526,38.33627],[-77.312164,38.410558],[-77.262726,38.566422],[-77.042999,38.713376],[-77.049866,38.793697],[-76.92627,38.892503],[-77.040939,38.984499],[-77.12162,38.925229],[-77.150116,38.955137],[-77.252426,38.975425],[-77.259293,39.024252],[-77.34581,39.054918],[-77.461853,39.070379],[-77.537384,39.139647],[-77.474213,39.224807],[-77.572746,39.304284],[-77.723465,39.328986],[-77.777023,39.463234],[-77.861481,39.516225],[-77.840881,39.608862],[-77.956238,39.59299],[-78.166351,39.695564],[-78.270035,39.621557],[-78.338699,39.640066],[-78.466415,39.523641],[-78.662796,39.540058],[-78.798752,39.606217],[-78.9814,39.446799],[-79.06723,39.476486],[-79.485054,39.199536],[-79.485569,39.72158],[-75.788359,39.721811],[-75.690994,38.460579],[-75.049238,38.458159],[-75.049839,38.402218],[-75.081511,38.323208],[-75.097733,38.309066],[-75.186996,38.097551],[-75.23798,38.022402],[-75.61821,37.989669],[-75.863686,37.909534],[-76.234131,37.920368]]],"terms_url":"http://imap.maryland.gov/Pages/imagery-products.aspx","terms_text":"DoIT, MD iMap, MDP","description":"Six Inch resolution aerial imagery for the State of Maryland"},{"id":"geodata.md.gov-MD_ThreeInchImagery","name":"MD Three Inch Aerial Imagery","type":"wms","template":"http://geodata.md.gov/imap/services/Imagery/MD_ThreeInchImagery/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=MD_ThreeInchImagery&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","scaleExtent":[0,20],"polygon":[[[-76.46298868788,38.98080463627],[-76.46325795583,38.94779459044],[-76.49498669632,38.93690418359],[-76.51616910865,38.93697399921],[-76.54762858119,38.95910208849],[-76.54744906922,38.98666527704],[-76.51558569475,39.0030585399],[-76.48390183225,39.00291903879],[-76.46298868788,38.98080463627]],[[-76.09548280964,38.8413320581],[-76.04279604678,38.84089512141],[-76.04288580276,38.82980476995],[-76.0322945966,38.8296998884],[-76.03276581552,38.79667199901],[-76.02545070279,38.79663702224],[-76.0254058248,38.7746157424],[-76.03307996147,38.77472070505],[-76.03366337536,38.7307278267],[-76.05462139773,38.73093788097],[-76.0548009097,38.72004925436],[-76.10753255055,38.72043441094],[-76.10713709241,38.75338442343],[-76.11753984459,38.75346037077],[-76.11701334711,38.79730508527],[-76.09601366219,38.79715186708],[-76.09548280964,38.8413320581]],[[-77.23397015511,39.16838491616],[-77.25516378693,39.14647458509],[-77.25496183597,39.11342872174],[-77.18093418537,39.05337051467],[-77.14907221334,39.04769565692],[-77.12797815456,39.04779422613],[-77.10683080317,39.05325234984],[-77.1068770836,39.09169503464],[-77.11774597234,39.10827342699],[-77.16011079699,39.12484737677],[-77.15975177305,39.15213714767],[-77.17047901562,39.16302432313],[-77.21284384027,39.17271658577],[-77.23397015511,39.16838491616]]],"terms_url":"http://imap.maryland.gov/Pages/imagery-products.aspx","terms_text":"DoIT, MD iMap, MDP","description":"Three Inch Resolution Imagery for the cities of Rockville, Gaithersburg and Annapolis"},{"id":"geodata.md.gov-MD_ColorBasemap","name":"MD Transportation Basemap","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/MD_ColorBasemap/http://geodata.md.gov/imap/services/Transportation/MD_ColorBasemap/MapServer/WmsServer","polygon":[[[-76.234131,37.920368],[-76.598053,38.158317],[-76.940002,38.270532],[-77.038193,38.413786],[-77.23526,38.33627],[-77.312164,38.410558],[-77.262726,38.566422],[-77.042999,38.713376],[-77.049866,38.793697],[-76.92627,38.892503],[-77.040939,38.984499],[-77.12162,38.925229],[-77.150116,38.955137],[-77.252426,38.975425],[-77.259293,39.024252],[-77.34581,39.054918],[-77.461853,39.070379],[-77.537384,39.139647],[-77.474213,39.224807],[-77.572746,39.304284],[-77.723465,39.328986],[-77.777023,39.463234],[-77.861481,39.516225],[-77.840881,39.608862],[-77.956238,39.59299],[-78.166351,39.695564],[-78.270035,39.621557],[-78.338699,39.640066],[-78.466415,39.523641],[-78.662796,39.540058],[-78.798752,39.606217],[-78.9814,39.446799],[-79.06723,39.476486],[-79.485054,39.199536],[-79.485569,39.72158],[-75.788359,39.721811],[-75.690994,38.460579],[-75.049238,38.458159],[-75.049839,38.402218],[-75.081511,38.323208],[-75.097733,38.309066],[-75.186996,38.097551],[-75.23798,38.022402],[-75.61821,37.989669],[-75.863686,37.909534],[-76.234131,37.920368]]],"terms_url":"http://imap.maryland.gov/Pages/imagery-products.aspx","terms_text":"DoIT, MD iMap, MDP","description":"Maryland State Highway Administration road features and additional Maryland focused landmarks"},{"id":"minador_do_negrao","name":"Minador do Negrão","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Minador%20do%20Negrao&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.81960228856,-9.35174057847],[-36.82016893109,-9.26141767312],[-36.82465236584,-9.26132936954],[-36.83063690623,-9.26146673066],[-36.83673079868,-9.26149616517],[-36.84227793081,-9.26147654216],[-36.8456181394,-9.26160409172],[-36.85563876517,-9.26160409172],[-36.8621402426,-9.26159428022],[-36.86589797726,-9.26146673066],[-36.86724002536,-9.26149616517],[-36.86951653657,-9.26148635367],[-36.87126616964,-9.26157465721],[-36.87475549468,-9.26152559969],[-36.87815534986,-9.26163352623],[-36.88320542713,-9.26170220674],[-36.88565093699,-9.26167277223],[-36.88857361951,-9.26147654216],[-36.89217229662,-9.26150597668],[-36.89383245981,-9.26163352623],[-36.89740131364,-9.26175126423],[-36.91121943846,-9.26182975621],[-36.91110014529,-9.26650980886],[-36.91112002749,-9.28541580138],[-36.91120949736,-9.29066455986],[-36.91117967407,-9.29367642875],[-36.91099079323,-9.2992880502],[-36.91091126445,-9.30729328446],[-36.91090132335,-9.3122964628],[-36.91083173567,-9.31596541472],[-36.91084167677,-9.32013463149],[-36.91098085213,-9.32395064743],[-36.91099079323,-9.3258733543],[-36.91079197129,-9.32964025951],[-36.91079197129,-9.33523168439],[-36.9107422658,-9.33943990818],[-36.91092120555,-9.34310857462],[-36.91084167677,-9.3447074733],[-36.91066273702,-9.35228988056],[-36.89276876244,-9.35225064472],[-36.877350121,-9.35212312823],[-36.86462551685,-9.35203484755],[-36.85760710237,-9.35193675789],[-36.84344103915,-9.35190733098],[-36.83115384327,-9.3517994323],[-36.81960228856,-9.35174057847]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"NC-US","name":"NC Latest Orthoimagery","type":"wms","template":"https://services.nconemap.gov/secure/services/Imagery/Orthoimagery_All/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2013-01-01T00:00:00.000Z","startDate":"1995-01-01T00:00:00.000Z","polygon":[[[-81.6792,36.5974],[-80.2535886,36.5479298],[-75.8409,36.5671],[-75.4323,35.6441],[-75.5047482,35.1880648],[-75.7052487,35.1768406],[-76.1474484,34.9407747],[-76.5347165,34.5548667],[-76.6967648,34.6678918],[-77.2790402,34.5322432],[-77.688281,34.2648225],[-77.9435,33.8269],[-78.2128781,33.8940169],[-78.5301,33.8304],[-79.6693,34.7916],[-80.8122,34.8085],[-80.8468503,34.9632866],[-80.9512204,35.0555205],[-81.0638303,35.0172898],[-81.0748166,35.1341745],[-82.3632,35.1805],[-82.9989,34.9919],[-84.3333,34.9767],[-84.2718381,35.2822869],[-84.0905637,35.2733181],[-83.9147824,35.53301],[-83.5549802,35.591102],[-83.2556027,35.7339181],[-82.9864377,35.8141398],[-82.9232663,35.9676717],[-82.6788205,36.0853997],[-82.6019162,36.0898388],[-82.5359982,35.9698946],[-82.3547238,36.1475245],[-82.0443601,36.1430887],[-81.9042844,36.3380291],[-81.742236,36.3734205],[-81.6792,36.5974]]],"description":"Most recent true color imagery for the state of North Carolina. The imagery has a pixel resolution of 6 inches and is comprised of imagery flown in 2010, 2012, 2013, and 2014"},{"id":"geodata.state.nj.us-Infrared2015","name":"NJ 2015 Aerial Imagery (Infrared)","type":"wms","template":"http://geodata.state.nj.us/imagerywms/Infrared2015?FORMAT=image/png&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&WIDTH={width}&HEIGHT={height}&LAYERS=Infrared2015&BBOX={bbox}","projection":"EPSG:3857","endDate":"2015-05-03T00:00:00.000Z","startDate":"2015-03-29T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[-74.86599,40.085427],[-74.840927,40.107225],[-74.822903,40.130329],[-74.788055,40.124685],[-74.726086,40.149488],[-74.729176,40.16392],[-74.763336,40.191725],[-74.775524,40.214276],[-74.844017,40.247957],[-74.868393,40.291573],[-74.944611,40.33817],[-74.967098,40.395195],[-75.002632,40.406046],[-75.026836,40.402516],[-75.06134,40.416502],[-75.074215,40.455046],[-75.069065,40.536503],[-75.102367,40.567024],[-75.135927,40.573609],[-75.16777,40.559069],[-75.197639,40.573674],[-75.203733,40.618318],[-75.205064,40.691312],[-75.198326,40.753889],[-75.172405,40.780671],[-75.1367,40.777292],[-75.090179,40.822383],[-75.100994,40.839269],[-75.096874,40.850956],[-75.068464,40.850372],[-75.057049,40.867574],[-75.13773,40.973094],[-75.135155,40.994411],[-75.039024,41.03819],[-74.981518,41.112598],[-74.905472,41.170384],[-74.84024,41.278645],[-74.798012,41.322685],[-74.757156,41.347691],[-74.695702,41.360576],[-74.041054,41.059088],[-74.041051,41.059087],[-74.04105,41.059087],[-74.04105,41.059086],[-74.041049,41.059086],[-73.890266,40.998039],[-73.933406,40.882078],[-73.933407,40.882077],[-73.933408,40.882076],[-73.933408,40.882075],[-74.011459,40.75558],[-74.024543,40.709436],[-74.066048,40.651732],[-74.152222,40.638967],[-74.183121,40.644568],[-74.200459,40.631281],[-74.199257,40.598444],[-74.21505,40.558026],[-74.246807,40.548113],[-74.24715,40.519541],[-74.267578,40.489651],[-74.26054,40.469282],[-74.199257,40.445641],[-74.181061,40.460401],[-74.136429,40.459095],[-73.997555,40.413496],[-74.026566,40.47777],[-74.003906,40.484037],[-73.977814,40.452042],[-73.964767,40.33189],[-74.088364,39.756824],[-74.356842,39.383406],[-74.609528,39.215231],[-74.776382,38.998909],[-74.863586,38.931639],[-74.931221,38.920688],[-74.980316,38.930304],[-74.960747,39.00798],[-74.905472,39.100226],[-74.899979,39.164141],[-75.101166,39.201398],[-75.135498,39.171062],[-75.425949,39.378099],[-75.475044,39.43195],[-75.543365,39.457403],[-75.552292,39.482845],[-75.538902,39.541911],[-75.519676,39.56997],[-75.571175,39.608069],[-75.577698,39.625524],[-75.539932,39.656456],[-75.472984,39.747454],[-75.466253,39.750761],[-75.466252,39.750762],[-75.466252,39.750763],[-75.466251,39.750764],[-75.466251,39.750765],[-75.46625,39.750767],[-75.466249,39.750768],[-75.466249,39.750769],[-75.465088,39.764478],[-75.415041,39.801786],[-75.324669,39.858891],[-75.246048,39.864689],[-75.143738,39.900255],[-75.142365,39.957912],[-75.07061,39.987117],[-75.056534,40.008683],[-74.935341,40.072555],[-74.86599,40.085427]]],"terms_url":"https://njgin.state.nj.us/NJ_NJGINExplorer/ShowMetadata.jsp?docId={E30775F2-6370-4525-8E68-C371ED29BBB3}","terms_text":"NJ Office of Information Technology (NJOIT), Office of Geographic Information Systems (OGIS)","description":"Digital orthophotography of New Jersey, Near Infrared, 1 foot resolution"},{"id":"geodata.state.nj.us-Natural2015","name":"NJ 2015 Aerial Imagery (Natural Color)","type":"wms","template":"http://geodata.state.nj.us/imagerywms/Natural2015?FORMAT=image/png&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&WIDTH={width}&HEIGHT={height}&LAYERS=Natural2015&BBOX={bbox}","projection":"EPSG:3857","endDate":"2015-05-03T00:00:00.000Z","startDate":"2015-03-29T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[-74.86599,40.085427],[-74.840927,40.107225],[-74.822903,40.130329],[-74.788055,40.124685],[-74.726086,40.149488],[-74.729176,40.16392],[-74.763336,40.191725],[-74.775524,40.214276],[-74.844017,40.247957],[-74.868393,40.291573],[-74.944611,40.33817],[-74.967098,40.395195],[-75.002632,40.406046],[-75.026836,40.402516],[-75.06134,40.416502],[-75.074215,40.455046],[-75.069065,40.536503],[-75.102367,40.567024],[-75.135927,40.573609],[-75.16777,40.559069],[-75.197639,40.573674],[-75.203733,40.618318],[-75.205064,40.691312],[-75.198326,40.753889],[-75.172405,40.780671],[-75.1367,40.777292],[-75.090179,40.822383],[-75.100994,40.839269],[-75.096874,40.850956],[-75.068464,40.850372],[-75.057049,40.867574],[-75.13773,40.973094],[-75.135155,40.994411],[-75.039024,41.03819],[-74.981518,41.112598],[-74.905472,41.170384],[-74.84024,41.278645],[-74.798012,41.322685],[-74.757156,41.347691],[-74.695702,41.360576],[-74.041054,41.059088],[-74.041051,41.059087],[-74.04105,41.059087],[-74.04105,41.059086],[-74.041049,41.059086],[-73.890266,40.998039],[-73.933406,40.882078],[-73.933407,40.882077],[-73.933408,40.882076],[-73.933408,40.882075],[-74.011459,40.75558],[-74.024543,40.709436],[-74.066048,40.651732],[-74.152222,40.638967],[-74.183121,40.644568],[-74.200459,40.631281],[-74.199257,40.598444],[-74.21505,40.558026],[-74.246807,40.548113],[-74.24715,40.519541],[-74.267578,40.489651],[-74.26054,40.469282],[-74.199257,40.445641],[-74.181061,40.460401],[-74.136429,40.459095],[-73.997555,40.413496],[-74.026566,40.47777],[-74.003906,40.484037],[-73.977814,40.452042],[-73.964767,40.33189],[-74.088364,39.756824],[-74.356842,39.383406],[-74.609528,39.215231],[-74.776382,38.998909],[-74.863586,38.931639],[-74.931221,38.920688],[-74.980316,38.930304],[-74.960747,39.00798],[-74.905472,39.100226],[-74.899979,39.164141],[-75.101166,39.201398],[-75.135498,39.171062],[-75.425949,39.378099],[-75.475044,39.43195],[-75.543365,39.457403],[-75.552292,39.482845],[-75.538902,39.541911],[-75.519676,39.56997],[-75.571175,39.608069],[-75.577698,39.625524],[-75.539932,39.656456],[-75.472984,39.747454],[-75.466253,39.750761],[-75.466252,39.750762],[-75.466252,39.750763],[-75.466251,39.750764],[-75.466251,39.750765],[-75.46625,39.750767],[-75.466249,39.750768],[-75.466249,39.750769],[-75.465088,39.764478],[-75.415041,39.801786],[-75.324669,39.858891],[-75.246048,39.864689],[-75.143738,39.900255],[-75.142365,39.957912],[-75.07061,39.987117],[-75.056534,40.008683],[-74.935341,40.072555],[-74.86599,40.085427]]],"terms_url":"https://njgin.state.nj.us/NJ_NJGINExplorer/ShowMetadata.jsp?docId={CDC67AB8-ADA1-4B4B-9087-67A82CB9151C}","terms_text":"NJ Office of Information Technology (NJOIT), Office of Geographic Information Systems (OGIS)","description":"Digital orthophotography of New Jersey, Natural Color, 1 foot resolution"},{"id":"NLSC-EMAP5","name":"NLSC General Map with Contour line","type":"tms","template":"http://wmts.nlsc.gov.tw/wmts/EMAP5_OPENDATA/default/EPSG:3857/{zoom}/{y}/{x}","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[0,15],"polygon":[[[120.4570579,26.3970586],[120.44256,26.3708009],[120.44713,26.3531513],[120.4673009,26.3405831],[120.4978723,26.3340866],[120.5141036,26.3401594],[120.5341168,26.3641649],[120.5297045,26.3842128],[120.4956661,26.4015754],[120.4570579,26.3970586]],[[119.9007221,25.9858609],[119.8960071,25.9648902],[119.9131301,25.9470399],[119.9503542,25.9278478],[119.9905563,25.9260623],[120.0198392,25.9363284],[120.0277804,25.9557423],[120.0275322,25.9845224],[119.9989937,26.0010288],[119.9404278,26.0028131],[119.9007221,25.9858609]],[[122.089,24.5485],[121.709,23.4541],[121.717,22.698],[121.818,21.95],[121.803,21.8735],[121.759,21.8087],[121.694,21.7653],[120.861,21.5631],[120.815,21.5576],[120.739,21.5728],[120.661,21.6296],[120.202,22.1809],[119.27,23.0542],[119.153,23.2049],[119.128,23.2485],[119.103,23.4],[119.118,23.4765],[119.137,23.512],[119.361,23.8885],[119.406,23.9407],[120.968,25.2284],[121.408,25.4687],[121.989,25.8147],[122.065,25.8299],[122.141,25.8147],[122.216,25.7663],[122.26,25.7015],[122.297,25.48],[122.196,24.9696],[122.089,24.5485]],[[116.6855033,20.8547596],[116.6309071,20.8149565],[116.5941695,20.7600846],[116.5797214,20.6967501],[116.5893056,20.6325865],[116.621766,20.5753367],[116.6731874,20.5319171],[116.7373678,20.5075783],[116.8065659,20.5052653],[116.8724354,20.5252581],[116.9270316,20.5651373],[116.9637692,20.6200797],[116.9782173,20.6834462],[116.9686331,20.7475883],[116.9361727,20.8047732],[116.8847512,20.8481147],[116.8205709,20.872399],[116.7513728,20.8747063],[116.6855033,20.8547596]],[[118.2261504,24.4563345],[118.2936439,24.4538527],[118.2851467,24.4751026],[118.3097372,24.4916821],[118.3767709,24.4729348],[118.4100947,24.5332285],[118.4479031,24.5284069],[118.4746394,24.4599272],[118.512992,24.4315479],[118.5065839,24.4202318],[118.4811625,24.4332439],[118.4610567,24.4089192],[118.426145,24.3970385],[118.3970055,24.4284184],[118.3765564,24.4258395],[118.3397565,24.3814628],[118.3031926,24.3705764],[118.2574234,24.4139213],[118.1381276,24.3724838],[118.1617342,24.4022433],[118.2094226,24.4139604],[118.1895784,24.4352201],[118.2176338,24.430205],[118.2261504,24.4563345]],[[120.2234496,26.30045],[120.2550843,26.3100412],[120.269888,26.3368716],[120.2591889,26.3652192],[120.2292544,26.3784823],[120.1976197,26.3688968],[120.182816,26.3420738],[120.1935151,26.3137205],[120.2234496,26.30045]],[[119.4374461,25.0047541],[119.4342024,24.9886249],[119.4541901,24.9722553],[119.4827444,24.9718376],[119.4898402,24.9937882],[119.4715877,25.0069239],[119.4374461,25.0047541]],[[119.8869914,26.180381],[119.893227,26.1203128],[119.9285109,26.1080224],[119.9779388,26.1223611],[120.0366775,26.151728],[120.1098054,26.2134921],[120.119269,26.2713663],[120.0629175,26.3172592],[119.9923706,26.3164881],[119.9467732,26.2898799],[119.9020362,26.2439761],[119.8869914,26.180381]]],"terms_url":"http://maps.nlsc.gov.tw/","terms_text":"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0","description":"The emap from Taiwan National Land Surveying and Mapping Center","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAxJJREFUOI3tlF9oW2UYxn9f4nKW2ixfjJGYMnuctRUZ5mhEpjdJEEaHtmsZaKHq0qt6ZdtZL3Zhk3ilIKS9Ui806UStE7Edjln8kwzEwaB6IshsmJIqK1ttZ7Qlzel2eryQhqZrsDC8EHyuvu993+/53j+8D/yPfxtip4GqH1X1owLkdHI3RSwbkbFu1yAPdx4t3hpSS6YLAM05i/vCqcmzZwpj9T6pIZYOZNArNADhsQj3RVNjtyS1DcKtiHlPIb96PTn67nJiq8++cRgJicTpQ7Yz0oHc7cQZeakzPbTyqr9iKXUr0lfbqOx7LHJgbXrux5/X9M0+G0C8SySeeWTPQPSLxu4jn1vd4tE7m4euDNclrCEvt6E+25/e6H+VuKen57vEe1b8I29b8cKyo6j6Uece6I/VK387jC70crgjMFBDPDEx8aA5aOPkG+f7FhcX9YhGZLIUBSD7VAtSsZOKNpGKNgFU710tbiJ7G0lFm9DucCL2R7uCXjTpQFZbMV6wMu+EbWnpQOIJVKcvFTuDIR+az4nmc1Zt6h4HuV9XGHjIx1D2EvrCKtLnUgE+Pig+kQ6kDeDFc9YQwJdP2rLuBlfzRjklw7yh7JJh0vfZL6Tb70IqdqRSnT/5JfQTBcZfDom4HaBiUjn5k/Xh0VYRe85ztZ11QX53K4ZQyPxwFcO0yP+2Ste9bi6XrxPbfxuvnV9g6uIfPK/dTskwURbOFfPTM2PSIeTT99Bzw4KMhERi5ICIl667OOHuYNzdQV5p/ccBxi89kUmm5vveDou06kLddvNSibasbvZGXvj9fYJGgbldAaYaI+SVVoq7ApxtCNXEH7ZyhL8+Nho00YJeoT3+6Xp0W2KtBU07NpzNlHulem2ecHmGzpUcmlGg+dp83aynitbkK99ayfwSel2tiLUTo3M4lSn3ys12ub5MsFL4O4GGWZq/fyszfvrPsfwSNZtnpw70i+jMfjPdf//MfXf7UYtrASqWQkUoeNzLtHumS0buzePJD4zjV1a5vPX9jmRT9aNGNCKbZXMn0vnfwl+e9BTflqrxKAAAAABJRU5ErkJggg=="},{"id":"IBGE_Salvador_Streets","name":"Nomes de Ruas IBGE Salvador-BA","type":"tms","template":"https://api.mapbox.com/styles/v1/wille/cj8lp78dn62wl2rquim47qo0g/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoid2lsbGUiLCJhIjoicFNVWk5VWSJ9.hluCd0YGvYHNlFi_utWe2g","scaleExtent":[0,20],"polygon":[[[-38.489742279052734,-12.811131765117107],[-38.54484558105469,-13.013924052026558],[-38.47755432128906,-13.034662471471638],[-38.33473205566406,-12.946846814654444],[-38.30005645751953,-12.906692193510644],[-38.33953857421875,-12.904349641337422],[-38.35481643676758,-12.830213284310222],[-38.38090896606445,-12.821844374997415],[-38.40717315673828,-12.867535227819912],[-38.46536636352539,-12.815985972925704],[-38.489742279052734,-12.811131765117107]]],"description":"Streets geometry and names of Salvador, Bahia. Source: Faces de Logradouro - IBGE.","overlay":true},{"id":"orthos.dhses.ny.gov_latest","name":"NYS Orthos Online","type":"wms","template":"http://www.orthos.dhses.ny.gov/arcgis/services/Latest/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0,1,2,3,4&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2018-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[0,19],"polygon":[[[-74.91231104790405,45.036060871422514],[-73.47787904626531,45.02996489601911],[-73.33846123282218,45.03098119095642],[-73.31977627491248,45.005581106608915],[-73.32265088382167,44.98525292658083],[-73.34852236400432,44.92829565917409],[-73.36720732191401,44.83969633391092],[-73.34277314618596,44.81727029165119],[-73.34564775509514,44.7764733152644],[-73.37295653973237,44.73462648007473],[-73.37008193082319,44.6794648966887],[-73.39739071546042,44.64470656126996],[-73.39307880209665,44.60276438225357],[-73.39739071546042,44.54542854468756],[-73.34995966845892,44.512639828752185],[-73.34564775509514,44.49521331585934],[-73.37870575755073,44.47060231167881],[-73.30827783927576,44.43571894999882],[-73.30396592591198,44.4182694555537],[-73.3327120150038,44.3391682816244],[-73.30827783927576,44.27128222420617],[-73.30827783927576,44.25172471526754],[-73.38014306200533,44.14868323115224],[-73.40457723773338,44.0413289327325],[-73.33989853727677,43.79595697288363],[-73.28096905463853,43.642215731803084],[-73.20910383190896,43.549573305004984],[-73.21341574527274,43.51205945175996],[-73.24647374772834,42.6755714070924],[-73.45919480700785,42.142839357113225],[-73.47069324264457,42.03937970922349],[-73.48794089609967,41.737642097452465],[-73.4994393317364,41.643191171126794],[-73.47787976491753,41.62707774888845],[-73.4318860223706,41.57978847312145],[-73.42613680455224,41.56365920821005],[-73.42685473812732,41.45925887814987],[-73.43979047821864,41.403222667065656],[-73.44985160940078,41.383275042836544],[-73.43835317376404,41.37033277045519],[-73.42757339035461,41.35900616964153],[-73.41751225917248,41.34390096839462],[-73.41894956362707,41.27642429018757],[-73.43044799926379,41.24455103927662],[-73.46566195840128,41.19752312226992],[-73.52962200663059,41.145049831455864],[-73.55477483458594,41.133684100459654],[-73.61586027390607,41.13530789690045],[-73.6266400573155,41.1087808553827],[-73.62735870954279,41.054068843422385],[-73.63957579740682,40.99117509837295],[-73.61873488281525,40.98195286582785],[-73.59933127267827,40.96567519162947],[-73.59933127267827,40.93473654650821],[-73.63454523181575,40.91681807360894],[-73.68053897436268,40.89183270232195],[-73.69850528004507,40.8798798402391],[-73.68628819218104,40.87064205907731],[-73.66257266868028,40.87933647703018],[-73.63813849295222,40.90541287946855],[-73.59789396822369,40.91193037416514],[-73.57561574917752,40.91790417996723],[-73.52674739772141,40.92387744595259],[-73.50159456976607,40.9428797007417],[-73.49009613412935,40.953735678064604],[-73.41751225917248,40.960791106211715],[-73.38373560448959,40.9613338002184],[-73.33702320971537,40.95590665935183],[-73.30827712062354,40.93636525766628],[-73.27090720480417,40.92659238839886],[-73.20910311325675,40.91953330604491],[-73.18682489421059,40.92713536350369],[-73.16813993630089,40.93147900372728],[-73.165983979619,40.95970570481162],[-73.1688585885282,40.970016297449746],[-73.12933271602694,40.98195286582785],[-73.10777314920807,40.98195286582785],[-73.06680997225222,40.97489970011966],[-72.85840082633648,40.97435711767307],[-72.71826364201384,40.98195286582785],[-72.65574089823912,41.00527719453338],[-72.64424246260239,41.004734862008505],[-72.62627615692,40.99225998211336],[-72.54147519409912,41.03889309392365],[-72.47679649364251,41.063280983759014],[-72.45811153573283,41.08928476815911],[-72.41858566323157,41.093076127227],[-72.36612405063899,41.138555369199075],[-72.36037483282063,41.14180268071838],[-72.32228626477396,41.15479031895286],[-72.29066556677296,41.16398833949227],[-72.21448843067962,41.182380507948444],[-72.20083403836101,41.19157465575383],[-72.04847976617432,41.25913903369694],[-72.02548289490088,41.29370497046782],[-71.9392446276254,41.30774215335454],[-71.9234342786249,41.30666247732331],[-71.90259336403332,41.299104244517785],[-71.90187471180603,41.2893852294372],[-71.99458084912716,41.24509139345555],[-72.10453463990339,41.19806386514946],[-72.1828677326786,41.16723439148816],[-72.18933560272427,41.16236525319468],[-72.25185834649899,41.12231639996208],[-72.30431995909157,41.10444889166786],[-72.3158183947283,41.09524251989042],[-72.27916713113622,41.08440984216064],[-72.27269926109055,41.080617983013646],[-72.26838734772679,41.04973327212589],[-72.2173630395888,41.04810735923019],[-72.19652212499723,41.04214533487485],[-72.18646099381509,41.05298497738375],[-72.17136929704188,41.05840412900452],[-72.14980973022301,41.058946019612705],[-72.15627760026867,41.09632568943114],[-72.1526843391322,41.10769789124652],[-72.1490910779957,41.146673346530676],[-72.13399938122251,41.145049831455864],[-72.07075798522048,41.10553190938901],[-72.07435124635697,41.05677843039375],[-72.086568334221,41.0318460205672],[-72.10956520549446,41.006904165328564],[-72.08728698644829,41.01286938123731],[-72.06213415849294,41.02534036020521],[-72.04560515726514,41.03238812991624],[-72.01901502485521,41.03293023480147],[-72.00895389367307,41.04214533487485],[-72.00176737140012,41.05135914484385],[-71.96367880335345,41.07736764390088],[-71.9219969741703,41.088743127574865],[-71.889657623942,41.08765983301127],[-71.8558809692591,41.080617983013646],[-71.84581983807696,41.07465890519177],[-71.8558809692591,41.05298497738375],[-71.89037627616929,41.03726691318444],[-71.91624775635194,41.03021966573728],[-71.99098758799067,41.00365018356915],[-72.07938181194804,40.97272934355811],[-72.31941165586478,40.88205324847025],[-72.44230118673232,40.84020260474275],[-72.6277134613746,40.78689990926171],[-72.76569468901535,40.75043362643005],[-72.88499095874643,40.71285788340029],[-72.95973079038517,40.68670572169275],[-73.0373452309331,40.65999813364621],[-73.08118301679814,40.64854874971067],[-73.22994402784832,40.616370919338586],[-73.32193151294216,40.61309772897009],[-73.35211490648857,40.61855295716485],[-73.55477483458594,40.56943986927557],[-73.75959071936519,40.57708205228237],[-73.88248025023275,40.548146328651804],[-73.93350455837073,40.53449306094386],[-73.94500299400745,40.533946872353866],[-73.94572164623476,40.56288873200082],[-74.08226556942093,40.562342774949634],[-74.08010961273904,40.5492384698493],[-74.12251009414948,40.52083701052971],[-74.15772405328697,40.51373476465814],[-74.18718879460609,40.50116740969577],[-74.22887062378922,40.48695799891573],[-74.26120997401753,40.48531825788795],[-74.27630167079074,40.49570260781157],[-74.27917627969993,40.54377758575639],[-74.26983380074509,40.56671030667376],[-74.25833536510835,40.57216932054787],[-74.22527736265275,40.57216932054787],[-74.22599601488004,40.58308601230896],[-74.25114884283539,40.59563800556682],[-74.25258614728999,40.622371351867315],[-74.24324366833514,40.64091473558487],[-74.23390118938029,40.64909400302126],[-74.2022804913793,40.65400108233582],[-74.12538470305866,40.65672708157882],[-74.11532357187652,40.691065128306576],[-74.09951322287603,40.68997530338939],[-74.07795365605716,40.71067892875261],[-74.06286195928395,40.71830495805569],[-74.0520821758745,40.743900238938934],[-74.02549204346457,40.79288499840126],[-73.98093560537225,40.869011728592994],[-73.96225064746255,40.92550642480473],[-73.94931490737123,40.964589870550604],[-73.94644029846205,40.99876890966543],[-73.98165425759954,41.01612290773734],[-74.04561430582885,41.04322937947981],[-74.18072092456043,41.09524251989042],[-74.30792236879175,41.14937911566324],[-74.44087303084143,41.215365278476916],[-74.5278299503442,41.25913903369694],[-74.61334956539238,41.30234359441648],[-74.65790600348473,41.310981074177676],[-74.70246244157704,41.33580745460507],[-74.76714114203365,41.38974521327815],[-74.79660588335277,41.41022983858581],[-74.85337940930913,41.42262529077297],[-74.90727832635629,41.431785626305874],[-74.99782850699555,41.471106493417004],[-75.04166629286057,41.527084094166106],[-75.08478542649831,41.593225913275326],[-75.08406677427102,41.61848173934118],[-75.07328699086159,41.664668930702504],[-75.0876600354075,41.70277526731324],[-75.0876600354075,41.71350537258048],[-75.12143669009038,41.76176868230114],[-75.1192807334085,41.792316684103675],[-75.13077916904523,41.816958847412266],[-75.18755269500159,41.838379111347166],[-75.25295004768549,41.84962188079648],[-75.28744535459568,41.85497488617851],[-75.29822513800511,41.88226824503906],[-75.30613031250536,41.93040456765947],[-75.34062561941555,41.940027476740525],[-75.36649709959819,41.95659686103546],[-75.37224631741655,41.97743609810382],[-75.58065546333229,41.97957307031645],[-75.58137411555958,41.923988488332995],[-75.78906460924802,41.92666193313772],[-75.78690865256613,41.98277839417683],[-79.7768658185114,41.98117575241552],[-79.7818971027547,42.20994439336295],[-79.77183597157256,42.28016852623668],[-79.72153031566185,42.29824389979878],[-79.57348795683896,42.367307788746416],[-79.42975751137983,42.46599037989962],[-79.37370263765078,42.499909767684656],[-79.2572809768289,42.54545998533663],[-79.1897276674631,42.56240042582576],[-79.16529349173506,42.56981042255861],[-79.12073705364273,42.62482855594211],[-79.09630287791468,42.64597644140587],[-79.06899409327744,42.696702043447694],[-79.03162417745807,42.7104331026147],[-78.98850504382034,42.723105230911976],[-78.88358181863518,42.776932904700104],[-78.88645642754436,42.814900763418876],[-78.93963669236422,42.88655426672713],[-78.93963669236422,42.93603089533893],[-79.04887183091316,42.96969438273069],[-79.04743452645856,43.05167198470151],[-79.09342826900549,43.05272226918912],[-79.0919909645509,43.09261975149211],[-79.08624174673254,43.265557535860246],[-79.06468217991367,43.27602287004617],[-78.84908651172498,43.33041359857192],[-78.72979024199391,43.35236529048099],[-78.63924006135466,43.370129894376525],[-78.54868988071541,43.379532578835416],[-78.47826196244044,43.38788929664161],[-77.95508314096922,43.38475566245842],[-77.73158157962807,43.34713889446963],[-77.7114593172638,43.340344586318594],[-77.66259096580768,43.311591022674435],[-77.61515991880619,43.28387016659478],[-77.55335582725876,43.25299623609951],[-77.52820299930342,43.25508987878669],[-77.45633777657385,43.27863839921907],[-77.42256112189095,43.28491646608342],[-77.16384632006454,43.29433235167476],[-77.05029926815182,43.29380928516081],[-76.94178278183018,43.29328621414787],[-76.91447399719296,43.3079305018789],[-76.85051394896364,43.31629708261557],[-76.80236424973484,43.328322024532355],[-76.7599637683244,43.35184220081927],[-76.64785402086628,43.42808936716575],[-76.545086752363,43.4802581022461],[-76.51993392440767,43.49485728312425],[-76.44303813608703,43.52717148354531],[-76.42219722149545,43.538112693359565],[-76.28206003717281,43.538633653838865],[-76.23822225130777,43.55686443488524],[-76.24037820798966,43.74146501378322],[-76.30649421290086,43.82914593255031],[-76.31152477849193,43.86749827350751],[-76.34602008540212,43.861798810265746],[-76.40063765467659,43.8612806502232],[-76.47178422517885,43.8840754318208],[-76.46675365958778,43.90893252243542],[-76.41860396035898,43.93119152129071],[-76.37189156558476,43.93222662089228],[-76.36973560890287,43.90271922256843],[-76.33308434531081,43.92963883810956],[-76.27846677603632,43.92963883810956],[-76.27846677603632,43.90427260833489],[-76.2669683403996,43.8959874158668],[-76.2360662946259,43.91203892916922],[-76.19294716098815,43.93326170247849],[-76.19007255207897,43.95085533306909],[-76.21522538003431,43.96016750024623],[-76.2504393391718,43.94982055774786],[-76.31224343071922,43.94775095305809],[-76.30577556067355,43.97620170069497],[-76.33092838862892,44.004638823445866],[-76.39560708908552,44.024795072402476],[-76.3984816979947,44.06250502187776],[-76.37548482672123,44.064570626786484],[-76.37620347894854,44.090900771655065],[-76.47106557295156,44.0929653855436],[-76.46603500736049,44.109479701923],[-76.44231948385973,44.129600288113295],[-76.3984816979947,44.13217935491029],[-76.3977630457674,44.2043474993423],[-76.37620347894854,44.21671031511876],[-76.23965955576237,44.2192855751065],[-76.23965955576237,44.2280406165722],[-76.2173813367162,44.228555578463435],[-76.21522538003431,44.34790496257489],[-76.1189259815767,44.37102654591561],[-76.04634210661985,44.39157140443917],[-75.93423235916174,44.43417898509957],[-75.83721430847683,44.50341416416661],[-75.76822369465644,44.558231111426025],[-75.69923308083607,44.60378721108942],[-75.63167977147027,44.64828507610631],[-75.56772044189319,44.70500920154141],[-75.50447904589117,44.7458566542504],[-75.4527360855259,44.78157451471142],[-75.31762946679432,44.872300455880584],[-75.15377675897092,44.937453318614374],[-75.0905353629689,44.973052557209364],[-74.97411370214701,45.027933775754924],[-74.91985438100785,45.03682085482298],[-74.91231104790405,45.036060871422514]]],"terms_url":"https://gis.ny.gov/gateway/orthoprogram/index.cfm","terms_text":"New York State Statewide Digital Orthoimagery Program","description":"New York State High Resolution Digital Orthoimagery, 1 foot resolution","icon":"data:image/png:base64,iVBORw0KGgoAAAANSUhEUgAAAG0AAABCCAYAAABdAli1AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QTA1Nzc1NjVGNjM2MTFFMzk5NkFGRERGMEYyODU3RTciIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QTA1Nzc1NjZGNjM2MTFFMzk5NkFGRERGMEYyODU3RTciPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBMDU3NzU2M0Y2MzYxMUUzOTk2QUZEREYwRjI4NTdFNyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBMDU3NzU2NEY2MzYxMUUzOTk2QUZEREYwRjI4NTdFNyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhMlZyIAAA02SURBVHja7F1djNxW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"},{"id":"olho_dagua_do_casado","name":"Olho d'Agua do Casado AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Olho%20Dagua%20do%20Casado&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-37.78219871045,-9.54444051839],[-37.78259635433,-9.45388353571],[-37.8114653,-9.45411888151],[-37.81735042942,-9.45451112414],[-37.82057134484,-9.45415810579],[-37.8739351535,-9.45427577861],[-37.87357727401,-9.54475422977],[-37.78219871045,-9.54444051839]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"MAPNIK","name":"OpenStreetMap (Standard)","type":"tms","template":"https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png","scaleExtent":[0,19],"terms_url":"https://www.openstreetmap.org/","terms_text":"© OpenStreetMap contributors, CC-BY-SA","default":true,"description":"The default OpenStreetMap layer.","icon":"data:image/png;base64,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"},{"id":"OpenStreetMap-turistautak","name":"OpenStreetMap (turistautak)","type":"tms","template":"http://{switch:h,i,j}.tile.openstreetmap.hu/turistautak/{zoom}/{x}/{y}.png","scaleExtent":[0,18],"polygon":[[[16.1139147,46.8691038],[16.1789749,46.90662],[16.2000429,46.9415079],[16.2217547,46.9355441],[16.2462784,46.9463851],[16.2553226,46.9642125],[16.2764694,46.9626082],[16.290583,47.0139849],[16.3016199,46.9992329],[16.3414618,46.9965225],[16.3505162,47.0106313],[16.3734016,46.9985929],[16.412765,47.00475],[16.4332705,46.9927417],[16.4478119,47.003893],[16.479997,46.9941169],[16.5121988,47.0011695],[16.4635584,47.0322699],[16.4478586,47.0227481],[16.439123,47.029663],[16.445673,47.038872],[16.520323,47.056103],[16.473213,47.0736169],[16.4637199,47.09392],[16.500798,47.110058],[16.500035,47.123295],[16.5295349,47.1287419],[16.5171609,47.1496938],[16.454951,47.1425878],[16.4648728,47.1683349],[16.4555643,47.1875584],[16.4305559,47.1847022],[16.4195013,47.1949147],[16.4189215,47.2107114],[16.4371293,47.2097043],[16.4426335,47.2337117],[16.4313127,47.2527554],[16.4671512,47.2531652],[16.4892319,47.2798885],[16.4646338,47.3338455],[16.4337002,47.3528101],[16.458513,47.3670496],[16.4454619,47.4070195],[16.4831657,47.4093628],[16.4963821,47.3892659],[16.5170941,47.4100218],[16.5749054,47.4054243],[16.5807291,47.4191699],[16.661847,47.455595],[16.6706419,47.47422],[16.6523395,47.500342],[16.6895619,47.510161],[16.7147797,47.540199],[16.663545,47.567733],[16.673199,47.6049544],[16.6595343,47.6061018],[16.652758,47.622852],[16.6314207,47.6283176],[16.5739108,47.619667],[16.5147382,47.6461964],[16.4967504,47.6393149],[16.425464,47.6621679],[16.4437449,47.674205],[16.4480507,47.6964725],[16.4746984,47.6811576],[16.4872245,47.6979767],[16.5521729,47.7225519],[16.5363779,47.736785],[16.5479799,47.751544],[16.6095193,47.7603722],[16.6344148,47.7590843],[16.65729,47.7414879],[16.7209405,47.7353565],[16.7534062,47.6828165],[16.8301587,47.681058],[16.8394284,47.7045139],[16.8668943,47.7211462],[16.876679,47.6876452],[17.0937421,47.7077706],[17.0706562,47.7285366],[17.0516019,47.7938499],[17.0749479,47.8084997],[17.047139,47.8285635],[17.0519452,47.8377691],[17.0105513,47.8581765],[17.0163878,47.8673325],[17.0857537,47.8746239],[17.113171,47.9271605],[17.0917133,47.9342916],[17.1183782,47.9601083],[17.094657,47.9708775],[17.2010289,48.019992],[17.241769,48.0224651],[17.257955,47.998655],[17.334651,47.993125],[17.4029929,47.947849],[17.4539199,47.8852579],[17.5267369,47.865509],[17.5675779,47.8151289],[17.608402,47.8218859],[17.7085789,47.756678],[17.7798739,47.739487],[17.8660959,47.74575],[17.9001292,47.7392633],[17.946867,47.744668],[17.9708709,47.7578392],[18.0044103,47.7463402],[18.0380583,47.7576812],[18.2958774,47.7314616],[18.4540681,47.7651226],[18.4931553,47.7527552],[18.5590761,47.7659963],[18.6460866,47.7590921],[18.7260691,47.7890411],[18.7411784,47.8138245],[18.7920013,47.8230869],[18.8485417,47.8167221],[18.855876,47.826077],[18.828014,47.834291],[18.8135749,47.85555],[18.76353,47.8716049],[18.756858,47.896838],[18.776746,47.955092],[18.7552499,47.9763469],[18.8157429,47.993442],[18.819998,48.039676],[18.833268,48.048239],[18.8749364,48.0470707],[18.886674,48.058682],[18.9089819,48.051139],[18.9439039,48.058865],[18.9816099,48.0536009],[19.0148639,48.078179],[19.0585249,48.0573529],[19.0843619,48.072781],[19.107402,48.065596],[19.1352889,48.074146],[19.2413679,48.0536529],[19.2557819,48.0715559],[19.3031119,48.088711],[19.3865969,48.091914],[19.400018,48.082304],[19.454053,48.101436],[19.467354,48.083933],[19.4944199,48.109906],[19.492377,48.1396639],[19.5128219,48.154663],[19.504518,48.173443],[19.528967,48.190358],[19.526044,48.20313],[19.577502,48.2160149],[19.6308263,48.2500725],[19.6445239,48.2391719],[19.669857,48.239212],[19.691219,48.203894],[19.721125,48.201473],[19.74618,48.2165119],[19.7871629,48.19253],[19.7987329,48.19482],[19.8052829,48.183733],[19.782415,48.165039],[19.794812,48.153529],[19.821331,48.169081],[19.8452819,48.162742],[19.8551729,48.178431],[19.8601309,48.169409],[19.898745,48.1663119],[19.9145359,48.146863],[19.898298,48.1249019],[19.937383,48.131118],[19.9743939,48.1660049],[19.988706,48.1621679],[20.029038,48.1776849],[20.049449,48.1671999],[20.0729859,48.179606],[20.0700369,48.1917019],[20.1340909,48.225182],[20.1331879,48.253982],[20.206162,48.250979],[20.2038299,48.261906],[20.228466,48.262779],[20.2349469,48.279933],[20.286858,48.26164],[20.3257109,48.272794],[20.3374649,48.301667],[20.3656579,48.316606],[20.384077,48.3511809],[20.4098349,48.365857],[20.402532,48.382565],[20.4205349,48.403858],[20.416228,48.418536],[20.507929,48.489363],[20.5065069,48.534415],[20.537471,48.527878],[20.5464939,48.544292],[20.586595,48.535759],[20.6538739,48.561413],[20.836359,48.58284],[20.8378,48.57421],[20.8504359,48.5816329],[20.8453301,48.5665046],[20.8681549,48.551818],[20.922323,48.559453],[20.9346349,48.538341],[20.955882,48.533963],[20.9561979,48.521666],[20.9815849,48.5177669],[21.0151139,48.532313],[21.0663209,48.525894],[21.1174479,48.4910549],[21.1608749,48.521499],[21.179634,48.518232],[21.221061,48.537497],[21.305488,48.5222489],[21.313377,48.550841],[21.326875,48.554129],[21.319384,48.561201],[21.4154499,48.558951],[21.4226649,48.578821],[21.4406099,48.585104],[21.514091,48.551065],[21.5420199,48.508395],[21.6139329,48.509416],[21.6201879,48.469826],[21.663549,48.417961],[21.6645609,48.392164],[21.7017409,48.380695],[21.711871,48.357617],[21.8174139,48.332787],[21.8352029,48.3346409],[21.837213,48.363253],[21.8842979,48.356047],[21.8848429,48.367539],[21.897883,48.36256],[21.8997959,48.3702229],[21.9281859,48.3615969],[21.9268059,48.370899],[21.949198,48.378728],[21.994463,48.377323],[22.0213259,48.392749],[22.0546049,48.377528],[22.0764859,48.387241],[22.086743,48.371564],[22.1359089,48.380519],[22.131056,48.3912329],[22.152768,48.3962409],[22.1561913,48.4093076],[22.2125722,48.4256468],[22.2371405,48.4100396],[22.2654858,48.4098675],[22.2398761,48.3870055],[22.2675722,48.3611612],[22.3178106,48.3545437],[22.3132861,48.3250712],[22.3372944,48.3079113],[22.3384267,48.2792074],[22.3847547,48.2339632],[22.4006407,48.249198],[22.4328384,48.2525166],[22.456386,48.2423109],[22.4899029,48.2534237],[22.4972201,48.2395546],[22.5161491,48.237965],[22.5311088,48.2094282],[22.5711442,48.1961428],[22.5616362,48.1816066],[22.5982449,48.144756],[22.5902763,48.1073414],[22.6754492,48.091997],[22.7347192,48.119848],[22.7576242,48.1200599],[22.7703914,48.1090162],[22.772319,48.1218742],[22.8027688,48.1221112],[22.8025285,48.1070813],[22.8254256,48.1175119],[22.8364365,48.080249],[22.8611284,48.0750312],[22.8677955,48.0524256],[22.8820424,48.0548053],[22.8659692,48.0113165],[22.835562,47.9905988],[22.8407599,47.9813636],[22.8725729,47.9752683],[22.8697274,47.9659593],[22.8915652,47.9672446],[22.897435,47.9540629],[22.8473299,47.9077579],[22.7928135,47.8908586],[22.7586924,47.8941446],[22.77775,47.8422508],[22.7136344,47.8360928],[22.6801938,47.7877527],[22.6111171,47.7717455],[22.5490018,47.7722246],[22.4812121,47.8108886],[22.4513078,47.803389],[22.4313319,47.7398119],[22.3566167,47.7486206],[22.3177714,47.7660887],[22.3176236,47.7433657],[22.2851369,47.7292757],[22.264325,47.7310675],[22.2589955,47.6979057],[22.2306796,47.693196],[22.1796501,47.5916115],[22.1289245,47.5978984],[22.0942787,47.5583628],[22.0782587,47.5621299],[22.0534529,47.5474795],[22.0712176,47.5380742],[22.0617872,47.5288029],[22.0451278,47.5398919],[22.0367222,47.5326653],[22.0071886,47.48362],[22.0327909,47.4508372],[22.0238835,47.3908631],[22.0119849,47.3758016],[21.9627373,47.381053],[21.9382461,47.3725317],[21.8777922,47.2857763],[21.8872845,47.2730473],[21.8534909,47.2397622],[21.8580662,47.1873597],[21.8124804,47.1667511],[21.7924092,47.1059751],[21.7268258,47.0983882],[21.6976037,47.057915],[21.6504151,47.0408303],[21.6888701,47.0019977],[21.6678744,46.9712337],[21.6814917,46.9652089],[21.6381964,46.9330487],[21.5984455,46.9274708],[21.6142857,46.8867275],[21.6016694,46.8668202],[21.520328,46.8373749],[21.5186086,46.8000703],[21.4831761,46.7650246],[21.5263389,46.7393249],[21.529369,46.7209721],[21.4923253,46.6859652],[21.4728438,46.6959075],[21.4299047,46.693937],[21.4309553,46.6781367],[21.4546661,46.660863],[21.4162375,46.6426231],[21.4097959,46.6218052],[21.3657038,46.6379501],[21.3300499,46.6318155],[21.3139733,46.617666],[21.3012351,46.5908672],[21.3207905,46.5828562],[21.2743045,46.5407362],[21.2600254,46.5021583],[21.2744188,46.4767333],[21.2964506,46.4762973],[21.3174343,46.4507288],[21.2895176,46.4154784],[21.2963256,46.4069601],[21.2250116,46.4136899],[21.2064214,46.4033825],[21.1992563,46.3479034],[21.1762269,46.3357664],[21.180497,46.3044494],[21.1155437,46.3018529],[21.1030549,46.2624637],[21.0708792,46.2539014],[21.0660827,46.2429394],[21.0366237,46.2480392],[21.0246723,46.2665329],[20.960817,46.2623039],[20.9465849,46.2793024],[20.9250701,46.2766191],[20.9218133,46.2618129],[20.8732713,46.2877555],[20.7756538,46.2759602],[20.7490474,46.2508489],[20.7618619,46.204563],[20.727401,46.2077485],[20.7341052,46.1939355],[20.7140487,46.1660531],[20.6843592,46.1447802],[20.6549178,46.1497739],[20.6394471,46.1267602],[20.5450486,46.1790935],[20.5014839,46.190334],[20.4949436,46.1709908],[20.4592293,46.1428837],[20.3975133,46.1574709],[20.3685325,46.1528554],[20.3557074,46.1696256],[20.2968136,46.1521542],[20.2549024,46.1158522],[20.2484757,46.1300956],[20.2330132,46.1241668],[20.1817362,46.1601137],[20.1364966,46.1449476],[20.1009667,46.1772756],[20.0636156,46.1437275],[20.0346142,46.1458888],[20.0158072,46.1768354],[19.9354075,46.1764243],[19.8533469,46.1500005],[19.8179747,46.1281652],[19.7585403,46.1479754],[19.6982054,46.1879317],[19.6827672,46.1800388],[19.661508,46.1904394],[19.6317396,46.1692993],[19.5676482,46.179106],[19.5604013,46.1665762],[19.5026585,46.1424492],[19.5271208,46.1210269],[19.4645033,46.0953827],[19.4665828,46.0820437],[19.4160037,46.0460453],[19.3803957,46.0358749],[19.3640923,46.0522965],[19.2819012,46.0148048],[19.2965348,45.9881173],[19.2856472,45.9968981],[19.1479857,45.9963445],[19.1338422,46.0370993],[19.104873,46.0401673],[19.0660427,46.0001999],[19.0796791,45.9636376],[19.0059803,45.9590674],[19.0092745,45.9236559],[18.9061334,45.9353801],[18.8794572,45.9166827],[18.8647137,45.9208493],[18.8685629,45.9113361],[18.8276792,45.9051714],[18.8220041,45.9145893],[18.8075092,45.9036055],[18.809247,45.8796189],[18.7956242,45.8784488],[18.7048857,45.9181883],[18.6700246,45.9108439],[18.6596602,45.9168934],[18.6651348,45.899279],[18.6412808,45.8890396],[18.6550179,45.8742393],[18.6277704,45.8733782],[18.6148449,45.8531438],[18.6236656,45.8398531],[18.5732391,45.8137578],[18.5749849,45.8004344],[18.559716,45.8037961],[18.5223504,45.7826858],[18.4906706,45.7947167],[18.4821905,45.7655032],[18.4562828,45.7695229],[18.4450763,45.7605195],[18.446853,45.737128],[18.40763,45.7397119],[18.3918949,45.7616983],[18.3642257,45.7729364],[18.3394214,45.7471605],[18.2968157,45.7612196],[18.2440473,45.7612305],[18.2307311,45.7790328],[18.1908702,45.7878759],[18.1681939,45.7762712],[18.1246514,45.7896277],[18.1068067,45.7708256],[18.0818922,45.7645205],[17.9958808,45.7957311],[17.9302095,45.7863301],[17.9066757,45.7925692],[17.8653145,45.7670064],[17.8262748,45.8099957],[17.8089784,45.8040989],[17.7809054,45.8174884],[17.7603399,45.811923],[17.7408624,45.8295975],[17.6632915,45.8381849],[17.6276211,45.8979446],[17.5700676,45.9358204],[17.4378254,45.9503823],[17.4258964,45.9272681],[17.4108059,45.9399665],[17.392149,45.9302149],[17.3828713,45.9475733],[17.3476208,45.9423413],[17.3438769,45.9605329],[17.3537711,45.9525011],[17.3905375,45.9581914],[17.387423,45.9661823],[17.3583539,45.9642737],[17.3754852,45.9686921],[17.3751895,45.9881054],[17.3635685,45.9915442],[17.3567202,45.9735836],[17.3339583,45.9960781],[17.3319847,45.9728948],[17.3129974,45.9665347],[17.323647,45.9887776],[17.2987653,45.9838652],[17.3041996,46.0021128],[17.2579726,46.0110256],[17.29632,46.0285169],[17.2541514,46.030005],[17.270955,46.0567055],[17.2324767,46.0592034],[17.2525145,46.0664725],[17.2313144,46.0790345],[17.2019916,46.0765488],[17.2331299,46.0989644],[17.2104017,46.1001693],[17.2129734,46.113855],[17.175927,46.1084583],[17.1743424,46.1287608],[17.1865197,46.1332308],[17.1810983,46.1505485],[17.1562307,46.1585819],[17.1592857,46.1696818],[17.1261012,46.1684495],[17.1227409,46.1789791],[17.0752482,46.1889531],[17.0661614,46.2022984],[16.9735401,46.2251982],[16.973954,46.2431113],[16.9504085,46.2415285],[16.8862356,46.2814598],[16.8713682,46.3252767],[16.8802109,46.3356966],[16.8615374,46.3452401],[16.8656232,46.3556489],[16.8521959,46.3517189],[16.8498589,46.3626245],[16.8352859,46.3638195],[16.8376499,46.3748032],[16.8261732,46.3670994],[16.7933444,46.387385],[16.7592072,46.3776563],[16.7298672,46.40149],[16.7182119,46.3898704],[16.6772872,46.4494536],[16.6631785,46.4486958],[16.6663732,46.4582995],[16.6187915,46.4619875],[16.604468,46.4760773],[16.5235997,46.5053761],[16.5325768,46.5314027],[16.5176728,46.5363516],[16.5084107,46.5652692],[16.4829969,46.5660383],[16.4834008,46.5786011],[16.4455713,46.610952],[16.4248583,46.6131645],[16.385941,46.6442485],[16.3915424,46.6637257],[16.4198454,46.6584771],[16.4286335,46.6939737],[16.3689211,46.7040082],[16.3798266,46.7153869],[16.3710856,46.7222945],[16.3570587,46.7142387],[16.3185954,46.7541449],[16.3305417,46.7752119],[16.3121626,46.7780033],[16.3127666,46.797314],[16.3406373,46.8051851],[16.3508404,46.8300552],[16.3403309,46.8468762],[16.3015007,46.8595142],[16.2913867,46.8728341],[16.2332296,46.8766702],[16.1560866,46.8537074],[16.126571,46.8569079],[16.1139147,46.8691038]]],"terms_url":"https://www.openstreetmap.org/","terms_text":"© OpenStreetMap contributors"},{"id":"osm-gps","name":"OpenStreetMap GPS traces","type":"tms","template":"https://{switch:a,b,c}.gps-tile.openstreetmap.org/lines/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"terms_url":"https://www.openstreetmap.org/copyright","terms_text":"© OpenStreetMap contributors","terms_html":"<span style='display: inline-block; padding: 0 8px; background-color: rgba(0,0,0,0.5);'><span style='color: #eee;'>GPS Direction:</span> <span style='font-size: 15px; padding-left: 2px; font-weight: bold;'> <span style='color: #0ee;'>&larr;</span> <span style='color: #96f;'>&darr;</span> <span style='color: #6e0;'>&uarr;</span> <span style='color: #f63;'>&rarr;</span> </span></span> © <a href='https://www.openstreetmap.org/copyright'>OpenStreetMap contributors</a>.","description":"Public GPS traces uploaded to OpenStreetMap.","icon":"data:image/png;base64,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","overlay":true},{"id":"lu.geoportail.opendata.ortho2010","name":"Ortho 2010 geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2010/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg","endDate":"2010-07-02T00:00:00.000Z","startDate":"2010-06-24T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"lu.geoportail.opendata.ortho2013","name":"Ortho 2013 geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2013/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg","endDate":"2013-07-20T00:00:00.000Z","startDate":"2013-07-19T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"lu.geoportail.opendata.ortho2016","name":"Ortho 2016 geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2016/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg","endDate":"2016-08-16T00:00:00.000Z","startDate":"2013-08-30T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"lu.geoportail.opendata.ortho2017","name":"Ortho 2017 geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2017/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg","endDate":"2017-06-22T00:00:00.000Z","startDate":"2017-06-14T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"OS-historic-25k-OSM_Limited","name":"OS 1:25k historic (OSM)","type":"tms","template":"https://ooc.openstreetmap.org/os1/{zoom}/{x}/{y}.jpg","scaleExtent":[6,17],"polygon":[[[-6.4585407,49.9044128],[-6.3872009,49.9841116],[-6.2296827,49.9896159],[-6.2171269,49.8680087],[-6.4551164,49.8591793],[-6.4585407,49.9044128]],[[-1.4495137,60.8634056],[-0.7167114,60.8545122],[-0.7349744,60.4359756],[-0.6938826,60.4168218],[-0.7258429,60.3942735],[-0.7395401,60.0484714],[-0.9267357,60.0461918],[-0.9381501,59.8266157],[-1.4586452,59.831205],[-1.4455187,60.0535999],[-1.463211,60.0535999],[-1.4643524,60.0630002],[-1.5716475,60.0638546],[-1.5693646,60.1790005],[-1.643558,60.1807033],[-1.643558,60.1892162],[-1.8216221,60.1894999],[-1.8204807,60.3615507],[-1.8415973,60.3697345],[-1.8216221,60.3832755],[-1.8179852,60.5934321],[-1.453168,60.5934321],[-1.4495137,60.8634056]],[[-4.9089213,54.4242078],[-4.282598,54.4429861],[-4.2535417,54.029769],[-4.8766366,54.0221831],[-4.9089213,54.4242078]],[[-5.8667408,59.1444603],[-5.7759966,59.1470945],[-5.7720016,59.1014052],[-5.8621751,59.0990605],[-5.8667408,59.1444603]],[[-1.7065887,59.5703599],[-1.5579165,59.5693481],[-1.5564897,59.4965695],[-1.7054472,59.4975834],[-1.7065887,59.5703599]],[[-7.6865827,58.2940975],[-7.5330594,58.3006957],[-7.5256401,58.2646905],[-7.6797341,58.2577853],[-7.6865827,58.2940975]],[[-4.5338281,59.0359871],[-4.481322,59.0371616],[-4.4796099,59.0186583],[-4.5332574,59.0180707],[-4.5338281,59.0359871]],[[-8.6710698,57.8769896],[-8.4673234,57.8897332],[-8.4467775,57.7907],[-8.6510947,57.7779213],[-8.6710698,57.8769896]],[[-5.2395519,50.3530581],[-5.7920073,50.3384899],[-5.760047,49.9317027],[-4.6551363,49.9581461],[-4.677965,50.2860073],[-4.244219,50.2801723],[-4.2487848,50.2042525],[-3.3812929,50.2042525],[-3.4223846,50.5188201],[-3.1164796,50.5246258],[-3.1210453,50.6579592],[-2.6736357,50.6619495],[-2.5953453,50.6394325],[-2.5905026,50.5728419],[-2.4791203,50.5733545],[-2.4758919,50.5066704],[-2.3967943,50.5056438],[-2.401637,50.5723293],[-1.0400296,50.5718167],[-1.0335726,50.7059289],[-0.549302,50.7038843],[-0.5460736,50.7886618],[-0.0924734,50.7856002],[-0.0876307,50.7181949],[0.4789659,50.7120623],[0.487037,50.8182467],[0.9761503,50.8049868],[0.9922927,51.0126311],[1.4491213,51.0004424],[1.4781775,51.4090372],[1.0229632,51.4271576],[1.035877,51.7640881],[1.6105448,51.7500992],[1.646058,52.1560003],[1.7267698,52.1540195],[1.749369,52.4481811],[1.7870672,52.4811624],[1.759102,52.522505],[1.7933451,52.9602749],[0.3798147,52.9958468],[0.3895238,53.2511239],[0.3478614,53.2511239],[0.3238912,53.282186],[0.3461492,53.6538501],[0.128487,53.6575466],[0.116582,53.6674703],[0.1350586,54.0655731],[-0.0609831,54.065908],[-0.0414249,54.4709448],[-0.5662701,54.4771794],[-0.5592078,54.6565127],[-1.1665638,54.6623485],[-1.1637389,54.842611],[-1.3316194,54.843909],[-1.3257065,55.2470842],[-1.529453,55.2487108],[-1.524178,55.6540122],[-1.7638798,55.6540122],[-1.7733693,55.9719116],[-2.1607858,55.9682981],[-2.1543289,56.0621387],[-2.4578051,56.0585337],[-2.4190635,56.641717],[-2.0962164,56.641717],[-2.0833025,57.0021322],[-1.9283359,57.0126802],[-1.9180966,57.3590895],[-1.7502161,57.3625721],[-1.7695869,57.7608634],[-3.6937554,57.7574187],[-3.7066693,57.9806386],[-3.5969013,57.9772149],[-3.6033582,58.1207277],[-3.0222335,58.1309566],[-3.0286905,58.5410788],[-2.8478961,58.530968],[-2.86081,58.8430508],[-2.679624,58.8414991],[-2.6841897,58.885175],[-2.6339665,58.9052239],[-2.679624,58.9335083],[-2.6887555,59.0229231],[-2.3668703,59.0229231],[-2.3702946,59.2652861],[-2.3429001,59.2821989],[-2.3714361,59.2996861],[-2.3737189,59.3707083],[-2.3429001,59.385825],[-2.3725775,59.400354],[-2.3714361,59.4259098],[-3.0734196,59.4230067],[-3.0711368,59.3433649],[-3.103097,59.3311405],[-3.0745611,59.3136695],[-3.0722782,59.232603],[-3.3850319,59.1484167],[-3.3747589,58.9352753],[-3.5653789,58.9323303],[-3.554829,58.69759],[-5.2808579,58.6667732],[-5.2534159,58.3514125],[-5.5068508,58.3437887],[-5.4761804,58.0323557],[-5.8974958,58.0212436],[-5.8522972,57.6171758],[-6.1396311,57.6137174],[-6.1541592,57.7423183],[-6.2913692,57.7380102],[-6.3365678,58.1398784],[-6.1121891,58.1466944],[-6.1473778,58.5106285],[-6.2934817,58.5416182],[-6.8413713,58.2977321],[-7.0057382,58.2929331],[-7.1016189,58.2064403],[-7.2573132,58.1793148],[-7.2531092,58.1004928],[-7.4070698,58.0905566],[-7.391347,57.7911354],[-7.790991,57.7733151],[-7.7624215,57.5444165],[-7.698501,57.1453194],[-7.7943817,57.1304547],[-7.716764,56.7368628],[-7.0122067,56.7654359],[-6.979922,56.5453858],[-7.0638622,56.5453858],[-7.0444914,56.3562587],[-6.500676,56.3812917],[-6.4491433,55.9793649],[-6.563287,55.9691456],[-6.5393742,55.7030135],[-6.5595521,55.6907321],[-6.5345315,55.6761713],[-6.5216176,55.5704434],[-5.8912587,55.5923416],[-5.8560127,55.2320733],[-5.2293639,55.2515958],[-5.1837064,54.6254139],[-3.6655956,54.6518373],[-3.6496155,54.4320023],[-3.5400375,54.4306744],[-3.530906,54.0290181],[-3.0697656,54.030359],[-3.0675737,53.8221388],[-3.0804876,53.7739911],[-3.0619239,53.7477488],[-3.0611168,53.6737049],[-3.2144691,53.6708361],[-3.2057699,53.4226163],[-3.2799632,53.355224],[-3.2896655,53.3608441],[-3.3327547,53.364931],[-3.3761293,53.3540318],[-4.0888976,53.3433102],[-4.0945474,53.4612036],[-4.697412,53.4448624],[-4.6882805,53.3318598],[-4.7202407,53.2895771],[-4.6837148,53.2486184],[-4.6768661,53.1542644],[-4.8480816,53.1446807],[-4.8178336,52.7440299],[-4.2545751,52.7558939],[-4.228876,52.254876],[-4.2607571,52.2536408],[-4.2724603,52.2432637],[-4.8136263,52.230095],[-4.8079191,52.1138892],[-5.3889104,52.0991668],[-5.3717888,51.9129667],[-5.4208706,51.9101502],[-5.414022,51.8453218],[-5.3683645,51.8474373],[-5.3466772,51.5595332],[-4.773676,51.5758518],[-4.7656859,51.4885146],[-4.1915432,51.4970427],[-4.1869775,51.4344663],[-3.6151177,51.4444274],[-3.6105519,51.3746543],[-3.1494115,51.3789292],[-3.1494115,51.2919281],[-4.3038735,51.2745907],[-4.2861169,51.0508721],[-4.8543277,51.0366633],[-4.8372201,50.7212787],[-5.2618345,50.7082694],[-5.2395519,50.3530581]],[[-2.1502671,60.171318],[-2.0030218,60.1696146],[-2.0013096,60.0997023],[-2.148555,60.1011247],[-2.1502671,60.171318]],[[-6.2086011,59.1163488],[-6.1229934,59.1166418],[-6.121852,59.0714985],[-6.2097426,59.0714985],[-6.2086011,59.1163488]],[[-4.4159559,59.0889036],[-4.4212022,59.0770848],[-4.3971904,59.0779143],[-4.3913388,59.0897328],[-4.4159559,59.0889036]]]},{"id":"OS-New_Popular_Edition-historic","name":"OS New Popular Edition historic","type":"tms","template":"https://ooc.openstreetmap.org/npe/{zoom}/{x}/{y}.png","scaleExtent":[6,22],"polygon":[[[-5.8,49.8],[-5.8,55.8],[1.9,55.8],[1.9,49.8],[-5.8,49.8]]]},{"id":"OS-OpenData_Locator","name":"OS OpenData Locator","type":"tms","template":"http://tiles.itoworld.com/os_locator/{zoom}/{x}/{y}.png","polygon":[[[-9,49.8],[-9,61.1],[1.9,61.1],[1.9,49.8],[-9,49.8]]],"overlay":true},{"id":"OS-OpenData_StreetView","name":"OS OpenData StreetView","type":"tms","template":"https://{switch:a,b,c}.os.openstreetmap.org/sv/{zoom}/{x}/{y}.png","scaleExtent":[1,18],"polygon":[[[-5.8292886,50.0229734],[-5.8292886,50.254819],[-5.373356,50.254819],[-5.373356,50.3530588],[-5.1756021,50.3530588],[-5.1756021,50.5925406],[-4.9970743,50.5925406],[-4.9970743,50.6935617],[-4.7965738,50.6935617],[-4.7965738,50.7822112],[-4.6949503,50.7822112],[-4.6949503,50.9607371],[-4.6043131,50.9607371],[-4.6043131,51.0692066],[-4.3792215,51.0692066],[-4.3792215,51.2521782],[-3.9039346,51.2521782],[-3.9039346,51.2916998],[-3.7171671,51.2916998],[-3.7171671,51.2453014],[-3.1486246,51.2453014],[-3.1486246,51.362067],[-3.7446329,51.362067],[-3.7446329,51.4340386],[-3.8297769,51.4340386],[-3.8297769,51.5298246],[-4.0852091,51.5298246],[-4.0852091,51.4939284],[-4.3792215,51.4939284],[-4.3792215,51.5427168],[-5.1444195,51.5427168],[-5.1444195,51.6296003],[-5.7387103,51.6296003],[-5.7387103,51.774037],[-5.5095393,51.774037],[-5.5095393,51.9802596],[-5.198799,51.9802596],[-5.198799,52.0973358],[-4.8880588,52.0973358],[-4.8880588,52.1831557],[-4.4957492,52.1831557],[-4.4957492,52.2925739],[-4.3015365,52.2925739],[-4.3015365,52.3685318],[-4.1811246,52.3685318],[-4.1811246,52.7933685],[-4.4413696,52.7933685],[-4.4413696,52.7369614],[-4.8569847,52.7369614],[-4.8569847,52.9317255],[-4.7288044,52.9317255],[-4.7288044,53.5038599],[-4.1578191,53.5038599],[-4.1578191,53.4113498],[-3.3110518,53.4113498],[-3.3110518,53.5038599],[-3.2333667,53.5038599],[-3.2333667,54.0159169],[-3.3926211,54.0159169],[-3.3926211,54.1980953],[-3.559644,54.1980953],[-3.559644,54.433732],[-3.7188984,54.433732],[-3.7188984,54.721897],[-4.3015365,54.721897],[-4.3015365,54.6140739],[-5.0473132,54.6140739],[-5.0473132,54.7532915],[-5.2298731,54.7532915],[-5.2298731,55.2190799],[-5.6532567,55.2190799],[-5.6532567,55.250088],[-5.8979647,55.250088],[-5.8979647,55.4822462],[-6.5933212,55.4822462],[-6.5933212,56.3013441],[-7.1727691,56.3013441],[-7.1727691,56.5601822],[-6.8171722,56.5601822],[-6.8171722,56.6991713],[-6.5315276,56.6991713],[-6.5315276,56.9066964],[-6.811679,56.9066964],[-6.811679,57.3716613],[-6.8721038,57.3716613],[-6.8721038,57.5518893],[-7.0973235,57.5518893],[-7.0973235,57.2411085],[-7.1742278,57.2411085],[-7.1742278,56.9066964],[-7.3719817,56.9066964],[-7.3719817,56.8075885],[-7.5202972,56.8075885],[-7.5202972,56.7142479],[-7.8306806,56.7142479],[-7.8306806,56.8994605],[-7.6494061,56.8994605],[-7.6494061,57.4739617],[-7.8306806,57.4739617],[-7.8306806,57.7915584],[-7.4736249,57.7915584],[-7.4736249,58.086063],[-7.1879804,58.086063],[-7.1879804,58.367197],[-6.8034589,58.367197],[-6.8034589,58.4155786],[-6.638664,58.4155786],[-6.638664,58.4673277],[-6.5178143,58.4673277],[-6.5178143,58.5625632],[-6.0536224,58.5625632],[-6.0536224,58.1568843],[-6.1470062,58.1568843],[-6.1470062,58.1105865],[-6.2799798,58.1105865],[-6.2799798,57.7122664],[-6.1591302,57.7122664],[-6.1591302,57.6667563],[-5.9339104,57.6667563],[-5.9339104,57.8892524],[-5.80643,57.8892524],[-5.80643,57.9621767],[-5.6141692,57.9621767],[-5.6141692,58.0911236],[-5.490819,58.0911236],[-5.490819,58.3733281],[-5.3199118,58.3733281],[-5.3199118,58.75015],[-3.5719977,58.75015],[-3.5719977,59.2091788],[-3.1944501,59.2091788],[-3.1944501,59.4759216],[-2.243583,59.4759216],[-2.243583,59.1388749],[-2.4611012,59.1388749],[-2.4611012,58.8185938],[-2.7407675,58.8185938],[-2.7407675,58.5804743],[-2.9116746,58.5804743],[-2.9116746,58.1157523],[-3.4865441,58.1157523],[-3.4865441,57.740386],[-1.7153245,57.740386],[-1.7153245,57.2225558],[-1.9794538,57.2225558],[-1.9794538,56.8760742],[-2.1658979,56.8760742],[-2.1658979,56.6333186],[-2.3601106,56.6333186],[-2.3601106,56.0477521],[-1.9794538,56.0477521],[-1.9794538,55.8650949],[-1.4745008,55.8650949],[-1.4745008,55.2499926],[-1.3221997,55.2499926],[-1.3221997,54.8221737],[-1.0550014,54.8221737],[-1.0550014,54.6746628],[-0.6618765,54.6746628],[-0.6618765,54.5527463],[-0.3247617,54.5527463],[-0.3247617,54.2865195],[0.0092841,54.2865195],[0.0092841,53.7938518],[0.2081962,53.7938518],[0.2081962,53.5217726],[0.4163548,53.5217726],[0.4163548,53.0298851],[1.4273388,53.0298851],[1.4273388,52.92021],[1.8333912,52.92021],[1.8333912,52.042488],[1.5235504,52.042488],[1.5235504,51.8261335],[1.2697049,51.8261335],[1.2697049,51.6967453],[1.116651,51.6967453],[1.116651,51.440346],[1.5235504,51.440346],[1.5235504,51.3331831],[1.4507565,51.3331831],[1.4507565,51.0207553],[1.0699883,51.0207553],[1.0699883,50.9008416],[0.7788126,50.9008416],[0.7788126,50.729843],[-0.7255952,50.729843],[-0.7255952,50.7038437],[-1.0074383,50.7038437],[-1.0074383,50.5736307],[-2.3625252,50.5736307],[-2.3625252,50.4846421],[-2.4987805,50.4846421],[-2.4987805,50.5736307],[-3.4096378,50.5736307],[-3.4096378,50.2057837],[-3.6922446,50.2057837],[-3.6922446,50.1347737],[-5.005468,50.1347737],[-5.005468,49.9474456],[-5.2839506,49.9474456],[-5.2839506,50.0229734],[-5.8292886,50.0229734]],[[-6.4580707,49.8673563],[-6.4580707,49.9499935],[-6.3978807,49.9499935],[-6.3978807,50.0053797],[-6.1799606,50.0053797],[-6.1799606,49.9168614],[-6.2540201,49.9168614],[-6.2540201,49.8673563],[-6.4580707,49.8673563]],[[-5.8343165,49.932156],[-5.8343165,49.9754641],[-5.7683254,49.9754641],[-5.7683254,49.932156],[-5.8343165,49.932156]],[[-1.9483797,60.6885737],[-1.9483797,60.3058841],[-1.7543149,60.3058841],[-1.7543149,60.1284428],[-1.5754914,60.1284428],[-1.5754914,59.797917],[-1.0316959,59.797917],[-1.0316959,60.0354518],[-0.6626918,60.0354518],[-0.6626918,60.9103862],[-1.1034395,60.9103862],[-1.1034395,60.8040022],[-1.3506319,60.8040022],[-1.3506319,60.6885737],[-1.9483797,60.6885737]],[[-2.203381,60.1968568],[-2.203381,60.0929443],[-1.9864011,60.0929443],[-1.9864011,60.1968568],[-2.203381,60.1968568]],[[-1.7543149,59.5698289],[-1.7543149,59.4639383],[-1.5373349,59.4639383],[-1.5373349,59.5698289],[-1.7543149,59.5698289]],[[-4.5585981,59.1370518],[-4.5585981,58.9569099],[-4.2867004,58.9569099],[-4.2867004,59.1370518],[-4.5585981,59.1370518]],[[-6.2787732,59.2025744],[-6.2787732,59.0227769],[-5.6650612,59.0227769],[-5.6650612,59.2025744],[-6.2787732,59.2025744]],[[-8.7163482,57.9440556],[-8.7163482,57.7305936],[-8.3592926,57.7305936],[-8.3592926,57.9440556],[-8.7163482,57.9440556]],[[-7.6077005,50.4021026],[-7.6077005,50.2688657],[-7.3907205,50.2688657],[-7.3907205,50.4021026],[-7.6077005,50.4021026]],[[-7.7304303,58.3579902],[-7.7304303,58.248313],[-7.5134503,58.248313],[-7.5134503,58.3579902],[-7.7304303,58.3579902]]]},{"id":"OS-Scottish_Popular-historic","name":"OS Scottish Popular historic","type":"tms","template":"https://ooc.openstreetmap.org/npescotland/{zoom}/{x}/{y}.jpg","scaleExtent":[6,15],"polygon":[[[-7.8,54.5],[-7.8,61.1],[-1.1,61.1],[-1.1,54.5],[-7.8,54.5]]]},{"id":"al_palestina","name":"Palestina AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Palestina&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-37.28906746617,-9.71915617946],[-37.28903527966,-9.71114035022],[-37.28911038151,-9.70220427214],[-37.28915329685,-9.69174505681],[-37.28918548336,-9.68885787521],[-37.28927131405,-9.68069325658],[-37.28926058521,-9.67731947667],[-37.28935714474,-9.66999011394],[-37.28935714474,-9.66599221238],[-37.28931422939,-9.66132793384],[-37.28941078892,-9.6552568713],[-37.2894644331,-9.64555775166],[-37.28949661961,-9.6348852245],[-37.28953953495,-9.62925794841],[-37.29639526119,-9.62884541884],[-37.31187697163,-9.62897235107],[-37.32761617413,-9.62914159397],[-37.33181114903,-9.62919448235],[-37.3433768343,-9.629173327],[-37.35876198521,-9.62922621538],[-37.37175460568,-9.6293002591],[-37.37838502636,-9.62913101629],[-37.3805093359,-9.62921563771],[-37.38060589543,-9.63142636478],[-37.38054152241,-9.63784691108],[-37.38043423405,-9.63894695947],[-37.38053079357,-9.64147494171],[-37.3805093359,-9.64876261706],[-37.38049860706,-9.65430495262],[-37.38043423405,-9.65599725065],[-37.380241115,-9.66028084202],[-37.38021965733,-9.66550569201],[-37.38018747082,-9.6705400861],[-37.38015528431,-9.67895877835],[-37.38013382664,-9.68781086916],[-37.38009091129,-9.70115730775],[-37.38002653828,-9.7105269939],[-37.38010164013,-9.71743247513],[-37.38004799595,-9.71958974786],[-37.3793184351,-9.7195368737],[-37.37392183056,-9.71955802336],[-37.36582155934,-9.71945227502],[-37.35849376431,-9.71946284985],[-37.353343923,-9.71937825115],[-37.34413858166,-9.71936767631],[-37.33422513714,-9.71923020337],[-37.3293327879,-9.71927250275],[-37.32180114498,-9.71924077822],[-37.31982703915,-9.71927250275],[-37.31094356289,-9.71919847884],[-37.2958910059,-9.71920905369],[-37.28906746617,-9.71915617946]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"palmeira_dos_indios","name":"Palmeira dos Indios AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Palmeira%20dos%20Indios&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.58663984051,-9.46124293173],[-36.58665056935,-9.45851253477],[-36.58618922939,-9.41968140694],[-36.58603902569,-9.41451629413],[-36.58596392384,-9.4059322986],[-36.58584590664,-9.3950935092],[-36.58579226246,-9.39163222273],[-36.58565278759,-9.38983276351],[-36.58549185505,-9.3824866389],[-36.58528800717,-9.37964976527],[-36.58510561695,-9.37743741114],[-36.5850305151,-9.3705885508],[-36.58890362492,-9.37057796513],[-36.59064169636,-9.37065206481],[-36.59389253369,-9.37059913647],[-36.60037275067,-9.37072616447],[-36.61045785656,-9.37049327977],[-36.62288184872,-9.37020746651],[-36.63377161732,-9.3700169242],[-36.63835283032,-9.36985813887],[-36.64742942562,-9.36997458145],[-36.6514098238,-9.36994282439],[-36.6553365778,-9.36972052485],[-36.65647383442,-9.36974169624],[-36.6611086916,-9.37023922355],[-36.66276093235,-9.37026039491],[-36.66704173794,-9.36973111055],[-36.67051788082,-9.36965701067],[-36.67325373402,-9.36965701067],[-36.67602177372,-9.36986872456],[-36.6759252142,-9.3725998221],[-36.67596812954,-9.37679169746],[-36.67638655415,-9.38137517998],[-36.67653675785,-9.38463544939],[-36.67663331738,-9.39264838381],[-36.67675133457,-9.39829014058],[-36.67689080944,-9.40874778795],[-36.67707319966,-9.41886642501],[-36.67716975918,-9.43178948329],[-36.67724486103,-9.43394857114],[-36.67718048802,-9.43752585362],[-36.67727704754,-9.44311396022],[-36.67729850521,-9.449326389],[-36.67740579357,-9.45528471196],[-36.67739506474,-9.4593803377],[-36.67735214939,-9.46017405798],[-36.67567845097,-9.46020580675],[-36.66624780407,-9.46030105305],[-36.66223521938,-9.46030105305],[-36.65736432781,-9.46041746516],[-36.65040131321,-9.46047037975],[-36.63543458691,-9.46065028927],[-36.61979194393,-9.46083019869],[-36.61433096638,-9.46083019869],[-36.61028619518,-9.46096777643],[-36.60646672955,-9.46096777643],[-36.60186405888,-9.46098894223],[-36.59425731411,-9.461115937],[-36.58663984051,-9.46124293173]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"Pangasinan_Bulacan_HiRes","name":"Pangasinán/Bulacan (Philippines HiRes)","type":"tms","template":"http://gravitystorm.dev.openstreetmap.org/imagery/philippines/{zoom}/{x}/{y}.png","scaleExtent":[12,19],"polygon":[[[120.336593,15.985768],[120.445995,15.984],[120.446134,15.974459],[120.476464,15.974592],[120.594247,15.946832],[120.598064,16.090795],[120.596537,16.197999],[120.368537,16.218527],[120.347576,16.042308],[120.336593,15.985768]],[[120.8268,15.3658],[121.2684,15.2602],[121.2699,14.7025],[120.695,14.8423],[120.8268,15.3658]]]},{"id":"pao_de_acucar","name":"Pão de Açucar AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Pao%20de%20Acucar&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-37.39002812509,-9.78589413544],[-37.39018686777,-9.77619515195],[-37.38992540924,-9.76575048432],[-37.38990673363,-9.75256304825],[-37.39014951655,-9.7410224633],[-37.39002812509,-9.73201243097],[-37.39012150314,-9.72254197161],[-37.39014951655,-9.71288716505],[-37.39018686777,-9.7034069601],[-37.39019620557,-9.69548203924],[-37.40377337333,-9.6955004481],[-37.41727583865,-9.69560169682],[-37.43223500148,-9.69569374108],[-37.44318824617,-9.69573055877],[-37.44723151552,-9.69582260299],[-37.45682144076,-9.69585021626],[-37.47062271582,-9.69591464719],[-37.47373220472,-9.69590544277],[-37.47586122415,-9.69604350903],[-37.48127715077,-9.69605271344],[-37.48131450199,-9.69889686551],[-37.48122112394,-9.70086658775],[-37.48121178614,-9.70238529092],[-37.48135185321,-9.70545028909],[-37.48137986662,-9.71045731285],[-37.4813425154,-9.71617295985],[-37.48120244833,-9.71875003124],[-37.48124913736,-9.72035148703],[-37.48136119101,-9.7213362865],[-37.4813425154,-9.72409739103],[-37.48129582638,-9.72506377223],[-37.48103436785,-9.72731865083],[-37.48101569224,-9.73088040767],[-37.48126781296,-9.73461699032],[-37.48130516418,-9.73638402962],[-37.48131450199,-9.73893333547],[-37.48131450199,-9.74387543612],[-37.48129582638,-9.7498850055],[-37.48122112394,-9.75315203071],[-37.48101569224,-9.75855405565],[-37.48083827396,-9.76419525907],[-37.48084761176,-9.76526275174],[-37.48094098981,-9.76675355473],[-37.480931652,-9.76881490096],[-37.48083827396,-9.77210014513],[-37.48086628737,-9.77486082942],[-37.48076357152,-9.77993122654],[-37.48081026054,-9.78629902044],[-37.46381545633,-9.78622540502],[-37.45353453357,-9.78619779924],[-37.43978928533,-9.78610577993],[-37.42997525279,-9.78606897221],[-37.42079619096,-9.78600455867],[-37.40852631583,-9.785958549],[-37.39545338951,-9.78593094319],[-37.39002812509,-9.78589413544]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"PCN-Italy-2006","name":"PCN 2006 - Italy","type":"wms","template":"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/ortofoto_colore_06.map&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=OI.ORTOIMMAGINI.2006.33,OI.ORTOIMMAGINI.2006.32&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2006-01-01T00:00:00.000Z","startDate":"2006-01-01T00:00:00.000Z","polygon":[[[7.5479525,43.731183],[8.106966,43.86700730000001],[8.7359333,44.389436700000005],[10.183382,43.85116399999999],[9.5501637,43.13604889999999],[10.2772473,42.27514580000001],[11.6974829,42.08117770000001],[12.900592000000001,40.84896839999998],[14.9746632,40.208691200000004],[16.0477306,38.895298899999986],[13.1085959,38.74113290000001],[11.7771711,37.9360538],[14.406238300000002,36.74298800000001],[15.134669000000002,36.59363599999999],[15.428667100000002,37.0270026],[15.2199268,37.43375560000001],[15.483598700000002,37.929356000000006],[16.0164356,37.8035964],[17.216692,38.87424630000002],[17.216692,39.40468200000001],[16.5547657,39.7877476],[17.0546436,40.451437900000016],[18.3290577,39.70538770000001],[18.687732,40.05870289999999],[18.0496375,40.67064450000001],[16.005449300000002,41.5212225],[16.3844776,41.85963759999999],[15.5183696,42.15369720000001],[14.5799732,42.246104100000004],[13.5609913,43.65127720000002],[12.5788936,44.08670100000001],[12.2879505,44.6220446],[12.563982,44.9709164],[12.3415089,45.1745803],[12.4169596,45.4055695],[13.092517900000002,45.6282626],[13.6954906,45.70805899999999],[13.78445,45.5825],[13.919100000000002,45.63220000000001],[13.8235,45.717600000000004],[13.59784,45.807199999999995],[13.64307,45.98326],[13.52963,45.965879999999984],[13.47474,46.00546],[13.66472,46.17392000000001],[13.47587,46.22724999999999],[13.42218,46.20758],[13.37671,46.296679999999995],[13.59777,46.441370000000006],[13.68684,46.43880999999999],[13.7148,46.522200000000005],[12.9151,46.60953],[12.38708,46.715289999999996],[12.27591,46.88651],[12.17486,46.908950000000004],[12.11675,47.01240999999999],[12.21781,47.039959999999994],[12.19254,47.09331000000001],[11.74789,46.984840000000005],[11.33355,46.99862000000002],[11.10618,46.92966000000001],[11.00764,46.76896],[10.72974,46.78972],[10.75753,46.82258000000001],[10.66405,46.87613999999999],[10.47197,46.85698000000001],[10.38659,46.678470000000004],[10.49375,46.620490000000004],[10.46136,46.53164],[10.25309,46.574319999999986],[10.23674,46.634840000000004],[10.10307,46.610030000000016],[10.03715,46.44479],[10.165,46.410509999999995],[10.10506,46.33719999999999],[10.17862,46.25625999999999],[10.07055,46.216680000000004],[9.95249,46.38045000000001],[9.73086,46.35071],[9.71273,46.292660000000005],[9.57015,46.29580000000001],[9.46117,46.374810000000004],[9.459360000000002,46.50873],[9.40487,46.46620999999998],[9.36128,46.5081],[9.28136,46.496849999999995],[9.24503,46.236160000000005],[8.9560061,45.96502739999999],[9.09065,45.89905999999999],[9.0298,45.821270000000005],[8.90992,45.833299999999994],[8.9408,45.86681999999999],[8.88904,45.95465000000001],[8.78551,45.99063000000001],[8.85617,46.07480000000001],[8.62242,46.121120000000005],[8.45032,46.26869000000001],[8.42464,46.46366999999999],[8.08814,46.266920000000006],[8.15493,46.183399999999985],[8.11383,46.11577],[8.02906,46.10330999999999],[7.98881,45.99867],[7.9049000000000005,45.99945],[7.859490000000001,45.91485000000001],[7.563430000000001,45.97421],[7.10685,45.85652999999999],[7.04151,45.92434999999999],[6.95315,45.85163000000001],[6.80785,45.832649999999994],[6.80785,45.71864],[6.98948,45.63869],[7.00037,45.50900000000001],[7.18019,45.40070999999998],[7.10572,45.32924],[7.13115,45.25386],[6.851440000000001,45.132259999999995],[6.7697,45.16044],[6.62803,45.111749999999994],[6.66981,45.02324000000001],[6.74791,45.01939],[6.75518,44.899150000000006],[7.022170000000001,44.82519],[7.07484,44.680730000000004],[6.9513300000000005,44.66264],[6.85507,44.53072],[6.94504,44.431119999999986],[6.88784,44.42043],[6.891710000000001,44.36637000000001],[7.007640000000001,44.23735999999999],[7.363640000000001,44.11881999999999],[7.68694,44.17487],[7.725079999999999,44.07578000000001],[7.493549999999999,43.86551],[7.5479525,43.731183]],[[8.171339,39.148484300000014],[8.6245251,38.75118870000001],[9.0983105,39.037636700000014],[9.0310192,39.13144220000001],[9.265852000000002,39.1857496],[9.6407604,39.0227016],[9.8989391,40.6799061],[9.5006847,41.392570299999996],[8.303175,40.91070760000001],[8.4130383,41.16138739999999],[8.2125378,41.1386378],[8.0752087,40.598623299999986],[8.3615398,40.34999509999999],[8.2791424,39.985851200000006],[8.3828259,39.65359839999999],[8.171339,39.148484300000014]],[[12.514886900000002,35.53423470000001],[12.640543,35.5306027],[12.6386149,35.486413600000006],[12.512958700000002,35.4900477],[12.514886900000002,35.53423470000001]],[[11.9121838,36.8568754],[12.081785200000002,36.8552271],[12.0795789,36.7097361],[11.9099774,36.71138750000001],[11.9121838,36.8568754]],[[12.8401852,35.881314200000006],[12.8918552,35.8814533],[12.891984,35.850033999999994],[12.840314,35.8498949],[12.8401852,35.881314200000006]]]},{"id":"PCN-Lazio_Umbria-2008","name":"PCN 2008 - IT Lazio+Umbria","type":"wms","template":"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/ortofoto_colore_08.map&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=OI.ORTOIMMAGINI.2008.33&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2008-01-01T00:00:00.000Z","startDate":"2008-01-01T00:00:00.000Z","polygon":[[[12.3314895,41.6463669],[12.4117815,41.6479098],[12.4149931,41.5463482],[12.4957439,41.5478934],[12.4984968,41.4961949],[12.5794769,41.4984285],[12.580624,41.4293206],[12.6063174,41.4288046],[12.6074644,41.396632],[12.8292996,41.3981807],[12.8315936,41.3468793],[12.9128032,41.3484293],[12.9150973,41.297261],[12.995848,41.2982951],[12.9979127,41.1963575],[13.1679022,41.1980837],[13.167214,41.246915],[13.4133661,41.2482949],[13.4152014,41.197048],[13.8340959,41.1980837],[13.8334077,41.2476049],[13.9173702,41.2484673],[13.916682,41.3974924],[14.0011032,41.3978366],[13.9999562,41.4977413],[14.084148,41.4982567],[14.0834598,41.6501382],[14.0008738,41.6497954],[13.9997268,41.7505095],[13.8343254,41.7496537],[13.8336371,41.8004653],[13.7515099,41.7997813],[13.7499041,41.8498696],[13.4184131,41.8496988],[13.4168072,41.95027],[13.3344506,41.9495876],[13.3333036,42.000411],[13.2514058,41.9997291],[13.2500294,42.0505125],[13.0850868,42.0496608],[13.0839398,42.097],[13.3339918,42.0981915],[13.3337624,42.1471955],[13.4177249,42.148216],[13.4163484,42.2505237],[13.3339918,42.2498444],[13.333533,42.3009367],[13.2514058,42.2999186],[13.2500294,42.5469887],[13.4179543,42.5481718],[13.4158896,42.7506484],[13.33468,42.7494692],[13.3330742,42.9005609],[13.168361,42.8993846],[13.167214,42.9507867],[12.9641901,42.9501151],[12.9625842,43.0003005],[12.9187678,42.9997972],[12.9160149,43.2507803],[12.8352641,43.2499449],[12.8322819,43.5010663],[12.66321,43.4994022],[12.6648158,43.451125],[12.5856709,43.4499593],[12.5824592,43.5508],[12.5017084,43.5498024],[12.4998732,43.6513062],[12.1624176,43.6491484],[12.1649411,43.6013233],[12.078914,43.5994959],[12.0818963,43.4519577],[11.9954104,43.4491265],[11.9986221,43.3466146],[12.078914,43.3479492],[12.0807492,43.3018885],[11.9960986,43.2995511],[11.9986221,43.2021377],[11.9123656,43.1992948],[11.9146596,43.1521173],[11.8320736,43.1494395],[11.832303,43.0965284],[11.9109891,43.098371],[11.9146596,42.9019053],[11.8290913,42.8992165],[11.8313854,42.8523123],[11.7458171,42.8494532],[11.7481112,42.6523609],[11.6730956,42.6496612],[11.6749308,42.6105035],[11.4948474,42.5993593],[11.4985179,42.4959273],[11.5781217,42.4979571],[11.5815627,42.4524416],[11.4122614,42.4487177],[11.4152437,42.3465622],[11.4959945,42.3479186],[11.4992061,42.2963554],[11.5783511,42.2982219],[11.582251,42.2462783],[11.6618547,42.2483161],[11.6662134,42.0964893],[11.7453583,42.0981915],[11.7490288,41.9966603],[11.9144302,41.9992176],[11.9153478,41.9862596],[11.9940339,41.9874532],[11.9986221,41.8968453],[12.0786846,41.8990651],[12.0814375,41.8459392],[12.1631058,41.8479899],[12.1656293,41.6964038],[12.3291955,41.6986306],[12.3314895,41.6463669]]]},{"id":"Actueel_ortho25_WMTS","name":"PDOK Luchtfoto Beeldmateriaal 25cm","type":"tms","template":"https://geodata.nationaalgeoregister.nl/luchtfoto/rgb/wmts?FORMAT=image/jpeg&SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=2016_ortho25&STYLE=&FORMAT=image/jpeg&tileMatrixSet=OGC:1.0:GoogleMapsCompatible&tileMatrix={zoom}&tileRow={y}&tileCol={x}","scaleExtent":[0,18],"polygon":[[[3.1437689,51.3598403],[3.1575018,51.2411346],[3.3387762,51.1154412],[3.9128119,51.0585083],[4.6571356,51.2806657],[4.8933416,51.2634825],[5.1789862,51.1257851],[5.3849798,51.1309561],[5.5442816,51.056782],[5.4206854,50.8595581],[5.4673773,50.7032633],[5.6568914,50.6192567],[6.1485296,50.6214349],[6.3023382,50.8578243],[6.2995916,50.9543819],[6.2638861,51.0183545],[6.3723761,51.0925902],[6.4012152,51.2011393],[6.3737494,51.2510206],[6.4451605,51.3158713],[6.4204413,51.5496009],[6.343537,51.6792182],[6.796723,51.7642909],[7.046662,51.9102418],[7.0713812,52.0455856],[7.2718817,52.1704147],[7.3075872,52.3855111],[7.2059637,52.5319494],[7.282868,52.614576],[7.2993475,52.7785318],[7.4421698,52.9782705],[7.43393,53.2831352],[7.0439154,53.5515877],[6.7829901,53.6363531],[6.2391668,53.5401639],[5.6871039,53.5124077],[5.173493,53.4388477],[4.8164373,53.2338445],[4.6516424,53.0658312],[4.5417791,52.4859784],[4.3220526,52.1956753],[4.08104,52.0136897],[4.0219885,52.0162253],[3.9368445,51.9637937],[3.9519507,51.8807927],[3.844834,51.8494157],[3.6237341,51.7075226],[3.6553198,51.6606936],[3.6333471,51.6274583],[3.5468298,51.622343],[3.3957678,51.5609145],[3.3820349,51.5173524],[3.4987646,51.4326715],[3.3298498,51.3855587],[3.1437689,51.3598403]]],"terms_url":"https://www.nationaalgeoregister.nl/geonetwork/srv/dut/catalog.search#/search?facet.q=license%2FCC-BY&isChild=%27false%27&resultType=details&any_OR_title_OR_keyword=luchtfoto&fast=index&_content_type=json&from=1&to=20&sortBy=relevance","terms_text":"Kadaster / Beeldmateriaal.nl, CC BY 4.0","best":true,"description":"Landsdekkende dataset 25cm resolutie kleuren luchtfotos van de meest recente jaargang.","icon":"data:image/png;base64,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"},{"id":"al_piranhas","name":"Piranhas AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Piranhas&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-37.71917577496,-9.65235879937],[-37.71917577496,-9.63873541198],[-37.71914358845,-9.63210333094],[-37.71924014797,-9.62114477442],[-37.71929379215,-9.61022817566],[-37.7193367075,-9.59988246925],[-37.71940108051,-9.58891229023],[-37.71945472469,-9.57801581129],[-37.71944399586,-9.57173166346],[-37.71951909771,-9.56684391256],[-37.71956201306,-9.56225232497],[-37.71998043766,-9.5621782666],[-37.72257681599,-9.56194551161],[-37.72817726841,-9.56203014981],[-37.73254390469,-9.56199841049],[-37.74107332935,-9.56206188913],[-37.74845476856,-9.56201957003],[-37.75925870648,-9.56215710706],[-37.76971932163,-9.56227348451],[-37.78036232701,-9.56244276071],[-37.78537269344,-9.56235812262],[-37.78907414189,-9.56232638333],[-37.79561873188,-9.56245334047],[-37.79771085491,-9.56236870238],[-37.81005974522,-9.56243218095],[-37.81060691586,-9.56241102143],[-37.810531814,-9.5653098637],[-37.81048889866,-9.57629138499],[-37.81045671215,-9.58742065699],[-37.8103816103,-9.59756574935],[-37.81030650845,-9.61798195891],[-37.81017776241,-9.65196745198],[-37.81017776241,-9.65229533767],[-37.81024213543,-9.6525914922],[-37.80663724651,-9.65245399191],[-37.80205603352,-9.65252803054],[-37.79597278347,-9.65236937632],[-37.79178853741,-9.65251745359],[-37.78815146198,-9.65246456886],[-37.78722878208,-9.65242226107],[-37.78035159817,-9.65241168412],[-37.77864571324,-9.65223187594],[-37.77625318279,-9.65229533767],[-37.77475114575,-9.65218956812],[-37.77233715763,-9.65223187594],[-37.76960130444,-9.65245399191],[-37.76623244991,-9.65250687665],[-37.76345368138,-9.65246456886],[-37.7603959631,-9.6524962997],[-37.75101896038,-9.65236937632],[-37.75011773815,-9.65248572275],[-37.74154539814,-9.65247514581],[-37.74030085316,-9.65239053022],[-37.73785467854,-9.65246456886],[-37.73443217983,-9.65237995327],[-37.73106332531,-9.65243283802],[-37.72651429882,-9.65236937632],[-37.7219545435,-9.65225302985],[-37.71991606465,-9.65228476071],[-37.71917577496,-9.65235879937]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"PNOA-Spain-TMS","name":"PNOA Spain","type":"tms","template":"http://www.ign.es/wmts/pnoa-ma?request=GetTile&service=WMTS&VERSION=1.0.0&Layer=OI.OrthoimageCoverage&Style=default&Format=image/png&TileMatrixSet=GoogleMapsCompatible&TileMatrix={zoom}&TileRow={y}&TileCol={x}","polygon":[[[-17.8846298,28.4460601],[-17.8939535,28.5225529],[-18.0212548,28.7481927],[-18.0224091,28.8038375],[-17.9424017,28.8726124],[-17.8911792,28.8737099],[-17.8903302,28.8515102],[-17.7675902,28.8537764],[-17.7669837,28.8312183],[-17.7412714,28.8319975],[-17.7394926,28.7642235],[-17.7139824,28.7649677],[-17.7129312,28.7303731],[-17.7574427,28.6931782],[-17.7570788,28.6741254],[-17.7457913,28.6743524],[-17.7457266,28.6165627],[-17.7519687,28.5833675],[-17.7622536,28.5591958],[-17.7833086,28.541667],[-17.7831575,28.4936643],[-17.808611,28.4925024],[-17.8060072,28.4468974],[-17.8846298,28.4460601]],[[-18.1661033,27.7851643],[-18.163494,27.6949247],[-18.0889827,27.6963366],[-18.0873398,27.6738724],[-18.0364092,27.6753701],[-18.0350079,27.6302571],[-17.9589987,27.6323976],[-17.8603269,27.7926025],[-17.8630328,27.8368793],[-17.8884015,27.8364947],[-17.8891263,27.8590536],[-17.9906491,27.8567467],[-18.0386803,27.7655831],[-18.1146412,27.7637873],[-18.1154627,27.7863613],[-18.1661033,27.7851643]],[[-17.36038,28.0639801],[-17.3629657,28.1757247],[-17.3375583,28.1763688],[-17.3384577,28.2213012],[-17.1857883,28.2238767],[-17.0820788,28.1351849],[-17.0808422,28.0679977],[-17.1315446,28.0668073],[-17.1563337,28.0214628],[-17.2321063,28.0203711],[-17.2319938,27.9980388],[-17.2576823,27.9978403],[-17.257851,28.0199741],[-17.3086658,28.0192298],[-17.36038,28.0639801]],[[-16.9278171,28.3275779],[-16.9286591,28.3721879],[-16.8776666,28.3729288],[-16.8780707,28.3954191],[-16.5214259,28.4226146],[-16.4457117,28.491135],[-16.4462506,28.535972],[-16.4205859,28.5362679],[-16.4209227,28.5588419],[-16.3443329,28.5597589],[-16.3446023,28.5822095],[-16.1912541,28.5837179],[-16.1916246,28.6068435],[-16.1279344,28.6078193],[-16.1277997,28.5921762],[-16.0995079,28.5925015],[-16.0993395,28.5163822],[-16.1648148,28.5161158],[-16.1647474,28.4938583],[-16.2385755,28.4484704],[-16.2653516,28.4476116],[-16.2658569,28.4030038],[-16.3167484,28.4017594],[-16.3163105,28.380189],[-16.3420763,28.3795075],[-16.3408301,28.2892963],[-16.415837,28.1976134],[-16.415096,28.1311312],[-16.5153297,28.0164796],[-16.6168433,28.01532],[-16.6168096,27.9930469],[-16.7184243,27.9919168],[-16.7190979,28.0371426],[-16.7446952,28.0367859],[-16.7453351,28.0818146],[-16.7706967,28.0816065],[-16.8223966,28.1259036],[-16.8231712,28.1708652],[-16.8487012,28.1707464],[-16.8502842,28.260791],[-16.8756457,28.2605537],[-16.8760836,28.2832162],[-16.9015125,28.2827713],[-16.9023882,28.3279337],[-16.9278171,28.3275779]],[[-15.8537427,27.9008901],[-15.8542032,27.9901812],[-15.828953,27.9906555],[-15.8291065,28.035578],[-15.7782992,28.0363232],[-15.7532793,28.0814298],[-15.7278756,28.0815652],[-15.7282593,28.1718567],[-15.4989741,28.1728039],[-15.4987438,28.1504075],[-15.4497785,28.1507459],[-15.4501622,28.1961425],[-15.3972827,28.1961425],[-15.3964385,28.0383554],[-15.3710348,28.0380167],[-15.3706511,28.0153212],[-15.3457847,28.0153212],[-15.3454777,27.9254406],[-15.3708046,27.9252372],[-15.3705743,27.8352137],[-15.395978,27.8347387],[-15.4209979,27.7879673],[-15.4718052,27.7893932],[-15.471882,27.7666454],[-15.522766,27.7667813],[-15.5477092,27.7216112],[-15.6236132,27.7213395],[-15.6241504,27.741991],[-15.7007451,27.7433495],[-15.801669,27.8110501],[-15.8537427,27.9008901]],[[-14.5215621,28.0467778],[-14.5224358,28.1184131],[-14.4157526,28.1156076],[-14.2168794,28.2278805],[-14.2153651,28.33903],[-14.1641672,28.4528287],[-14.1115132,28.4747955],[-14.0335806,28.7226671],[-13.9565217,28.7449351],[-13.9561722,28.7665857],[-13.8290221,28.7664325],[-13.8289639,28.7879765],[-13.8000741,28.7879255],[-13.8012972,28.7189894],[-13.827566,28.719347],[-13.8278572,28.6517968],[-13.8025786,28.651899],[-13.8033941,28.5384172],[-13.8288474,28.5384684],[-13.8315061,28.3970177],[-13.9158189,28.2241438],[-13.9856445,28.2235696],[-14.0369588,28.1795787],[-14.1387139,28.1799894],[-14.1386556,28.1579103],[-14.2153651,28.1578076],[-14.2147244,28.1118888],[-14.2913173,28.0452356],[-14.3319673,28.0368713],[-14.4457846,28.0469834],[-14.4466583,28.0657961],[-14.4962835,28.0682631],[-14.495934,28.0458525],[-14.5215621,28.0467778]],[[-13.800662,28.8456579],[-13.8009273,28.8231121],[-13.775688,28.8230539],[-13.69729,28.8898184],[-13.69729,28.9127744],[-13.6072498,28.9117991],[-13.4388551,29.0002417],[-13.4374559,29.1351289],[-13.4117005,29.1349931],[-13.4105556,29.2229789],[-13.4592801,29.255586],[-13.4597392,29.2942023],[-13.5091254,29.2945638],[-13.5100581,29.3163453],[-13.5635382,29.3172941],[-13.5640564,29.2713764],[-13.5389228,29.2711956],[-13.5389747,29.2500375],[-13.5661293,29.2501279],[-13.5665956,29.2030039],[-13.5156549,29.2022349],[-13.5156549,29.1820579],[-13.5398038,29.1827819],[-13.5408921,29.137528],[-13.65782,29.1368528],[-13.713222,29.0935079],[-13.7663353,29.0934533],[-13.8502463,29.0165937],[-13.8518224,28.983425],[-13.8524443,28.914861],[-13.9013122,28.89245],[-13.9024005,28.8469779],[-13.800662,28.8456579]],[[1.6479916,38.9990693],[1.7321668,38.9993635],[1.7314703,39.0441733],[1.6489512,39.0431944],[1.6481552,39.1276358],[1.3948608,39.1265691],[1.3954412,39.0864199],[1.2281145,39.0852615],[1.2291095,39.0028958],[1.1448657,39.0018003],[1.1452803,38.8319988],[1.3113632,38.8331615],[1.3121924,38.7906483],[1.3946949,38.7916178],[1.3951924,38.7529597],[1.3112803,38.7519251],[1.3125919,38.6238804],[1.6489036,38.6251112],[1.6480745,38.7111504],[1.58456,38.7101152],[1.5811604,38.7005387],[1.5491544,38.7002798],[1.5197188,38.7092094],[1.50355,38.7253185],[1.4813282,38.9155064],[1.5518906,38.9254411],[1.5667328,38.9566554],[1.6487378,38.9583318],[1.6479916,38.9990693]],[[2.5450749,39.4166673],[2.43933,39.4161122],[2.438714,39.4846853],[2.439022,39.4993424],[2.3122308,39.4993424],[2.3119228,39.5417911],[2.2290722,39.5409994],[2.2283536,39.6260571],[2.3460076,39.6270851],[2.9270445,39.9601558],[3.1456647,39.9600498],[3.1460753,40.0019797],[3.2313899,40.0019797],[3.2312872,39.8329231],[3.1482313,39.8331596],[3.1484366,39.7935717],[3.4814817,39.7931773],[3.4803472,39.5959027],[3.3150618,39.4784606],[3.3146179,39.3785504],[3.0830178,39.2499355],[2.9798608,39.2501482],[2.9790395,39.3334971],[2.7287424,39.3334177],[2.7288451,39.4581361],[2.6456865,39.4577397],[2.6453785,39.4996593],[2.5452802,39.4994216],[2.5450749,39.4166673]],[[3.8120402,40.0434431],[3.729082,40.0437979],[3.7286185,39.9584155],[3.8126633,39.9576011],[3.8122771,39.9164393],[3.9608975,39.9159813],[4.1938142,39.791308],[4.3150279,39.7905799],[4.3159934,39.8329294],[4.3987393,39.8320396],[4.3973664,39.9185834],[4.3158003,39.9193274],[4.3161865,40.0433985],[4.2318959,40.0443594],[4.2324752,40.0847793],[4.1491501,40.086109],[4.1490623,40.1255157],[4.0627981,40.1272166],[4.0624217,40.0849941],[3.8128687,40.085294],[3.8120402,40.0434431]],[[-8.8910646,41.8228891],[-9.1092038,42.5751065],[-9.0365469,42.730656],[-9.0883419,42.7269569],[-9.1466113,42.7750272],[-9.2185488,42.9016271],[-9.2760988,42.8605106],[-9.3099094,42.9311297],[-9.2789763,42.9821991],[-9.3099094,43.0600377],[-9.2523594,43.1041725],[-9.2314975,43.1703151],[-9.1473307,43.210176],[-9.06748,43.1991644],[-9.0336694,43.2426748],[-8.99842,43.2447709],[-8.9998588,43.2955793],[-8.9372732,43.3055265],[-8.92936,43.326986],[-8.8638969,43.3290792],[-8.8761263,43.3740655],[-8.8221732,43.3735426],[-8.785485,43.3191358],[-8.7063538,43.305003],[-8.6099575,43.3296025],[-8.5509688,43.3233227],[-8.5243519,43.3364048],[-8.5250713,43.3646525],[-8.45745,43.3918416],[-8.3610538,43.4111803],[-8.3603344,43.4634161],[-8.3344369,43.5797394],[-8.2776063,43.5708796],[-8.0646713,43.7239184],[-7.9992081,43.7233986],[-7.9171994,43.7826357],[-7.8560525,43.7914643],[-7.83591,43.7374337],[-7.6628443,43.809819],[-7.3188932,43.6782695],[-7.1997467,43.5830817],[-6.2488228,43.6075032],[-6.1229322,43.5790105],[-5.8520425,43.6798953],[-5.6036334,43.5708672],[-5.2855347,43.5619084],[-5.1787525,43.4991591],[-4.9089869,43.4836655],[-4.6156167,43.4192021],[-4.1839917,43.4249168],[-3.8029478,43.5195394],[-3.7400025,43.4869277],[-3.5612827,43.5423572],[-3.1083013,43.3816347],[-2.9385737,43.4624573],[-2.7452417,43.4755094],[-2.3046245,43.3170625],[-1.9854018,43.3563045],[-1.8552841,43.3972545],[-1.769802,43.3964383],[-1.7700492,43.3760501],[-1.7100474,43.3756908],[-1.7113451,43.3312527],[-1.7225915,43.3131806],[-1.6890375,43.3129108],[-1.6881106,43.3341294],[-1.6446695,43.3337248],[-1.6449785,43.3133155],[-1.6029903,43.3129528],[-1.6034352,43.2926624],[-1.5635905,43.2921227],[-1.5630468,43.3133844],[-1.4779905,43.3128355],[-1.3667723,43.2761368],[-1.3568809,43.2381533],[-1.3703692,43.1712972],[-1.4423067,43.0833554],[-1.4198262,43.0603647],[-1.3730668,43.051166],[-1.3640746,43.1115893],[-1.3020285,43.135217],[-1.2354864,43.1332484],[-1.2795481,43.0774443],[-1.1923239,43.0649635],[-1.0061856,43.0077821],[-0.942341,42.9748951],[-0.7562028,42.9821318],[-0.7148387,42.9610774],[-0.6968543,42.9031405],[-0.5511809,42.8220693],[-0.5044215,42.8484456],[-0.4288871,42.8200906],[-0.3164848,42.8655842],[-0.1456332,42.810856],[-0.0314324,42.7124874],[0.1861785,42.7540985],[0.3021777,42.7177729],[0.3642238,42.7428729],[0.4487504,42.7144695],[0.6276949,42.7223973],[0.6411832,42.8576747],[0.7149192,42.882718],[0.9675996,42.8181119],[1.108777,42.7989808],[1.1753192,42.7342872],[1.3632559,42.7415521],[1.4113736,42.7093914],[1.4806054,42.7103407],[1.4813006,42.5010664],[1.6443591,42.5020345],[1.6432777,42.5424539],[1.730407,42.5434214],[1.7316429,42.5011803],[2.0638621,42.5016359],[2.0645572,42.4590247],[2.3969309,42.4599364],[2.3976786,42.4178363],[2.4804823,42.4179732],[2.4809767,42.3759441],[2.6447922,42.3762636],[2.6444832,42.4592447],[2.8113266,42.4596094],[2.8112648,42.5010358],[3.063878,42.5008535],[3.063878,42.4591535],[3.2307832,42.4593359],[3.2304935,42.3764363],[3.3141469,42.3760369],[3.3141243,42.3339864],[3.397855,42.3340435],[3.3973912,42.290094],[3.3138923,42.2908368],[3.3139695,42.2070151],[3.1475896,42.2073012],[3.1475896,42.1260612],[3.2305478,42.1260039],[3.2466753,41.9529359],[3.1945206,41.8558943],[3.060537,41.7647419],[2.7835777,41.6371796],[2.26293,41.4271601],[2.1649151,41.2989297],[1.86008,41.2232228],[1.3763003,41.116273],[1.1793714,41.0464585],[1.0858526,41.048493],[0.758537,40.8195599],[0.9114042,40.733761],[0.8781331,40.6751363],[0.6650182,40.5358666],[0.5580112,40.5502166],[0.433919,40.3757589],[0.2675635,40.1919192],[0.1641534,40.0647234],[0.0751307,40.0144671],[0.010387,39.8952188],[-0.0939224,39.8116904],[-0.1847435,39.6311716],[-0.2908513,39.5036254],[-0.2863552,39.333431],[-0.1856427,39.1774612],[-0.2135185,39.1558487],[-0.1110076,38.9722246],[0.0094878,38.8826835],[0.1218901,38.872183],[0.2342925,38.798636],[0.2558737,38.7264162],[0.0958128,38.6133825],[-0.0022021,38.6070586],[-0.0570544,38.5269073],[-0.2719677,38.4762395],[-0.379874,38.3931234],[-0.3834708,38.3381297],[-0.4509122,38.3310763],[-0.5048654,38.2830943],[-0.4823849,38.1948095],[-0.429331,38.1658287],[-0.4545091,38.148859],[-0.5839966,38.1721913],[-0.6136708,38.1198599],[-0.6370505,37.9612228],[-0.6811123,37.9456238],[-0.7323677,37.8810656],[-0.7215771,37.7830562],[-0.688306,37.7340026],[-0.6641461,37.6231485],[-0.7193941,37.5878413],[-0.9196258,37.5375806],[-1.1107098,37.5164093],[-1.3383246,37.5286671],[-1.4408917,37.3903714],[-1.6766966,37.2765189],[-1.8540816,36.9122889],[-2.0683486,36.6929117],[-2.2158766,36.6619233],[-2.3721861,36.7801753],[-2.6812926,36.6591056],[-2.9201476,36.6675585],[-3.09402,36.712625],[-3.4610839,36.6548788],[-3.7280395,36.6929117],[-4.3743529,36.6633322],[-4.6571151,36.4404171],[-4.9188018,36.4531321],[-5.1699508,36.3513541],[-5.2841094,36.1970201],[-5.2680911,36.1241812],[-5.3524784,36.1224654],[-5.3516094,36.0401413],[-5.4365759,36.0388921],[-5.4353207,36.0034384],[-5.6888562,36.0036518],[-5.6899635,36.0405317],[-5.85506,36.0385595],[-5.8566821,36.1242077],[-5.9384817,36.1221487],[-5.9400265,36.1655625],[-5.9983445,36.1645024],[-6.0357297,36.1780957],[-6.0775178,36.2224132],[-6.1506113,36.2864561],[-6.231541,36.3770075],[-6.3358504,36.5310643],[-6.3214629,36.5816265],[-6.404191,36.6234958],[-6.4743301,36.7489673],[-6.4158808,36.7993866],[-6.490516,36.9173818],[-6.6298949,37.0194012],[-6.8744824,37.1083766],[-7.0426363,37.1850699],[-7.2647434,37.1843535],[-7.3753473,37.1535419],[-7.408316,37.1682196],[-7.4202886,37.2118318],[-7.4249231,37.2350505],[-7.4380543,37.2451969],[-7.4459717,37.3326142],[-7.4480958,37.3909382],[-7.4696271,37.4075829],[-7.4647029,37.4530494],[-7.5019723,37.516411],[-7.5191587,37.5229203],[-7.5219588,37.5723727],[-7.4501271,37.6695835],[-7.4249019,37.7599222],[-7.316662,37.839974],[-7.268329,37.988952],[-7.1536786,38.0155235],[-7.1177098,38.0553626],[-7.0142997,38.0243785],[-6.9963153,38.1075633],[-6.9614706,38.201254],[-7.080617,38.1570753],[-7.3402665,38.4402363],[-7.2638329,38.7380741],[-7.0435243,38.8729667],[-7.0615086,38.907962],[-6.9693387,39.0198308],[-7.0008114,39.0887867],[-7.1536786,39.0957658],[-7.1525545,39.1602899],[-7.2447245,39.1968854],[-7.2559647,39.2813308],[-7.3368944,39.3535074],[-7.3279022,39.4559917],[-7.5144901,39.5886496],[-7.5527069,39.6795427],[-7.0502684,39.6752171],[-6.9951913,39.8195433],[-6.9221297,39.8790868],[-6.886161,40.0229854],[-7.0412762,40.1347927],[-7.0176717,40.266146],[-6.8086034,40.3450071],[-6.8681766,40.4451649],[-6.8535643,40.6066433],[-6.837828,40.8757589],[-6.9536024,41.0370445],[-6.8018592,41.0395879],[-6.7681385,41.138706],[-6.6411239,41.2655616],[-6.5624422,41.2630269],[-6.217367,41.5791017],[-6.3162811,41.644652],[-6.5152332,41.6412921],[-6.5871707,41.6883151],[-6.5478299,41.8559743],[-6.6298836,41.9112057],[-7.1334461,41.9404756],[-7.1682909,41.8718791],[-7.4256922,41.7847727],[-7.9539833,41.8459271],[-8.130455,41.7805819],[-8.2518495,41.9078597],[-8.1293309,42.0348842],[-8.2484774,42.1008034],[-8.3676239,42.0557521],[-8.6070409,42.0340493],[-8.8910646,41.8228891]]],"terms_text":"PNOA","best":true},{"id":"poco_das_trincheiras","name":"Poço das Trincheiras AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Poco%20das%20Trincheiras&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-37.23941602841,-9.35156513689],[-37.23946967259,-9.34386884913],[-37.23941602841,-9.3379191951],[-37.23954477444,-9.33022260582],[-37.23972716465,-9.32791465461],[-37.23973789349,-9.32280111197],[-37.23964133396,-9.32085307601],[-37.23970570698,-9.31864034808],[-37.2398022665,-9.31706284448],[-37.23982372418,-9.31561238186],[-37.24053182736,-9.30933403261],[-37.24051036968,-9.30003805717],[-37.24008121624,-9.29687228705],[-37.23998465672,-9.29546409248],[-37.2399202837,-9.29318767574],[-37.23988809719,-9.28977831694],[-37.23995247021,-9.28817950681],[-37.24008121624,-9.28641127785],[-37.24036016598,-9.28212302085],[-37.24038162365,-9.27896767726],[-37.24051036968,-9.27556876869],[-37.2400383009,-9.26978737192],[-37.24017777577,-9.26721430207],[-37.24017777577,-9.26612365361],[-37.23995247021,-9.26454591343],[-37.23983445301,-9.26150689057],[-37.24333205357,-9.26135864488],[-37.24936165943,-9.26146453466],[-37.26444640293,-9.26161278031],[-37.28016414776,-9.26171867001],[-37.2829429163,-9.26170808105],[-37.29580679074,-9.26178220382],[-37.30684676304,-9.26178220382],[-37.31418528691,-9.26188809348],[-37.32436695233,-9.26191986037],[-37.33078279629,-9.26175043692],[-37.33056821957,-9.27275220267],[-37.33048238888,-9.28006887422],[-37.33053603306,-9.28117006773],[-37.33068623677,-9.28427245005],[-37.3306969656,-9.28535245384],[-37.33064332142,-9.28616774861],[-37.33070769444,-9.28717362916],[-37.33064332142,-9.28769245062],[-37.33062186375,-9.29026537022],[-37.3304287447,-9.29308179553],[-37.33037510052,-9.29655464967],[-37.33034291401,-9.3059142435],[-37.33039655819,-9.31203384249],[-37.33037510052,-9.321943554],[-37.33040728703,-9.33420325643],[-37.33035364285,-9.34184682509],[-37.33029999867,-9.3478281711],[-37.33035364285,-9.35202034528],[-37.31508650913,-9.35193565539],[-37.300109054,-9.35190389668],[-37.29531326428,-9.351829793],[-37.28899397984,-9.35171334434],[-37.28497066632,-9.35181920676],[-37.27851190701,-9.35173451683],[-37.27430620327,-9.35180862052],[-37.27115192547,-9.35170275809],[-37.2635129942,-9.3516815856],[-37.26045527592,-9.35163924062],[-37.25401797428,-9.35176627555],[-37.24705495968,-9.35162865438],[-37.23941602841,-9.35156513689]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"rio2013","name":"Rio Mosaic 2013","type":"wms","template":"http://geo.rio.rj.gov.br/ArcGIS/services/Imagens/Mosaico_2013/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2013-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","polygon":[[[-43.17709320917647,-22.969707888781738],[-43.14585740870588,-22.969588308044617],[-43.14605222658823,-22.927190274347275],[-43.156247695764705,-22.92730989255725],[-43.15647498329411,-22.87556516592966],[-43.177385435999994,-22.8749369295143],[-43.177417905647054,-22.88552681203441],[-43.1980361315294,-22.885706294449527],[-43.198036131529406,-22.854293259693964],[-43.21875176635292,-22.85444286278469],[-43.2190115235294,-22.833646454489337],[-43.22936934094117,-22.833646454489337],[-43.2293368712941,-22.82371093306296],[-43.19868552447057,-22.823531368775274],[-43.19855564588234,-22.834125256479705],[-43.18826276776469,-22.8339756310387],[-43.18803548023528,-22.844478937331477],[-43.16667045247057,-22.844419091729687],[-43.166832800705855,-22.83403548123485],[-43.156377574352916,-22.83406540632306],[-43.1565399225882,-22.813355672227665],[-43.104361199764675,-22.813056375525143],[-43.10445860870584,-22.802879896393364],[-43.09387350376466,-22.80276016858602],[-43.094100791294075,-22.73997839409261],[-43.13598663599996,-22.739918502607807],[-43.13569440917644,-22.750668603713393],[-43.12572622752938,-22.750548830086732],[-43.12556387929409,-22.771178288335854],[-43.14595481764702,-22.7710884716159],[-43.14611716588231,-22.760549566225578],[-43.17771013247056,-22.760878919332278],[-43.17758025388233,-22.77114834943578],[-43.188067949882324,-22.771298043870523],[-43.188067949882324,-22.781656499945914],[-43.25066942941175,-22.78162656334464],[-43.25057202047057,-22.791984235249323],[-43.28054150470587,-22.792822393946437],[-43.30343260588235,-22.793121735089624],[-43.33353196870588,-22.792972064600175],[-43.33346702941175,-22.802580576677798],[-43.38574316117646,-22.8024009845329],[-43.38541846470588,-22.812547569621618],[-43.41691402235293,-22.81284686744212],[-43.41675167411763,-22.823411659118616],[-43.42717443082351,-22.82335180425081],[-43.42740171835291,-22.833736229990887],[-43.45844270094114,-22.833616529309033],[-43.45863751882349,-22.81275707816501],[-43.48984084964701,-22.812996516105756],[-43.48993825858821,-22.796504244335274],[-43.5020819065882,-22.797462107811715],[-43.515426931529376,-22.797372308396717],[-43.52078442329409,-22.795905576244728],[-43.54169487599998,-22.796025310073155],[-43.54179228494115,-22.802341120431993],[-43.54653285341174,-22.802460848607485],[-43.54666273199997,-22.811889112101724],[-43.55250726847058,-22.81278700793061],[-43.5699109992941,-22.812936656660003],[-43.56997593858822,-22.819700607555284],[-43.57361253905883,-22.823262021899716],[-43.583483311764695,-22.823291949356644],[-43.583515781411776,-22.833466903308615],[-43.59390606847059,-22.83373622999088],[-43.59393853811765,-22.854682227387414],[-43.66098835929414,-22.854592465710777],[-43.66098835929414,-22.859828464394095],[-43.708523922588235,-22.860187496913827],[-43.70836157435295,-22.865034343090006],[-43.72206376541177,-22.864884751657844],[-43.72212870470588,-22.86847490057084],[-43.75015001011764,-22.86859457056733],[-43.75008507082353,-22.87529592210752],[-43.76037794894117,-22.87526600609435],[-43.759923373882344,-22.87849689743878],[-43.759761025647045,-22.884569568478902],[-43.76131956870587,-22.885855862947494],[-43.78128840164704,-22.8857960355681],[-43.781255932,-22.895906488289704],[-43.802133915058825,-22.896205602636037],[-43.8013546435294,-22.911369835519228],[-43.80119229529411,-22.927579033143484],[-43.7921332637647,-22.927758459903885],[-43.7921982030588,-22.93822460957403],[-43.78190532494115,-22.93798539232952],[-43.78184038564702,-22.94868995021093],[-43.75066952447056,-22.94845075146181],[-43.75060458517645,-22.95909468650586],[-43.72985648070586,-22.958855506152936],[-43.72966166282351,-22.979841971833356],[-43.709043436941144,-22.97966261413784],[-43.70891355835292,-22.99033398260527],[-43.69845833199996,-22.990064966868836],[-43.698360923058786,-23.000645848451164],[-43.667352410117616,-23.000436630016143],[-43.66725500117644,-23.011166128679353],[-43.631246162588184,-23.00937295708379],[-43.631311101882304,-23.02078907569042],[-43.63585685247054,-23.020908611087243],[-43.636019200705846,-23.031636481368604],[-43.67771022752937,-23.031636481368604],[-43.67764528823524,-23.04233361870472],[-43.67085913199995,-23.04230373961572],[-43.67108641952936,-23.063097982243804],[-43.64598738235289,-23.06303823327472],[-43.646052321647005,-23.052761015940998],[-43.60475093058818,-23.052551878372743],[-43.60452364305876,-23.063068107762582],[-43.58380800823524,-23.06288886073593],[-43.583678129647005,-23.08403836134171],[-43.54185722423525,-23.083829272389394],[-43.54195463317643,-23.06318760564771],[-43.521466285882305,-23.06300835878022],[-43.52130393764702,-23.0735237710834],[-43.500425954588195,-23.073374410186133],[-43.500425954588195,-23.042184223193427],[-43.45876739741171,-23.042214102308932],[-43.45870245811759,-23.03193529561677],[-43.43782447505876,-23.031815769997003],[-43.43775953576465,-23.021536170182088],[-43.32349884776465,-23.021207449115728],[-43.32330402988229,-23.04212446494251],[-43.31291374282347,-23.041945190030685],[-43.31275139458817,-23.052671385594376],[-43.30239357717642,-23.052581755188086],[-43.30236110752935,-23.042273860520083],[-43.291938350823465,-23.042154344071257],[-43.291970820470524,-23.031935295616755],[-43.27109283741169,-23.031815769997003],[-43.27119024635288,-23.010927040510325],[-43.260605141411716,-23.01086726840187],[-43.26067008070583,-23.000586071788522],[-43.25057202047053,-23.000466518383856],[-43.25053955082347,-23.01125578663348],[-43.23988950658817,-23.01101669862337],[-43.23985703694111,-23.00061596012315],[-43.21907646282347,-23.000496406744954],[-43.21904399317641,-22.990214420121887],[-43.20901087223524,-22.99009485753265],[-43.20862123647049,-23.083889012123244],[-43.187678314117555,-23.083769532629013],[-43.18761337482344,-23.07334453798677],[-43.135824287764606,-23.073374410186123],[-43.135889227058726,-23.052492124722143],[-43.17732049670579,-23.052551878372732],[-43.17709320917647,-22.969707888781738]]],"terms_url":"http://pgeo3.rio.rj.gov.br/arcgis/rest/services/Imagens/Mosaico_2013_UTM/MapServer","terms_text":"Instituto Pereira Passos - Prefeitura da Cidade do Rio de Janeiro."},{"id":"rio2015","name":"Rio Mosaic 2015","type":"wms","template":"http://pgeo3.rio.rj.gov.br/arcgis/services/Imagens/Mosaico_2015_UTM/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2015-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-42.30362723364694,-22.436982955891427],[-44.10842009576469,-22.06578551470817],[-44.53130477905882,-23.786301394919743],[-42.70469231411757,-24.161784722114145],[-42.30362723364694,-22.436982955891427]]],"terms_url":"http://pgeo3.rio.rj.gov.br/arcgis/rest/services/Imagens/Mosaico_2015_UTM/MapServer","terms_text":"Instituto Pereira Passos - Prefeitura da Cidade do Rio de Janeiro."},{"id":"route500","name":"Route 500","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.fr/route500/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.358164,51.32937],[2.548804,51.09759],[2.570482,51.07409],[2.587412,51.01763],[2.598448,51.0051],[2.615575,50.99749],[2.639859,50.95766],[2.642247,50.94578],[2.624519,50.9256],[2.61962,50.91067],[2.623964,50.86071],[2.627811,50.85054],[2.637859,50.83696],[2.651102,50.82906],[2.732666,50.81738],[2.79995,50.73795],[2.816552,50.73092],[2.852648,50.73335],[2.890719,50.7162],[2.904925,50.71536],[2.916096,50.72418],[2.935084,50.75592],[3.007184,50.78377],[3.082183,50.78749],[3.092439,50.79092],[3.114119,50.80566],[3.148768,50.80195],[3.215401,50.73111],[3.221487,50.7267],[3.270507,50.70375],[3.275448,50.67757],[3.265761,50.6604],[3.265877,50.64054],[3.289219,50.60028],[3.292195,50.55037],[3.305598,50.53267],[3.375514,50.50839],[3.389804,50.50884],[3.474798,50.54445],[3.52173,50.53459],[3.532662,50.51873],[3.547788,50.51012],[3.615234,50.50558],[3.673778,50.45642],[3.684152,50.35277],[3.690097,50.34044],[3.702583,50.33482],[3.715758,50.33854],[3.749349,50.36279],[3.841089,50.36558],[3.901887,50.3436],[3.913173,50.34291],[4.026717,50.36904],[4.13761,50.29984],[4.143881,50.29727],[4.214438,50.28167],[4.229037,50.26664],[4.230782,50.25233],[4.170843,50.18579],[4.166015,50.16888],[4.176401,50.1547],[4.211948,50.13602],[4.240742,50.07102],[4.231934,50.05551],[4.181645,50.03436],[4.17177,50.02537],[4.169755,50.01217],[4.176498,50.00065],[4.206331,49.97546],[4.221639,49.97089],[4.308774,49.98145],[4.445423,49.9523],[4.454691,49.95251],[4.658098,50.00609],[4.669358,50.01392],[4.672929,50.02716],[4.66924,50.06972],[4.695168,50.10472],[4.831227,50.17941],[4.881497,50.16436],[4.904786,50.14451],[4.904264,50.12639],[4.880762,50.0815],[4.862772,50.0745],[4.851037,50.06216],[4.843307,50.03884],[4.843307,50.03883],[4.843295,50.03881],[4.826781,49.989],[4.826618,49.97692],[4.833433,49.96696],[4.896542,49.91753],[4.897546,49.89424],[4.879134,49.86942],[4.876249,49.85111],[4.889238,49.81266],[4.897691,49.80204],[4.910979,49.79926],[4.995343,49.81116],[5.01867,49.79272],[5.026862,49.78886],[5.099438,49.77323],[5.134584,49.73462],[5.141201,49.72984],[5.187609,49.70906],[5.196025,49.70732],[5.281572,49.70836],[5.333628,49.67308],[5.343996,49.65049],[5.354398,49.64041],[5.431412,49.60791],[5.482051,49.52815],[5.492943,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.607602,49.53761],[5.640997,49.56095],[5.706759,49.55267],[5.715782,49.55361],[5.775261,49.57414],[5.839902,49.55321],[5.861263,49.52038],[5.875997,49.5114],[5.975162,49.50129],[5.998015,49.47317],[6.016266,49.46597],[6.08635,49.47562],[6.093186,49.47787],[6.173966,49.52187],[6.246435,49.52511],[6.333999,49.48235],[6.344229,49.48037],[6.435145,49.487],[6.5451,49.44384],[6.606389,49.37868],[6.604972,49.33739],[6.616267,49.31869],[6.670133,49.29269],[6.729955,49.22917],[6.743276,49.19086],[6.760259,49.17752],[6.809042,49.17284],[6.824733,49.17826],[6.830928,49.19366],[6.829819,49.21802],[6.851186,49.23136],[6.884528,49.2239],[6.893221,49.22389],[6.937527,49.23369],[7.040549,49.19794],[7.046296,49.17503],[7.054777,49.16313],[7.069081,49.16018],[7.104945,49.16634],[7.143153,49.14159],[7.153499,49.13839],[7.286827,49.13488],[7.29893,49.13856],[7.360948,49.18259],[7.450116,49.19517],[7.50113,49.17672],[7.543788,49.10572],[7.557903,49.09626],[7.629604,49.08527],[7.647217,49.06722],[7.661197,49.06119],[7.754008,49.05963],[7.760731,49.06067],[7.802913,49.07489],[7.855253,49.05329],[7.867297,49.05227],[7.93826,49.06832],[8.080685,49.00688],[8.222498,48.98787],[8.23704,48.97683],[8.235894,48.95817],[8.208878,48.94863],[8.200888,48.94339],[8.158243,48.89753],[8.100873,48.7993],[7.990709,48.74478],[7.985341,48.7409],[7.904217,48.65865],[7.856051,48.63606],[7.848405,48.62977],[7.818424,48.58883],[7.81456,48.57704],[7.814491,48.50968],[7.785465,48.48337],[7.780554,48.47652],[7.745059,48.39484],[7.743573,48.38427],[7.751593,48.32322],[7.71085,48.29841],[7.702411,48.28803],[7.676613,48.21555],[7.596051,48.11698],[7.591652,48.10648],[7.585216,48.04694],[7.591268,48.03035],[7.624373,47.99865],[7.632049,47.97081],[7.575545,47.87436],[7.572802,47.86435],[7.572673,47.83631],[7.545808,47.78793],[7.544185,47.77232],[7.557581,47.72899],[7.535257,47.6989],[7.531364,47.68564],[7.536998,47.67302],[7.600164,47.60822],[7.589675,47.56755],[7.554237,47.55128],[7.54511,47.54283],[7.512557,47.48439],[7.387471,47.42111],[7.326527,47.4273],[7.244354,47.40939],[7.167083,47.4335],[7.152115,47.47612],[7.14279,47.48707],[7.128529,47.48893],[7.080105,47.47718],[7.035575,47.48695],[7.021019,47.48458],[7.012048,47.47287],[7.002995,47.44095],[6.955099,47.40808],[6.947157,47.39698],[6.94818,47.38337],[6.957691,47.37359],[6.971263,47.37218],[7.018004,47.38386],[7.05623,47.37035],[7.070073,47.35005],[7.05958,47.32257],[6.974243,47.27856],[6.963469,47.26233],[6.961339,47.23479],[6.89443,47.19393],[6.889128,47.18922],[6.855453,47.14636],[6.769073,47.10751],[6.760108,47.09953],[6.725613,47.0418],[6.623551,46.9811],[6.481204,46.9445],[6.46892,46.93522],[6.466862,46.91997],[6.475476,46.88771],[6.453496,46.8239],[6.45644,46.80534],[6.467224,46.79104],[6.460984,46.76887],[6.15817,46.59343],[6.148724,46.58069],[6.15152,46.56508],[6.165489,46.54399],[6.158111,46.52456],[6.101739,46.46979],[6.095717,46.45418],[6.097044,46.43317],[6.108289,46.41643],[6.166216,46.38839],[6.178173,46.36922],[6.137482,46.31297],[6.133713,46.30227],[6.130383,46.23737],[6.110298,46.22344],[6.088648,46.23081],[6.077173,46.23123],[6.018573,46.21601],[6.006813,46.20752],[6.003882,46.19332],[6.007866,46.16977],[6.017834,46.15564],[6.03509,46.15456],[6.055639,46.16288],[6.124683,46.15415],[6.137776,46.15702],[6.240258,46.22094],[6.249058,46.23299],[6.247073,46.24777],[6.21148,46.31057],[6.212186,46.32485],[6.239462,46.36705],[6.316478,46.41557],[6.410826,46.42495],[6.417483,46.42682],[6.504978,46.46871],[6.630473,46.47435],[6.746646,46.45695],[6.822442,46.42925],[6.818324,46.38181],[6.804843,46.36179],[6.801885,46.34639],[6.810949,46.33359],[6.864911,46.30038],[6.875036,46.28007],[6.860917,46.2439],[6.826978,46.21188],[6.820746,46.19862],[6.818627,46.16592],[6.822593,46.15261],[6.834266,46.14509],[6.903819,46.12971],[6.904911,46.09595],[6.909323,46.08406],[6.920006,46.07721],[6.948976,46.0699],[7.015561,46.00883],[7.051911,45.93066],[7.045335,45.92217],[7.044967,45.92064],[7.043936,45.92036],[6.995822,45.85822],[6.940965,45.83551],[6.843757,45.82387],[6.831016,45.81711],[6.826141,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.841405,45.71373],[6.907294,45.69124],[6.92419,45.66935],[6.942468,45.66172],[6.971313,45.66528],[7.00597,45.64945],[7.011511,45.63652],[6.997797,45.60877],[6.996431,45.59465],[7.015803,45.52354],[7.027743,45.5102],[7.107198,45.47877],[7.122797,45.44924],[7.13304,45.44001],[7.185604,45.41894],[7.19515,45.40409],[7.170749,45.35069],[7.142319,45.32298],[7.136488,45.30576],[7.14458,45.25048],[7.084166,45.20279],[6.992792,45.19823],[6.981064,45.19368],[6.900091,45.12689],[6.85843,45.11699],[6.782826,45.14228],[6.770557,45.14242],[6.677507,45.11356],[6.665295,45.10289],[6.665008,45.08667],[6.68237,45.04558],[6.696016,45.03395],[6.757442,45.01884],[6.783751,44.9146],[6.794195,44.90161],[6.866981,44.86519],[6.879801,44.86346],[6.936325,44.87461],[7.017954,44.84402],[7.034535,44.82282],[7.037114,44.75009],[7.049604,44.73226],[7.072236,44.72311],[7.086508,44.6968],[7.086656,44.68085],[7.07671,44.67134],[6.990071,44.67203],[6.974128,44.66431],[6.970564,44.64696],[6.978189,44.61784],[6.94659,44.57124],[6.882347,44.53479],[6.872327,44.5195],[6.878925,44.50245],[6.958945,44.43129],[6.958723,44.42908],[6.921668,44.41436],[6.912225,44.40659],[6.909075,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.999091,44.29414],[7.011806,44.256],[7.019835,44.24558],[7.032595,44.2424],[7.073117,44.2461],[7.165097,44.22112],[7.245331,44.18544],[7.260526,44.16682],[7.275371,44.15947],[7.338779,44.1574],[7.362775,44.13834],[7.377763,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.564785,44.15817],[7.605476,44.1634],[7.616198,44.16827],[7.639891,44.18928],[7.686079,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.694448,44.12276],[7.727862,44.08615],[7.724032,44.05704],[7.686028,44.02371],[7.680769,44.0164],[7.660161,43.9672],[7.596244,43.94466],[7.584187,43.93287],[7.568576,43.89159],[7.527096,43.87434],[7.516489,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.369681,41.35052],[9.273114,41.29196],[8.941857,41.27688],[5.8,41.64],[3.173576,42.41768],[3.160814,42.42757],[3.094399,42.41457],[3.034016,42.45331],[3.022142,42.45645],[2.878221,42.4487],[2.870188,42.44653],[2.784238,42.40256],[2.741304,42.41128],[2.729276,42.40998],[2.693308,42.39417],[2.683779,42.3854],[2.681621,42.37263],[2.685852,42.34679],[2.66719,42.33008],[2.581057,42.34418],[2.567769,42.34173],[2.533803,42.32197],[2.477948,42.32986],[2.419327,42.37658],[2.41222,42.38021],[2.267193,42.42055],[2.259731,42.42117],[2.206944,42.41558],[2.206525,42.41526],[2.205257,42.41541],[2.160278,42.41065],[2.148808,42.40545],[2.093931,42.35474],[2.008614,42.33818],[1.964998,42.36473],[1.930762,42.42442],[1.920889,42.43302],[1.884665,42.44761],[1.884588,42.44762],[1.884444,42.4477],[1.827736,42.47056],[1.725668,42.48452],[1.715606,42.50125],[1.727195,42.56103],[1.724794,42.57499],[1.710109,42.59992],[1.69377,42.60975],[1.602827,42.61382],[1.560687,42.6392],[1.546365,42.64166],[1.504443,42.6331],[1.492096,42.62502],[1.472384,42.59703],[1.437922,42.59264],[1.419356,42.60643],[1.38032,42.67415],[1.373353,42.68127],[1.333134,42.70563],[1.323642,42.7085],[1.232212,42.71248],[1.165543,42.69928],[1.085465,42.76635],[1.075637,42.77079],[0.9593748,42.78852],[0.9507323,42.78794],[0.9226515,42.7797],[0.8460624,42.8157],[0.7151135,42.8464],[0.7001699,42.84402],[0.6911674,42.83186],[0.6740937,42.76479],[0.6747382,42.75286],[0.6919171,42.70684],[0.6689955,42.67901],[0.4302428,42.67863],[0.3715037,42.70308],[0.3595376,42.70415],[0.3491168,42.69817],[0.3256688,42.67274],[0.2957095,42.66388],[0.2459353,42.70175],[0.2397249,42.70494],[0.189669,42.72039],[0.1791886,42.72075],[-0.01993262,42.67389],[-0.06725834,42.6848],[-0.1694885,42.77157],[-0.2998662,42.82697],[-0.3168349,42.82635],[-0.3920752,42.78766],[-0.4435404,42.78453],[-0.488418,42.80255],[-0.508683,42.79935],[-0.5449894,42.76906],[-0.5672068,42.76937],[-0.6744552,42.86392],[-0.6809365,42.86775],[-0.7337233,42.88666],[-0.747598,42.93879],[-0.757105,42.95107],[-0.7725328,42.95284],[-0.8211401,42.93865],[-0.9450847,42.94192],[-1.023131,42.98206],[-1.108517,43.00409],[-1.115597,43.00461],[-1.147753,43.00124],[-1.158452,43.01452],[-1.167362,43.02083],[-1.216216,43.0381],[-1.226121,43.03898],[-1.262362,43.03303],[-1.306428,43.05531],[-1.319918,43.05696],[-1.331346,43.0496],[-1.354196,43.0197],[-1.438684,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.476407,43.10248],[-1.434786,43.13087],[-1.427318,43.1404],[-1.394112,43.22935],[-1.395313,43.24596],[-1.408677,43.25591],[-1.526287,43.28099],[-1.546257,43.2737],[-1.571485,43.2412],[-1.610526,43.24223],[-1.650003,43.29323],[-1.669527,43.30065],[-1.733594,43.28856],[-1.756061,43.31966],[-1.762973,43.32565],[-1.791557,43.34067],[-1.800991,43.37017],[-1.785091,43.39037],[-1.783502,43.39686],[-2.7,43.9]]],"terms_url":"http://wiki.openstreetmap.org/wiki/FR:Servers/tile.openstreetmap.fr#Route500.E2.84.A2.C2.A9.C2.AE","terms_text":"Tiles © cquest@Openstreetmap France, data © IGN, LO/OL","description":"Routes du réseau classé (autoroutes, nationales, départementales)","overlay":true},{"id":"santana_do_ipanema","name":"Santana do Ipanema AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Santana%20do%20Ipanema&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-37.20224124741,-9.41355941666],[-37.20188336806,-9.37768274195],[-37.20208218992,-9.37455390013],[-37.20192313243,-9.36732508877],[-37.20169448729,-9.36044924119],[-37.20172431057,-9.35500535669],[-37.20195295571,-9.35101312056],[-37.20191319134,-9.34772709331],[-37.20175413385,-9.3383494838],[-37.20170442839,-9.33505352761],[-37.20171436948,-9.33301315816],[-37.20141613669,-9.32833399659],[-37.20120737373,-9.3246946053],[-37.20116760936,-9.32350762581],[-37.21425008782,-9.32345857698],[-37.21537343133,-9.32339971838],[-37.22078138595,-9.32328200115],[-37.23727365933,-9.32313485456],[-37.25180753737,-9.32292884922],[-37.26559583344,-9.32276208291],[-37.28029871006,-9.32258550672],[-37.29190990675,-9.32244816963],[-37.29204908205,-9.33522028804],[-37.29304319135,-9.41219621023],[-37.28356932967,-9.41235312635],[-37.27789296554,-9.41250023515],[-37.27160025364,-9.4124904279],[-37.26505901441,-9.41261792215],[-37.26164921949,-9.4127356091],[-37.25498868715,-9.41275522359],[-37.2499087886,-9.41296117565],[-37.24616099652,-9.41297098289],[-37.24108109797,-9.41302982631],[-37.23460944639,-9.41320635652],[-37.22839626323,-9.41324558544],[-37.22164626105,-9.41335346495],[-37.21686459529,-9.41346134443],[-37.21291798135,-9.41343192276],[-37.20224124741,-9.41355941666]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"Sao_miguel_dos_campos","name":"São Miguel dos Campos AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Sao_miguel_dos_campos&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.14150176596,-9.83171289603],[-36.05047117688,-9.8324573223],[-36.04958641959,-9.74245778891],[-36.1405871854,-9.74166417216],[-36.14150176596,-9.83171289603]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"GEOSN-DOP-RGB","name":"Saxony latest aerial imagery","type":"wms","template":"https://geodienste.sachsen.de/wms_geosn_dop-rgb/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=sn_dop_020&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[13.549014,50.697922],[13.842514,50.711263],[13.93239,50.745042],[14.046138,50.79389],[14.252571,50.859532],[14.400023,50.889661],[14.426705,50.935703],[14.35649,50.971973],[14.325595,50.993191],[14.27504,50.990539],[14.315765,51.042662],[14.415471,51.012633],[14.519389,51.003797],[14.5882,50.981699],[14.544667,50.91977],[14.579775,50.906489],[14.647181,50.922426],[14.644373,50.909146],[14.605052,50.856873],[14.720205,50.817851],[14.810081,50.813415],[14.856423,50.890547],[14.912595,50.947206],[14.996853,51.086789],[15.053026,51.247932],[15.055834,51.292741],[14.99264,51.344524],[14.988427,51.398],[14.977193,51.45754],[14.909786,51.496025],[14.739865,51.537097],[14.739865,51.591221],[14.700545,51.60605],[14.67948,51.5982],[14.683693,51.578133],[14.673863,51.558056],[14.617691,51.557183],[14.583987,51.590349],[14.519389,51.569405],[14.435131,51.559802],[14.326999,51.52574],[14.13461,51.555437],[14.067203,51.499522],[14.027882,51.478536],[14.04333,51.45229],[13.995583,51.392743],[13.957667,51.405885],[13.888856,51.388362],[13.724552,51.374338],[13.554631,51.392743],[13.404371,51.45929],[13.352411,51.439161],[13.315899,51.443538],[13.286409,51.418147],[13.226024,51.400629],[13.213385,51.46104],[13.219002,51.526614],[13.174064,51.5982],[13.002739,51.677512],[12.905842,51.653123],[12.903033,51.66619],[12.853883,51.693183],[12.764007,51.659221],[12.688175,51.670545],[12.643237,51.629593],[12.577235,51.630464],[12.425569,51.610411],[12.230371,51.570278],[12.177007,51.530109],[12.139091,51.460165],[12.167177,51.417272],[12.174199,51.334874],[12.13207,51.318201],[12.186838,51.213637],[12.158751,51.188119],[12.220541,51.092963],[12.490168,51.054139],[12.521062,50.993191],[12.605321,50.972857],[12.626385,50.918885],[12.502806,50.910917],[12.237393,50.818738],[12.213519,50.729933],[12.286543,50.664999],[12.217732,50.646303],[12.133474,50.627599],[12.053428,50.563416],[12.019725,50.647193],[11.859634,50.548248],[11.876486,50.508076],[11.927041,50.505397],[11.936871,50.486637],[11.870869,50.441941],[11.934062,50.399888],[11.96917,50.339875],[12.120835,50.297732],[12.172794,50.306702],[12.185433,50.260938],[12.212115,50.253755],[12.257053,50.216029],[12.28233,50.156684],[12.355354,50.158483],[12.355354,50.22142],[12.414335,50.281582],[12.511232,50.347045],[12.537914,50.387354],[12.678345,50.402573],[12.712048,50.386459],[12.7289,50.396307],[12.756986,50.42584],[12.786476,50.433891],[12.817371,50.417787],[12.846861,50.436574],[12.947971,50.387354],[13.009761,50.414208],[13.046273,50.449989],[13.056103,50.48753],[13.214789,50.492891],[13.275174,50.566092],[13.341177,50.568768],[13.391732,50.613344],[13.477394,50.585711],[13.54761,50.634725],[13.568674,50.67212],[13.549014,50.697922]]],"terms_url":"https://geoportal.sachsen.de/md/cd01c334-7e32-482f-bd43-af286707178a","terms_text":"Staatsbetrieb Geobasisinformation und Vermessung Sachsen","best":true,"icon":"data:image/png;base64,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"},{"id":"Geodatastyrelsen_Denmark","name":"SDFE aerial imagery","type":"tms","template":"http://osmtools.septima.dk/mapproxy/tiles/1.0.0/kortforsyningen_ortoforaar/EPSG3857/{zoom}/{x}/{y}.jpeg","scaleExtent":[0,21],"polygon":[[[8.3743941,54.9551655],[8.3683809,55.4042149],[8.2103997,55.4039795],[8.2087314,55.4937345],[8.0502655,55.4924731],[8.0185123,56.7501399],[8.1819161,56.7509948],[8.1763274,57.0208898],[8.3413329,57.0219872],[8.3392467,57.1119574],[8.5054433,57.1123212],[8.5033923,57.2020499],[9.3316304,57.2027636],[9.3319079,57.2924835],[9.4978864,57.2919578],[9.4988593,57.3820608],[9.6649749,57.3811615],[9.6687295,57.5605591],[9.8351961,57.5596265],[9.8374896,57.6493322],[10.1725726,57.6462818],[10.1754245,57.7367768],[10.5118282,57.7330269],[10.5152095,57.8228945],[10.6834853,57.8207722],[10.6751613,57.6412021],[10.5077045,57.6433097],[10.5039992,57.5535088],[10.671038,57.5514113],[10.6507805,57.1024538],[10.4857673,57.1045138],[10.4786236,56.9249051],[10.3143981,56.9267573],[10.3112341,56.8369269],[10.4750295,56.83509],[10.4649016,56.5656681],[10.9524239,56.5589761],[10.9479249,56.4692243],[11.1099335,56.4664675],[11.1052639,56.376833],[10.9429901,56.3795284],[10.9341235,56.1994768],[10.7719685,56.2020244],[10.7694751,56.1120103],[10.6079695,56.1150259],[10.4466742,56.116717],[10.2865948,56.118675],[10.2831527,56.0281851],[10.4439274,56.0270388],[10.4417713,55.7579243],[10.4334961,55.6693533],[10.743814,55.6646861],[10.743814,55.5712253],[10.8969041,55.5712253],[10.9051793,55.3953852],[11.0613726,55.3812841],[11.0593038,55.1124061],[11.0458567,55.0318621],[11.2030844,55.0247474],[11.2030844,55.117139],[11.0593038,55.1124061],[11.0613726,55.3812841],[11.0789572,55.5712253],[10.8969041,55.5712253],[10.9258671,55.6670198],[10.743814,55.6646861],[10.7562267,55.7579243],[10.4417713,55.7579243],[10.4439274,56.0270388],[10.4466742,56.116717],[10.6079695,56.1150259],[10.6052053,56.0247462],[10.9258671,56.0201215],[10.9197132,55.9309388],[11.0802782,55.92792],[11.0858066,56.0178284],[11.7265047,56.005058],[11.7319981,56.0952142],[12.0540333,56.0871256],[12.0608477,56.1762576],[12.7023469,56.1594405],[12.6611131,55.7114318],[12.9792318,55.7014026],[12.9612912,55.5217294],[12.3268659,55.5412096],[12.3206071,55.4513655],[12.4778226,55.447067],[12.4702432,55.3570479],[12.6269738,55.3523837],[12.6200898,55.2632576],[12.4627339,55.26722],[12.4552949,55.1778223],[12.2987046,55.1822303],[12.2897344,55.0923641],[12.6048608,55.0832904],[12.5872011,54.9036285],[12.2766618,54.9119031],[12.2610181,54.7331602],[12.1070691,54.7378161],[12.0858621,54.4681655],[11.7794953,54.4753579],[11.7837381,54.5654783],[11.1658525,54.5782155],[11.1706443,54.6686508],[10.8617173,54.6733956],[10.8651245,54.7634667],[10.7713646,54.7643888],[10.7707276,54.7372807],[10.7551428,54.7375776],[10.7544039,54.7195666],[10.7389074,54.7197588],[10.7384368,54.7108482],[10.7074486,54.7113045],[10.7041094,54.6756741],[10.5510973,54.6781698],[10.5547184,54.7670245],[10.2423994,54.7705935],[10.2459845,54.8604673],[10.0902268,54.8622134],[10.0873731,54.7723851],[9.1555798,54.7769557],[9.1562752,54.8675369],[8.5321973,54.8663765],[8.531432,54.95516],[8.3743941,54.9551655]],[[11.4577738,56.819554],[11.7849181,56.8127385],[11.7716715,56.6332796],[11.4459621,56.6401087],[11.4577738,56.819554]],[[11.3274736,57.3612962],[11.3161808,57.1818004],[11.1508692,57.1847276],[11.1456628,57.094962],[10.8157703,57.1001693],[10.8290599,57.3695272],[11.3274736,57.3612962]],[[11.5843266,56.2777928],[11.5782882,56.1880397],[11.7392309,56.1845765],[11.7456428,56.2743186],[11.5843266,56.2777928]],[[14.6825922,55.3639405],[14.8395247,55.3565231],[14.8263755,55.2671261],[15.1393406,55.2517359],[15.1532015,55.3410836],[15.309925,55.3330556],[15.295719,55.2437356],[15.1393406,55.2517359],[15.1255631,55.1623802],[15.2815819,55.1544167],[15.2535578,54.9757646],[14.6317464,55.0062496],[14.6825922,55.3639405]]],"terms_url":"http://download.kortforsyningen.dk/content/vilkaar-og-betingelser","terms_text":"Geodatastyrelsen og Danske Kommuner","best":true,"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAABGlBMVEX///+y4OQAAAAKCgrL6ezI6exHs8AdorE/sL0FBQX+/v78/v4RERH5/PzS7fC64+chpLLt+Pm95Og+Pj4mprQYGBgAkaLM6u3D5+oAlabc8fMVn671+/wAjp/Y7/EmJiY4ODg4rbsgICBgYGBLtcHk5OT29vYyMjJqamoNnKtISEhYu8aamppMTEzy+vpycnLg8/S/5emjo6NSUlJfvsgsLCzs7Oxsw81NtsKsrKyu3uPo9vd+ytODzdXk9PaEhISBgYFVVVWe193P7O95yNGPj4/x8fGk2uB7e3vd3d3Hx8cuqbfW1tZnwctRuMOxsbG7u7vQ0NB2dnYAl6dzxs+14eWW1NtRUVGZ1dxwxc6r3eKx3+ON0NiR0tk4C4avAAAG00lEQVR4XtzY5Y4qSxQF4JVqV9zdXcfd3Y/Lve//GrcDdTPQyjDnNMl8PyBAUnuxa1c3Ae8S3l9fP/+KFVG24rm4IZfraFiBRCqX+jyRiscD8F1yUp5K5Xbhs36K1qcJ4ofwVzVuChCFr4a0/swmJOCn/dxnk/g6/FSKmwOkovBTMGUJ0FLgI8EmgAYfRa0BMvBTxzIDcRF+2s1ZjuE3+KplDvBZw58la5rbklfzLUjlDuAim8Ub7ekJlmXP8n04qc7fjEpwFF4v3d2Vtk/fEKJ/xrETHKfDiThJQOvfwUmilBGCBiETXHhKQkmWTUwZETQ4OMjFUxPx3BacfGsFo1Qw87hw/cQrllPgQD5v5eLxXOvBubmnreiMxRIoHK1PcTpcpNMynOUz0TmZf+AtzSXmsFwfy3oUonOCQe+1ZLr/r7g8lpTORE0yP+Clz5kDsAkZy/lhCSDw8HLIJUxYTsNyHoSoSfDOc62hJcDyQ9ARombB0FsCUFz2jwUIRvvwELLpgILlbNlsgedaWesQ6ljSlXUIH+FJtxzDIZYUEoLmY3gFTyFTC1hWwbIeMuYRgDc5z81PwB6Wppla0PqKRZxx7Ez9NN5Bb80maJ1jMTrHsrT93CHe5UwQopSQOcCiQmfclN7HO2XXhYwgBIVMRkzgDbKHw/xwT8MfsHe6zvOdgzw+posCVmsgYbU+MVitJsFqvXSxMkexQrkJ3BpPG1iFcXutdwHct9e+V7AyzxWs1oBgta4ZrNRLhBljhS7IRoREsDI3ZADckmv4bKfSUNWNyhhjBoZKEbefIjG13Lu4hA+eGMJE1tYiDJEaMRia5RiRCmvf2zFCfDiUR6TwTAewwkhHwIvKFHcwUTshDSxNUWR4e5mduVqEFNtSbAcU0CUDLEDLmmuFdC45SnJpBR6+q3XMOJbU4tzGn0h1eEiedx63O1u7M7X6XCA8EQjn4S7WxCy5wpg79ARXXEfk+WqV58Xqb1B7RvnRVDiQhLNuQ2We3K+E9bJaHtzA0Y8SX92eqor7tP0BWt49gVyLkUJFevb4RdRo9Ai5gIOrEi0/k0Ax6s8K6LBVV9VbbBKPAFpsALlHdmBrSOtT1dJvAHpgNO+rAjvH5B64JEeuAeQa6QJolGFrnd+eU+UB0Aa8CuRhZ6MNQ6Po3oExuZk83sNGurRtIo6wFxiZhEf2O3A97UPNNUCkAEONjGHjVDQH4A8wtAYIKLC6ZI5hqElNtwD30/nblGwDfOHNAaod5MPWAFlY1WMDGFAhdZcAJ6oGw4391aBjDVBdOADaZUxbUHEO8EIP4LW06TmDNIDtFsDODj2BTVJzDFCIYULtwc6+NcA6+tYASdgqTFugqUWnAGM6e8fkFnaurEP4LxC2HMM0bD2RI1qmax+gzkyjbZIebGXpdehVSQfSAfMOyLAXoc0vMpu2AXpk+n6Dfm51zpsa8AjDKDxffwgHdWmDfsOIXYAx7dAx6cJBVjRdinUYtPmbkQ5Hz/QnV5dcWANsMg16EtpwlKA3Q1r/F801+j9COBzIw0WTfrk2ubcEKDKXMFyqMbhI8CJNUOXFX6DkfDgQNgQCyRBcRabzXY+VzQEG9A7YkG7gpr8virxBFB+GeKUd6mwike7DQ72sTta/ldrzf9HskCYMWKM5XIR2z3/+/HI1xFLqtemEX9boazrwm9NnhX78gR2XN1wVIgr+qqONoqtGW8bHdh0ruCoXZfxV3d6Jq7WKjI+tSRhXUlnBX7XTHLi7/q89u1txFIbiAH6EzZV0xd6shNJHKM1VIFoBd6BXuYshn+//GluWma5qN1od4sD09wDJnyTnHEF45OXl5eXp/nw6IkIQPsAn2BX+8nZxWf7E9oUx7MYwlMJaieZUa005b+Yuhg2zyV+WsRzWqbgW76iYt9jR2OSOmXUJ3qj4h9ITTMuNTTos28FynosuWsG0liU9rIDFzlz08T1MqY1NeixbXguSij5dwRTEkgGDYaGd0GKAlzAhux/A+jsouRjiCMLSdhxgDwsdHwQgXz0APAhAYl4BEDYK8DPqI8SjMlzRC9WCMkztIADLPrMRkTmjyA4PYLlmQSuGopvAmt+BsY1Y0zAUSlj1h9EBZib4GMeh/U/GeXnj3TUQ4XIfx5rrA8yDrWH2hpmkhv85OqneSRcolPbjg4Q2MFuKSXtTnCGwv+pwvwLFiNSlqnyWw1PS8K/c3EvV5UqIy0jVI68QVe7VgK8hJjQOkEFMTCq16R1cxwGa9FsFMFtfAfGjAC3EVI6rAMOmr1A2EFfpVI/DEBnqDyMC0f3ojuMCNlArJ6VSUjqJYRs1MUpd92dY4Q9//EnbIq9ZogAAAABJRU5ErkJggg=="},{"id":"Sicily-ATA2007","name":"Sicily - Italy","type":"wms","template":"http://map.sitr.regione.sicilia.it/ArcGIS/services/WGS84_F33/Ortofoto_ATA20072008_f33/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=0&STYLES=default&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[15.711650848388677,38.25894105289697],[15.237178802490236,38.81938114846882],[14.271240234375,38.55246141354153],[13.150634765625,38.75408327579141],[11.964111328125,37.97451499202459],[12.5244140625,37.54022177661216],[11.87896728515625,36.796089518731506],[12.496948242187498,35.47409160773029],[12.689208984375,35.46961797120201],[14.5733642578125,36.6640126988417],[15.297088623046873,36.62875385775956],[15.398540496826199,37.42170795425973],[15.711650848388677,38.25894105289697]]]},{"id":"sc2012","name":"SIG Santa Catarina OrtoRGB 2012","type":"wms","template":"http://sigsc.sc.gov.br:80/sigserver/SIGSC/wms?SERVICE=WMS&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OrtoRGB-Landsat-2012&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2012-01-01T00:00:00.000Z","startDate":"2012-01-01T00:00:00.000Z","polygon":[[[-48.62488448156965,-26.916236931410996],[-48.624164193144196,-26.83408805760915],[-48.5616254665196,-26.83412188528322],[-48.5616507397977,-26.749193916956184],[-48.626754704148055,-26.74918263262303],[-48.627146439958395,-26.73276274152515],[-48.6412615657696,-26.732999746505616],[-48.641741758053236,-26.709116191945647],[-48.624138919866105,-26.709127480253297],[-48.624176829783245,-26.500792500209887],[-48.570989216050585,-26.500769882438657],[-48.57154522816848,-26.474145680246586],[-48.55418248612319,-26.47380633457661],[-48.55449840209926,-26.45735818142214],[-48.56154964668535,-26.457471312923715],[-48.56161282988055,-26.41746108634898],[-48.49909937653404,-26.417472403421797],[-48.49908673989502,-26.250810301340856],[-48.43663646974372,-26.250787634582515],[-48.43661119646563,-26.207520071408148],[-48.460102708446854,-26.20750873380981],[-48.46194765774716,-26.124204304592393],[-48.56161282988057,-26.12419295889107],[-48.56162546651964,-25.95753087401021],[-48.624113646588064,-25.95753087401021],[-48.624113646588064,-25.945066276881477],[-48.688383592761575,-25.94606622032166],[-48.68839622940061,-25.9575195121708],[-49.25089094312879,-25.9575195121708],[-49.25090357976782,-25.999198717680073],[-49.31339175983624,-25.999198717680073],[-49.31337912319721,-26.0825014166478],[-49.37590521318276,-26.082501416647776],[-49.37590521318275,-26.124192958891047],[-49.50093211987576,-26.124181613188597],[-49.50091948323672,-26.16585828693744],[-49.68661489397596,-26.165846945284223],[-49.68661489397595,-26.12417026748506],[-49.74906516412725,-26.082456017648312],[-49.74907780076631,-26.04084043378188],[-49.81160389075186,-26.040851787565785],[-49.811591254112805,-25.999176002051062],[-49.93656761424967,-25.99915328641767],[-49.9366055241668,-25.98244474858429],[-50.000913380257444,-25.982876406234503],[-50.00093865353552,-25.99915328641767],[-50.313379553877645,-25.999164644234927],[-50.313417463794764,-26.040829079996882],[-50.37411124111907,-26.04084043378188],[-50.374098604480025,-25.999198717680073],[-50.49913814781211,-25.999176002051062],[-50.49911287453402,-25.984137291872997],[-50.62593418397117,-25.984523506389962],[-50.62594682061022,-26.04084043378188],[-50.6883970907615,-26.041612488584164],[-50.68844763731769,-26.124158921780424],[-50.75093581738611,-26.124136230367803],[-50.750948454025156,-26.207520071408148],[-51.12595335426997,-26.207474721008193],[-51.12595335426997,-26.249132949280156],[-51.18847944425552,-26.249178283438034],[-51.31344316775333,-26.33244989854678],[-51.31346844103143,-26.624140013763412],[-51.436599851867975,-26.62415131048226],[-51.43658721522893,-26.56476034464233],[-51.62408966535135,-26.564104792996805],[-51.62411493862942,-26.540796365619084],[-51.99906929231806,-26.540796365619084],[-52.06158274566456,-26.49910746406482],[-52.06158274566456,-26.457471312923687],[-52.12408356237202,-26.457493939210668],[-52.12405828909395,-26.41578614733],[-52.374074192562865,-26.41579746456714],[-52.37408682920191,-26.391327004376254],[-52.56156400604623,-26.389402650121472],[-52.561576642685274,-26.374153838977676],[-52.624077459392744,-26.37416516029677],[-52.62409009603178,-26.332472549349774],[-53.124083993052494,-26.332472549349752],[-53.12409662969154,-26.317068980284002],[-53.16180436059632,-26.31650263355217],[-53.161362078229814,-26.290821564697215],[-53.18655953648188,-26.29083289416888],[-53.24907298982837,-26.24911028219455],[-53.24906035318934,-26.23919300812073],[-53.31158644317491,-26.23824090528976],[-53.374099896521415,-26.22882146785218],[-53.43844566252919,-26.227767259506184],[-53.43843302589015,-26.249144282821256],[-53.5616023466438,-26.249155616361257],[-53.56158971000477,-26.239827739008902],[-53.655012382450856,-26.238138893809616],[-53.656225499799,-26.292634266082075],[-53.67011316610744,-26.316842441923516],[-53.68846156599812,-26.33241592233391],[-53.70322116040052,-26.374097232365553],[-53.70928674714123,-26.384489741468975],[-53.70980484934199,-26.395684982214643],[-53.70619077057565,-26.407218680242053],[-53.70721433833813,-26.459270088862837],[-53.714379312675604,-26.461679725793857],[-53.714758411846894,-26.48118122161117],[-53.73046575417756,-26.49913008216322],[-53.73146404866198,-26.54080767056338],[-53.750962382705566,-26.540796365619055],[-53.75094974606652,-26.624173903916578],[-53.76019976584611,-26.624140013763338],[-53.761248606886696,-26.667499888848678],[-53.75097501934461,-26.66751118127877],[-53.75096238270559,-26.742976079662007],[-53.727369777612,-26.743404906944193],[-53.72132946414936,-26.749047220537665],[-53.72140528398363,-26.750931690893374],[-53.745705540863625,-26.759428345833868],[-53.746122549952055,-26.777040237532006],[-53.71948451484907,-26.77754790691426],[-53.720836635226696,-26.834155712947112],[-53.700466373089114,-26.834144437060257],[-53.70276624139493,-26.931075520284146],[-53.71167507192037,-26.930906526843206],[-53.712243720677314,-26.955565624612287],[-53.751000292622685,-26.954788421555175],[-53.75092447278844,-26.999147992456276],[-53.764673136067394,-26.999147992456276],[-53.80369507743266,-27.037513523530937],[-53.80454173224855,-27.0725803974359],[-53.80809262781969,-27.07249038098803],[-53.8086233666595,-27.09612846681215],[-53.82689594671591,-27.095768476254833],[-53.82761623514137,-27.124136682787803],[-53.846444827315686,-27.124125435915396],[-53.84764530802479,-27.170138168249487],[-53.8350592155378,-27.18931578625989],[-53.83536249487484,-27.200544291231996],[-53.688474202637146,-27.202837060128804],[-53.688486839276194,-27.227885858850012],[-53.43653753003366,-27.23245898831079],[-53.43655016667271,-27.167507452480596],[-53.37598275573884,-27.167507452480574],[-53.376008029016916,-27.233515163499888],[-53.24904771655028,-27.235638719456546],[-53.24904771655028,-27.209220599589166],[-53.06344076228435,-27.209175646364237],[-53.06345339892339,-27.233402804913485],[-52.8134754053716,-27.23685216181505],[-52.81346276873256,-27.276528928524463],[-52.750961952025094,-27.277315131338465],[-52.750961952025094,-27.292487755808434],[-52.438495778404864,-27.292521445488386],[-52.438483141765836,-27.326890821722227],[-52.37603287161454,-27.327530725463642],[-52.3759949616974,-27.33419897625023],[-52.25098069164342,-27.33417652490038],[-52.25099332828246,-27.346692446966557],[-52.18654646916235,-27.34727611465991],[-52.18657174244043,-27.334187750575865],[-52.12597905822849,-27.33419897625023],[-52.12599169486754,-27.364133804119422],[-52.02978896183197,-27.364885718492065],[-52.03035761058891,-27.424416622283772],[-51.97533768419499,-27.42478676693274],[-51.97603269934236,-27.50087558818674],[-51.93845133482801,-27.500853170691318],[-51.93845133482801,-27.54251940627202],[-51.688460704637194,-27.542474588252876],[-51.68847334127622,-27.55742038383185],[-51.599031210128736,-27.557902111020763],[-51.599233396353426,-27.59480956901105],[-51.563509617778415,-27.594977556358298],[-51.563484344500324,-27.625860453692134],[-51.500882434680506,-27.62586045369211],[-51.50094561787572,-27.667535190923896],[-51.43936727581839,-27.667501615740118],[-51.439544188765,-27.709317103607006],[-51.37596925773886,-27.70949610256912],[-51.376007167655985,-27.750892905814947],[-51.31349371430947,-27.750904088992016],[-51.313455804392355,-27.792531093204254],[-51.18846680761643,-27.792508735404642],[-51.1884794442555,-27.875860156488773],[-51.12597862754804,-27.875860156488773],[-51.12596599090898,-27.91751742532308],[-51.06347781084055,-27.91749509328296],[-51.06346517420149,-27.959192137382583],[-51.000951720854985,-28.00086192326361],[-50.93850145070369,-28.00086192326361],[-50.93848881406464,-28.16754693055966],[-50.813461907371625,-28.167524650369067],[-50.813449270732576,-28.292532475134653],[-50.750961090664134,-28.29251022102188],[-50.68844763731762,-28.334184014870516],[-50.68848554723476,-28.417538143267095],[-50.625997367166335,-28.4175159153423],[-50.56352182373695,-28.44094155830843],[-50.43848228040489,-28.44050820876798],[-50.438469643765856,-28.459173964550686],[-50.37596882705837,-28.459207293310225],[-50.37598146369743,-28.475537121198975],[-50.188441103657894,-28.474537408344325],[-50.188491650214054,-28.51143164845026],[-50.12398160789872,-28.51104300453612],[-50.124019517815846,-28.5008600237691],[-49.87597493003768,-28.500848918564397],[-49.876012839954804,-28.514196530962266],[-49.813474113330216,-28.513685754912284],[-49.813474113330194,-28.58255155550104],[-49.830028110476746,-28.582507169109398],[-49.829510008275975,-28.625974659050915],[-49.87589911020343,-28.66572089511971],[-50.0010018367307,-28.749145575544063],[-50.00100183673066,-29.04083327722487],[-50.03318735637359,-29.04081118145324],[-50.0321890618892,-29.147114336184],[-50.12601610678465,-29.14774341401082],[-50.12597819686752,-29.165786374753505],[-50.13612541801917,-29.16580844371222],[-50.18850428685308,-29.19622599157441],[-50.18850428685309,-29.31905095330294],[-50.14220364139895,-29.31873143173735],[-50.14207727500852,-29.334221566678927],[-50.126003470145626,-29.334177501353437],[-50.125990833506584,-29.362375414604447],[-49.99905579431803,-29.361527388076844],[-49.99904315767897,-29.24030824385708],[-49.9384757467451,-29.239856157941617],[-49.93851365666223,-29.25087104871457],[-49.87601283995477,-29.25087104871457],[-49.876000203315726,-29.300979886173586],[-49.82262303999743,-29.30051704853271],[-49.82226921410422,-29.3341885176866],[-49.81347411333018,-29.334221566678927],[-49.81353729652554,-29.34109552421944],[-49.6865390741418,-29.339905833968423],[-49.6865138008637,-29.29254930022262],[-49.62398771087813,-29.292516237731153],[-49.6239750742391,-29.2508489980658],[-49.56148689417066,-29.2508269474122],[-49.561448984253516,-29.167485670694504],[-49.49901135074126,-29.167463602096316],[-49.49902398738031,-29.0841871105079],[-49.43649789739473,-29.084176067267432],[-49.43651053403379,-29.04251254202398],[-49.374047627243456,-29.04247939890416],[-49.37402235396536,-28.959201357408347],[-49.31153417389693,-28.959168187563616],[-49.311521537257896,-28.9174874156231],[-49.248982810633294,-28.917498476687246],[-49.24897017399424,-28.875823083095714],[-49.18654517712104,-28.875845214103762],[-49.18653254048198,-28.83414203544581],[-49.12401908713548,-28.834175245265325],[-49.12400645049644,-28.79249965988945],[-49.06149299714994,-28.79246643678005],[-49.06145508723281,-28.750840644227264],[-48.99903009035959,-28.75085172301705],[-48.999030090359604,-28.709187170256886],[-48.936579820208316,-28.709176087050047],[-48.936579820208316,-28.667517104639387],[-48.87405373022276,-28.667506017020735],[-48.874041093583735,-28.625852646864526],[-48.74911528000304,-28.625852646864555],[-48.749115280003025,-28.54254072237745],[-48.68656391673939,-28.54252962156217],[-48.68657655337841,-28.33417289217185],[-48.62407573667094,-28.334161769471883],[-48.62406310003189,-28.08417545272023],[-48.561600193241524,-28.08417545272023],[-48.56158755660246,-27.959192137382715],[-48.49904882997788,-27.959158652239882],[-48.49903619333884,-27.915809010935423],[-48.56157491996342,-27.915797844739515],[-48.561600193241524,-27.875837815851458],[-48.4990235566998,-27.875860156488873],[-48.49902355669978,-27.834220385416636],[-48.4365732865485,-27.83417568697334],[-48.43661119646565,-27.62582686571355],[-48.374059833202004,-27.625849257700484],[-48.374047196562984,-27.50086437943969],[-48.3115716531336,-27.50086437943969],[-48.311533743216444,-27.24913190347051],[-48.43657328654852,-27.24913190347051],[-48.4365353766314,-27.209164408055255],[-48.374021923284864,-27.20919812297907],[-48.37404719656297,-27.16579857825554],[-48.43656064990947,-27.16579857825554],[-48.43656064990947,-27.12414792965919],[-48.49906146661692,-27.124125435915495],[-48.49907031973662,-27.086668577138795],[-48.500216139509774,-27.08666004891293],[-48.5003124938822,-27.082470514310543],[-48.561600193241524,-27.082481765368538],[-48.56158755660248,-27.04252214011793],[-48.49906146661693,-27.04252214011793],[-48.49906146661693,-26.999125473627824],[-48.56156228332439,-26.999125473627824],[-48.56157491996343,-26.915786222397905],[-48.62488448156965,-26.916236931410996]]],"terms_url":"http://sigsc.sds.sc.gov.br/download/termo_sigsc.pdf","terms_text":"Sistema de Informações Geográficas - Governo de Santa Catarina"},{"id":"Slovakia-Historic-Maps","name":"Slovakia Historic Maps","type":"tms","template":"http://tms.freemap.sk/historicke/{zoom}/{x}/{y}.png","scaleExtent":[0,12],"polygon":[[[16.8196949,47.4927236],[16.8196949,49.5030322],[22.8388318,49.5030322],[22.8388318,47.4927236],[16.8196949,47.4927236]]]},{"id":"Soskut_Pusztazamor_Tarnok_Diosd_orto_2017","name":"Sóskút, Pusztazámor, Tárnok, Diósd ortophoto 2017","type":"tms","template":"http://adam.openstreetmap.hu/mapproxy/tiles/1.0.0/Soskut-Tarnok-Pusztazamor-Diosd/mercator/{zoom}/{x}/{y}.png","startDate":"2017-03-01T00:00:00.000Z","scaleExtent":[11,20],"polygon":[[[18.79273330201,47.37078533804],[18.791936169,47.37048036201],[18.79139114593,47.37063268281],[18.7901097,47.3717614],[18.7891647,47.3734529],[18.78721506824,47.37566027041],[18.7860339,47.37764910001],[18.7849824,47.3790513],[18.783695,47.3803226],[18.782665,47.3819499],[18.781399,47.3836789],[18.7793426,47.3871257],[18.776657,47.3893959],[18.764716,47.396699],[18.7616966,47.3996569],[18.7563102,47.4032821],[18.7583737,47.4065272],[18.75879657883,47.40776342073],[18.76199554897,47.41217224817],[18.7630394973,47.41315137445],[18.7659298,47.4147108],[18.7704058,47.4176575],[18.77247285488,47.41808545272],[18.7724806,47.4202978],[18.8086021,47.4404108],[18.8174212,47.435389],[18.8209188,47.4357228],[18.8280427,47.4375516],[18.8302099,47.4352584],[18.8358533,47.4375371],[18.8404882,47.4334586],[18.847655,47.4357228],[18.8510024,47.4328054],[18.8689996,47.4396086],[18.87361350924,47.43597176329],[18.87499181607,47.43342149293],[18.87386045593,47.43248349864],[18.8760377,47.4279677],[18.8605023,47.4230028],[18.8662101,47.4179794],[18.8724328,47.4108645],[18.8662959,47.4077278],[18.8696433,47.4047072],[18.86776892261,47.40207457802],[18.86509430105,47.40052438512],[18.87081279074,47.3983820654],[18.86772375423,47.39699336542],[18.86992005424,47.39655168559],[18.87648610191,47.39477958954],[18.87748924808,47.39494663392],[18.87866942005,47.39462343887],[18.88358322696,47.3899604942],[18.88290731029,47.3896699544],[18.88538567142,47.38530440107],[18.87747851924,47.38339390377],[18.88181296901,47.37604910406],[18.87914148883,47.37392756692],[18.88638345317,47.36922645965],[18.88205973224,47.36772957402],[18.87973157482,47.36640704749],[18.8746997507,47.36252284243],[18.87282220439,47.36136733615],[18.87027947025,47.36062605465],[18.86687842922,47.3585329683],[18.86234013156,47.35637438604],[18.85566679554,47.35199153827],[18.84873596744,47.34728120653],[18.83192388134,47.3384118486],[18.82497159557,47.34257772442],[18.81619540767,47.34925116493],[18.8107880743,47.35356882392],[18.80823461132,47.35599644336],[18.80645362453,47.35854023611],[18.80707589702,47.359019909],[18.80634633617,47.36021180457],[18.80465118007,47.36175250772],[18.80381433086,47.36335130305],[18.80054616504,47.36544732015],[18.79988097721,47.36617355102],[18.79416204336,47.36974865444],[18.79273330201,47.37078533804]],[[18.91871480064,47.4093812629],[18.91826418952,47.40997664498],[18.9206674488,47.41155945729],[18.92509845809,47.41372304121],[18.93473295288,47.41916790937],[18.94063381271,47.42241278301],[18.94981769638,47.41937843296],[18.95154503898,47.41749820965],[18.95689872818,47.41922598493],[18.95770339088,47.41877589767],[18.95755318717,47.41435467478],[18.9621129425,47.40506817222],[18.96266011314,47.40117592194],[18.96316436843,47.39903360927],[18.95446328239,47.3967314338],[18.95275739746,47.39526437993],[18.95201710777,47.39362297422],[18.95119098739,47.39356487042],[18.94692091064,47.39798783856],[18.94410995559,47.3984526281],[18.94161013679,47.39868502134],[18.93735078887,47.39633199249],[18.93617061691,47.39682584676],[18.93122462348,47.39999947627],[18.93120316581,47.40023186269],[18.92923978881,47.40204734624],[18.92561344223,47.40604845111],[18.92465857582,47.40635342305],[18.92293123321,47.40925782918],[18.91871480064,47.4093812629]]],"terms_url":"http://fototerkep.hu/","terms_text":"Fototerkep.hu","best":true,"description":"5 cm resolution bald image of 4 settlement"},{"id":"South_Africa-CD_NGI-Aerial","name":"South Africa CD:NGI Aerial","type":"tms","template":"http://{switch:a,b,c}.aerial.openstreetmap.org.za/ngi-aerial/{zoom}/{x}/{y}.jpg","scaleExtent":[1,22],"polygon":[[[17.8396817,-32.7983384],[17.8893509,-32.6972835],[18.00364,-32.6982187],[18.0991679,-32.7485251],[18.2898747,-32.5526645],[18.2930182,-32.0487089],[18.105455,-31.6454966],[17.8529257,-31.3443951],[17.5480046,-30.902171],[17.4044506,-30.6374731],[17.2493704,-30.3991663],[16.9936977,-29.6543552],[16.7987996,-29.19437],[16.5494139,-28.8415949],[16.4498691,-28.691876],[16.4491046,-28.5515766],[16.6002551,-28.4825663],[16.7514057,-28.4486958],[16.7462192,-28.2458973],[16.8855148,-28.04729],[16.9929502,-28.0244005],[17.0529659,-28.0257086],[17.1007562,-28.0338839],[17.2011527,-28.0930546],[17.2026346,-28.2328424],[17.2474611,-28.2338215],[17.2507953,-28.198892],[17.3511919,-28.1975861],[17.3515624,-28.2442655],[17.4015754,-28.2452446],[17.4149122,-28.3489751],[17.4008345,-28.547997],[17.4526999,-28.5489733],[17.4512071,-28.6495106],[17.4983599,-28.6872054],[17.6028204,-28.6830048],[17.6499732,-28.6967928],[17.6525928,-28.7381457],[17.801386,-28.7381457],[17.9994276,-28.7560602],[18.0002748,-28.7956172],[18.1574507,-28.8718055],[18.5063811,-28.8718055],[18.6153564,-28.8295875],[18.9087513,-28.8277516],[19.1046973,-28.9488548],[19.1969071,-28.9378513],[19.243012,-28.8516164],[19.2314858,-28.802963],[19.2587296,-28.7009928],[19.4431493,-28.6973163],[19.5500289,-28.4958332],[19.6967264,-28.4939914],[19.698822,-28.4479358],[19.8507587,-28.4433291],[19.8497109,-28.4027818],[19.9953605,-28.399095],[19.9893671,-24.7497859],[20.2916682,-24.9192346],[20.4724562,-25.1501701],[20.6532441,-25.4529449],[20.733265,-25.6801957],[20.8281046,-25.8963498],[20.8429232,-26.215851],[20.6502804,-26.4840868],[20.6532441,-26.8204869],[21.0889134,-26.846933],[21.6727695,-26.8389998],[21.7765003,-26.6696268],[21.9721069,-26.6431395],[22.2803355,-26.3274702],[22.5707817,-26.1333967],[22.7752795,-25.6775246],[23.0005235,-25.2761948],[23.4658301,-25.2735148],[23.883717,-25.597366],[24.2364017,-25.613402],[24.603905,-25.7896563],[25.110704,-25.7389432],[25.5078447,-25.6855376],[25.6441766,-25.4823781],[25.8419267,-24.7805437],[25.846641,-24.7538456],[26.3928487,-24.6332894],[26.4739066,-24.5653312],[26.5089966,-24.4842437],[26.5861946,-24.4075775],[26.7300635,-24.3014458],[26.8567384,-24.2499463],[26.8574402,-24.1026901],[26.9215471,-23.8990957],[26.931831,-23.8461891],[26.9714827,-23.6994344],[27.0006074,-23.6367644],[27.0578041,-23.6052574],[27.1360547,-23.5203437],[27.3339623,-23.3973792],[27.5144057,-23.3593929],[27.5958145,-23.2085465],[27.8098634,-23.0994957],[27.8828506,-23.0620496],[27.9382928,-22.9496487],[28.0407556,-22.8255118],[28.2056786,-22.6552861],[28.3397223,-22.5639374],[28.4906093,-22.560697],[28.6108769,-22.5400248],[28.828175,-22.4550173],[28.9285324,-22.4232328],[28.9594116,-22.3090081],[29.0162574,-22.208335],[29.2324117,-22.1693453],[29.3531213,-22.1842926],[29.6548952,-22.1186426],[29.7777102,-22.1361956],[29.9292989,-22.1849425],[30.1166795,-22.2830348],[30.2563377,-22.2914767],[30.3033582,-22.3395204],[30.5061784,-22.3057617],[30.8374279,-22.284983],[31.0058599,-22.3077095],[31.1834152,-22.3232913],[31.2930586,-22.3674647],[31.5680579,-23.1903385],[31.5568311,-23.4430809],[31.6931122,-23.6175209],[31.7119696,-23.741136],[31.7774743,-23.8800628],[31.8886337,-23.9481098],[31.9144386,-24.1746736],[31.9948307,-24.3040878],[32.0166656,-24.4405988],[32.0077331,-24.6536578],[32.019643,-24.9140701],[32.035523,-25.0849767],[32.019643,-25.3821442],[31.9928457,-25.4493771],[31.9997931,-25.5165725],[32.0057481,-25.6078978],[32.0057481,-25.6624806],[31.9362735,-25.8403721],[31.9809357,-25.9546537],[31.8687838,-26.0037251],[31.4162062,-25.7277683],[31.3229117,-25.7438611],[31.2504595,-25.8296526],[31.1393001,-25.9162746],[31.1164727,-25.9912361],[30.9656135,-26.2665756],[30.8921689,-26.3279703],[30.8534616,-26.4035568],[30.8226943,-26.4488849],[30.8022583,-26.5240694],[30.8038369,-26.8082089],[30.9020939,-26.7807451],[30.9100338,-26.8489495],[30.9824859,-26.9082627],[30.976531,-27.0029222],[31.0034434,-27.0441587],[31.1543322,-27.1980416],[31.5015607,-27.311117],[31.9700183,-27.311117],[31.9700183,-27.120472],[31.9769658,-27.050664],[32.0002464,-26.7983892],[32.1069826,-26.7984645],[32.3114546,-26.8479493],[32.899986,-26.8516059],[32.886091,-26.9816971],[32.709427,-27.4785436],[32.6240724,-27.7775144],[32.5813951,-28.07479],[32.5387178,-28.2288046],[32.4275584,-28.5021568],[32.3640388,-28.5945699],[32.0702603,-28.8469827],[31.9878832,-28.9069497],[31.7764818,-28.969487],[31.4638459,-29.2859343],[31.359634,-29.3854348],[31.1680825,-29.6307408],[31.064863,-29.7893535],[31.0534493,-29.8470469],[31.0669933,-29.8640319],[31.0455459,-29.9502017],[30.9518556,-30.0033946],[30.8651833,-30.1024093],[30.7244725,-30.392502],[30.3556256,-30.9308873],[30.0972364,-31.2458274],[29.8673136,-31.4304296],[29.7409393,-31.5014699],[29.481312,-31.6978686],[28.8943171,-32.2898903],[28.5497137,-32.5894641],[28.1436499,-32.8320732],[28.0748735,-32.941689],[27.8450942,-33.082869],[27.3757956,-33.3860685],[26.8805407,-33.6458951],[26.5916871,-33.7480756],[26.4527308,-33.7935795],[26.206754,-33.7548943],[26.0077897,-33.7223961],[25.8055494,-33.7524272],[25.7511073,-33.8006512],[25.6529079,-33.8543597],[25.6529079,-33.9469768],[25.7195789,-34.0040115],[25.7202807,-34.0511235],[25.5508915,-34.063151],[25.3504571,-34.0502627],[25.2810609,-34.0020322],[25.0476316,-33.9994588],[24.954724,-34.0043594],[24.9496586,-34.1010363],[24.8770358,-34.1506456],[24.8762914,-34.2005281],[24.8532574,-34.2189562],[24.7645287,-34.2017946],[24.5001356,-34.2003254],[24.3486733,-34.1163824],[24.1988819,-34.1019039],[23.9963377,-34.0514443],[23.8017509,-34.0524332],[23.7493589,-34.0111855],[23.4973536,-34.009014],[23.4155191,-34.0434586],[23.4154284,-34.1140433],[22.9000853,-34.0993009],[22.8412418,-34.0547911],[22.6470321,-34.0502627],[22.6459843,-34.0072768],[22.570016,-34.0064081],[22.5050499,-34.0645866],[22.2519968,-34.0645866],[22.2221334,-34.1014701],[22.1621197,-34.1057019],[22.1712431,-34.1521766],[22.1576913,-34.2180897],[22.0015632,-34.2172232],[21.9496952,-34.3220009],[21.8611528,-34.4007145],[21.5614708,-34.4020114],[21.5468011,-34.3661242],[21.501744,-34.3669892],[21.5006961,-34.4020114],[21.4194886,-34.4465247],[21.1978706,-34.4478208],[21.0988193,-34.3991325],[21.0033746,-34.3753872],[20.893192,-34.3997115],[20.8976647,-34.4854003],[20.7446802,-34.4828092],[20.5042011,-34.486264],[20.2527197,-34.701477],[20.0803502,-34.8361855],[19.9923317,-34.8379056],[19.899074,-34.8275845],[19.8938348,-34.7936018],[19.5972963,-34.7961833],[19.3929677,-34.642015],[19.2877095,-34.6404784],[19.2861377,-34.5986563],[19.3474363,-34.5244458],[19.3285256,-34.4534372],[19.098001,-34.449981],[19.0725583,-34.3802371],[19.0023531,-34.3525593],[18.9520568,-34.3949373],[18.7975006,-34.3936403],[18.7984174,-34.1016376],[18.501748,-34.1015292],[18.4999545,-34.3616945],[18.4477325,-34.3620007],[18.4479944,-34.3522691],[18.3974362,-34.3514041],[18.3971742,-34.3022959],[18.3565705,-34.3005647],[18.3479258,-34.2020436],[18.2972095,-34.1950274],[18.2951139,-33.9937138],[18.3374474,-33.9914079],[18.3476638,-33.8492427],[18.3479258,-33.781555],[18.4124718,-33.7448849],[18.3615477,-33.6501624],[18.2992013,-33.585591],[18.2166839,-33.448872],[18.1389858,-33.3974083],[17.9473472,-33.1602647],[17.8855247,-33.0575732],[17.8485884,-32.9668505],[17.8396817,-32.8507302],[17.8396817,-32.7983384]]],"best":true},{"id":"South-Tyrol-Orthofoto2011","name":"South Tyrol Orthofoto 2011","type":"tms","template":"http://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2011_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg","endDate":"2011-01-01T00:00:00.000Z","startDate":"2011-01-01T00:00:00.000Z","scaleExtent":[0,18],"polygon":[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],"terms_url":"http://geoservices.buergernetz.bz.it/geokatalog/","terms_text":"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0"},{"id":"South-Tyrol-Orthofoto2011-20cm","name":"South Tyrol Orthofoto 2011 (highres)","type":"wms","template":"http://geoservices.buergernetz.bz.it/geoserver/ows?SERVICE=WMS&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=P_BZ_OF_2011_EPSG3857,P_BZ_OF_2011_20cm_EPSG3857&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2011-01-01T00:00:00.000Z","startDate":"2011-01-01T00:00:00.000Z","polygon":[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],"terms_url":"http://geoservices.buergernetz.bz.it/geokatalog/","terms_text":"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0","description":"Orthophoto of South Tyrol from 2011 with up to 20cm resolution (larger valleys)"},{"id":"South-Tyrol-Orthofoto-2014-2015","name":"South Tyrol Orthofoto 2014/2015","type":"tms","template":"http://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2014_2015_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg","endDate":"2015-11-01T00:00:00.000Z","startDate":"2014-07-01T00:00:00.000Z","scaleExtent":[0,18],"polygon":[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],"terms_url":"http://geoservices.buergernetz.bz.it/geokatalog/","terms_text":"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 4.0","best":true},{"id":"South-Tyrol-Topomap","name":"South Tyrol Topomap","type":"tms","template":"http://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_BASEMAP_TOPO&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg","scaleExtent":[0,20],"polygon":[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],"terms_url":"http://geoservices.buergernetz.bz.it/geokatalog/","terms_text":"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano","description":"Topographical basemap of South Tyrol"},{"id":"Bern-bern2016-tms","name":"Stadt Bern 10cm (2016)","type":"tms","template":"https://mapproxy.osm.ch/tiles/bern2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2016-01-01T00:00:00.000Z","startDate":"2016-01-01T00:00:00.000Z","scaleExtent":[8,21],"polygon":[[[7.2943145,46.9237564],[7.2982665,46.9274715],[7.3061586,46.9309487],[7.3043338,46.9362344],[7.3068603,46.9403709],[7.3246431,46.9432765],[7.3284525,46.946409],[7.3414051,46.9460797],[7.3438454,46.9473713],[7.3434554,46.9487937],[7.3513567,46.9485481],[7.3505628,46.950213],[7.3530901,46.9519266],[7.3582028,46.9511773],[7.3685031,46.9566244],[7.3715097,46.9607339],[7.37503,46.959835],[7.3785111,46.9614686],[7.3806232,46.9654741],[7.3832097,46.9663014],[7.3937998,46.9669268],[7.4000528,46.9691779],[7.4082922,46.9686857],[7.4281713,46.9738041],[7.4327053,46.972689],[7.4353602,46.9684345],[7.4378522,46.9684302],[7.4412474,46.9767865],[7.4456893,46.9747939],[7.4483835,46.9756393],[7.4477006,46.9790125],[7.4440468,46.9780682],[7.4412738,46.9798224],[7.4506732,46.9901527],[7.4522112,46.9896803],[7.454649,46.9778182],[7.4680382,46.9758258],[7.4707923,46.969998],[7.4701907,46.9674116],[7.4781618,46.9711823],[7.4845237,46.9701571],[7.4861275,46.9679018],[7.4857945,46.9646828],[7.4784708,46.9629043],[7.4802865,46.9606768],[7.4789304,46.9587841],[7.4797786,46.9566019],[7.4770135,46.9544586],[7.4840504,46.9499938],[7.4833925,46.9451977],[7.4955563,46.9396169],[7.4935119,46.9376594],[7.4908036,46.9387617],[7.4894997,46.9368667],[7.4766667,46.9369496],[7.4781093,46.9362489],[7.4746986,46.9339187],[7.4753537,46.9329898],[7.4691047,46.9292427],[7.4707683,46.9255044],[7.4585674,46.934836],[7.4476373,46.9304297],[7.435418,46.9349668],[7.4338022,46.9331237],[7.4376403,46.9307415],[7.4146941,46.9368183],[7.413844,46.9315682],[7.4070798,46.9303824],[7.408065,46.9256296],[7.4021268,46.9241992],[7.4014835,46.9211927],[7.3875736,46.9304506],[7.3823129,46.927282],[7.3800187,46.9298929],[7.3808694,46.9324085],[7.3748669,46.9314306],[7.3748901,46.9327104],[7.368066,46.9323929],[7.3683058,46.930426],[7.3604074,46.9285884],[7.3605592,46.9272018],[7.338783,46.9245357],[7.3393683,46.9196675],[7.3274574,46.9190326],[7.3269178,46.9235974],[7.324374,46.9251891],[7.3082264,46.9222857],[7.2943145,46.9237564]]],"terms_text":"Orthophoto 2016, Vermessungsamt Stadt Bern","best":true},{"id":"Uster-2008","name":"Stadt Uster Orthophoto 2008 10cm","type":"tms","template":"https://mapproxy.osm.ch/tiles/uster/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2008-01-01T00:00:00.000Z","startDate":"2008-01-01T00:00:00.000Z","polygon":[[[8.6,47.31],[8.6,47.39],[8.77,47.39],[8.77,47.31],[8.6,47.31]]],"terms_text":"Stadt Uster Vermessung Orthophoto 2008"},{"id":"Zuerich-zh_luftbild2011-tms","name":"Stadt Zürich Luftbild 2011","type":"tms","template":"https://mapproxy.osm.ch/tiles/zh_luftbild2011/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2011-01-01T00:00:00.000Z","startDate":"2011-01-01T00:00:00.000Z","polygon":[[[8.4441,47.3141],[8.4441,47.4411],[8.6284,47.4411],[8.6284,47.3141],[8.4441,47.3141]]],"terms_text":"Stadt Zürich Luftbild 2011"},{"id":"Zuerich-city_map","name":"Stadtplan Zürich","type":"tms","template":"https://mapproxy.osm.ch/tiles/zh_stadtplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","polygon":[[[8.4482,47.321],[8.4482,47.4339],[8.6248,47.4339],[8.6248,47.321],[8.4482,47.321]]],"terms_text":"Stadt Zürich Open Government Data"},{"id":"stamen-terrain-background","name":"Stamen Terrain","type":"tms","template":"http://{switch:a,b,c,d}.tile.stamen.com/terrain-background/{zoom}/{x}/{y}.jpg","scaleExtent":[4,18],"terms_url":"http://maps.stamen.com/#terrain","terms_text":"Map tiles by Stamen Design, under CC BY 3.0"},{"id":"Stevns_Denmark","name":"Stevns","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.dk/stevns/2009/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"polygon":[[[12.0913942,55.3491574],[12.0943104,55.3842256],[12.1573875,55.3833103],[12.1587287,55.4013326],[12.1903468,55.400558],[12.1931411,55.4364665],[12.2564251,55.4347995],[12.2547073,55.4168882],[12.3822489,55.4134349],[12.3795942,55.3954143],[12.4109213,55.3946958],[12.409403,55.3766417],[12.4407807,55.375779],[12.4394142,55.3578314],[12.4707413,55.3569971],[12.4629475,55.2672214],[12.4315633,55.2681491],[12.430045,55.2502103],[12.3672011,55.2519673],[12.3656858,55.2340267],[12.2714604,55.2366031],[12.2744467,55.272476],[12.2115654,55.2741475],[12.2130078,55.2920322],[12.1815665,55.2928638],[12.183141,55.3107091],[12.2144897,55.3100981],[12.2159927,55.3279764],[12.1214458,55.3303379],[12.1229489,55.3483291],[12.0913942,55.3491574]]],"terms_text":"Stevns Kommune"},{"id":"Surrey-Air_Survey","name":"Surrey Air Survey","type":"tms","template":"https://{switch:a,b,c}.surrey.aerial.openstreetmap.org.uk/layer/gb_surrey_aerial/{zoom}/{x}/{y}.png","endDate":"2009-01-01T00:00:00.000Z","startDate":"2007-01-01T00:00:00.000Z","scaleExtent":[8,21],"polygon":[[[-0.752478,51.0821941],[-0.7595183,51.0856254],[-0.8014342,51.1457917],[-0.8398864,51.1440686],[-0.8357665,51.1802397],[-0.8529549,51.2011266],[-0.8522683,51.2096231],[-0.8495217,51.217903],[-0.8266907,51.2403696],[-0.8120995,51.2469248],[-0.7736474,51.2459577],[-0.7544213,51.2381127],[-0.754078,51.233921],[-0.7446366,51.2333836],[-0.7430693,51.2847178],[-0.751503,51.3069524],[-0.7664376,51.3121032],[-0.7820588,51.3270157],[-0.7815438,51.3388135],[-0.7374268,51.3720456],[-0.7192307,51.3769748],[-0.6795769,51.3847961],[-0.6807786,51.3901523],[-0.6531411,51.3917591],[-0.6301385,51.3905808],[-0.6291085,51.3970074],[-0.6234437,51.3977572],[-0.613144,51.4295552],[-0.6002471,51.4459121],[-0.5867081,51.4445365],[-0.5762368,51.453202],[-0.5626755,51.4523462],[-0.547741,51.4469972],[-0.5372697,51.4448575],[-0.537098,51.4526671],[-0.5439644,51.4545926],[-0.5405312,51.4698865],[-0.5309182,51.4760881],[-0.5091172,51.4744843],[-0.5086022,51.4695657],[-0.4900628,51.4682825],[-0.4526406,51.4606894],[-0.4486924,51.4429316],[-0.4414826,51.4418616],[-0.4418259,51.4369394],[-0.4112702,51.4380095],[-0.4014855,51.4279498],[-0.3807145,51.4262372],[-0.3805428,51.4161749],[-0.3491288,51.4138195],[-0.3274994,51.4037544],[-0.3039818,51.3990424],[-0.3019219,51.3754747],[-0.309475,51.369688],[-0.3111916,51.3529669],[-0.2955704,51.3541462],[-0.2923089,51.3673303],[-0.2850991,51.3680805],[-0.2787476,51.3771891],[-0.2655297,51.3837247],[-0.2411538,51.3847961],[-0.2123147,51.3628288],[-0.2107697,51.3498578],[-0.190857,51.3502867],[-0.1542931,51.3338802],[-0.1496583,51.3057719],[-0.1074296,51.2966491],[-0.0887185,51.3099571],[-0.0878602,51.3220811],[-0.0652009,51.3215448],[-0.0641709,51.3264793],[-0.0519829,51.3263721],[-0.0528412,51.334631],[-0.0330779,51.3430876],[0.0019187,51.3376339],[0.0118751,51.3281956],[0.013935,51.2994398],[0.0202865,51.2994398],[0.0240631,51.3072743],[0.0331611,51.3086694],[0.0455207,51.30545],[0.0523872,51.2877392],[0.0616569,51.2577764],[0.0640602,51.2415518],[0.0462074,51.2126342],[0.0407142,51.2109136],[0.0448341,51.1989753],[0.0494689,51.1997283],[0.0558204,51.1944573],[0.0611419,51.1790713],[0.0623435,51.1542061],[0.0577087,51.1417146],[0.0204582,51.1365447],[-0.0446015,51.1336364],[-0.1566964,51.1352522],[-0.1572114,51.1290043],[-0.2287942,51.1183379],[-0.2473336,51.1183379],[-0.2500802,51.1211394],[-0.299347,51.1137042],[-0.3221779,51.1119799],[-0.3223496,51.1058367],[-0.3596001,51.1019563],[-0.3589135,51.1113333],[-0.3863793,51.1117644],[-0.3869014,51.1062516],[-0.4281001,51.0947174],[-0.4856784,51.0951554],[-0.487135,51.0872266],[-0.5297404,51.0865404],[-0.5302259,51.0789914],[-0.61046,51.076551],[-0.6099745,51.080669],[-0.6577994,51.0792202],[-0.6582849,51.0743394],[-0.6836539,51.0707547],[-0.6997979,51.070831],[-0.7296581,51.0744919],[-0.752478,51.0821941]]]},{"id":"Szeged_2011","name":"Szeged orthophoto 2011","type":"tms","template":"http://e.tile.openstreetmap.hu/szeged-2011-10cm/{zoom}/{x}/{y}.png","endDate":"2011-01-01T00:00:00.000Z","startDate":"2011-01-01T00:00:00.000Z","scaleExtent":[10,22],"polygon":[[[20.1459914,46.2281144],[20.1332261,46.2290431],[20.1258373,46.2298686],[20.122329,46.2309893],[20.1208484,46.2317537],[20.1189709,46.2335126],[20.1131237,46.2413638],[20.1120293,46.2433005],[20.1115733,46.2449996],[20.1111871,46.247092],[20.1112944,46.2487725],[20.1115948,46.2509686],[20.1122171,46.2528047],[20.1129949,46.2542681],[20.1135421,46.2553549],[20.1147705,46.2567977],[20.1352251,46.2768529],[20.1366386,46.2775055],[20.1378939,46.2780301],[20.1393932,46.2783508],[20.1408818,46.2784583],[20.1611494,46.278159],[20.1621093,46.2781579],[20.1635894,46.277702],[20.1661777,46.2761484],[20.1687795,46.2738569],[20.1696108,46.2714413],[20.1695895,46.2704465],[20.1700871,46.2704418],[20.1739897,46.2643295],[20.1766182,46.2582878],[20.1947983,46.25492],[20.1858719,46.2448077],[20.1846595,46.2453122],[20.1780371,46.2383112],[20.1781766,46.2377101],[20.1795258,46.2370961],[20.1725666,46.2300241],[20.1698349,46.2350404],[20.1687701,46.2362946],[20.1670262,46.2378475],[20.1659431,46.2387342],[20.1654408,46.2389988],[20.1654837,46.2389988],[20.1635177,46.2401383],[20.1602051,46.2412003],[20.1592684,46.241531],[20.1592684,46.2415751],[20.1583504,46.2418505],[20.1549473,46.2422869],[20.1510796,46.2351538],[20.1493804,46.232459],[20.1459914,46.2281144]]],"terms_url":"http://www.geo.u-szeged.hu/","terms_text":"SZTE TFGT - University of Szeged","best":true,"description":"Inner part of Szeged"},{"id":"teotonio_vilela","name":"Teotonio Vilela AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Teotonio%20Vilela&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.31163860301,-9.95467712399],[-36.31157895645,-9.94381824983],[-36.31144972224,-9.93197001342],[-36.31127078257,-9.92436145686],[-36.31123101819,-9.91847621012],[-36.31119125382,-9.91637081332],[-36.31140995787,-9.91323717443],[-36.31110178398,-9.90922215583],[-36.3110819018,-9.90317994983],[-36.31099243196,-9.8937883586],[-36.31089302103,-9.88420062824],[-36.31078366901,-9.87412292696],[-36.31068425808,-9.86457379995],[-36.33179913972,-9.86431915278],[-36.34001048258,-9.8643681234],[-36.34780429953,-9.86425059389],[-36.35916696889,-9.86420162324],[-36.37046999169,-9.86404491714],[-36.38447699181,-9.86385882853],[-36.40163531841,-9.86364335739],[-36.40221190181,-9.92250090776],[-36.40249025242,-9.9317741712],[-36.40258966335,-9.94183051783],[-36.40248031132,-9.94803846834],[-36.402659251,-9.95369797972],[-36.38550092439,-9.95384485155],[-36.38282677036,-9.95392318316],[-36.37095710525,-9.95399172331],[-36.36231829539,-9.95422671799],[-36.34746630237,-9.95421692655],[-36.33287277777,-9.9544617125],[-36.32909516241,-9.95455962683],[-36.32089376064,-9.95458900112],[-36.31163860301,-9.95467712399]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"tnris.org","name":"Texas Orthophoto","type":"tms","template":"https://txgi.tnris.org/login/path/ecology-fiona-poem-romeo/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=texas&STYLE=&FORMAT=image/png&tileMatrixSet=0to20&tileMatrix=0to20:{zoom}&tileRow={y}&tileCol={x}","startDate":"2012-01-01T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[-99.9985439,34.5601834],[-95.55654502453,33.99257450647],[-93.89679027134,33.61039304449],[-93.98468089634,32.04103124103],[-93.41613841587,31.02505269211],[-93.74531484297,29.57268254375],[-96.50492070332,28.23158511753],[-97.36942054453,26.95467452634],[-97.04866958924,25.80530249434],[-99.0734177889,26.32559221139],[-100.76599193149,29.02531904433],[-102.3315436893,29.8433892263],[-103.13354564242,28.88112103669],[-104.2887874222,29.28831477845],[-104.7269783935,29.94815782859],[-104.72696778796,30.23535241761],[-106.53450082091,31.78456647831],[-106.75767043939,31.78457253947],[-106.75766067978,32.04385536686],[-106.61848436611,32.04385159755],[-103.11949492759,32.04375683439],[-103.09544343487,36.50045758762],[-103.05798056071,36.54268645422],[-100.00042146824,36.54222227302],[-99.9985439,34.5601834]]],"terms_url":"https://tnris.org/maps-and-data/online-mapping-services/","terms_text":"Texas Natural Resources Information System"},{"id":"tf-landscape","name":"Thunderforest Landscape","type":"tms","template":"https://{switch:a,b,c}.tile.thunderforest.com/landscape/{zoom}/{x}/{y}.png","scaleExtent":[0,22],"terms_url":"http://www.thunderforest.com/terms/","terms_text":"Maps © Thunderforest, Data © OpenStreetMap contributors"},{"id":"US-TIGER-Roads-2017","name":"TIGER Roads 2017","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmapus/cj8dftc3q1ecn2tnx9qhwyj0c/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcHVzIiwiYSI6ImNpcnF4Ym43dDBoOXZmYW04bWhlNWdrY2EifQ.4SFexuTUuKkZeerO3dgtmw","endDate":"2017-01-01T00:00:00.000Z","startDate":"2017-01-01T00:00:00.000Z","scaleExtent":[0,22],"polygon":[[[-124.7617886,48.4130148],[-124.6059492,45.90245],[-124.9934269,40.0557614],[-122.5369737,36.8566086],[-119.9775867,33.0064099],[-117.675935,32.4630223],[-114.8612307,32.4799891],[-111.0089311,31.336015],[-108.1992687,31.3260016],[-108.1871123,31.7755116],[-106.5307225,31.7820947],[-106.4842052,31.7464455],[-106.429317,31.7520583],[-106.2868855,31.5613291],[-106.205248,31.446704],[-105.0205259,30.5360988],[-104.5881916,29.6997856],[-103.2518856,28.8908685],[-102.7173632,29.3920567],[-102.1513983,29.7475702],[-101.2552871,29.4810523],[-100.0062436,28.0082173],[-99.2351068,26.4475962],[-98.0109067,25.9928035],[-97.435024,25.8266009],[-96.9555259,25.9821589],[-96.8061741,27.7978168],[-95.5563349,28.5876066],[-93.7405308,29.4742093],[-90.9028456,28.8564513],[-88.0156706,28.9944338],[-88.0162494,30.0038862],[-86.0277506,30.0047454],[-84.0187909,28.9961781],[-81.9971976,25.9826768],[-81.9966618,25.0134917],[-84.0165592,25.0125783],[-84.0160068,24.0052745],[-80.0199985,24.007096],[-79.8901116,26.8550713],[-80.0245309,32.0161282],[-75.4147385,35.0531894],[-74.0211163,39.5727927],[-72.002019,40.9912464],[-69.8797398,40.9920457],[-69.8489304,43.2619916],[-66.9452845,44.7104937],[-67.7596632,47.0990024],[-69.2505131,47.5122328],[-70.4614886,46.2176574],[-71.412273,45.254878],[-72.0222508,45.0059846],[-75.0798841,44.9802854],[-76.9023061,43.8024568],[-78.7623935,43.6249578],[-79.15798,43.4462589],[-79.0060087,42.8005317],[-82.662475,41.6889458],[-82.1761642,43.588535],[-83.2813977,46.138853],[-87.5064535,48.0142702],[-88.3492194,48.2963271],[-89.4353148,47.9837822],[-93.9981078,49.0067142],[-95.1105379,49.412004],[-96.0131199,49.0060547],[-123.3228926,49.0042878],[-123.2275233,48.1849927],[-124.7617886,48.4130148]],[[-160.5787616,22.5062947],[-160.5782192,21.4984647],[-158.7470604,21.2439843],[-157.5083185,20.995803],[-155.9961942,18.7790194],[-154.6217803,18.7586966],[-154.6890176,19.8805722],[-156.2927622,21.2225888],[-157.5047384,21.9984962],[-159.0093692,22.5070181],[-160.5787616,22.5062947]],[[-167.1572,68.722],[-164.8554,67.0255],[-168.0022,66.0018],[-169.0087,66.0015],[-169.0075,64.9988],[-172.5143,63.8767],[-173.8197,59.7401],[-178.0001,52.2446],[-177.9993,51.2554],[-171.4689,51.8215],[-162.4025,53.9567],[-159.0076,55.0025],[-158.0191,55.0028],[-151.9963,55.9992],[-151.5003,57.9988],[-151.5013,58.992],[-138.516,58.9953],[-138.515,57.9986],[-133.9948,54.0032],[-130.0044,54.0043],[-130.0071,57.0001],[-131.9759,56.9995],[-135.123,59.7566],[-138.0072,59.9918],[-139.1716,60.4127],[-140.9874,61.0119],[-140.9684,69.9535],[-156.1769,71.5633],[-160.4136,70.7398],[-163.0218,69.9707],[-164.9717,68.9947],[-167.1572,68.722]],[[-68.2,17.8],[-64.32,17.38],[-64.64,18.36],[-65.33,18.57],[-67.9,18.67],[-68.2,17.8]],[[146.2,15.4],[145.7,15.6],[144.2,13.2],[144.8,12.9],[146.2,15.4]],[[179.99,52.2],[172,53.5],[172,52.5],[179.99,51],[179.99,52.2]]],"description":"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap","icon":"data:image/png;base64,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","overlay":true},{"id":"tirol.gv.at-contourlines","name":"Tiris: contour lines","type":"wms","template":"https://gis.tirol.gv.at/arcgis/services/Service_Public/terrain/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Hoehenschichtlinien 20m&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","scaleExtent":[15,22],"polygon":[[[10.4399766,47.5976781],[10.4788646,47.5992486],[10.5027725,47.5865589],[10.4837986,47.5597936],[10.513122,47.5434951],[10.5717689,47.5458237],[10.570044,47.5621216],[10.6010923,47.5807415],[10.6390403,47.5691048],[10.7080366,47.5702686],[10.7114864,47.5493166],[10.7684083,47.5504808],[10.7856574,47.5260267],[10.8960515,47.5504808],[10.9357244,47.5236971],[10.9339995,47.5050569],[10.8908768,47.4957344],[10.9512486,47.4910724],[10.9546984,47.4677567],[11.0029958,47.4327637],[10.9909215,47.4082547],[11.1030405,47.4047525],[11.1151148,47.4199271],[11.2099847,47.4455971],[11.2686316,47.4409308],[11.2669067,47.4105894],[11.2945052,47.4420974],[11.3307283,47.4607599],[11.3824755,47.4584275],[11.3704012,47.4759184],[11.4393975,47.5306855],[11.466996,47.5178728],[11.5739403,47.5236971],[11.5756652,47.5586296],[11.598089,47.5912123],[11.6343121,47.6063331],[11.6688102,47.5947021],[11.7930036,47.602844],[11.8395761,47.5923756],[11.8499255,47.6109847],[12.0068922,47.6365615],[12.0362156,47.6249373],[12.0776134,47.6272623],[12.1086617,47.6191242],[12.1949071,47.6226121],[12.1535093,47.6876775],[12.158684,47.7166984],[12.1811078,47.7120562],[12.2190558,47.7248214],[12.2414796,47.7538216],[12.272528,47.7515022],[12.2846023,47.7317829],[12.2656283,47.695805],[12.3363495,47.7108955],[12.3760224,47.695805],[12.4432938,47.7027704],[12.4536433,47.692322],[12.4536433,47.6749032],[12.5105652,47.6319121],[12.5312641,47.6458591],[12.589911,47.6342369],[12.5795615,47.6109847],[12.6658069,47.5947021],[12.6796062,47.5749235],[12.645108,47.5504808],[12.6675318,47.5318501],[12.6847809,47.5038917],[12.7123795,47.4817474],[12.6675318,47.4560949],[12.6416582,47.4595937],[12.6502828,47.443264],[12.6209593,47.4070873],[12.5743868,47.3860701],[12.5502381,47.3965797],[12.4915913,47.3720539],[12.5088403,47.3510227],[12.4881414,47.3206295],[12.4346693,47.322968],[12.4139704,47.3042567],[12.3639481,47.3089351],[12.3122008,47.3276449],[12.2708031,47.298408],[12.177658,47.2937286],[12.1483346,47.2843686],[12.1172863,47.2995778],[12.0983123,47.2750069],[12.1259108,47.2504245],[12.0965874,47.1977096],[12.1103866,47.1484618],[12.141435,47.109735],[12.1379852,47.0897738],[12.1500595,47.0756791],[12.0051672,47.0439523],[11.9206468,47.0298454],[11.8309516,46.9910324],[11.7878289,46.9863258],[11.7740296,46.9674955],[11.7309069,46.9651413],[11.7067582,46.9898558],[11.6429366,46.994562],[11.6118883,47.0051495],[11.5325425,46.9780884],[11.4928696,47.0086782],[11.4445722,46.9674955],[11.4048993,46.9616097],[11.3445276,46.9863258],[11.2030851,46.9569006],[11.1754866,46.9616097],[11.1772115,46.9439484],[11.1461632,46.922747],[11.1254643,46.922747],[11.1082152,46.9038944],[11.1151148,46.8885717],[11.0823416,46.853195],[11.0961408,46.8236966],[11.0512932,46.8024477],[11.0236947,46.762288],[10.9184753,46.7705586],[10.8839772,46.7575613],[10.8408545,46.7729214],[10.8236054,46.7693772],[10.7908322,46.7894581],[10.756334,46.778828],[10.7252857,46.7906391],[10.7477095,46.8272372],[10.6942373,46.8449371],[10.6735384,46.869707],[10.6079919,46.853195],[10.5545198,46.8272372],[10.5200216,46.8390378],[10.4682744,46.8366779],[10.4510253,46.8814982],[10.475174,46.9321709],[10.4130773,46.9557232],[10.3941034,46.9886791],[10.3665048,46.9804421],[10.3389063,46.9474811],[10.3285569,46.9180345],[10.2975085,46.9133215],[10.2595605,46.9251032],[10.2388617,46.8626311],[10.1664155,46.8390378],[10.1353672,46.8472966],[10.1319174,46.8720655],[10.1060438,46.886214],[10.0922445,46.9274592],[10.1250177,46.952191],[10.1457166,47.0004442],[10.1129434,47.0251423],[10.1526163,47.0498291],[10.1301925,47.0627556],[10.1336423,47.0909482],[10.1595159,47.126168],[10.2009137,47.1425959],[10.1922891,47.2000536],[10.2095382,47.2129438],[10.1871144,47.2398857],[10.2009137,47.2562785],[10.1681404,47.2633024],[10.1681404,47.2808581],[10.2026386,47.2913887],[10.2440364,47.2890488],[10.3337316,47.3206295],[10.3889286,47.3907413],[10.4148022,47.3942444],[10.4562,47.436264],[10.4475755,47.4817474],[10.419977,47.5050569],[10.4424008,47.5551374],[10.4130773,47.5714324],[10.4399766,47.5976781]],[[12.401896,47.1601916],[12.3570484,47.1390761],[12.3501488,47.1120829],[12.3104759,47.107387],[12.2552789,47.0721548],[12.2138811,47.0592305],[12.2000818,47.0263181],[12.1448848,47.0310212],[12.1155613,47.007502],[12.1362602,46.9592552],[12.1673086,46.9357044],[12.1431599,46.9109649],[12.1897324,46.9003588],[12.2173309,46.8661692],[12.2552789,46.8838562],[12.2742529,46.8826772],[12.2984016,46.8343179],[12.2759778,46.8201557],[12.2794276,46.7776467],[12.3501488,46.77174],[12.3811972,46.7150029],[12.4432938,46.6842454],[12.5140151,46.6700437],[12.5657623,46.6487342],[12.6295839,46.6534704],[12.70203,46.6534704],[12.7037549,46.6984434],[12.7296285,46.7008093],[12.7227289,46.7374685],[12.8020747,46.7492887],[12.8538219,46.744561],[12.9038442,46.77174],[12.9279929,46.7599247],[12.9573164,46.7764654],[12.9797402,46.7977246],[12.8952197,46.8331378],[12.8952197,46.8484763],[12.8451974,46.8638104],[12.8469223,46.9156781],[12.7968999,46.930993],[12.7882754,46.9474811],[12.7486025,46.9686726],[12.7365282,46.9969149],[12.7813758,47.0416014],[12.7624018,47.0510043],[12.7141044,47.0451277],[12.7106545,47.0780285],[12.6226842,47.126168],[12.5692121,47.1414227],[12.551963,47.1332091],[12.5260894,47.154327],[12.4829667,47.1648828],[12.4605429,47.1484618],[12.4346693,47.1578459],[12.4191451,47.1437691],[12.401896,47.1601916]]],"terms_text":"tiris.tirol.gv.at","icon":"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{"id":"tirol.gv.at-DGM","name":"Tiris: DGM (Terrain model)","type":"wms","template":"https://gis.tirol.gv.at/arcgis/services/Service_Public/terrain/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image Schummerung_Gelaendemodell&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[10.4399766,47.5976781],[10.4788646,47.5992486],[10.5027725,47.5865589],[10.4837986,47.5597936],[10.513122,47.5434951],[10.5717689,47.5458237],[10.570044,47.5621216],[10.6010923,47.5807415],[10.6390403,47.5691048],[10.7080366,47.5702686],[10.7114864,47.5493166],[10.7684083,47.5504808],[10.7856574,47.5260267],[10.8960515,47.5504808],[10.9357244,47.5236971],[10.9339995,47.5050569],[10.8908768,47.4957344],[10.9512486,47.4910724],[10.9546984,47.4677567],[11.0029958,47.4327637],[10.9909215,47.4082547],[11.1030405,47.4047525],[11.1151148,47.4199271],[11.2099847,47.4455971],[11.2686316,47.4409308],[11.2669067,47.4105894],[11.2945052,47.4420974],[11.3307283,47.4607599],[11.3824755,47.4584275],[11.3704012,47.4759184],[11.4393975,47.5306855],[11.466996,47.5178728],[11.5739403,47.5236971],[11.5756652,47.5586296],[11.598089,47.5912123],[11.6343121,47.6063331],[11.6688102,47.5947021],[11.7930036,47.602844],[11.8395761,47.5923756],[11.8499255,47.6109847],[12.0068922,47.6365615],[12.0362156,47.6249373],[12.0776134,47.6272623],[12.1086617,47.6191242],[12.1949071,47.6226121],[12.1535093,47.6876775],[12.158684,47.7166984],[12.1811078,47.7120562],[12.2190558,47.7248214],[12.2414796,47.7538216],[12.272528,47.7515022],[12.2846023,47.7317829],[12.2656283,47.695805],[12.3363495,47.7108955],[12.3760224,47.695805],[12.4432938,47.7027704],[12.4536433,47.692322],[12.4536433,47.6749032],[12.5105652,47.6319121],[12.5312641,47.6458591],[12.589911,47.6342369],[12.5795615,47.6109847],[12.6658069,47.5947021],[12.6796062,47.5749235],[12.645108,47.5504808],[12.6675318,47.5318501],[12.6847809,47.5038917],[12.7123795,47.4817474],[12.6675318,47.4560949],[12.6416582,47.4595937],[12.6502828,47.443264],[12.6209593,47.4070873],[12.5743868,47.3860701],[12.5502381,47.3965797],[12.4915913,47.3720539],[12.5088403,47.3510227],[12.4881414,47.3206295],[12.4346693,47.322968],[12.4139704,47.3042567],[12.3639481,47.3089351],[12.3122008,47.3276449],[12.2708031,47.298408],[12.177658,47.2937286],[12.1483346,47.2843686],[12.1172863,47.2995778],[12.0983123,47.2750069],[12.1259108,47.2504245],[12.0965874,47.1977096],[12.1103866,47.1484618],[12.141435,47.109735],[12.1379852,47.0897738],[12.1500595,47.0756791],[12.0051672,47.0439523],[11.9206468,47.0298454],[11.8309516,46.9910324],[11.7878289,46.9863258],[11.7740296,46.9674955],[11.7309069,46.9651413],[11.7067582,46.9898558],[11.6429366,46.994562],[11.6118883,47.0051495],[11.5325425,46.9780884],[11.4928696,47.0086782],[11.4445722,46.9674955],[11.4048993,46.9616097],[11.3445276,46.9863258],[11.2030851,46.9569006],[11.1754866,46.9616097],[11.1772115,46.9439484],[11.1461632,46.922747],[11.1254643,46.922747],[11.1082152,46.9038944],[11.1151148,46.8885717],[11.0823416,46.853195],[11.0961408,46.8236966],[11.0512932,46.8024477],[11.0236947,46.762288],[10.9184753,46.7705586],[10.8839772,46.7575613],[10.8408545,46.7729214],[10.8236054,46.7693772],[10.7908322,46.7894581],[10.756334,46.778828],[10.7252857,46.7906391],[10.7477095,46.8272372],[10.6942373,46.8449371],[10.6735384,46.869707],[10.6079919,46.853195],[10.5545198,46.8272372],[10.5200216,46.8390378],[10.4682744,46.8366779],[10.4510253,46.8814982],[10.475174,46.9321709],[10.4130773,46.9557232],[10.3941034,46.9886791],[10.3665048,46.9804421],[10.3389063,46.9474811],[10.3285569,46.9180345],[10.2975085,46.9133215],[10.2595605,46.9251032],[10.2388617,46.8626311],[10.1664155,46.8390378],[10.1353672,46.8472966],[10.1319174,46.8720655],[10.1060438,46.886214],[10.0922445,46.9274592],[10.1250177,46.952191],[10.1457166,47.0004442],[10.1129434,47.0251423],[10.1526163,47.0498291],[10.1301925,47.0627556],[10.1336423,47.0909482],[10.1595159,47.126168],[10.2009137,47.1425959],[10.1922891,47.2000536],[10.2095382,47.2129438],[10.1871144,47.2398857],[10.2009137,47.2562785],[10.1681404,47.2633024],[10.1681404,47.2808581],[10.2026386,47.2913887],[10.2440364,47.2890488],[10.3337316,47.3206295],[10.3889286,47.3907413],[10.4148022,47.3942444],[10.4562,47.436264],[10.4475755,47.4817474],[10.419977,47.5050569],[10.4424008,47.5551374],[10.4130773,47.5714324],[10.4399766,47.5976781]],[[12.401896,47.1601916],[12.3570484,47.1390761],[12.3501488,47.1120829],[12.3104759,47.107387],[12.2552789,47.0721548],[12.2138811,47.0592305],[12.2000818,47.0263181],[12.1448848,47.0310212],[12.1155613,47.007502],[12.1362602,46.9592552],[12.1673086,46.9357044],[12.1431599,46.9109649],[12.1897324,46.9003588],[12.2173309,46.8661692],[12.2552789,46.8838562],[12.2742529,46.8826772],[12.2984016,46.8343179],[12.2759778,46.8201557],[12.2794276,46.7776467],[12.3501488,46.77174],[12.3811972,46.7150029],[12.4432938,46.6842454],[12.5140151,46.6700437],[12.5657623,46.6487342],[12.6295839,46.6534704],[12.70203,46.6534704],[12.7037549,46.6984434],[12.7296285,46.7008093],[12.7227289,46.7374685],[12.8020747,46.7492887],[12.8538219,46.744561],[12.9038442,46.77174],[12.9279929,46.7599247],[12.9573164,46.7764654],[12.9797402,46.7977246],[12.8952197,46.8331378],[12.8952197,46.8484763],[12.8451974,46.8638104],[12.8469223,46.9156781],[12.7968999,46.930993],[12.7882754,46.9474811],[12.7486025,46.9686726],[12.7365282,46.9969149],[12.7813758,47.0416014],[12.7624018,47.0510043],[12.7141044,47.0451277],[12.7106545,47.0780285],[12.6226842,47.126168],[12.5692121,47.1414227],[12.551963,47.1332091],[12.5260894,47.154327],[12.4829667,47.1648828],[12.4605429,47.1484618],[12.4346693,47.1578459],[12.4191451,47.1437691],[12.401896,47.1601916]]],"terms_text":"tiris.tirol.gv.at","icon":"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{"id":"tirol.gv.at-DOM","name":"Tiris: DOM (Surface model)","type":"wms","template":"https://gis.tirol.gv.at/arcgis/services/Service_Public/terrain/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image Schummerung_Oberflaechenmodell&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[10.4399766,47.5976781],[10.4788646,47.5992486],[10.5027725,47.5865589],[10.4837986,47.5597936],[10.513122,47.5434951],[10.5717689,47.5458237],[10.570044,47.5621216],[10.6010923,47.5807415],[10.6390403,47.5691048],[10.7080366,47.5702686],[10.7114864,47.5493166],[10.7684083,47.5504808],[10.7856574,47.5260267],[10.8960515,47.5504808],[10.9357244,47.5236971],[10.9339995,47.5050569],[10.8908768,47.4957344],[10.9512486,47.4910724],[10.9546984,47.4677567],[11.0029958,47.4327637],[10.9909215,47.4082547],[11.1030405,47.4047525],[11.1151148,47.4199271],[11.2099847,47.4455971],[11.2686316,47.4409308],[11.2669067,47.4105894],[11.2945052,47.4420974],[11.3307283,47.4607599],[11.3824755,47.4584275],[11.3704012,47.4759184],[11.4393975,47.5306855],[11.466996,47.5178728],[11.5739403,47.5236971],[11.5756652,47.5586296],[11.598089,47.5912123],[11.6343121,47.6063331],[11.6688102,47.5947021],[11.7930036,47.602844],[11.8395761,47.5923756],[11.8499255,47.6109847],[12.0068922,47.6365615],[12.0362156,47.6249373],[12.0776134,47.6272623],[12.1086617,47.6191242],[12.1949071,47.6226121],[12.1535093,47.6876775],[12.158684,47.7166984],[12.1811078,47.7120562],[12.2190558,47.7248214],[12.2414796,47.7538216],[12.272528,47.7515022],[12.2846023,47.7317829],[12.2656283,47.695805],[12.3363495,47.7108955],[12.3760224,47.695805],[12.4432938,47.7027704],[12.4536433,47.692322],[12.4536433,47.6749032],[12.5105652,47.6319121],[12.5312641,47.6458591],[12.589911,47.6342369],[12.5795615,47.6109847],[12.6658069,47.5947021],[12.6796062,47.5749235],[12.645108,47.5504808],[12.6675318,47.5318501],[12.6847809,47.5038917],[12.7123795,47.4817474],[12.6675318,47.4560949],[12.6416582,47.4595937],[12.6502828,47.443264],[12.6209593,47.4070873],[12.5743868,47.3860701],[12.5502381,47.3965797],[12.4915913,47.3720539],[12.5088403,47.3510227],[12.4881414,47.3206295],[12.4346693,47.322968],[12.4139704,47.3042567],[12.3639481,47.3089351],[12.3122008,47.3276449],[12.2708031,47.298408],[12.177658,47.2937286],[12.1483346,47.2843686],[12.1172863,47.2995778],[12.0983123,47.2750069],[12.1259108,47.2504245],[12.0965874,47.1977096],[12.1103866,47.1484618],[12.141435,47.109735],[12.1379852,47.0897738],[12.1500595,47.0756791],[12.0051672,47.0439523],[11.9206468,47.0298454],[11.8309516,46.9910324],[11.7878289,46.9863258],[11.7740296,46.9674955],[11.7309069,46.9651413],[11.7067582,46.9898558],[11.6429366,46.994562],[11.6118883,47.0051495],[11.5325425,46.9780884],[11.4928696,47.0086782],[11.4445722,46.9674955],[11.4048993,46.9616097],[11.3445276,46.9863258],[11.2030851,46.9569006],[11.1754866,46.9616097],[11.1772115,46.9439484],[11.1461632,46.922747],[11.1254643,46.922747],[11.1082152,46.9038944],[11.1151148,46.8885717],[11.0823416,46.853195],[11.0961408,46.8236966],[11.0512932,46.8024477],[11.0236947,46.762288],[10.9184753,46.7705586],[10.8839772,46.7575613],[10.8408545,46.7729214],[10.8236054,46.7693772],[10.7908322,46.7894581],[10.756334,46.778828],[10.7252857,46.7906391],[10.7477095,46.8272372],[10.6942373,46.8449371],[10.6735384,46.869707],[10.6079919,46.853195],[10.5545198,46.8272372],[10.5200216,46.8390378],[10.4682744,46.8366779],[10.4510253,46.8814982],[10.475174,46.9321709],[10.4130773,46.9557232],[10.3941034,46.9886791],[10.3665048,46.9804421],[10.3389063,46.9474811],[10.3285569,46.9180345],[10.2975085,46.9133215],[10.2595605,46.9251032],[10.2388617,46.8626311],[10.1664155,46.8390378],[10.1353672,46.8472966],[10.1319174,46.8720655],[10.1060438,46.886214],[10.0922445,46.9274592],[10.1250177,46.952191],[10.1457166,47.0004442],[10.1129434,47.0251423],[10.1526163,47.0498291],[10.1301925,47.0627556],[10.1336423,47.0909482],[10.1595159,47.126168],[10.2009137,47.1425959],[10.1922891,47.2000536],[10.2095382,47.2129438],[10.1871144,47.2398857],[10.2009137,47.2562785],[10.1681404,47.2633024],[10.1681404,47.2808581],[10.2026386,47.2913887],[10.2440364,47.2890488],[10.3337316,47.3206295],[10.3889286,47.3907413],[10.4148022,47.3942444],[10.4562,47.436264],[10.4475755,47.4817474],[10.419977,47.5050569],[10.4424008,47.5551374],[10.4130773,47.5714324],[10.4399766,47.5976781]],[[12.401896,47.1601916],[12.3570484,47.1390761],[12.3501488,47.1120829],[12.3104759,47.107387],[12.2552789,47.0721548],[12.2138811,47.0592305],[12.2000818,47.0263181],[12.1448848,47.0310212],[12.1155613,47.007502],[12.1362602,46.9592552],[12.1673086,46.9357044],[12.1431599,46.9109649],[12.1897324,46.9003588],[12.2173309,46.8661692],[12.2552789,46.8838562],[12.2742529,46.8826772],[12.2984016,46.8343179],[12.2759778,46.8201557],[12.2794276,46.7776467],[12.3501488,46.77174],[12.3811972,46.7150029],[12.4432938,46.6842454],[12.5140151,46.6700437],[12.5657623,46.6487342],[12.6295839,46.6534704],[12.70203,46.6534704],[12.7037549,46.6984434],[12.7296285,46.7008093],[12.7227289,46.7374685],[12.8020747,46.7492887],[12.8538219,46.744561],[12.9038442,46.77174],[12.9279929,46.7599247],[12.9573164,46.7764654],[12.9797402,46.7977246],[12.8952197,46.8331378],[12.8952197,46.8484763],[12.8451974,46.8638104],[12.8469223,46.9156781],[12.7968999,46.930993],[12.7882754,46.9474811],[12.7486025,46.9686726],[12.7365282,46.9969149],[12.7813758,47.0416014],[12.7624018,47.0510043],[12.7141044,47.0451277],[12.7106545,47.0780285],[12.6226842,47.126168],[12.5692121,47.1414227],[12.551963,47.1332091],[12.5260894,47.154327],[12.4829667,47.1648828],[12.4605429,47.1484618],[12.4346693,47.1578459],[12.4191451,47.1437691],[12.401896,47.1601916]]],"terms_text":"tiris.tirol.gv.at","icon":"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{"id":"tirol.gv.at-orthofoto","name":"Tiris: orthophoto","type":"wms","template":"https://gis.tirol.gv.at/arcgis/services/Service_Public/orthofoto/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image_Aktuell_RGB&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[10.4399766,47.5976781],[10.4788646,47.5992486],[10.5027725,47.5865589],[10.4837986,47.5597936],[10.513122,47.5434951],[10.5717689,47.5458237],[10.570044,47.5621216],[10.6010923,47.5807415],[10.6390403,47.5691048],[10.7080366,47.5702686],[10.7114864,47.5493166],[10.7684083,47.5504808],[10.7856574,47.5260267],[10.8960515,47.5504808],[10.9357244,47.5236971],[10.9339995,47.5050569],[10.8908768,47.4957344],[10.9512486,47.4910724],[10.9546984,47.4677567],[11.0029958,47.4327637],[10.9909215,47.4082547],[11.1030405,47.4047525],[11.1151148,47.4199271],[11.2099847,47.4455971],[11.2686316,47.4409308],[11.2669067,47.4105894],[11.2945052,47.4420974],[11.3307283,47.4607599],[11.3824755,47.4584275],[11.3704012,47.4759184],[11.4393975,47.5306855],[11.466996,47.5178728],[11.5739403,47.5236971],[11.5756652,47.5586296],[11.598089,47.5912123],[11.6343121,47.6063331],[11.6688102,47.5947021],[11.7930036,47.602844],[11.8395761,47.5923756],[11.8499255,47.6109847],[12.0068922,47.6365615],[12.0362156,47.6249373],[12.0776134,47.6272623],[12.1086617,47.6191242],[12.1949071,47.6226121],[12.1535093,47.6876775],[12.158684,47.7166984],[12.1811078,47.7120562],[12.2190558,47.7248214],[12.2414796,47.7538216],[12.272528,47.7515022],[12.2846023,47.7317829],[12.2656283,47.695805],[12.3363495,47.7108955],[12.3760224,47.695805],[12.4432938,47.7027704],[12.4536433,47.692322],[12.4536433,47.6749032],[12.5105652,47.6319121],[12.5312641,47.6458591],[12.589911,47.6342369],[12.5795615,47.6109847],[12.6658069,47.5947021],[12.6796062,47.5749235],[12.645108,47.5504808],[12.6675318,47.5318501],[12.6847809,47.5038917],[12.7123795,47.4817474],[12.6675318,47.4560949],[12.6416582,47.4595937],[12.6502828,47.443264],[12.6209593,47.4070873],[12.5743868,47.3860701],[12.5502381,47.3965797],[12.4915913,47.3720539],[12.5088403,47.3510227],[12.4881414,47.3206295],[12.4346693,47.322968],[12.4139704,47.3042567],[12.3639481,47.3089351],[12.3122008,47.3276449],[12.2708031,47.298408],[12.177658,47.2937286],[12.1483346,47.2843686],[12.1172863,47.2995778],[12.0983123,47.2750069],[12.1259108,47.2504245],[12.0965874,47.1977096],[12.1103866,47.1484618],[12.141435,47.109735],[12.1379852,47.0897738],[12.1500595,47.0756791],[12.0051672,47.0439523],[11.9206468,47.0298454],[11.8309516,46.9910324],[11.7878289,46.9863258],[11.7740296,46.9674955],[11.7309069,46.9651413],[11.7067582,46.9898558],[11.6429366,46.994562],[11.6118883,47.0051495],[11.5325425,46.9780884],[11.4928696,47.0086782],[11.4445722,46.9674955],[11.4048993,46.9616097],[11.3445276,46.9863258],[11.2030851,46.9569006],[11.1754866,46.9616097],[11.1772115,46.9439484],[11.1461632,46.922747],[11.1254643,46.922747],[11.1082152,46.9038944],[11.1151148,46.8885717],[11.0823416,46.853195],[11.0961408,46.8236966],[11.0512932,46.8024477],[11.0236947,46.762288],[10.9184753,46.7705586],[10.8839772,46.7575613],[10.8408545,46.7729214],[10.8236054,46.7693772],[10.7908322,46.7894581],[10.756334,46.778828],[10.7252857,46.7906391],[10.7477095,46.8272372],[10.6942373,46.8449371],[10.6735384,46.869707],[10.6079919,46.853195],[10.5545198,46.8272372],[10.5200216,46.8390378],[10.4682744,46.8366779],[10.4510253,46.8814982],[10.475174,46.9321709],[10.4130773,46.9557232],[10.3941034,46.9886791],[10.3665048,46.9804421],[10.3389063,46.9474811],[10.3285569,46.9180345],[10.2975085,46.9133215],[10.2595605,46.9251032],[10.2388617,46.8626311],[10.1664155,46.8390378],[10.1353672,46.8472966],[10.1319174,46.8720655],[10.1060438,46.886214],[10.0922445,46.9274592],[10.1250177,46.952191],[10.1457166,47.0004442],[10.1129434,47.0251423],[10.1526163,47.0498291],[10.1301925,47.0627556],[10.1336423,47.0909482],[10.1595159,47.126168],[10.2009137,47.1425959],[10.1922891,47.2000536],[10.2095382,47.2129438],[10.1871144,47.2398857],[10.2009137,47.2562785],[10.1681404,47.2633024],[10.1681404,47.2808581],[10.2026386,47.2913887],[10.2440364,47.2890488],[10.3337316,47.3206295],[10.3889286,47.3907413],[10.4148022,47.3942444],[10.4562,47.436264],[10.4475755,47.4817474],[10.419977,47.5050569],[10.4424008,47.5551374],[10.4130773,47.5714324],[10.4399766,47.5976781]],[[12.401896,47.1601916],[12.3570484,47.1390761],[12.3501488,47.1120829],[12.3104759,47.107387],[12.2552789,47.0721548],[12.2138811,47.0592305],[12.2000818,47.0263181],[12.1448848,47.0310212],[12.1155613,47.007502],[12.1362602,46.9592552],[12.1673086,46.9357044],[12.1431599,46.9109649],[12.1897324,46.9003588],[12.2173309,46.8661692],[12.2552789,46.8838562],[12.2742529,46.8826772],[12.2984016,46.8343179],[12.2759778,46.8201557],[12.2794276,46.7776467],[12.3501488,46.77174],[12.3811972,46.7150029],[12.4432938,46.6842454],[12.5140151,46.6700437],[12.5657623,46.6487342],[12.6295839,46.6534704],[12.70203,46.6534704],[12.7037549,46.6984434],[12.7296285,46.7008093],[12.7227289,46.7374685],[12.8020747,46.7492887],[12.8538219,46.744561],[12.9038442,46.77174],[12.9279929,46.7599247],[12.9573164,46.7764654],[12.9797402,46.7977246],[12.8952197,46.8331378],[12.8952197,46.8484763],[12.8451974,46.8638104],[12.8469223,46.9156781],[12.7968999,46.930993],[12.7882754,46.9474811],[12.7486025,46.9686726],[12.7365282,46.9969149],[12.7813758,47.0416014],[12.7624018,47.0510043],[12.7141044,47.0451277],[12.7106545,47.0780285],[12.6226842,47.126168],[12.5692121,47.1414227],[12.551963,47.1332091],[12.5260894,47.154327],[12.4829667,47.1648828],[12.4605429,47.1484618],[12.4346693,47.1578459],[12.4191451,47.1437691],[12.401896,47.1601916]]],"terms_text":"tiris.tirol.gv.at","icon":"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{"id":"tirol.gv.at-orthofoto-cir","name":"Tiris: orthophoto infrared","type":"wms","template":"https://gis.tirol.gv.at/arcgis/services/Service_Public/orthofoto/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image_Aktuell_CIR&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[10.4399766,47.5976781],[10.4788646,47.5992486],[10.5027725,47.5865589],[10.4837986,47.5597936],[10.513122,47.5434951],[10.5717689,47.5458237],[10.570044,47.5621216],[10.6010923,47.5807415],[10.6390403,47.5691048],[10.7080366,47.5702686],[10.7114864,47.5493166],[10.7684083,47.5504808],[10.7856574,47.5260267],[10.8960515,47.5504808],[10.9357244,47.5236971],[10.9339995,47.5050569],[10.8908768,47.4957344],[10.9512486,47.4910724],[10.9546984,47.4677567],[11.0029958,47.4327637],[10.9909215,47.4082547],[11.1030405,47.4047525],[11.1151148,47.4199271],[11.2099847,47.4455971],[11.2686316,47.4409308],[11.2669067,47.4105894],[11.2945052,47.4420974],[11.3307283,47.4607599],[11.3824755,47.4584275],[11.3704012,47.4759184],[11.4393975,47.5306855],[11.466996,47.5178728],[11.5739403,47.5236971],[11.5756652,47.5586296],[11.598089,47.5912123],[11.6343121,47.6063331],[11.6688102,47.5947021],[11.7930036,47.602844],[11.8395761,47.5923756],[11.8499255,47.6109847],[12.0068922,47.6365615],[12.0362156,47.6249373],[12.0776134,47.6272623],[12.1086617,47.6191242],[12.1949071,47.6226121],[12.1535093,47.6876775],[12.158684,47.7166984],[12.1811078,47.7120562],[12.2190558,47.7248214],[12.2414796,47.7538216],[12.272528,47.7515022],[12.2846023,47.7317829],[12.2656283,47.695805],[12.3363495,47.7108955],[12.3760224,47.695805],[12.4432938,47.7027704],[12.4536433,47.692322],[12.4536433,47.6749032],[12.5105652,47.6319121],[12.5312641,47.6458591],[12.589911,47.6342369],[12.5795615,47.6109847],[12.6658069,47.5947021],[12.6796062,47.5749235],[12.645108,47.5504808],[12.6675318,47.5318501],[12.6847809,47.5038917],[12.7123795,47.4817474],[12.6675318,47.4560949],[12.6416582,47.4595937],[12.6502828,47.443264],[12.6209593,47.4070873],[12.5743868,47.3860701],[12.5502381,47.3965797],[12.4915913,47.3720539],[12.5088403,47.3510227],[12.4881414,47.3206295],[12.4346693,47.322968],[12.4139704,47.3042567],[12.3639481,47.3089351],[12.3122008,47.3276449],[12.2708031,47.298408],[12.177658,47.2937286],[12.1483346,47.2843686],[12.1172863,47.2995778],[12.0983123,47.2750069],[12.1259108,47.2504245],[12.0965874,47.1977096],[12.1103866,47.1484618],[12.141435,47.109735],[12.1379852,47.0897738],[12.1500595,47.0756791],[12.0051672,47.0439523],[11.9206468,47.0298454],[11.8309516,46.9910324],[11.7878289,46.9863258],[11.7740296,46.9674955],[11.7309069,46.9651413],[11.7067582,46.9898558],[11.6429366,46.994562],[11.6118883,47.0051495],[11.5325425,46.9780884],[11.4928696,47.0086782],[11.4445722,46.9674955],[11.4048993,46.9616097],[11.3445276,46.9863258],[11.2030851,46.9569006],[11.1754866,46.9616097],[11.1772115,46.9439484],[11.1461632,46.922747],[11.1254643,46.922747],[11.1082152,46.9038944],[11.1151148,46.8885717],[11.0823416,46.853195],[11.0961408,46.8236966],[11.0512932,46.8024477],[11.0236947,46.762288],[10.9184753,46.7705586],[10.8839772,46.7575613],[10.8408545,46.7729214],[10.8236054,46.7693772],[10.7908322,46.7894581],[10.756334,46.778828],[10.7252857,46.7906391],[10.7477095,46.8272372],[10.6942373,46.8449371],[10.6735384,46.869707],[10.6079919,46.853195],[10.5545198,46.8272372],[10.5200216,46.8390378],[10.4682744,46.8366779],[10.4510253,46.8814982],[10.475174,46.9321709],[10.4130773,46.9557232],[10.3941034,46.9886791],[10.3665048,46.9804421],[10.3389063,46.9474811],[10.3285569,46.9180345],[10.2975085,46.9133215],[10.2595605,46.9251032],[10.2388617,46.8626311],[10.1664155,46.8390378],[10.1353672,46.8472966],[10.1319174,46.8720655],[10.1060438,46.886214],[10.0922445,46.9274592],[10.1250177,46.952191],[10.1457166,47.0004442],[10.1129434,47.0251423],[10.1526163,47.0498291],[10.1301925,47.0627556],[10.1336423,47.0909482],[10.1595159,47.126168],[10.2009137,47.1425959],[10.1922891,47.2000536],[10.2095382,47.2129438],[10.1871144,47.2398857],[10.2009137,47.2562785],[10.1681404,47.2633024],[10.1681404,47.2808581],[10.2026386,47.2913887],[10.2440364,47.2890488],[10.3337316,47.3206295],[10.3889286,47.3907413],[10.4148022,47.3942444],[10.4562,47.436264],[10.4475755,47.4817474],[10.419977,47.5050569],[10.4424008,47.5551374],[10.4130773,47.5714324],[10.4399766,47.5976781]],[[12.401896,47.1601916],[12.3570484,47.1390761],[12.3501488,47.1120829],[12.3104759,47.107387],[12.2552789,47.0721548],[12.2138811,47.0592305],[12.2000818,47.0263181],[12.1448848,47.0310212],[12.1155613,47.007502],[12.1362602,46.9592552],[12.1673086,46.9357044],[12.1431599,46.9109649],[12.1897324,46.9003588],[12.2173309,46.8661692],[12.2552789,46.8838562],[12.2742529,46.8826772],[12.2984016,46.8343179],[12.2759778,46.8201557],[12.2794276,46.7776467],[12.3501488,46.77174],[12.3811972,46.7150029],[12.4432938,46.6842454],[12.5140151,46.6700437],[12.5657623,46.6487342],[12.6295839,46.6534704],[12.70203,46.6534704],[12.7037549,46.6984434],[12.7296285,46.7008093],[12.7227289,46.7374685],[12.8020747,46.7492887],[12.8538219,46.744561],[12.9038442,46.77174],[12.9279929,46.7599247],[12.9573164,46.7764654],[12.9797402,46.7977246],[12.8952197,46.8331378],[12.8952197,46.8484763],[12.8451974,46.8638104],[12.8469223,46.9156781],[12.7968999,46.930993],[12.7882754,46.9474811],[12.7486025,46.9686726],[12.7365282,46.9969149],[12.7813758,47.0416014],[12.7624018,47.0510043],[12.7141044,47.0451277],[12.7106545,47.0780285],[12.6226842,47.126168],[12.5692121,47.1414227],[12.551963,47.1332091],[12.5260894,47.154327],[12.4829667,47.1648828],[12.4605429,47.1484618],[12.4346693,47.1578459],[12.4191451,47.1437691],[12.401896,47.1601916]]],"terms_text":"tiris.tirol.gv.at","icon":"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{"id":"lu.geoportail.opendata.topo","name":"Topographical Map geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/topo/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png","endDate":"2010-07-20T00:00:00.000Z","startDate":"2013-07-19T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/cartes-topographiques-services-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"Torokbalint-orthophoto-2013","name":"Törökbálint orthophoto 2013","type":"wms","template":"http://terkep.torokbalint.hu/mapproxy/service?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ORTO_2013_5CM_2013SZEPT_TAKARASSAL_512_512&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true","projection":"EPSG:3857","startDate":"2013-09-01T00:00:00.000Z","polygon":[[[18.9173064,47.4085354],[18.9169121,47.4084901],[18.9160618,47.4088477],[18.9156514,47.4090528],[18.9145812,47.4093813],[18.913849,47.4097008],[18.9137605,47.4097607],[18.9131436,47.4103815],[18.9122048,47.4109805],[18.9104104,47.4117465],[18.9093161,47.4125778],[18.9084095,47.4131731],[18.9067599,47.4144328],[18.90481,47.4156797],[18.9036191,47.4159737],[18.9031738,47.4161643],[18.9006203,47.417422],[18.9004192,47.4175527],[18.8996789,47.4179738],[18.8988796,47.4181843],[18.898142,47.4183495],[18.897517,47.4185509],[18.896656,47.4190083],[18.8958004,47.4195436],[18.8942072,47.4205001],[18.8905513,47.4220862],[18.8874319,47.4233166],[18.8855383,47.4242421],[18.8843554,47.4247611],[18.8818851,47.4255287],[18.8808498,47.4259805],[18.8801014,47.4262872],[18.879557,47.4264922],[18.8774098,47.4273787],[18.8760151,47.4278868],[18.8750763,47.4283585],[18.8728072,47.4293384],[18.8716377,47.4296795],[18.8713963,47.4300061],[18.8725872,47.4323032],[18.8727321,47.4327822],[18.8727374,47.4332431],[18.872437,47.4348216],[18.8720562,47.4352642],[18.8689126,47.4371221],[18.8656135,47.4374994],[18.864664,47.4377353],[18.8640364,47.4380909],[18.8637762,47.4379113],[18.8634034,47.4378423],[18.8630037,47.437982],[18.8519503,47.4471521],[18.8521703,47.4484689],[18.8592969,47.4538685],[18.8583876,47.4551181],[18.857768,47.4556839],[18.8571779,47.4559977],[18.8571967,47.456355],[18.860151,47.4583903],[18.8619415,47.4594978],[18.8609867,47.4607128],[18.8597904,47.4620076],[18.8592862,47.4623594],[18.8585941,47.4627221],[18.8571297,47.4633313],[18.8563411,47.4636033],[18.8562821,47.4640277],[18.857194,47.4652825],[18.8566254,47.4655073],[18.8565288,47.4658047],[18.8569285,47.4665563],[18.8583635,47.4695253],[18.8582641,47.4698029],[18.8582669,47.4699079],[18.8583834,47.4701931],[18.8584438,47.4702729],[18.8585189,47.4703264],[18.8586221,47.4703609],[18.8587348,47.4703763],[18.8589011,47.4703609],[18.8614614,47.469732],[18.8627677,47.469286],[18.8661674,47.4678491],[18.8679403,47.4665581],[18.8699654,47.4652435],[18.8708009,47.4645698],[18.8726784,47.4633259],[18.8753606,47.4611281],[18.8768734,47.4592711],[18.8894261,47.4598659],[18.8902415,47.4598804],[18.9037116,47.4553357],[18.9042733,47.455203],[18.9049332,47.4550579],[18.9054213,47.4551014],[18.9056735,47.4550543],[18.9062877,47.4547659],[18.9064835,47.4545301],[18.9065968,47.4544712],[18.9067819,47.454395],[18.9081149,47.4539888],[18.9083731,47.4539507],[18.9089048,47.4538437],[18.9095419,47.4536959],[18.9132587,47.4531717],[18.9135296,47.4532043],[18.9137201,47.4531717],[18.9138649,47.4530738],[18.9143117,47.4529381],[18.9159773,47.4529961],[18.9180668,47.4531666],[18.9184637,47.4529997],[18.9190324,47.4516141],[18.9217253,47.4508015],[18.9224602,47.450689],[18.9241768,47.4502537],[18.9275564,47.4498946],[18.9297237,47.4495064],[18.9322127,47.4492199],[18.9334694,47.4493242],[18.9392093,47.4493532],[18.9422885,47.4490339],[18.945491,47.4488961],[18.9482617,47.4487002],[18.9500347,47.4482413],[18.954699,47.4472183],[18.9574899,47.4469162],[18.958025,47.4471475],[18.9584434,47.4470822],[18.9587666,47.4466623],[18.9614488,47.4393046],[18.9636804,47.4357995],[18.9659764,47.432882],[18.9689912,47.4296958],[18.9701003,47.4270366],[18.9700922,47.4267935],[18.9669541,47.424605],[18.9573531,47.4184193],[18.9567603,47.4184012],[18.9560576,47.418129],[18.9538513,47.4173936],[18.9514447,47.4166549],[18.9513133,47.4166426],[18.9326981,47.4170333],[18.9325733,47.4169625],[18.9320101,47.4167393],[18.9314857,47.4163972],[18.9311357,47.4161158],[18.9212291,47.4109106],[18.9195742,47.4098705],[18.9192684,47.4096109],[18.9173064,47.4085354]]],"terms_url":"http://www.torokbalint.hu/","terms_text":"Törökbálint","description":"5 cm resolution bald image"},{"id":"Torokbalint-orthophoto-2015","name":"Törökbálint orthophoto 2015","type":"wms","template":"http://terkep.torokbalint.hu/mapproxy/service?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=TBORTO_2015_20160218&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true","projection":"EPSG:3857","startDate":"2015-01-01T00:00:00.000Z","polygon":[[[18.9173064,47.4085354],[18.9169121,47.4084901],[18.9160618,47.4088477],[18.9156514,47.4090528],[18.9145812,47.4093813],[18.913849,47.4097008],[18.9137605,47.4097607],[18.9131436,47.4103815],[18.9122048,47.4109805],[18.9104104,47.4117465],[18.9093161,47.4125778],[18.9084095,47.4131731],[18.9067599,47.4144328],[18.90481,47.4156797],[18.9036191,47.4159737],[18.9031738,47.4161643],[18.9006203,47.417422],[18.9004192,47.4175527],[18.8996789,47.4179738],[18.8988796,47.4181843],[18.898142,47.4183495],[18.897517,47.4185509],[18.896656,47.4190083],[18.8958004,47.4195436],[18.8942072,47.4205001],[18.8905513,47.4220862],[18.8874319,47.4233166],[18.8855383,47.4242421],[18.8843554,47.4247611],[18.8818851,47.4255287],[18.8808498,47.4259805],[18.8801014,47.4262872],[18.879557,47.4264922],[18.8774098,47.4273787],[18.8760151,47.4278868],[18.8750763,47.4283585],[18.8728072,47.4293384],[18.8716377,47.4296795],[18.8713963,47.4300061],[18.8725872,47.4323032],[18.8727321,47.4327822],[18.8727374,47.4332431],[18.872437,47.4348216],[18.8720562,47.4352642],[18.8689126,47.4371221],[18.8656135,47.4374994],[18.864664,47.4377353],[18.8640364,47.4380909],[18.8637762,47.4379113],[18.8634034,47.4378423],[18.8630037,47.437982],[18.8519503,47.4471521],[18.8521703,47.4484689],[18.8592969,47.4538685],[18.8583876,47.4551181],[18.857768,47.4556839],[18.8571779,47.4559977],[18.8571967,47.456355],[18.860151,47.4583903],[18.8619415,47.4594978],[18.8609867,47.4607128],[18.8597904,47.4620076],[18.8592862,47.4623594],[18.8585941,47.4627221],[18.8571297,47.4633313],[18.8563411,47.4636033],[18.8562821,47.4640277],[18.857194,47.4652825],[18.8566254,47.4655073],[18.8565288,47.4658047],[18.8569285,47.4665563],[18.8583635,47.4695253],[18.8582641,47.4698029],[18.8582669,47.4699079],[18.8583834,47.4701931],[18.8584438,47.4702729],[18.8585189,47.4703264],[18.8586221,47.4703609],[18.8587348,47.4703763],[18.8589011,47.4703609],[18.8614614,47.469732],[18.8627677,47.469286],[18.8661674,47.4678491],[18.8679403,47.4665581],[18.8699654,47.4652435],[18.8708009,47.4645698],[18.8726784,47.4633259],[18.8753606,47.4611281],[18.8768734,47.4592711],[18.8894261,47.4598659],[18.8902415,47.4598804],[18.9037116,47.4553357],[18.9042733,47.455203],[18.9049332,47.4550579],[18.9054213,47.4551014],[18.9056735,47.4550543],[18.9062877,47.4547659],[18.9064835,47.4545301],[18.9065968,47.4544712],[18.9067819,47.454395],[18.9081149,47.4539888],[18.9083731,47.4539507],[18.9089048,47.4538437],[18.9095419,47.4536959],[18.9132587,47.4531717],[18.9135296,47.4532043],[18.9137201,47.4531717],[18.9138649,47.4530738],[18.9143117,47.4529381],[18.9159773,47.4529961],[18.9180668,47.4531666],[18.9184637,47.4529997],[18.9190324,47.4516141],[18.9217253,47.4508015],[18.9224602,47.450689],[18.9241768,47.4502537],[18.9275564,47.4498946],[18.9297237,47.4495064],[18.9322127,47.4492199],[18.9334694,47.4493242],[18.9392093,47.4493532],[18.9422885,47.4490339],[18.945491,47.4488961],[18.9482617,47.4487002],[18.9500347,47.4482413],[18.954699,47.4472183],[18.9574899,47.4469162],[18.958025,47.4471475],[18.9584434,47.4470822],[18.9587666,47.4466623],[18.9614488,47.4393046],[18.9636804,47.4357995],[18.9659764,47.432882],[18.9689912,47.4296958],[18.9701003,47.4270366],[18.9700922,47.4267935],[18.9669541,47.424605],[18.9573531,47.4184193],[18.9567603,47.4184012],[18.9560576,47.418129],[18.9538513,47.4173936],[18.9514447,47.4166549],[18.9513133,47.4166426],[18.9326981,47.4170333],[18.9325733,47.4169625],[18.9320101,47.4167393],[18.9314857,47.4163972],[18.9311357,47.4161158],[18.9212291,47.4109106],[18.9195742,47.4098705],[18.9192684,47.4096109],[18.9173064,47.4085354]]],"terms_url":"http://fototerkep.hu/","terms_text":"Fototerkep.hu","best":true,"description":"5 cm resolution bald image"},{"id":"Toulouse-Orthophotoplan-2007","name":"Toulouse - Orthophotoplan 2007","type":"wms","template":"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2007&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2007-01-01T00:00:00.000Z","startDate":"2007-01-01T00:00:00.000Z","scaleExtent":[0,22],"polygon":[[[1.1919978,43.6328791],[1.2015377,43.6329729],[1.2011107,43.6554932],[1.2227985,43.6557029],[1.2226231,43.6653353],[1.2275341,43.6653849],[1.2275417,43.6656387],[1.2337568,43.6656883],[1.2337644,43.6650153],[1.2351218,43.6650319],[1.2350913,43.6670729],[1.2443566,43.6671556],[1.2441584,43.6743925],[1.2493973,43.6744256],[1.2493973,43.6746628],[1.2555666,43.6747234],[1.2555742,43.6744532],[1.2569545,43.6744697],[1.2568782,43.678529],[1.2874873,43.6788257],[1.2870803,43.7013229],[1.3088219,43.7014632],[1.3086493,43.7127673],[1.3303262,43.7129544],[1.3300242,43.7305221],[1.3367106,43.7305845],[1.3367322,43.7312235],[1.3734338,43.7310456],[1.3735848,43.7245772],[1.4604504,43.7252947],[1.4607783,43.7028034],[1.4824875,43.7029516],[1.4829828,43.6692071],[1.5046832,43.6693616],[1.5048383,43.6581174],[1.5265475,43.6582656],[1.5266945,43.6470298],[1.548368,43.6471633],[1.5485357,43.6359385],[1.5702172,43.636082],[1.5705123,43.6135777],[1.5488166,43.6134276],[1.549097,43.5909479],[1.5707695,43.5910694],[1.5709373,43.5798341],[1.5793714,43.5798894],[1.5794782,43.5737682],[1.5809119,43.5737792],[1.5810859,43.5573794],[1.5712334,43.5573131],[1.5716504,43.5235497],[1.3984804,43.5222618],[1.3986509,43.5110113],[1.3120959,43.5102543],[1.3118968,43.5215192],[1.2902569,43.5213126],[1.2898637,43.5438168],[1.311517,43.5440133],[1.3113271,43.5552596],[1.3036924,43.5551924],[1.3036117,43.5595099],[1.2955449,43.5594317],[1.2955449,43.5595489],[1.2895595,43.5594473],[1.2892899,43.5775366],[1.2675698,43.5773647],[1.2673973,43.5886141],[1.25355,43.5885047],[1.2533774,43.5956282],[1.2518029,43.5956282],[1.2518029,43.5949409],[1.2350437,43.5947847],[1.2350437,43.5945972],[1.2239572,43.5945972],[1.2239357,43.5994708],[1.2139708,43.599299],[1.2138845,43.6046408],[1.2020647,43.6044846],[1.2019464,43.61048],[1.1924294,43.6103695],[1.1919978,43.6328791]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData","terms_text":"ToulouseMetropole"},{"id":"Toulouse-Orthophotoplan-2011","name":"Toulouse - Orthophotoplan 2011","type":"wms","template":"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2011&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2011-01-01T00:00:00.000Z","startDate":"2011-01-01T00:00:00.000Z","scaleExtent":[0,22],"polygon":[[[1.1135067,43.6867566],[1.1351836,43.6870842],[1.1348907,43.6983471],[1.1782867,43.6990338],[1.1779903,43.7102786],[1.1996591,43.7106144],[1.1993387,43.7218722],[1.2427356,43.7225269],[1.2424336,43.7337491],[1.2641536,43.734092],[1.2638301,43.7453588],[1.2855285,43.7456548],[1.2852481,43.756935],[1.306925,43.757231],[1.3066446,43.7684779],[1.3283431,43.7687894],[1.3280842,43.780034],[1.4367275,43.7815757],[1.4373098,43.7591004],[1.4590083,43.7593653],[1.4593318,43.7481479],[1.4810303,43.7483972],[1.4813322,43.7371777],[1.5030307,43.7374115],[1.5035915,43.7149664],[1.5253115,43.7151846],[1.5256135,43.7040057],[1.5472688,43.7042552],[1.5475708,43.6930431],[1.5692045,43.6932926],[1.5695712,43.6820316],[1.5912049,43.6822656],[1.5917441,43.6597998],[1.613421,43.6600339],[1.613723,43.6488291],[1.6353783,43.6490788],[1.6384146,43.5140731],[1.2921649,43.5094658],[1.2918629,43.5206966],[1.2702076,43.5203994],[1.2698841,43.5316437],[1.2482288,43.531331],[1.2476048,43.5537788],[1.2259628,43.5534914],[1.2256819,43.564716],[1.2039835,43.564419],[1.2033148,43.5869049],[1.1816164,43.5865611],[1.1810237,43.6090368],[1.1592821,43.6086932],[1.1589585,43.6199523],[1.1372601,43.6196244],[1.1365933,43.642094],[1.1149055,43.6417629],[1.1135067,43.6867566]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData","terms_text":"ToulouseMetropole"},{"id":"Toulouse-Orthophotoplan-2013","name":"Toulouse - Orthophotoplan 2013","type":"wms","template":"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2013&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2013-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[0,22],"polygon":[[[1.1135067,43.6867566],[1.1351836,43.6870842],[1.1348907,43.6983471],[1.1782867,43.6990338],[1.1779903,43.7102786],[1.1996591,43.7106144],[1.1993387,43.7218722],[1.2427356,43.7225269],[1.2424336,43.7337491],[1.2641536,43.734092],[1.2638301,43.7453588],[1.2855285,43.7456548],[1.2852481,43.756935],[1.306925,43.757231],[1.3066446,43.7684779],[1.3283431,43.7687894],[1.3280842,43.780034],[1.4367275,43.7815757],[1.4373098,43.7591004],[1.4590083,43.7593653],[1.4593318,43.7481479],[1.4810303,43.7483972],[1.4813322,43.7371777],[1.5030307,43.7374115],[1.5035915,43.7149664],[1.5253115,43.7151846],[1.5256135,43.7040057],[1.5472688,43.7042552],[1.5475708,43.6930431],[1.5692045,43.6932926],[1.5695712,43.6820316],[1.5912049,43.6822656],[1.5917441,43.6597998],[1.613421,43.6600339],[1.613723,43.6488291],[1.6353783,43.6490788],[1.6384146,43.5140731],[1.2921649,43.5094658],[1.2918629,43.5206966],[1.2702076,43.5203994],[1.2698841,43.5316437],[1.2482288,43.531331],[1.2476048,43.5537788],[1.2259628,43.5534914],[1.2256819,43.564716],[1.2039835,43.564419],[1.2033148,43.5869049],[1.1816164,43.5865611],[1.1810237,43.6090368],[1.1592821,43.6086932],[1.1589585,43.6199523],[1.1372601,43.6196244],[1.1365933,43.642094],[1.1149055,43.6417629],[1.1135067,43.6867566]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData","terms_text":"ToulouseMetropole"},{"id":"Toulouse-Orthophotoplan-2015","name":"Toulouse - Orthophotoplan 2015","type":"wms","template":"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2015&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2015-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[0,22],"polygon":[[[1.1135067,43.6867566],[1.1351836,43.6870842],[1.1348907,43.6983471],[1.1782867,43.6990338],[1.1779903,43.7102786],[1.1996591,43.7106144],[1.1993387,43.7218722],[1.2427356,43.7225269],[1.2424336,43.7337491],[1.2641536,43.734092],[1.2638301,43.7453588],[1.2855285,43.7456548],[1.2852481,43.756935],[1.306925,43.757231],[1.3066446,43.7684779],[1.3283431,43.7687894],[1.3280842,43.780034],[1.4367275,43.7815757],[1.4373098,43.7591004],[1.4590083,43.7593653],[1.4593318,43.7481479],[1.4810303,43.7483972],[1.4813322,43.7371777],[1.5030307,43.7374115],[1.5035915,43.7149664],[1.5253115,43.7151846],[1.5256135,43.7040057],[1.5472688,43.7042552],[1.5475708,43.6930431],[1.5692045,43.6932926],[1.5695712,43.6820316],[1.5912049,43.6822656],[1.5917441,43.6597998],[1.613421,43.6600339],[1.613723,43.6488291],[1.6353783,43.6490788],[1.6384146,43.5140731],[1.2921649,43.5094658],[1.2918629,43.5206966],[1.2702076,43.5203994],[1.2698841,43.5316437],[1.2482288,43.531331],[1.2476048,43.5537788],[1.2259628,43.5534914],[1.2256819,43.564716],[1.2039835,43.564419],[1.2033148,43.5869049],[1.1816164,43.5865611],[1.1810237,43.6090368],[1.1592821,43.6086932],[1.1589585,43.6199523],[1.1372601,43.6196244],[1.1365933,43.642094],[1.1149055,43.6417629],[1.1135067,43.6867566]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData","terms_text":"ToulouseMetropole"},{"id":"Tours-Orthophoto-2008_2010","name":"Tours - Orthophotos 2008-2010","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/tours/{zoom}/{x}/{y}","endDate":"2011-01-01T00:00:00.000Z","startDate":"2008-01-01T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[0.5457462,47.465264],[0.54585,47.4608163],[0.5392188,47.4606983],[0.5393484,47.456243],[0.5327959,47.4561003],[0.5329011,47.451565],[0.52619,47.4514013],[0.5265854,47.4424884],[0.5000941,47.4420739],[0.5002357,47.4375835],[0.4936014,47.4374324],[0.4937,47.4329285],[0.4606141,47.4324593],[0.4607248,47.4279827],[0.4541016,47.4278125],[0.454932,47.4053921],[0.4615431,47.4054476],[0.4619097,47.3964924],[0.4684346,47.3966005],[0.4691319,47.3786415],[0.4757125,47.3787609],[0.4762116,47.3652018],[0.4828297,47.3653499],[0.4829611,47.3608321],[0.4763543,47.360743],[0.476654,47.3517263],[0.4700497,47.3516186],[0.4701971,47.3471313],[0.4637503,47.3470104],[0.4571425,47.3424146],[0.4572922,47.3379061],[0.4506741,47.3378081],[0.4508379,47.3333051],[0.4442212,47.3332032],[0.4443809,47.328711],[0.4311392,47.3284977],[0.4316262,47.3150004],[0.4382432,47.3151136],[0.4383815,47.3106174],[0.4714487,47.3111374],[0.4713096,47.3156565],[0.477888,47.3157542],[0.4780733,47.3112802],[0.4846826,47.3113639],[0.4848576,47.3068686],[0.4914359,47.3069803],[0.491745,47.2979733],[0.4851578,47.2978722],[0.4854269,47.2888744],[0.4788485,47.2887697],[0.4791574,47.2797818],[0.4857769,47.2799005],[0.4859107,47.2753885],[0.492539,47.2755029],[0.4926669,47.2710127],[0.4992986,47.2711066],[0.4994296,47.2666116],[0.5192658,47.2669245],[0.5194225,47.2624231],[0.5260186,47.2625205],[0.5258735,47.2670183],[0.5456972,47.2673383],[0.5455537,47.2718283],[0.5587737,47.2720366],[0.5586259,47.2765185],[0.5652252,47.2766278],[0.5650848,47.2811206],[0.5716753,47.2812285],[0.5715223,47.2857217],[0.5781436,47.2858299],[0.5779914,47.2903294],[0.5846023,47.2904263],[0.5843076,47.2994231],[0.597499,47.2996094],[0.5976637,47.2951375],[0.6571596,47.2960036],[0.6572988,47.2915091],[0.6705019,47.2917186],[0.6703475,47.2962082],[0.6836175,47.2963688],[0.6834322,47.3008929],[0.690062,47.3009558],[0.6899241,47.3054703],[0.7362019,47.3061157],[0.7360848,47.3106063],[0.7559022,47.3108935],[0.7557718,47.315392],[0.7623755,47.3154716],[0.7622314,47.3199941],[0.7754911,47.3201546],[0.77497,47.3388218],[0.7745786,47.351628],[0.7680363,47.3515901],[0.767589,47.3605298],[0.7742443,47.3606238],[0.7733465,47.3921266],[0.7667434,47.3920195],[0.7664411,47.4010837],[0.7730647,47.4011115],[0.7728868,47.4101297],[0.7661849,47.4100226],[0.7660267,47.4145044],[0.7527613,47.4143038],[0.7529788,47.4098086],[0.7462373,47.4097016],[0.7459424,47.4232208],[0.7392324,47.4231451],[0.738869,47.4366116],[0.7323267,47.4365171],[0.7321869,47.4410556],[0.7255048,47.44098],[0.7254209,47.4453479],[0.7318793,47.4454803],[0.7318514,47.4501126],[0.7384496,47.450226],[0.7383098,47.454631],[0.7449359,47.4547444],[0.7443209,47.4771985],[0.7310685,47.4769717],[0.7309008,47.4815445],[0.7176205,47.4812611],[0.7177883,47.4768394],[0.69777,47.4764993],[0.6980496,47.4719827],[0.6914514,47.4718882],[0.6917309,47.4630241],[0.6851048,47.4629295],[0.684937,47.4673524],[0.678255,47.4673335],[0.6779754,47.4762158],[0.6714051,47.4761592],[0.6710417,47.4881952],[0.6577334,47.4879685],[0.6578173,47.48504],[0.6511911,47.4848322],[0.6514707,47.4758568],[0.6448166,47.4757245],[0.6449284,47.4712646],[0.6117976,47.4707543],[0.6118815,47.4663129],[0.6052833,47.4661239],[0.6054231,47.4616631],[0.5988808,47.4615497],[0.5990206,47.4570886],[0.572488,47.4566916],[0.5721805,47.4656513],[0.5457462,47.465264]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Tours/Orthophoto","terms_text":"Orthophoto Tour(s) Plus 2008"},{"id":"Tours-Orthophoto-2013","name":"Tours - Orthophotos 2013","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/tours_2013/{zoom}/{x}/{y}","endDate":"2013-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[0,22],"polygon":[[[0.7751199,47.3298327],[0.7742685,47.356166],[0.7705338,47.3561106],[0.7702424,47.3651192],[0.7739772,47.3651747],[0.7728024,47.4014836],[0.7903977,47.4014691],[0.7898827,47.4102988],[0.7911702,47.410473],[0.7910844,47.4194174],[0.7939168,47.4194174],[0.7931872,47.4373306],[0.7983371,47.4374177],[0.7980796,47.4554408],[0.8004399,47.4554118],[0.8013841,47.4642615],[0.8007403,47.4689904],[0.7939597,47.4733127],[0.7840463,47.4732257],[0.7838746,47.4787079],[0.776064,47.4785919],[0.7758494,47.4820434],[0.7706567,47.4821884],[0.7704421,47.4859006],[0.7609578,47.4909176],[0.7571813,47.4909176],[0.737526,47.5033563],[0.725896,47.5058785],[0.7111331,47.5057626],[0.7041808,47.5040811],[0.6910916,47.5003846],[0.6904479,47.4971808],[0.6775733,47.4968329],[0.6775733,47.4935273],[0.6642695,47.4930054],[0.6634971,47.4895256],[0.6508799,47.4895836],[0.6513306,47.4803177],[0.6473394,47.4803032],[0.6474682,47.4785194],[0.6447431,47.4784614],[0.644786,47.4757493],[0.6423827,47.4757783],[0.642254,47.4730226],[0.6383487,47.4729356],[0.6379195,47.4713111],[0.6051322,47.470789],[0.6051322,47.4663213],[0.5985232,47.4660312],[0.5987807,47.4615632],[0.5920001,47.4615632],[0.5922576,47.4597643],[0.5808421,47.4597062],[0.5800696,47.4614471],[0.5723449,47.4613891],[0.5722161,47.4651173],[0.5587407,47.4648852],[0.5465957,47.4605187],[0.5326911,47.4535546],[0.5267688,47.4531483],[0.5267688,47.4515233],[0.5223056,47.4512331],[0.5225631,47.4480407],[0.5197736,47.447765],[0.520074,47.4424682],[0.4975005,47.4415975],[0.4971572,47.4404945],[0.4935523,47.4401462],[0.4935523,47.435734],[0.4794331,47.4357485],[0.4617091,47.428186],[0.4564305,47.4208838],[0.4548856,47.4122882],[0.4550572,47.4021807],[0.4614945,47.4019338],[0.4616662,47.3964145],[0.4687901,47.3960224],[0.4701634,47.3517307],[0.4567738,47.3514981],[0.4572888,47.3425422],[0.430853,47.3419606],[0.431958,47.3060196],[0.4715367,47.3067035],[0.4725667,47.2800414],[0.4852696,47.2800414],[0.4857846,47.2708404],[0.4993459,47.2710734],[0.4991742,47.2624533],[0.5527326,47.2630358],[0.5522176,47.2720052],[0.5656072,47.2722381],[0.5652638,47.2815553],[0.5911847,47.2815553],[0.5906697,47.2909873],[0.669119,47.2916859],[0.6831952,47.2956444],[0.6831952,47.3007668],[0.6965848,47.3012324],[0.6964131,47.3023965],[0.7100602,47.3024547],[0.7229348,47.3058887],[0.722849,47.3104281],[0.7416459,47.3108355],[0.754263,47.3139197],[0.7625028,47.318153],[0.7620736,47.3201313],[0.7661935,47.3200877],[0.7695623,47.3220659],[0.7723304,47.3250768],[0.7733603,47.3266985],[0.7751199,47.3298327]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Tours/Orthophoto","terms_text":"Orthophoto Tour(s)plus 2013"},{"id":"US_Forest_Service_roads","name":"U.S. Forest Service roads","type":"tms","template":"https://osm.cycle.travel/forest/{zoom}/{x}/{y}.png","scaleExtent":[0,19],"polygon":[[[-124.7617886,48.4130148],[-124.6059492,45.90245],[-124.9934269,40.0557614],[-122.5369737,36.8566086],[-119.9775867,33.0064099],[-117.675935,32.4630223],[-114.8612307,32.4799891],[-111.0089311,31.336015],[-108.1992687,31.3260016],[-108.1871123,31.7755116],[-106.5307225,31.7820947],[-106.4842052,31.7464455],[-106.429317,31.7520583],[-106.2868855,31.5613291],[-106.205248,31.446704],[-105.0205259,30.5360988],[-104.5881916,29.6997856],[-103.2518856,28.8908685],[-102.7173632,29.3920567],[-102.1513983,29.7475702],[-101.2552871,29.4810523],[-100.0062436,28.0082173],[-99.2351068,26.4475962],[-98.0109067,25.9928035],[-97.435024,25.8266009],[-96.9555259,25.9821589],[-96.8061741,27.7978168],[-95.5563349,28.5876066],[-93.7405308,29.4742093],[-90.9028456,28.8564513],[-88.0156706,28.9944338],[-88.0162494,30.0038862],[-86.0277506,30.0047454],[-84.0187909,28.9961781],[-81.9971976,25.9826768],[-81.9966618,25.0134917],[-84.0165592,25.0125783],[-84.0160068,24.0052745],[-80.0199985,24.007096],[-79.8901116,26.8550713],[-80.0245309,32.0161282],[-75.4147385,35.0531894],[-74.0211163,39.5727927],[-72.002019,40.9912464],[-69.8797398,40.9920457],[-69.8489304,43.2619916],[-66.9452845,44.7104937],[-67.7596632,47.0990024],[-69.2505131,47.5122328],[-70.4614886,46.2176574],[-71.412273,45.254878],[-72.0222508,45.0059846],[-75.0798841,44.9802854],[-76.9023061,43.8024568],[-78.7623935,43.6249578],[-79.15798,43.4462589],[-79.0060087,42.8005317],[-82.662475,41.6889458],[-82.1761642,43.588535],[-83.2813977,46.138853],[-87.5064535,48.0142702],[-88.3492194,48.2963271],[-89.4353148,47.9837822],[-93.9981078,49.0067142],[-95.1105379,49.412004],[-96.0131199,49.0060547],[-123.3228926,49.0042878],[-123.2275233,48.1849927],[-124.7617886,48.4130148]],[[-160.5787616,22.5062947],[-160.5782192,21.4984647],[-158.7470604,21.2439843],[-157.5083185,20.995803],[-155.9961942,18.7790194],[-154.6217803,18.7586966],[-154.6890176,19.8805722],[-156.2927622,21.2225888],[-157.5047384,21.9984962],[-159.0093692,22.5070181],[-160.5787616,22.5062947]],[[-167.1571546,68.721974],[-164.8553982,67.0255078],[-168.002195,66.0017503],[-169.0087448,66.001546],[-169.0075381,64.9987675],[-172.5143281,63.8767267],[-173.8197023,59.74014],[-162.5018149,58.0005815],[-160.0159024,58.0012389],[-160.0149725,57.000035],[-160.5054788,56.9999017],[-165.8092575,54.824847],[-178.000097,52.2446469],[-177.9992996,51.2554252],[-171.4689067,51.8215329],[-162.40251,53.956664],[-159.0075717,55.002502],[-158.0190709,55.0027849],[-151.9963213,55.9991902],[-151.500341,57.9987853],[-151.5012894,58.9919816],[-138.5159989,58.9953194],[-138.5150471,57.9986434],[-133.9948193,54.0031685],[-130.0044418,54.0043387],[-130.0070826,57.0000507],[-131.975877,56.9995156],[-135.1229873,59.756601],[-138.0071813,59.991805],[-139.1715881,60.4127229],[-140.9874011,61.0118551],[-140.9683975,69.9535069],[-156.176891,71.5633329],[-160.413634,70.7397728],[-163.0218273,69.9707435],[-164.9717003,68.994689],[-167.1571546,68.721974]]]},{"id":"Zuerich-zh_uebersichtsplan-tms","name":"Übersichtsplan Zürich","type":"tms","template":"https://mapproxy.osm.ch/tiles/zh_uebersichtsplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[0,21],"polygon":[[[8.4482,47.321],[8.4482,47.4339],[8.6248,47.4339],[8.6248,47.321],[8.4482,47.321]]],"terms_text":"Stadt Zürich Open Government Data"},{"id":"uniao_dos_palmares","name":"União dos Palmares AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Uniao%20dos%20Palmares&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-35.97724708197,-9.20751562713],[-35.97719915169,-9.19398393291],[-35.97694352353,-9.19052995603],[-35.97678375594,-9.18606654789],[-35.97702340733,-9.18207624495],[-35.97703938409,-9.17967888719],[-35.97681570946,-9.17734460222],[-35.9766399651,-9.17516802537],[-35.97700743057,-9.17518379771],[-35.97695950029,-9.17070442381],[-35.97673582566,-9.17065710618],[-35.97660801158,-9.16644581169],[-35.97617663907,-9.16221869434],[-35.97609675527,-9.1602628469],[-35.97660801158,-9.1602628469],[-35.9767198489,-9.14608263113],[-35.97654410454,-9.1412243182],[-35.97665594186,-9.13319533758],[-35.97652812778,-9.12183772804],[-35.9764801975,-9.11748388185],[-35.98617809061,-9.11754698145],[-35.9894693031,-9.1173261328],[-36.00560583036,-9.1173261328],[-36.01859493596,-9.11735768262],[-36.04601105553,-9.11721570843],[-36.06734002967,-9.11697908465],[-36.0675637043,-9.16133540973],[-36.06770749514,-9.16404834833],[-36.06745186698,-9.164079894],[-36.0675637043,-9.16657199353],[-36.06777140218,-9.16654044807],[-36.06797910005,-9.20701095785],[-36.04979754756,-9.2071055834],[-36.04671403295,-9.206979416],[-36.02941120224,-9.20708981247],[-36.0135462799,-9.207184438],[-35.99317591134,-9.20732637623],[-35.97724708197,-9.20751562713]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"UrbISOrtho2016","name":"UrbIS-Ortho 2016","type":"wms","template":"https://geoservices-urbis.irisnet.be/geoserver/ows/?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2016&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}","projection":"EPSG:3857","endDate":"2017-01-01T00:00:00.000Z","startDate":"2016-01-01T00:00:00.000Z","polygon":[[[4.3797288,50.7638205],[4.3891701,50.7637662],[4.430283,50.7751656],[4.4350037,50.7750028],[4.464272,50.7864537],[4.4816956,50.7913372],[4.4823823,50.7961658],[4.459208,50.8062556],[4.4594655,50.8166144],[4.4797215,50.8203559],[4.4695935,50.8353735],[4.4689927,50.8457258],[4.4623837,50.8539626],[4.4496808,50.8559133],[4.4459901,50.8599226],[4.4253049,50.8661526],[4.431828,50.8762815],[4.4400677,50.8784478],[4.4310555,50.8901441],[4.4359479,50.8950167],[4.4295964,50.9010255],[4.4165501,50.9075748],[4.4154343,50.9134197],[4.3957791,50.914069],[4.3846211,50.9109303],[4.3811879,50.9031907],[4.3726048,50.9003218],[4.3621335,50.9032989],[4.3485722,50.9034072],[4.3402467,50.9041108],[4.328917,50.902487],[4.3164716,50.8960453],[4.3063435,50.8927429],[4.2900357,50.8898192],[4.2914948,50.8849461],[4.2955289,50.8826176],[4.2956147,50.8809389],[4.2827401,50.8722735],[4.2769894,50.8671277],[4.2780194,50.8591099],[4.2804227,50.8572136],[4.2809376,50.8421489],[4.2719254,50.8403603],[4.2546735,50.8369455],[4.2510686,50.83288],[4.2522702,50.8269708],[4.2434296,50.82182],[4.2440305,50.8154755],[4.2551884,50.8150959],[4.2580209,50.8093472],[4.2721829,50.8101065],[4.2757878,50.8069607],[4.2854008,50.8050623],[4.2890057,50.8069065],[4.298018,50.8059302],[4.3028245,50.7970881],[4.3145833,50.7945382],[4.3162141,50.7862367],[4.3295178,50.7738087],[4.3420491,50.7716375],[4.3452248,50.7733745],[4.3785271,50.7681092],[4.3797288,50.7638205]]],"terms_text":"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAACXBIWXMAAAsSAAALEgHS3X78AAACnUlEQVQoz11SXUiTYRh93ndz06YMNWcpRmWRSpgO+0EUDYwQ6sZ+oAyti8y6yCyKxOimILqQsLKbukmHSpFFLYlMqSkUmi3/pjZ/Zmv+Tec2bU237z1dfFHSc/HcPOc5HM45DAAREREgGOM217BpzDjs7PEHfNGa2PT47KxN+RFqrYDgjBMRE0JijBMRAKOlzmgxhChDN0cla1ThM0uTE65vsRFxRRkXk3TpMiMBkEQQQFPvw0LDnoYvVStBNwAhBIApj+X6m5OlT/dbnX0AJCHxkbl+zhTWub6XA4ZDqcd3JJTl1to7HV7G2E3TxOU2zaWcKm1YZKO5RlaliNknBma6Bqe7V6SVc5mVrmVFxSvLu1G3bSlwy2jVaXE6IzE0JLzV+jxJlxYTvp5X5j3Qx2ePzPcn6VJVysiUaHXX+d2zy8HqlrE8/bq3xXoiStalr1Fpxl1DRMQ547s27NWGRikVKtmuju9e34pEYcrhWV/f7E8iUinDQrjaH/AREQfAmSJGEzc6P0Qkvbd5ymt7DqfEmEr0Tre/4PFXInK4R7z+hXjtRiIi2aKPtpbi+qxue6vHj5ou+8KvAIBPP7yG3mkAd9sry18ULPrdAAgQAIJS4EZLacXrwqVlDwBJiKAkJCEB+Gz/UNyQ1TxY/8dWIiYgFFx5JPXM7JLjWe8jIgKBM3DGXT5no7lmy9rteVsLiIjJGXPGBcQ2XdqBlKJWa1PHeLOCcRAEhKH7zuKy+4T+QohCDQhGjLBqJBGsNl0teZI3OGMG0GiuKarPNI0aZTEyhq0qHxhjXv/C7bYyASkjIddoqctPOnY07ezf5hHRvwcikg+TXtv9jmsOjy0n8eCpnVeIESMiecnE/6kC0D/Vea+90h/wARAQqwG/AaEjsUbwLtXdAAAAAElFTkSuQmCC"},{"id":"UrbISOrtho2017","name":"UrbIS-Ortho 2017","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/Urbis:Ortho2017/https://geoservices-urbis.irisnet.be/geoserver/ows","endDate":"2018-01-01T00:00:00.000Z","startDate":"2017-01-01T00:00:00.000Z","polygon":[[[4.3797288,50.7638205],[4.3891701,50.7637662],[4.430283,50.7751656],[4.4350037,50.7750028],[4.464272,50.7864537],[4.4816956,50.7913372],[4.4823823,50.7961658],[4.459208,50.8062556],[4.4594655,50.8166144],[4.4797215,50.8203559],[4.4695935,50.8353735],[4.4689927,50.8457258],[4.4623837,50.8539626],[4.4496808,50.8559133],[4.4459901,50.8599226],[4.4253049,50.8661526],[4.431828,50.8762815],[4.4400677,50.8784478],[4.4310555,50.8901441],[4.4359479,50.8950167],[4.4295964,50.9010255],[4.4165501,50.9075748],[4.4154343,50.9134197],[4.3957791,50.914069],[4.3846211,50.9109303],[4.3811879,50.9031907],[4.3726048,50.9003218],[4.3621335,50.9032989],[4.3485722,50.9034072],[4.3402467,50.9041108],[4.328917,50.902487],[4.3164716,50.8960453],[4.3063435,50.8927429],[4.2900357,50.8898192],[4.2914948,50.8849461],[4.2955289,50.8826176],[4.2956147,50.8809389],[4.2827401,50.8722735],[4.2769894,50.8671277],[4.2780194,50.8591099],[4.2804227,50.8572136],[4.2809376,50.8421489],[4.2719254,50.8403603],[4.2546735,50.8369455],[4.2510686,50.83288],[4.2522702,50.8269708],[4.2434296,50.82182],[4.2440305,50.8154755],[4.2551884,50.8150959],[4.2580209,50.8093472],[4.2721829,50.8101065],[4.2757878,50.8069607],[4.2854008,50.8050623],[4.2890057,50.8069065],[4.298018,50.8059302],[4.3028245,50.7970881],[4.3145833,50.7945382],[4.3162141,50.7862367],[4.3295178,50.7738087],[4.3420491,50.7716375],[4.3452248,50.7733745],[4.3785271,50.7681092],[4.3797288,50.7638205]]],"terms_text":"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB","best":true,"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAACXBIWXMAAAsSAAALEgHS3X78AAACnUlEQVQoz11SXUiTYRh93ndz06YMNWcpRmWRSpgO+0EUDYwQ6sZ+oAyti8y6yCyKxOimILqQsLKbukmHSpFFLYlMqSkUmi3/pjZ/Zmv+Tec2bU237z1dfFHSc/HcPOc5HM45DAAREREgGOM217BpzDjs7PEHfNGa2PT47KxN+RFqrYDgjBMRE0JijBMRAKOlzmgxhChDN0cla1ThM0uTE65vsRFxRRkXk3TpMiMBkEQQQFPvw0LDnoYvVStBNwAhBIApj+X6m5OlT/dbnX0AJCHxkbl+zhTWub6XA4ZDqcd3JJTl1to7HV7G2E3TxOU2zaWcKm1YZKO5RlaliNknBma6Bqe7V6SVc5mVrmVFxSvLu1G3bSlwy2jVaXE6IzE0JLzV+jxJlxYTvp5X5j3Qx2ePzPcn6VJVysiUaHXX+d2zy8HqlrE8/bq3xXoiStalr1Fpxl1DRMQ547s27NWGRikVKtmuju9e34pEYcrhWV/f7E8iUinDQrjaH/AREQfAmSJGEzc6P0Qkvbd5ymt7DqfEmEr0Tre/4PFXInK4R7z+hXjtRiIi2aKPtpbi+qxue6vHj5ou+8KvAIBPP7yG3mkAd9sry18ULPrdAAgQAIJS4EZLacXrwqVlDwBJiKAkJCEB+Gz/UNyQ1TxY/8dWIiYgFFx5JPXM7JLjWe8jIgKBM3DGXT5no7lmy9rteVsLiIjJGXPGBcQ2XdqBlKJWa1PHeLOCcRAEhKH7zuKy+4T+QohCDQhGjLBqJBGsNl0teZI3OGMG0GiuKarPNI0aZTEyhq0qHxhjXv/C7bYyASkjIddoqctPOnY07ezf5hHRvwcikg+TXtv9jmsOjy0n8eCpnVeIESMiecnE/6kC0D/Vea+90h/wARAQqwG/AaEjsUbwLtXdAAAAAElFTkSuQmCC"},{"id":"UrbisAdmFR","name":"UrbisAdm FR","type":"wms","template":"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=urbisFR&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[4.3797288,50.7638205],[4.3891701,50.7637662],[4.430283,50.7751656],[4.4350037,50.7750028],[4.464272,50.7864537],[4.4816956,50.7913372],[4.4823823,50.7961658],[4.459208,50.8062556],[4.4594655,50.8166144],[4.4797215,50.8203559],[4.4695935,50.8353735],[4.4689927,50.8457258],[4.4623837,50.8539626],[4.4496808,50.8559133],[4.4459901,50.8599226],[4.4253049,50.8661526],[4.431828,50.8762815],[4.4400677,50.8784478],[4.4310555,50.8901441],[4.4359479,50.8950167],[4.4295964,50.9010255],[4.4165501,50.9075748],[4.4154343,50.9134197],[4.3957791,50.914069],[4.3846211,50.9109303],[4.3811879,50.9031907],[4.3726048,50.9003218],[4.3621335,50.9032989],[4.3485722,50.9034072],[4.3402467,50.9041108],[4.328917,50.902487],[4.3164716,50.8960453],[4.3063435,50.8927429],[4.2900357,50.8898192],[4.2914948,50.8849461],[4.2955289,50.8826176],[4.2956147,50.8809389],[4.2827401,50.8722735],[4.2769894,50.8671277],[4.2780194,50.8591099],[4.2804227,50.8572136],[4.2809376,50.8421489],[4.2719254,50.8403603],[4.2546735,50.8369455],[4.2510686,50.83288],[4.2522702,50.8269708],[4.2434296,50.82182],[4.2440305,50.8154755],[4.2551884,50.8150959],[4.2580209,50.8093472],[4.2721829,50.8101065],[4.2757878,50.8069607],[4.2854008,50.8050623],[4.2890057,50.8069065],[4.298018,50.8059302],[4.3028245,50.7970881],[4.3145833,50.7945382],[4.3162141,50.7862367],[4.3295178,50.7738087],[4.3420491,50.7716375],[4.3452248,50.7733745],[4.3785271,50.7681092],[4.3797288,50.7638205]]],"terms_text":"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAACXBIWXMAAAsSAAALEgHS3X78AAACnUlEQVQoz11SXUiTYRh93ndz06YMNWcpRmWRSpgO+0EUDYwQ6sZ+oAyti8y6yCyKxOimILqQsLKbukmHSpFFLYlMqSkUmi3/pjZ/Zmv+Tec2bU237z1dfFHSc/HcPOc5HM45DAAREREgGOM217BpzDjs7PEHfNGa2PT47KxN+RFqrYDgjBMRE0JijBMRAKOlzmgxhChDN0cla1ThM0uTE65vsRFxRRkXk3TpMiMBkEQQQFPvw0LDnoYvVStBNwAhBIApj+X6m5OlT/dbnX0AJCHxkbl+zhTWub6XA4ZDqcd3JJTl1to7HV7G2E3TxOU2zaWcKm1YZKO5RlaliNknBma6Bqe7V6SVc5mVrmVFxSvLu1G3bSlwy2jVaXE6IzE0JLzV+jxJlxYTvp5X5j3Qx2ePzPcn6VJVysiUaHXX+d2zy8HqlrE8/bq3xXoiStalr1Fpxl1DRMQ547s27NWGRikVKtmuju9e34pEYcrhWV/f7E8iUinDQrjaH/AREQfAmSJGEzc6P0Qkvbd5ymt7DqfEmEr0Tre/4PFXInK4R7z+hXjtRiIi2aKPtpbi+qxue6vHj5ou+8KvAIBPP7yG3mkAd9sry18ULPrdAAgQAIJS4EZLacXrwqVlDwBJiKAkJCEB+Gz/UNyQ1TxY/8dWIiYgFFx5JPXM7JLjWe8jIgKBM3DGXT5no7lmy9rteVsLiIjJGXPGBcQ2XdqBlKJWa1PHeLOCcRAEhKH7zuKy+4T+QohCDQhGjLBqJBGsNl0teZI3OGMG0GiuKarPNI0aZTEyhq0qHxhjXv/C7bYyASkjIddoqctPOnY07ezf5hHRvwcikg+TXtv9jmsOjy0n8eCpnVeIESMiecnE/6kC0D/Vea+90h/wARAQqwG/AaEjsUbwLtXdAAAAAElFTkSuQmCC"},{"id":"UrbisAdmNL","name":"UrbisAdm NL","type":"wms","template":"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=urbisNL&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[4.3797288,50.7638205],[4.3891701,50.7637662],[4.430283,50.7751656],[4.4350037,50.7750028],[4.464272,50.7864537],[4.4816956,50.7913372],[4.4823823,50.7961658],[4.459208,50.8062556],[4.4594655,50.8166144],[4.4797215,50.8203559],[4.4695935,50.8353735],[4.4689927,50.8457258],[4.4623837,50.8539626],[4.4496808,50.8559133],[4.4459901,50.8599226],[4.4253049,50.8661526],[4.431828,50.8762815],[4.4400677,50.8784478],[4.4310555,50.8901441],[4.4359479,50.8950167],[4.4295964,50.9010255],[4.4165501,50.9075748],[4.4154343,50.9134197],[4.3957791,50.914069],[4.3846211,50.9109303],[4.3811879,50.9031907],[4.3726048,50.9003218],[4.3621335,50.9032989],[4.3485722,50.9034072],[4.3402467,50.9041108],[4.328917,50.902487],[4.3164716,50.8960453],[4.3063435,50.8927429],[4.2900357,50.8898192],[4.2914948,50.8849461],[4.2955289,50.8826176],[4.2956147,50.8809389],[4.2827401,50.8722735],[4.2769894,50.8671277],[4.2780194,50.8591099],[4.2804227,50.8572136],[4.2809376,50.8421489],[4.2719254,50.8403603],[4.2546735,50.8369455],[4.2510686,50.83288],[4.2522702,50.8269708],[4.2434296,50.82182],[4.2440305,50.8154755],[4.2551884,50.8150959],[4.2580209,50.8093472],[4.2721829,50.8101065],[4.2757878,50.8069607],[4.2854008,50.8050623],[4.2890057,50.8069065],[4.298018,50.8059302],[4.3028245,50.7970881],[4.3145833,50.7945382],[4.3162141,50.7862367],[4.3295178,50.7738087],[4.3420491,50.7716375],[4.3452248,50.7733745],[4.3785271,50.7681092],[4.3797288,50.7638205]]],"terms_text":"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAACXBIWXMAAAsSAAALEgHS3X78AAACnUlEQVQoz11SXUiTYRh93ndz06YMNWcpRmWRSpgO+0EUDYwQ6sZ+oAyti8y6yCyKxOimILqQsLKbukmHSpFFLYlMqSkUmi3/pjZ/Zmv+Tec2bU237z1dfFHSc/HcPOc5HM45DAAREREgGOM217BpzDjs7PEHfNGa2PT47KxN+RFqrYDgjBMRE0JijBMRAKOlzmgxhChDN0cla1ThM0uTE65vsRFxRRkXk3TpMiMBkEQQQFPvw0LDnoYvVStBNwAhBIApj+X6m5OlT/dbnX0AJCHxkbl+zhTWub6XA4ZDqcd3JJTl1to7HV7G2E3TxOU2zaWcKm1YZKO5RlaliNknBma6Bqe7V6SVc5mVrmVFxSvLu1G3bSlwy2jVaXE6IzE0JLzV+jxJlxYTvp5X5j3Qx2ePzPcn6VJVysiUaHXX+d2zy8HqlrE8/bq3xXoiStalr1Fpxl1DRMQ547s27NWGRikVKtmuju9e34pEYcrhWV/f7E8iUinDQrjaH/AREQfAmSJGEzc6P0Qkvbd5ymt7DqfEmEr0Tre/4PFXInK4R7z+hXjtRiIi2aKPtpbi+qxue6vHj5ou+8KvAIBPP7yG3mkAd9sry18ULPrdAAgQAIJS4EZLacXrwqVlDwBJiKAkJCEB+Gz/UNyQ1TxY/8dWIiYgFFx5JPXM7JLjWe8jIgKBM3DGXT5no7lmy9rteVsLiIjJGXPGBcQ2XdqBlKJWa1PHeLOCcRAEhKH7zuKy+4T+QohCDQhGjLBqJBGsNl0teZI3OGMG0GiuKarPNI0aZTEyhq0qHxhjXv/C7bYyASkjIddoqctPOnY07ezf5hHRvwcikg+TXtv9jmsOjy0n8eCpnVeIESMiecnE/6kC0D/Vea+90h/wARAQqwG/AaEjsUbwLtXdAAAAAElFTkSuQmCC"},{"id":"USGS-Large_Scale","name":"USGS Large Scale Imagery","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.us/usgs_large_scale/{zoom}/{x}/{y}.jpg","scaleExtent":[12,20],"polygon":[[[-123.2549305,48.7529029],[-123.2549305,48.5592263],[-123.192224,48.5592263],[-123.192224,48.4348366],[-122.9419646,48.4348366],[-122.9419646,48.3720812],[-122.8806229,48.3720812],[-122.8806229,48.3094763],[-122.8167566,48.3094763],[-122.8167566,48.1904587],[-123.0041133,48.1904587],[-123.0041133,48.1275918],[-123.058416,48.1275918],[-123.058416,48.190514],[-123.254113,48.190514],[-123.254113,48.1274982],[-123.3706593,48.1274982],[-123.3706593,48.1908403],[-124.0582632,48.1908403],[-124.0582632,48.253442],[-124.1815163,48.253442],[-124.1815163,48.3164666],[-124.4319117,48.3164666],[-124.4319117,48.3782613],[-124.5564618,48.3782613],[-124.5564618,48.4408305],[-124.7555107,48.4408305],[-124.7555107,48.1914986],[-124.8185282,48.1914986],[-124.8185282,48.1228381],[-124.7552951,48.1228381],[-124.7552951,47.5535253],[-124.3812108,47.5535253],[-124.3812108,47.1218696],[-124.1928897,47.1218696],[-124.1928897,43.7569431],[-124.4443382,43.7569431],[-124.4443382,43.1425556],[-124.6398855,43.1425556],[-124.6398855,42.6194503],[-124.4438525,42.6194503],[-124.4438525,39.8080662],[-123.8815685,39.8080662],[-123.8815685,39.1102825],[-123.75805,39.1102825],[-123.75805,38.4968799],[-123.2702803,38.4968799],[-123.2702803,37.9331905],[-122.8148084,37.9331905],[-122.8148084,37.8019606],[-122.5664316,37.8019606],[-122.5664316,36.9319611],[-121.8784026,36.9319611],[-121.8784026,36.6897596],[-122.0034748,36.6897596],[-122.0034748,36.4341056],[-121.9414159,36.4341056],[-121.9414159,35.9297636],[-121.5040977,35.9297636],[-121.5040977,35.8100273],[-121.3790276,35.8100273],[-121.3790276,35.4239164],[-120.9426515,35.4239164],[-120.9426515,35.1849683],[-120.8171978,35.1849683],[-120.8171978,35.1219894],[-120.6918447,35.1219894],[-120.6918447,34.4966794],[-120.5045898,34.4966794],[-120.5045898,34.4339651],[-120.0078775,34.4339651],[-120.0078775,34.3682626],[-119.5283517,34.3682626],[-119.5283517,34.0576434],[-119.0060985,34.0576434],[-119.0060985,33.9975267],[-118.5046259,33.9975267],[-118.5046259,33.8694631],[-118.4413209,33.8694631],[-118.4413209,33.6865253],[-118.066912,33.6865253],[-118.066912,33.3063832],[-117.5030045,33.3063832],[-117.5030045,33.0500337],[-117.3188195,33.0500337],[-117.3188195,32.6205888],[-117.1917023,32.6205888],[-117.1917023,32.4974566],[-116.746496,32.4974566],[-116.746496,32.5609161],[-115.9970138,32.5609161],[-115.9970138,32.6264942],[-114.8808125,32.6264942],[-114.8808125,32.4340796],[-114.6294474,32.4340796],[-114.6294474,32.3731636],[-114.4447437,32.3731636],[-114.4447437,32.3075418],[-114.2557628,32.3075418],[-114.2557628,32.2444561],[-114.0680274,32.2444561],[-114.0680274,32.1829113],[-113.8166499,32.1829113],[-113.8166499,32.1207622],[-113.6307421,32.1207622],[-113.6307421,32.0565099],[-113.4417495,32.0565099],[-113.4417495,31.9984372],[-113.2546027,31.9984372],[-113.2546027,31.9325434],[-113.068072,31.9325434],[-113.068072,31.8718062],[-112.8161105,31.8718062],[-112.8161105,31.8104171],[-112.6308756,31.8104171],[-112.6308756,31.7464723],[-112.4418918,31.7464723],[-112.4418918,31.6856001],[-112.257192,31.6856001],[-112.257192,31.6210352],[-112.0033787,31.6210352],[-112.0033787,31.559584],[-111.815619,31.559584],[-111.815619,31.4970238],[-111.6278586,31.4970238],[-111.6278586,31.4339867],[-111.4418978,31.4339867],[-111.4418978,31.3733859],[-111.2559708,31.3733859],[-111.2559708,31.3113225],[-108.1845822,31.3113225],[-108.1845822,31.7459502],[-106.5065055,31.7459502],[-106.5065055,31.6842308],[-106.3797265,31.6842308],[-106.3797265,31.621752],[-106.317434,31.621752],[-106.317434,31.4968167],[-106.2551769,31.4968167],[-106.2551769,31.4344889],[-106.1924698,31.4344889],[-106.1924698,31.3721296],[-106.0039212,31.3721296],[-106.0039212,31.309328],[-105.9416582,31.309328],[-105.9416582,31.2457547],[-105.8798174,31.2457547],[-105.8798174,31.1836194],[-105.8162349,31.1836194],[-105.8162349,31.1207155],[-105.6921198,31.1207155],[-105.6921198,31.0584835],[-105.6302881,31.0584835],[-105.6302881,30.9328271],[-105.5044418,30.9328271],[-105.5044418,30.8715864],[-105.4412973,30.8715864],[-105.4412973,30.808463],[-105.3781497,30.808463],[-105.3781497,30.7471828],[-105.1904658,30.7471828],[-105.1904658,30.6843231],[-105.1286244,30.6843231],[-105.1286244,30.6199737],[-105.0036504,30.6199737],[-105.0036504,30.5589058],[-104.9417962,30.5589058],[-104.9417962,30.4963236],[-104.8782018,30.4963236],[-104.8782018,30.3098261],[-104.8155257,30.3098261],[-104.8155257,30.2478305],[-104.7536079,30.2478305],[-104.7536079,29.9353916],[-104.690949,29.9353916],[-104.690949,29.8090156],[-104.6291301,29.8090156],[-104.6291301,29.6843577],[-104.5659869,29.6843577],[-104.5659869,29.6223459],[-104.5037188,29.6223459],[-104.5037188,29.5595436],[-104.4410072,29.5595436],[-104.4410072,29.4974832],[-104.2537551,29.4974832],[-104.2537551,29.3716718],[-104.1291984,29.3716718],[-104.1291984,29.3091621],[-104.0688737,29.3091621],[-104.0688737,29.2467276],[-103.8187309,29.2467276],[-103.8187309,29.1843076],[-103.755736,29.1843076],[-103.755736,29.1223174],[-103.5667542,29.1223174],[-103.5667542,29.0598119],[-103.5049819,29.0598119],[-103.5049819,28.9967506],[-103.3165753,28.9967506],[-103.3165753,28.9346923],[-103.0597572,28.9346923],[-103.0597572,29.0592965],[-102.9979694,29.0592965],[-102.9979694,29.1212855],[-102.9331397,29.1212855],[-102.9331397,29.1848575],[-102.8095989,29.1848575],[-102.8095989,29.2526154],[-102.8701345,29.2526154],[-102.8701345,29.308096],[-102.8096681,29.308096],[-102.8096681,29.3715484],[-102.7475655,29.3715484],[-102.7475655,29.5581899],[-102.684554,29.5581899],[-102.684554,29.6847655],[-102.4967764,29.6847655],[-102.4967764,29.7457694],[-102.3086647,29.7457694],[-102.3086647,29.8086627],[-102.1909323,29.8086627],[-102.1909323,29.7460097],[-101.5049914,29.7460097],[-101.5049914,29.6846777],[-101.3805796,29.6846777],[-101.3805796,29.5594459],[-101.3175057,29.5594459],[-101.3175057,29.4958934],[-101.1910075,29.4958934],[-101.1910075,29.4326115],[-101.067501,29.4326115],[-101.067501,29.308808],[-100.9418897,29.308808],[-100.9418897,29.2456231],[-100.8167271,29.2456231],[-100.8167271,29.1190449],[-100.7522672,29.1190449],[-100.7522672,29.0578214],[-100.6925358,29.0578214],[-100.6925358,28.8720431],[-100.6290158,28.8720431],[-100.6290158,28.8095363],[-100.5679901,28.8095363],[-100.5679901,28.622554],[-100.5040411,28.622554],[-100.5040411,28.5583804],[-100.4421832,28.5583804],[-100.4421832,28.4968266],[-100.379434,28.4968266],[-100.379434,28.3092865],[-100.3171942,28.3092865],[-100.3171942,28.1835681],[-100.254483,28.1835681],[-100.254483,28.1213885],[-100.1282282,28.1213885],[-100.1282282,28.059215],[-100.0659537,28.059215],[-100.0659537,27.9966087],[-100.0023855,27.9966087],[-100.0023855,27.9332152],[-99.9426497,27.9332152],[-99.9426497,27.7454658],[-99.816851,27.7454658],[-99.816851,27.6834301],[-99.7541346,27.6834301],[-99.7541346,27.6221543],[-99.6291629,27.6221543],[-99.6291629,27.5588977],[-99.5672838,27.5588977],[-99.5672838,27.4353752],[-99.5041798,27.4353752],[-99.5041798,27.3774021],[-99.5671796,27.3774021],[-99.5671796,27.2463726],[-99.504975,27.2463726],[-99.504975,26.9965649],[-99.4427427,26.9965649],[-99.4427427,26.872803],[-99.3800633,26.872803],[-99.3800633,26.8068179],[-99.3190684,26.8068179],[-99.3190684,26.7473614],[-99.2537541,26.7473614],[-99.2537541,26.6210068],[-99.1910617,26.6210068],[-99.1910617,26.4956737],[-99.1300639,26.4956737],[-99.1300639,26.3713808],[-99.0029473,26.3713808],[-99.0029473,26.3093836],[-98.816572,26.3093836],[-98.816572,26.2457762],[-98.6920082,26.2457762],[-98.6920082,26.1837096],[-98.4440896,26.1837096],[-98.4440896,26.1217217],[-98.3823181,26.1217217],[-98.3823181,26.0596488],[-98.2532707,26.0596488],[-98.2532707,25.9986871],[-98.0109084,25.9986871],[-98.0109084,25.9932255],[-97.6932319,25.9932255],[-97.6932319,25.9334103],[-97.6313904,25.9334103],[-97.6313904,25.8695893],[-97.5046779,25.8695893],[-97.5046779,25.8073488],[-97.3083401,25.8073488],[-97.3083401,25.8731159],[-97.2456326,25.8731159],[-97.2456326,25.9353731],[-97.1138939,25.9353731],[-97.1138939,27.6809179],[-97.0571035,27.6809179],[-97.0571035,27.8108242],[-95.5810766,27.8108242],[-95.5810766,28.7468827],[-94.271041,28.7468827],[-94.271041,29.5594076],[-92.5029947,29.5594076],[-92.5029947,29.4974754],[-91.8776216,29.4974754],[-91.8776216,29.3727013],[-91.378418,29.3727013],[-91.378418,29.2468326],[-91.3153953,29.2468326],[-91.3153953,29.1844301],[-91.1294702,29.1844301],[-91.1294702,29.1232559],[-91.0052632,29.1232559],[-91.0052632,28.9968437],[-89.4500159,28.9968437],[-89.4500159,28.8677422],[-88.8104309,28.8677422],[-88.8104309,30.1841864],[-85.8791527,30.1841864],[-85.8791527,29.5455038],[-84.8368083,29.5455038],[-84.8368083,29.6225158],[-84.7482786,29.6225158],[-84.7482786,29.683624],[-84.685894,29.683624],[-84.685894,29.7468386],[-83.6296975,29.7468386],[-83.6296975,29.4324361],[-83.3174937,29.4324361],[-83.3174937,29.0579442],[-82.879659,29.0579442],[-82.879659,27.7453529],[-82.8182822,27.7453529],[-82.8182822,26.9290868],[-82.3796782,26.9290868],[-82.3796782,26.3694183],[-81.8777106,26.3694183],[-81.8777106,25.805971],[-81.5036862,25.805971],[-81.5036862,25.7474753],[-81.4405462,25.7474753],[-81.4405462,25.6851489],[-81.3155883,25.6851489],[-81.3155883,25.5600985],[-81.2538534,25.5600985],[-81.2538534,25.4342361],[-81.1902012,25.4342361],[-81.1902012,25.1234341],[-81.1288133,25.1234341],[-81.1288133,25.0619389],[-81.0649231,25.0619389],[-81.0649231,24.8157807],[-81.6289469,24.8157807],[-81.6289469,24.7538367],[-81.6907173,24.7538367],[-81.6907173,24.6899374],[-81.8173189,24.6899374],[-81.8173189,24.6279161],[-82.1910041,24.6279161],[-82.1910041,24.496294],[-81.6216596,24.496294],[-81.6216596,24.559484],[-81.372006,24.559484],[-81.372006,24.6220687],[-81.0593278,24.6220687],[-81.0593278,24.684826],[-80.9347147,24.684826],[-80.9347147,24.7474828],[-80.7471081,24.7474828],[-80.7471081,24.8100618],[-80.3629898,24.8100618],[-80.3629898,25.1175858],[-80.122344,25.1175858],[-80.122344,25.7472357],[-80.0588458,25.7472357],[-80.0588458,26.3708251],[-79.995837,26.3708251],[-79.995837,26.9398003],[-80.0587265,26.9398003],[-80.0587265,27.1277466],[-80.1226251,27.1277466],[-80.1226251,27.2534279],[-80.1846956,27.2534279],[-80.1846956,27.3781229],[-80.246175,27.3781229],[-80.246175,27.5658729],[-80.3094768,27.5658729],[-80.3094768,27.7530311],[-80.3721485,27.7530311],[-80.3721485,27.8774451],[-80.4351457,27.8774451],[-80.4351457,28.0033366],[-80.4966078,28.0033366],[-80.4966078,28.1277326],[-80.5587159,28.1277326],[-80.5587159,28.3723509],[-80.4966335,28.3723509],[-80.4966335,29.5160326],[-81.1213644,29.5160326],[-81.1213644,31.6846966],[-80.6018723,31.6846966],[-80.6018723,32.2475309],[-79.4921024,32.2475309],[-79.4921024,32.9970261],[-79.1116488,32.9970261],[-79.1116488,33.3729457],[-78.6153621,33.3729457],[-78.6153621,33.8097638],[-77.9316963,33.8097638],[-77.9316963,33.8718243],[-77.8692252,33.8718243],[-77.8692252,34.0552454],[-77.6826392,34.0552454],[-77.6826392,34.2974598],[-77.2453509,34.2974598],[-77.2453509,34.5598585],[-76.4973277,34.5598585],[-76.4973277,34.622796],[-76.4337602,34.622796],[-76.4337602,34.6849285],[-76.373212,34.6849285],[-76.373212,34.7467674],[-76.3059364,34.7467674],[-76.3059364,34.808551],[-76.2468017,34.808551],[-76.2468017,34.8728418],[-76.1825922,34.8728418],[-76.1825922,34.9335332],[-76.120814,34.9335332],[-76.120814,34.9952359],[-75.9979015,34.9952359],[-75.9979015,35.0578182],[-75.870338,35.0578182],[-75.870338,35.1219097],[-75.7462194,35.1219097],[-75.7462194,35.1818911],[-75.4929694,35.1818911],[-75.4929694,35.3082988],[-75.4325662,35.3082988],[-75.4325662,35.7542495],[-75.4969907,35.7542495],[-75.4969907,37.8105602],[-75.3082972,37.8105602],[-75.3082972,37.8720088],[-75.245601,37.8720088],[-75.245601,37.9954849],[-75.1828751,37.9954849],[-75.1828751,38.0585079],[-75.1184793,38.0585079],[-75.1184793,38.2469091],[-75.0592098,38.2469091],[-75.0592098,38.3704316],[-74.9948111,38.3704316],[-74.9948111,38.8718417],[-74.4878252,38.8718417],[-74.4878252,39.3089428],[-74.1766317,39.3089428],[-74.1766317,39.6224653],[-74.0567045,39.6224653],[-74.0567045,39.933178],[-73.9959035,39.933178],[-73.9959035,40.1854852],[-73.9341593,40.1854852],[-73.9341593,40.4959486],[-73.8723024,40.4959486],[-73.8723024,40.5527135],[-71.8074506,40.5527135],[-71.8074506,41.3088005],[-70.882512,41.3088005],[-70.882512,41.184978],[-70.7461947,41.184978],[-70.7461947,41.3091865],[-70.4337553,41.3091865],[-70.4337553,41.4963885],[-69.9334281,41.4963885],[-69.9334281,41.6230802],[-69.869857,41.6230802],[-69.869857,41.8776895],[-69.935791,41.8776895],[-69.935791,42.0032342],[-69.9975823,42.0032342],[-69.9975823,42.0650191],[-70.0606103,42.0650191],[-70.0606103,42.1294348],[-70.5572884,42.1294348],[-70.5572884,43.2487079],[-70.4974097,43.2487079],[-70.4974097,43.3092194],[-70.3704249,43.3092194],[-70.3704249,43.371963],[-70.3085701,43.371963],[-70.3085701,43.4969879],[-70.183921,43.4969879],[-70.183921,43.6223531],[-70.057583,43.6223531],[-70.057583,43.6850173],[-69.7455247,43.6850173],[-69.7455247,43.7476571],[-69.2472845,43.7476571],[-69.2472845,43.8107035],[-69.0560701,43.8107035],[-69.0560701,43.8717247],[-68.9950522,43.8717247],[-68.9950522,43.9982022],[-68.4963672,43.9982022],[-68.4963672,44.0597368],[-68.3081038,44.0597368],[-68.3081038,44.122137],[-68.1851802,44.122137],[-68.1851802,44.3081382],[-67.9956019,44.3081382],[-67.9956019,44.3727489],[-67.8103041,44.3727489],[-67.8103041,44.435178],[-67.4965289,44.435178],[-67.4965289,44.4968776],[-67.37102,44.4968776],[-67.37102,44.5600642],[-67.1848753,44.5600642],[-67.1848753,44.6213345],[-67.1221208,44.6213345],[-67.1221208,44.6867918],[-67.059365,44.6867918],[-67.059365,44.7473657],[-66.9311098,44.7473657],[-66.9311098,44.9406566],[-66.994683,44.9406566],[-66.994683,45.0024514],[-67.0595847,45.0024514],[-67.0595847,45.1273377],[-67.1201974,45.1273377],[-67.1201974,45.1910115],[-67.2469811,45.1910115],[-67.2469811,45.253442],[-67.3177546,45.253442],[-67.3177546,45.1898369],[-67.370749,45.1898369],[-67.370749,45.2534001],[-67.4326888,45.2534001],[-67.4326888,45.3083409],[-67.3708571,45.3083409],[-67.3708571,45.4396986],[-67.4305573,45.4396986],[-67.4305573,45.4950095],[-67.37099,45.4950095],[-67.37099,45.6264543],[-67.6214982,45.6264543],[-67.6214982,45.6896133],[-67.683828,45.6896133],[-67.683828,45.753259],[-67.7462097,45.753259],[-67.7462097,47.1268165],[-67.8700141,47.1268165],[-67.8700141,47.1900278],[-67.9323803,47.1900278],[-67.9323803,47.2539678],[-67.9959387,47.2539678],[-67.9959387,47.3149737],[-68.1206676,47.3149737],[-68.1206676,47.3780823],[-68.4423175,47.3780823],[-68.4423175,47.3166082],[-68.6314305,47.3166082],[-68.6314305,47.2544676],[-68.9978037,47.2544676],[-68.9978037,47.439895],[-69.0607223,47.439895],[-69.0607223,47.5047558],[-69.2538122,47.5047558],[-69.2538122,47.4398084],[-69.3179284,47.4398084],[-69.3179284,47.378601],[-69.4438546,47.378601],[-69.4438546,47.3156274],[-69.5038204,47.3156274],[-69.5038204,47.2525839],[-69.5667838,47.2525839],[-69.5667838,47.1910884],[-69.6303478,47.1910884],[-69.6303478,47.128701],[-69.6933103,47.128701],[-69.6933103,47.0654307],[-69.7557063,47.0654307],[-69.7557063,47.0042751],[-69.8180391,47.0042751],[-69.8180391,46.9415344],[-69.8804023,46.9415344],[-69.8804023,46.8792519],[-69.9421674,46.8792519],[-69.9421674,46.8177399],[-70.0063088,46.8177399],[-70.0063088,46.6920295],[-70.0704265,46.6920295],[-70.0704265,46.4425926],[-70.1945902,46.4425926],[-70.1945902,46.3785887],[-70.2562047,46.3785887],[-70.2562047,46.3152628],[-70.3203651,46.3152628],[-70.3203651,46.0651209],[-70.3814988,46.0651209],[-70.3814988,45.93552],[-70.3201618,45.93552],[-70.3201618,45.879479],[-70.4493131,45.879479],[-70.4493131,45.7538713],[-70.5070021,45.7538713],[-70.5070021,45.6916912],[-70.6316642,45.6916912],[-70.6316642,45.6291619],[-70.7575538,45.6291619],[-70.7575538,45.4414685],[-70.8809878,45.4414685],[-70.8809878,45.3780612],[-71.13328,45.3780612],[-71.13328,45.3151452],[-71.3830282,45.3151452],[-71.3830282,45.253416],[-71.5076448,45.253416],[-71.5076448,45.0655726],[-73.9418929,45.0655726],[-73.9418929,45.0031242],[-74.7469725,45.0031242],[-74.7469725,45.0649003],[-74.8800964,45.0649003],[-74.8800964,45.0029023],[-75.0662455,45.0029023],[-75.0662455,44.9415167],[-75.2539363,44.9415167],[-75.2539363,44.8776043],[-75.3789648,44.8776043],[-75.3789648,44.8153462],[-75.4431283,44.8153462],[-75.4431283,44.7536053],[-75.5666566,44.7536053],[-75.5666566,44.6909879],[-75.6290205,44.6909879],[-75.6290205,44.6284958],[-75.7540484,44.6284958],[-75.7540484,44.566385],[-75.817312,44.566385],[-75.817312,44.5028932],[-75.8799549,44.5028932],[-75.8799549,44.3784946],[-76.1300319,44.3784946],[-76.1300319,44.3159227],[-76.1926961,44.3159227],[-76.1926961,44.2534378],[-76.3182619,44.2534378],[-76.3182619,44.1916726],[-76.3792975,44.1916726],[-76.3792975,44.0653733],[-76.4427584,44.0653733],[-76.4427584,43.9963825],[-76.317027,43.9963825],[-76.317027,43.9414581],[-76.5076611,43.9414581],[-76.5076611,43.8723335],[-76.3829974,43.8723335],[-76.3829974,43.8091872],[-76.2534102,43.8091872],[-76.2534102,43.5665222],[-76.5064833,43.5665222],[-76.5064833,43.5033881],[-76.6331208,43.5033881],[-76.6331208,43.4432252],[-76.6951085,43.4432252],[-76.6951085,43.3786858],[-76.8177798,43.3786858],[-76.8177798,43.318066],[-77.682,43.318066],[-77.682,43.3789376],[-78.0565883,43.3789376],[-78.0565883,43.4396918],[-78.4389748,43.4396918],[-78.4389748,43.3794382],[-78.8803396,43.3794382],[-78.8803396,43.3149724],[-79.1298858,43.3149724],[-79.1298858,43.2429286],[-79.0669615,43.2429286],[-79.0669615,43.1299931],[-79.1298858,43.1299931],[-79.1298858,43.0577305],[-79.071264,43.0577305],[-79.071264,42.9294906],[-78.943264,42.9294906],[-78.943264,42.7542165],[-79.069439,42.7542165],[-79.069439,42.6941622],[-79.133439,42.6941622],[-79.133439,42.6296973],[-79.1947499,42.6296973],[-79.1947499,42.5663538],[-79.3786827,42.5663538],[-79.3786827,42.5033425],[-79.4442961,42.5033425],[-79.4442961,42.4410614],[-79.5679936,42.4410614],[-79.5679936,42.3775264],[-79.6906154,42.3775264],[-79.6906154,42.3171086],[-79.8164642,42.3171086],[-79.8164642,42.2534481],[-80.0052373,42.2534481],[-80.0052373,42.1909188],[-80.1916829,42.1909188],[-80.1916829,42.1272555],[-80.3167992,42.1272555],[-80.3167992,42.0669857],[-80.5063234,42.0669857],[-80.5063234,42.0034331],[-80.6930471,42.0034331],[-80.6930471,41.9415141],[-80.9440403,41.9415141],[-80.9440403,41.8781193],[-81.1942729,41.8781193],[-81.1942729,41.8166455],[-81.3190089,41.8166455],[-81.3190089,41.7545453],[-81.4418435,41.7545453],[-81.4418435,41.690965],[-81.5053523,41.690965],[-81.5053523,41.6301643],[-82.7470081,41.6301643],[-82.7470081,41.7536942],[-82.8839135,41.7536942],[-82.8839135,41.5656075],[-82.9957195,41.5656075],[-82.9957195,41.6270375],[-83.1257796,41.6270375],[-83.1257796,41.6878411],[-83.2474733,41.6878411],[-83.2474733,41.7536942],[-83.3737305,41.7536942],[-83.3737305,41.809276],[-83.3106019,41.809276],[-83.3106019,41.8716064],[-83.2474733,41.8716064],[-83.2474733,41.9361393],[-83.1843447,41.9361393],[-83.1843447,41.9960851],[-83.1207681,41.9960851],[-83.1207681,42.2464812],[-83.0589194,42.2464812],[-83.0589194,42.3089555],[-82.8685328,42.3089555],[-82.8685328,42.3717652],[-82.8072219,42.3717652],[-82.8072219,42.558553],[-82.7553745,42.558553],[-82.7553745,42.4954945],[-82.5599041,42.4954945],[-82.5599041,42.558553],[-82.4967755,42.558553],[-82.4967755,42.6833607],[-82.4328863,42.6833607],[-82.4328863,42.9342196],[-82.3700552,42.9342196],[-82.3700552,43.0648071],[-82.4328863,43.0648071],[-82.4328863,43.1917566],[-82.4947464,43.1917566],[-82.4947464,43.5034627],[-82.557133,43.5034627],[-82.557133,43.8160901],[-82.6197884,43.8160901],[-82.6197884,43.9422098],[-82.6839499,43.9422098],[-82.6839499,44.0022641],[-82.7465346,44.0022641],[-82.7465346,44.0670545],[-82.8708696,44.0670545],[-82.8708696,44.1291935],[-83.008517,44.1291935],[-83.008517,44.0664786],[-83.1336086,44.0664786],[-83.1336086,44.0053949],[-83.2414522,44.0053949],[-83.2414522,44.9962034],[-83.1806112,44.9962034],[-83.1806112,45.067302],[-83.2455172,45.067302],[-83.2455172,45.1287382],[-83.3065878,45.1287382],[-83.3065878,45.2551509],[-83.3706087,45.2551509],[-83.3706087,45.3165923],[-83.4325644,45.3165923],[-83.4325644,45.3792105],[-83.6178415,45.3792105],[-83.6178415,45.4419665],[-83.8084291,45.4419665],[-83.8084291,45.5036189],[-84.0550718,45.5036189],[-84.0550718,45.5647907],[-84.1235181,45.5647907],[-84.1235181,45.6287845],[-84.1807534,45.6287845],[-84.1807534,45.6914688],[-84.3111554,45.6914688],[-84.3111554,45.9337076],[-83.8209974,45.9337076],[-83.8209974,45.8725113],[-83.4968086,45.8725113],[-83.4968086,45.9337076],[-83.4338066,45.9337076],[-83.4338066,46.0016863],[-83.4962697,46.0016863],[-83.4962697,46.0668178],[-83.5599956,46.0668178],[-83.5599956,46.1261576],[-83.9954558,46.1261576],[-83.9954558,46.1931747],[-84.0591816,46.1931747],[-84.0591816,46.3814972],[-84.1152614,46.3814972],[-84.1152614,46.4953584],[-84.0591816,46.4953584],[-84.0591816,46.5682653],[-84.2579545,46.5682653],[-84.2579545,46.5051232],[-84.3071879,46.5051232],[-84.3071879,46.5682653],[-84.4415364,46.5682653],[-84.4415364,46.504525],[-84.9965729,46.504525],[-84.9965729,46.6842882],[-84.9298158,46.6842882],[-84.9298158,46.818077],[-85.3165894,46.818077],[-85.3165894,46.7535825],[-87.5562645,46.7535825],[-87.5562645,47.4407371],[-87.6825361,47.4407371],[-87.6825361,47.5035554],[-88.2560738,47.5035554],[-88.2560738,47.4433716],[-88.4417419,47.4433716],[-88.4417419,47.3789949],[-88.50683,47.3789949],[-88.50683,47.3153881],[-88.6312821,47.3153881],[-88.6312821,47.2539782],[-88.7569636,47.2539782],[-88.7569636,47.1934682],[-88.8838253,47.1934682],[-88.8838253,47.1284735],[-88.9434208,47.1284735],[-88.9434208,47.0662127],[-89.0708726,47.0662127],[-89.0708726,47.0026826],[-89.2565553,47.0026826],[-89.2565553,46.9410806],[-90.3677669,46.9410806],[-90.3677669,47.6844827],[-90.3069978,47.6844827],[-90.3069978,47.7460174],[-89.994859,47.7460174],[-89.994859,47.8082719],[-89.8048615,47.8082719],[-89.8048615,47.8700562],[-89.6797699,47.8700562],[-89.6797699,47.9339637],[-89.4933757,47.9339637],[-89.4933757,47.9957956],[-89.4284697,47.9957956],[-89.4284697,48.0656377],[-89.9932739,48.0656377],[-89.9932739,48.1282966],[-90.7455933,48.1282966],[-90.7455933,48.1893056],[-90.8087291,48.1893056],[-90.8087291,48.2522065],[-91.067763,48.2522065],[-91.067763,48.1916658],[-91.1946247,48.1916658],[-91.1946247,48.1279027],[-91.6814196,48.1279027],[-91.6814196,48.2525994],[-91.9321927,48.2525994],[-91.9321927,48.3142454],[-91.9929683,48.3142454],[-91.9929683,48.3780845],[-92.3189383,48.3780845],[-92.3189383,48.2529081],[-92.3732233,48.2529081],[-92.3732233,48.3153385],[-92.4322288,48.3153385],[-92.4322288,48.4411448],[-92.4977248,48.4411448],[-92.4977248,48.501781],[-92.5679413,48.501781],[-92.5679413,48.439579],[-92.6210462,48.439579],[-92.6210462,48.5650783],[-92.8086835,48.5650783],[-92.8086835,48.6286865],[-92.8086835,48.6267365],[-92.933185,48.6267365],[-92.933185,48.6922145],[-93.0051716,48.6922145],[-93.0051716,48.6282965],[-93.1225924,48.6282965],[-93.1225924,48.6922145],[-93.3190806,48.6922145],[-93.3190806,48.6267365],[-93.5049477,48.6267365],[-93.5049477,48.5635164],[-93.7474601,48.5635164],[-93.7474601,48.6267365],[-93.8135461,48.6267365],[-93.8135461,48.6898775],[-94.2453121,48.6898775],[-94.2453121,48.7554327],[-94.6183171,48.7554327],[-94.6183171,48.941036],[-94.6809018,48.941036],[-94.6809018,49.0029737],[-94.7441532,49.0029737],[-94.7441532,49.2536079],[-94.8084069,49.2536079],[-94.8084069,49.3784134],[-95.1192391,49.3784134],[-95.1192391,49.4425264],[-95.1934341,49.4425264],[-95.1934341,49.0035292],[-96.87069,49.0035292],[-96.87069,49.0656063],[-99.0049312,49.0656063],[-99.0049312,49.0050714],[-109.3699257,49.0050714],[-109.3699257,49.0668231],[-109.5058746,49.0668231],[-109.5058746,49.0050714],[-114.1830014,49.0050714],[-114.1830014,49.0687317],[-114.7578709,49.0687317],[-114.7578709,49.0050714],[-115.433731,49.0050714],[-115.433731,49.0671412],[-116.5062706,49.0671412],[-116.5062706,49.0050714],[-117.3089504,49.0050714],[-117.3089504,49.0659803],[-119.882945,49.0659803],[-119.882945,49.0050714],[-120.1208555,49.0050714],[-120.1208555,49.0678367],[-121.4451636,49.0678367],[-121.4451636,49.0050714],[-121.9311808,49.0050714],[-121.9311808,49.0656099],[-122.817484,49.0656099],[-122.817484,49.0029143],[-122.8795155,49.0029143],[-122.8795155,48.9347018],[-122.8174629,48.9347018],[-122.8174629,48.8101998],[-122.7538859,48.8101998],[-122.7538859,48.7533758],[-122.8712937,48.7533758],[-122.8712937,48.8153948],[-123.0055391,48.8153948],[-123.0055391,48.7529529],[-123.1296926,48.7529529],[-123.1296926,48.6902201],[-123.1838197,48.6902201],[-123.1838197,48.7529029],[-123.2549305,48.7529029]],[[-122.9341743,37.7521547],[-122.9347457,37.6842013],[-123.0679013,37.6849023],[-123.0673747,37.7475251],[-123.1292603,37.7478506],[-123.1286894,37.815685],[-123.0590687,37.8153192],[-123.0595947,37.7528143],[-122.9341743,37.7521547]],[[-71.6299464,41.2540893],[-71.4966465,41.2541393],[-71.4965596,41.122965],[-71.6298594,41.1229149],[-71.6299464,41.2540893]],[[-70.3184265,41.3775196],[-70.3183384,41.2448243],[-70.1906612,41.2448722],[-70.1906239,41.1886019],[-69.9336025,41.1886984],[-69.933729,41.3791941],[-69.9950664,41.3791712],[-69.995109,41.443159],[-70.0707828,41.4431307],[-70.0706972,41.3144915],[-70.2461667,41.3144258],[-70.2462087,41.3775467],[-70.3184265,41.3775196]],[[-68.9403374,43.9404062],[-68.6856948,43.9404977],[-68.6856475,43.8721797],[-68.7465405,43.8721577],[-68.7464976,43.8102529],[-68.8090782,43.8102304],[-68.8090343,43.746728],[-68.8773094,43.7467034],[-68.8773544,43.8117826],[-68.9402483,43.8117599],[-68.9403374,43.9404062]],[[-123.1291466,49.0645144],[-122.9954224,49.0645144],[-122.9954224,48.9343243],[-123.1291466,48.9343243],[-123.1291466,49.0645144]],[[-82.9407144,24.7535913],[-82.8719398,24.7535913],[-82.8719398,24.6905653],[-82.7446233,24.6905653],[-82.7446233,24.6214593],[-82.8088038,24.6214593],[-82.8088038,24.5594908],[-82.9407144,24.5594908],[-82.9407144,24.7535913]]],"icon":"data:image/png;base64,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"},{"id":"USGS-Scanned_Topographic","name":"USGS Topographic Maps","type":"tms","template":"https://caltopo.s3.amazonaws.com/topo/{zoom}/{x}/{y}.png","scaleExtent":[0,16],"polygon":[[[-55.9959409871,52.00107125754],[-112.02896100663,52.00107125754],[-112.03994733476,56.01308253302],[-120.0049439862,56.00592357111],[-120.01711631014,60.01202439709],[-132.00196823895,60.00239237126],[-132.01208445818,63.00193292546],[-133.96882922149,63.00050478005],[-133.97240257168,63.9922484722],[-141.04429430438,63.98726254018],[-141.06879354491,69.92045693283],[-156.24893170976,71.51583202984],[-160.44570905351,70.83527373985],[-167.08145124101,68.42906280103],[-164.08218366288,67.03913532024],[-169.01504499101,65.68268604273],[-166.57608014726,64.50777504773],[-161.82998639726,64.0500622981],[-165.08193952226,63.26030016403],[-168.02627545976,59.7862264253],[-162.53311139726,59.73089435789],[-162.35733014726,58.55904663221],[-157.83096295976,58.31752983705],[-158.00674420976,57.52404350658],[-168.22402936601,53.51022153947],[-166.55410749101,53.14277307072],[-158.77578717851,54.88541314654],[-158.68240338944,55.7496444805],[-156.55105573319,56.00847621073],[-156.15554792069,56.7746616888],[-154.70535260819,56.14336689443],[-152.07412702226,57.37034511851],[-151.62918073319,58.22653323066],[-152.00820905351,58.98055685754],[-145.98770124101,60.24740887373],[-140.38467389726,59.48634241018],[-136.53945905351,57.80610084736],[-133.79287702226,54.83482554482],[-133.33145124101,53.14277307072],[-131.46377545976,51.69838238021],[-128.52493268632,51.74602265442],[-129.79385358476,50.90159054062],[-124.56436139726,47.49785657441],[-124.03701764726,45.48627362525],[-124.69619733476,42.90428451679],[-124.49844342851,40.3414647251],[-122.80654889726,37.53929308709],[-119.99404889726,33.37084692374],[-117.24746686601,32.54119524801],[-111.13906842851,31.19770451575],[-106.70059186601,31.23528720858],[-103.20693952226,28.64618215851],[-101.84463483476,29.81580068657],[-99.20791608476,26.28743998885],[-96.79092389726,25.75431753335],[-96.92275983476,27.96911213371],[-93.47305280351,29.68226300815],[-88.94668561601,28.87732407469],[-88.61709577226,30.17736083469],[-86.20010358476,30.3671253082],[-84.96963483476,29.43379356715],[-84.09072858476,30.06332630046],[-82.97012311601,28.95425748047],[-82.97012311601,27.26823750278],[-81.25625592851,25.07956298739],[-82.09121686601,24.5610471236],[-80.06973249101,24.76073298597],[-79.85000592851,27.11188091684],[-81.27822858476,30.70777424386],[-78.99307233476,33.20554049136],[-75.03799420976,35.59830000028],[-75.85098249101,37.2425160052],[-73.74160749101,40.4585957587],[-69.89639264726,41.60224497127],[-70.68740827226,43.17628724449],[-66.93008405351,44.69516042167],[-66.53457624101,43.08006996122],[-64.20547467851,43.35229243812],[-59.50332624101,45.73220792131],[-59.51431256913,46.24761804024],[-60.00320417069,46.25901313529],[-59.99221784257,47.24505773341],[-59.00894147538,47.23759898478],[-58.99795514726,47.50266941922],[-56.51504499101,47.50266941922],[-56.52603131913,46.74770404019],[-53.99917585038,46.74770404019],[-53.97720319413,46.48358117386],[-52.49404889726,46.46354265729],[-52.50503522538,48.75360583388],[-52.99667340898,48.75451123442],[-53.01315290116,49.99551104004],[-55.00167829179,50.00610367548],[-55.03738385819,53.74720613495],[-56.00418073319,53.73421061801],[-55.9959409871,52.00107125754]],[[-59.50126630448,43.7495431608],[-60.50239545487,43.7495431608],[-60.50239545487,43.99999882251],[-59.99839765214,43.99999882251],[-59.99839765214,44.2494016836],[-59.50126630448,44.2494016836],[-59.50126630448,43.7495431608]],[[-155.95024091386,20.49523373356],[-157.3267518687,20.49153389084],[-157.32902509355,21.23181053727],[-155.95251413871,21.23549220541],[-155.95024091386,20.49523373356]],[[-157.64488202714,21.24845058596],[-158.28534362719,21.24673774522],[-158.28689557694,21.7499618541],[-157.6464339769,21.75166877943],[-157.64488202714,21.24845058596]],[[-156.12602216386,20.32469602374],[-154.7461696274,20.3284088686],[-154.74174482011,18.87578125335],[-156.12159735656,18.87203473488],[-156.12602216386,20.32469602374]],[[-159.29077130937,22.24504086823],[-159.2892966564,21.76857042389],[-160.28916841131,21.76590592196],[-160.29064306428,22.24238530626],[-159.29077130937,22.24504086823]]],"terms_url":"https://caltopo.com/","terms_text":"© Caltopo","icon":"data:image/png;base64,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"},{"id":"USSR-Latvia","name":"USSR - Latvia","type":"wms","template":"http://www.gisnet.lv/cgi-bin/topo?FORMAT=image/jpeg&VERSION=1.1.1&service=WMS&REQUEST=GetMap&LAYERS=DTO,DTC,DIVDPTC,PD,VS,DS,PS,M&SRS={proj}&WIDTH={width}&height={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[26.630859375,57.56888774130087],[25.169677734375,58.048818457936505],[22.543945312499996,57.76865857271793],[21.544189453124996,57.53351974347291],[21.016845703125,56.81892067431724],[21.016845703125,56.03522578369872],[22.03857421875,56.389583525613055],[24.719238281249996,56.33481154165235],[26.751708984375,55.665193184436035],[28.19091796875,56.139428693863266],[27.784423828125,57.40946113558119],[26.630859375,57.56888774130087]]]},{"id":"sjcgis.org-General_Basemap_WM","name":"Vector Streetmap for San Juan County WA","type":"tms","template":"http://sjcgis.org/arcgis/rest/services/Basemaps/General_Basemap_WM/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,19],"polygon":[[[-123.274024,48.692975],[-123.007726,48.767256],[-123.007619,48.831577],[-122.783495,48.758416],[-122.693402,48.658522],[-122.767451,48.603606],[-122.744842,48.387083],[-123.248221,48.283531],[-123.114524,48.422614],[-123.219035,48.548575],[-123.274024,48.692975]]],"best":true,"description":"Public domain street and address data from the San Juan County, WA. Updated at least quarterly."},{"id":"Vejmidte_Denmark","name":"Vejmidte","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.dk/danmark/vejmidte/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"polygon":[[[8.3743941,54.9551655],[8.3683809,55.4042149],[8.2103997,55.4039795],[8.2087314,55.4937345],[8.0502655,55.4924731],[8.0185123,56.7501399],[8.1819161,56.7509948],[8.1763274,57.0208898],[8.3413329,57.0219872],[8.3392467,57.1119574],[8.5054433,57.1123212],[8.5033923,57.2020499],[9.3316304,57.2027636],[9.3319079,57.2924835],[9.4978864,57.2919578],[9.4988593,57.3820608],[9.6649749,57.3811615],[9.6687295,57.5605591],[9.8351961,57.5596265],[9.8374896,57.6493322],[10.1725726,57.6462818],[10.1754245,57.7367768],[10.5118282,57.7330269],[10.5152095,57.8228945],[10.6834853,57.8207722],[10.6751613,57.6412021],[10.5077045,57.6433097],[10.5039992,57.5535088],[10.671038,57.5514113],[10.6507805,57.1024538],[10.4857673,57.1045138],[10.4786236,56.9249051],[10.3143981,56.9267573],[10.3112341,56.8369269],[10.4750295,56.83509],[10.4649016,56.5656681],[10.9524239,56.5589761],[10.9479249,56.4692243],[11.1099335,56.4664675],[11.1052639,56.376833],[10.9429901,56.3795284],[10.9341235,56.1994768],[10.7719685,56.2020244],[10.7694751,56.1120103],[10.6079695,56.1150259],[10.4466742,56.116717],[10.2865948,56.118675],[10.2831527,56.0281851],[10.4439274,56.0270388],[10.4417713,55.7579243],[10.4334961,55.6693533],[10.743814,55.6646861],[10.743814,55.5712253],[10.8969041,55.5712253],[10.9051793,55.3953852],[11.0613726,55.3812841],[11.0593038,55.1124061],[11.0458567,55.0318621],[11.2030844,55.0247474],[11.2030844,55.117139],[11.0593038,55.1124061],[11.0613726,55.3812841],[11.0789572,55.5712253],[10.8969041,55.5712253],[10.9258671,55.6670198],[10.743814,55.6646861],[10.7562267,55.7579243],[10.4417713,55.7579243],[10.4439274,56.0270388],[10.4466742,56.116717],[10.6079695,56.1150259],[10.6052053,56.0247462],[10.9258671,56.0201215],[10.9197132,55.9309388],[11.0802782,55.92792],[11.0858066,56.0178284],[11.7265047,56.005058],[11.7319981,56.0952142],[12.0540333,56.0871256],[12.0608477,56.1762576],[12.7023469,56.1594405],[12.6611131,55.7114318],[12.9792318,55.7014026],[12.9612912,55.5217294],[12.3268659,55.5412096],[12.3206071,55.4513655],[12.4778226,55.447067],[12.4702432,55.3570479],[12.6269738,55.3523837],[12.6200898,55.2632576],[12.4627339,55.26722],[12.4552949,55.1778223],[12.2987046,55.1822303],[12.2897344,55.0923641],[12.6048608,55.0832904],[12.5872011,54.9036285],[12.2766618,54.9119031],[12.2610181,54.7331602],[12.1070691,54.7378161],[12.0858621,54.4681655],[11.7794953,54.4753579],[11.7837381,54.5654783],[11.1658525,54.5782155],[11.1706443,54.6686508],[10.8617173,54.6733956],[10.8651245,54.7634667],[10.7713646,54.7643888],[10.7707276,54.7372807],[10.7551428,54.7375776],[10.7544039,54.7195666],[10.7389074,54.7197588],[10.7384368,54.7108482],[10.7074486,54.7113045],[10.7041094,54.6756741],[10.5510973,54.6781698],[10.5547184,54.7670245],[10.2423994,54.7705935],[10.2459845,54.8604673],[10.0902268,54.8622134],[10.0873731,54.7723851],[9.1555798,54.7769557],[9.1562752,54.8675369],[8.5321973,54.8663765],[8.531432,54.95516],[8.3743941,54.9551655]],[[11.4577738,56.819554],[11.7849181,56.8127385],[11.7716715,56.6332796],[11.4459621,56.6401087],[11.4577738,56.819554]],[[11.3274736,57.3612962],[11.3161808,57.1818004],[11.1508692,57.1847276],[11.1456628,57.094962],[10.8157703,57.1001693],[10.8290599,57.3695272],[11.3274736,57.3612962]],[[11.5843266,56.2777928],[11.5782882,56.1880397],[11.7392309,56.1845765],[11.7456428,56.2743186],[11.5843266,56.2777928]],[[14.6825922,55.3639405],[14.8395247,55.3565231],[14.8263755,55.2671261],[15.1393406,55.2517359],[15.1532015,55.3410836],[15.309925,55.3330556],[15.295719,55.2437356],[15.1393406,55.2517359],[15.1255631,55.1623802],[15.2815819,55.1544167],[15.2535578,54.9757646],[14.6317464,55.0062496],[14.6825922,55.3639405]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Vejmidte","terms_text":"Danish municipalities"},{"id":"Vercors-Orthophotos-1999","name":"Vercors (Réserve naturelle des Hauts-Plateaux du Vercors) - Orthophoto - 1999 - 1 m","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/PNRVercors-RHP-1999/{zoom}/{x}/{y}","endDate":"1999-01-01T00:00:00.000Z","startDate":"1999-01-01T00:00:00.000Z","scaleExtent":[0,19],"polygon":[[[5.4356493,44.9991755],[5.4319266,44.9229046],[5.4362415,44.9228447],[5.4347186,44.8900063],[5.4330265,44.8899463],[5.4306544,44.8502562],[5.4338694,44.8501362],[5.4328541,44.8263781],[5.435477,44.8262581],[5.4349693,44.8138952],[5.4410611,44.8137151],[5.4371691,44.7409842],[5.4545983,44.7404433],[5.4528215,44.7042536],[5.5210998,44.7024496],[5.5232996,44.7385803],[5.5890397,44.7368374],[5.5929812,44.8126305],[5.5879047,44.8129906],[5.5897661,44.8494722],[5.588228,44.8493765],[5.5897237,44.8735055],[5.5386318,44.8750318],[5.5394694,44.886859],[5.5283416,44.8873253],[5.5300168,44.9201234],[5.5331876,44.9201234],[5.5376148,44.996241],[5.4356493,44.9991755]]],"terms_text":"Parc Naturel du Vercors"},{"id":"vicosa_al","name":"Viçosa AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Vicosa&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.19799506289,-9.42067411388],[-36.19777392167,-9.41788790418],[-36.19779919496,-9.41528243495],[-36.19801401785,-9.41074463302],[-36.19789396976,-9.4085692096],[-36.19792556136,-9.40636883904],[-36.1979697896,-9.40560836777],[-36.19793187968,-9.40405001978],[-36.19798874457,-9.40311500762],[-36.19827306898,-9.40027878861],[-36.19829202394,-9.39495536094],[-36.19788765144,-9.39168895497],[-36.19844366363,-9.38932016801],[-36.19836784379,-9.3862033184],[-36.197938198,-9.38166513525],[-36.19801401785,-9.37972018144],[-36.1983425705,-9.37867289409],[-36.19831729722,-9.37697727931],[-36.19816565754,-9.37585517674],[-36.19851948347,-9.37139166614],[-36.1982162041,-9.36238966295],[-36.1986205766,-9.35318792839],[-36.19849421019,-9.35096850339],[-36.19857003004,-9.34852462578],[-36.19879748957,-9.34667923744],[-36.19859530332,-9.34348719127],[-36.19877221629,-9.34084375588],[-36.19894912926,-9.33301308429],[-36.19877221629,-9.33039450836],[-36.28957911612,-9.33114267492],[-36.28937692987,-9.33318765532],[-36.28950329627,-9.33538225508],[-36.28925056346,-9.34124276628],[-36.28945274971,-9.34291361737],[-36.28927583674,-9.34520790729],[-36.28897255737,-9.37311224406],[-36.28914947033,-9.37480787773],[-36.2889220108,-9.37707702159],[-36.28889673752,-9.38540540039],[-36.28871982455,-9.38632799292],[-36.28871982455,-9.39343436657],[-36.28887146424,-9.39557871736],[-36.28877037111,-9.40128860991],[-36.28861873143,-9.40652467311],[-36.28871982455,-9.40714800869],[-36.28877037111,-9.4213348225],[-36.19799506289,-9.42067411388]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"wien.gv.at-labels","name":"Vienna: Beschriftungen (annotations)","type":"tms","template":"https://maps.wien.gv.at/wmts/beschriftung/normal/google3857/{zoom}/{y}/{x}.png","scaleExtent":[12,19],"polygon":[[[16.17,48.1],[16.17,48.33],[16.58,48.33],[16.58,48.1],[16.17,48.1]]],"terms_url":"https://data.wien.gv.at/","terms_text":"Stadt Wien","icon":"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"},{"id":"wien.gv.at-gp","name":"Vienna: Mehrzweckkarte (general purpose)","type":"tms","template":"https://maps.wien.gv.at/wmts/fmzk/pastell/google3857/{zoom}/{y}/{x}.jpeg","scaleExtent":[10,19],"polygon":[[[16.17,48.1],[16.17,48.33],[16.58,48.33],[16.58,48.1],[16.17,48.1]]],"terms_url":"https://data.wien.gv.at/","terms_text":"Stadt Wien","icon":"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"},{"id":"wien.gv.at-aerial_image","name":"Vienna: Orthofoto (aerial image)","type":"tms","template":"https://maps.wien.gv.at/wmts/lb/farbe/google3857/{zoom}/{y}/{x}.jpeg","scaleExtent":[10,19],"polygon":[[[16.17,48.1],[16.17,48.33],[16.58,48.33],[16.58,48.1],[16.17,48.1]]],"terms_url":"https://data.wien.gv.at/","terms_text":"Stadt Wien","icon":"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"},{"id":"vogis.cnv.at-DGM","name":"VoGIS: DGM (Terrain model)","type":"wms","template":"http://vogis.cnv.at/mapserver/mapserv?map=i_hoehen_und_gelaende_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=schummerung_50cm_terrain&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[9.9680512,47.5463081],[9.9680895,47.5462689],[9.9712464,47.544249],[9.9648355,47.538031],[9.9683952,47.5280172],[9.965262,47.5208928],[9.9956949,47.5027787],[9.9873585,47.4984652],[10.0007641,47.4821056],[10.023014,47.4841071],[10.0374328,47.4891775],[10.0447745,47.4876222],[10.0541256,47.4758854],[10.0534684,47.4668571],[10.064681,47.4636357],[10.0699906,47.4559503],[10.0805676,47.4553604],[10.0885672,47.4602924],[10.091638,47.4589276],[10.0938486,47.4404644],[10.1055856,47.4287167],[10.0937374,47.4168811],[10.07418,47.4147226],[10.0691405,47.410176],[10.0862396,47.3995221],[10.0828437,47.3938062],[10.0998387,47.3547604],[10.1193354,47.375613],[10.1416871,47.36718],[10.1658749,47.3688749],[10.1695804,47.3712997],[10.1693975,47.3858299],[10.1813043,47.3872516],[10.181849,47.3924258],[10.1950843,47.3893456],[10.1998763,47.3833352],[10.2125912,47.3803897],[10.227051,47.388895],[10.2361856,47.3819213],[10.2316784,47.3789694],[10.2371623,47.3735651],[10.2169885,47.3543552],[10.2171047,47.3498849],[10.2042369,47.3367531],[10.2074173,47.3323161],[10.1995092,47.3264601],[10.2111311,47.3189838],[10.2159718,47.311064],[10.2123593,47.3112242],[10.1991314,47.2975423],[10.1896365,47.2939449],[10.1796106,47.2960256],[10.172077,47.2790762],[10.1740416,47.2702482],[10.1783421,47.2701114],[10.174493,47.263697],[10.218842,47.255327],[10.223433,47.249833],[10.210873,47.247805],[10.1977606,47.236662],[10.207913,47.232802],[10.214282,47.216842],[10.21269,47.204315],[10.1996265,47.195388],[10.1995066,47.1852535],[10.2115119,47.1712368],[10.2091987,47.1653713],[10.20851,47.159483],[10.213206,47.1576984],[10.222203,47.15323],[10.2216565,47.1492513],[10.214808,47.143515],[10.203327,47.142152],[10.208868,47.131643],[10.186295,47.12886],[10.186525,47.119455],[10.172877,47.120333],[10.162993,47.113607],[10.157657,47.114262],[10.154415,47.105778],[10.132428,47.081218],[10.1345877,47.0639183],[10.1508456,47.0618412],[10.156932,47.048827],[10.1441816,47.0335527],[10.1232555,47.0220943],[10.1328399,47.0120428],[10.1544702,47.0054497],[10.159614,46.9988153],[10.1544222,46.9929855],[10.1600074,46.9839969],[10.1446293,46.9830135],[10.1349173,46.9658398],[10.1350134,46.9548285],[10.1268364,46.9434986],[10.0977188,46.9267603],[10.0995372,46.9171215],[10.1092134,46.908337],[10.1090833,46.8943061],[10.1249668,46.8801373],[10.1414741,46.8746789],[10.1396666,46.8621658],[10.1450621,46.8510986],[10.1394105,46.8473781],[10.1230851,46.8484838],[10.1191237,46.8441698],[10.1051833,46.8408981],[10.0919546,46.851426],[10.0926536,46.8581775],[10.087123,46.861277],[10.0548814,46.8617049],[10.0508964,46.8644202],[10.0519245,46.8740502],[10.0389144,46.8861128],[10.0322055,46.8880172],[10.0178184,46.9016148],[10.0049435,46.8988926],[9.9824336,46.9061986],[9.9779314,46.9160343],[9.9665663,46.9122226],[9.9590704,46.9160246],[9.946121,46.9123495],[9.9375809,46.9132426],[9.9215303,46.918824],[9.9123097,46.9260554],[9.9063207,46.9253006],[9.8944853,46.9316447],[9.8761296,46.9346278],[9.8807063,46.9401115],[9.8765706,46.9407057],[9.8748781,46.9503903],[9.8787197,46.9570665],[9.8707312,46.9632091],[9.8848165,46.9854648],[9.8923039,46.9903589],[9.8887771,47.0007231],[9.870696,47.0096514],[9.8711507,47.0130577],[9.8803497,47.0172237],[9.8777935,47.0205525],[9.8597449,47.0232098],[9.8527287,47.0164129],[9.8361195,47.012531],[9.8235302,47.0198587],[9.8075641,47.0235627],[9.7849142,47.0384853],[9.7480774,47.0369227],[9.7418488,47.042675],[9.718211,47.0433745],[9.7070102,47.0480458],[9.7075964,47.0538077],[9.69756,47.0523884],[9.6839177,47.0576471],[9.6818398,47.0620979],[9.6774319,47.061409],[9.6582148,47.0581823],[9.6450573,47.059775],[9.6415752,47.0559826],[9.6365412,47.051703],[9.6263272,47.0513274],[9.6070544,47.0607725],[9.6133977,47.0694958],[9.6115341,47.0794024],[9.6186894,47.0781689],[9.6233873,47.0825788],[9.6334608,47.0834395],[9.6356428,47.0955277],[9.6285845,47.1075584],[9.6208286,47.1103155],[9.6350298,47.1281316],[9.6246665,47.1326485],[9.6225823,47.1413535],[9.6258673,47.1458981],[9.6205943,47.1516392],[9.6089021,47.1477494],[9.5967871,47.1629415],[9.5794635,47.1711566],[9.5645583,47.1702904],[9.5730168,47.1755955],[9.5725939,47.1907921],[9.5803175,47.1957775],[9.5847667,47.2053225],[9.5687023,47.2196758],[9.5585129,47.2241649],[9.5517611,47.2237671],[9.5667871,47.2428808],[9.5307265,47.2705781],[9.5461876,47.2800507],[9.556344,47.2982863],[9.588051,47.3173029],[9.5996599,47.3454983],[9.6107327,47.355706],[9.6244598,47.3661451],[9.6587582,47.369461],[9.6725468,47.3802057],[9.673111,47.3919406],[9.6516178,47.404626],[9.6455139,47.4311951],[9.6451212,47.4378008],[9.6579866,47.4477909],[9.6589756,47.4522045],[9.6223413,47.457472],[9.609044,47.4705422],[9.6029186,47.4619769],[9.5951426,47.4633095],[9.5821741,47.4827585],[9.562202,47.4959175],[9.550566,47.5371757],[9.5827036,47.5359236],[9.6046496,47.5295205],[9.7347836,47.5339558],[9.7351711,47.5466141],[9.7416436,47.5549858],[9.7471037,47.5556923],[9.7433711,47.5586655],[9.7520662,47.5674668],[9.7480649,47.5705239],[9.7563218,47.5726206],[9.7563266,47.5796315],[9.7619689,47.5809636],[9.7655314,47.5891166],[9.7693306,47.5873852],[9.7769663,47.5954393],[9.7915143,47.5935211],[9.7999911,47.5961057],[9.81414,47.5880685],[9.8238141,47.5871045],[9.8272819,47.579972],[9.8207906,47.5707624],[9.8256191,47.5592156],[9.8171007,47.5533268],[9.8157872,47.5476661],[9.8502301,47.5416393],[9.8583884,47.5338767],[9.8745052,47.5285372],[9.8780368,47.5387569],[9.8751486,47.543427],[9.8812471,47.5481426],[9.8891039,47.5439867],[9.8993513,47.54475],[9.9066603,47.5421716],[9.913579,47.532546],[9.9218947,47.5296364],[9.9335226,47.5326499],[9.9410791,47.5382227],[9.9636997,47.5347198],[9.9588294,47.5431278],[9.9631795,47.54229],[9.9680512,47.5463081]]],"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAD1BMVEUAAACEAgT8AgQEAgSEgoTQjzHEAAAAAXRSTlMAQObYZgAAAHJJREFUeF6ljVEKgzAQRCftBUQv0KwXML7cwPvfqQwJtIVqi76fHR7DrKSUJY1DD84xKEVuwcT40C1HC18bqQDTBKWosUZn+VvQ4UTjkoCYWd/Eco9ZLwEWggsNC9CPL3C0UauFz44wFh941Bw0tm1PPAGCUydahBcw6wAAAABJRU5ErkJggg=="},{"id":"vogis.cnv.at-DOM","name":"VoGIS: DOM (Surface model)","type":"wms","template":"http://vogis.cnv.at/mapserver/mapserv?map=i_hoehen_und_gelaende_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=schummerung_50cm_surface&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[9.9680512,47.5463081],[9.9680895,47.5462689],[9.9712464,47.544249],[9.9648355,47.538031],[9.9683952,47.5280172],[9.965262,47.5208928],[9.9956949,47.5027787],[9.9873585,47.4984652],[10.0007641,47.4821056],[10.023014,47.4841071],[10.0374328,47.4891775],[10.0447745,47.4876222],[10.0541256,47.4758854],[10.0534684,47.4668571],[10.064681,47.4636357],[10.0699906,47.4559503],[10.0805676,47.4553604],[10.0885672,47.4602924],[10.091638,47.4589276],[10.0938486,47.4404644],[10.1055856,47.4287167],[10.0937374,47.4168811],[10.07418,47.4147226],[10.0691405,47.410176],[10.0862396,47.3995221],[10.0828437,47.3938062],[10.0998387,47.3547604],[10.1193354,47.375613],[10.1416871,47.36718],[10.1658749,47.3688749],[10.1695804,47.3712997],[10.1693975,47.3858299],[10.1813043,47.3872516],[10.181849,47.3924258],[10.1950843,47.3893456],[10.1998763,47.3833352],[10.2125912,47.3803897],[10.227051,47.388895],[10.2361856,47.3819213],[10.2316784,47.3789694],[10.2371623,47.3735651],[10.2169885,47.3543552],[10.2171047,47.3498849],[10.2042369,47.3367531],[10.2074173,47.3323161],[10.1995092,47.3264601],[10.2111311,47.3189838],[10.2159718,47.311064],[10.2123593,47.3112242],[10.1991314,47.2975423],[10.1896365,47.2939449],[10.1796106,47.2960256],[10.172077,47.2790762],[10.1740416,47.2702482],[10.1783421,47.2701114],[10.174493,47.263697],[10.218842,47.255327],[10.223433,47.249833],[10.210873,47.247805],[10.1977606,47.236662],[10.207913,47.232802],[10.214282,47.216842],[10.21269,47.204315],[10.1996265,47.195388],[10.1995066,47.1852535],[10.2115119,47.1712368],[10.2091987,47.1653713],[10.20851,47.159483],[10.213206,47.1576984],[10.222203,47.15323],[10.2216565,47.1492513],[10.214808,47.143515],[10.203327,47.142152],[10.208868,47.131643],[10.186295,47.12886],[10.186525,47.119455],[10.172877,47.120333],[10.162993,47.113607],[10.157657,47.114262],[10.154415,47.105778],[10.132428,47.081218],[10.1345877,47.0639183],[10.1508456,47.0618412],[10.156932,47.048827],[10.1441816,47.0335527],[10.1232555,47.0220943],[10.1328399,47.0120428],[10.1544702,47.0054497],[10.159614,46.9988153],[10.1544222,46.9929855],[10.1600074,46.9839969],[10.1446293,46.9830135],[10.1349173,46.9658398],[10.1350134,46.9548285],[10.1268364,46.9434986],[10.0977188,46.9267603],[10.0995372,46.9171215],[10.1092134,46.908337],[10.1090833,46.8943061],[10.1249668,46.8801373],[10.1414741,46.8746789],[10.1396666,46.8621658],[10.1450621,46.8510986],[10.1394105,46.8473781],[10.1230851,46.8484838],[10.1191237,46.8441698],[10.1051833,46.8408981],[10.0919546,46.851426],[10.0926536,46.8581775],[10.087123,46.861277],[10.0548814,46.8617049],[10.0508964,46.8644202],[10.0519245,46.8740502],[10.0389144,46.8861128],[10.0322055,46.8880172],[10.0178184,46.9016148],[10.0049435,46.8988926],[9.9824336,46.9061986],[9.9779314,46.9160343],[9.9665663,46.9122226],[9.9590704,46.9160246],[9.946121,46.9123495],[9.9375809,46.9132426],[9.9215303,46.918824],[9.9123097,46.9260554],[9.9063207,46.9253006],[9.8944853,46.9316447],[9.8761296,46.9346278],[9.8807063,46.9401115],[9.8765706,46.9407057],[9.8748781,46.9503903],[9.8787197,46.9570665],[9.8707312,46.9632091],[9.8848165,46.9854648],[9.8923039,46.9903589],[9.8887771,47.0007231],[9.870696,47.0096514],[9.8711507,47.0130577],[9.8803497,47.0172237],[9.8777935,47.0205525],[9.8597449,47.0232098],[9.8527287,47.0164129],[9.8361195,47.012531],[9.8235302,47.0198587],[9.8075641,47.0235627],[9.7849142,47.0384853],[9.7480774,47.0369227],[9.7418488,47.042675],[9.718211,47.0433745],[9.7070102,47.0480458],[9.7075964,47.0538077],[9.69756,47.0523884],[9.6839177,47.0576471],[9.6818398,47.0620979],[9.6774319,47.061409],[9.6582148,47.0581823],[9.6450573,47.059775],[9.6415752,47.0559826],[9.6365412,47.051703],[9.6263272,47.0513274],[9.6070544,47.0607725],[9.6133977,47.0694958],[9.6115341,47.0794024],[9.6186894,47.0781689],[9.6233873,47.0825788],[9.6334608,47.0834395],[9.6356428,47.0955277],[9.6285845,47.1075584],[9.6208286,47.1103155],[9.6350298,47.1281316],[9.6246665,47.1326485],[9.6225823,47.1413535],[9.6258673,47.1458981],[9.6205943,47.1516392],[9.6089021,47.1477494],[9.5967871,47.1629415],[9.5794635,47.1711566],[9.5645583,47.1702904],[9.5730168,47.1755955],[9.5725939,47.1907921],[9.5803175,47.1957775],[9.5847667,47.2053225],[9.5687023,47.2196758],[9.5585129,47.2241649],[9.5517611,47.2237671],[9.5667871,47.2428808],[9.5307265,47.2705781],[9.5461876,47.2800507],[9.556344,47.2982863],[9.588051,47.3173029],[9.5996599,47.3454983],[9.6107327,47.355706],[9.6244598,47.3661451],[9.6587582,47.369461],[9.6725468,47.3802057],[9.673111,47.3919406],[9.6516178,47.404626],[9.6455139,47.4311951],[9.6451212,47.4378008],[9.6579866,47.4477909],[9.6589756,47.4522045],[9.6223413,47.457472],[9.609044,47.4705422],[9.6029186,47.4619769],[9.5951426,47.4633095],[9.5821741,47.4827585],[9.562202,47.4959175],[9.550566,47.5371757],[9.5827036,47.5359236],[9.6046496,47.5295205],[9.7347836,47.5339558],[9.7351711,47.5466141],[9.7416436,47.5549858],[9.7471037,47.5556923],[9.7433711,47.5586655],[9.7520662,47.5674668],[9.7480649,47.5705239],[9.7563218,47.5726206],[9.7563266,47.5796315],[9.7619689,47.5809636],[9.7655314,47.5891166],[9.7693306,47.5873852],[9.7769663,47.5954393],[9.7915143,47.5935211],[9.7999911,47.5961057],[9.81414,47.5880685],[9.8238141,47.5871045],[9.8272819,47.579972],[9.8207906,47.5707624],[9.8256191,47.5592156],[9.8171007,47.5533268],[9.8157872,47.5476661],[9.8502301,47.5416393],[9.8583884,47.5338767],[9.8745052,47.5285372],[9.8780368,47.5387569],[9.8751486,47.543427],[9.8812471,47.5481426],[9.8891039,47.5439867],[9.8993513,47.54475],[9.9066603,47.5421716],[9.913579,47.532546],[9.9218947,47.5296364],[9.9335226,47.5326499],[9.9410791,47.5382227],[9.9636997,47.5347198],[9.9588294,47.5431278],[9.9631795,47.54229],[9.9680512,47.5463081]]],"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAD1BMVEUAAACEAgT8AgQEAgSEgoTQjzHEAAAAAXRSTlMAQObYZgAAAHJJREFUeF6ljVEKgzAQRCftBUQv0KwXML7cwPvfqQwJtIVqi76fHR7DrKSUJY1DD84xKEVuwcT40C1HC18bqQDTBKWosUZn+VvQ4UTjkoCYWd/Eco9ZLwEWggsNC9CPL3C0UauFz44wFh941Bw0tm1PPAGCUydahBcw6wAAAABJRU5ErkJggg=="},{"id":"vogis.cnv.at-ef2012_12cm","name":"VoGIS: Echtfarbenbild 2012 (12cm)","type":"wms","template":"http://vogis.cnv.at/mapserver/mapserv?map=i_luftbilder_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ef2012_12cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2012-01-01T00:00:00.000Z","startDate":"2012-01-01T00:00:00.000Z","polygon":[[[9.5436683,47.4847893],[9.6145139,47.4505807],[9.6135938,47.3827196],[9.4424603,47.2479843],[9.4461405,47.0959963],[9.4286592,47.0891059],[9.4249789,47.0151345],[9.8528128,47.0019594],[9.8574132,46.898956],[9.9669019,46.889525],[10.0451081,46.849897],[10.1582771,46.833534],[10.1591972,46.8920401],[10.1471804,46.8924787],[10.1511549,46.9433055],[10.1631717,46.9428673],[10.1646986,46.9623816],[10.1785187,46.9668098],[10.1757585,47.1035121],[10.2291227,47.1022595],[10.2208421,47.2436121],[10.2613253,47.4126142],[10.1242344,47.4057648],[10.093872,47.4779493],[10.0046249,47.5071683],[9.9862234,47.5612116],[9.8436121,47.5624533],[9.8408519,47.6071356],[9.539988,47.6065153],[9.5436683,47.4847893]]],"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAD1BMVEUAAACEAgT8AgQEAgSEgoTQjzHEAAAAAXRSTlMAQObYZgAAAHJJREFUeF6ljVEKgzAQRCftBUQv0KwXML7cwPvfqQwJtIVqi76fHR7DrKSUJY1DD84xKEVuwcT40C1HC18bqQDTBKWosUZn+VvQ4UTjkoCYWd/Eco9ZLwEWggsNC9CPL3C0UauFz44wFh941Bw0tm1PPAGCUydahBcw6wAAAABJRU5ErkJggg=="},{"id":"vogis.cnv.at-ef2015_10cm","name":"VoGIS: Echtfarbenbild 2015 (10cm)","type":"wms","template":"http://vogis.cnv.at/mapserver/mapserv?map=i_luftbilder_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ef2015_10cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2015-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","polygon":[[[9.5436683,47.4847893],[9.6145139,47.4505807],[9.6135938,47.3827196],[9.4424603,47.2479843],[9.4461405,47.0959963],[9.4286592,47.0891059],[9.4249789,47.0151345],[9.8528128,47.0019594],[9.8574132,46.898956],[9.9669019,46.889525],[10.0451081,46.849897],[10.1582771,46.833534],[10.1591972,46.8920401],[10.1471804,46.8924787],[10.1511549,46.9433055],[10.1631717,46.9428673],[10.1646986,46.9623816],[10.1785187,46.9668098],[10.1757585,47.1035121],[10.2291227,47.1022595],[10.2208421,47.2436121],[10.2613253,47.4126142],[10.1242344,47.4057648],[10.093872,47.4779493],[10.0046249,47.5071683],[9.9862234,47.5612116],[9.8436121,47.5624533],[9.8408519,47.6071356],[9.539988,47.6065153],[9.5436683,47.4847893]]],"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAD1BMVEUAAACEAgT8AgQEAgSEgoTQjzHEAAAAAXRSTlMAQObYZgAAAHJJREFUeF6ljVEKgzAQRCftBUQv0KwXML7cwPvfqQwJtIVqi76fHR7DrKSUJY1DD84xKEVuwcT40C1HC18bqQDTBKWosUZn+VvQ4UTjkoCYWd/Eco9ZLwEWggsNC9CPL3C0UauFz44wFh941Bw0tm1PPAGCUydahBcw6wAAAABJRU5ErkJggg=="},{"id":"vogis.cnv.at-wi2015_20cm","name":"VoGIS: Echtfarbenbild Winter 2015 (20cm)","type":"wms","template":"http://vogis.cnv.at/mapserver/mapserv?map=i_luftbilder_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=wi2015_20cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2015-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","polygon":[[[10.1703925,46.8297883],[10.1710791,46.93644],[10.1841254,46.9411282],[10.1854987,47.1015707],[10.239057,47.104375],[10.2428336,47.1561117],[10.2569098,47.1870362],[10.2455802,47.2759749],[10.2531333,47.323472],[10.2689261,47.3262646],[10.2644629,47.41102],[10.1319403,47.4086966],[10.1343436,47.4610652],[10.1175208,47.4615294],[10.1188941,47.4733659],[10.0873084,47.4742942],[10.0849051,47.5072362],[10.0684256,47.5070043],[10.0673956,47.521497],[10.0234503,47.5242791],[10.000791,47.5794276],[9.8490424,47.5775748],[9.8504157,47.6146181],[9.7275061,47.6127666],[9.7202963,47.5908903],[9.7034735,47.5891536],[9.7031302,47.5449087],[9.6821875,47.5449087],[9.6804709,47.5534826],[9.5639128,47.5493117],[9.5620246,47.5395782],[9.5517249,47.5395782],[9.5517249,47.5340154],[9.5216841,47.5347108],[9.5270056,47.3049672],[9.505033,47.3026391],[9.5009131,47.2336806],[9.5235724,47.2322819],[9.5242591,47.165566],[9.5448584,47.1640488],[9.5438284,47.1544774],[9.5723242,47.1540105],[9.5702643,47.128089],[9.590177,47.128673],[9.5918936,47.1002853],[9.5723242,47.1001685],[9.5771308,47.0286063],[9.7240729,47.0304785],[9.7230429,47.0174892],[9.7745413,47.0156166],[9.776258,47.0055504],[9.7927374,47.0039115],[9.7947974,46.9912671],[9.8387427,46.9931405],[9.840116,46.9034933],[9.8902411,46.9072462],[9.8854346,46.887071],[9.959249,46.8914116],[9.9619956,46.8767458],[10.0001044,46.8786233],[9.9966712,46.857146],[10.0186438,46.8565591],[10.0234503,46.8307278],[10.1703925,46.8297883]]],"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAD1BMVEUAAACEAgT8AgQEAgSEgoTQjzHEAAAAAXRSTlMAQObYZgAAAHJJREFUeF6ljVEKgzAQRCftBUQv0KwXML7cwPvfqQwJtIVqi76fHR7DrKSUJY1DD84xKEVuwcT40C1HC18bqQDTBKWosUZn+VvQ4UTjkoCYWd/Eco9ZLwEWggsNC9CPL3C0UauFz44wFh941Bw0tm1PPAGCUydahBcw6wAAAABJRU5ErkJggg=="}];
23645
23646 var presets = {"aerialway":{"fields":["aerialway"],"geometry":["point","vertex","line"],"tags":{"aerialway":"*"},"terms":["ski lift","funifor","funitel"],"searchable":false,"name":"Aerialway"},"aeroway":{"icon":"airport","fields":["aeroway"],"geometry":["point","vertex","line","area"],"tags":{"aeroway":"*"},"searchable":false,"name":"Aeroway"},"amenity":{"fields":["amenity"],"geometry":["point","vertex","area"],"tags":{"amenity":"*"},"searchable":false,"name":"Amenity"},"circular":{"geometry":["vertex","line"],"fields":["name"],"tags":{"junction":"circular"},"name":"Traffic Circle","searchable":false},"highway":{"fields":["name","highway"],"geometry":["point","vertex","line","area"],"tags":{"highway":"*"},"searchable":false,"name":"Highway"},"place":{"fields":["name","place"],"geometry":["point","vertex","area"],"tags":{"place":"*"},"searchable":false,"name":"Place"},"power":{"geometry":["point","vertex","line","area"],"tags":{"power":"*"},"fields":["power"],"searchable":false,"name":"Power"},"railway":{"fields":["railway"],"geometry":["point","vertex","line","area"],"tags":{"railway":"*"},"searchable":false,"name":"Railway"},"roundabout":{"geometry":["vertex","line"],"fields":["name"],"tags":{"junction":"roundabout"},"name":"Roundabout","searchable":false},"waterway":{"fields":["name","waterway"],"geometry":["point","vertex","line","area"],"tags":{"waterway":"*"},"searchable":false,"name":"Waterway"},"address":{"fields":["address"],"geometry":["point","vertex","area"],"tags":{"addr:*":"*"},"addTags":{},"removeTags":{},"reference":{"key":"addr"},"name":"Address","matchScore":0.15},"advertising/billboard":{"fields":["direction","lit"],"geometry":["point","vertex","line"],"tags":{"advertising":"billboard"},"name":"Billboard"},"aerialway/station":{"icon":"aerialway","geometry":["point","vertex","area"],"fields":["aerialway/access","aerialway/summer/access","elevation","building_area"],"tags":{"aerialway":"station"},"name":"Aerialway Station","searchable":false},"aerialway/cable_car":{"geometry":["line"],"terms":["tramway","ropeway"],"fields":["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/heating"],"tags":{"aerialway":"cable_car"},"name":"Cable Car"},"aerialway/chair_lift":{"geometry":["line"],"fields":["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],"tags":{"aerialway":"chair_lift"},"name":"Chair Lift"},"aerialway/drag_lift":{"geometry":["line"],"fields":["name","aerialway/capacity","aerialway/duration"],"tags":{"aerialway":"drag_lift"},"name":"Drag Lift"},"aerialway/gondola":{"geometry":["line"],"fields":["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],"tags":{"aerialway":"gondola"},"name":"Gondola"},"aerialway/goods":{"geometry":["line"],"fields":["name","aerialway/capacity","aerialway/duration"],"tags":{"aerialway":"goods"},"name":"Goods Aerialway"},"aerialway/magic_carpet":{"geometry":["line"],"fields":["name","aerialway/capacity","aerialway/duration","aerialway/heating"],"tags":{"aerialway":"magic_carpet"},"name":"Magic Carpet Lift"},"aerialway/mixed_lift":{"geometry":["line"],"fields":["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],"tags":{"aerialway":"mixed_lift"},"name":"Mixed Lift"},"aerialway/platter":{"geometry":["line"],"terms":["button lift","poma lift"],"fields":["name","aerialway/capacity","aerialway/duration"],"tags":{"aerialway":"platter"},"name":"Platter Lift"},"aerialway/pylon":{"geometry":["point","vertex"],"fields":["ref"],"tags":{"aerialway":"pylon"},"name":"Aerialway Pylon"},"aerialway/rope_tow":{"geometry":["line"],"terms":["handle tow","bugel lift"],"fields":["name","aerialway/capacity","aerialway/duration"],"tags":{"aerialway":"rope_tow"},"name":"Rope Tow Lift"},"aerialway/t-bar":{"geometry":["line"],"fields":["name","aerialway/capacity","aerialway/duration"],"terms":["tbar"],"tags":{"aerialway":"t-bar"},"name":"T-bar Lift"},"aeroway/aerodrome":{"icon":"airport","geometry":["point","area"],"fields":["name","iata","icao","operator","internet_access","internet_access/fee","internet_access/ssid"],"terms":["airplane","airport","aerodrome"],"tags":{"aeroway":"aerodrome"},"name":"Airport"},"aeroway/apron":{"icon":"airport","geometry":["area"],"terms":["ramp"],"fields":["ref","surface"],"tags":{"aeroway":"apron"},"name":"Apron"},"aeroway/gate":{"icon":"airport","geometry":["point"],"fields":["ref_aeroway_gate"],"tags":{"aeroway":"gate"},"name":"Airport Gate"},"aeroway/hangar":{"geometry":["area"],"fields":["name","building_area"],"tags":{"aeroway":"hangar"},"name":"Hangar"},"aeroway/helipad":{"icon":"heliport","geometry":["point","area"],"fields":["ref"],"terms":["helicopter","helipad","heliport"],"tags":{"aeroway":"helipad"},"name":"Helipad"},"aeroway/runway":{"geometry":["line","area"],"terms":["landing strip"],"fields":["ref_runway","surface","length","width"],"tags":{"aeroway":"runway"},"name":"Runway"},"aeroway/taxiway":{"geometry":["line"],"fields":["ref_taxiway","surface"],"tags":{"aeroway":"taxiway"},"name":"Taxiway"},"aeroway/terminal":{"icon":"airport","geometry":["point","area"],"terms":["airport","aerodrome"],"fields":["name","operator","building_area"],"tags":{"aeroway":"terminal"},"name":"Airport Terminal"},"amenity/bus_station":{"icon":"bus","fields":["name","building_area","operator","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"amenity":"bus_station"},"name":"Bus Station / Terminal","searchable":false},"amenity/coworking_space":{"icon":"commercial","fields":["name","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"amenity":"coworking_space"},"name":"Coworking Space","searchable":false},"amenity/ferry_terminal":{"icon":"ferry","fields":["name","network","operator","address","building_area"],"geometry":["point","vertex","area"],"terms":[],"tags":{"amenity":"ferry_terminal"},"name":"Ferry Station / Terminal","searchable":false},"amenity/nursing_home":{"icon":"wheelchair","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"geometry":["point","area"],"tags":{"amenity":"nursing_home"},"reference":{"key":"social_facility","value":"nursing_home"},"name":"Nursing Home","searchable":false},"amenity/register_office":{"icon":"town-hall","fields":["name","address","building_area","opening_hours","operator"],"geometry":["point","area"],"tags":{"amenity":"register_office"},"reference":{"key":"government","value":"register_office"},"name":"Register Office","searchable":false},"amenity/scrapyard":{"icon":"car","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"tags":{"amenity":"scrapyard"},"reference":{"key":"industrial","value":"scrap_yard"},"name":"Scrap Yard","searchable":false},"amenity/swimming_pool":{"icon":"swimming","geometry":["point","vertex","area"],"tags":{"amenity":"swimming_pool"},"reference":{"key":"leisure","value":"swimming_pool"},"name":"Swimming Pool","searchable":false},"amenity/animal_boarding":{"icon":"veterinary","fields":["name","operator","address","building_area","opening_hours","animal_boarding"],"geometry":["point","area"],"terms":["boarding","cat","cattery","dog","horse","kennel","kitten","pet","pet boarding","pet care","pet hotel","puppy","reptile"],"tags":{"amenity":"animal_boarding"},"name":"Animal Boarding Facility"},"amenity/animal_breeding":{"icon":"veterinary","fields":["name","operator","address","building_area","opening_hours","animal_breeding"],"geometry":["point","area"],"terms":["breeding","bull","cat","cow","dog","horse","husbandry","kitten","livestock","pet breeding","puppy","reptile"],"tags":{"amenity":"animal_breeding"},"name":"Animal Breeding Facility"},"amenity/animal_shelter":{"icon":"veterinary","fields":["name","operator","address","building_area","opening_hours","animal_shelter"],"geometry":["point","area"],"terms":["adoption","aspca","cat","dog","horse","kitten","pet care","pet rescue","puppy","raptor","reptile","rescue","spca"],"tags":{"amenity":"animal_shelter"},"name":"Animal Shelter"},"amenity/arts_centre":{"icon":"theatre","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"arts_centre"},"name":"Arts Center"},"amenity/atm":{"icon":"bank","fields":["operator","currency_multi","drive_through"],"geometry":["point","vertex"],"terms":["money","cash","machine"],"tags":{"amenity":"atm"},"name":"ATM"},"amenity/bank":{"icon":"bank","fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"geometry":["point","area"],"terms":["credit union","check","deposit","fund","investment","repository","reserve","safe","savings","stock","treasury","trust","vault"],"tags":{"amenity":"bank"},"name":"Bank"},"amenity/bar":{"icon":"bar","fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"geometry":["point","area"],"terms":["dive","beer","bier","booze"],"tags":{"amenity":"bar"},"name":"Bar"},"amenity/bbq":{"icon":"bbq","fields":["covered","fuel"],"geometry":["point"],"terms":["bbq","grill"],"tags":{"amenity":"bbq"},"name":"Barbecue/Grill"},"amenity/bench":{"icon":"poi-bench","fields":["backrest"],"geometry":["point","vertex","line"],"terms":["seat"],"tags":{"amenity":"bench"},"name":"Bench"},"amenity/bicycle_parking":{"icon":"bicycle","fields":["bicycle_parking","capacity","operator","covered","access_simple"],"geometry":["point","vertex","area"],"terms":["bike"],"tags":{"amenity":"bicycle_parking"},"name":"Bicycle Parking"},"amenity/bicycle_rental":{"icon":"bicycle","fields":["capacity","network","operator","payment_multi"],"geometry":["point","vertex","area"],"terms":["bike"],"tags":{"amenity":"bicycle_rental"},"name":"Bicycle Rental"},"amenity/bicycle_repair_station":{"icon":"bicycle","fields":["operator","brand","opening_hours","fee","service/bicycle"],"geometry":["point","vertex"],"terms":["bike","repair","chain","pump"],"tags":{"amenity":"bicycle_repair_station"},"name":"Bicycle Repair Tool Stand"},"amenity/biergarten":{"icon":"beer","fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"geometry":["point","area"],"tags":{"amenity":"biergarten"},"terms":["beer","bier","booze"],"name":"Beer Garden"},"amenity/boat_rental":{"fields":["name","operator","payment_multi"],"geometry":["point","area"],"tags":{"amenity":"boat_rental"},"name":"Boat Rental"},"amenity/bureau_de_change":{"icon":"bank","fields":["name","operator","currency_multi"],"geometry":["point","vertex"],"terms":["bureau de change","money changer"],"tags":{"amenity":"bureau_de_change"},"name":"Currency Exchange"},"amenity/cafe":{"icon":"cafe","fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["bistro","coffee","tea"],"tags":{"amenity":"cafe"},"name":"Cafe"},"amenity/car_pooling":{"icon":"car","fields":["name","operator","capacity"],"geometry":["point","area"],"tags":{"amenity":"car_pooling"},"name":"Car Pooling"},"amenity/car_rental":{"icon":"car","fields":["name","operator","payment_multi"],"geometry":["point","area"],"tags":{"amenity":"car_rental"},"name":"Car Rental"},"amenity/car_sharing":{"icon":"car","fields":["name","operator","capacity","payment_multi"],"geometry":["point","area"],"tags":{"amenity":"car_sharing"},"name":"Car Sharing"},"amenity/car_wash":{"icon":"car","fields":["address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"amenity":"car_wash"},"name":"Car Wash"},"amenity/casino":{"icon":"poi-dice","fields":["name","operator","address","building_area","opening_hours","payment_multi","smoking"],"geometry":["point","area"],"terms":["gambling","roulette","craps","poker","blackjack"],"tags":{"amenity":"casino"},"name":"Casino"},"amenity/charging_station":{"icon":"car","fields":["operator","capacity"],"geometry":["point"],"tags":{"amenity":"charging_station"},"terms":["EV","Electric Vehicle","Supercharger"],"name":"Charging Station"},"amenity/childcare":{"icon":"school","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["daycare","orphanage","playgroup"],"tags":{"amenity":"childcare"},"name":"Nursery/Childcare"},"amenity/cinema":{"icon":"cinema","fields":["name","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["drive-in","film","flick","movie","theater","picture","show","screen"],"tags":{"amenity":"cinema"},"name":"Cinema"},"amenity/clinic":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["medical","urgentcare"],"tags":{"amenity":"clinic"},"addTags":{"amenity":"clinic","healthcare":"clinic"},"removeTags":{"amenity":"clinic","healthcare":"clinic"},"reference":{"key":"amenity","value":"clinic"},"name":"Clinic"},"amenity/clinic/abortion":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"clinic","healthcare":"clinic","healthcare:speciality":"abortion"},"reference":{"key":"amenity","value":"clinic"},"name":"Abortion Clinic"},"amenity/clinic/fertility":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["egg","fertility","reproductive","sperm","ovulation"],"tags":{"amenity":"clinic","healthcare":"clinic","healthcare:speciality":"fertility"},"reference":{"key":"amenity","value":"clinic"},"name":"Fertility Clinic"},"amenity/clock":{"icon":"poi-clock","fields":["name","support","display","visibility","date"],"geometry":["point","vertex"],"tags":{"amenity":"clock"},"name":"Clock"},"amenity/college":{"icon":"college","fields":["name","operator","address","internet_access","internet_access/ssid"],"geometry":["point","area"],"terms":["university"],"tags":{"amenity":"college"},"name":"College Grounds"},"amenity/community_centre":{"icon":"town-hall","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["event","hall"],"tags":{"amenity":"community_centre"},"name":"Community Center"},"amenity/compressed_air":{"icon":"car","geometry":["point","area"],"tags":{"amenity":"compressed_air"},"name":"Compressed Air"},"amenity/courthouse":{"icon":"town-hall","fields":["name","operator","address","building_area"],"geometry":["point","area"],"tags":{"amenity":"courthouse"},"name":"Courthouse"},"amenity/crematorium":{"icon":"cemetery","fields":["name","website","phone","opening_hours","wheelchair"],"geometry":["area","point"],"tags":{"amenity":"crematorium"},"terms":["cemetery","funeral"],"name":"Crematorium"},"amenity/dentist":{"icon":"dentist","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["tooth","teeth"],"tags":{"amenity":"dentist"},"addTags":{"amenity":"dentist","healthcare":"dentist"},"removeTags":{"amenity":"dentist","healthcare":"dentist"},"reference":{"key":"amenity","value":"dentist"},"name":"Dentist"},"amenity/doctors":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["medic*","physician"],"tags":{"amenity":"doctors"},"addTags":{"amenity":"doctors","healthcare":"doctor"},"removeTags":{"amenity":"doctors","healthcare":"doctor"},"reference":{"key":"amenity","value":"doctors"},"name":"Doctor"},"amenity/dojo":{"icon":"pitch","fields":["name","sport","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["martial arts","dojang"],"tags":{"amenity":"dojo"},"name":"Dojo / Martial Arts Academy"},"amenity/drinking_water":{"icon":"drinking-water","geometry":["point"],"tags":{"amenity":"drinking_water"},"terms":["fountain","potable"],"name":"Drinking Water"},"amenity/driving_school":{"icon":"car","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"amenity":"driving_school"},"name":"Driving School"},"amenity/embassy":{"icon":"embassy","fields":["name","country","address","building_area"],"geometry":["point","area"],"tags":{"amenity":"embassy"},"name":"Embassy"},"amenity/fast_food":{"icon":"fast-food","fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"geometry":["point","area"],"tags":{"amenity":"fast_food"},"terms":["restaurant","takeaway"],"name":"Fast Food"},"amenity/fire_station":{"icon":"fire-station","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"fire_station"},"name":"Fire Station"},"amenity/food_court":{"icon":"restaurant","fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["fast food","restaurant","food"],"tags":{"amenity":"food_court"},"name":"Food Court"},"amenity/fountain":{"icon":"poi-fountain","geometry":["point","area"],"tags":{"amenity":"fountain"},"name":"Fountain"},"amenity/fuel":{"icon":"fuel","fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["petrol","fuel","gasoline","propane","diesel","lng","cng","biodiesel"],"tags":{"amenity":"fuel"},"name":"Gas Station"},"amenity/grave_yard":{"icon":"cemetery","fields":["religion","denomination"],"geometry":["point","area"],"tags":{"amenity":"grave_yard"},"name":"Graveyard"},"amenity/grit_bin":{"fields":["access_simple"],"geometry":["point","vertex"],"tags":{"amenity":"grit_bin"},"terms":["salt","sand"],"name":"Grit Bin"},"amenity/hospital":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","emergency"],"geometry":["point","area"],"terms":["clinic","doctor","emergency room","health","infirmary","institution","sanatorium","sanitarium","sick","surgery","ward"],"tags":{"amenity":"hospital"},"addTags":{"amenity":"hospital","healthcare":"hospital"},"removeTags":{"amenity":"hospital","healthcare":"hospital"},"reference":{"key":"amenity","value":"hospital"},"name":"Hospital Grounds"},"amenity/hunting_stand":{"icon":"poi-binoculars","geometry":["point","vertex","area"],"terms":["game","gun","lookout","rifle","shoot*","wild","watch"],"tags":{"amenity":"hunting_stand"},"name":"Hunting Stand"},"amenity/ice_cream":{"icon":"ice-cream","fields":["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],"geometry":["point","area"],"terms":["gelato","sorbet","sherbet","frozen","yogurt"],"tags":{"amenity":"ice_cream"},"name":"Ice Cream Shop"},"amenity/internet_cafe":{"icon":"poi-mast","fields":["name","operator","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["cybercafe","taxiphone","teleboutique","coffee","cafe","net","lanhouse"],"tags":{"amenity":"internet_cafe"},"name":"Internet Cafe"},"amenity/kindergarten":{"icon":"school","fields":["name","operator","address"],"geometry":["point","area"],"terms":["kindergarden","pre-school"],"tags":{"amenity":"kindergarten"},"name":"Preschool/Kindergarten Grounds"},"amenity/library":{"icon":"library","fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"geometry":["point","area"],"terms":["book"],"tags":{"amenity":"library"},"name":"Library"},"amenity/love_hotel":{"icon":"heart","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"amenity":"love_hotel"},"name":"Love Hotel"},"amenity/marketplace":{"icon":"shop","fields":["name","operator","address","building","opening_hours"],"geometry":["point","area"],"tags":{"amenity":"marketplace"},"name":"Marketplace"},"amenity/motorcycle_parking":{"icon":"scooter","fields":["capacity","operator","covered","access_simple"],"geometry":["point","vertex","area"],"tags":{"amenity":"motorcycle_parking"},"name":"Motorcycle Parking"},"amenity/music_school":{"icon":"school","fields":["name","operator","address"],"geometry":["point","area"],"terms":["school of music"],"tags":{"amenity":"music_school"},"name":"Music School"},"amenity/nightclub":{"icon":"bar","fields":["name","operator","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"tags":{"amenity":"nightclub"},"terms":["disco*","night club","dancing","dance club"],"name":"Nightclub"},"amenity/parking_entrance":{"icon":"entrance-alt1","fields":["access_simple","ref"],"geometry":["vertex"],"tags":{"amenity":"parking_entrance"},"name":"Parking Garage Entrance/Exit"},"amenity/parking_space":{"fields":["capacity"],"geometry":["point","vertex","area"],"terms":[],"tags":{"amenity":"parking_space"},"matchScore":0.95,"name":"Parking Space"},"amenity/parking":{"icon":"parking","fields":["name","operator","parking","capacity","fee","access_simple","supervised","park_ride","surface","maxstay"],"geometry":["point","vertex","area"],"tags":{"amenity":"parking"},"terms":[],"name":"Car Parking"},"amenity/pavilion":{"icon":"shelter","fields":["bin","bench"],"geometry":["point","vertex","area"],"tags":{"amenity":"shelter","shelter_type":"pavilion"},"name":"Pavilion"},"amenity/pharmacy":{"icon":"pharmacy","fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"geometry":["point","area"],"tags":{"amenity":"pharmacy"},"addTags":{"amenity":"pharmacy","healthcare":"pharmacy"},"removeTags":{"amenity":"pharmacy","healthcare":"pharmacy"},"reference":{"key":"amenity","value":"pharmacy"},"terms":["drug*","med*","prescription"],"name":"Pharmacy"},"amenity/place_of_worship":{"icon":"place-of-worship","fields":["name","religion","denomination","address","building_area","service_times"],"geometry":["point","area"],"terms":["abbey","basilica","bethel","cathedral","chancel","chantry","chapel","church","fold","house of God","house of prayer","house of worship","minster","mission","mosque","oratory","parish","sacellum","sanctuary","shrine","synagogue","tabernacle","temple"],"tags":{"amenity":"place_of_worship"},"name":"Place of Worship"},"amenity/place_of_worship/buddhist":{"icon":"buddhism","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["stupa","vihara","monastery","temple","pagoda","zendo","dojo"],"tags":{"amenity":"place_of_worship","religion":"buddhist"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Buddhist Temple"},"amenity/place_of_worship/christian":{"icon":"religious-christian","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["christian","abbey","basilica","bethel","cathedral","chancel","chantry","chapel","fold","house of God","house of prayer","house of worship","minster","mission","oratory","parish","sacellum","sanctuary","shrine","tabernacle","temple"],"tags":{"amenity":"place_of_worship","religion":"christian"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Church"},"amenity/place_of_worship/hindu":{"icon":"poi-hinduist","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["kovil","devasthana","mandir","kshetram","alayam","shrine","temple"],"tags":{"amenity":"place_of_worship","religion":"hindu"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Hindu Temple"},"amenity/place_of_worship/jewish":{"icon":"religious-jewish","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["jewish"],"tags":{"amenity":"place_of_worship","religion":"jewish"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Synagogue"},"amenity/place_of_worship/muslim":{"icon":"religious-muslim","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["muslim"],"tags":{"amenity":"place_of_worship","religion":"muslim"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Mosque"},"amenity/place_of_worship/shinto":{"icon":"poi-shintoist","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["kami","torii"],"tags":{"amenity":"place_of_worship","religion":"shinto"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Shinto Shrine"},"amenity/place_of_worship/sikh":{"icon":"poi-sikhist","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["gurudwara","temple"],"tags":{"amenity":"place_of_worship","religion":"sikh"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Sikh Temple"},"amenity/place_of_worship/taoist":{"icon":"poi-taoist","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["daoist","monastery","temple"],"tags":{"amenity":"place_of_worship","religion":"taoist"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Taoist Temple"},"amenity/planetarium":{"icon":"museum","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["museum","astronomy","observatory"],"tags":{"amenity":"planetarium"},"name":"Planetarium"},"amenity/police":{"icon":"police","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["badge","constable","constabulary","cop","detective","fed","law","enforcement","officer","patrol"],"tags":{"amenity":"police"},"name":"Police"},"amenity/post_box":{"icon":"post","fields":["operator","collection_times","drive_through","ref"],"geometry":["point","vertex"],"tags":{"amenity":"post_box"},"terms":["letter","post"],"name":"Mailbox"},"amenity/post_office":{"icon":"post","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["letter","mail"],"tags":{"amenity":"post_office"},"name":"Post Office"},"amenity/prison":{"icon":"prison","fields":["name","operator","address"],"geometry":["point","area"],"terms":["cell","jail"],"tags":{"amenity":"prison"},"name":"Prison Grounds"},"amenity/pub":{"icon":"beer","fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"geometry":["point","area"],"tags":{"amenity":"pub"},"terms":["alcohol","drink","dive","beer","bier","booze"],"name":"Pub"},"amenity/public_bath":{"icon":"water","fields":["name","bath/type","bath/open_air","bath/sand_bath","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"amenity":"public_bath"},"terms":["onsen","foot bath","hot springs"],"name":"Public Bath"},"amenity/public_bookcase":{"icon":"library","fields":["name","operator","capacity","website"],"geometry":["point","area"],"terms":["library","bookcrossing"],"tags":{"amenity":"public_bookcase"},"name":"Public Bookcase"},"amenity/ranger_station":{"fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["visitor center","visitor centre","permit center","permit centre","backcountry office","warden office","warden center"],"tags":{"amenity":"ranger_station"},"name":"Ranger Station"},"amenity/recycling_centre":{"icon":"recycling","fields":["name","operator","address","building","opening_hours","recycling_accepts"],"geometry":["point","area"],"terms":["bottle","can","dump","glass","garbage","rubbish","scrap","trash"],"tags":{"amenity":"recycling","recycling_type":"centre"},"reference":{"key":"recycling_type","value":"*"},"name":"Recycling Center"},"amenity/recycling":{"icon":"recycling","fields":["recycling_accepts","collection_times"],"geometry":["point","area"],"terms":["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],"tags":{"amenity":"recycling"},"addTags":{"amenity":"recycling","recycling_type":"container"},"removeTags":{"amenity":"recycling","recycling_type":"container"},"reference":{"key":"amenity","value":"recycling"},"name":"Recycling Container"},"amenity/restaurant":{"icon":"restaurant","fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["bar","breakfast","cafe","café","canteen","coffee","dine","dining","dinner","drive-in","eat","grill","lunch","table"],"tags":{"amenity":"restaurant"},"name":"Restaurant"},"amenity/sanitary_dump_station":{"icon":"poi-storage-tank","fields":["operator","access_simple","fee","water_point"],"geometry":["point","vertex","area"],"terms":["Motor Home","Camper","Sanitary","Dump Station","Elsan","CDP","CTDP","Chemical Toilet"],"tags":{"amenity":"sanitary_dump_station"},"name":"RV Toilet Disposal"},"amenity/school":{"icon":"school","fields":["name","operator","address","religion","denomination"],"geometry":["point","area"],"terms":["academy","elementary school","middle school","high school"],"tags":{"amenity":"school"},"name":"School Grounds"},"amenity/shelter":{"icon":"shelter","fields":["name","shelter_type","bin"],"geometry":["point","vertex","area"],"terms":["lean-to","gazebo","picnic"],"tags":{"amenity":"shelter"},"name":"Shelter"},"amenity/shower":{"icon":"poi-shower","fields":["operator","opening_hours","fee","supervised","building_area"],"geometry":["point","vertex","area"],"terms":["rain closet"],"tags":{"amenity":"shower"},"name":"Shower"},"amenity/smoking_area":{"fields":["name","shelter","bin","bench","opening_hours"],"geometry":["point","vertex","area"],"terms":[],"tags":{"amenity":"smoking_area"},"name":"Smoking Area"},"amenity/social_facility":{"icon":"poi-social-facility","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"social_facility"},"name":"Social Facility"},"amenity/social_facility/food_bank":{"icon":"poi-social-facility","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"social_facility","social_facility":"food_bank"},"reference":{"key":"social_facility","value":"food_bank"},"name":"Food Bank"},"amenity/social_facility/group_home":{"icon":"wheelchair","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"geometry":["point","area"],"terms":["old","senior","living","care home","assisted living"],"tags":{"amenity":"social_facility","social_facility":"group_home","social_facility:for":"senior"},"reference":{"key":"social_facility","value":"group_home"},"name":"Elderly Group Home"},"amenity/social_facility/homeless_shelter":{"icon":"poi-social-facility","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"terms":["houseless","unhoused","displaced"],"tags":{"amenity":"social_facility","social_facility":"shelter","social_facility:for":"homeless"},"reference":{"key":"social_facility","value":"shelter"},"name":"Homeless Shelter"},"amenity/social_facility/nursing_home":{"icon":"wheelchair","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"geometry":["point","area"],"terms":["elderly","living","nursing","old","senior","assisted living"],"tags":{"amenity":"social_facility","social_facility":"nursing_home","social_facility:for":"senior"},"reference":{"key":"social_facility","value":"nursing_home"},"name":"Nursing Home"},"amenity/studio":{"icon":"karaoke","fields":["name","studio","address","building_area"],"geometry":["point","area"],"terms":["recording","radio","television"],"tags":{"amenity":"studio"},"name":"Studio"},"amenity/taxi":{"icon":"car","fields":["name","operator","capacity"],"geometry":["point","vertex","area"],"terms":["cab"],"tags":{"amenity":"taxi"},"name":"Taxi Stand"},"amenity/telephone":{"icon":"telephone","fields":["operator","phone","fee","payment_multi","covered","indoor"],"geometry":["point","vertex"],"tags":{"amenity":"telephone"},"terms":["phone"],"name":"Telephone"},"amenity/theatre":{"icon":"theatre","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["theatre","performance","play","musical"],"tags":{"amenity":"theatre"},"name":"Theater"},"amenity/toilets":{"icon":"toilet","fields":["toilets/disposal","operator","building_area","access_simple","gender","fee","diaper"],"geometry":["point","vertex","area"],"terms":["bathroom","restroom","outhouse","privy","head","lavatory","latrine","water closet","WC","W.C."],"tags":{"amenity":"toilets"},"name":"Toilets"},"amenity/townhall":{"icon":"town-hall","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["village","city","government","courthouse","municipal"],"tags":{"amenity":"townhall"},"name":"Town Hall"},"amenity/university":{"icon":"college","fields":["name","operator","address","internet_access","internet_access/ssid"],"geometry":["point","area"],"terms":["college"],"tags":{"amenity":"university"},"name":"University Grounds"},"amenity/vending_machine":{"icon":"poi-vending-machine","fields":["vending","operator","payment_multi","currency_multi"],"geometry":["point"],"terms":[],"tags":{"amenity":"vending_machine"},"name":"Vending Machine"},"amenity/vending_machine/news_papers":{"icon":"poi-vending-machine","fields":["operator","fee","payment_multi","currency_multi"],"geometry":["point"],"terms":["newspaper"],"tags":{"amenity":"vending_machine","vending":"news_papers"},"reference":{"key":"vending","value":"newspapers"},"name":"Newspaper Vending Machine","searchable":false},"amenity/vending_machine/cigarettes":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["cigarette"],"tags":{"amenity":"vending_machine","vending":"cigarettes"},"reference":{"key":"vending","value":"cigarettes"},"name":"Cigarette Vending Machine"},"amenity/vending_machine/condoms":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["condom"],"tags":{"amenity":"vending_machine","vending":"condoms"},"reference":{"key":"vending","value":"condoms"},"name":"Condom Vending Machine"},"amenity/vending_machine/drinks":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["drink","soda","beverage","juice","pop"],"tags":{"amenity":"vending_machine","vending":"drinks"},"reference":{"key":"vending","value":"drinks"},"name":"Drink Vending Machine"},"amenity/vending_machine/excrement_bags":{"icon":"poi-vending-machine","fields":["operator","fee","payment_multi","currency_multi"],"geometry":["point"],"terms":["excrement bags","poop","dog","animal"],"tags":{"amenity":"vending_machine","vending":"excrement_bags"},"reference":{"key":"vending","value":"excrement_bags"},"name":"Excrement Bag Vending Machine"},"amenity/vending_machine/feminine_hygiene":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["condom","tampon","pad","woman","women","menstrual hygiene products","personal care"],"tags":{"amenity":"vending_machine","vending":"feminine_hygiene"},"reference":{"key":"vending","value":"feminine_hygiene"},"name":"Feminine Hygiene Vending Machine"},"amenity/vending_machine/newspapers":{"icon":"poi-vending-machine","fields":["operator","fee","payment_multi","currency_multi"],"geometry":["point"],"terms":["newspaper"],"tags":{"amenity":"vending_machine","vending":"newspapers"},"reference":{"key":"vending","value":"newspapers"},"name":"Newspaper Vending Machine"},"amenity/vending_machine/parcel_pickup_dropoff":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["parcel","mail","pickup"],"tags":{"amenity":"vending_machine","vending":"parcel_pickup;parcel_mail_in"},"reference":{"key":"vending","value":"parcel_pickup;parcel_mail_in"},"name":"Parcel Pickup/Dropoff Vending Machine"},"amenity/vending_machine/parking_tickets":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["parking","ticket"],"tags":{"amenity":"vending_machine","vending":"parking_tickets"},"reference":{"key":"vending","value":"parking_tickets"},"matchScore":0.94,"name":"Parking Ticket Vending Machine"},"amenity/vending_machine/public_transport_tickets":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["bus","train","ferry","rail","ticket","transportation"],"tags":{"amenity":"vending_machine","vending":"public_transport_tickets"},"reference":{"key":"vending","value":"public_transport_tickets"},"name":"Transit Ticket Vending Machine"},"amenity/vending_machine/sweets":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["candy","gum","chip","pretzel","cookie","cracker"],"tags":{"amenity":"vending_machine","vending":"sweets"},"reference":{"key":"vending","value":"sweets"},"name":"Snack Vending Machine"},"amenity/veterinary":{"icon":"veterinary","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["pet clinic","veterinarian","animal hospital","pet doctor"],"tags":{"amenity":"veterinary"},"name":"Veterinary"},"amenity/waste_basket":{"icon":"waste-basket","fields":["collection_times"],"geometry":["point","vertex"],"tags":{"amenity":"waste_basket"},"terms":["bin","garbage","rubbish","litter","trash"],"name":"Waste Basket"},"amenity/waste_disposal":{"icon":"waste-basket","fields":["collection_times"],"geometry":["point","vertex","area"],"tags":{"amenity":"waste_disposal"},"terms":["garbage","rubbish","litter","trash"],"name":"Garbage Dumpster"},"amenity/waste_transfer_station":{"icon":"waste-basket","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["dump","garbage","recycling","rubbish","scrap","trash"],"tags":{"amenity":"waste_transfer_station"},"name":"Waste Transfer Station"},"amenity/waste/dog_excrement":{"icon":"waste-basket","fields":["collection_times"],"geometry":["point","vertex","area"],"tags":{"amenity":"waste_basket","waste":"dog_excrement"},"reference":{"key":"waste","value":"dog_excrement"},"terms":["bin","garbage","rubbish","litter","trash","poo","dog"],"name":"Dog Excrement Bin"},"amenity/water_point":{"icon":"drinking-water","geometry":["area","vertex","point"],"tags":{"amenity":"water_point"},"name":"RV Drinking Water"},"amenity/watering_place":{"icon":"drinking-water","geometry":["area","vertex","point"],"tags":{"amenity":"watering_place"},"name":"Animal Watering Place"},"area":{"fields":["name"],"geometry":["area"],"tags":{"area":"yes"},"name":"Area","matchScore":0.1},"area/highway":{"fields":["name","area/highway"],"geometry":["area"],"tags":{"area:highway":"*"},"name":"Road Surface"},"attraction/amusement_ride":{"icon":"amusement-park","fields":["name","operator","opening_hours"],"geometry":["point","area"],"terms":["theme park","carnival ride"],"tags":{"attraction":"amusement_ride"},"name":"Amusement Ride"},"attraction/animal":{"icon":"zoo","fields":["name","operator"],"geometry":["point","area"],"terms":["zoo","theme park","animal park","lion","tiger","bear"],"tags":{"attraction":"animal"},"name":"Animal"},"attraction/big_wheel":{"icon":"amusement-park","fields":["name","operator","height","opening_hours"],"geometry":["point"],"terms":["ferris wheel","theme park","amusement ride"],"tags":{"attraction":"big_wheel"},"name":"Big Wheel"},"attraction/bumper_car":{"icon":"car","fields":["name","operator","opening_hours"],"geometry":["point","area"],"terms":["theme park","dodgem cars","autoscooter"],"tags":{"attraction":"bumper_car"},"name":"Bumper Car"},"attraction/bungee_jumping":{"icon":"pitch","fields":["name","operator","height","opening_hours"],"geometry":["point","area"],"terms":["theme park","bungy jumping","jumping platform"],"tags":{"attraction":"bungee_jumping"},"name":"Bungee Jumping"},"attraction/carousel":{"icon":"horse-riding","fields":["name","operator","opening_hours"],"geometry":["point","area"],"terms":["theme park","roundabout","merry-go-round","galloper","jumper","horseabout","flying horses"],"tags":{"attraction":"carousel"},"name":"Carousel"},"attraction/dark_ride":{"icon":"rail-metro","fields":["name","operator","opening_hours"],"geometry":["point","line","area"],"terms":["theme park","ghost train"],"tags":{"attraction":"dark_ride"},"name":"Dark Ride"},"attraction/drop_tower":{"icon":"poi-tower","fields":["name","operator","height","opening_hours"],"geometry":["point","area"],"terms":["theme park","amusement ride","gondola","tower","big drop"],"tags":{"attraction":"drop_tower"},"name":"Drop Tower"},"attraction/pirate_ship":{"icon":"amusement-park","fields":["name","operator","opening_hours"],"geometry":["point"],"terms":["theme park","carnival ride","amusement ride"],"tags":{"attraction":"pirate_ship"},"name":"Pirate Ship"},"attraction/river_rafting":{"icon":"ferry","fields":["name","operator","opening_hours"],"geometry":["point","line"],"terms":["theme park","aquatic park","water park","rafting simulator","river rafting ride","river rapids ride"],"tags":{"attraction":"river_rafting"},"name":"River Rafting"},"attraction/roller_coaster":{"icon":"amusement-park","fields":["name","operator","opening_hours"],"geometry":["point","area"],"terms":["theme park","amusement ride"],"tags":{"attraction":"roller_coaster"},"name":"Roller Coaster"},"attraction/train":{"icon":"rail","fields":["name","operator","fee","opening_hours"],"geometry":["point","line"],"terms":["theme park","rackless train","road train","Tschu-Tschu train","dotto train","park train"],"tags":{"attraction":"train"},"name":"Tourist Train"},"attraction/water_slide":{"icon":"swimming","fields":["name","operator","opening_hours"],"geometry":["line","area"],"terms":["theme park","aquatic park","water park","flumes","water chutes","hydroslides"],"tags":{"attraction":"water_slide"},"name":"Water Slide"},"barrier":{"icon":"roadblock","geometry":["point","vertex","line","area"],"tags":{"barrier":"*"},"fields":["barrier"],"name":"Barrier","matchScore":0.4},"barrier/entrance":{"icon":"entrance-alt1","geometry":["vertex"],"tags":{"barrier":"entrance"},"name":"Entrance","searchable":false},"barrier/block":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex"],"tags":{"barrier":"block"},"name":"Block"},"barrier/bollard":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex","line"],"tags":{"barrier":"bollard"},"name":"Bollard"},"barrier/border_control":{"icon":"roadblock","fields":["access","building_area"],"geometry":["vertex","area"],"tags":{"barrier":"border_control"},"name":"Border Control"},"barrier/cattle_grid":{"icon":"barrier","geometry":["vertex"],"tags":{"barrier":"cattle_grid"},"name":"Cattle Grid"},"barrier/city_wall":{"icon":"barrier","fields":["height"],"geometry":["line","area"],"tags":{"barrier":"city_wall"},"name":"City Wall"},"barrier/cycle_barrier":{"icon":"roadblock","fields":["access"],"geometry":["vertex"],"tags":{"barrier":"cycle_barrier"},"name":"Cycle Barrier"},"barrier/ditch":{"icon":"roadblock","geometry":["line","area"],"tags":{"barrier":"ditch"},"name":"Trench","matchScore":0.25},"barrier/fence":{"icon":"fence","fields":["fence_type","height"],"geometry":["line"],"tags":{"barrier":"fence"},"name":"Fence","matchScore":0.25},"barrier/gate":{"icon":"barrier","fields":["access"],"geometry":["point","vertex","line"],"tags":{"barrier":"gate"},"name":"Gate"},"barrier/hedge":{"fields":["height"],"geometry":["line","area"],"tags":{"barrier":"hedge"},"name":"Hedge","matchScore":0.25},"barrier/kerb":{"icon":"wheelchair","fields":["kerb","tactile_paving"],"geometry":["vertex","line"],"tags":{"barrier":"kerb"},"name":"Kerb"},"barrier/kissing_gate":{"icon":"barrier","fields":["access"],"geometry":["vertex"],"tags":{"barrier":"kissing_gate"},"name":"Kissing Gate"},"barrier/lift_gate":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex"],"tags":{"barrier":"lift_gate"},"name":"Lift Gate"},"barrier/retaining_wall":{"geometry":["line","area"],"tags":{"barrier":"retaining_wall"},"name":"Retaining Wall"},"barrier/stile":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex"],"tags":{"barrier":"stile"},"name":"Stile"},"barrier/toll_booth":{"icon":"roadblock","fields":["access","building_area"],"geometry":["vertex","area"],"tags":{"barrier":"toll_booth"},"name":"Toll Booth"},"barrier/wall":{"icon":"barrier","fields":["wall","height"],"geometry":["line","area"],"tags":{"barrier":"wall"},"name":"Wall","matchScore":0.25},"boundary/administrative":{"name":"Administrative Boundary","geometry":["line"],"tags":{"boundary":"administrative"},"fields":["name","admin_level"]},"building":{"icon":"home","fields":["name","building","levels","address"],"geometry":["point","area"],"tags":{"building":"*"},"matchScore":0.6,"terms":[],"name":"Building"},"building/bunker":{"fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"bunker"},"matchScore":0.5,"name":"Bunker","searchable":false},"building/entrance":{"icon":"entrance-alt1","geometry":["vertex"],"tags":{"building":"entrance"},"name":"Entrance/Exit","searchable":false},"building/train_station":{"icon":"building","fields":["name","address","levels"],"geometry":["point","vertex","area"],"tags":{"building":"train_station"},"matchScore":0.5,"name":"Train Station","searchable":false},"building/apartments":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"apartments"},"matchScore":0.5,"name":"Apartments"},"building/barn":{"icon":"farm","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"barn"},"matchScore":0.5,"name":"Barn"},"building/boathouse":{"icon":"harbor","fields":["name","levels","address"],"geometry":["area"],"tags":{"building":"boathouse"},"matchScore":0.5,"terms":[],"name":"Boathouse"},"building/bungalow":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"bungalow"},"terms":["home","detached"],"matchScore":0.5,"name":"Bungalow"},"building/cabin":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"cabin"},"matchScore":0.5,"name":"Cabin"},"building/cathedral":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"cathedral"},"matchScore":0.5,"name":"Cathedral Building"},"building/chapel":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"chapel"},"matchScore":0.5,"name":"Chapel Building"},"building/church":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"church"},"matchScore":0.5,"name":"Church Building"},"building/civic":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"civic"},"matchScore":0.5,"name":"Civic Building"},"building/college":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["university"],"tags":{"building":"college"},"matchScore":0.5,"name":"College Building"},"building/commercial":{"icon":"suitcase","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"commercial"},"matchScore":0.5,"name":"Commercial Building"},"building/construction":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"construction"},"matchScore":0.5,"name":"Building Under Construction"},"building/detached":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"detached"},"terms":["home","single","family","residence","dwelling"],"matchScore":0.5,"name":"Detached House"},"building/dormitory":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"dormitory"},"matchScore":0.5,"name":"Dormitory"},"building/farm_auxiliary":{"icon":"farm","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"farm_auxiliary"},"matchScore":0.5,"name":"Farm Building"},"building/farm":{"icon":"farm","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"farm"},"matchScore":0.5,"name":"Farm House"},"building/garage":{"icon":"warehouse","fields":["name","capacity"],"geometry":["area"],"tags":{"building":"garage"},"matchScore":0.5,"name":"Garage"},"building/garages":{"icon":"warehouse","fields":["name","capacity"],"geometry":["area"],"tags":{"building":"garages"},"matchScore":0.5,"name":"Garages"},"building/greenhouse":{"icon":"garden-center","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"greenhouse"},"matchScore":0.5,"name":"Greenhouse"},"building/hospital":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"hospital"},"matchScore":0.5,"name":"Hospital Building"},"building/hotel":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"hotel"},"matchScore":0.5,"name":"Hotel Building"},"building/house":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"house"},"terms":["home","family","residence","dwelling"],"matchScore":0.5,"name":"House"},"building/hut":{"geometry":["area"],"fields":["name"],"tags":{"building":"hut"},"matchScore":0.5,"name":"Hut"},"building/industrial":{"icon":"industry","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"industrial"},"matchScore":0.5,"name":"Industrial Building"},"building/kindergarten":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["kindergarden","pre-school"],"tags":{"building":"kindergarten"},"matchScore":0.5,"name":"Preschool/Kindergarten Building"},"building/mosque":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"mosque"},"matchScore":0.5,"name":"Mosque Building"},"building/public":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"public"},"matchScore":0.5,"name":"Public Building"},"building/residential":{"icon":"residential-community","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"residential"},"matchScore":0.5,"name":"Residential Building"},"building/retail":{"icon":"commercial","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"retail"},"matchScore":0.5,"name":"Retail Building"},"building/roof":{"icon":"shelter","fields":["name","address"],"geometry":["area"],"tags":{"building":"roof"},"matchScore":0.5,"name":"Roof"},"building/ruins":{"icon":"poi-ruins","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"ruins"},"matchScore":0.5,"name":"Building Ruins"},"building/school":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["academy","elementary school","middle school","high school"],"tags":{"building":"school"},"matchScore":0.5,"name":"School Building"},"building/semidetached_house":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"semidetached_house"},"terms":["home","double","duplex","twin","family","residence","dwelling"],"matchScore":0.5,"name":"Semi-Detached House"},"building/service":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"service"},"matchScore":0.5,"name":"Service Building"},"building/shed":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"shed"},"matchScore":0.5,"name":"Shed"},"building/stable":{"icon":"horse-riding","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"stable"},"matchScore":0.5,"name":"Stable"},"building/stadium":{"icon":"stadium","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"stadium"},"matchScore":0.5,"name":"Stadium Building"},"building/static_caravan":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"static_caravan"},"matchScore":0.5,"name":"Static Mobile Home"},"building/temple":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"temple"},"matchScore":0.5,"name":"Temple Building"},"building/terrace":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"terrace"},"terms":["home","terrace","brownstone","family","residence","dwelling"],"matchScore":0.5,"name":"Row Houses"},"building/transportation":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"transportation"},"matchScore":0.5,"name":"Transportation Building"},"building/university":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["college"],"tags":{"building":"university"},"matchScore":0.5,"name":"University Building"},"building/warehouse":{"icon":"warehouse","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"warehouse"},"matchScore":0.5,"name":"Warehouse"},"camp_site/camp_pitch":{"icon":"campsite","fields":["name","ref"],"geometry":["point","area"],"terms":["tent","rv"],"tags":{"camp_site":"camp_pitch"},"name":"Camp Pitch"},"club":{"icon":"heart","fields":["name","club","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"club":"*"},"terms":["social"],"name":"Club"},"craft":{"icon":"poi-tool","fields":["name","craft","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"*"},"terms":[],"name":"Craft"},"craft/jeweler":{"icon":"marker-stroked","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"jeweler"},"reference":{"key":"shop","value":"jewelry"},"name":"Jeweler","searchable":false},"craft/locksmith":{"icon":"marker-stroked","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"locksmith"},"reference":{"key":"shop","value":"locksmith"},"name":"Locksmith","searchable":false},"craft/optician":{"icon":"marker-stroked","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"optician"},"reference":{"key":"shop","value":"optician"},"name":"Optician","searchable":false},"craft/tailor":{"icon":"clothing-store","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["clothes","suit"],"tags":{"craft":"tailor"},"reference":{"key":"shop","value":"tailor"},"name":"Tailor","searchable":false},"craft/basket_maker":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"basket_maker"},"name":"Basket Maker"},"craft/beekeeper":{"icon":"farm","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"beekeeper"},"name":"Beekeeper"},"craft/blacksmith":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"blacksmith"},"name":"Blacksmith"},"craft/boatbuilder":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"boatbuilder"},"matchScore":0.4,"name":"Boat Builder"},"craft/bookbinder":{"icon":"library","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["book repair"],"tags":{"craft":"bookbinder"},"name":"Bookbinder"},"craft/brewery":{"icon":"poi-storage-tank","fields":["name","operator","address","building_area","opening_hours","product"],"geometry":["point","area"],"terms":["alcohol","beer","beverage","bier","booze","cider"],"tags":{"craft":"brewery"},"name":"Brewery"},"craft/carpenter":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["woodworker"],"tags":{"craft":"carpenter"},"name":"Carpenter"},"craft/carpet_layer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"carpet_layer"},"name":"Carpet Layer"},"craft/caterer":{"icon":"restaurant","fields":["name","cuisine","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"caterer"},"name":"Caterer"},"craft/chimney_sweeper":{"icon":"poi-chimney","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"chimney_sweeper"},"name":"Chimney Sweeper"},"craft/clockmaker":{"icon":"poi-clock","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"clockmaker"},"name":"Clockmaker"},"craft/confectionery":{"icon":"bakery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["sweet","candy"],"tags":{"craft":"confectionery"},"name":"Candy Maker"},"craft/distillery":{"icon":"poi-storage-tank","fields":["name","operator","address","building_area","opening_hours","product"],"geometry":["point","area"],"terms":["alcohol","beverage","bourbon","booze","brandy","gin","hooch","liquor","mezcal","moonshine","rum","scotch","spirits","still","tequila","vodka","whiskey","whisky"],"tags":{"craft":"distillery"},"name":"Distillery"},"craft/dressmaker":{"icon":"clothing-store","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["seamstress"],"tags":{"craft":"dressmaker"},"name":"Dressmaker"},"craft/electrician":{"icon":"poi-power","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["power","wire"],"tags":{"craft":"electrician"},"name":"Electrician"},"craft/electronics_repair":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"electronics_repair"},"name":"Electronics Repair Shop"},"craft/gardener":{"icon":"garden","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["landscaper","grounds keeper"],"tags":{"craft":"gardener"},"name":"Gardener"},"craft/glaziery":{"icon":"fire-station","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["glass","stained-glass","window"],"tags":{"craft":"glaziery"},"name":"Glaziery"},"craft/handicraft":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"handicraft"},"name":"Handicraft"},"craft/hvac":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["heat*","vent*","air conditioning"],"tags":{"craft":"hvac"},"name":"HVAC"},"craft/insulator":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"insulation"},"name":"Insulator"},"craft/key_cutter":{"icon":"marker-stroked","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"key_cutter"},"name":"Key Cutter"},"craft/metal_construction":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"metal_construction"},"name":"Metal Construction"},"craft/painter":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"painter"},"name":"Painter"},"craft/photographer":{"icon":"attraction","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"photographer"},"name":"Photographer"},"craft/photographic_laboratory":{"icon":"attraction","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["film"],"tags":{"craft":"photographic_laboratory"},"name":"Photographic Laboratory"},"craft/plasterer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"plasterer"},"name":"Plasterer"},"craft/plumber":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["pipe"],"tags":{"craft":"plumber"},"name":"Plumber"},"craft/pottery":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["ceramic"],"tags":{"craft":"pottery"},"name":"Pottery"},"craft/rigger":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"rigger"},"name":"Rigger"},"craft/roofer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"roofer"},"name":"Roofer"},"craft/saddler":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"saddler"},"name":"Saddler"},"craft/sailmaker":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"sailmaker"},"name":"Sailmaker"},"craft/sawmill":{"icon":"logging","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["lumber"],"tags":{"craft":"sawmill"},"name":"Sawmill"},"craft/scaffolder":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"scaffolder"},"name":"Scaffolder"},"craft/sculptor":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"sculptor"},"name":"Sculptor"},"craft/shoemaker":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["cobbler"],"tags":{"craft":"shoemaker"},"name":"Shoemaker"},"craft/stonemason":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["masonry"],"tags":{"craft":"stonemason"},"name":"Stonemason"},"craft/tiler":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"tiler"},"name":"Tiler"},"craft/tinsmith":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"tinsmith"},"name":"Tinsmith"},"craft/upholsterer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"upholsterer"},"name":"Upholsterer"},"craft/watchmaker":{"icon":"poi-clock","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"watchmaker"},"name":"Watchmaker"},"craft/window_construction":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["glass"],"tags":{"craft":"window_construction"},"name":"Window Construction"},"craft/winery":{"icon":"alcohol-shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"winery"},"name":"Winery"},"embankment":{"geometry":["line"],"tags":{"embankment":"yes"},"name":"Embankment","matchScore":0.2},"emergency/designated":{"fields":[],"geometry":["line"],"tags":{"emergency":"designated"},"terms":[],"name":"Emergency Access Designated","searchable":false,"matchScore":0.01},"emergency/destination":{"fields":[],"geometry":["line"],"tags":{"emergency":"destination"},"terms":[],"name":"Emergency Access Destination","searchable":false,"matchScore":0.01},"emergency/no":{"fields":[],"geometry":["line"],"tags":{"emergency":"no"},"terms":[],"name":"Emergency Access No","searchable":false,"matchScore":0.01},"emergency/official":{"fields":[],"geometry":["line"],"tags":{"emergency":"official"},"terms":[],"name":"Emergency Access Official","searchable":false,"matchScore":0.01},"emergency/private":{"fields":[],"geometry":["line"],"tags":{"emergency":"private"},"terms":[],"name":"Emergency Access Private","searchable":false,"matchScore":0.01},"emergency/yes":{"fields":[],"geometry":["line"],"tags":{"emergency":"yes"},"terms":[],"name":"Emergency Access Yes","searchable":false,"matchScore":0.01},"emergency/ambulance_station":{"icon":"hospital","fields":["name","operator","building_area","address"],"geometry":["point","area"],"terms":["EMS","EMT","rescue"],"tags":{"emergency":"ambulance_station"},"name":"Ambulance Station"},"emergency/defibrillator":{"icon":"defibrillator","fields":["ref","access","opening_hours","indoor","phone"],"geometry":["point","vertex"],"terms":["AED"],"tags":{"emergency":"defibrillator"},"name":"Defibrillator"},"emergency/fire_hydrant":{"icon":"poi-fire-hydrant","fields":["fire_hydrant/type","fire_hydrant/position","ref","operator"],"geometry":["point","vertex"],"terms":["fire plug"],"tags":{"emergency":"fire_hydrant"},"name":"Fire Hydrant"},"emergency/life_ring":{"icon":"circle-stroked","fields":["ref","operator"],"geometry":["point","vertex"],"terms":["life buoy","kisby ring","kisbie ring","perry buoy"],"tags":{"emergency":"life_ring"},"name":"Life Ring"},"emergency/phone":{"icon":"emergency-phone","fields":["operator"],"geometry":["point","vertex"],"tags":{"emergency":"phone"},"name":"Emergency Phone"},"emergency/water_tank":{"icon":"water","fields":["name","operator","ref"],"geometry":["point","vertex"],"terms":["water tank","cistern","reservoir"],"tags":{"emergency":"water_tank"},"name":"Emergency Water Tank"},"entrance":{"icon":"entrance-alt1","geometry":["vertex"],"tags":{"entrance":"*"},"fields":["entrance","access_simple","address"],"name":"Entrance/Exit"},"footway/crossing-raised":{"fields":["crossing","access","surface","kerb","tactile_paving"],"geometry":["line"],"tags":{"highway":"footway","footway":"crossing","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["flat top","hump","speed","slow"],"name":"Raised Street Crossing"},"footway/crossing":{"fields":["crossing","access","surface","kerb","tactile_paving"],"geometry":["line"],"tags":{"highway":"footway","footway":"crossing"},"reference":{"key":"footway","value":"crossing"},"terms":[],"name":"Street Crossing"},"footway/crosswalk-raised":{"icon":"highway-footway","fields":["crossing","access","surface","kerb","tactile_paving"],"geometry":["line"],"tags":{"highway":"footway","footway":"crossing","crossing":"zebra","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["zebra crossing","flat top","hump","speed","slow"],"name":"Raised Pedestrian Crosswalk"},"footway/crosswalk":{"icon":"highway-footway","fields":["crossing","access","surface","kerb","tactile_paving"],"geometry":["line"],"tags":{"highway":"footway","footway":"crossing","crossing":"zebra"},"reference":{"key":"footway","value":"crossing"},"terms":["zebra crossing"],"name":"Pedestrian Crosswalk"},"footway/sidewalk":{"icon":"highway-footway","fields":["surface","lit","width","structure","access"],"geometry":["line"],"tags":{"highway":"footway","footway":"sidewalk"},"reference":{"key":"footway","value":"sidewalk"},"terms":[],"name":"Sidewalk"},"ford":{"geometry":["vertex"],"tags":{"ford":"yes"},"name":"Ford"},"golf/bunker":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"bunker","natural":"sand"},"terms":["hazard","bunker"],"reference":{"key":"golf","value":"bunker"},"name":"Sand Trap"},"golf/fairway":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"fairway","landuse":"grass"},"reference":{"key":"golf","value":"fairway"},"name":"Fairway"},"golf/green":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"green","landuse":"grass","leisure":"pitch","sport":"golf"},"reference":{"key":"golf","value":"green"},"name":"Putting Green"},"golf/hole":{"icon":"golf","fields":["name","ref_golf_hole","par","handicap"],"geometry":["line"],"tags":{"golf":"hole"},"name":"Golf Hole"},"golf/lateral_water_hazard_area":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"lateral_water_hazard","natural":"water"},"reference":{"key":"golf","value":"lateral_water_hazard"},"name":"Lateral Water Hazard"},"golf/lateral_water_hazard_line":{"icon":"golf","fields":["name"],"geometry":["line"],"tags":{"golf":"lateral_water_hazard"},"name":"Lateral Water Hazard"},"golf/rough":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"rough","landuse":"grass"},"reference":{"key":"golf","value":"rough"},"name":"Rough"},"golf/tee":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"tee","landuse":"grass"},"terms":["teeing ground"],"reference":{"key":"golf","value":"tee"},"name":"Tee Box"},"golf/water_hazard_area":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"water_hazard","natural":"water"},"reference":{"key":"golf","value":"water_hazard"},"name":"Water Hazard"},"golf/water_hazard_line":{"icon":"golf","fields":["name"],"geometry":["line"],"tags":{"golf":"water_hazard"},"name":"Water Hazard"},"healthcare":{"icon":"hospital","fields":["name","healthcare","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"healthcare":"*"},"terms":["clinic","doctor","disease","health","institution","sick","surgery","wellness"],"name":"Healthcare Facility"},"healthcare/alternative":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["acupuncture","anthroposophical","applied kinesiology","aromatherapy","ayurveda","herbalism","homeopathy","hydrotherapy","hypnosis","naturopathy","osteopathy","reflexology","reiki","shiatsu","traditional","tuina","unani"],"tags":{"healthcare":"alternative"},"name":"Alternative Medicine"},"healthcare/alternative/chiropractic":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["back","pain","spine"],"tags":{"healthcare":"alternative","healthcare:speciality":"chiropractic"},"name":"Chiropractor"},"healthcare/audiologist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["ear","hearing","sound"],"tags":{"healthcare":"audiologist"},"name":"Audiologist"},"healthcare/birthing_center":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["baby","childbirth","delivery","labour","labor","pregnancy"],"tags":{"healthcare":"birthing_center"},"name":"Birthing Center"},"healthcare/blood_donation":{"icon":"blood-bank","fields":["name","operator","healthcare/speciality","blood_components","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["blood bank","blood donation","blood transfusion","apheresis","plasmapheresis","plateletpheresis","stem cell donation"],"tags":{"healthcare":"blood_donation"},"name":"Blood Donor Center"},"healthcare/hospice":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["terminal","illness"],"tags":{"healthcare":"hospice"},"name":"Hospice"},"healthcare/midwife":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["baby","childbirth","delivery","labour","labor","pregnancy"],"tags":{"healthcare":"midwife"},"name":"Midwife"},"healthcare/occupational_therapist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["therapist","therapy"],"tags":{"healthcare":"occupational_therapist"},"name":"Occupational Therapist"},"healthcare/optometrist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["eye","glasses","lasik","lenses","vision"],"tags":{"healthcare":"optometrist"},"name":"Optometrist"},"healthcare/physiotherapist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["physical","therapist","therapy"],"tags":{"healthcare":"physiotherapist"},"name":"Physiotherapist"},"healthcare/podiatrist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["foot","feet","nails"],"tags":{"healthcare":"podiatrist"},"name":"Podiatrist"},"healthcare/psychotherapist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["anxiety","counselor","depression","mental health","mind","suicide","therapist","therapy"],"tags":{"healthcare":"psychotherapist"},"name":"Psychotherapist"},"healthcare/rehabilitation":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["rehab","therapist","therapy"],"tags":{"healthcare":"rehabilitation"},"name":"Rehabilitation Facility"},"healthcare/speech_therapist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["speech","therapist","therapy","voice"],"tags":{"healthcare":"speech_therapist"},"name":"Speech Therapist"},"highway/bus_stop":{"icon":"bus","fields":["name","network","operator","bench","shelter"],"geometry":["point","vertex"],"tags":{"highway":"bus_stop"},"name":"Bus Stop / Platform","searchable":false},"highway/bridleway":{"fields":["name","surface","width","structure","access"],"icon":"highway-bridleway","geometry":["line"],"tags":{"highway":"bridleway"},"terms":["bridleway","equestrian","horse"],"name":"Bridle Path"},"highway/bus_guideway":{"icon":"highway-bus_guideway","fields":["name","operator","oneway"],"geometry":["line"],"tags":{"highway":"bus_guideway"},"addTags":{"highway":"bus_guideway","access":"no","bus":"designated"},"removeTags":{"highway":"bus_guideway","access":"no","bus":"designated"},"terms":[],"name":"Bus Guideway"},"highway/corridor":{"icon":"highway-footway","fields":["name","width","level","access_simple"],"geometry":["line"],"tags":{"highway":"corridor"},"terms":["gallery","hall","hallway","indoor","passage","passageway"],"name":"Indoor Corridor"},"highway/crossing-raised":{"fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["flat top","hump","speed","slow"],"name":"Raised Street Crossing"},"highway/crossing":{"fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing"},"reference":{"key":"highway","value":"crossing"},"terms":[],"name":"Street Crossing"},"highway/crosswalk-raised":{"icon":"poi-foot","fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing","crossing":"zebra","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["zebra crossing","flat top","hump","speed","slow"],"name":"Raised Pedestrian Crosswalk"},"highway/crosswalk":{"icon":"poi-foot","fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing","crossing":"zebra"},"reference":{"key":"highway","value":"crossing"},"terms":["zebra crossing"],"name":"Pedestrian Crosswalk"},"highway/cycleway":{"icon":"highway-cycleway","fields":["name","oneway","surface","lit","width","structure","access"],"geometry":["line"],"tags":{"highway":"cycleway"},"terms":["bike"],"name":"Cycle Path"},"highway/elevator":{"icon":"poi-elevator","fields":["access_simple","opening_hours","maxweight","ref"],"geometry":["vertex"],"tags":{"highway":"elevator"},"terms":["lift"],"name":"Elevator"},"highway/footway":{"icon":"highway-footway","fields":["name","surface","lit","width","structure","access"],"geometry":["line"],"terms":["hike","hiking","trackway","trail","walk"],"tags":{"highway":"footway"},"name":"Foot Path"},"highway/give_way":{"icon":"poi-yield","fields":["direction_vertex"],"geometry":["vertex"],"tags":{"highway":"give_way"},"terms":["give way","yield","sign"],"name":"Yield Sign"},"highway/living_street":{"icon":"highway-living-street","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","access","cycleway"],"geometry":["line"],"tags":{"highway":"living_street"},"name":"Living Street"},"highway/mini_roundabout":{"icon":"circle-stroked","geometry":["vertex"],"tags":{"highway":"mini_roundabout"},"fields":["direction_clock"],"name":"Mini-Roundabout"},"highway/motorway_junction":{"icon":"poi-junction","geometry":["vertex"],"tags":{"highway":"motorway_junction"},"fields":["ref_highway_junction"],"name":"Motorway Junction / Exit"},"highway/motorway_link":{"icon":"highway-motorway-link","fields":["name","ref_road_number","oneway","maxspeed","lanes","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"motorway_link"},"addTags":{"highway":"motorway_link","oneway":"yes"},"removeTags":{"highway":"motorway_link","oneway":"yes"},"terms":["ramp","on ramp","off ramp"],"name":"Motorway Link"},"highway/motorway":{"icon":"highway-motorway","fields":["name","ref_road_number","oneway_yes","maxspeed","lanes","surface","structure","maxheight","toll","access"],"geometry":["line"],"tags":{"highway":"motorway"},"terms":["autobahn","expressway","freeway","highway","interstate","parkway","thruway","turnpike"],"name":"Motorway"},"highway/path":{"icon":"highway-path","fields":["name","surface","width","structure","access","incline","sac_scale","trail_visibility","mtb/scale","mtb/scale/uphill","mtb/scale/imba","ref"],"geometry":["line"],"terms":["hike","hiking","trackway","trail","walk"],"tags":{"highway":"path"},"name":"Path"},"highway/pedestrian_area":{"icon":"poi-foot","fields":["name","surface","lit","width","structure","access"],"geometry":["area"],"tags":{"highway":"pedestrian","area":"yes"},"terms":["center","centre","plaza","quad","square","walkway"],"name":"Pedestrian Area"},"highway/pedestrian_line":{"icon":"highway-footway","fields":["name","surface","lit","width","oneway","structure","access"],"geometry":["line"],"tags":{"highway":"pedestrian"},"terms":["center","centre","plaza","quad","square","walkway"],"name":"Pedestrian Street"},"highway/primary_link":{"icon":"highway-primary-link","fields":["name","oneway","maxspeed","lanes","surface","maxheight","ref_road_number","cycleway","structure","access"],"geometry":["line"],"tags":{"highway":"primary_link"},"terms":["ramp","on ramp","off ramp"],"name":"Primary Link"},"highway/primary":{"icon":"highway-primary","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"primary"},"terms":[],"name":"Primary Road"},"highway/raceway":{"icon":"highway-unclassified","fields":["name","oneway","surface","sport_racing_motor","lit","width","lanes","structure"],"geometry":["point","line","area"],"tags":{"highway":"raceway"},"addTags":{"highway":"raceway","sport":"motor"},"terms":["auto*","formula one","kart","motocross","nascar","race*","track"],"name":"Racetrack (Motorsport)"},"highway/residential":{"icon":"highway-residential","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","cycleway","access"],"geometry":["line"],"tags":{"highway":"residential"},"terms":[],"name":"Residential Road"},"highway/rest_area":{"icon":"car","fields":["name"],"geometry":["point","vertex","area"],"tags":{"highway":"rest_area"},"terms":["rest stop"],"name":"Rest Area"},"highway/road":{"icon":"highway-road","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"road"},"terms":[],"name":"Unknown Road"},"highway/secondary_link":{"icon":"highway-secondary-link","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"secondary_link"},"terms":["ramp","on ramp","off ramp"],"name":"Secondary Link"},"highway/secondary":{"icon":"highway-secondary","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"secondary"},"terms":[],"name":"Secondary Road"},"highway/service":{"icon":"highway-service","fields":["name","service","oneway","maxspeed","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"service"},"terms":[],"name":"Service Road"},"highway/service/alley":{"icon":"highway-service","fields":["name","oneway","maxspeed","structure","access","surface","maxheight"],"geometry":["line"],"tags":{"highway":"service","service":"alley"},"reference":{"key":"service","value":"alley"},"name":"Alley"},"highway/service/drive-through":{"icon":"highway-service","fields":["name","oneway","covered","maxheight","maxspeed","structure","access","surface"],"geometry":["line"],"tags":{"highway":"service","service":"drive-through"},"reference":{"key":"service","value":"drive-through"},"name":"Drive-Through"},"highway/service/driveway":{"icon":"highway-service","fields":["name","oneway","maxspeed","structure","access","surface","maxheight"],"geometry":["line"],"tags":{"highway":"service","service":"driveway"},"reference":{"key":"service","value":"driveway"},"name":"Driveway"},"highway/service/emergency_access":{"icon":"highway-service","fields":["name","oneway","maxspeed","structure","access","surface","maxheight"],"geometry":["line"],"tags":{"highway":"service","service":"emergency_access"},"reference":{"key":"service","value":"emergency_access"},"name":"Emergency Access"},"highway/service/parking_aisle":{"icon":"highway-service","fields":["name","oneway","maxspeed","structure","access","surface","maxheight"],"geometry":["line"],"tags":{"highway":"service","service":"parking_aisle"},"reference":{"key":"service","value":"parking_aisle"},"name":"Parking Aisle"},"highway/services":{"icon":"car","fields":["name"],"geometry":["point","vertex","area"],"tags":{"highway":"services"},"terms":["services","travel plaza","service station"],"name":"Service Area"},"highway/speed_camera":{"icon":"attraction","geometry":["point","vertex"],"fields":["direction","ref"],"tags":{"highway":"speed_camera"},"terms":[],"name":"Speed Camera"},"highway/steps":{"icon":"highway-steps","fields":["surface","lit","width","incline_steps","handrail","step_count"],"geometry":["line"],"tags":{"highway":"steps"},"terms":["stairs","staircase"],"name":"Steps"},"highway/stop":{"icon":"poi-stop","fields":["stop","direction_vertex"],"geometry":["vertex"],"tags":{"highway":"stop"},"terms":["stop","halt","sign"],"name":"Stop Sign"},"highway/street_lamp":{"icon":"poi-bulb","geometry":["point","vertex"],"tags":{"highway":"street_lamp"},"fields":["lamp_type","direction","ref"],"terms":["streetlight","street light","lamp","light","gaslight"],"name":"Street Lamp"},"highway/tertiary_link":{"icon":"highway-tertiary-link","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"tertiary_link"},"terms":["ramp","on ramp","off ramp"],"name":"Tertiary Link"},"highway/tertiary":{"icon":"highway-tertiary","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"tertiary"},"terms":[],"name":"Tertiary Road"},"highway/track":{"icon":"highway-track","fields":["name","tracktype","surface","width","structure","access","incline","smoothness","mtb/scale","mtb/scale/uphill","mtb/scale/imba"],"geometry":["line"],"tags":{"highway":"track"},"terms":["woods road","forest road","logging road","fire road","farm road","agricultural road","ranch road","carriage road","primitive","unmaintained","rut","offroad","4wd","4x4","four wheel drive","atv","quad","jeep","double track","two track"],"name":"Unmaintained Track Road"},"highway/traffic_mirror":{"geometry":["point","vertex"],"fields":["direction"],"tags":{"highway":"traffic_mirror"},"terms":["blind spot","convex","corner","curved","roadside","round","safety","sphere","visibility"],"name":"Traffic Mirror"},"highway/traffic_signals":{"icon":"poi-traffic-signals","geometry":["vertex"],"tags":{"highway":"traffic_signals"},"fields":["traffic_signals","traffic_signals/direction"],"terms":["light","stoplight","traffic light"],"name":"Traffic Signals"},"highway/trunk_link":{"icon":"highway-trunk-link","fields":["name","ref_road_number","oneway","maxspeed","lanes","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"trunk_link"},"terms":["ramp","on ramp","off ramp"],"name":"Trunk Link"},"highway/trunk":{"icon":"highway-trunk","fields":["name","ref_road_number","oneway","maxspeed","lanes","surface","structure","maxheight","toll","access"],"geometry":["line"],"tags":{"highway":"trunk"},"terms":[],"name":"Trunk Road"},"highway/turning_circle":{"icon":"circle-stroked","geometry":["vertex"],"tags":{"highway":"turning_circle"},"terms":["cul-de-sac"],"name":"Turning Circle"},"highway/turning_loop":{"icon":"circle","geometry":["vertex"],"tags":{"highway":"turning_loop"},"terms":["cul-de-sac"],"name":"Turning Loop (Island)"},"highway/unclassified":{"icon":"highway-unclassified","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","cycleway","access"],"geometry":["line"],"tags":{"highway":"unclassified"},"terms":[],"name":"Minor/Unclassified Road"},"historic":{"icon":"poi-ruins","fields":["historic","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"*"},"name":"Historic Site"},"historic/archaeological_site":{"icon":"poi-ruins","fields":["name","historic/civilization","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"archaeological_site"},"name":"Archaeological Site"},"historic/boundary_stone":{"icon":"poi-milestone","fields":["name","inscription"],"geometry":["point","vertex"],"tags":{"historic":"boundary_stone"},"name":"Boundary Stone"},"historic/castle":{"icon":"castle","fields":["name","castle_type","building_area","historic/civilization"],"geometry":["point","area"],"tags":{"historic":"castle"},"name":"Castle"},"historic/memorial":{"icon":"monument","fields":["name","memorial","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"memorial"},"name":"Memorial"},"historic/monument":{"icon":"monument","fields":["name","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"monument"},"name":"Monument"},"historic/ruins":{"icon":"poi-ruins","fields":["name","historic/civilization","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"ruins"},"name":"Ruins"},"historic/tomb":{"icon":"cemetery","fields":["name","tomb","building_area","inscription"],"geometry":["point","area"],"tags":{"historic":"tomb"},"name":"Tomb"},"historic/wayside_cross":{"icon":"religious-christian","fields":["name","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"wayside_cross"},"name":"Wayside Cross"},"historic/wayside_shrine":{"icon":"landmark","fields":["name","religion","denomination","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"wayside_shrine"},"name":"Wayside Shrine"},"junction":{"icon":"poi-junction","fields":["name"],"geometry":["vertex","area"],"tags":{"junction":"yes"},"name":"Junction"},"landuse":{"fields":["name","landuse"],"geometry":["area"],"tags":{"landuse":"*"},"matchScore":0.9,"name":"Land Use"},"landuse/farm":{"icon":"farm","fields":["name","operator","crop"],"geometry":["point","area"],"tags":{"landuse":"farm"},"terms":[],"name":"Farmland","searchable":false},"landuse/allotments":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"allotments"},"terms":["allotment","garden"],"name":"Community Garden"},"landuse/aquaculture":{"icon":"aquarium","fields":["name","operator","produce"],"geometry":["area"],"tags":{"landuse":"aquaculture"},"terms":["fish farm","crustacean","algae","aquafarming","shrimp farm","oyster farm","mariculture","algaculture"],"name":"Aquaculture"},"landuse/basin":{"icon":"water","fields":["name"],"geometry":["area"],"tags":{"landuse":"basin"},"terms":[],"name":"Basin"},"landuse/brownfield":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"brownfield"},"terms":[],"matchScore":0.9,"name":"Brownfield"},"landuse/cemetery":{"icon":"cemetery","fields":["name","religion","denomination"],"geometry":["area"],"tags":{"landuse":"cemetery"},"terms":[],"name":"Cemetery"},"landuse/churchyard":{"fields":["name","religion","denomination"],"geometry":["area"],"tags":{"landuse":"churchyard"},"terms":[],"name":"Churchyard"},"landuse/commercial":{"icon":"suitcase","fields":["name"],"geometry":["area"],"tags":{"landuse":"commercial"},"terms":[],"matchScore":0.9,"name":"Commercial Area"},"landuse/construction":{"fields":["name","construction","operator"],"geometry":["area"],"tags":{"landuse":"construction"},"terms":[],"name":"Construction"},"landuse/farmland":{"icon":"farm","fields":["name","operator","crop","produce"],"geometry":["area"],"tags":{"landuse":"farmland"},"terms":["crop","grow","plant"],"name":"Farmland"},"landuse/farmyard":{"icon":"farm","fields":["name","operator","crop"],"geometry":["area"],"tags":{"landuse":"farmyard"},"terms":["crop","grow","plant"],"name":"Farmyard"},"landuse/forest":{"icon":"park-alt1","fields":["name","leaf_type","leaf_cycle","produce"],"geometry":["area"],"tags":{"landuse":"forest"},"terms":["tree"],"name":"Forest"},"landuse/garages":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"garages"},"terms":[],"name":"Garage Landuse"},"landuse/grass":{"geometry":["area"],"tags":{"landuse":"grass"},"terms":[],"name":"Grass"},"landuse/greenfield":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"greenfield"},"terms":[],"matchScore":0.9,"name":"Greenfield"},"landuse/greenhouse_horticulture":{"icon":"garden","fields":["name","operator"],"geometry":["area"],"terms":["flower","greenhouse","horticulture","grow","vivero"],"tags":{"landuse":"greenhouse_horticulture"},"matchScore":0.9,"name":"Greenhouse Horticulture"},"landuse/harbour":{"icon":"harbor","fields":["name","operator"],"geometry":["area"],"terms":["boat"],"tags":{"landuse":"harbour"},"name":"Harbor"},"landuse/industrial":{"icon":"industry","fields":["name"],"geometry":["area"],"tags":{"landuse":"industrial"},"terms":[],"matchScore":0.9,"name":"Industrial Area"},"landuse/industrial/scrap_yard":{"icon":"car","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"tags":{"industrial":"scrap_yard"},"addTags":{"landuse":"industrial","industrial":"scrap_yard"},"removeTags":{"landuse":"industrial","industrial":"scrap_yard"},"reference":{"key":"industrial","value":"scrap_yard"},"terms":["car","junk","metal","salvage","scrap","u-pull-it","vehicle","wreck","yard"],"name":"Scrap Yard"},"landuse/industrial/slaughterhouse":{"icon":"slaughterhouse","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"industrial":"slaughterhouse"},"addTags":{"landuse":"industrial","industrial":"slaughterhouse"},"removeTags":{"landuse":"industrial","industrial":"slaughterhouse"},"reference":{"key":"industrial","value":"slaughterhouse"},"terms":["abattoir","beef","butchery","calf","chicken","cow","killing house","meat","pig","pork","poultry","shambles","stockyard"],"name":"Slaughterhouse"},"landuse/landfill":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"landfill"},"terms":["dump"],"name":"Landfill"},"landuse/meadow":{"icon":"garden","geometry":["area"],"fields":["name"],"tags":{"landuse":"meadow"},"terms":[],"name":"Meadow"},"landuse/military":{"icon":"poi-military","fields":["name"],"geometry":["area"],"tags":{"landuse":"military"},"terms":[],"matchScore":0.9,"name":"Military Area"},"landuse/military/airfield":{"icon":"airfield","fields":["name","iata","icao"],"geometry":["point","area"],"tags":{"military":"airfield"},"addTags":{"landuse":"military","military":"airfield"},"removeTags":{"landuse":"military","military":"airfield"},"terms":["air force","army","base","bomb","fight","force","guard","heli*","jet","marine","navy","plane","troop","war"],"name":"Military Airfield"},"landuse/military/barracks":{"icon":"poi-military","fields":["name","building_area"],"geometry":["point","area"],"tags":{"military":"barracks"},"addTags":{"landuse":"military","military":"barracks"},"removeTags":{"landuse":"military","military":"barracks"},"terms":["air force","army","base","fight","force","guard","marine","navy","troop","war"],"name":"Barracks"},"landuse/military/bunker":{"icon":"poi-military","fields":["name","bunker_type","building_area"],"geometry":["point","area"],"tags":{"military":"bunker"},"addTags":{"building":"bunker","landuse":"military","military":"bunker"},"removeTags":{"building":"bunker","landuse":"military","military":"bunker"},"terms":["air force","army","base","fight","force","guard","marine","navy","troop","war"],"name":"Military Bunker"},"landuse/military/checkpoint":{"icon":"barrier","fields":["name"],"geometry":["point","vertex","area"],"tags":{"military":"checkpoint"},"addTags":{"landuse":"military","military":"checkpoint"},"removeTags":{"landuse":"military","military":"checkpoint"},"terms":["air force","army","base","force","guard","marine","navy","troop","war"],"name":"Checkpoint"},"landuse/military/danger_area":{"icon":"danger","fields":["name"],"geometry":["point","vertex","area"],"tags":{"military":"danger_area"},"addTags":{"landuse":"military","military":"danger_area"},"removeTags":{"landuse":"military","military":"danger_area"},"terms":["air force","army","base","blast","bomb","explo*","force","guard","mine","marine","navy","troop","war"],"name":"Danger Area"},"landuse/military/naval_base":{"icon":"poi-military","fields":["name"],"geometry":["point","area"],"tags":{"military":"naval_base"},"addTags":{"landuse":"military","military":"naval_base"},"removeTags":{"landuse":"military","military":"naval_base"},"terms":["base","fight","force","guard","marine","navy","ship","sub","troop","war"],"name":"Naval Base"},"landuse/military/nuclear_explosion_site":{"icon":"danger","fields":["name"],"geometry":["point","vertex","area"],"tags":{"military":"nuclear_explosion_site"},"addTags":{"landuse":"military","military":"nuclear_explosion_site"},"removeTags":{"landuse":"military","military":"nuclear_explosion_site"},"terms":["atom","blast","bomb","detonat*","nuke","site","test"],"name":"Nuclear Explosion Site"},"landuse/military/obstacle_course":{"icon":"poi-military","geometry":["point","area"],"tags":{"military":"obstacle_course"},"addTags":{"landuse":"military","military":"obstacle_course"},"removeTags":{"landuse":"military","military":"obstacle_course"},"terms":["army","base","force","guard","marine","navy","troop","war"],"name":"Obstacle Course"},"landuse/military/office":{"icon":"poi-military","fields":["name","building_area"],"geometry":["point","area"],"tags":{"military":"office"},"addTags":{"landuse":"military","military":"office"},"removeTags":{"landuse":"military","military":"office"},"terms":["air force","army","base","enlist","fight","force","guard","marine","navy","recruit","troop","war"],"name":"Military Office"},"landuse/military/range":{"icon":"poi-military","fields":["name"],"geometry":["point","area"],"tags":{"military":"range"},"addTags":{"landuse":"military","military":"range"},"removeTags":{"landuse":"military","military":"range"},"terms":["air force","army","base","fight","fire","force","guard","gun","marine","navy","rifle","shoot*","snip*","train","troop","war"],"name":"Military Range"},"landuse/military/training_area":{"icon":"poi-military","fields":["name"],"geometry":["point","area"],"tags":{"military":"training_area"},"addTags":{"landuse":"military","military":"training_area"},"removeTags":{"landuse":"military","military":"training_area"},"terms":["air force","army","base","fight","fire","force","guard","gun","marine","navy","rifle","shoot*","snip*","train","troop","war"],"name":"Training Area"},"landuse/orchard":{"icon":"park-alt1","fields":["name","operator","trees"],"geometry":["area"],"tags":{"landuse":"orchard"},"terms":["fruit"],"name":"Orchard"},"landuse/plant_nursery":{"icon":"garden","fields":["name","operator","plant"],"geometry":["area"],"tags":{"landuse":"plant_nursery"},"terms":["flower","garden","grow","vivero"],"name":"Plant Nursery"},"landuse/quarry":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"quarry"},"terms":[],"name":"Quarry"},"landuse/railway":{"icon":"rail","fields":["operator"],"geometry":["area"],"tags":{"landuse":"railway"},"terms":["rail","train","track"],"name":"Railway Corridor"},"landuse/recreation_ground":{"icon":"pitch","geometry":["area"],"fields":["name"],"tags":{"landuse":"recreation_ground"},"terms":["playing fields"],"name":"Recreation Ground"},"landuse/religious":{"geometry":["area"],"fields":["name","religion","denomination"],"tags":{"landuse":"religious"},"terms":[],"name":"Religious Area"},"landuse/residential":{"icon":"building","geometry":["area"],"tags":{"landuse":"residential"},"terms":[],"matchScore":0.9,"name":"Residential Area"},"landuse/retail":{"icon":"commercial","geometry":["area"],"fields":["name"],"tags":{"landuse":"retail"},"matchScore":0.9,"name":"Retail Area"},"landuse/vineyard":{"fields":["name","operator","grape_variety"],"geometry":["area"],"tags":{"landuse":"vineyard"},"addTags":{"landuse":"vineyard","crop":"grape"},"removeTags":{"landuse":"vineyard","crop":"grape","grape_variety":"*"},"terms":["grape","wine"],"name":"Vineyard"},"leisure":{"icon":"pitch","fields":["name","leisure"],"geometry":["point","vertex","area"],"tags":{"leisure":"*"},"name":"Leisure"},"leisure/adult_gaming_centre":{"icon":"poi-dice","fields":["name","operator","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"terms":["gambling","slot machine"],"tags":{"leisure":"adult_gaming_centre"},"name":"Adult Gaming Center"},"leisure/amusement_arcade":{"icon":"gaming","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["pay-to-play games","video games","driving simulators","pinball machines"],"tags":{"leisure":"amusement_arcade"},"name":"Amusement Arcade"},"leisure/bird_hide":{"icon":"poi-binoculars","fields":["building_area"],"geometry":["point","area"],"tags":{"leisure":"bird_hide"},"terms":["machan","ornithology"],"name":"Bird Hide"},"leisure/bowling_alley":{"icon":"poi-bowling","fields":["name","operator","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"terms":["bowling center"],"tags":{"leisure":"bowling_alley"},"name":"Bowling Alley"},"leisure/common":{"icon":"poi-foot","geometry":["point","area"],"fields":["name"],"terms":["open space"],"tags":{"leisure":"common"},"name":"Common"},"leisure/dance":{"icon":"music","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["ballroom","jive","swing","tango","waltz"],"tags":{"leisure":"dance"},"name":"Dance Hall"},"leisure/dancing_school":{"icon":"music","fields":["name","operator","address","opening_hours","dance/style"],"geometry":["point","area"],"terms":["jive","swing","tango","waltz","dance teaching"],"tags":{"leisure":"dance","dance:teaching":"yes"},"reference":{"key":"leisure","value":"dance"},"name":"Dance School"},"leisure/dog_park":{"icon":"dog-park","geometry":["point","area"],"fields":["name"],"terms":[],"tags":{"leisure":"dog_park"},"name":"Dog Park"},"leisure/firepit":{"icon":"fire-station","geometry":["point","area"],"tags":{"leisure":"firepit"},"terms":["fireplace","campfire"],"name":"Firepit"},"leisure/fitness_centre":{"icon":"pitch","fields":["name","sport","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_centre"},"terms":["health","gym","leisure","studio"],"name":"Gym / Fitness Center"},"leisure/fitness_centre/yoga":{"icon":"pitch","fields":["name","sport","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["studio"],"tags":{"leisure":"fitness_centre","sport":"yoga"},"reference":{"key":"sport","value":"yoga"},"name":"Yoga Studio"},"leisure/fitness_station":{"icon":"pitch","fields":["fitness_station","ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station"},"addTags":{"leisure":"fitness_station","sport":"fitness"},"removeTags":{"leisure":"fitness_station","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["exercise","fitness","gym","trim trail"],"name":"Outdoor Fitness Station"},"leisure/fitness_station/balance_beam":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"balance_beam"},"addTags":{"leisure":"fitness_station","fitness_station":"balance_beam","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"balance_beam","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["balance","exercise","fitness","gym","trim trail"],"name":"Exercise Balance Beam"},"leisure/fitness_station/box":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"box"},"addTags":{"leisure":"fitness_station","fitness_station":"box","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"box","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["box","exercise","fitness","gym","jump","trim trail"],"name":"Exercise Box"},"leisure/fitness_station/horizontal_bar":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"horizontal_bar"},"addTags":{"leisure":"fitness_station","fitness_station":"horizontal_bar","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"horizontal_bar","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["bar","chinup","chin up","exercise","fitness","gym","pullup","pull up","trim trail"],"name":"Exercise Horizontal Bar"},"leisure/fitness_station/horizontal_ladder":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"horizontal_ladder"},"addTags":{"leisure":"fitness_station","fitness_station":"horizontal_ladder","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"horizontal_ladder","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["bar","chinup","chin up","exercise","fitness","gym","ladder","monkey bars","pullup","pull up","trim trail"],"name":"Exercise Monkey Bars"},"leisure/fitness_station/hyperextension":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"hyperextension"},"addTags":{"leisure":"fitness_station","fitness_station":"hyperextension","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"hyperextension","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["back","exercise","extension","fitness","gym","roman chair","trim trail"],"name":"Hyperextension Station"},"leisure/fitness_station/parallel_bars":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"parallel_bars"},"addTags":{"leisure":"fitness_station","fitness_station":"parallel_bars","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"parallel_bars","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["bar","dip","exercise","fitness","gym","trim trail"],"name":"Parallel Bars"},"leisure/fitness_station/push-up":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"push-up"},"addTags":{"leisure":"fitness_station","fitness_station":"push-up","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"push-up","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["bar","exercise","fitness","gym","pushup","push up","trim trail"],"name":"Push-Up Station"},"leisure/fitness_station/rings":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"rings"},"addTags":{"leisure":"fitness_station","fitness_station":"rings","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"rings","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["exercise","fitness","gym","muscle up","pullup","pull up","trim trail"],"name":"Exercise Rings"},"leisure/fitness_station/sign":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"sign"},"addTags":{"leisure":"fitness_station","fitness_station":"sign","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"sign","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["exercise","fitness","gym","trim trail"],"name":"Exercise Instruction Sign"},"leisure/fitness_station/sit-up":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"sit-up"},"addTags":{"leisure":"fitness_station","fitness_station":"sit-up","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"sit-up","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["crunch","exercise","fitness","gym","situp","sit up","trim trail"],"name":"Sit-Up Station"},"leisure/fitness_station/stairs":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"stairs"},"addTags":{"leisure":"fitness_station","fitness_station":"stairs","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"stairs","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["exercise","fitness","gym","steps","trim trail"],"name":"Exercise Stairs"},"leisure/garden":{"icon":"garden","fields":["name","access_simple"],"geometry":["point","vertex","area"],"tags":{"leisure":"garden"},"name":"Garden"},"leisure/golf_course":{"icon":"golf","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["links"],"tags":{"leisure":"golf_course"},"name":"Golf Course"},"leisure/hackerspace":{"icon":"commercial","fields":["name","address","building_area","opening_hours","website"],"geometry":["point","area"],"terms":["makerspace","hackspace","hacklab"],"tags":{"leisure":"hackerspace"},"name":"Hackerspace"},"leisure/horse_riding":{"icon":"horse-riding","fields":["name","access_simple","operator","address","building"],"geometry":["point","area"],"terms":["equestrian","stable"],"tags":{"leisure":"horse_riding"},"name":"Horseback Riding Facility"},"leisure/ice_rink":{"icon":"pitch","fields":["name","seasonal","sport_ice","operator","address","building","opening_hours"],"geometry":["point","area"],"terms":["hockey","skating","curling"],"tags":{"leisure":"ice_rink"},"name":"Ice Rink"},"leisure/marina":{"icon":"harbor","fields":["name","operator","address","capacity","fee","sanitary_dump_station","power_supply","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","vertex","area"],"terms":["boat"],"tags":{"leisure":"marina"},"name":"Marina"},"leisure/miniature_golf":{"icon":"golf","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["crazy golf","mini golf","putt-putt"],"tags":{"leisure":"miniature_golf"},"name":"Miniature Golf"},"leisure/nature_reserve":{"icon":"park","geometry":["point","area"],"fields":["name"],"tags":{"leisure":"nature_reserve"},"terms":["protected","wildlife"],"name":"Nature Reserve"},"leisure/park":{"icon":"park","geometry":["point","area"],"fields":["name"],"terms":["esplanade","estate","forest","garden","grass","green","grounds","lawn","lot","meadow","parkland","place","playground","plaza","pleasure garden","recreation area","square","tract","village green","woodland"],"tags":{"leisure":"park"},"name":"Park"},"leisure/picnic_table":{"icon":"picnic-site","geometry":["point"],"tags":{"leisure":"picnic_table"},"terms":["bench"],"name":"Picnic Table"},"leisure/pitch":{"icon":"pitch","fields":["name","sport","surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch"},"terms":["field"],"name":"Sport Pitch"},"leisure/pitch/american_football":{"icon":"america-football","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"american_football"},"reference":{"key":"sport","value":"american_football"},"terms":[],"name":"American Football Field"},"leisure/pitch/baseball":{"icon":"baseball","fields":["lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"baseball"},"reference":{"key":"sport","value":"baseball"},"terms":[],"name":"Baseball Diamond"},"leisure/pitch/basketball":{"icon":"basketball","fields":["surface","hoops","lit","access_simple"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"basketball"},"reference":{"key":"sport","value":"basketball"},"terms":[],"name":"Basketball Court"},"leisure/pitch/beachvolleyball":{"icon":"basketball","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"beachvolleyball"},"addTags":{"leisure":"pitch","sport":"beachvolleyball","surface":"sand"},"removeTags":{"leisure":"pitch","sport":"beachvolleyball","surface":"sand"},"reference":{"key":"sport","value":"beachvolleyball"},"terms":["volleyball"],"name":"Beach Volleyball Court"},"leisure/pitch/boules":{"icon":"pitch","fields":["boules","surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"boules"},"reference":{"key":"sport","value":"boules"},"terms":["bocce","lyonnaise","pétanque"],"name":"Boules/Bocce Court"},"leisure/pitch/bowls":{"icon":"pitch","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"bowls"},"reference":{"key":"sport","value":"bowls"},"terms":[],"name":"Bowling Green"},"leisure/pitch/cricket":{"icon":"cricket","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"cricket"},"reference":{"key":"sport","value":"cricket"},"terms":[],"name":"Cricket Field"},"leisure/pitch/equestrian":{"icon":"horse-riding","fields":["surface","lit","building"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"equestrian"},"reference":{"key":"sport","value":"equestrian"},"terms":["dressage","equestrian","horse","horseback","riding"],"name":"Riding Arena"},"leisure/pitch/rugby_league":{"icon":"america-football","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"rugby_league"},"reference":{"key":"sport","value":"rugby_league"},"terms":[],"name":"Rugby League Field"},"leisure/pitch/rugby_union":{"icon":"america-football","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"rugby_union"},"reference":{"key":"sport","value":"rugby_union"},"terms":[],"name":"Rugby Union Field"},"leisure/pitch/skateboard":{"icon":"pitch","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"skateboard"},"reference":{"key":"sport","value":"skateboard"},"terms":[],"name":"Skate Park"},"leisure/pitch/soccer":{"icon":"soccer","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"soccer"},"reference":{"key":"sport","value":"soccer"},"terms":["football"],"name":"Soccer Field"},"leisure/pitch/table_tennis":{"icon":"tennis","fields":["lit","access_simple"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"table_tennis"},"reference":{"key":"sport","value":"table_tennis"},"terms":["table tennis","ping pong"],"name":"Ping Pong Table"},"leisure/pitch/tennis":{"icon":"tennis","fields":["surface","lit","access_simple"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"tennis"},"reference":{"key":"sport","value":"tennis"},"terms":[],"name":"Tennis Court"},"leisure/pitch/volleyball":{"icon":"basketball","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"volleyball"},"reference":{"key":"sport","value":"volleyball"},"terms":[],"name":"Volleyball Court"},"leisure/playground":{"icon":"playground","fields":["name","operator","surface","playground/max_age","playground/min_age","access_simple"],"geometry":["point","area"],"terms":["jungle gym","play area"],"tags":{"leisure":"playground"},"name":"Playground"},"leisure/resort":{"icon":"lodging","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"resort"},"name":"Resort"},"leisure/running_track":{"icon":"pitch","fields":["surface","sport_racing_nonmotor","lit","width","lanes"],"geometry":["point","line","area"],"tags":{"leisure":"track","sport":"running"},"terms":["race*","running","sprint","track"],"name":"Racetrack (Running)"},"leisure/sauna":{"fields":["name","operator","address","opening_hours","access_simple","fee"],"geometry":["point","area"],"tags":{"leisure":"sauna"},"name":"Sauna"},"leisure/slipway":{"icon":"poi-beach","geometry":["point","line"],"terms":["boat launch","boat ramp"],"tags":{"leisure":"slipway"},"name":"Slipway"},"leisure/sports_centre":{"icon":"pitch","fields":["name","sport","building","address","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"sports_centre"},"terms":[],"name":"Sports Center / Complex"},"leisure/sports_centre/swimming":{"icon":"swimming","fields":["name","access_simple","operator","address","building"],"geometry":["point","area"],"terms":["dive","water"],"tags":{"leisure":"sports_centre","sport":"swimming"},"reference":{"key":"sport","value":"swimming"},"name":"Swimming Pool Facility"},"leisure/stadium":{"icon":"pitch","fields":["name","sport","address"],"geometry":["point","area"],"tags":{"leisure":"stadium"},"name":"Stadium"},"leisure/swimming_pool":{"icon":"swimming","fields":["name","access_simple","operator","address"],"geometry":["point","area"],"terms":["dive","water"],"tags":{"leisure":"swimming_pool"},"name":"Swimming Pool"},"leisure/track":{"icon":"highway-road","fields":["surface","sport_racing_nonmotor","lit","width","lanes"],"geometry":["point","line","area"],"tags":{"leisure":"track"},"terms":["cycle","dog","greyhound","horse","race*","track"],"name":"Racetrack (Non-Motorsport)"},"leisure/water_park":{"icon":"swimming","fields":["name","operator","address"],"geometry":["point","area"],"terms":["swim","pool","dive"],"tags":{"leisure":"water_park"},"name":"Water Park"},"line":{"fields":["name"],"geometry":["line"],"tags":{},"name":"Line","matchScore":0.1},"man_made":{"icon":"poi-storage-tank","fields":["name","man_made"],"geometry":["point","vertex","line","area"],"tags":{"man_made":"*"},"name":"Man Made"},"man_made/embankment":{"geometry":["line"],"tags":{"man_made":"embankment"},"name":"Embankment","searchable":false},"man_made/adit":{"icon":"triangle","geometry":["point","area"],"fields":["operator","direction"],"terms":["entrance","underground","mine","cave"],"tags":{"man_made":"adit"},"name":"Adit"},"man_made/breakwater":{"geometry":["line","area"],"tags":{"man_made":"breakwater"},"name":"Breakwater"},"man_made/bridge":{"geometry":["area"],"tags":{"man_made":"bridge"},"name":"Bridge"},"man_made/chimney":{"icon":"poi-chimney","geometry":["point","area"],"tags":{"man_made":"chimney"},"name":"Chimney"},"man_made/crane":{"icon":"poi-crane","fields":["operator","height","crane/type"],"geometry":["point","line","vertex","area"],"tags":{"man_made":"crane"},"name":"Crane"},"man_made/cutline":{"geometry":["line"],"tags":{"man_made":"cutline"},"name":"Cut line"},"man_made/flagpole":{"icon":"embassy","geometry":["point"],"tags":{"man_made":"flagpole"},"name":"Flagpole"},"man_made/gasometer":{"icon":"poi-storage-tank","geometry":["point","area"],"terms":["gas holder"],"tags":{"man_made":"gasometer"},"name":"Gasometer"},"man_made/groyne":{"geometry":["line","area"],"tags":{"man_made":"groyne"},"name":"Groyne"},"man_made/lighthouse":{"icon":"lighthouse","fields":["building_area"],"geometry":["point","area"],"tags":{"man_made":"lighthouse"},"name":"Lighthouse"},"man_made/mast":{"icon":"poi-mast","fields":["tower/type","tower/construction","height","communication_multi"],"geometry":["point"],"terms":["antenna","broadcast tower","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","radio mast","radio tower","television tower","transmission mast","transmission tower","tv tower"],"tags":{"man_made":"mast"},"name":"Mast"},"man_made/monitoring_station":{"icon":"poi-mast","geometry":["point","area"],"fields":["monitoring_multi","operator"],"terms":["weather","earthquake","seismology","air","gps"],"tags":{"man_made":"monitoring_station"},"name":"Monitoring Station"},"man_made/observation":{"icon":"poi-tower","geometry":["point","area"],"terms":["lookout tower","fire tower"],"tags":{"man_made":"tower","tower:type":"observation"},"name":"Observation Tower"},"man_made/petroleum_well":{"icon":"poi-storage-tank","geometry":["point"],"terms":["drilling rig","oil derrick","oil drill","oil horse","oil rig","oil pump","petroleum well","pumpjack"],"tags":{"man_made":"petroleum_well"},"name":"Oil Well"},"man_made/pier":{"geometry":["line","area"],"terms":["dock","jetty"],"tags":{"man_made":"pier"},"name":"Pier"},"man_made/pipeline":{"icon":"pipeline-line","fields":["location","operator","substance"],"geometry":["line"],"tags":{"man_made":"pipeline"},"name":"Pipeline"},"man_made/pumping_station":{"icon":"water","geometry":["point","area"],"tags":{"man_made":"pumping_station"},"name":"Pumping Station"},"man_made/silo":{"icon":"poi-silo","fields":["building_area","crop"],"geometry":["point","area"],"terms":["grain","corn","wheat"],"tags":{"man_made":"silo"},"name":"Silo"},"man_made/storage_tank":{"icon":"poi-storage-tank","fields":["building_area","content"],"geometry":["point","area"],"terms":["water","oil","gas","petrol"],"tags":{"man_made":"storage_tank"},"name":"Storage Tank"},"man_made/surveillance_camera":{"icon":"attraction","geometry":["point","vertex"],"fields":["surveillance","surveillance/type","camera/type","camera/mount","camera/direction","surveillance/zone","contact/webcam"],"terms":["anpr","alpr","camera","car plate recognition","cctv","guard","license plate recognition","monitoring","number plate recognition","security","video","webcam"],"tags":{"man_made":"surveillance","surveillance:type":"camera"},"name":"Surveillance Camera"},"man_made/surveillance":{"icon":"attraction","geometry":["point","vertex"],"fields":["surveillance","surveillance/type","surveillance/zone","direction"],"terms":["anpr","alpr","camera","car plate recognition","cctv","guard","license plate recognition","monitoring","number plate recognition","security","video","webcam"],"tags":{"man_made":"surveillance"},"name":"Surveillance"},"man_made/survey_point":{"icon":"monument","fields":["ref"],"geometry":["point","vertex"],"terms":["trig point","triangulation pillar","trigonometrical station"],"tags":{"man_made":"survey_point"},"name":"Survey Point"},"man_made/tower":{"icon":"poi-tower","fields":["tower/type","tower/construction","height"],"geometry":["point","area"],"tags":{"man_made":"tower"},"name":"Tower"},"man_made/wastewater_plant":{"icon":"water","fields":["name","operator","address"],"geometry":["point","area"],"terms":["sewage*","water treatment plant","reclamation plant"],"tags":{"man_made":"wastewater_plant"},"name":"Wastewater Plant"},"man_made/water_tower":{"icon":"water","fields":["operator"],"geometry":["point","area"],"tags":{"man_made":"water_tower"},"name":"Water Tower"},"man_made/water_well":{"icon":"water","fields":["operator"],"geometry":["point","area"],"tags":{"man_made":"water_well"},"name":"Water Well"},"man_made/water_works":{"icon":"water","fields":["name","operator","address"],"geometry":["point","area"],"tags":{"man_made":"water_works"},"name":"Water Works"},"man_made/watermill":{"icon":"buddhism","fields":["building_area"],"geometry":["point","area"],"terms":["water","wheel","mill"],"tags":{"man_made":"watermill"},"name":"Watermill"},"man_made/windmill":{"icon":"poi-windmill","fields":["building_area"],"geometry":["point","area"],"terms":["wind","wheel","mill"],"tags":{"man_made":"windmill"},"name":"Windmill"},"man_made/works":{"icon":"industry","fields":["name","operator","address","building_area","product"],"geometry":["point","area"],"terms":["assembly","build","brewery","car","plant","plastic","processing","manufacture","refinery"],"tags":{"man_made":"works"},"name":"Factory"},"manhole":{"icon":"circle-stroked","fields":["manhole","operator","label","ref"],"geometry":["point","vertex"],"tags":{"manhole":"*"},"terms":["cover","hole","sewer","sewage","telecom"],"name":"Manhole"},"manhole/drain":{"icon":"water","fields":["operator","ref"],"geometry":["point","vertex"],"tags":{"manhole":"drain"},"terms":["cover","drain","hole","rain","sewer","sewage","storm"],"name":"Storm Drain"},"manhole/telecom":{"icon":"circle-stroked","fields":["operator","ref"],"geometry":["point","vertex"],"tags":{"manhole":"telecom"},"terms":["cover","phone","hole","telecom","telephone","bt"],"name":"Telecom Manhole"},"natural":{"icon":"natural","fields":["name","natural"],"geometry":["point","vertex","area"],"tags":{"natural":"*"},"name":"Natural"},"natural/bare_rock":{"geometry":["area"],"tags":{"natural":"bare_rock"},"terms":["rock"],"name":"Bare Rock"},"natural/bay":{"icon":"poi-beach","geometry":["point","area"],"fields":["name"],"tags":{"natural":"bay"},"terms":[],"name":"Bay"},"natural/beach":{"icon":"poi-beach","fields":["surface"],"geometry":["point","area"],"tags":{"natural":"beach"},"terms":["shore"],"name":"Beach"},"natural/cave_entrance":{"icon":"triangle","geometry":["point","area"],"fields":["fee","access_simple","direction"],"tags":{"natural":"cave_entrance"},"terms":["cavern","hollow","grotto","shelter","cavity"],"name":"Cave Entrance"},"natural/cliff":{"icon":"triangle","geometry":["point","vertex","line","area"],"tags":{"natural":"cliff"},"terms":["escarpment"],"name":"Cliff"},"natural/coastline":{"geometry":["line"],"tags":{"natural":"coastline"},"terms":["shore"],"name":"Coastline"},"natural/fell":{"geometry":["area"],"tags":{"natural":"fell"},"terms":[],"name":"Fell"},"natural/glacier":{"geometry":["area"],"tags":{"natural":"glacier"},"terms":[],"name":"Glacier"},"natural/grassland":{"geometry":["area"],"tags":{"natural":"grassland"},"terms":["prairie","savanna"],"name":"Grassland"},"natural/heath":{"geometry":["area"],"tags":{"natural":"heath"},"terms":[],"name":"Heath"},"natural/peak":{"icon":"mountain","fields":["name","elevation"],"geometry":["point","vertex"],"tags":{"natural":"peak"},"terms":["acme","aiguille","alp","climax","crest","crown","hill","mount","mountain","pinnacle","summit","tip","top"],"name":"Peak"},"natural/ridge":{"geometry":["line"],"tags":{"natural":"ridge"},"terms":["crest"],"name":"Ridge"},"natural/saddle":{"icon":"triangle-stroked","fields":["elevation"],"geometry":["point","vertex"],"tags":{"natural":"saddle"},"terms":["pass","mountain pass","top"],"name":"Saddle"},"natural/sand":{"geometry":["area"],"tags":{"natural":"sand"},"terms":["desert"],"name":"Sand"},"natural/scree":{"geometry":["area"],"tags":{"natural":"scree"},"terms":["loose rocks"],"name":"Scree"},"natural/scrub":{"geometry":["area"],"tags":{"natural":"scrub"},"terms":["bush","shrubs"],"name":"Scrub"},"natural/spring":{"icon":"water","fields":["name","intermittent"],"geometry":["point","vertex"],"tags":{"natural":"spring"},"terms":[],"name":"Spring"},"natural/tree_row":{"icon":"park","fields":["leaf_type","leaf_cycle","denotation"],"geometry":["line"],"tags":{"natural":"tree_row"},"terms":[],"name":"Tree row"},"natural/tree":{"icon":"park","fields":["leaf_type_singular","leaf_cycle_singular","denotation"],"geometry":["point","vertex"],"tags":{"natural":"tree"},"terms":[],"name":"Tree"},"natural/volcano":{"icon":"volcano","fields":["name","elevation","volcano/status","volcano/type"],"geometry":["point","vertex"],"tags":{"natural":"volcano"},"terms":["mountain","crater"],"name":"Volcano"},"natural/water":{"icon":"water","fields":["water"],"geometry":["area"],"tags":{"natural":"water"},"name":"Water"},"natural/water/lake":{"icon":"water","fields":["name","intermittent"],"geometry":["area"],"tags":{"natural":"water","water":"lake"},"reference":{"key":"natural","value":"water"},"terms":["lakelet","loch","mere"],"name":"Lake"},"natural/water/pond":{"icon":"water","fields":["name","intermittent"],"geometry":["area"],"tags":{"natural":"water","water":"pond"},"reference":{"key":"natural","value":"water"},"terms":["lakelet","millpond","tarn","pool","mere"],"name":"Pond"},"natural/water/reservoir":{"icon":"water","fields":["name","intermittent"],"geometry":["area"],"tags":{"natural":"water","water":"reservoir"},"reference":{"key":"natural","value":"water"},"name":"Reservoir"},"natural/wetland":{"icon":"wetland","fields":["wetland"],"geometry":["point","area"],"tags":{"natural":"wetland"},"terms":["bog","marsh","reedbed","swamp","tidalflat"],"name":"Wetland"},"natural/wood":{"icon":"park-alt1","fields":["name","leaf_type","leaf_cycle"],"geometry":["point","area"],"tags":{"natural":"wood"},"terms":["tree"],"name":"Wood"},"noexit/yes":{"icon":"barrier","geometry":["vertex"],"terms":["no exit","road end","dead end"],"tags":{"noexit":"yes"},"reference":{"key":"noexit","value":"*"},"name":"No Exit"},"office":{"icon":"suitcase","fields":["name","office","address","building_area","opening_hours","smoking"],"geometry":["point","vertex","area"],"tags":{"office":"*"},"terms":[],"name":"Office"},"office/administrative":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"administrative"},"terms":[],"searchable":false,"name":"Administrative Office"},"office/physician":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"physician"},"searchable":false,"name":"Physician"},"office/travel_agent":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"travel_agent"},"reference":{"key":"shop","value":"travel_agency"},"terms":[],"name":"Travel Agency","searchable":false},"office/accountant":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"accountant"},"terms":[],"name":"Accountant Office"},"office/adoption_agency":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"adoption_agency"},"terms":[],"name":"Adoption Agency"},"office/advertising_agency":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"advertising_agency"},"terms":["ad","ad agency","advert agency","advertising","marketing"],"name":"Advertising Agency"},"office/architect":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"architect"},"terms":[],"name":"Architect Office"},"office/association":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"association"},"terms":["association","non-profit","nonprofit","organization","society"],"name":"Nonprofit Organization Office"},"office/charity":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"charity"},"terms":["charitable organization"],"name":"Charity Office"},"office/company":{"icon":"suitcase","fields":["name","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"tags":{"office":"company"},"terms":[],"name":"Corporate Office"},"office/coworking":{"icon":"suitcase","fields":["name","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"terms":["coworking","office"],"tags":{"office":"coworking"},"reference":{"key":"amenity","value":"coworking_space"},"name":"Coworking Space"},"office/educational_institution":{"icon":"school","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"educational_institution"},"terms":[],"name":"Educational Institution"},"office/employment_agency":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"employment_agency"},"terms":["job"],"name":"Employment Agency"},"office/energy_supplier":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"energy_supplier"},"terms":["electricity","energy company","energy utility","gas utility"],"name":"Energy Supplier Office"},"office/estate_agent":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"estate_agent"},"terms":[],"name":"Real Estate Office"},"office/financial":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"financial"},"terms":[],"name":"Financial Office"},"office/forestry":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"forestry"},"terms":["forest","ranger"],"name":"Forestry Office"},"office/foundation":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"foundation"},"terms":[],"name":"Foundation Office"},"office/government":{"icon":"town-hall","fields":["name","government","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"government"},"terms":[],"name":"Government Office"},"office/government/register_office":{"icon":"town-hall","fields":["name","address","building_area","opening_hours","operator"],"geometry":["point","area"],"terms":["clerk","marriage","death","birth","certificate"],"tags":{"office":"government","government":"register_office"},"reference":{"key":"government","value":"register_office"},"name":"Register Office"},"office/government/tax":{"icon":"town-hall","fields":["name","address","building_area","opening_hours","operator"],"geometry":["point","area"],"terms":["fiscal authorities","revenue office","tax office"],"tags":{"office":"government","government":"tax"},"reference":{"key":"government","value":"tax"},"name":"Tax and Revenue Office"},"office/guide":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"guide"},"terms":["dive guide","mountain guide","tour guide"],"name":"Tour Guide Office"},"office/insurance":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"insurance"},"terms":[],"name":"Insurance Office"},"office/it":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"it"},"terms":["computer","information","software","technology"],"name":"Information Technology Office"},"office/lawyer":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"lawyer"},"terms":[],"name":"Law Office"},"office/lawyer/notary":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"lawyer","lawyer":"notary"},"reference":{"key":"office","value":"notary"},"searchable":false,"name":"Notary Office"},"office/moving_company":{"icon":"warehouse","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"moving_company"},"terms":["relocation"],"name":"Moving Company Office"},"office/newspaper":{"icon":"library","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"newspaper"},"terms":[],"name":"Newspaper Office"},"office/ngo":{"icon":"suitcase","fields":["name","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"tags":{"office":"ngo"},"terms":["ngo","non government","non-government","organization","organisation"],"name":"NGO Office"},"office/notary":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"notary"},"terms":["clerk","deeds","estate","signature","wills"],"name":"Notary Office"},"office/political_party":{"icon":"town-hall","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"political_party"},"terms":[],"name":"Political Party"},"office/private_investigator":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"private_investigator"},"terms":["PI","private eye","private detective"],"name":"Private Investigator Office"},"office/quango":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"quango"},"terms":["ngo","non government","non-government","organization","organisation","quasi autonomous","quasi-autonomous"],"name":"Quasi-NGO Office"},"office/research":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"research"},"terms":[],"name":"Research Office"},"office/surveyor":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"surveyor"},"terms":[],"name":"Surveyor Office"},"office/tax_advisor":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"tax_advisor"},"terms":["tax","tax consultant"],"name":"Tax Advisor Office"},"office/telecommunication":{"icon":"telephone","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"telecommunication"},"terms":["communication","internet","phone","voice"],"name":"Telecom Office"},"office/therapist":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"therapist"},"terms":["therapy"],"name":"Therapist Office"},"office/water_utility":{"icon":"suitcase","fields":["name","address","building_area","opening_hours","operator"],"geometry":["point","area"],"tags":{"office":"water_utility"},"terms":["water board","utility"],"name":"Water Utility Office"},"piste":{"icon":"skiing","fields":["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],"geometry":["point","line","area"],"terms":["ski","sled","sleigh","snowboard","nordic","downhill","snowmobile"],"tags":{"piste:type":"*"},"name":"Piste/Ski Trail"},"place/farm":{"icon":"farm","geometry":["point","area"],"fields":["name"],"tags":{"place":"farm"},"name":"Farm","searchable":false},"place/city":{"icon":"city","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"city"},"name":"City"},"place/hamlet":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"hamlet"},"name":"Hamlet"},"place/island":{"icon":"mountain","geometry":["point","area"],"fields":["name"],"terms":["archipelago","atoll","bar","cay","isle","islet","key","reef"],"tags":{"place":"island"},"name":"Island"},"place/islet":{"icon":"mountain","geometry":["point","area"],"fields":["name"],"terms":["archipelago","atoll","bar","cay","isle","islet","key","reef"],"tags":{"place":"islet"},"name":"Islet"},"place/isolated_dwelling":{"icon":"home","geometry":["point","area"],"fields":["name"],"tags":{"place":"isolated_dwelling"},"name":"Isolated Dwelling"},"place/locality":{"icon":"triangle-stroked","geometry":["point","area"],"fields":["name"],"tags":{"place":"locality"},"name":"Locality"},"place/neighbourhood":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"neighbourhood"},"terms":["neighbourhood"],"name":"Neighborhood"},"place/plot":{"icon":"triangle-stroked","fields":["name"],"geometry":["point","area"],"tags":{"place":"plot"},"terms":["tract","land","lot","parcel"],"name":"Plot"},"place/quarter":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"quarter"},"terms":["boro","borough","quarter"],"name":"Sub-Borough / Quarter"},"place/square":{"geometry":["point","area"],"fields":["name"],"tags":{"place":"square"},"name":"Square"},"place/suburb":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"suburb"},"terms":["boro","borough","quarter"],"name":"Borough / Suburb"},"place/town":{"icon":"town","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"town"},"name":"Town"},"place/village":{"icon":"village","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"village"},"name":"Village"},"playground/balance_beam":{"icon":"playground","geometry":["point","line"],"tags":{"playground":"balancebeam"},"name":"Play Balance Beam"},"playground/basket_spinner":{"icon":"playground","geometry":["point"],"terms":["basket rotator"],"tags":{"playground":"basketrotator"},"name":"Basket Spinner"},"playground/basket_swing":{"icon":"playground","geometry":["point"],"tags":{"playground":"basketswing"},"name":"Basket Swing"},"playground/climbing_frame":{"icon":"playground","geometry":["point","area"],"tags":{"playground":"climbingframe"},"name":"Climbing Frame"},"playground/cushion":{"icon":"playground","geometry":["point","area"],"tags":{"playground":"cushion"},"name":"Bouncy Cushion"},"playground/horizontal_bar":{"icon":"pitch","fields":["height"],"geometry":["point"],"terms":["high bar"],"tags":{"playground":"horizontal_bar"},"name":"Play Horizontal Bar"},"playground/rocker":{"icon":"playground","geometry":["point"],"tags":{"playground":"springy"},"name":"Spring Rider","terms":["spring rocker","springy rocker"]},"playground/roundabout":{"icon":"stadium","fields":["bench"],"geometry":["point","area"],"tags":{"playground":"roundabout"},"name":"Play Roundabout","terms":["merry-go-round"]},"playground/sandpit":{"icon":"playground","geometry":["point","area"],"tags":{"playground":"sandpit"},"name":"Sandpit"},"playground/seesaw":{"icon":"playground","geometry":["point"],"tags":{"playground":"seesaw"},"name":"Seesaw"},"playground/slide":{"icon":"playground","geometry":["point","line"],"tags":{"playground":"slide"},"name":"Slide"},"playground/structure":{"icon":"pitch","geometry":["point","area"],"tags":{"playground":"structure"},"name":"Play Structure"},"playground/swing":{"icon":"playground","fields":["playground/baby","wheelchair"],"geometry":["point"],"tags":{"playground":"swing"},"name":"Swing"},"playground/zipwire":{"icon":"playground","geometry":["point","line"],"tags":{"playground":"zipwire"},"name":"Zip Wire"},"point":{"fields":["name"],"geometry":["point"],"tags":{},"name":"Point","matchScore":0.1},"power/sub_station":{"icon":"poi-power","fields":["substation","operator","building","ref"],"geometry":["point","area"],"tags":{"power":"sub_station"},"reference":{"key":"power","value":"substation"},"name":"Substation","searchable":false},"power/generator":{"icon":"poi-power","fields":["operator","generator/source","generator/method","generator/type","generator/output/electricity","ref"],"geometry":["point","vertex","area"],"terms":["hydro","solar","turbine","wind"],"tags":{"power":"generator"},"name":"Power Generator"},"power/generator/source_nuclear":{"icon":"poi-nuclear","fields":["operator","generator/source","generator/method","generator/type","generator/output/electricity","ref"],"geometry":["point","vertex","area"],"terms":["fission","generator","nuclear","nuke","reactor"],"tags":{"power":"generator","generator:source":"nuclear","generator:method":"fission"},"reference":{"key":"generator:source","value":"nuclear"},"name":"Nuclear Reactor"},"power/generator/source_wind":{"icon":"poi-wind","fields":["operator","generator/source","generator/method","generator/type","generator/output/electricity","height","ref"],"geometry":["point","vertex","area"],"terms":["generator","turbine","windmill","wind"],"tags":{"power":"generator","generator:source":"wind","generator:method":"wind_turbine"},"reference":{"key":"generator:source","value":"wind"},"name":"Wind Turbine"},"power/line":{"icon":"power-line","fields":["name","operator","voltage","ref"],"geometry":["line"],"tags":{"power":"line"},"name":"Power Line"},"power/minor_line":{"icon":"power-line","fields":["name","operator","voltage","ref"],"geometry":["line"],"tags":{"power":"minor_line"},"name":"Minor Power Line"},"power/plant":{"icon":"industry","fields":["name","operator","address","plant/output/electricity","start_date"],"geometry":["area"],"tags":{"power":"plant"},"addTags":{"power":"plant","landuse":"industrial"},"removeTags":{"power":"plant","landuse":"industrial"},"terms":["coal","gas","generat*","hydro","nuclear","power","station"],"name":"Power Station Grounds"},"power/pole":{"fields":["ref"],"geometry":["vertex"],"tags":{"power":"pole"},"name":"Power Pole"},"power/substation":{"icon":"poi-power","fields":["substation","operator","building","ref"],"geometry":["point","area"],"tags":{"power":"substation"},"name":"Substation"},"power/switch":{"icon":"poi-power","fields":["switch","operator","location","cables","voltage","ref"],"geometry":["point","vertex","area"],"tags":{"power":"switch"},"name":"Power Switch"},"power/tower":{"fields":["ref"],"geometry":["vertex"],"tags":{"power":"tower"},"name":"High-Voltage Tower"},"power/transformer":{"icon":"poi-power","fields":["transformer","operator","location","rating","devices","phases","frequency","voltage/primary","voltage/secondary","voltage/tertiary","windings","windings/configuration","ref"],"geometry":["point","vertex","area"],"tags":{"power":"transformer"},"name":"Transformer"},"public_transport/linear_platform_aerialway":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","aerialway":"yes"},"reference":{"key":"public_transport","value":"platform"},"terms":["aerialway","cable car","platform","public transit","public transportation","transit","transportation"],"name":"Aerialway Stop / Platform"},"public_transport/linear_platform_bus":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","bus":"yes"},"addTags":{"public_transport":"platform","bus":"yes","highway":"bus_stop"},"removeTags":{"public_transport":"platform","bus":"yes","highway":"bus_stop"},"reference":{"key":"public_transport","value":"platform"},"terms":["bus","platform","public transit","public transportation","transit","transportation"],"name":"Bus Stop / Platform"},"public_transport/linear_platform_ferry":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","ferry":"yes"},"reference":{"key":"public_transport","value":"platform"},"terms":["boat","dock","ferry","pier","platform","public transit","public transportation","transit","transportation"],"name":"Ferry Stop / Platform"},"public_transport/linear_platform_light_rail":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","light_rail":"yes"},"addTags":{"public_transport":"platform","light_rail":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","light_rail":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["electric","light rail","platform","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],"name":"Light Rail Stop / Platform"},"public_transport/linear_platform_monorail":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","monorail":"yes"},"addTags":{"public_transport":"platform","monorail":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","monorail":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["monorail","platform","public transit","public transportation","rail","transit","transportation"],"name":"Monorail Stop / Platform"},"public_transport/linear_platform_subway":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","subway":"yes"},"addTags":{"public_transport":"platform","subway":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","subway":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["metro","platform","public transit","public transportation","rail","subway","track","transit","transportation","underground"],"name":"Subway Stop / Platform"},"public_transport/linear_platform_train":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","train":"yes"},"addTags":{"public_transport":"platform","train":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","train":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["platform","public transit","public transportation","rail","track","train","transit","transportation"],"name":"Train Stop / Platform"},"public_transport/linear_platform_tram":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","tram":"yes"},"addTags":{"public_transport":"platform","tram":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","tram":"yes","railway":"platform"},"reference":{"key":"public_transport","value":"platform"},"terms":["electric","light rail","platform","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],"name":"Tram Stop / Platform"},"public_transport/linear_platform_trolleybus":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","trolleybus":"yes"},"addTags":{"public_transport":"platform","trolleybus":"yes","highway":"bus_stop"},"removeTags":{"public_transport":"platform","trolleybus":"yes","highway":"bus_stop"},"reference":{"key":"public_transport","value":"platform"},"terms":["bus","electric","platform","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],"name":"Trolleybus Stop / Platform"},"public_transport/linear_platform":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform"},"terms":["platform","public transit","public transportation","transit","transportation"],"name":"Transit Stop / Platform","matchScore":0.2},"public_transport/platform_aerialway":{"icon":"aerialway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","aerialway":"yes"},"reference":{"key":"public_transport","value":"platform"},"terms":["aerialway","cable car","platform","public transit","public transportation","transit","transportation"],"name":"Aerialway Stop / Platform"},"public_transport/platform_bus":{"icon":"bus","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","bus":"yes"},"addTags":{"public_transport":"platform","bus":"yes","highway":"bus_stop"},"removeTags":{"public_transport":"platform","bus":"yes","highway":"bus_stop"},"reference":{"key":"public_transport","value":"platform"},"terms":["bus","platform","public transit","public transportation","transit","transportation"],"name":"Bus Stop / Platform"},"public_transport/platform_ferry":{"icon":"ferry","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","ferry":"yes"},"reference":{"key":"public_transport","value":"platform"},"terms":["boat","dock","ferry","pier","platform","public transit","public transportation","transit","transportation"],"name":"Ferry Stop / Platform"},"public_transport/platform_light_rail":{"icon":"poi-light-rail","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","light_rail":"yes"},"addTags":{"public_transport":"platform","light_rail":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","light_rail":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["electric","light rail","platform","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],"name":"Light Rail Stop / Platform"},"public_transport/platform_monorail":{"icon":"poi-monorail","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","monorail":"yes"},"addTags":{"public_transport":"platform","monorail":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","monorail":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["monorail","platform","public transit","public transportation","rail","transit","transportation"],"name":"Monorail Stop / Platform"},"public_transport/platform_subway":{"icon":"poi-subway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","subway":"yes"},"addTags":{"public_transport":"platform","subway":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","subway":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["metro","platform","public transit","public transportation","rail","subway","track","transit","transportation","underground"],"name":"Subway Stop / Platform"},"public_transport/platform_train":{"icon":"rail","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","train":"yes"},"addTags":{"public_transport":"platform","train":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","train":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["platform","public transit","public transportation","rail","track","train","transit","transportation"],"name":"Train Stop / Platform"},"public_transport/platform_tram":{"icon":"poi-tram","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","tram":"yes"},"addTags":{"public_transport":"platform","tram":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","tram":"yes","railway":"platform"},"reference":{"key":"public_transport","value":"platform"},"terms":["electric","light rail","platform","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],"name":"Tram Stop / Platform"},"public_transport/platform_trolleybus":{"icon":"poi-trolleybus","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","trolleybus":"yes"},"addTags":{"public_transport":"platform","trolleybus":"yes","highway":"bus_stop"},"removeTags":{"public_transport":"platform","trolleybus":"yes","highway":"bus_stop"},"reference":{"key":"public_transport","value":"platform"},"terms":["bus","electric","platform","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],"name":"Trolleybus Stop / Platform"},"public_transport/platform":{"icon":"bus","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform"},"terms":["platform","public transit","public transportation","transit","transportation"],"name":"Transit Stop / Platform","matchScore":0.2},"public_transport/station_aerialway":{"icon":"aerialway","fields":["name","network","operator","aerialway/access","aerialway/summer/access","elevation","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","aerialway":"yes"},"reference":{"key":"aerialway","value":"station"},"terms":["aerialway","cable car","public transit","public transportation","station","terminal","transit","transportation"],"name":"Aerialway Station"},"public_transport/station_bus":{"icon":"bus","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","bus":"yes"},"addTags":{"public_transport":"station","bus":"yes","amenity":"bus_station"},"removeTags":{"public_transport":"station","bus":"yes","amenity":"bus_station"},"reference":{"key":"amenity","value":"bus_station"},"terms":["bus","public transit","public transportation","station","terminal","transit","transportation"],"name":"Bus Station / Terminal"},"public_transport/station_ferry":{"icon":"ferry","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","ferry":"yes"},"addTags":{"public_transport":"station","ferry":"yes","amenity":"ferry_terminal"},"removeTags":{"public_transport":"station","ferry":"yes","amenity":"ferry_terminal"},"reference":{"key":"amenity","value":"ferry_terminal"},"terms":["boat","dock","ferry","pier","public transit","public transportation","station","terminal","transit","transportation"],"name":"Ferry Station / Terminal"},"public_transport/station_light_rail":{"icon":"poi-light-rail","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","light_rail":"yes"},"addTags":{"public_transport":"station","light_rail":"yes","railway":"station","station":"light_rail"},"removeTags":{"public_transport":"station","light_rail":"yes","railway":"station","station":"light_rail"},"reference":{"key":"station","value":"light_rail"},"terms":["electric","light rail","public transit","public transportation","rail","station","terminal","track","tram","trolley","transit","transportation"],"name":"Light Rail Station"},"public_transport/station_monorail":{"icon":"poi-monorail","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","monorail":"yes"},"addTags":{"public_transport":"station","monorail":"yes","railway":"station"},"removeTags":{"public_transport":"station","monorail":"yes","railway":"station"},"reference":{"key":"railway","value":"station"},"terms":["monorail","public transit","public transportation","rail","station","terminal","transit","transportation"],"name":"Monorail Station"},"public_transport/station_subway":{"icon":"poi-subway","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","subway":"yes"},"addTags":{"public_transport":"station","subway":"yes","railway":"station","station":"subway"},"removeTags":{"public_transport":"station","subway":"yes","railway":"station","station":"subway"},"reference":{"key":"station","value":"subway"},"terms":["metro","public transit","public transportation","rail","station","subway","terminal","track","transit","transportation","underground"],"name":"Subway Station"},"public_transport/station_train_halt":{"icon":"rail","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","train":"yes","railway":"halt"},"reference":{"key":"railway","value":"halt"},"terms":["halt","public transit","public transportation","rail","station","track","train","transit","transportation","whistle stop"],"name":"Train Station (Halt / Request)"},"public_transport/station_train":{"icon":"rail","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","train":"yes"},"addTags":{"public_transport":"station","train":"yes","railway":"station"},"removeTags":{"public_transport":"station","train":"yes","railway":"station"},"reference":{"key":"railway","value":"station"},"terms":["public transit","public transportation","rail","station","terminal","track","train","transit","transportation"],"name":"Train Station"},"public_transport/station_tram":{"icon":"poi-tram","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","tram":"yes"},"reference":{"key":"public_transport","value":"station"},"terms":["electric","light rail","public transit","public transportation","rail","station","streetcar","terminal","track","tram","trolley","transit","transportation"],"name":"Tram Station"},"public_transport/station_trolleybus":{"icon":"poi-trolleybus","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","trolleybus":"yes"},"addTags":{"public_transport":"station","trolleybus":"yes","amenity":"bus_station"},"removeTags":{"public_transport":"station","trolleybus":"yes","amenity":"bus_station"},"reference":{"key":"amenity","value":"bus_station"},"terms":["bus","electric","public transit","public transportation","station","streetcar","terminal","trackless","tram","trolley","transit","transportation"],"name":"Trolleybus Station / Terminal"},"public_transport/station":{"icon":"rail","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station"},"terms":["public transit","public transportation","station","terminal","transit","transportation"],"name":"Transit Station","matchScore":0.2},"public_transport/stop_area":{"icon":"bus","fields":["name","ref","network","operator"],"geometry":["relation"],"tags":{"type":"public_transport","public_transport":"stop_area"},"addTags":{"type":"public_transport","public_transport":"stop_area","public_transport:version":"2"},"removeTags":{"type":"public_transport","public_transport":"stop_area","public_transport:version":"2"},"reference":{"key":"public_transport","value":"stop_area"},"name":"Transit Stop Area"},"public_transport/stop_position_aerialway":{"icon":"aerialway","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","aerialway":"yes"},"reference":{"key":"public_transport","value":"stop_position"},"terms":["aerialway","cable car","public transit","public transportation","transit","transportation"],"name":"Aerialway Stopping Location"},"public_transport/stop_position_bus":{"icon":"bus","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","bus":"yes"},"reference":{"key":"public_transport","value":"stop_position"},"terms":["bus","public transit","public transportation","transit","transportation"],"name":"Bus Stopping Location"},"public_transport/stop_position_ferry":{"icon":"ferry","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","ferry":"yes"},"reference":{"key":"public_transport","value":"stop_position"},"terms":["boat","dock","ferry","pier","public transit","public transportation","transit","transportation"],"name":"Ferry Stopping Location"},"public_transport/stop_position_light_rail":{"icon":"poi-light-rail","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","light_rail":"yes"},"addTags":{"public_transport":"stop_position","light_rail":"yes","railway":"stop"},"removeTags":{"public_transport":"stop_position","light_rail":"yes","railway":"stop"},"reference":{"key":"railway","value":"stop"},"terms":["electric","light rail","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],"name":"Light Rail Stopping Location"},"public_transport/stop_position_monorail":{"icon":"poi-monorail","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","monorail":"yes"},"addTags":{"public_transport":"stop_position","monorail":"yes","railway":"stop"},"removeTags":{"public_transport":"stop_position","monorail":"yes","railway":"stop"},"reference":{"key":"railway","value":"stop"},"terms":["monorail","public transit","public transportation","rail","transit","transportation"],"name":"Monorail Stopping Location"},"public_transport/stop_position_subway":{"icon":"poi-subway","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","subway":"yes"},"addTags":{"public_transport":"stop_position","subway":"yes","railway":"stop"},"removeTags":{"public_transport":"stop_position","subway":"yes","railway":"stop"},"reference":{"key":"railway","value":"stop"},"terms":["metro","public transit","public transportation","rail","subway","track","transit","transportation","underground"],"name":"Subway Stopping Location"},"public_transport/stop_position_train":{"icon":"rail","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","train":"yes"},"addTags":{"public_transport":"stop_position","train":"yes","railway":"stop"},"removeTags":{"public_transport":"stop_position","train":"yes","railway":"stop"},"reference":{"key":"railway","value":"stop"},"terms":["public transit","public transportation","rail","track","train","transit","transportation"],"name":"Train Stopping Location"},"public_transport/stop_position_tram":{"icon":"poi-tram","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","tram":"yes"},"addTags":{"public_transport":"stop_position","tram":"yes","railway":"tram_stop"},"removeTags":{"public_transport":"stop_position","tram":"yes","railway":"tram_stop"},"reference":{"key":"public_transport","value":"stop_position"},"terms":["electric","light rail","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],"name":"Tram Stopping Location"},"public_transport/stop_position_trolleybus":{"icon":"poi-trolleybus","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","trolleybus":"yes"},"reference":{"key":"public_transport","value":"stop_position"},"terms":["bus","electric","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],"name":"Trolleybus Stopping Location"},"public_transport/stop_position":{"icon":"bus","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position"},"terms":["public transit","public transportation","transit","transportation"],"name":"Transit Stopping Location","matchScore":0.2},"railway/halt":{"icon":"rail","geometry":["point","vertex"],"tags":{"railway":"halt"},"terms":["break","interrupt","rest","wait","interruption"],"name":"Train Station (Halt / Request)","searchable":false},"railway/platform":{"icon":"highway-footway","fields":["name","ref_platform","surface","lit","shelter"],"geometry":["line","area"],"tags":{"railway":"platform"},"name":"Train Stop / Platform","searchable":false},"railway/station":{"icon":"rail","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","vertex","area"],"tags":{"railway":"station"},"terms":["train station","station"],"name":"Train Station","searchable":false},"railway/tram_stop":{"icon":"poi-tram","fields":["name","network","operator"],"geometry":["vertex"],"tags":{"railway":"tram_stop"},"terms":["light rail","streetcar","tram","trolley"],"name":"Tram Stopping Position","searchable":false},"railway/abandoned":{"icon":"railway-abandoned","geometry":["line"],"tags":{"railway":"abandoned"},"fields":["name","structure","service_rail"],"terms":[],"name":"Abandoned Railway"},"railway/buffer_stop":{"icon":"poi-buffer-stop","geometry":["vertex"],"tags":{"railway":"buffer_stop"},"terms":["stop","halt","buffer"],"name":"Buffer Stop"},"railway/crossing":{"icon":"cross","geometry":["vertex"],"tags":{"railway":"crossing"},"terms":["crossing","pedestrian crossing","railroad crossing","level crossing","grade crossing","path through railroad","train crossing"],"name":"Railway Crossing (Path)"},"railway/derail":{"icon":"roadblock","geometry":["vertex"],"tags":{"railway":"derail"},"terms":["derailer"],"name":"Railway Derailer"},"railway/disused":{"icon":"railway-disused","geometry":["line"],"tags":{"railway":"disused"},"fields":["structure","service_rail"],"terms":[],"name":"Disused Railway"},"railway/funicular":{"icon":"railway-rail","geometry":["line"],"terms":["venicular","cliff railway","cable car","cable railway","funicular railway"],"fields":["structure","gauge","service_rail"],"tags":{"railway":"funicular"},"name":"Funicular"},"railway/level_crossing":{"icon":"cross","geometry":["vertex"],"tags":{"railway":"level_crossing"},"terms":["crossing","railroad crossing","level crossing","grade crossing","road through railroad","train crossing"],"name":"Railway Crossing (Road)"},"railway/light_rail":{"icon":"railway-light-rail","geometry":["line"],"tags":{"railway":"light_rail"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["light rail","streetcar","trolley"],"name":"Light Rail"},"railway/milestone":{"icon":"poi-milestone","geometry":["point","vertex"],"fields":["railway/position"],"tags":{"railway":"milestone"},"terms":["milestone","marker"],"name":"Railway Milestone"},"railway/miniature":{"icon":"railway-rail","geometry":["line"],"tags":{"railway":"miniature"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["rideable miniature railway","narrow gauge railway","minimum gauge railway"],"name":"Miniature Railway"},"railway/monorail":{"icon":"railway-monorail","geometry":["line"],"tags":{"railway":"monorail"},"fields":["name","structure","electrified","service_rail"],"terms":[],"name":"Monorail"},"railway/narrow_gauge":{"icon":"railway-rail","geometry":["line"],"tags":{"railway":"narrow_gauge"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["narrow gauge railway","narrow gauge railroad"],"name":"Narrow Gauge Rail"},"railway/rail":{"icon":"railway-rail","geometry":["line"],"tags":{"railway":"rail"},"fields":["name","structure","gauge","electrified","maxspeed","service_rail"],"terms":[],"name":"Rail"},"railway/signal":{"icon":"poi-railway-signals","geometry":["point","vertex"],"fields":["railway/position","railway/signal/direction","ref"],"tags":{"railway":"signal"},"terms":["signal","lights"],"name":"Railway Signal"},"railway/subway_entrance":{"icon":"entrance","geometry":["point","vertex"],"fields":["name"],"tags":{"railway":"subway_entrance"},"terms":["metro","transit"],"name":"Subway Entrance"},"railway/subway":{"icon":"railway-subway","geometry":["line"],"tags":{"railway":"subway"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["metro","transit"],"name":"Subway"},"railway/switch":{"icon":"poi-junction","geometry":["vertex"],"tags":{"railway":"switch"},"terms":["switch","points"],"name":"Railway Switch"},"railway/train_wash":{"icon":"rail","geometry":["point","vertex","area"],"fields":["operator","building_area"],"tags":{"railway":"wash"},"terms":["wash","clean"],"name":"Train Wash"},"railway/tram":{"icon":"railway-light-rail","geometry":["line"],"tags":{"railway":"tram"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["light rail","streetcar","tram","trolley"],"name":"Tram"},"relation":{"icon":"relation","fields":["name","relation"],"geometry":["relation"],"tags":{},"name":"Relation"},"route/ferry":{"icon":"ferry-line","geometry":["line"],"fields":["name","operator","duration","access"],"tags":{"route":"ferry"},"name":"Ferry Route"},"shop":{"icon":"shop","fields":["name","shop","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"*"},"terms":[],"name":"Shop"},"shop/fishmonger":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"fishmonger"},"reference":{"key":"shop","value":"seafood"},"name":"Fishmonger","searchable":false},"shop/furnace":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["oven","stove"],"tags":{"shop":"furnace"},"name":"Furnace Store","searchable":false},"shop/vacant":{"icon":"shop","fields":["name","address","building_area"],"geometry":["point","area"],"tags":{"shop":"vacant"},"name":"Vacant Shop","searchable":false},"shop/agrarian":{"icon":"shop","fields":["name","operator","agrarian","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["agricultural inputs","agricultural machines","seeds","pesticides","fertilizer","agricultural tools"],"tags":{"shop":"agrarian"},"name":"Farm Supply Shop"},"shop/alcohol":{"icon":"alcohol-shop","fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"geometry":["point","area"],"terms":["alcohol","beer","booze","wine"],"tags":{"shop":"alcohol"},"name":"Liquor Store"},"shop/anime":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"anime"},"terms":["manga","japan","cosplay","figurine","dakimakura"],"name":"Anime Shop"},"shop/antiques":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"antiques"},"name":"Antiques Shop"},"shop/appliance":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["air conditioner","appliance","dishwasher","dryer","freezer","fridge","grill","kitchen","oven","refrigerator","stove","washer","washing machine"],"tags":{"shop":"appliance"},"name":"Appliance Store"},"shop/art":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["art*","exhibit*","gallery"],"tags":{"shop":"art"},"name":"Art Store"},"shop/baby_goods":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"baby_goods"},"name":"Baby Goods Store"},"shop/bag":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["handbag","purse"],"tags":{"shop":"bag"},"name":"Bag/Luggage Store"},"shop/bakery":{"icon":"bakery","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"bakery"},"name":"Bakery"},"shop/bathroom_furnishing":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"bathroom_furnishing"},"name":"Bathroom Furnishing Store"},"shop/beauty":{"icon":"shop","fields":["name","operator","address","building_area","beauty","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["spa","salon","tanning"],"tags":{"shop":"beauty"},"name":"Beauty Shop"},"shop/beauty/nails":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["manicure","pedicure"],"tags":{"shop":"beauty","beauty":"nails"},"reference":{"key":"shop","value":"beauty"},"name":"Nail Salon"},"shop/beauty/tanning":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"beauty","beauty":"tanning"},"reference":{"key":"leisure","value":"tanning_salon"},"name":"Tanning Salon"},"shop/bed":{"icon":"lodging","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"bed"},"name":"Bedding/Mattress Store"},"shop/beverages":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"beverages"},"name":"Beverage Store"},"shop/bicycle":{"icon":"bicycle","fields":["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["bike","repair"],"tags":{"shop":"bicycle"},"name":"Bicycle Shop"},"shop/bookmaker":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["betting"],"tags":{"shop":"bookmaker"},"name":"Bookmaker"},"shop/books":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"shop":"books"},"name":"Book Store"},"shop/boutique":{"icon":"shop","fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"boutique"},"name":"Boutique"},"shop/butcher":{"icon":"slaughterhouse","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["meat"],"tags":{"shop":"butcher"},"name":"Butcher"},"shop/candles":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"candles"},"name":"Candle Shop"},"shop/car_parts":{"icon":"car","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["auto"],"tags":{"shop":"car_parts"},"name":"Car Parts Store"},"shop/car_repair":{"icon":"car","fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["auto","garage","service"],"tags":{"shop":"car_repair"},"name":"Car Repair Shop"},"shop/car":{"icon":"car","fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["auto"],"tags":{"shop":"car"},"name":"Car Dealership"},"shop/carpet":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["rug"],"tags":{"shop":"carpet"},"name":"Carpet Store"},"shop/charity":{"icon":"shop","fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["thrift","op shop","nonprofit"],"tags":{"shop":"charity"},"name":"Charity Store"},"shop/cheese":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"cheese"},"name":"Cheese Store"},"shop/chemist":{"icon":"grocery","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"chemist"},"terms":["med*","drug*","gift"],"name":"Drugstore"},"shop/chocolate":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"chocolate"},"name":"Chocolate Store"},"shop/clothes":{"icon":"clothing-store","fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"clothes"},"name":"Clothing Store"},"shop/coffee":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"coffee"},"name":"Coffee Store"},"shop/computer":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"computer"},"name":"Computer Store"},"shop/confectionery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["sweet"],"tags":{"shop":"confectionery"},"name":"Candy Store"},"shop/convenience":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"convenience"},"name":"Convenience Store"},"shop/copyshop":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"copyshop"},"name":"Copy Store"},"shop/cosmetics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"cosmetics"},"name":"Cosmetics Store"},"shop/craft":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"craft"},"terms":["art*","paint*","frame"],"name":"Arts and Crafts Store"},"shop/curtain":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["drape*","window"],"tags":{"shop":"curtain"},"name":"Curtain Store"},"shop/dairy":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["milk","egg","cheese"],"tags":{"shop":"dairy"},"name":"Dairy Store"},"shop/deli":{"icon":"restaurant","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["lunch","meat","sandwich"],"tags":{"shop":"deli"},"name":"Deli"},"shop/department_store":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"department_store"},"name":"Department Store"},"shop/doityourself":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"doityourself"},"name":"DIY Store"},"shop/dry_cleaning":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"dry_cleaning"},"name":"Dry Cleaner"},"shop/e-cigarette":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"e-cigarette"},"terms":["electronic","vapor"],"name":"E-Cigarette Shop"},"shop/electronics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["appliance","audio","blueray","camera","computer","dvd","home theater","radio","speaker","tv","video"],"tags":{"shop":"electronics"},"name":"Electronics Store"},"shop/erotic":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["sex","porn"],"tags":{"shop":"erotic"},"name":"Erotic Store"},"shop/fabric":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["sew"],"tags":{"shop":"fabric"},"name":"Fabric Store"},"shop/farm":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["farm shop","farm stand"],"tags":{"shop":"farm"},"name":"Produce Stand"},"shop/fashion":{"icon":"shop","fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"fashion"},"name":"Fashion Store"},"shop/florist":{"icon":"florist","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["flower"],"tags":{"shop":"florist"},"name":"Florist"},"shop/frame":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"frame"},"terms":["art*","paint*","photo*","frame"],"name":"Framing Shop"},"shop/funeral_directors":{"icon":"cemetery","fields":["name","operator","address","building_area","religion","denomination"],"geometry":["point","area"],"terms":["undertaker","memorial home"],"tags":{"shop":"funeral_directors"},"name":"Funeral Home"},"shop/furniture":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["chair","sofa","table"],"tags":{"shop":"furniture"},"name":"Furniture Store"},"shop/garden_centre":{"icon":"garden-center","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["landscape","mulch","shrub","tree"],"tags":{"shop":"garden_centre"},"name":"Garden Center"},"shop/gas":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["cng","lpg","natural gas","propane","refill","tank"],"tags":{"shop":"gas"},"name":"Bottled Gas Shop"},"shop/gift":{"icon":"gift","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["souvenir"],"tags":{"shop":"gift"},"name":"Gift Shop"},"shop/greengrocer":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["fruit","vegetable"],"tags":{"shop":"greengrocer"},"name":"Greengrocer"},"shop/hairdresser":{"icon":"hairdresser","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["barber"],"tags":{"shop":"hairdresser"},"name":"Hairdresser"},"shop/hardware":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"hardware"},"name":"Hardware Store"},"shop/health_food":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["wholefood","vitamins","vegetarian","vegan"],"tags":{"shop":"health_food "},"name":"Health Food Shop"},"shop/hearing_aids":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"hearing_aids"},"name":"Hearing Aids Store"},"shop/herbalist":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"herbalist"},"name":"Herbalist"},"shop/hifi":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["stereo","video"],"tags":{"shop":"hifi"},"name":"Hifi Store"},"shop/houseware":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["home","household"],"tags":{"shop":"houseware"},"name":"Houseware Store"},"shop/interior_decoration":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"interior_decoration"},"name":"Interior Decoration Store"},"shop/jewelry":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["diamond","gem","ring"],"tags":{"shop":"jewelry"},"name":"Jeweler"},"shop/kiosk":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"kiosk"},"name":"Kiosk"},"shop/kitchen":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"kitchen"},"name":"Kitchen Design Store"},"shop/laundry":{"icon":"laundry","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"laundry"},"name":"Laundry"},"shop/leather":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"leather"},"name":"Leather Store"},"shop/locksmith":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["key","lockpick"],"tags":{"shop":"locksmith"},"name":"Locksmith"},"shop/lottery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"lottery"},"name":"Lottery Shop"},"shop/mall":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["shopping"],"tags":{"shop":"mall"},"name":"Mall"},"shop/massage":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"massage"},"name":"Massage Shop"},"shop/medical_supply":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"medical_supply"},"name":"Medical Supply Store"},"shop/mobile_phone":{"icon":"mobile-phone","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"mobile_phone"},"name":"Mobile Phone Store"},"shop/money_lender":{"icon":"bank","fields":["name","operator","address","building_area","opening_hours","currency_multi"],"geometry":["point","area"],"tags":{"shop":"money_lender"},"name":"Money Lender"},"shop/motorcycle":{"icon":"scooter","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["bike"],"tags":{"shop":"motorcycle"},"name":"Motorcycle Dealership"},"shop/music":{"icon":"music","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["CD","vinyl"],"tags":{"shop":"music"},"name":"Music Store"},"shop/musical_instrument":{"icon":"music","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["guitar"],"tags":{"shop":"musical_instrument"},"name":"Musical Instrument Store"},"shop/newsagent":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"newsagent"},"name":"Newspaper/Magazine Shop"},"shop/nutrition_supplements":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"nutrition_supplements"},"name":"Nutrition Supplements Store"},"shop/optician":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["eye","glasses"],"tags":{"shop":"optician"},"name":"Optician"},"shop/organic":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"supermarket","organic":"only"},"name":"Organic Goods Store"},"shop/outdoor":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["camping","climbing","hiking"],"tags":{"shop":"outdoor"},"name":"Outdoors Store"},"shop/paint":{"icon":"water","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"paint"},"name":"Paint Store"},"shop/pastry":{"icon":"bakery","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"pastry"},"terms":["patisserie","cake shop","cakery"],"name":"Pastry Shop"},"shop/pawnbroker":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"pawnbroker"},"name":"Pawn Shop"},"shop/perfumery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"perfumery"},"name":"Perfume Store"},"shop/pet":{"icon":"dog-park","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["animal","cat","dog","fish","kitten","puppy","reptile"],"tags":{"shop":"pet"},"name":"Pet Store"},"shop/photo":{"icon":"attraction","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["camera","film"],"tags":{"shop":"photo"},"name":"Photography Store"},"shop/pyrotechnics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"pyrotechnics"},"name":"Fireworks Store"},"shop/radiotechnics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"radiotechnics"},"name":"Radio/Electronic Component Store"},"shop/religion":{"icon":"shop","fields":["name","operator","address","building_area","religion","denomination","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"religion"},"name":"Religious Store"},"shop/scuba_diving":{"icon":"swimming","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"scuba_diving"},"name":"Scuba Diving Shop"},"shop/seafood":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["fishmonger"],"tags":{"shop":"seafood"},"name":"Seafood Shop"},"shop/second_hand":{"icon":"shop","fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["secondhand","second hand","resale","thrift","used"],"tags":{"shop":"second_hand"},"name":"Consignment/Thrift Store"},"shop/shoes":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"shoes"},"name":"Shoe Store"},"shop/sports":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"sports"},"name":"Sporting Goods Store"},"shop/stationery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["card","paper"],"tags":{"shop":"stationery"},"name":"Stationery Store"},"shop/storage_rental":{"icon":"shop","fields":["name","operator","address","building","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"storage_rental"},"name":"Storage Rental"},"shop/supermarket":{"icon":"grocery","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["grocery","store","shop"],"tags":{"shop":"supermarket"},"name":"Supermarket"},"shop/tailor":{"icon":"clothing-store","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["clothes","suit"],"tags":{"shop":"tailor"},"name":"Tailor"},"shop/tattoo":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"tattoo"},"name":"Tattoo Parlor"},"shop/tea":{"icon":"teahouse","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"tea"},"name":"Tea Store"},"shop/ticket":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"ticket"},"name":"Ticket Seller"},"shop/tiles":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"tiles"},"name":"Tile Shop"},"shop/tobacco":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"tobacco"},"name":"Tobacco Shop"},"shop/toys":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"toys"},"name":"Toy Store"},"shop/trade":{"icon":"shop","fields":["name","trade","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"trade"},"name":"Trade Shop"},"shop/travel_agency":{"icon":"suitcase","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"travel_agency"},"name":"Travel Agency"},"shop/tyres":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"tyres"},"name":"Tire Store"},"shop/vacuum_cleaner":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"vacuum_cleaner"},"name":"Vacuum Cleaner Store"},"shop/variety_store":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"variety_store"},"name":"Variety Store"},"shop/video_games":{"icon":"gaming","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"video_games"},"name":"Video Game Store"},"shop/video":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["DVD"],"tags":{"shop":"video"},"name":"Video Store"},"shop/watches":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"watches"},"name":"Watches Shop"},"shop/water_sports":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"water_sports"},"name":"Watersport/Swim Shop"},"shop/weapons":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["ammo","gun","knife","knives"],"tags":{"shop":"weapons"},"name":"Weapon Shop"},"shop/wholesale":{"icon":"warehouse","fields":["name","operator","wholesale","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["warehouse club","cash and carry"],"tags":{"shop":"wholesale"},"name":"Wholesale Store"},"shop/window_blind":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"window_blind"},"name":"Window Blind Store"},"shop/wine":{"icon":"alcohol-shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"wine"},"name":"Wine Shop"},"tourism":{"icon":"attraction","fields":["name","tourism"],"geometry":["point","vertex","area"],"tags":{"tourism":"*"},"name":"Tourism"},"tourism/alpine_hut":{"icon":"lodging","fields":["name","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"terms":["climbing hut"],"tags":{"tourism":"alpine_hut"},"name":"Alpine Hut"},"tourism/apartment":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"apartment"},"name":"Guest Apartment / Condo"},"tourism/aquarium":{"icon":"aquarium","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["fish","sea","water"],"tags":{"tourism":"aquarium"},"name":"Aquarium"},"tourism/artwork":{"icon":"art-gallery","fields":["name","artwork_type","artist"],"geometry":["point","vertex","area"],"tags":{"tourism":"artwork"},"terms":["mural","sculpture","statue"],"name":"Artwork"},"tourism/attraction":{"icon":"star","fields":["name","operator","address"],"geometry":["point","vertex","area"],"tags":{"tourism":"attraction"},"name":"Tourist Attraction"},"tourism/camp_site":{"icon":"campsite","fields":["name","operator","address","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","vertex","area"],"terms":["tent","rv"],"tags":{"tourism":"camp_site"},"name":"Campground"},"tourism/caravan_site":{"icon":"bus","fields":["name","operator","address","capacity","fee","sanitary_dump_station","power_supply","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","vertex","area"],"terms":["Motor Home","Camper"],"tags":{"tourism":"caravan_site"},"name":"RV Park"},"tourism/chalet":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"terms":["holiday","holiday cottage","holiday home","vacation","vacation home"],"tags":{"tourism":"chalet"},"name":"Holiday Cottage"},"tourism/gallery":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["art*","exhibit*","paint*","photo*","sculpt*"],"tags":{"tourism":"gallery"},"name":"Art Gallery"},"tourism/guest_house":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"guest_house"},"terms":["B&B","Bed and Breakfast"],"name":"Guest House"},"tourism/hostel":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"hostel"},"name":"Hostel"},"tourism/hotel":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"hotel"},"name":"Hotel"},"tourism/information":{"icon":"information","fields":["information","operator","address","building_area"],"geometry":["point","vertex","area"],"tags":{"tourism":"information"},"name":"Information"},"tourism/information/board":{"icon":"information","fields":["name","operator","board_type","direction"],"geometry":["point","vertex"],"tags":{"tourism":"information","information":"board"},"reference":{"key":"information","value":"board"},"name":"Information Board"},"tourism/information/guidepost":{"icon":"information","fields":["name","elevation","operator","ref"],"geometry":["point","vertex"],"terms":["signpost"],"tags":{"tourism":"information","information":"guidepost"},"reference":{"key":"information","value":"guidepost"},"name":"Guidepost"},"tourism/information/map":{"icon":"information","fields":["operator","map_type","map_size","direction"],"geometry":["point","vertex"],"tags":{"tourism":"information","information":"map"},"reference":{"key":"information","value":"map"},"name":"Map"},"tourism/information/office":{"icon":"information","fields":["name","operator","address","building_area"],"geometry":["point","vertex","area"],"tags":{"tourism":"information","information":"office"},"reference":{"key":"information","value":"office"},"name":"Tourist Information Office"},"tourism/motel":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"motel"},"name":"Motel"},"tourism/museum":{"icon":"museum","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["art*","exhibit*","gallery","foundation","hall","institution","paint*","photo*","sculpt*"],"tags":{"tourism":"museum"},"name":"Museum"},"tourism/picnic_site":{"icon":"picnic-site","fields":["name","operator","address","smoking"],"geometry":["point","vertex","area"],"terms":["camp"],"tags":{"tourism":"picnic_site"},"name":"Picnic Site"},"tourism/theme_park":{"icon":"amusement-park","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"tags":{"tourism":"theme_park"},"name":"Theme Park"},"tourism/viewpoint":{"icon":"poi-binoculars","geometry":["point","vertex"],"fields":["direction"],"tags":{"tourism":"viewpoint"},"name":"Viewpoint"},"tourism/wilderness_hut":{"icon":"lodging","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["wilderness hut","backcountry hut","bothy"],"tags":{"tourism":"wilderness_hut"},"name":"Wilderness Hut"},"tourism/zoo":{"icon":"zoo","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["animal"],"tags":{"tourism":"zoo"},"name":"Zoo"},"traffic_calming":{"icon":"poi-warning","fields":["traffic_calming","direction_vertex"],"geometry":["vertex","line"],"tags":{"traffic_calming":"*"},"terms":["bump","hump","slow","speed"],"name":"Traffic Calming"},"traffic_calming/bump":{"icon":"poi-warning","fields":["surface","direction_vertex"],"geometry":["vertex","line"],"terms":["hump","speed","slow"],"tags":{"traffic_calming":"bump"},"name":"Speed Bump"},"traffic_calming/chicane":{"icon":"poi-warning","fields":["direction_vertex"],"geometry":["vertex","line"],"terms":["driveway link","speed","slow"],"tags":{"traffic_calming":"chicane"},"name":"Traffic Chicane"},"traffic_calming/choker":{"icon":"poi-warning","fields":["direction_vertex"],"geometry":["vertex","line"],"terms":["speed","slow"],"tags":{"traffic_calming":"choker"},"name":"Traffic Choker"},"traffic_calming/cushion":{"icon":"poi-warning","fields":["surface","direction_vertex"],"geometry":["vertex","line"],"terms":["bump","hump","speed","slow"],"tags":{"traffic_calming":"cushion"},"name":"Speed Cushion"},"traffic_calming/dip":{"icon":"poi-warning","fields":["surface","direction_vertex"],"geometry":["vertex","line"],"terms":["speed","slow"],"tags":{"traffic_calming":"dip"},"name":"Dip"},"traffic_calming/hump":{"icon":"poi-warning","fields":["surface","direction_vertex"],"geometry":["vertex","line"],"terms":["bump","speed","slow"],"tags":{"traffic_calming":"hump"},"name":"Speed Hump"},"traffic_calming/island":{"icon":"poi-warning","geometry":["vertex"],"terms":["circle","roundabout","slow"],"tags":{"traffic_calming":"island"},"name":"Traffic Island"},"traffic_calming/rumble_strip":{"icon":"poi-warning","fields":["direction_vertex"],"geometry":["vertex","line"],"terms":["audible lines","sleeper lines","growlers"],"tags":{"traffic_calming":"rumble_strip"},"name":"Rumble Strip"},"traffic_calming/table":{"icon":"poi-warning","fields":["surface"],"geometry":["vertex"],"tags":{"traffic_calming":"table"},"terms":["flat top","hump","speed","slow"],"name":"Speed Table"},"type/multipolygon":{"icon":"multipolygon","geometry":["area","relation"],"tags":{"type":"multipolygon"},"removeTags":{},"name":"Multipolygon","searchable":false,"matchScore":0.1},"type/boundary":{"icon":"boundary","fields":["name","boundary"],"geometry":["relation"],"tags":{"type":"boundary"},"name":"Boundary"},"type/boundary/administrative":{"icon":"boundary","fields":["name","admin_level"],"geometry":["relation"],"tags":{"type":"boundary","boundary":"administrative"},"reference":{"key":"boundary","value":"administrative"},"name":"Administrative Boundary"},"type/restriction":{"icon":"restriction","fields":["name","restriction","except"],"geometry":["relation"],"tags":{"type":"restriction"},"name":"Restriction"},"type/restriction/no_left_turn":{"icon":"restriction-no-left-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"no_left_turn"},"name":"No Left Turn"},"type/restriction/no_right_turn":{"icon":"restriction-no-right-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"no_right_turn"},"name":"No Right Turn"},"type/restriction/no_straight_on":{"icon":"restriction-no-straight-on","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"no_straight_on"},"name":"No Straight On"},"type/restriction/no_u_turn":{"icon":"restriction-no-u-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"no_u_turn"},"name":"No U-turn"},"type/restriction/only_left_turn":{"icon":"restriction-only-left-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"only_left_turn"},"name":"Left Turn Only"},"type/restriction/only_right_turn":{"icon":"restriction-only-right-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"only_right_turn"},"name":"Right Turn Only"},"type/restriction/only_straight_on":{"icon":"restriction-only-straight-on","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"only_straight_on"},"name":"No Turns"},"type/route_master":{"icon":"route-master","fields":["name","route_master","ref","operator","network"],"geometry":["relation"],"tags":{"type":"route_master"},"name":"Route Master"},"type/route":{"icon":"route","fields":["name","route","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route"},"name":"Route"},"type/route/bicycle":{"icon":"route-bicycle","fields":["name","ref_route","network_bicycle","cycle_network"],"geometry":["relation"],"tags":{"type":"route","route":"bicycle"},"name":"Cycle Route"},"type/route/bus":{"icon":"route-bus","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"bus"},"name":"Bus Route"},"type/route/detour":{"icon":"route-detour","fields":["name","ref_route"],"geometry":["relation"],"tags":{"type":"route","route":"detour"},"name":"Detour Route"},"type/route/ferry":{"icon":"route-ferry","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"ferry"},"name":"Ferry Route"},"type/route/foot":{"icon":"route-foot","fields":["name","ref_route","operator","network_foot"],"geometry":["relation"],"tags":{"type":"route","route":"foot"},"name":"Foot Route"},"type/route/hiking":{"icon":"route-foot","fields":["name","ref_route","operator","network_foot"],"geometry":["relation"],"tags":{"type":"route","route":"hiking"},"name":"Hiking Route"},"type/route/horse":{"icon":"route-horse","fields":["name","ref_route","operator","network_horse"],"geometry":["relation"],"tags":{"type":"route","route":"horse"},"name":"Riding Route"},"type/route/light_rail":{"icon":"route-light-rail","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"light_rail"},"name":"Light Rail Route"},"type/route/pipeline":{"icon":"route-pipeline","fields":["name","ref_route","operator"],"geometry":["relation"],"tags":{"type":"route","route":"pipeline"},"name":"Pipeline Route"},"type/route/piste":{"icon":"route-piste","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"piste"},"name":"Piste/Ski Route"},"type/route/power":{"icon":"route-power","fields":["name","ref_route","operator"],"geometry":["relation"],"tags":{"type":"route","route":"power"},"name":"Power Route"},"type/route/road":{"icon":"route-road","fields":["name","ref_route","network_road"],"geometry":["relation"],"tags":{"type":"route","route":"road"},"name":"Road Route"},"type/route/subway":{"icon":"route-subway","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"subway"},"name":"Subway Route"},"type/route/train":{"icon":"route-train","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"train"},"name":"Train Route"},"type/route/tram":{"icon":"route-tram","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"tram"},"name":"Tram Route"},"type/site":{"icon":"relation","fields":["name","site"],"geometry":["relation"],"tags":{"type":"site"},"name":"Site"},"type/waterway":{"icon":"route-water","fields":["name","waterway","ref"],"geometry":["relation"],"tags":{"type":"waterway"},"name":"Waterway"},"vertex":{"fields":["name"],"geometry":["vertex"],"tags":{},"name":"Other","matchScore":0.1},"waterway/boatyard":{"icon":"harbor","fields":["name","operator"],"geometry":["area","vertex","point"],"tags":{"waterway":"boatyard"},"name":"Boatyard"},"waterway/canal":{"icon":"waterway-canal","fields":["name","width","intermittent"],"geometry":["line"],"tags":{"waterway":"canal"},"name":"Canal"},"waterway/dam":{"icon":"dam","geometry":["point","vertex","line","area"],"fields":["name"],"tags":{"waterway":"dam"},"name":"Dam"},"waterway/ditch":{"icon":"waterway-ditch","fields":["structure_waterway","intermittent"],"geometry":["line"],"tags":{"waterway":"ditch"},"name":"Ditch"},"waterway/dock":{"icon":"harbor","fields":["name","dock","operator"],"geometry":["area","vertex","point"],"terms":["boat","ship","vessel","marine"],"tags":{"waterway":"dock"},"name":"Wet Dock / Dry Dock"},"waterway/drain":{"icon":"waterway-ditch","fields":["structure_waterway","intermittent"],"geometry":["line"],"tags":{"waterway":"drain"},"name":"Drain"},"waterway/fuel":{"icon":"fuel","fields":["name","operator","address","opening_hours","fuel_multi"],"geometry":["point","area"],"terms":["petrol","gas","diesel","boat"],"tags":{"waterway":"fuel"},"name":"Marine Fuel Station"},"waterway/river":{"icon":"waterway-river","fields":["name","structure_waterway","width","intermittent"],"geometry":["line"],"terms":["beck","branch","brook","course","creek","estuary","rill","rivulet","run","runnel","stream","tributary","watercourse"],"tags":{"waterway":"river"},"name":"River"},"waterway/riverbank":{"icon":"water","geometry":["area"],"tags":{"waterway":"riverbank"},"name":"Riverbank"},"waterway/sanitary_dump_station":{"icon":"poi-storage-tank","fields":["name","operator","access_simple","fee","water_point"],"geometry":["point","vertex","area"],"terms":["Boat","Watercraft","Sanitary","Dump Station","Pumpout","Pump out","Elsan","CDP","CTDP","Chemical Toilet"],"tags":{"waterway":"sanitary_dump_station"},"name":"Marine Toilet Disposal"},"waterway/stream_intermittent":{"icon":"waterway-stream","fields":["name","structure_waterway","width","intermittent"],"geometry":["line"],"terms":["arroyo","beck","branch","brook","burn","course","creek","drift","flood","flow","gully","run","runnel","rush","spate","spritz","tributary","wadi","wash","watercourse"],"tags":{"waterway":"stream","intermittent":"yes"},"reference":{"key":"waterway","value":"stream"},"name":"Intermittent Stream"},"waterway/stream":{"icon":"waterway-stream","fields":["name","structure_waterway","width","intermittent"],"geometry":["line"],"terms":["beck","branch","brook","burn","course","creek","current","drift","flood","flow","freshet","race","rill","rindle","rivulet","run","runnel","rush","spate","spritz","surge","tide","torrent","tributary","watercourse"],"tags":{"waterway":"stream"},"name":"Stream"},"waterway/water_point":{"icon":"drinking-water","geometry":["area","vertex","point"],"tags":{"waterway":"water_point"},"name":"Marine Drinking Water"},"waterway/waterfall":{"icon":"water","fields":["name","height","width","intermittent"],"geometry":["vertex"],"terms":["fall"],"tags":{"waterway":"waterfall"},"name":"Waterfall"},"waterway/weir":{"icon":"dam","geometry":["vertex","line"],"tags":{"waterway":"weir"},"name":"Weir"},"amenity/arts_centre/Świetlica wiejska":{"tags":{"name":"Świetlica wiejska","amenity":"arts_centre"},"name":"Świetlica wiejska","icon":"theatre","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/arts_centre/Дом культуры":{"tags":{"name":"Дом культуры","amenity":"arts_centre"},"name":"Дом культуры","icon":"theatre","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/bank/ABANCA":{"tags":{"name":"ABANCA","amenity":"bank"},"name":"ABANCA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ABN AMRO":{"tags":{"name":"ABN AMRO","amenity":"bank"},"name":"ABN AMRO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ABSA":{"tags":{"name":"ABSA","amenity":"bank"},"name":"ABSA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/AIB":{"tags":{"name":"AIB","amenity":"bank"},"name":"AIB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ANZ":{"tags":{"name":"ANZ","amenity":"bank"},"name":"ANZ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ASB Bank":{"tags":{"name":"ASB Bank","amenity":"bank"},"name":"ASB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ATB Financial":{"tags":{"name":"ATB Financial","amenity":"bank"},"name":"ATB Financial","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/AXA":{"tags":{"name":"AXA","amenity":"bank"},"name":"AXA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Agribank":{"tags":{"name":"Agribank","amenity":"bank"},"name":"Agribank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Akbank":{"tags":{"name":"Akbank","amenity":"bank"},"name":"Akbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Alior Bank":{"tags":{"name":"Alior Bank","amenity":"bank"},"name":"Alior Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Allahabad Bank":{"tags":{"name":"Allahabad Bank","amenity":"bank"},"name":"Allahabad Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Allied Bank":{"tags":{"name":"Allied Bank","amenity":"bank"},"name":"Allied Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Alpha Bank":{"tags":{"name":"Alpha Bank","amenity":"bank"},"name":"Alpha Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Andhra Bank":{"tags":{"name":"Andhra Bank","amenity":"bank"},"name":"Andhra Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Antonveneta":{"tags":{"name":"Antonveneta","amenity":"bank"},"name":"Antonveneta","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Argenta":{"tags":{"name":"Argenta","amenity":"bank"},"name":"Argenta","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Asia United Bank":{"tags":{"name":"Asia United Bank","amenity":"bank"},"name":"Asia United Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Askari Bank":{"tags":{"name":"Askari Bank","amenity":"bank"},"name":"Askari Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Associated Bank":{"tags":{"name":"Associated Bank","amenity":"bank"},"name":"Associated Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Axis Bank":{"tags":{"name":"Axis Bank","amenity":"bank"},"name":"Axis Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BAC":{"tags":{"name":"BAC","amenity":"bank"},"name":"BAC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BAWAG PSK":{"tags":{"name":"BAWAG PSK","amenity":"bank"},"name":"BAWAG PSK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BB&T":{"tags":{"name":"BB&T","amenity":"bank"},"name":"BB&T","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBBank":{"tags":{"name":"BBBank","amenity":"bank"},"name":"BBBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBK":{"tags":{"name":"BBK","amenity":"bank"},"name":"BBK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA":{"tags":{"name":"BBVA","amenity":"bank"},"name":"BBVA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Bancomer":{"tags":{"name":"BBVA Bancomer","amenity":"bank"},"name":"BBVA Bancomer","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Compass":{"tags":{"name":"BBVA Compass","amenity":"bank"},"name":"BBVA Compass","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Continental":{"tags":{"name":"BBVA Continental","amenity":"bank"},"name":"BBVA Continental","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Francés":{"tags":{"name":"BBVA Francés","amenity":"bank"},"name":"BBVA Francés","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCA":{"tags":{"name":"BCA","amenity":"bank"},"name":"BCA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCI":{"tags":{"name":"BCI","amenity":"bank"},"name":"BCI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCP":{"tags":{"name":"BCP","amenity":"bank"},"name":"BCP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCR":{"tags":{"name":"BCR","amenity":"bank"},"name":"BCR","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BDO":{"tags":{"name":"BDO","amenity":"bank"},"name":"BDO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BGŻ BNP Paribas":{"tags":{"name":"BGŻ BNP Paribas","amenity":"bank"},"name":"BGŻ BNP Paribas","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMCE":{"tags":{"name":"BMCE","amenity":"bank"},"name":"BMCE","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMN":{"tags":{"name":"BMN","amenity":"bank"},"name":"BMN","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMO":{"tags":{"name":"BMO","amenity":"bank"},"name":"BMO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMO Harris Bank":{"tags":{"name":"BMO Harris Bank","amenity":"bank"},"name":"BMO Harris Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNA":{"tags":{"name":"BNA","amenity":"bank"},"name":"BNA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNI":{"tags":{"name":"BNI","amenity":"bank"},"name":"BNI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNL":{"tags":{"name":"BNL","amenity":"bank"},"name":"BNL","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNP Paribas":{"tags":{"name":"BNP Paribas","amenity":"bank"},"name":"BNP Paribas","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNP Paribas Fortis":{"tags":{"name":"BNP Paribas Fortis","amenity":"bank"},"name":"BNP Paribas Fortis","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BOC":{"tags":{"name":"BOC","amenity":"bank"},"name":"BOC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BPH":{"tags":{"name":"BPH","amenity":"bank"},"name":"BPH","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BPI":{"tags":{"name":"BPI","amenity":"bank"},"name":"BPI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BPI Family Savings Bank":{"tags":{"name":"BPI Family Savings Bank","amenity":"bank"},"name":"BPI Family Savings Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BRD":{"tags":{"name":"BRD","amenity":"bank"},"name":"BRD","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BRED":{"tags":{"name":"BRED","amenity":"bank"},"name":"BRED","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BRI":{"tags":{"name":"BRI","amenity":"bank"},"name":"BRI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BW-Bank":{"tags":{"name":"BW-Bank","amenity":"bank"},"name":"BW-Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BZ WBK":{"tags":{"name":"BZ WBK","amenity":"bank"},"name":"BZ WBK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banamex":{"tags":{"name":"Banamex","amenity":"bank"},"name":"Banamex","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banc Sabadell":{"tags":{"name":"Banc Sabadell","amenity":"bank"},"name":"Banc Sabadell","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Intesa":{"tags":{"name":"Banca Intesa","amenity":"bank"},"name":"Banca Intesa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca March":{"tags":{"name":"Banca March","amenity":"bank"},"name":"Banca March","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Milano":{"tags":{"name":"Banca Popolare di Milano","amenity":"bank"},"name":"Banca Popolare di Milano","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Novara":{"tags":{"name":"Banca Popolare di Novara","amenity":"bank"},"name":"Banca Popolare di Novara","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Sondrio":{"tags":{"name":"Banca Popolare di Sondrio","amenity":"bank"},"name":"Banca Popolare di Sondrio","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Verona":{"tags":{"name":"Banca Popolare di Verona","amenity":"bank"},"name":"Banca Popolare di Verona","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Vicenza":{"tags":{"name":"Banca Popolare di Vicenza","amenity":"bank"},"name":"Banca Popolare di Vicenza","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Românească":{"tags":{"name":"Banca Românească","amenity":"bank"},"name":"Banca Românească","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Sella":{"tags":{"name":"Banca Sella","amenity":"bank"},"name":"Banca Sella","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Transilvania":{"tags":{"name":"Banca Transilvania","amenity":"bank"},"name":"Banca Transilvania","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Agrario":{"tags":{"name":"Banco Agrario","amenity":"bank"},"name":"Banco Agrario","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Azteca":{"tags":{"name":"Banco Azteca","amenity":"bank"},"name":"Banco Azteca","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco BCI":{"tags":{"name":"Banco BCI","amenity":"bank"},"name":"Banco BCI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Bradesco":{"tags":{"name":"Banco Bradesco","amenity":"bank"},"name":"Banco Bradesco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Continental":{"tags":{"name":"Banco Continental","amenity":"bank"},"name":"Banco Continental","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Estado":{"tags":{"name":"Banco Estado","amenity":"bank"},"name":"Banco Estado","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Fassil":{"tags":{"name":"Banco Fassil","amenity":"bank"},"name":"Banco Fassil","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco G&T Continental":{"tags":{"name":"Banco G&T Continental","amenity":"bank"},"name":"Banco G&T Continental","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco General":{"tags":{"name":"Banco General","amenity":"bank"},"name":"Banco General","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Industrial":{"tags":{"name":"Banco Industrial","amenity":"bank"},"name":"Banco Industrial","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Internacional":{"tags":{"name":"Banco Internacional","amenity":"bank"},"name":"Banco Internacional","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Itaú":{"tags":{"name":"Banco Itaú","amenity":"bank"},"name":"Banco Itaú","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Nacional":{"tags":{"name":"Banco Nacional","amenity":"bank"},"name":"Banco Nacional","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Nación":{"tags":{"name":"Banco Nación","amenity":"bank"},"name":"Banco Nación","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Pastor":{"tags":{"name":"Banco Pastor","amenity":"bank"},"name":"Banco Pastor","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Pichincha":{"tags":{"name":"Banco Pichincha","amenity":"bank"},"name":"Banco Pichincha","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Popular":{"tags":{"name":"Banco Popular","amenity":"bank"},"name":"Banco Popular","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Provincia":{"tags":{"name":"Banco Provincia","amenity":"bank"},"name":"Banco Provincia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Sabadell":{"tags":{"name":"Banco Sabadell","amenity":"bank"},"name":"Banco Sabadell","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Santander":{"tags":{"name":"Banco Santander","amenity":"bank"},"name":"Banco Santander","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Sol":{"tags":{"name":"Banco Sol","amenity":"bank"},"name":"Banco Sol","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Bogotá":{"tags":{"name":"Banco de Bogotá","amenity":"bank"},"name":"Banco de Bogotá","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Chile":{"tags":{"name":"Banco de Chile","amenity":"bank"},"name":"Banco de Chile","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Costa Rica":{"tags":{"name":"Banco de Costa Rica","amenity":"bank"},"name":"Banco de Costa Rica","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Desarrollo Banrural":{"tags":{"name":"Banco de Desarrollo Banrural","amenity":"bank"},"name":"Banco de Desarrollo Banrural","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Occidente":{"tags":{"name":"Banco de Occidente","amenity":"bank"},"name":"Banco de Occidente","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Venezuela":{"tags":{"name":"Banco de Venezuela","amenity":"bank"},"name":"Banco de Venezuela","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de la Nación":{"tags":{"name":"Banco de la Nación","amenity":"bank"},"name":"Banco de la Nación","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de la Nación Argentina":{"tags":{"name":"Banco de la Nación Argentina","amenity":"bank"},"name":"Banco de la Nación Argentina","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco di Napoli":{"tags":{"name":"Banco di Napoli","amenity":"bank"},"name":"Banco di Napoli","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco di Sardegna":{"tags":{"name":"Banco di Sardegna","amenity":"bank"},"name":"Banco di Sardegna","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco do Brasil":{"tags":{"name":"Banco do Brasil","amenity":"bank"},"name":"Banco do Brasil","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco do Nordeste":{"tags":{"name":"Banco do Nordeste","amenity":"bank"},"name":"Banco do Nordeste","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BancoEstado":{"tags":{"name":"BancoEstado","amenity":"bank"},"name":"BancoEstado","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bancolombia":{"tags":{"name":"Bancolombia","amenity":"bank"},"name":"Bancolombia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bancomer":{"tags":{"name":"Bancomer","amenity":"bank"},"name":"Bancomer","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bancpost":{"tags":{"name":"Bancpost","amenity":"bank"},"name":"Bancpost","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banesco":{"tags":{"name":"Banesco","amenity":"bank"},"name":"Banesco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bangkok Bank":{"tags":{"name":"Bangkok Bank","amenity":"bank"},"name":"Bangkok Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Al Habib":{"tags":{"name":"Bank Al Habib","amenity":"bank"},"name":"Bank Al Habib","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Alfalah":{"tags":{"name":"Bank Alfalah","amenity":"bank"},"name":"Bank Alfalah","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Austria":{"tags":{"name":"Bank Austria","amenity":"bank"},"name":"Bank Austria","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BCA":{"tags":{"name":"Bank BCA","amenity":"bank"},"name":"Bank BCA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BNI":{"tags":{"name":"Bank BNI","amenity":"bank"},"name":"Bank BNI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BPH":{"tags":{"name":"Bank BPH","amenity":"bank"},"name":"Bank BPH","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BRI":{"tags":{"name":"Bank BRI","amenity":"bank"},"name":"Bank BRI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Danamon":{"tags":{"name":"Bank Danamon","amenity":"bank"},"name":"Bank Danamon","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Mandiri":{"tags":{"name":"Bank Mandiri","amenity":"bank"},"name":"Bank Mandiri","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Mega":{"tags":{"name":"Bank Mega","amenity":"bank"},"name":"Bank Mega","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Spółdzielczy":{"tags":{"name":"Bank Spółdzielczy","amenity":"bank"},"name":"Bank Spółdzielczy","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Zachodni WBK":{"tags":{"name":"Bank Zachodni WBK","amenity":"bank"},"name":"Bank Zachodni WBK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Africa":{"tags":{"name":"Bank of Africa","amenity":"bank"},"name":"Bank of Africa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of America":{"tags":{"name":"Bank of America","amenity":"bank"},"name":"Bank of America","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Baroda":{"tags":{"name":"Bank of Baroda","amenity":"bank"},"name":"Bank of Baroda","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Ceylon":{"tags":{"name":"Bank of Ceylon","amenity":"bank"},"name":"Bank of Ceylon","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of China":{"tags":{"name":"Bank of China","amenity":"bank"},"name":"Bank of China","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Commerce":{"tags":{"name":"Bank of Commerce","amenity":"bank"},"name":"Bank of Commerce","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of India":{"tags":{"name":"Bank of India","amenity":"bank"},"name":"Bank of India","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Ireland":{"tags":{"name":"Bank of Ireland","amenity":"bank"},"name":"Bank of Ireland","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Montreal":{"tags":{"name":"Bank of Montreal","amenity":"bank"},"name":"Bank of Montreal","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of New Zealand":{"tags":{"name":"Bank of New Zealand","amenity":"bank"},"name":"Bank of New Zealand","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Scotland":{"tags":{"name":"Bank of Scotland","amenity":"bank"},"name":"Bank of Scotland","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of the West":{"tags":{"name":"Bank of the West","amenity":"bank"},"name":"Bank of the West","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bankia":{"tags":{"name":"Bankia","amenity":"bank"},"name":"Bankia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bankinter":{"tags":{"name":"Bankinter","amenity":"bank"},"name":"Bankinter","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banner Bank":{"tags":{"name":"Banner Bank","amenity":"bank"},"name":"Banner Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banorte":{"tags":{"name":"Banorte","amenity":"bank"},"name":"Banorte","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banque Atlantique":{"tags":{"name":"Banque Atlantique","amenity":"bank"},"name":"Banque Atlantique","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banque Nationale":{"tags":{"name":"Banque Nationale","amenity":"bank"},"name":"Banque Nationale","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banque Populaire":{"tags":{"name":"Banque Populaire","amenity":"bank"},"name":"Banque Populaire","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banrisul":{"tags":{"name":"Banrisul","amenity":"bank"},"name":"Banrisul","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banrural":{"tags":{"name":"Banrural","amenity":"bank"},"name":"Banrural","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Barclays":{"tags":{"name":"Barclays","amenity":"bank"},"name":"Barclays","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bcc":{"tags":{"name":"Bcc","amenity":"bank"},"name":"Bcc","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Belfius":{"tags":{"name":"Belfius","amenity":"bank"},"name":"Belfius","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bendigo Bank":{"tags":{"name":"Bendigo Bank","amenity":"bank"},"name":"Bendigo Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Berliner Volksbank":{"tags":{"name":"Berliner Volksbank","amenity":"bank"},"name":"Berliner Volksbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bicentenario":{"tags":{"name":"Bicentenario","amenity":"bank"},"name":"Bicentenario","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bradesco":{"tags":{"name":"Bradesco","amenity":"bank"},"name":"Bradesco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Budapest Bank":{"tags":{"name":"Budapest Bank","amenity":"bank"},"name":"Budapest Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CBAO":{"tags":{"name":"CBAO","amenity":"bank"},"name":"CBAO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CEC Bank":{"tags":{"name":"CEC Bank","amenity":"bank"},"name":"CEC Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CGD":{"tags":{"name":"CGD","amenity":"bank"},"name":"CGD","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIB Bank":{"tags":{"name":"CIB Bank","amenity":"bank"},"name":"CIB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIBC":{"tags":{"name":"CIBC","amenity":"bank"},"name":"CIBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIC":{"tags":{"name":"CIC","amenity":"bank"},"name":"CIC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIMB Bank":{"tags":{"name":"CIMB Bank","amenity":"bank"},"name":"CIMB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CNEP":{"tags":{"name":"CNEP","amenity":"bank"},"name":"CNEP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caisse Desjardins":{"tags":{"name":"Caisse Desjardins","amenity":"bank"},"name":"Caisse Desjardins","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caisse d'Épargne":{"tags":{"name":"Caisse d'Épargne","amenity":"bank"},"name":"Caisse d'Épargne","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caixa":{"tags":{"name":"Caixa","amenity":"bank"},"name":"Caixa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caixa Econômica Federal":{"tags":{"name":"Caixa Econômica Federal","amenity":"bank"},"name":"Caixa Econômica Federal","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caixa Geral de Depósitos":{"tags":{"name":"Caixa Geral de Depósitos","amenity":"bank"},"name":"Caixa Geral de Depósitos","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CaixaBank":{"tags":{"name":"CaixaBank","amenity":"bank"},"name":"CaixaBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Círculo":{"tags":{"name":"Caja Círculo","amenity":"bank"},"name":"Caja Círculo","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Duero":{"tags":{"name":"Caja Duero","amenity":"bank"},"name":"Caja Duero","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja España":{"tags":{"name":"Caja España","amenity":"bank"},"name":"Caja España","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Rural":{"tags":{"name":"Caja Rural","amenity":"bank"},"name":"Caja Rural","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Rural de Jaén":{"tags":{"name":"Caja Rural de Jaén","amenity":"bank"},"name":"Caja Rural de Jaén","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CajaSur":{"tags":{"name":"CajaSur","amenity":"bank"},"name":"CajaSur","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cajamar":{"tags":{"name":"Cajamar","amenity":"bank"},"name":"Cajamar","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cajero Automatico Bancared":{"tags":{"name":"Cajero Automatico Bancared","amenity":"bank"},"name":"Cajero Automatico Bancared","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Canara Bank":{"tags":{"name":"Canara Bank","amenity":"bank"},"name":"Canara Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Capital One":{"tags":{"name":"Capital One","amenity":"bank"},"name":"Capital One","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Carige":{"tags":{"name":"Carige","amenity":"bank"},"name":"Carige","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cariparma":{"tags":{"name":"Cariparma","amenity":"bank"},"name":"Cariparma","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cassa di Risparmio del Veneto":{"tags":{"name":"Cassa di Risparmio del Veneto","amenity":"bank"},"name":"Cassa di Risparmio del Veneto","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CatalunyaCaixa":{"tags":{"name":"CatalunyaCaixa","amenity":"bank"},"name":"CatalunyaCaixa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Central Bank of India":{"tags":{"name":"Central Bank of India","amenity":"bank"},"name":"Central Bank of India","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Chase":{"tags":{"name":"Chase","amenity":"bank"},"name":"Chase","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/China Bank":{"tags":{"name":"China Bank","amenity":"bank"},"name":"China Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/China Bank Savings":{"tags":{"name":"China Bank Savings","amenity":"bank"},"name":"China Bank Savings","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/China Construction Bank":{"tags":{"name":"China Construction Bank","amenity":"bank"},"name":"China Construction Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Citibank":{"tags":{"name":"Citibank","amenity":"bank"},"name":"Citibank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Citizens Bank":{"tags":{"name":"Citizens Bank","amenity":"bank"},"name":"Citizens Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Clydesdale Bank":{"tags":{"name":"Clydesdale Bank","amenity":"bank"},"name":"Clydesdale Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Columbia Bank":{"tags":{"name":"Columbia Bank","amenity":"bank"},"name":"Columbia Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Comerica Bank":{"tags":{"name":"Comerica Bank","amenity":"bank"},"name":"Comerica Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commerce Bank":{"tags":{"name":"Commerce Bank","amenity":"bank"},"name":"Commerce Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commercial Bank":{"tags":{"name":"Commercial Bank","amenity":"bank"},"name":"Commercial Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commercial Bank of Ceylon PLC":{"tags":{"name":"Commercial Bank of Ceylon PLC","amenity":"bank"},"name":"Commercial Bank of Ceylon PLC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commerzbank":{"tags":{"name":"Commerzbank","amenity":"bank"},"name":"Commerzbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commonwealth Bank":{"tags":{"name":"Commonwealth Bank","amenity":"bank"},"name":"Commonwealth Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Corporation Bank":{"tags":{"name":"Corporation Bank","amenity":"bank"},"name":"Corporation Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credem":{"tags":{"name":"Credem","amenity":"bank"},"name":"Credem","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credicoop":{"tags":{"name":"Credicoop","amenity":"bank"},"name":"Credicoop","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credit Agricole":{"tags":{"name":"Credit Agricole","amenity":"bank"},"name":"Credit Agricole","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credit Suisse":{"tags":{"name":"Credit Suisse","amenity":"bank"},"name":"Credit Suisse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crelan":{"tags":{"name":"Crelan","amenity":"bank"},"name":"Crelan","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit Agricole":{"tags":{"name":"Crédit Agricole","amenity":"bank"},"name":"Crédit Agricole","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit Mutuel":{"tags":{"name":"Crédit Mutuel","amenity":"bank"},"name":"Crédit Mutuel","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit Mutuel de Bretagne":{"tags":{"name":"Crédit Mutuel de Bretagne","amenity":"bank"},"name":"Crédit Mutuel de Bretagne","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit du Nord":{"tags":{"name":"Crédit du Nord","amenity":"bank"},"name":"Crédit du Nord","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédito Agrícola":{"tags":{"name":"Crédito Agrícola","amenity":"bank"},"name":"Crédito Agrícola","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cбербанк":{"tags":{"name":"Cбербанк","amenity":"bank"},"name":"Cбербанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Danske Bank":{"tags":{"name":"Danske Bank","amenity":"bank"},"name":"Danske Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Davivienda":{"tags":{"name":"Davivienda","amenity":"bank"},"name":"Davivienda","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/De Venezuela":{"tags":{"name":"De Venezuela","amenity":"bank"},"name":"De Venezuela","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Denizbank":{"tags":{"name":"Denizbank","amenity":"bank"},"name":"Denizbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Desjardins":{"tags":{"name":"Desjardins","amenity":"bank"},"name":"Desjardins","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Deutsche Bank":{"tags":{"name":"Deutsche Bank","amenity":"bank"},"name":"Deutsche Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Dubai Islamic Bank":{"tags":{"name":"Dubai Islamic Bank","amenity":"bank"},"name":"Dubai Islamic Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/EastWest Bank":{"tags":{"name":"EastWest Bank","amenity":"bank"},"name":"EastWest Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ecobank":{"tags":{"name":"Ecobank","amenity":"bank"},"name":"Ecobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Erste Bank":{"tags":{"name":"Erste Bank","amenity":"bank"},"name":"Erste Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Eurobank":{"tags":{"name":"Eurobank","amenity":"bank"},"name":"Eurobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Express Union":{"tags":{"name":"Express Union","amenity":"bank"},"name":"Express Union","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/FNB":{"tags":{"name":"FNB","amenity":"bank"},"name":"FNB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Federal Bank":{"tags":{"name":"Federal Bank","amenity":"bank"},"name":"Federal Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Fifth Third Bank":{"tags":{"name":"Fifth Third Bank","amenity":"bank"},"name":"Fifth Third Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Finansbank":{"tags":{"name":"Finansbank","amenity":"bank"},"name":"Finansbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/First Bank":{"tags":{"name":"First Bank","amenity":"bank"},"name":"First Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/First Citizens Bank":{"tags":{"name":"First Citizens Bank","amenity":"bank"},"name":"First Citizens Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/First National Bank":{"tags":{"name":"First National Bank","amenity":"bank"},"name":"First National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Galicia":{"tags":{"name":"Galicia","amenity":"bank"},"name":"Galicia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Garanti":{"tags":{"name":"Garanti","amenity":"bank"},"name":"Garanti","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Garanti Bankası":{"tags":{"name":"Garanti Bankası","amenity":"bank"},"name":"Garanti Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Getin Bank":{"tags":{"name":"Getin Bank","amenity":"bank"},"name":"Getin Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Groupama":{"tags":{"name":"Groupama","amenity":"bank"},"name":"Groupama","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HDFC Bank":{"tags":{"name":"HDFC Bank","amenity":"bank"},"name":"HDFC Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HNB":{"tags":{"name":"HNB","amenity":"bank"},"name":"HNB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HSBC":{"tags":{"name":"HSBC","amenity":"bank"},"name":"HSBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Halifax":{"tags":{"name":"Halifax","amenity":"bank"},"name":"Halifax","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Halkbank":{"tags":{"name":"Halkbank","amenity":"bank"},"name":"Halkbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Hamburger Sparkasse":{"tags":{"name":"Hamburger Sparkasse","amenity":"bank"},"name":"Hamburger Sparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Handelsbanken":{"tags":{"name":"Handelsbanken","amenity":"bank"},"name":"Handelsbanken","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Hong Leong Bank":{"tags":{"name":"Hong Leong Bank","amenity":"bank"},"name":"Hong Leong Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Hrvatska poštanska banka":{"tags":{"name":"Hrvatska poštanska banka","amenity":"bank"},"name":"Hrvatska poštanska banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Huntington Bank":{"tags":{"name":"Huntington Bank","amenity":"bank"},"name":"Huntington Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HypoVereinsbank":{"tags":{"name":"HypoVereinsbank","amenity":"bank"},"name":"HypoVereinsbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ICBC":{"tags":{"name":"ICBC","amenity":"bank"},"name":"ICBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ICICI Bank":{"tags":{"name":"ICICI Bank","amenity":"bank"},"name":"ICICI Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/IDBI Bank":{"tags":{"name":"IDBI Bank","amenity":"bank"},"name":"IDBI Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ING":{"tags":{"name":"ING","amenity":"bank"},"name":"ING","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ING Bank Śląski":{"tags":{"name":"ING Bank Śląski","amenity":"bank"},"name":"ING Bank Śląski","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/IberCaja":{"tags":{"name":"IberCaja","amenity":"bank"},"name":"IberCaja","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Indian Bank":{"tags":{"name":"Indian Bank","amenity":"bank"},"name":"Indian Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Indian Overseas Bank":{"tags":{"name":"Indian Overseas Bank","amenity":"bank"},"name":"Indian Overseas Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Interbank":{"tags":{"name":"Interbank","amenity":"bank"},"name":"Interbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Intesa San Paolo":{"tags":{"name":"Intesa San Paolo","amenity":"bank"},"name":"Intesa San Paolo","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Itaú":{"tags":{"name":"Itaú","amenity":"bank"},"name":"Itaú","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/K&H Bank":{"tags":{"name":"K&H Bank","amenity":"bank"},"name":"K&H Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/KBC":{"tags":{"name":"KBC","amenity":"bank"},"name":"KBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kasa Stefczyka":{"tags":{"name":"Kasa Stefczyka","amenity":"bank"},"name":"Kasa Stefczyka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Key Bank":{"tags":{"name":"Key Bank","amenity":"bank"},"name":"Key Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Komerční banka":{"tags":{"name":"Komerční banka","amenity":"bank"},"name":"Komerční banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kreissparkasse":{"tags":{"name":"Kreissparkasse","amenity":"bank"},"name":"Kreissparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kreissparkasse Köln":{"tags":{"name":"Kreissparkasse Köln","amenity":"bank"},"name":"Kreissparkasse Köln","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kutxabank":{"tags":{"name":"Kutxabank","amenity":"bank"},"name":"Kutxabank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/LCL":{"tags":{"name":"LCL","amenity":"bank"},"name":"LCL","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/La Banque Postale":{"tags":{"name":"La Banque Postale","amenity":"bank"},"name":"La Banque Postale","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/La Caixa":{"tags":{"name":"La Caixa","amenity":"bank"},"name":"La Caixa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Laboral Kutxa":{"tags":{"name":"Laboral Kutxa","amenity":"bank"},"name":"Laboral Kutxa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Landbank":{"tags":{"name":"Landbank","amenity":"bank"},"name":"Landbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Liberbank":{"tags":{"name":"Liberbank","amenity":"bank"},"name":"Liberbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Lloyds Bank":{"tags":{"name":"Lloyds Bank","amenity":"bank"},"name":"Lloyds Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/M&T Bank":{"tags":{"name":"M&T Bank","amenity":"bank"},"name":"M&T Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/MCB":{"tags":{"name":"MCB","amenity":"bank"},"name":"MCB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/MCB Bank":{"tags":{"name":"MCB Bank","amenity":"bank"},"name":"MCB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/MONETA Money Bank":{"tags":{"name":"MONETA Money Bank","amenity":"bank"},"name":"MONETA Money Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Macro":{"tags":{"name":"Macro","amenity":"bank"},"name":"Macro","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Maybank":{"tags":{"name":"Maybank","amenity":"bank"},"name":"Maybank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Meezan Bank":{"tags":{"name":"Meezan Bank","amenity":"bank"},"name":"Meezan Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Mercantil":{"tags":{"name":"Mercantil","amenity":"bank"},"name":"Mercantil","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Metro Bank":{"tags":{"name":"Metro Bank","amenity":"bank"},"name":"Metro Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Metrobank":{"tags":{"name":"Metrobank","amenity":"bank"},"name":"Metrobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Millennium BCP":{"tags":{"name":"Millennium BCP","amenity":"bank"},"name":"Millennium BCP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Millennium Bank":{"tags":{"name":"Millennium Bank","amenity":"bank"},"name":"Millennium Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Monte dei Paschi di Siena":{"tags":{"name":"Monte dei Paschi di Siena","amenity":"bank"},"name":"Monte dei Paschi di Siena","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Montepio":{"tags":{"name":"Montepio","amenity":"bank"},"name":"Montepio","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/NAB":{"tags":{"name":"NAB","amenity":"bank"},"name":"NAB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/NSB":{"tags":{"name":"NSB","amenity":"bank"},"name":"NSB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/NatWest":{"tags":{"name":"NatWest","amenity":"bank"},"name":"NatWest","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/National Bank":{"tags":{"name":"National Bank","amenity":"bank"},"name":"National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Nationwide":{"tags":{"name":"Nationwide","amenity":"bank"},"name":"Nationwide","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Nedbank":{"tags":{"name":"Nedbank","amenity":"bank"},"name":"Nedbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Nordea":{"tags":{"name":"Nordea","amenity":"bank"},"name":"Nordea","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Novo Banco":{"tags":{"name":"Novo Banco","amenity":"bank"},"name":"Novo Banco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/OLB":{"tags":{"name":"OLB","amenity":"bank"},"name":"OLB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/OTP":{"tags":{"name":"OTP","amenity":"bank"},"name":"OTP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Oberbank":{"tags":{"name":"Oberbank","amenity":"bank"},"name":"Oberbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Occidental de Descuento":{"tags":{"name":"Occidental de Descuento","amenity":"bank"},"name":"Occidental de Descuento","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Oldenburgische Landesbank":{"tags":{"name":"Oldenburgische Landesbank","amenity":"bank"},"name":"Oldenburgische Landesbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/One Network Bank":{"tags":{"name":"One Network Bank","amenity":"bank"},"name":"One Network Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Osuuspankki":{"tags":{"name":"Osuuspankki","amenity":"bank"},"name":"Osuuspankki","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PBZ":{"tags":{"name":"PBZ","amenity":"bank"},"name":"PBZ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PKO":{"tags":{"name":"PKO","amenity":"bank"},"name":"PKO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PKO BP":{"tags":{"name":"PKO BP","amenity":"bank"},"name":"PKO BP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PNB":{"tags":{"name":"PNB","amenity":"bank"},"name":"PNB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PNC":{"tags":{"name":"PNC","amenity":"bank"},"name":"PNC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PNC Bank":{"tags":{"name":"PNC Bank","amenity":"bank"},"name":"PNC Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PSBank":{"tags":{"name":"PSBank","amenity":"bank"},"name":"PSBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Patagonia":{"tags":{"name":"Patagonia","amenity":"bank"},"name":"Patagonia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Pekao SA":{"tags":{"name":"Pekao SA","amenity":"bank"},"name":"Pekao SA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Peoples Bank":{"tags":{"name":"Peoples Bank","amenity":"bank"},"name":"Peoples Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Philippine National Bank":{"tags":{"name":"Philippine National Bank","amenity":"bank"},"name":"Philippine National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Piraeus Bank":{"tags":{"name":"Piraeus Bank","amenity":"bank"},"name":"Piraeus Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Popular":{"tags":{"name":"Popular","amenity":"bank"},"name":"Popular","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Postbank":{"tags":{"name":"Postbank","amenity":"bank"},"name":"Postbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Postbank Finanzcenter":{"tags":{"name":"Postbank Finanzcenter","amenity":"bank"},"name":"Postbank Finanzcenter","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Provincial":{"tags":{"name":"Provincial","amenity":"bank"},"name":"Provincial","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Public Bank":{"tags":{"name":"Public Bank","amenity":"bank"},"name":"Public Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Punjab National Bank":{"tags":{"name":"Punjab National Bank","amenity":"bank"},"name":"Punjab National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RBC":{"tags":{"name":"RBC","amenity":"bank"},"name":"RBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RBC Financial Group":{"tags":{"name":"RBC Financial Group","amenity":"bank"},"name":"RBC Financial Group","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RBS":{"tags":{"name":"RBS","amenity":"bank"},"name":"RBS","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RCBC":{"tags":{"name":"RCBC","amenity":"bank"},"name":"RCBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RCBC Savings Bank":{"tags":{"name":"RCBC Savings Bank","amenity":"bank"},"name":"RCBC Savings Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Rabobank":{"tags":{"name":"Rabobank","amenity":"bank"},"name":"Rabobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Raiffeisen Polbank":{"tags":{"name":"Raiffeisen Polbank","amenity":"bank"},"name":"Raiffeisen Polbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Raiffeisenbank":{"tags":{"name":"Raiffeisenbank","amenity":"bank"},"name":"Raiffeisenbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Regions Bank":{"tags":{"name":"Regions Bank","amenity":"bank"},"name":"Regions Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Republic Bank":{"tags":{"name":"Republic Bank","amenity":"bank"},"name":"Republic Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Royal Bank":{"tags":{"name":"Royal Bank","amenity":"bank"},"name":"Royal Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Royal Bank of Canada":{"tags":{"name":"Royal Bank of Canada","amenity":"bank"},"name":"Royal Bank of Canada","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Royal Bank of Scotland":{"tags":{"name":"Royal Bank of Scotland","amenity":"bank"},"name":"Royal Bank of Scotland","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/SEB":{"tags":{"name":"SEB","amenity":"bank"},"name":"SEB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/SNS Bank":{"tags":{"name":"SNS Bank","amenity":"bank"},"name":"SNS Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sabadell":{"tags":{"name":"Sabadell","amenity":"bank"},"name":"Sabadell","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sampath Bank":{"tags":{"name":"Sampath Bank","amenity":"bank"},"name":"Sampath Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander":{"tags":{"name":"Santander","amenity":"bank"},"name":"Santander","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander Consumer Bank":{"tags":{"name":"Santander Consumer Bank","amenity":"bank"},"name":"Santander Consumer Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander Río":{"tags":{"name":"Santander Río","amenity":"bank"},"name":"Santander Río","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander Totta":{"tags":{"name":"Santander Totta","amenity":"bank"},"name":"Santander Totta","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sberbank":{"tags":{"name":"Sberbank","amenity":"bank"},"name":"Sberbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Scotiabank":{"tags":{"name":"Scotiabank","amenity":"bank"},"name":"Scotiabank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Security Bank":{"tags":{"name":"Security Bank","amenity":"bank"},"name":"Security Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sicredi":{"tags":{"name":"Sicredi","amenity":"bank"},"name":"Sicredi","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Slovenská sporiteľňa":{"tags":{"name":"Slovenská sporiteľňa","amenity":"bank"},"name":"Slovenská sporiteľňa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Société Générale":{"tags":{"name":"Société Générale","amenity":"bank"},"name":"Société Générale","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparda-Bank":{"tags":{"name":"Sparda-Bank","amenity":"bank"},"name":"Sparda-Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparkasse":{"tags":{"name":"Sparkasse","amenity":"bank"},"name":"Sparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparkasse Aachen":{"tags":{"name":"Sparkasse Aachen","amenity":"bank"},"name":"Sparkasse Aachen","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparkasse KölnBonn":{"tags":{"name":"Sparkasse KölnBonn","amenity":"bank"},"name":"Sparkasse KölnBonn","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Stadtsparkasse":{"tags":{"name":"Stadtsparkasse","amenity":"bank"},"name":"Stadtsparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Stanbic Bank":{"tags":{"name":"Stanbic Bank","amenity":"bank"},"name":"Stanbic Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Standard Bank":{"tags":{"name":"Standard Bank","amenity":"bank"},"name":"Standard Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Standard Chartered":{"tags":{"name":"Standard Chartered","amenity":"bank"},"name":"Standard Chartered","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Standard Chartered Bank":{"tags":{"name":"Standard Chartered Bank","amenity":"bank"},"name":"Standard Chartered Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/State Bank of India":{"tags":{"name":"State Bank of India","amenity":"bank"},"name":"State Bank of India","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/SunTrust":{"tags":{"name":"SunTrust","amenity":"bank"},"name":"SunTrust","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Supervielle":{"tags":{"name":"Supervielle","amenity":"bank"},"name":"Supervielle","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Swedbank":{"tags":{"name":"Swedbank","amenity":"bank"},"name":"Swedbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Syndicate Bank":{"tags":{"name":"Syndicate Bank","amenity":"bank"},"name":"Syndicate Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TCF Bank":{"tags":{"name":"TCF Bank","amenity":"bank"},"name":"TCF Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TD Bank":{"tags":{"name":"TD Bank","amenity":"bank"},"name":"TD Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TD Canada Trust":{"tags":{"name":"TD Canada Trust","amenity":"bank"},"name":"TD Canada Trust","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TEB":{"tags":{"name":"TEB","amenity":"bank"},"name":"TEB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TSB":{"tags":{"name":"TSB","amenity":"bank"},"name":"TSB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Takarékszövetkezet":{"tags":{"name":"Takarékszövetkezet","amenity":"bank"},"name":"Takarékszövetkezet","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Targobank":{"tags":{"name":"Targobank","amenity":"bank"},"name":"Targobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Tatra banka":{"tags":{"name":"Tatra banka","amenity":"bank"},"name":"Tatra banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Türkiye İş Bankası":{"tags":{"name":"Türkiye İş Bankası","amenity":"bank"},"name":"Türkiye İş Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UBS":{"tags":{"name":"UBS","amenity":"bank"},"name":"UBS","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UCO Bank":{"tags":{"name":"UCO Bank","amenity":"bank"},"name":"UCO Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UCPB":{"tags":{"name":"UCPB","amenity":"bank"},"name":"UCPB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UOB":{"tags":{"name":"UOB","amenity":"bank"},"name":"UOB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/US Bank":{"tags":{"name":"US Bank","amenity":"bank"},"name":"US Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ulster Bank":{"tags":{"name":"Ulster Bank","amenity":"bank"},"name":"Ulster Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Umpqua Bank":{"tags":{"name":"Umpqua Bank","amenity":"bank"},"name":"Umpqua Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UniCredit Bank":{"tags":{"name":"UniCredit Bank","amenity":"bank"},"name":"UniCredit Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Unicaja Banco":{"tags":{"name":"Unicaja Banco","amenity":"bank"},"name":"Unicaja Banco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Unicredit Banca":{"tags":{"name":"Unicredit Banca","amenity":"bank"},"name":"Unicredit Banca","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Union Bank":{"tags":{"name":"Union Bank","amenity":"bank"},"name":"Union Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/United Bank":{"tags":{"name":"United Bank","amenity":"bank"},"name":"United Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/VR-Bank":{"tags":{"name":"VR-Bank","amenity":"bank"},"name":"VR-Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Vakıfbank":{"tags":{"name":"Vakıfbank","amenity":"bank"},"name":"Vakıfbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Veneto Banca":{"tags":{"name":"Veneto Banca","amenity":"bank"},"name":"Veneto Banca","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Vijaya Bank":{"tags":{"name":"Vijaya Bank","amenity":"bank"},"name":"Vijaya Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volks- und Raiffeisenbank":{"tags":{"name":"Volks- und Raiffeisenbank","amenity":"bank"},"name":"Volks- und Raiffeisenbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volksbank":{"tags":{"name":"Volksbank","amenity":"bank"},"name":"Volksbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volksbank Mittelhessen":{"tags":{"name":"Volksbank Mittelhessen","amenity":"bank"},"name":"Volksbank Mittelhessen","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volksbank Raiffeisenbank":{"tags":{"name":"Volksbank Raiffeisenbank","amenity":"bank"},"name":"Volksbank Raiffeisenbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/VÚB":{"tags":{"name":"VÚB","amenity":"bank"},"name":"VÚB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Washington Federal":{"tags":{"name":"Washington Federal","amenity":"bank"},"name":"Washington Federal","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Wells Fargo":{"tags":{"name":"Wells Fargo","amenity":"bank"},"name":"Wells Fargo","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Western Union":{"tags":{"name":"Western Union","amenity":"bank"},"name":"Western Union","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Westpac":{"tags":{"name":"Westpac","amenity":"bank"},"name":"Westpac","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Yorkshire Bank":{"tags":{"name":"Yorkshire Bank","amenity":"bank"},"name":"Yorkshire Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Yorkshire Building Society":{"tags":{"name":"Yorkshire Building Society","amenity":"bank"},"name":"Yorkshire Building Society","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Zagrebačka banka":{"tags":{"name":"Zagrebačka banka","amenity":"bank"},"name":"Zagrebačka banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ziraat Bankası":{"tags":{"name":"Ziraat Bankası","amenity":"bank"},"name":"Ziraat Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/mBank":{"tags":{"name":"mBank","amenity":"bank"},"name":"mBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ČSOB":{"tags":{"name":"ČSOB","amenity":"bank"},"name":"ČSOB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Česká spořitelna":{"tags":{"name":"Česká spořitelna","amenity":"bank"},"name":"Česká spořitelna","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/İş Bankası":{"tags":{"name":"İş Bankası","amenity":"bank"},"name":"İş Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Εθνική Τράπεζα":{"tags":{"name":"Εθνική Τράπεζα","amenity":"bank"},"name":"Εθνική Τράπεζα","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Πειραιώς":{"tags":{"name":"Πειραιώς","amenity":"bank"},"name":"Πειραιώς","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Τράπεζα Πειραιώς":{"tags":{"name":"Τράπεζα Πειραιώς","amenity":"bank"},"name":"Τράπεζα Πειραιώς","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Авангард":{"tags":{"name":"Авангард","amenity":"bank"},"name":"Авангард","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Альфа-Банк":{"tags":{"name":"Альфа-Банк","amenity":"bank"},"name":"Альфа-Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Банк Москвы":{"tags":{"name":"Банк Москвы","amenity":"bank"},"name":"Банк Москвы","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Банка ДСК":{"tags":{"name":"Банка ДСК","amenity":"bank"},"name":"Банка ДСК","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Белагропромбанк":{"tags":{"name":"Белагропромбанк","amenity":"bank"},"name":"Белагропромбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Беларусбанк":{"tags":{"name":"Беларусбанк","amenity":"bank"},"name":"Беларусбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Белинвестбанк":{"tags":{"name":"Белинвестбанк","amenity":"bank"},"name":"Белинвестбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Бинбанк":{"tags":{"name":"Бинбанк","amenity":"bank"},"name":"Бинбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ВТБ":{"tags":{"name":"ВТБ","amenity":"bank"},"name":"ВТБ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ВТБ24":{"tags":{"name":"ВТБ24","amenity":"bank"},"name":"ВТБ24","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Возрождение":{"tags":{"name":"Возрождение","amenity":"bank"},"name":"Возрождение","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Газпромбанк":{"tags":{"name":"Газпромбанк","amenity":"bank"},"name":"Газпромбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Генбанк":{"tags":{"name":"Генбанк","amenity":"bank"},"name":"Генбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Казкоммерцбанк":{"tags":{"name":"Казкоммерцбанк","amenity":"bank"},"name":"Казкоммерцбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/МДМ Банк":{"tags":{"name":"МДМ Банк","amenity":"bank"},"name":"МДМ Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Московский индустриальный банк":{"tags":{"name":"Московский индустриальный банк","amenity":"bank"},"name":"Московский индустриальный банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Мособлбанк":{"tags":{"name":"Мособлбанк","amenity":"bank"},"name":"Мособлбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Народный банк":{"tags":{"name":"Народный банк","amenity":"bank"},"name":"Народный банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ОТП Банк":{"tags":{"name":"ОТП Банк","amenity":"bank"},"name":"ОТП Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Открытие":{"tags":{"name":"Открытие","amenity":"bank"},"name":"Открытие","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ощадбанк":{"tags":{"name":"Ощадбанк","amenity":"bank"},"name":"Ощадбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ПУМБ":{"tags":{"name":"ПУМБ","amenity":"bank"},"name":"ПУМБ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Почта Банк":{"tags":{"name":"Почта Банк","amenity":"bank"},"name":"Почта Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ПриватБанк":{"tags":{"name":"ПриватБанк","amenity":"bank"},"name":"ПриватБанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Приватбанк":{"tags":{"name":"Приватбанк","amenity":"bank"},"name":"Приватбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Приднестровский Сбербанк":{"tags":{"name":"Приднестровский Сбербанк","amenity":"bank"},"name":"Приднестровский Сбербанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Приорбанк":{"tags":{"name":"Приорбанк","amenity":"bank"},"name":"Приорбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Промсвязьбанк":{"tags":{"name":"Промсвязьбанк","amenity":"bank"},"name":"Промсвязьбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/РНКБ":{"tags":{"name":"РНКБ","amenity":"bank"},"name":"РНКБ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Райффайзен":{"tags":{"name":"Райффайзен","amenity":"bank"},"name":"Райффайзен","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Райффайзен Банк Аваль":{"tags":{"name":"Райффайзен Банк Аваль","amenity":"bank"},"name":"Райффайзен Банк Аваль","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Райффайзенбанк":{"tags":{"name":"Райффайзенбанк","amenity":"bank"},"name":"Райффайзенбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Росбанк":{"tags":{"name":"Росбанк","amenity":"bank"},"name":"Росбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Россельхозбанк":{"tags":{"name":"Россельхозбанк","amenity":"bank"},"name":"Россельхозбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Русский стандарт":{"tags":{"name":"Русский стандарт","amenity":"bank"},"name":"Русский стандарт","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Сбербанк":{"tags":{"name":"Сбербанк","amenity":"bank"},"name":"Сбербанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Совкомбанк":{"tags":{"name":"Совкомбанк","amenity":"bank"},"name":"Совкомбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/УкрСиббанк":{"tags":{"name":"УкрСиббанк","amenity":"bank"},"name":"УкрСиббанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Укрсоцбанк":{"tags":{"name":"Укрсоцбанк","amenity":"bank"},"name":"Укрсоцбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Уралсиб":{"tags":{"name":"Уралсиб","amenity":"bank"},"name":"Уралсиб","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Хоум Кредит":{"tags":{"name":"Хоум Кредит","amenity":"bank"},"name":"Хоум Кредит","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/בנק הפועלים":{"tags":{"name":"בנק הפועלים","amenity":"bank"},"name":"בנק הפועלים","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/בנק לאומי":{"tags":{"name":"בנק לאומי","amenity":"bank"},"name":"בנק לאומי","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک":{"tags":{"name":"بانک","amenity":"bank"},"name":"بانک","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک آینده":{"tags":{"name":"بانک آینده","amenity":"bank"},"name":"بانک آینده","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک اقتصاد نوین":{"tags":{"name":"بانک اقتصاد نوین","amenity":"bank"},"name":"بانک اقتصاد نوین","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک انصار":{"tags":{"name":"بانک انصار","amenity":"bank"},"name":"بانک انصار","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک تجارت":{"tags":{"name":"بانک تجارت","amenity":"bank"},"name":"بانک تجارت","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک رفاه":{"tags":{"name":"بانک رفاه","amenity":"bank"},"name":"بانک رفاه","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک رفاه کارگران":{"tags":{"name":"بانک رفاه کارگران","amenity":"bank"},"name":"بانک رفاه کارگران","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک سپه":{"tags":{"name":"بانک سپه","amenity":"bank"},"name":"بانک سپه","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک شهر":{"tags":{"name":"بانک شهر","amenity":"bank"},"name":"بانک شهر","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک صادرات":{"tags":{"name":"بانک صادرات","amenity":"bank"},"name":"بانک صادرات","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک قوامین":{"tags":{"name":"بانک قوامین","amenity":"bank"},"name":"بانک قوامین","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک مسکن":{"tags":{"name":"بانک مسکن","amenity":"bank"},"name":"بانک مسکن","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک ملت":{"tags":{"name":"بانک ملت","amenity":"bank"},"name":"بانک ملت","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک ملی":{"tags":{"name":"بانک ملی","amenity":"bank"},"name":"بانک ملی","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک ملی ایران":{"tags":{"name":"بانک ملی ایران","amenity":"bank"},"name":"بانک ملی ایران","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک مهر اقتصاد":{"tags":{"name":"بانک مهر اقتصاد","amenity":"bank"},"name":"بانک مهر اقتصاد","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک پارسیان":{"tags":{"name":"بانک پارسیان","amenity":"bank"},"name":"بانک پارسیان","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک پاسارگاد":{"tags":{"name":"بانک پاسارگاد","amenity":"bank"},"name":"بانک پاسارگاد","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک کشاورزی":{"tags":{"name":"بانک کشاورزی","amenity":"bank"},"name":"بانک کشاورزی","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/صادرات":{"tags":{"name":"صادرات","amenity":"bank"},"name":"صادرات","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ملی":{"tags":{"name":"ملی","amenity":"bank"},"name":"ملی","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/پست بانک":{"tags":{"name":"پست بانک","amenity":"bank"},"name":"پست بانک","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารกรุงเทพ":{"tags":{"name":"ธนาคารกรุงเทพ","amenity":"bank"},"name":"ธนาคารกรุงเทพ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารกรุงไทย":{"tags":{"name":"ธนาคารกรุงไทย","amenity":"bank"},"name":"ธนาคารกรุงไทย","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารกสิกรไทย":{"tags":{"name":"ธนาคารกสิกรไทย","amenity":"bank"},"name":"ธนาคารกสิกรไทย","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารออมสิน":{"tags":{"name":"ธนาคารออมสิน","amenity":"bank"},"name":"ธนาคารออมสิน","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารไทยพาณิชย์":{"tags":{"name":"ธนาคารไทยพาณิชย์","amenity":"bank"},"name":"ธนาคารไทยพาณิชย์","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/みずほ銀行":{"tags":{"name":"みずほ銀行","amenity":"bank"},"name":"みずほ銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/りそな銀行":{"tags":{"name":"りそな銀行","amenity":"bank"},"name":"りそな銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/三井住友銀行":{"tags":{"name":"三井住友銀行","amenity":"bank"},"name":"三井住友銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/三菱東京UFJ銀行":{"tags":{"name":"三菱東京UFJ銀行","amenity":"bank"},"name":"三菱東京UFJ銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国农业银行":{"tags":{"name":"中国农业银行","amenity":"bank"},"name":"中国农业银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国工商银行":{"tags":{"name":"中国工商银行","amenity":"bank"},"name":"中国工商银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国建设银行":{"tags":{"name":"中国建设银行","amenity":"bank"},"name":"中国建设银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国邮政储蓄银行":{"tags":{"name":"中国邮政储蓄银行","amenity":"bank"},"name":"中国邮政储蓄银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国银行":{"tags":{"name":"中国银行","amenity":"bank"},"name":"中国银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/交通银行":{"tags":{"name":"交通银行","amenity":"bank"},"name":"交通银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/京都中央信用金庫":{"tags":{"name":"京都中央信用金庫","amenity":"bank"},"name":"京都中央信用金庫","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/京都銀行":{"tags":{"name":"京都銀行","amenity":"bank"},"name":"京都銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/农业银行":{"tags":{"name":"农业银行","amenity":"bank"},"name":"农业银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/北海道銀行":{"tags":{"name":"北海道銀行","amenity":"bank"},"name":"北海道銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/合作金庫銀行":{"tags":{"name":"合作金庫銀行","amenity":"bank"},"name":"合作金庫銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/土地銀行":{"tags":{"name":"土地銀行","amenity":"bank"},"name":"土地銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/工商银行":{"tags":{"name":"工商银行","amenity":"bank"},"name":"工商银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/建设银行":{"tags":{"name":"建设银行","amenity":"bank"},"name":"建设银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/彰化銀行":{"tags":{"name":"彰化銀行","amenity":"bank"},"name":"彰化銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/招商银行":{"tags":{"name":"招商银行","amenity":"bank"},"name":"招商银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/横浜銀行":{"tags":{"name":"横浜銀行","amenity":"bank"},"name":"横浜銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/第一銀行":{"tags":{"name":"第一銀行","amenity":"bank"},"name":"第一銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/華南銀行":{"tags":{"name":"華南銀行","amenity":"bank"},"name":"華南銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/국민은행":{"tags":{"name":"국민은행","name:en":"Gungmin Bank","amenity":"bank"},"name":"국민은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/기업은행":{"tags":{"name":"기업은행","amenity":"bank"},"name":"기업은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/농협":{"tags":{"name":"농협","amenity":"bank"},"name":"농협","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/새마을금고":{"tags":{"name":"새마을금고","amenity":"bank"},"name":"새마을금고","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/신한은행":{"tags":{"name":"신한은행","name:en":"Sinhan Bank","amenity":"bank"},"name":"신한은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/우리은행":{"tags":{"name":"우리은행","name:en":"Uri Bank","amenity":"bank"},"name":"우리은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/하나은행":{"tags":{"name":"하나은행","amenity":"bank"},"name":"하나은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bar/Bar Centrale":{"tags":{"name":"Bar Centrale","amenity":"bar"},"name":"Bar Centrale","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/bar/Bar Sport":{"tags":{"name":"Bar Sport","amenity":"bar"},"name":"Bar Sport","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/bar/Beach Bar":{"tags":{"name":"Beach Bar","amenity":"bar"},"name":"Beach Bar","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/bar/Pool Bar":{"tags":{"name":"Pool Bar","amenity":"bar"},"name":"Pool Bar","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/bicycle_rental/Bicing":{"tags":{"name":"Bicing","amenity":"bicycle_rental"},"name":"Bicing","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator","payment_multi"],"suggestion":true},"amenity/bicycle_rental/Call a Bike":{"tags":{"name":"Call a Bike","amenity":"bicycle_rental"},"name":"Call a Bike","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator","payment_multi"],"suggestion":true},"amenity/bicycle_rental/Grid":{"tags":{"name":"Grid","amenity":"bicycle_rental"},"name":"Grid","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator","payment_multi"],"suggestion":true},"amenity/bicycle_rental/Mibici":{"tags":{"name":"Mibici","amenity":"bicycle_rental"},"name":"Mibici","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator","payment_multi"],"suggestion":true},"amenity/bicycle_rental/metropolradruhr":{"tags":{"name":"metropolradruhr","amenity":"bicycle_rental"},"name":"metropolradruhr","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator","payment_multi"],"suggestion":true},"amenity/bureau_de_change/Abitab":{"tags":{"name":"Abitab","amenity":"bureau_de_change"},"name":"Abitab","icon":"bank","geometry":["point","vertex"],"fields":["name","operator","currency_multi"],"suggestion":true},"amenity/bureau_de_change/Change":{"tags":{"name":"Change","amenity":"bureau_de_change"},"name":"Change","icon":"bank","geometry":["point","vertex"],"fields":["name","operator","currency_multi"],"suggestion":true},"amenity/bureau_de_change/Travelex":{"tags":{"name":"Travelex","amenity":"bureau_de_change"},"name":"Travelex","icon":"bank","geometry":["point","vertex"],"fields":["name","operator","currency_multi"],"suggestion":true},"amenity/cafe/85度C":{"tags":{"name":"85度C","amenity":"cafe"},"name":"85度C","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Bar Kafe":{"tags":{"name":"Bar Kafe","amenity":"cafe"},"name":"Bar Kafe","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Barista":{"tags":{"name":"Barista","amenity":"cafe"},"name":"Barista","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Bonafide":{"tags":{"name":"Bonafide","amenity":"cafe"},"name":"Bonafide","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafe Coffee Day":{"tags":{"name":"Cafe Coffee Day","amenity":"cafe"},"name":"Cafe Coffee Day","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafe Nero":{"tags":{"name":"Cafe Nero","amenity":"cafe"},"name":"Cafe Nero","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafeteria":{"tags":{"name":"Cafeteria","amenity":"cafe"},"name":"Cafeteria","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafetería":{"tags":{"name":"Cafetería","amenity":"cafe"},"name":"Cafetería","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Caffè Nero":{"tags":{"name":"Caffè Nero","amenity":"cafe"},"name":"Caffè Nero","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café Amazon":{"tags":{"name":"Café Amazon","amenity":"cafe"},"name":"Café Amazon","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café Central":{"tags":{"name":"Café Central","amenity":"cafe"},"name":"Café Central","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café de la Place":{"tags":{"name":"Café de la Place","amenity":"cafe"},"name":"Café de la Place","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café des Sports":{"tags":{"name":"Café des Sports","amenity":"cafe"},"name":"Café des Sports","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Caribou Coffee":{"tags":{"name":"Caribou Coffee","amenity":"cafe"},"name":"Caribou Coffee","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee Fellows":{"tags":{"name":"Coffee Fellows","amenity":"cafe"},"name":"Coffee Fellows","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee House":{"tags":{"name":"Coffee House","amenity":"cafe"},"name":"Coffee House","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee Island":{"tags":{"name":"Coffee Island","amenity":"cafe"},"name":"Coffee Island","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee Time":{"tags":{"name":"Coffee Time","amenity":"cafe"},"name":"Coffee Time","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Costa":{"tags":{"name":"Costa","amenity":"cafe"},"name":"Costa","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Country Style":{"tags":{"name":"Country Style","amenity":"cafe"},"name":"Country Style","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Dunkin' Donuts":{"tags":{"name":"Dunkin' Donuts","cuisine":"donut","amenity":"cafe"},"name":"Dunkin' Donuts","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Eiscafe Dolomiti":{"tags":{"name":"Eiscafe Dolomiti","amenity":"cafe"},"name":"Eiscafe Dolomiti","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Eiscafe Venezia":{"tags":{"name":"Eiscafe Venezia","amenity":"cafe"},"name":"Eiscafe Venezia","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Espresso House":{"tags":{"name":"Espresso House","amenity":"cafe"},"name":"Espresso House","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Havanna":{"tags":{"name":"Havanna","amenity":"cafe"},"name":"Havanna","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Internet Cafe":{"tags":{"name":"Internet Cafe","amenity":"cafe"},"name":"Internet Cafe","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Kafe":{"tags":{"name":"Kafe","amenity":"cafe"},"name":"Kafe","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Krispy Kreme":{"tags":{"name":"Krispy Kreme","amenity":"cafe"},"name":"Krispy Kreme","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Le Pain Quotidien":{"tags":{"name":"Le Pain Quotidien","amenity":"cafe"},"name":"Le Pain Quotidien","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/McCafé":{"tags":{"name":"McCafé","amenity":"cafe","cuisine":"coffee_shop"},"name":"McCafé","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Peet's Coffee & Tea":{"tags":{"name":"Peet's Coffee & Tea","amenity":"cafe"},"name":"Peet's Coffee & Tea","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Pret A Manger":{"tags":{"name":"Pret A Manger","amenity":"cafe"},"name":"Pret A Manger","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Prime":{"tags":{"name":"Prime","amenity":"cafe"},"name":"Prime","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Second Cup":{"tags":{"name":"Second Cup","amenity":"cafe"},"name":"Second Cup","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Segafredo":{"tags":{"name":"Segafredo","amenity":"cafe"},"name":"Segafredo","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Starbucks":{"tags":{"name":"Starbucks","cuisine":"coffee_shop","amenity":"cafe"},"name":"Starbucks","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/The Coffee Bean & Tea Leaf":{"tags":{"name":"The Coffee Bean & Tea Leaf","amenity":"cafe"},"name":"The Coffee Bean & Tea Leaf","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/The Coffee Club":{"tags":{"name":"The Coffee Club","amenity":"cafe"},"name":"The Coffee Club","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Tim Hortons":{"tags":{"name":"Tim Hortons","amenity":"cafe"},"name":"Tim Hortons","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Traveler's Coffee":{"tags":{"name":"Traveler's Coffee","amenity":"cafe"},"name":"Traveler's Coffee","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Wayne's Coffee":{"tags":{"name":"Wayne's Coffee","amenity":"cafe"},"name":"Wayne's Coffee","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Бистро":{"tags":{"name":"Бистро","amenity":"cafe"},"name":"Бистро","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Буфет":{"tags":{"name":"Буфет","amenity":"cafe"},"name":"Буфет","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Встреча":{"tags":{"name":"Встреча","amenity":"cafe"},"name":"Встреча","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Даблби":{"tags":{"name":"Даблби","amenity":"cafe"},"name":"Даблби","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Закусочная":{"tags":{"name":"Закусочная","amenity":"cafe"},"name":"Закусочная","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Кофе Хауз":{"tags":{"name":"Кофе Хауз","amenity":"cafe"},"name":"Кофе Хауз","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Кофейня":{"tags":{"name":"Кофейня","amenity":"cafe"},"name":"Кофейня","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Лакомка":{"tags":{"name":"Лакомка","amenity":"cafe"},"name":"Лакомка","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Летнее кафе":{"tags":{"name":"Летнее кафе","amenity":"cafe"},"name":"Летнее кафе","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Пельменная":{"tags":{"name":"Пельменная","amenity":"cafe"},"name":"Пельменная","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Пиццерия":{"tags":{"name":"Пиццерия","amenity":"cafe"},"name":"Пиццерия","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Рандеву":{"tags":{"name":"Рандеву","amenity":"cafe"},"name":"Рандеву","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Сказка":{"tags":{"name":"Сказка","amenity":"cafe"},"name":"Сказка","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Старбакс":{"tags":{"name":"Старбакс","amenity":"cafe"},"name":"Старбакс","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Столовая":{"tags":{"name":"Столовая","amenity":"cafe"},"name":"Столовая","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Уют":{"tags":{"name":"Уют","amenity":"cafe"},"name":"Уют","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Хуторок":{"tags":{"name":"Хуторок","amenity":"cafe"},"name":"Хуторок","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Шашлычная":{"tags":{"name":"Шашлычная","amenity":"cafe"},"name":"Шашлычная","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Шоколад":{"tags":{"name":"Шоколад","amenity":"cafe"},"name":"Шоколад","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Шоколадница":{"tags":{"name":"Шоколадница","amenity":"cafe"},"name":"Шоколадница","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/ארומה":{"tags":{"name":"ארומה","amenity":"cafe"},"name":"ארומה","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/مقهى":{"tags":{"name":"مقهى","amenity":"cafe"},"name":"مقهى","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/คาเฟ่ อเมซอน":{"tags":{"name":"คาเฟ่ อเมซอน","amenity":"cafe"},"name":"คาเฟ่ อเมซอน","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/エクセルシオール カフェ":{"tags":{"name":"エクセルシオール カフェ","amenity":"cafe"},"name":"エクセルシオール カフェ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/カフェ・ド・クリエ":{"tags":{"name":"カフェ・ド・クリエ","name:en":"Cafe de CRIE","amenity":"cafe"},"name":"カフェ・ド・クリエ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/カフェ・ベローチェ":{"tags":{"name":"カフェ・ベローチェ","amenity":"cafe"},"name":"カフェ・ベローチェ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/コメダ珈琲店":{"tags":{"name":"コメダ珈琲店","amenity":"cafe"},"name":"コメダ珈琲店","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/サンマルクカフェ":{"tags":{"name":"サンマルクカフェ","amenity":"cafe"},"name":"サンマルクカフェ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/スターバックス":{"tags":{"name":"スターバックス","name:en":"Starbucks","amenity":"cafe"},"name":"スターバックス","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/タリーズコーヒー":{"tags":{"name":"タリーズコーヒー","amenity":"cafe"},"name":"タリーズコーヒー","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/ドトールコーヒーショップ":{"tags":{"name":"ドトールコーヒーショップ","amenity":"cafe"},"name":"ドトールコーヒーショップ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/星巴克":{"tags":{"name":"星巴克","amenity":"cafe"},"name":"星巴克","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/스타벅스":{"tags":{"name":"스타벅스","amenity":"cafe"},"name":"스타벅스","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/car_rental/Alamo":{"tags":{"name":"Alamo","amenity":"car_rental"},"name":"Alamo","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Avis":{"tags":{"name":"Avis","amenity":"car_rental"},"name":"Avis","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Budget":{"tags":{"name":"Budget","amenity":"car_rental"},"name":"Budget","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Enterprise":{"tags":{"name":"Enterprise","amenity":"car_rental"},"name":"Enterprise","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Enterprise Rent-a-Car":{"tags":{"name":"Enterprise Rent-a-Car","amenity":"car_rental"},"name":"Enterprise Rent-a-Car","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Europcar":{"tags":{"name":"Europcar","amenity":"car_rental"},"name":"Europcar","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Hertz":{"tags":{"name":"Hertz","amenity":"car_rental"},"name":"Hertz","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Localiza":{"tags":{"name":"Localiza","amenity":"car_rental"},"name":"Localiza","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Sixt":{"tags":{"name":"Sixt","amenity":"car_rental"},"name":"Sixt","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Thrifty":{"tags":{"name":"Thrifty","amenity":"car_rental"},"name":"Thrifty","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/U-Haul":{"tags":{"name":"U-Haul","amenity":"car_rental"},"name":"U-Haul","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/オリックスレンタカー":{"tags":{"name":"オリックスレンタカー","amenity":"car_rental"},"name":"オリックスレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/トヨタレンタカー":{"tags":{"name":"トヨタレンタカー","amenity":"car_rental"},"name":"トヨタレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/トヨタレンタリース":{"tags":{"name":"トヨタレンタリース","amenity":"car_rental"},"name":"トヨタレンタリース","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/ニッポンレンタカー":{"tags":{"name":"ニッポンレンタカー","amenity":"car_rental"},"name":"ニッポンレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_wash/Autolavaggio":{"tags":{"name":"Autolavaggio","amenity":"car_wash"},"name":"Autolavaggio","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/H-E-B Car Wash":{"tags":{"name":"H-E-B Car Wash","amenity":"car_wash"},"name":"H-E-B Car Wash","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Lavage Auto":{"tags":{"name":"Lavage Auto","amenity":"car_wash"},"name":"Lavage Auto","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Lavazh":{"tags":{"name":"Lavazh","amenity":"car_wash"},"name":"Lavazh","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Myjnia":{"tags":{"name":"Myjnia","amenity":"car_wash"},"name":"Myjnia","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Myjnia bezdotykowa":{"tags":{"name":"Myjnia bezdotykowa","amenity":"car_wash"},"name":"Myjnia bezdotykowa","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Myjnia samochodowa":{"tags":{"name":"Myjnia samochodowa","amenity":"car_wash"},"name":"Myjnia samochodowa","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Spălătorie Auto":{"tags":{"name":"Spălătorie Auto","amenity":"car_wash"},"name":"Spălătorie Auto","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Spălătorie auto":{"tags":{"name":"Spălătorie auto","amenity":"car_wash"},"name":"Spălătorie auto","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Автомийка":{"tags":{"name":"Автомийка","amenity":"car_wash"},"name":"Автомийка","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/cinema/Cinema City":{"tags":{"name":"Cinema City","amenity":"cinema"},"name":"Cinema City","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/cinema/Cinemark":{"tags":{"name":"Cinemark","amenity":"cinema"},"name":"Cinemark","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/cinema/Cinemex":{"tags":{"name":"Cinemex","amenity":"cinema"},"name":"Cinemex","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/cinema/Cinepolis":{"tags":{"name":"Cinepolis","amenity":"cinema"},"name":"Cinepolis","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/cinema/Cineworld":{"tags":{"name":"Cineworld","amenity":"cinema"},"name":"Cineworld","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/cinema/Odeon":{"tags":{"name":"Odeon","amenity":"cinema"},"name":"Odeon","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/clinic/ФАП":{"tags":{"name":"ФАП","healthcare":"clinic","amenity":"clinic"},"name":"ФАП","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Aspen Dental":{"tags":{"name":"Aspen Dental","healthcare":"dentist","amenity":"dentist"},"name":"Aspen Dental","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Family Dentistry":{"tags":{"name":"Family Dentistry","healthcare":"dentist","amenity":"dentist"},"name":"Family Dentistry","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Vitaldent":{"tags":{"name":"Vitaldent","healthcare":"dentist","amenity":"dentist"},"name":"Vitaldent","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Стоматолог":{"tags":{"name":"Стоматолог","healthcare":"dentist","amenity":"dentist"},"name":"Стоматолог","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Стоматологія":{"tags":{"name":"Стоматологія","healthcare":"dentist","amenity":"dentist"},"name":"Стоматологія","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/doctors/Háziorvosi rendelő":{"tags":{"name":"Háziorvosi rendelő","healthcare":"doctor","amenity":"doctors"},"name":"Háziorvosi rendelő","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/doctors/Инвитро":{"tags":{"name":"Инвитро","healthcare":"doctor","amenity":"doctors"},"name":"Инвитро","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/driving_school/Автодром":{"tags":{"name":"Автодром","amenity":"driving_school"},"name":"Автодром","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/fast_food/A&W":{"tags":{"name":"A&W","amenity":"fast_food"},"name":"A&W","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Ali Baba":{"tags":{"name":"Ali Baba","amenity":"fast_food"},"name":"Ali Baba","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Angel's Burger":{"tags":{"name":"Angel's Burger","amenity":"fast_food"},"name":"Angel's Burger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Antalya":{"tags":{"name":"Antalya","amenity":"fast_food"},"name":"Antalya","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Arby's":{"tags":{"name":"Arby's","amenity":"fast_food"},"name":"Arby's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Asia Bistro":{"tags":{"name":"Asia Bistro","amenity":"fast_food"},"name":"Asia Bistro","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Asia Wok":{"tags":{"name":"Asia Wok","amenity":"fast_food"},"name":"Asia Wok","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Baskin-Robbins":{"tags":{"name":"Baskin-Robbins","amenity":"fast_food"},"name":"Baskin-Robbins","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Bistro":{"tags":{"name":"Bistro","amenity":"fast_food"},"name":"Bistro","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Bob's":{"tags":{"name":"Bob's","amenity":"fast_food"},"name":"Bob's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Bojangles":{"tags":{"name":"Bojangles","amenity":"fast_food"},"name":"Bojangles","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Booster Juice":{"tags":{"name":"Booster Juice","amenity":"fast_food"},"name":"Booster Juice","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Boston Market":{"tags":{"name":"Boston Market","amenity":"fast_food"},"name":"Boston Market","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Braum's":{"tags":{"name":"Braum's","amenity":"fast_food"},"name":"Braum's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Burger King":{"tags":{"name":"Burger King","cuisine":"burger","amenity":"fast_food"},"name":"Burger King","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Burger Machine":{"tags":{"name":"Burger Machine","amenity":"fast_food"},"name":"Burger Machine","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Büfé":{"tags":{"name":"Büfé","amenity":"fast_food"},"name":"Büfé","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Captain D's":{"tags":{"name":"Captain D's","amenity":"fast_food"},"name":"Captain D's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Carl's Jr.":{"tags":{"name":"Carl's Jr.","cuisine":"burger","amenity":"fast_food"},"name":"Carl's Jr.","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chick-fil-A":{"tags":{"name":"Chick-fil-A","cuisine":"chicken","amenity":"fast_food"},"name":"Chick-fil-A","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chicken Express":{"tags":{"name":"Chicken Express","amenity":"fast_food"},"name":"Chicken Express","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chipotle":{"tags":{"name":"Chipotle","cuisine":"mexican","amenity":"fast_food"},"name":"Chipotle","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chowking":{"tags":{"name":"Chowking","amenity":"fast_food"},"name":"Chowking","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Church's Chicken":{"tags":{"name":"Church's Chicken","amenity":"fast_food"},"name":"Church's Chicken","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/CoCo壱番屋":{"tags":{"name":"CoCo壱番屋","amenity":"fast_food"},"name":"CoCo壱番屋","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Cold Stone Creamery":{"tags":{"name":"Cold Stone Creamery","amenity":"fast_food"},"name":"Cold Stone Creamery","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Cook Out":{"tags":{"name":"Cook Out","amenity":"fast_food"},"name":"Cook Out","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Culver's":{"tags":{"name":"Culver's","amenity":"fast_food"},"name":"Culver's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/DQ":{"tags":{"name":"DQ","amenity":"fast_food"},"name":"DQ","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Dairy Queen":{"tags":{"name":"Dairy Queen","amenity":"fast_food"},"name":"Dairy Queen","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Del Taco":{"tags":{"name":"Del Taco","amenity":"fast_food"},"name":"Del Taco","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Domino's Pizza":{"tags":{"name":"Domino's Pizza","cuisine":"pizza","amenity":"fast_food"},"name":"Domino's Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/El Pollo Loco":{"tags":{"name":"El Pollo Loco","amenity":"fast_food"},"name":"El Pollo Loco","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Everest":{"tags":{"name":"Everest","amenity":"fast_food"},"name":"Everest","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Extreme Pita":{"tags":{"name":"Extreme Pita","amenity":"fast_food"},"name":"Extreme Pita","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Fazoli's":{"tags":{"name":"Fazoli's","amenity":"fast_food"},"name":"Fazoli's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Firehouse Subs":{"tags":{"name":"Firehouse Subs","amenity":"fast_food"},"name":"Firehouse Subs","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Fish & Chips":{"tags":{"name":"Fish & Chips","amenity":"fast_food"},"name":"Fish & Chips","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Fish and Chips":{"tags":{"name":"Fish and Chips","amenity":"fast_food"},"name":"Fish and Chips","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Five Guys":{"tags":{"name":"Five Guys","amenity":"fast_food"},"name":"Five Guys","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Greenwich":{"tags":{"name":"Greenwich","amenity":"fast_food"},"name":"Greenwich","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Habib's":{"tags":{"name":"Habib's","amenity":"fast_food"},"name":"Habib's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hallo Pizza":{"tags":{"name":"Hallo Pizza","amenity":"fast_food"},"name":"Hallo Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hardee's":{"tags":{"name":"Hardee's","cuisine":"burger","amenity":"fast_food"},"name":"Hardee's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Harvey's":{"tags":{"name":"Harvey's","amenity":"fast_food"},"name":"Harvey's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hesburger":{"tags":{"name":"Hesburger","amenity":"fast_food"},"name":"Hesburger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hungry Jacks":{"tags":{"name":"Hungry Jacks","cuisine":"burger","amenity":"fast_food"},"name":"Hungry Jacks","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/In-N-Out Burger":{"tags":{"name":"In-N-Out Burger","amenity":"fast_food"},"name":"In-N-Out Burger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Istanbul":{"tags":{"name":"Istanbul","amenity":"fast_food"},"name":"Istanbul","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Istanbul Kebab":{"tags":{"name":"Istanbul Kebab","amenity":"fast_food"},"name":"Istanbul Kebab","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jack in the Box":{"tags":{"name":"Jack in the Box","cuisine":"burger","amenity":"fast_food"},"name":"Jack in the Box","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jamba Juice":{"tags":{"name":"Jamba Juice","amenity":"fast_food"},"name":"Jamba Juice","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jersey Mike's Subs":{"tags":{"name":"Jersey Mike's Subs","amenity":"fast_food"},"name":"Jersey Mike's Subs","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jimmy John's":{"tags":{"name":"Jimmy John's","cuisine":"sandwich","amenity":"fast_food"},"name":"Jimmy John's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jollibee":{"tags":{"name":"Jollibee","amenity":"fast_food"},"name":"Jollibee","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/KFC":{"tags":{"name":"KFC","cuisine":"chicken","amenity":"fast_food"},"name":"KFC","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/KFC/Taco Bell":{"tags":{"name":"KFC/Taco Bell","amenity":"fast_food"},"name":"KFC/Taco Bell","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kebab House":{"tags":{"name":"Kebab House","amenity":"fast_food"},"name":"Kebab House","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kebabai":{"tags":{"name":"Kebabai","amenity":"fast_food"},"name":"Kebabai","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kochlöffel":{"tags":{"name":"Kochlöffel","amenity":"fast_food"},"name":"Kochlöffel","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kotipizza":{"tags":{"name":"Kotipizza","amenity":"fast_food"},"name":"Kotipizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Krystal":{"tags":{"name":"Krystal","amenity":"fast_food"},"name":"Krystal","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Little Caesars":{"tags":{"name":"Little Caesars","amenity":"fast_food"},"name":"Little Caesars","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Little Caesars Pizza":{"tags":{"name":"Little Caesars Pizza","amenity":"fast_food"},"name":"Little Caesars Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Long John Silver's":{"tags":{"name":"Long John Silver's","amenity":"fast_food"},"name":"Long John Silver's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Lotteria":{"tags":{"name":"Lotteria","amenity":"fast_food"},"name":"Lotteria","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Max":{"tags":{"name":"Max","amenity":"fast_food"},"name":"Max","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/McDonald's":{"tags":{"name":"McDonald's","cuisine":"burger","amenity":"fast_food"},"name":"McDonald's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Minute Burger":{"tags":{"name":"Minute Burger","amenity":"fast_food"},"name":"Minute Burger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Mr. Sub":{"tags":{"name":"Mr. Sub","amenity":"fast_food"},"name":"Mr. Sub","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/New York Pizza":{"tags":{"name":"New York Pizza","amenity":"fast_food"},"name":"New York Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Nordsee":{"tags":{"name":"Nordsee","amenity":"fast_food"},"name":"Nordsee","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Panda Express":{"tags":{"name":"Panda Express","cuisine":"chinese","amenity":"fast_food"},"name":"Panda Express","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Papa John's":{"tags":{"name":"Papa John's","cuisine":"pizza","amenity":"fast_food"},"name":"Papa John's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Papa Murphy's":{"tags":{"name":"Papa Murphy's","amenity":"fast_food"},"name":"Papa Murphy's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pinulito":{"tags":{"name":"Pinulito","amenity":"fast_food"},"name":"Pinulito","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pita Pit":{"tags":{"name":"Pita Pit","amenity":"fast_food"},"name":"Pita Pit","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza Hut Delivery":{"tags":{"name":"Pizza Hut Delivery","amenity":"fast_food"},"name":"Pizza Hut Delivery","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza King":{"tags":{"name":"Pizza King","amenity":"fast_food"},"name":"Pizza King","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza Nova":{"tags":{"name":"Pizza Nova","amenity":"fast_food"},"name":"Pizza Nova","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza Pizza":{"tags":{"name":"Pizza Pizza","amenity":"fast_food"},"name":"Pizza Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pollo Campero":{"tags":{"name":"Pollo Campero","amenity":"fast_food"},"name":"Pollo Campero","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pollo Granjero":{"tags":{"name":"Pollo Granjero","amenity":"fast_food"},"name":"Pollo Granjero","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Popeye's":{"tags":{"name":"Popeye's","cuisine":"chicken","amenity":"fast_food"},"name":"Popeye's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Popeyes Louisiana Kitchen":{"tags":{"name":"Popeyes Louisiana Kitchen","amenity":"fast_food"},"name":"Popeyes Louisiana Kitchen","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Qdoba":{"tags":{"name":"Qdoba","amenity":"fast_food"},"name":"Qdoba","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Quick":{"tags":{"name":"Quick","amenity":"fast_food"},"name":"Quick","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Quiznos":{"tags":{"name":"Quiznos","amenity":"fast_food"},"name":"Quiznos","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Rally's":{"tags":{"name":"Rally's","amenity":"fast_food"},"name":"Rally's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Red Rooster":{"tags":{"name":"Red Rooster","amenity":"fast_food"},"name":"Red Rooster","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Sbarro":{"tags":{"name":"Sbarro","amenity":"fast_food"},"name":"Sbarro","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Schlotzsky's Deli":{"tags":{"name":"Schlotzsky's Deli","amenity":"fast_food"},"name":"Schlotzsky's Deli","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Sibylla":{"tags":{"name":"Sibylla","amenity":"fast_food"},"name":"Sibylla","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Sonic":{"tags":{"name":"Sonic","cuisine":"burger","amenity":"fast_food"},"name":"Sonic","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Steers":{"tags":{"name":"Steers","amenity":"fast_food"},"name":"Steers","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Subway":{"tags":{"name":"Subway","amenity":"fast_food"},"name":"Subway","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Bell":{"tags":{"name":"Taco Bell","cuisine":"mexican","amenity":"fast_food"},"name":"Taco Bell","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Bueno":{"tags":{"name":"Taco Bueno","amenity":"fast_food"},"name":"Taco Bueno","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Cabana":{"tags":{"name":"Taco Cabana","amenity":"fast_food"},"name":"Taco Cabana","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Del Mar":{"tags":{"name":"Taco Del Mar","amenity":"fast_food"},"name":"Taco Del Mar","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco John's":{"tags":{"name":"Taco John's","amenity":"fast_food"},"name":"Taco John's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Time":{"tags":{"name":"Taco Time","amenity":"fast_food"},"name":"Taco Time","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Telepizza":{"tags":{"name":"Telepizza","amenity":"fast_food"},"name":"Telepizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Thai Express":{"tags":{"name":"Thai Express","amenity":"fast_food"},"name":"Thai Express","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/The Pizza Company":{"tags":{"name":"The Pizza Company","amenity":"fast_food"},"name":"The Pizza Company","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Wendy's":{"tags":{"name":"Wendy's","cuisine":"burger","amenity":"fast_food"},"name":"Wendy's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Whataburger":{"tags":{"name":"Whataburger","amenity":"fast_food"},"name":"Whataburger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/White Castle":{"tags":{"name":"White Castle","amenity":"fast_food"},"name":"White Castle","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Wienerschnitzel":{"tags":{"name":"Wienerschnitzel","amenity":"fast_food"},"name":"Wienerschnitzel","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Wimpy":{"tags":{"name":"Wimpy","amenity":"fast_food"},"name":"Wimpy","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Zaxby's":{"tags":{"name":"Zaxby's","amenity":"fast_food"},"name":"Zaxby's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Γρηγόρης":{"tags":{"name":"Γρηγόρης","amenity":"fast_food"},"name":"Γρηγόρης","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Бургер Кинг":{"tags":{"name":"Бургер Кинг","amenity":"fast_food"},"name":"Бургер Кинг","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Крошка Картошка":{"tags":{"name":"Крошка Картошка","amenity":"fast_food"},"name":"Крошка Картошка","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Макдоналдс":{"tags":{"name":"Макдоналдс","name:en":"McDonald's","amenity":"fast_food"},"name":"Макдоналдс","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Робин Сдобин":{"tags":{"name":"Робин Сдобин","amenity":"fast_food"},"name":"Робин Сдобин","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Русский Аппетит":{"tags":{"name":"Русский Аппетит","amenity":"fast_food"},"name":"Русский Аппетит","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Сабвэй":{"tags":{"name":"Сабвэй","amenity":"fast_food"},"name":"Сабвэй","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Стардог!s":{"tags":{"name":"Стардог!s","amenity":"fast_food"},"name":"Стардог!s","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Теремок":{"tags":{"name":"Теремок","amenity":"fast_food"},"name":"Теремок","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Шаверма":{"tags":{"name":"Шаверма","amenity":"fast_food"},"name":"Шаверма","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Шаурма":{"tags":{"name":"Шаурма","amenity":"fast_food"},"name":"Шаурма","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/かっぱ寿司":{"tags":{"name":"かっぱ寿司","amenity":"fast_food"},"name":"かっぱ寿司","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/かつや":{"tags":{"name":"かつや","amenity":"fast_food"},"name":"かつや","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/くら寿司":{"tags":{"name":"くら寿司","amenity":"fast_food"},"name":"くら寿司","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/すき家":{"tags":{"name":"すき家","name:en":"SUKIYA","amenity":"fast_food"},"name":"すき家","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/なか卯":{"tags":{"name":"なか卯","amenity":"fast_food"},"name":"なか卯","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ほっかほっか亭":{"tags":{"name":"ほっかほっか亭","amenity":"fast_food"},"name":"ほっかほっか亭","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ほっともっと":{"tags":{"name":"ほっともっと","amenity":"fast_food"},"name":"ほっともっと","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/オリジン弁当":{"tags":{"name":"オリジン弁当","amenity":"fast_food"},"name":"オリジン弁当","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ケンタッキーフライドチキン":{"tags":{"name":"ケンタッキーフライドチキン","cuisine":"chicken","name:en":"KFC","amenity":"fast_food"},"name":"ケンタッキーフライドチキン","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/サブウェイ":{"tags":{"name":"サブウェイ","amenity":"fast_food"},"name":"サブウェイ","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/スシロー":{"tags":{"name":"スシロー","amenity":"fast_food"},"name":"スシロー","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/マクドナルド":{"tags":{"name":"マクドナルド","cuisine":"burger","name:en":"McDonald's","amenity":"fast_food"},"name":"マクドナルド","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ミスタードーナツ":{"tags":{"name":"ミスタードーナツ","amenity":"fast_food"},"name":"ミスタードーナツ","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/モスバーガー":{"tags":{"name":"モスバーガー","name:en":"MOS BURGER","amenity":"fast_food"},"name":"モスバーガー","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ロッテリア":{"tags":{"name":"ロッテリア","amenity":"fast_food"},"name":"ロッテリア","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/吉野家":{"tags":{"name":"吉野家","amenity":"fast_food"},"name":"吉野家","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/幸楽苑":{"tags":{"name":"幸楽苑","amenity":"fast_food"},"name":"幸楽苑","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/摩斯漢堡":{"tags":{"name":"摩斯漢堡","amenity":"fast_food"},"name":"摩斯漢堡","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/松屋":{"tags":{"name":"松屋","name:en":"Matsuya","amenity":"fast_food"},"name":"松屋","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/肯德基":{"tags":{"name":"肯德基","amenity":"fast_food"},"name":"肯德基","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/麥當勞":{"tags":{"name":"麥當勞","amenity":"fast_food"},"name":"麥當勞","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/麦当劳":{"tags":{"name":"麦当劳","amenity":"fast_food"},"name":"麦当劳","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/롯데리아":{"tags":{"name":"롯데리아","amenity":"fast_food"},"name":"롯데리아","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fuel/76":{"tags":{"name":"76","amenity":"fuel"},"name":"76","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/1-2-3":{"tags":{"name":"1-2-3","amenity":"fuel"},"name":"1-2-3","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ADNOC":{"tags":{"name":"ADNOC","amenity":"fuel"},"name":"ADNOC","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ANP":{"tags":{"name":"ANP","amenity":"fuel"},"name":"ANP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ARAL":{"tags":{"name":"ARAL","amenity":"fuel"},"name":"ARAL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Aegean":{"tags":{"name":"Aegean","amenity":"fuel"},"name":"Aegean","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Afriquia":{"tags":{"name":"Afriquia","amenity":"fuel"},"name":"Afriquia","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Agip":{"tags":{"name":"Agip","amenity":"fuel"},"name":"Agip","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Agrola":{"tags":{"name":"Agrola","amenity":"fuel"},"name":"Agrola","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Alon":{"tags":{"name":"Alon","amenity":"fuel"},"name":"Alon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Alpet":{"tags":{"name":"Alpet","amenity":"fuel"},"name":"Alpet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Api":{"tags":{"name":"Api","amenity":"fuel"},"name":"Api","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Aral":{"tags":{"name":"Aral","amenity":"fuel"},"name":"Aral","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Arco":{"tags":{"name":"Arco","amenity":"fuel"},"name":"Arco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Avanti":{"tags":{"name":"Avanti","amenity":"fuel"},"name":"Avanti","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Avia":{"tags":{"name":"Avia","amenity":"fuel"},"name":"Avia","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/BEBECO":{"tags":{"name":"BEBECO","amenity":"fuel"},"name":"BEBECO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/BFT":{"tags":{"name":"BFT","amenity":"fuel"},"name":"BFT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/BHPetrol":{"tags":{"name":"BHPetrol","amenity":"fuel"},"name":"BHPetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/BP":{"tags":{"name":"BP","amenity":"fuel"},"name":"BP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/BR":{"tags":{"name":"BR","amenity":"fuel"},"name":"BR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Bangchak":{"tags":{"name":"Bangchak","amenity":"fuel"},"name":"Bangchak","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Benzina":{"tags":{"name":"Benzina","amenity":"fuel"},"name":"Benzina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Bharat Petroleum":{"tags":{"name":"Bharat Petroleum","amenity":"fuel"},"name":"Bharat Petroleum","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Bliska":{"tags":{"name":"Bliska","amenity":"fuel"},"name":"Bliska","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/CAMPSA":{"tags":{"name":"CAMPSA","amenity":"fuel"},"name":"CAMPSA","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/CARREFOUR":{"tags":{"name":"CARREFOUR","amenity":"fuel"},"name":"CARREFOUR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/CEPSA":{"tags":{"name":"CEPSA","amenity":"fuel"},"name":"CEPSA","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/CNG":{"tags":{"name":"CNG","amenity":"fuel"},"name":"CNG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Caltex":{"tags":{"name":"Caltex","amenity":"fuel"},"name":"Caltex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Campsa":{"tags":{"name":"Campsa","amenity":"fuel"},"name":"Campsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Casey's General Store":{"tags":{"name":"Casey's General Store","amenity":"fuel"},"name":"Casey's General Store","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Cenex":{"tags":{"name":"Cenex","amenity":"fuel"},"name":"Cenex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Cepsa":{"tags":{"name":"Cepsa","amenity":"fuel"},"name":"Cepsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Ceypetco":{"tags":{"name":"Ceypetco","amenity":"fuel"},"name":"Ceypetco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Chevron":{"tags":{"name":"Chevron","amenity":"fuel"},"name":"Chevron","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Citgo":{"tags":{"name":"Citgo","amenity":"fuel"},"name":"Citgo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Clark":{"tags":{"name":"Clark","amenity":"fuel"},"name":"Clark","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Coles Express":{"tags":{"name":"Coles Express","amenity":"fuel"},"name":"Coles Express","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Conoco":{"tags":{"name":"Conoco","amenity":"fuel"},"name":"Conoco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Copec":{"tags":{"name":"Copec","amenity":"fuel"},"name":"Copec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Copetrol":{"tags":{"name":"Copetrol","amenity":"fuel"},"name":"Copetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Cosmo":{"tags":{"name":"Cosmo","amenity":"fuel"},"name":"Cosmo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Crodux":{"tags":{"name":"Crodux","amenity":"fuel"},"name":"Crodux","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Delta":{"tags":{"name":"Delta","amenity":"fuel"},"name":"Delta","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Diamond Shamrock":{"tags":{"name":"Diamond Shamrock","amenity":"fuel"},"name":"Diamond Shamrock","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Drummed Fuel":{"tags":{"name":"Drummed Fuel","amenity":"fuel"},"name":"Drummed Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/EKO":{"tags":{"name":"EKO","amenity":"fuel"},"name":"EKO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ENEOS":{"tags":{"name":"ENEOS","amenity":"fuel"},"name":"ENEOS","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ENI":{"tags":{"name":"ENI","amenity":"fuel"},"name":"ENI","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ERG":{"tags":{"name":"ERG","amenity":"fuel"},"name":"ERG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Elan":{"tags":{"name":"Elan","amenity":"fuel"},"name":"Elan","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Eneos":{"tags":{"name":"Eneos","amenity":"fuel"},"name":"Eneos","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Engen":{"tags":{"name":"Engen","amenity":"fuel"},"name":"Engen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Eni":{"tags":{"name":"Eni","amenity":"fuel"},"name":"Eni","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Erg":{"tags":{"name":"Erg","amenity":"fuel"},"name":"Erg","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Esso":{"tags":{"name":"Esso","amenity":"fuel"},"name":"Esso","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Esso Express":{"tags":{"name":"Esso Express","amenity":"fuel"},"name":"Esso Express","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/EuroOil":{"tags":{"name":"EuroOil","amenity":"fuel"},"name":"EuroOil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Exxon":{"tags":{"name":"Exxon","amenity":"fuel"},"name":"Exxon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/F24":{"tags":{"name":"F24","amenity":"fuel"},"name":"F24","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Firezone":{"tags":{"name":"Firezone","amenity":"fuel"},"name":"Firezone","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Flying V":{"tags":{"name":"Flying V","amenity":"fuel"},"name":"Flying V","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/GALP":{"tags":{"name":"GALP","amenity":"fuel"},"name":"GALP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Gazprom":{"tags":{"name":"Gazprom","amenity":"fuel"},"name":"Gazprom","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/GetGo":{"tags":{"name":"GetGo","amenity":"fuel"},"name":"GetGo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Goil":{"tags":{"name":"Goil","amenity":"fuel"},"name":"Goil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Gulf":{"tags":{"name":"Gulf","amenity":"fuel"},"name":"Gulf","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/H-E-B Fuel":{"tags":{"name":"H-E-B Fuel","amenity":"fuel"},"name":"H-E-B Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/H-E-B Gas":{"tags":{"name":"H-E-B Gas","amenity":"fuel"},"name":"H-E-B Gas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/HEM":{"tags":{"name":"HEM","amenity":"fuel"},"name":"HEM","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/HP":{"tags":{"name":"HP","amenity":"fuel"},"name":"HP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/HP Petrol Pump":{"tags":{"name":"HP Petrol Pump","amenity":"fuel"},"name":"HP Petrol Pump","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Helios":{"tags":{"name":"Helios","amenity":"fuel"},"name":"Helios","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Hess":{"tags":{"name":"Hess","amenity":"fuel"},"name":"Hess","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Hindustan Petroleum":{"tags":{"name":"Hindustan Petroleum","amenity":"fuel"},"name":"Hindustan Petroleum","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Holiday":{"tags":{"name":"Holiday","amenity":"fuel"},"name":"Holiday","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Husky":{"tags":{"name":"Husky","amenity":"fuel"},"name":"Husky","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/IES":{"tags":{"name":"IES","amenity":"fuel"},"name":"IES","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/IP":{"tags":{"name":"IP","amenity":"fuel"},"name":"IP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Independent Fuel Station":{"tags":{"name":"Independent Fuel Station","amenity":"fuel"},"name":"Independent Fuel Station","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Indian Oil":{"tags":{"name":"Indian Oil","amenity":"fuel"},"name":"Indian Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Indipend.":{"tags":{"name":"Indipend.","amenity":"fuel"},"name":"Indipend.","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Ingo":{"tags":{"name":"Ingo","amenity":"fuel"},"name":"Ingo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Ipiranga":{"tags":{"name":"Ipiranga","amenity":"fuel"},"name":"Ipiranga","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Irving":{"tags":{"name":"Irving","amenity":"fuel"},"name":"Irving","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/JA-SS":{"tags":{"name":"JA-SS","amenity":"fuel"},"name":"JA-SS","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/JOMO":{"tags":{"name":"JOMO","amenity":"fuel"},"name":"JOMO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Jet":{"tags":{"name":"Jet","amenity":"fuel"},"name":"Jet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Jetti":{"tags":{"name":"Jetti","amenity":"fuel"},"name":"Jetti","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Kangaroo":{"tags":{"name":"Kangaroo","amenity":"fuel"},"name":"Kangaroo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Kobil":{"tags":{"name":"Kobil","amenity":"fuel"},"name":"Kobil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Kroger Fuel":{"tags":{"name":"Kroger Fuel","amenity":"fuel"},"name":"Kroger Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Kum & Go":{"tags":{"name":"Kum & Go","amenity":"fuel"},"name":"Kum & Go","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Kwik Trip":{"tags":{"name":"Kwik Trip","amenity":"fuel"},"name":"Kwik Trip","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/LPG":{"tags":{"name":"LPG","amenity":"fuel"},"name":"LPG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/LPG Station":{"tags":{"name":"LPG Station","amenity":"fuel"},"name":"LPG Station","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/LUKOIL":{"tags":{"name":"LUKOIL","amenity":"fuel"},"name":"LUKOIL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Liberty":{"tags":{"name":"Liberty","amenity":"fuel"},"name":"Liberty","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Lotos":{"tags":{"name":"Lotos","amenity":"fuel"},"name":"Lotos","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Lotos Optima":{"tags":{"name":"Lotos Optima","amenity":"fuel"},"name":"Lotos Optima","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Love's":{"tags":{"name":"Love's","amenity":"fuel"},"name":"Love's","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Lukoil":{"tags":{"name":"Lukoil","amenity":"fuel"},"name":"Lukoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/MEROIL":{"tags":{"name":"MEROIL","amenity":"fuel"},"name":"MEROIL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/MOL":{"tags":{"name":"MOL","amenity":"fuel"},"name":"MOL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/MRS":{"tags":{"name":"MRS","amenity":"fuel"},"name":"MRS","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Marathon":{"tags":{"name":"Marathon","amenity":"fuel"},"name":"Marathon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Maverik":{"tags":{"name":"Maverik","amenity":"fuel"},"name":"Maverik","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Maxol":{"tags":{"name":"Maxol","amenity":"fuel"},"name":"Maxol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Metano":{"tags":{"name":"Metano","amenity":"fuel"},"name":"Metano","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Migrol":{"tags":{"name":"Migrol","amenity":"fuel"},"name":"Migrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Minipump":{"tags":{"name":"Minipump","amenity":"fuel"},"name":"Minipump","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Mobil":{"tags":{"name":"Mobil","amenity":"fuel"},"name":"Mobil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Mobile":{"tags":{"name":"Mobile","amenity":"fuel"},"name":"Mobile","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Mol":{"tags":{"name":"Mol","amenity":"fuel"},"name":"Mol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Moya":{"tags":{"name":"Moya","amenity":"fuel"},"name":"Moya","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Murphy USA":{"tags":{"name":"Murphy USA","amenity":"fuel"},"name":"Murphy USA","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Neste":{"tags":{"name":"Neste","amenity":"fuel"},"name":"Neste","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/OIL!":{"tags":{"name":"OIL!","amenity":"fuel"},"name":"OIL!","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/OK":{"tags":{"name":"OK","amenity":"fuel"},"name":"OK","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/OKQ8":{"tags":{"name":"OKQ8","amenity":"fuel"},"name":"OKQ8","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/OMV":{"tags":{"name":"OMV","amenity":"fuel"},"name":"OMV","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Oilibya":{"tags":{"name":"Oilibya","amenity":"fuel"},"name":"Oilibya","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Opet":{"tags":{"name":"Opet","amenity":"fuel"},"name":"Opet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Orlen":{"tags":{"name":"Orlen","amenity":"fuel"},"name":"Orlen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/PETRONOR":{"tags":{"name":"PETRONOR","amenity":"fuel"},"name":"PETRONOR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/PSO":{"tags":{"name":"PSO","amenity":"fuel"},"name":"PSO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/PSO Petrol Pump":{"tags":{"name":"PSO Petrol Pump","amenity":"fuel"},"name":"PSO Petrol Pump","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/PT":{"tags":{"name":"PT","amenity":"fuel"},"name":"PT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/PTT":{"tags":{"name":"PTT","amenity":"fuel"},"name":"PTT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/PV Oil":{"tags":{"name":"PV Oil","amenity":"fuel"},"name":"PV Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pacific Pride":{"tags":{"name":"Pacific Pride","amenity":"fuel"},"name":"Pacific Pride","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pecsa":{"tags":{"name":"Pecsa","amenity":"fuel"},"name":"Pecsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pemex":{"tags":{"name":"Pemex","amenity":"fuel"},"name":"Pemex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pertamina":{"tags":{"name":"Pertamina","amenity":"fuel"},"name":"Pertamina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petro":{"tags":{"name":"Petro","amenity":"fuel"},"name":"Petro","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petro-Canada":{"tags":{"name":"Petro-Canada","amenity":"fuel"},"name":"Petro-Canada","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petrobras":{"tags":{"name":"Petrobras","amenity":"fuel"},"name":"Petrobras","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petrochina":{"tags":{"name":"Petrochina","amenity":"fuel"},"name":"Petrochina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petroecuador":{"tags":{"name":"Petroecuador","amenity":"fuel"},"name":"Petroecuador","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petrol Ofisi":{"tags":{"name":"Petrol Ofisi","amenity":"fuel"},"name":"Petrol Ofisi","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petrolimex":{"tags":{"name":"Petrolimex","amenity":"fuel"},"name":"Petrolimex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petrom":{"tags":{"name":"Petrom","amenity":"fuel"},"name":"Petrom","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petron":{"tags":{"name":"Petron","amenity":"fuel"},"name":"Petron","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petronas":{"tags":{"name":"Petronas","amenity":"fuel"},"name":"Petronas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petroperu":{"tags":{"name":"Petroperu","amenity":"fuel"},"name":"Petroperu","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Phillips 66":{"tags":{"name":"Phillips 66","amenity":"fuel"},"name":"Phillips 66","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Phoenix":{"tags":{"name":"Phoenix","amenity":"fuel"},"name":"Phoenix","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pilot":{"tags":{"name":"Pilot","amenity":"fuel"},"name":"Pilot","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pioneer":{"tags":{"name":"Pioneer","amenity":"fuel"},"name":"Pioneer","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Posto":{"tags":{"name":"Posto","amenity":"fuel"},"name":"Posto","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Posto Atem":{"tags":{"name":"Posto Atem","amenity":"fuel"},"name":"Posto Atem","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Posto BR":{"tags":{"name":"Posto BR","amenity":"fuel"},"name":"Posto BR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Posto Ipiranga":{"tags":{"name":"Posto Ipiranga","amenity":"fuel"},"name":"Posto Ipiranga","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Posto Shell":{"tags":{"name":"Posto Shell","amenity":"fuel"},"name":"Posto Shell","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Primax":{"tags":{"name":"Primax","amenity":"fuel"},"name":"Primax","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Prio":{"tags":{"name":"Prio","amenity":"fuel"},"name":"Prio","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Puma":{"tags":{"name":"Puma","amenity":"fuel"},"name":"Puma","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Q1":{"tags":{"name":"Q1","amenity":"fuel"},"name":"Q1","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Q8":{"tags":{"name":"Q8","amenity":"fuel"},"name":"Q8","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Q8 Easy":{"tags":{"name":"Q8 Easy","amenity":"fuel"},"name":"Q8 Easy","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/QuikTrip":{"tags":{"name":"QuikTrip","amenity":"fuel"},"name":"QuikTrip","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/REPSOL":{"tags":{"name":"REPSOL","amenity":"fuel"},"name":"REPSOL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/RaceTrac":{"tags":{"name":"RaceTrac","amenity":"fuel"},"name":"RaceTrac","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Repsol":{"tags":{"name":"Repsol","amenity":"fuel"},"name":"Repsol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Rompetrol":{"tags":{"name":"Rompetrol","amenity":"fuel"},"name":"Rompetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Rubis":{"tags":{"name":"Rubis","amenity":"fuel"},"name":"Rubis","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/SB Tank":{"tags":{"name":"SB Tank","amenity":"fuel"},"name":"SB Tank","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/SPBU":{"tags":{"name":"SPBU","amenity":"fuel"},"name":"SPBU","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sasol":{"tags":{"name":"Sasol","amenity":"fuel"},"name":"Sasol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sea Oil":{"tags":{"name":"Sea Oil","amenity":"fuel"},"name":"Sea Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sheetz":{"tags":{"name":"Sheetz","amenity":"fuel"},"name":"Sheetz","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Shell":{"tags":{"name":"Shell","amenity":"fuel"},"name":"Shell","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Shell Express":{"tags":{"name":"Shell Express","amenity":"fuel"},"name":"Shell Express","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sinclair":{"tags":{"name":"Sinclair","amenity":"fuel"},"name":"Sinclair","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sinopec":{"tags":{"name":"Sinopec","amenity":"fuel"},"name":"Sinopec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sinopec Fuel":{"tags":{"name":"Sinopec Fuel","amenity":"fuel"},"name":"Sinopec Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Slovnaft":{"tags":{"name":"Slovnaft","amenity":"fuel"},"name":"Slovnaft","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Socar":{"tags":{"name":"Socar","amenity":"fuel"},"name":"Socar","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sokimex":{"tags":{"name":"Sokimex","amenity":"fuel"},"name":"Sokimex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Speedway":{"tags":{"name":"Speedway","amenity":"fuel"},"name":"Speedway","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/St1":{"tags":{"name":"St1","amenity":"fuel"},"name":"St1","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Star":{"tags":{"name":"Star","amenity":"fuel"},"name":"Star","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Star Oil":{"tags":{"name":"Star Oil","amenity":"fuel"},"name":"Star Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Station Service E. Leclerc":{"tags":{"name":"Station Service E. Leclerc","amenity":"fuel"},"name":"Station Service E. Leclerc","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Statoil":{"tags":{"name":"Statoil","amenity":"fuel"},"name":"Statoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sunoco":{"tags":{"name":"Sunoco","amenity":"fuel"},"name":"Sunoco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Tamoil":{"tags":{"name":"Tamoil","amenity":"fuel"},"name":"Tamoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Tango":{"tags":{"name":"Tango","amenity":"fuel"},"name":"Tango","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Teboil":{"tags":{"name":"Teboil","amenity":"fuel"},"name":"Teboil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Tela":{"tags":{"name":"Tela","amenity":"fuel"},"name":"Tela","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Terpel":{"tags":{"name":"Terpel","amenity":"fuel"},"name":"Terpel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Texaco":{"tags":{"name":"Texaco","amenity":"fuel"},"name":"Texaco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Tinq":{"tags":{"name":"Tinq","amenity":"fuel"},"name":"Tinq","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Topaz":{"tags":{"name":"Topaz","amenity":"fuel"},"name":"Topaz","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Total":{"tags":{"name":"Total","amenity":"fuel"},"name":"Total","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Total Access":{"tags":{"name":"Total Access","amenity":"fuel"},"name":"Total Access","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Total Erg":{"tags":{"name":"Total Erg","amenity":"fuel"},"name":"Total Erg","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/TotalErg":{"tags":{"name":"TotalErg","amenity":"fuel"},"name":"TotalErg","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Turkey Hill":{"tags":{"name":"Turkey Hill","amenity":"fuel"},"name":"Turkey Hill","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Turmöl":{"tags":{"name":"Turmöl","amenity":"fuel"},"name":"Turmöl","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Ultramar":{"tags":{"name":"Ultramar","amenity":"fuel"},"name":"Ultramar","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/United":{"tags":{"name":"United","amenity":"fuel"},"name":"United","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Uno":{"tags":{"name":"Uno","amenity":"fuel"},"name":"Uno","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Uno-X":{"tags":{"name":"Uno-X","amenity":"fuel"},"name":"Uno-X","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Valero":{"tags":{"name":"Valero","amenity":"fuel"},"name":"Valero","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Vito":{"tags":{"name":"Vito","amenity":"fuel"},"name":"Vito","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/WOG":{"tags":{"name":"WOG","amenity":"fuel"},"name":"WOG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Westfalen":{"tags":{"name":"Westfalen","amenity":"fuel"},"name":"Westfalen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Woolworths Petrol":{"tags":{"name":"Woolworths Petrol","amenity":"fuel"},"name":"Woolworths Petrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Z":{"tags":{"name":"Z","amenity":"fuel"},"name":"Z","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/bft":{"tags":{"name":"bft","amenity":"fuel"},"name":"bft","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/eni":{"tags":{"name":"eni","amenity":"fuel"},"name":"eni","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ΕΚΟ":{"tags":{"name":"ΕΚΟ","amenity":"fuel"},"name":"ΕΚΟ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/АГЗС":{"tags":{"name":"АГЗС","amenity":"fuel"},"name":"АГЗС","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/АЗС":{"tags":{"name":"АЗС","amenity":"fuel"},"name":"АЗС","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Авіас":{"tags":{"name":"Авіас","amenity":"fuel"},"name":"Авіас","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/БРСМ-Нафта":{"tags":{"name":"БРСМ-Нафта","amenity":"fuel"},"name":"БРСМ-Нафта","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Башнефть":{"tags":{"name":"Башнефть","amenity":"fuel"},"name":"Башнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Белоруснефть":{"tags":{"name":"Белоруснефть","amenity":"fuel"},"name":"Белоруснефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Газовая заправка":{"tags":{"name":"Газовая заправка","amenity":"fuel"},"name":"Газовая заправка","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Газпромнефть":{"tags":{"name":"Газпромнефть","amenity":"fuel"},"name":"Газпромнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Гелиос":{"tags":{"name":"Гелиос","amenity":"fuel"},"name":"Гелиос","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ЕКА":{"tags":{"name":"ЕКА","amenity":"fuel"},"name":"ЕКА","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Заправка":{"tags":{"name":"Заправка","amenity":"fuel"},"name":"Заправка","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/КазМунайГаз":{"tags":{"name":"КазМунайГаз","amenity":"fuel"},"name":"КазМунайГаз","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Лукойл":{"tags":{"name":"Лукойл","amenity":"fuel"},"name":"Лукойл","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Макпетрол":{"tags":{"name":"Макпетрол","amenity":"fuel"},"name":"Макпетрол","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/НК Альянс":{"tags":{"name":"НК Альянс","amenity":"fuel"},"name":"НК Альянс","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Нефтьмагистраль":{"tags":{"name":"Нефтьмагистраль","amenity":"fuel"},"name":"Нефтьмагистраль","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ОККО":{"tags":{"name":"ОККО","amenity":"fuel"},"name":"ОККО","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ОМВ":{"tags":{"name":"ОМВ","amenity":"fuel"},"name":"ОМВ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Октан":{"tags":{"name":"Октан","amenity":"fuel"},"name":"Октан","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ПТК":{"tags":{"name":"ПТК","amenity":"fuel"},"name":"ПТК","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Петрол":{"tags":{"name":"Петрол","amenity":"fuel"},"name":"Петрол","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Пропан":{"tags":{"name":"Пропан","amenity":"fuel"},"name":"Пропан","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Роснефть":{"tags":{"name":"Роснефть","amenity":"fuel"},"name":"Роснефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Сибнефть":{"tags":{"name":"Сибнефть","amenity":"fuel"},"name":"Сибнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Сургутнефтегаз":{"tags":{"name":"Сургутнефтегаз","amenity":"fuel"},"name":"Сургутнефтегаз","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ТНК":{"tags":{"name":"ТНК","amenity":"fuel"},"name":"ТНК","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Татнефтепродукт":{"tags":{"name":"Татнефтепродукт","amenity":"fuel"},"name":"Татнефтепродукт","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Татнефть":{"tags":{"name":"Татнефть","amenity":"fuel"},"name":"Татнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Укрнафта":{"tags":{"name":"Укрнафта","amenity":"fuel"},"name":"Укрнафта","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/דור אלון":{"tags":{"name":"דור אלון","amenity":"fuel"},"name":"דור אלון","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/דלק":{"tags":{"name":"דלק","amenity":"fuel"},"name":"דלק","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/סונול":{"tags":{"name":"סונול","amenity":"fuel"},"name":"סונול","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/פז":{"tags":{"name":"פז","amenity":"fuel"},"name":"פז","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/محطة وقود":{"tags":{"name":"محطة وقود","amenity":"fuel"},"name":"محطة وقود","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/محطه وقود":{"tags":{"name":"محطه وقود","amenity":"fuel"},"name":"محطه وقود","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/پمپ بنزین":{"tags":{"name":"پمپ بنزین","amenity":"fuel"},"name":"پمپ بنزین","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/پمپ گاز":{"tags":{"name":"پمپ گاز","amenity":"fuel"},"name":"پمپ گاز","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/บางจาก":{"tags":{"name":"บางจาก","amenity":"fuel"},"name":"บางจาก","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ป.ต.ท.":{"tags":{"name":"ป.ต.ท.","amenity":"fuel"},"name":"ป.ต.ท.","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/เชลล์":{"tags":{"name":"เชลล์","amenity":"fuel"},"name":"เชลล์","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/เอสโซ่":{"tags":{"name":"เอสโซ่","amenity":"fuel"},"name":"เอสโซ่","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/エッソ":{"tags":{"name":"エッソ","amenity":"fuel"},"name":"エッソ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/エネオス":{"tags":{"name":"エネオス","amenity":"fuel"},"name":"エネオス","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/コスモ石油":{"tags":{"name":"コスモ石油","amenity":"fuel"},"name":"コスモ石油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ゼネラル":{"tags":{"name":"ゼネラル","amenity":"fuel"},"name":"ゼネラル","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/中国石化":{"tags":{"name":"中国石化","amenity":"fuel"},"name":"中国石化","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/中国石化 Sinopec":{"tags":{"name":"中国石化 Sinopec","amenity":"fuel"},"name":"中国石化 Sinopec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/中国石油":{"tags":{"name":"中国石油","amenity":"fuel"},"name":"中国石油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/中油":{"tags":{"name":"中油","amenity":"fuel"},"name":"中油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/出光":{"tags":{"name":"出光","name:en":"IDEMITSU","amenity":"fuel"},"name":"出光","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/加油站":{"tags":{"name":"加油站","amenity":"fuel"},"name":"加油站","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/台灣中油":{"tags":{"name":"台灣中油","amenity":"fuel"},"name":"台灣中油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/昭和シェル":{"tags":{"name":"昭和シェル","amenity":"fuel"},"name":"昭和シェル","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/hospital/Cruz Roja":{"tags":{"name":"Cruz Roja","healthcare":"hospital","amenity":"hospital"},"name":"Cruz Roja","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/IMSS":{"tags":{"name":"IMSS","healthcare":"hospital","amenity":"hospital"},"name":"IMSS","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Инфекционное отделение":{"tags":{"name":"Инфекционное отделение","healthcare":"hospital","amenity":"hospital"},"name":"Инфекционное отделение","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Кожно-венерологический диспансер":{"tags":{"name":"Кожно-венерологический диспансер","healthcare":"hospital","amenity":"hospital"},"name":"Кожно-венерологический диспансер","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Районная больница":{"tags":{"name":"Районная больница","healthcare":"hospital","amenity":"hospital"},"name":"Районная больница","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Роддом":{"tags":{"name":"Роддом","healthcare":"hospital","amenity":"hospital"},"name":"Роддом","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Родильный дом":{"tags":{"name":"Родильный дом","healthcare":"hospital","amenity":"hospital"},"name":"Родильный дом","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Скорая помощь":{"tags":{"name":"Скорая помощь","healthcare":"hospital","amenity":"hospital"},"name":"Скорая помощь","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/ЦРБ":{"tags":{"name":"ЦРБ","healthcare":"hospital","amenity":"hospital"},"name":"ЦРБ","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Центральная районная больница":{"tags":{"name":"Центральная районная больница","healthcare":"hospital","amenity":"hospital"},"name":"Центральная районная больница","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/โรงพยาบาลส่งเสริมสุขภาพตำบล":{"tags":{"name":"โรงพยาบาลส่งเสริมสุขภาพตำบล","healthcare":"hospital","amenity":"hospital"},"name":"โรงพยาบาลส่งเสริมสุขภาพตำบล","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/ice_cream/Grido":{"tags":{"name":"Grido","amenity":"ice_cream"},"name":"Grido","icon":"ice-cream","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],"suggestion":true},"amenity/kindergarten/Anganwadi":{"tags":{"name":"Anganwadi","amenity":"kindergarten"},"name":"Anganwadi","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Arche Noah":{"tags":{"name":"Arche Noah","amenity":"kindergarten"},"name":"Arche Noah","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/CONAFE Preescolar":{"tags":{"name":"CONAFE Preescolar","amenity":"kindergarten"},"name":"CONAFE Preescolar","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Educacion Inicial de CONAFE No Escolarizado":{"tags":{"name":"Educacion Inicial de CONAFE No Escolarizado","amenity":"kindergarten"},"name":"Educacion Inicial de CONAFE No Escolarizado","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Estefania Casta�eda":{"tags":{"name":"Estefania Casta�eda","amenity":"kindergarten"},"name":"Estefania Casta�eda","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Evangelischer Kindergarten":{"tags":{"name":"Evangelischer Kindergarten","amenity":"kindergarten"},"name":"Evangelischer Kindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Federico Froebel":{"tags":{"name":"Federico Froebel","amenity":"kindergarten"},"name":"Federico Froebel","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Gabriela Mistral":{"tags":{"name":"Gabriela Mistral","amenity":"kindergarten"},"name":"Gabriela Mistral","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Jean Piaget":{"tags":{"name":"Jean Piaget","amenity":"kindergarten"},"name":"Jean Piaget","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Katholischer Kindergarten":{"tags":{"name":"Katholischer Kindergarten","amenity":"kindergarten"},"name":"Katholischer Kindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Kindergarten Regenbogen":{"tags":{"name":"Kindergarten Regenbogen","amenity":"kindergarten"},"name":"Kindergarten Regenbogen","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Kindergarten St. Josef":{"tags":{"name":"Kindergarten St. Josef","amenity":"kindergarten"},"name":"Kindergarten St. Josef","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Kindergarten St. Martin":{"tags":{"name":"Kindergarten St. Martin","amenity":"kindergarten"},"name":"Kindergarten St. Martin","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Maria Montessori":{"tags":{"name":"Maria Montessori","amenity":"kindergarten"},"name":"Maria Montessori","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/PAUD":{"tags":{"name":"PAUD","amenity":"kindergarten"},"name":"PAUD","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Pusteblume":{"tags":{"name":"Pusteblume","amenity":"kindergarten"},"name":"Pusteblume","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Rosaura Zapata":{"tags":{"name":"Rosaura Zapata","amenity":"kindergarten"},"name":"Rosaura Zapata","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Sor Juana Ines De La Cruz":{"tags":{"name":"Sor Juana Ines De La Cruz","amenity":"kindergarten"},"name":"Sor Juana Ines De La Cruz","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Spatzennest":{"tags":{"name":"Spatzennest","amenity":"kindergarten"},"name":"Spatzennest","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Städtischer Kindergarten":{"tags":{"name":"Städtischer Kindergarten","amenity":"kindergarten"},"name":"Städtischer Kindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Villa Kunterbunt":{"tags":{"name":"Villa Kunterbunt","amenity":"kindergarten"},"name":"Villa Kunterbunt","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Waldkindergarten":{"tags":{"name":"Waldkindergarten","amenity":"kindergarten"},"name":"Waldkindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Waldorfkindergarten":{"tags":{"name":"Waldorfkindergarten","amenity":"kindergarten"},"name":"Waldorfkindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Óvoda":{"tags":{"name":"Óvoda","amenity":"kindergarten"},"name":"Óvoda","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детсад":{"tags":{"name":"Детсад","amenity":"kindergarten"},"name":"Детсад","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад Солнышко":{"tags":{"name":"Детский сад Солнышко","amenity":"kindergarten"},"name":"Детский сад Солнышко","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад № 1":{"tags":{"name":"Детский сад № 1","amenity":"kindergarten"},"name":"Детский сад № 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №1":{"tags":{"name":"Детский сад №1","amenity":"kindergarten"},"name":"Детский сад №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №10":{"tags":{"name":"Детский сад №10","amenity":"kindergarten"},"name":"Детский сад №10","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №11":{"tags":{"name":"Детский сад №11","amenity":"kindergarten"},"name":"Детский сад №11","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №12":{"tags":{"name":"Детский сад №12","amenity":"kindergarten"},"name":"Детский сад №12","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №13":{"tags":{"name":"Детский сад №13","amenity":"kindergarten"},"name":"Детский сад №13","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №14":{"tags":{"name":"Детский сад №14","amenity":"kindergarten"},"name":"Детский сад №14","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №15":{"tags":{"name":"Детский сад №15","amenity":"kindergarten"},"name":"Детский сад №15","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №16":{"tags":{"name":"Детский сад №16","amenity":"kindergarten"},"name":"Детский сад №16","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №17":{"tags":{"name":"Детский сад №17","amenity":"kindergarten"},"name":"Детский сад №17","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №18":{"tags":{"name":"Детский сад №18","amenity":"kindergarten"},"name":"Детский сад №18","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №19":{"tags":{"name":"Детский сад №19","amenity":"kindergarten"},"name":"Детский сад №19","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №2":{"tags":{"name":"Детский сад №2","amenity":"kindergarten"},"name":"Детский сад №2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №22":{"tags":{"name":"Детский сад №22","amenity":"kindergarten"},"name":"Детский сад №22","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №24":{"tags":{"name":"Детский сад №24","amenity":"kindergarten"},"name":"Детский сад №24","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №25":{"tags":{"name":"Детский сад №25","amenity":"kindergarten"},"name":"Детский сад №25","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №27":{"tags":{"name":"Детский сад №27","amenity":"kindergarten"},"name":"Детский сад №27","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №29":{"tags":{"name":"Детский сад №29","amenity":"kindergarten"},"name":"Детский сад №29","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №3":{"tags":{"name":"Детский сад №3","amenity":"kindergarten"},"name":"Детский сад №3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №33":{"tags":{"name":"Детский сад №33","amenity":"kindergarten"},"name":"Детский сад №33","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №4":{"tags":{"name":"Детский сад №4","amenity":"kindergarten"},"name":"Детский сад №4","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №5":{"tags":{"name":"Детский сад №5","amenity":"kindergarten"},"name":"Детский сад №5","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №6":{"tags":{"name":"Детский сад №6","amenity":"kindergarten"},"name":"Детский сад №6","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №7":{"tags":{"name":"Детский сад №7","amenity":"kindergarten"},"name":"Детский сад №7","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №8":{"tags":{"name":"Детский сад №8","amenity":"kindergarten"},"name":"Детский сад №8","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №9":{"tags":{"name":"Детский сад №9","amenity":"kindergarten"},"name":"Детский сад №9","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Дитячий садок":{"tags":{"name":"Дитячий садок","amenity":"kindergarten"},"name":"Дитячий садок","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Солнышко":{"tags":{"name":"Солнышко","amenity":"kindergarten"},"name":"Солнышко","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/საბავშვო ბაღი":{"tags":{"name":"საბავშვო ბაღი","amenity":"kindergarten"},"name":"საბავშვო ბაღი","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/中央保育所":{"tags":{"name":"中央保育所","amenity":"kindergarten"},"name":"中央保育所","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/library/Biblioteca Comunale":{"tags":{"name":"Biblioteca Comunale","amenity":"library"},"name":"Biblioteca Comunale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Biblioteca comunale":{"tags":{"name":"Biblioteca comunale","amenity":"library"},"name":"Biblioteca comunale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Biblioteka Publiczna":{"tags":{"name":"Biblioteka Publiczna","amenity":"library"},"name":"Biblioteka Publiczna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Bibliothèque Municipale":{"tags":{"name":"Bibliothèque Municipale","amenity":"library"},"name":"Bibliothèque Municipale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Bibliothèque municipale":{"tags":{"name":"Bibliothèque municipale","amenity":"library"},"name":"Bibliothèque municipale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Bücherei":{"tags":{"name":"Bücherei","amenity":"library"},"name":"Bücherei","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Central Library":{"tags":{"name":"Central Library","amenity":"library"},"name":"Central Library","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Gemeindebücherei":{"tags":{"name":"Gemeindebücherei","amenity":"library"},"name":"Gemeindebücherei","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Gminna Biblioteka Publiczna":{"tags":{"name":"Gminna Biblioteka Publiczna","amenity":"library"},"name":"Gminna Biblioteka Publiczna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Miejska Biblioteka Publiczna":{"tags":{"name":"Miejska Biblioteka Publiczna","amenity":"library"},"name":"Miejska Biblioteka Publiczna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Médiathèque":{"tags":{"name":"Médiathèque","amenity":"library"},"name":"Médiathèque","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Městská knihovna":{"tags":{"name":"Městská knihovna","amenity":"library"},"name":"Městská knihovna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Public Library":{"tags":{"name":"Public Library","amenity":"library"},"name":"Public Library","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Stadtbibliothek":{"tags":{"name":"Stadtbibliothek","amenity":"library"},"name":"Stadtbibliothek","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Stadtbücherei":{"tags":{"name":"Stadtbücherei","amenity":"library"},"name":"Stadtbücherei","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Городская библиотека":{"tags":{"name":"Городская библиотека","amenity":"library"},"name":"Городская библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Детская библиотека":{"tags":{"name":"Детская библиотека","amenity":"library"},"name":"Детская библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Центральная библиотека":{"tags":{"name":"Центральная библиотека","amenity":"library"},"name":"Центральная библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Центральная городская библиотека":{"tags":{"name":"Центральная городская библиотека","amenity":"library"},"name":"Центральная городская библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/图书馆":{"tags":{"name":"图书馆","amenity":"library"},"name":"图书馆","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/pharmacy/36.6":{"tags":{"name":"36.6","healthcare":"pharmacy","amenity":"pharmacy"},"name":"36.6","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Adler-Apotheke":{"tags":{"name":"Adler-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Adler-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Alte Apotheke":{"tags":{"name":"Alte Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Alte Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Apollo Pharmacy":{"tags":{"name":"Apollo Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apollo Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Apotek":{"tags":{"name":"Apotek","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apotek","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Apotek Hjärtat":{"tags":{"name":"Apotek Hjärtat","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apotek Hjärtat","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Apotheke am Markt":{"tags":{"name":"Apotheke am Markt","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apotheke am Markt","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Bahnhof Apotheke":{"tags":{"name":"Bahnhof Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bahnhof Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Bahnhof-Apotheke":{"tags":{"name":"Bahnhof-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bahnhof-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Bartell Drugs":{"tags":{"name":"Bartell Drugs","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bartell Drugs","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Benavides":{"tags":{"name":"Benavides","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Benavides","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Benu":{"tags":{"name":"Benu","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Benu","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Boots":{"tags":{"name":"Boots","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Boots","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Botica":{"tags":{"name":"Botica","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Botica","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Brunnen-Apotheke":{"tags":{"name":"Brunnen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Brunnen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Burg-Apotheke":{"tags":{"name":"Burg-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Burg-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Bären-Apotheke":{"tags":{"name":"Bären-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bären-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/CVS":{"tags":{"name":"CVS","healthcare":"pharmacy","amenity":"pharmacy"},"name":"CVS","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Camelia":{"tags":{"name":"Camelia","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Camelia","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Catena":{"tags":{"name":"Catena","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Catena","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Chemist Warehouse":{"tags":{"name":"Chemist Warehouse","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Chemist Warehouse","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Clicks":{"tags":{"name":"Clicks","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Clicks","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Cruz Azul":{"tags":{"name":"Cruz Azul","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Cruz Azul","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Cruz Verde":{"tags":{"name":"Cruz Verde","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Cruz Verde","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Dbam o Zdrowie":{"tags":{"name":"Dbam o Zdrowie","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Dbam o Zdrowie","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Dr. Max":{"tags":{"name":"Dr. Max","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Dr. Max","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Droga Raia":{"tags":{"name":"Droga Raia","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Droga Raia","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Drogaria São Paulo":{"tags":{"name":"Drogaria São Paulo","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Drogaria São Paulo","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Drogasil":{"tags":{"name":"Drogasil","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Drogasil","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Duane Reade":{"tags":{"name":"Duane Reade","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Duane Reade","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Eczane":{"tags":{"name":"Eczane","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Eczane","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Engel-Apotheke":{"tags":{"name":"Engel-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Engel-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Eurovaistinė":{"tags":{"name":"Eurovaistinė","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Eurovaistinė","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Familiprix":{"tags":{"name":"Familiprix","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Familiprix","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacenter":{"tags":{"name":"Farmacenter","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacenter","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacia Centrale":{"tags":{"name":"Farmacia Centrale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia Centrale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacia Comunale":{"tags":{"name":"Farmacia Comunale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia Comunale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacia Guadalajara":{"tags":{"name":"Farmacia Guadalajara","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia Guadalajara","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacia del Ahorro":{"tags":{"name":"Farmacia del Ahorro","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia del Ahorro","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacias Ahumada":{"tags":{"name":"Farmacias Ahumada","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Ahumada","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacias Cruz Azul":{"tags":{"name":"Farmacias Cruz Azul","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Cruz Azul","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacias Cruz Verde":{"tags":{"name":"Farmacias Cruz Verde","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Cruz Verde","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacias Económicas":{"tags":{"name":"Farmacias Económicas","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Económicas","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacias Guadalajara":{"tags":{"name":"Farmacias Guadalajara","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Guadalajara","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacias SalcoBrand":{"tags":{"name":"Farmacias SalcoBrand","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias SalcoBrand","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacias Sana Sana":{"tags":{"name":"Farmacias Sana Sana","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Sana Sana","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacias Similares":{"tags":{"name":"Farmacias Similares","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Similares","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacias del Ahorro":{"tags":{"name":"Farmacias del Ahorro","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias del Ahorro","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacity":{"tags":{"name":"Farmacity","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacity","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmahorro":{"tags":{"name":"Farmahorro","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmahorro","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmatodo":{"tags":{"name":"Farmatodo","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmatodo","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Felicia":{"tags":{"name":"Felicia","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Felicia","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Fybeca":{"tags":{"name":"Fybeca","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Fybeca","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Generika Drugstore":{"tags":{"name":"Generika Drugstore","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Generika Drugstore","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Gintarinė vaistinė":{"tags":{"name":"Gintarinė vaistinė","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Gintarinė vaistinė","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Guardian":{"tags":{"name":"Guardian","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Guardian","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Gyógyszertár":{"tags":{"name":"Gyógyszertár","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Gyógyszertár","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/H-E-B Pharmacy":{"tags":{"name":"H-E-B Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"H-E-B Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Hirsch-Apotheke":{"tags":{"name":"Hirsch-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Hirsch-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Hubertus Apotheke":{"tags":{"name":"Hubertus Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Hubertus Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Inkafarma":{"tags":{"name":"Inkafarma","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Inkafarma","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Jean Coutu":{"tags":{"name":"Jean Coutu","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Jean Coutu","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Kinney Drugs":{"tags":{"name":"Kinney Drugs","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Kinney Drugs","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Kur-Apotheke":{"tags":{"name":"Kur-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Kur-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Linden-Apotheke":{"tags":{"name":"Linden-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Linden-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Ljekarna":{"tags":{"name":"Ljekarna","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Ljekarna","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Lloyds Pharmacy":{"tags":{"name":"Lloyds Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Lloyds Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Lékárna":{"tags":{"name":"Lékárna","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Lékárna","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Löwen-Apotheke":{"tags":{"name":"Löwen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Löwen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Marien-Apotheke":{"tags":{"name":"Marien-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Marien-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Markt-Apotheke":{"tags":{"name":"Markt-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Markt-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Mercury Drug":{"tags":{"name":"Mercury Drug","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Mercury Drug","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Mifarma":{"tags":{"name":"Mifarma","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Mifarma","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Mēness aptieka":{"tags":{"name":"Mēness aptieka","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Mēness aptieka","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Neue Apotheke":{"tags":{"name":"Neue Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Neue Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pague Menos":{"tags":{"name":"Pague Menos","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pague Menos","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Panvel":{"tags":{"name":"Panvel","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Panvel","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Park-Apotheke":{"tags":{"name":"Park-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Park-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pharmacie Centrale":{"tags":{"name":"Pharmacie Centrale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie Centrale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pharmacie Principale":{"tags":{"name":"Pharmacie Principale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie Principale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pharmacie de l'Hôtel de Ville":{"tags":{"name":"Pharmacie de l'Hôtel de Ville","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de l'Hôtel de Ville","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pharmacie de la Gare":{"tags":{"name":"Pharmacie de la Gare","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de la Gare","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pharmacie de la Mairie":{"tags":{"name":"Pharmacie de la Mairie","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de la Mairie","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pharmacie de la Poste":{"tags":{"name":"Pharmacie de la Poste","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de la Poste","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pharmacie du Centre":{"tags":{"name":"Pharmacie du Centre","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie du Centre","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pharmacie du Marché":{"tags":{"name":"Pharmacie du Marché","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie du Marché","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pharmacie du Parc":{"tags":{"name":"Pharmacie du Parc","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie du Parc","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pharmaprix":{"tags":{"name":"Pharmaprix","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmaprix","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pharmasave":{"tags":{"name":"Pharmasave","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmasave","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Punkt Apteczny":{"tags":{"name":"Punkt Apteczny","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Punkt Apteczny","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Rathaus-Apotheke":{"tags":{"name":"Rathaus-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rathaus-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Rats-Apotheke":{"tags":{"name":"Rats-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rats-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Rexall":{"tags":{"name":"Rexall","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rexall","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Rite Aid":{"tags":{"name":"Rite Aid","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rite Aid","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Rose Pharmacy":{"tags":{"name":"Rose Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rose Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Rosen-Apotheke":{"tags":{"name":"Rosen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rosen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Rowlands Pharmacy":{"tags":{"name":"Rowlands Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rowlands Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/SalcoBrand":{"tags":{"name":"SalcoBrand","healthcare":"pharmacy","amenity":"pharmacy"},"name":"SalcoBrand","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Sana Sana":{"tags":{"name":"Sana Sana","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Sana Sana","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Schloss-Apotheke":{"tags":{"name":"Schloss-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Schloss-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Sensiblu":{"tags":{"name":"Sensiblu","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Sensiblu","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Shoppers Drug Mart":{"tags":{"name":"Shoppers Drug Mart","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Shoppers Drug Mart","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Sonnen-Apotheke":{"tags":{"name":"Sonnen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Sonnen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/South Star Drug":{"tags":{"name":"South Star Drug","healthcare":"pharmacy","amenity":"pharmacy"},"name":"South Star Drug","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Stadt-Apotheke":{"tags":{"name":"Stadt-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Stadt-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Stern-Apotheke":{"tags":{"name":"Stern-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Stern-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Superdrug":{"tags":{"name":"Superdrug","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Superdrug","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/São João":{"tags":{"name":"São João","healthcare":"pharmacy","amenity":"pharmacy"},"name":"São João","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/The Generics Pharmacy":{"tags":{"name":"The Generics Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"The Generics Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Uniprix":{"tags":{"name":"Uniprix","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Uniprix","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Walgreens":{"tags":{"name":"Walgreens","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Walgreens","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Walgreens Pharmacy":{"tags":{"name":"Walgreens Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Walgreens Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Walmart Pharmacy":{"tags":{"name":"Walmart Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Walmart Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Well Pharmacy":{"tags":{"name":"Well Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Well Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/centro naturista":{"tags":{"name":"centro naturista","healthcare":"pharmacy","amenity":"pharmacy"},"name":"centro naturista","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/А5":{"tags":{"name":"А5","healthcare":"pharmacy","amenity":"pharmacy"},"name":"А5","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Айболит":{"tags":{"name":"Айболит","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Айболит","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Аптека 36,6":{"tags":{"name":"Аптека 36,6","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека 36,6","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Аптека низких цен":{"tags":{"name":"Аптека низких цен","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека низких цен","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Аптека низьких цін":{"tags":{"name":"Аптека низьких цін","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека низьких цін","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Аптека от склада":{"tags":{"name":"Аптека от склада","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека от склада","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Аптека №1":{"tags":{"name":"Аптека №1","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека №1","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Аптечный пункт":{"tags":{"name":"Аптечный пункт","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптечный пункт","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Арніка":{"tags":{"name":"Арніка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Арніка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Бережная аптека":{"tags":{"name":"Бережная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Бережная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Будь здоров":{"tags":{"name":"Будь здоров","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Будь здоров","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Вита":{"tags":{"name":"Вита","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Вита","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Горздрав":{"tags":{"name":"Горздрав","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Горздрав","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Живика":{"tags":{"name":"Живика","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Живика","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Здоровье":{"tags":{"name":"Здоровье","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Здоровье","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Имплозия":{"tags":{"name":"Имплозия","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Имплозия","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Классика":{"tags":{"name":"Классика","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Классика","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Ладушка":{"tags":{"name":"Ладушка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Ладушка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Мед-сервіс":{"tags":{"name":"Мед-сервіс","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Мед-сервіс","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Мелодия здоровья":{"tags":{"name":"Мелодия здоровья","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Мелодия здоровья","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Невис":{"tags":{"name":"Невис","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Невис","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Норма":{"tags":{"name":"Норма","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Норма","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Озерки":{"tags":{"name":"Озерки","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Озерки","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Панацея":{"tags":{"name":"Панацея","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Панацея","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Первая помощь":{"tags":{"name":"Первая помощь","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Первая помощь","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Планета здоровья":{"tags":{"name":"Планета здоровья","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Планета здоровья","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Ригла":{"tags":{"name":"Ригла","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Ригла","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Семейная":{"tags":{"name":"Семейная","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Семейная","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Социальная аптека":{"tags":{"name":"Социальная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Социальная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Столички":{"tags":{"name":"Столички","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Столички","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Фармакопейка":{"tags":{"name":"Фармакопейка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармакопейка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Фармакор":{"tags":{"name":"Фармакор","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармакор","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Фармация":{"tags":{"name":"Фармация","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармация","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Фармленд":{"tags":{"name":"Фармленд","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармленд","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Центральная аптека":{"tags":{"name":"Центральная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Центральная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/סופר-פארם":{"tags":{"name":"סופר-פארם","healthcare":"pharmacy","amenity":"pharmacy"},"name":"סופר-פארם","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/داروخانه":{"tags":{"name":"داروخانه","healthcare":"pharmacy","amenity":"pharmacy"},"name":"داروخانه","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/داروخانه شبانه روزی":{"tags":{"name":"داروخانه شبانه روزی","healthcare":"pharmacy","amenity":"pharmacy"},"name":"داروخانه شبانه روزی","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/صيدلية":{"tags":{"name":"صيدلية","healthcare":"pharmacy","amenity":"pharmacy"},"name":"صيدلية","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/くすりの福太郎":{"tags":{"name":"くすりの福太郎","healthcare":"pharmacy","amenity":"pharmacy"},"name":"くすりの福太郎","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/さくら薬局":{"tags":{"name":"さくら薬局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"さくら薬局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/ウエルシア":{"tags":{"name":"ウエルシア","healthcare":"pharmacy","amenity":"pharmacy"},"name":"ウエルシア","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/カワチ薬品":{"tags":{"name":"カワチ薬品","healthcare":"pharmacy","amenity":"pharmacy"},"name":"カワチ薬品","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/クリエイト":{"tags":{"name":"クリエイト","healthcare":"pharmacy","amenity":"pharmacy"},"name":"クリエイト","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/サンドラッグ":{"tags":{"name":"サンドラッグ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"サンドラッグ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/スギ薬局":{"tags":{"name":"スギ薬局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"スギ薬局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/セイジョー":{"tags":{"name":"セイジョー","healthcare":"pharmacy","amenity":"pharmacy"},"name":"セイジョー","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/ツルハドラッグ":{"tags":{"name":"ツルハドラッグ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"ツルハドラッグ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/ドラッグてらしま (Drug Terashima)":{"tags":{"name":"ドラッグてらしま (Drug Terashima)","healthcare":"pharmacy","amenity":"pharmacy"},"name":"ドラッグてらしま (Drug Terashima)","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/マツモトキヨシ":{"tags":{"name":"マツモトキヨシ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"マツモトキヨシ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/丁丁藥局":{"tags":{"name":"丁丁藥局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"丁丁藥局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pub/Black Bull":{"tags":{"name":"Black Bull","amenity":"pub"},"name":"Black Bull","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Commercial Hotel":{"tags":{"name":"Commercial Hotel","amenity":"pub"},"name":"Commercial Hotel","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Cross Keys":{"tags":{"name":"Cross Keys","amenity":"pub"},"name":"Cross Keys","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Irish Pub":{"tags":{"name":"Irish Pub","amenity":"pub"},"name":"Irish Pub","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Kings Arms":{"tags":{"name":"Kings Arms","amenity":"pub"},"name":"Kings Arms","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Kings Head":{"tags":{"name":"Kings Head","amenity":"pub"},"name":"Kings Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/New Inn":{"tags":{"name":"New Inn","amenity":"pub"},"name":"New Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Prince of Wales":{"tags":{"name":"Prince of Wales","amenity":"pub"},"name":"Prince of Wales","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Queens Head":{"tags":{"name":"Queens Head","amenity":"pub"},"name":"Queens Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Red Lion":{"tags":{"name":"Red Lion","amenity":"pub"},"name":"Red Lion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Rose & Crown":{"tags":{"name":"Rose & Crown","amenity":"pub"},"name":"Rose & Crown","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Rose and Crown":{"tags":{"name":"Rose and Crown","amenity":"pub"},"name":"Rose and Crown","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Royal Oak":{"tags":{"name":"Royal Oak","amenity":"pub"},"name":"Royal Oak","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Albion":{"tags":{"name":"The Albion","amenity":"pub"},"name":"The Albion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Anchor":{"tags":{"name":"The Anchor","amenity":"pub"},"name":"The Anchor","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Angel":{"tags":{"name":"The Angel","amenity":"pub"},"name":"The Angel","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Beehive":{"tags":{"name":"The Beehive","amenity":"pub"},"name":"The Beehive","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Bell":{"tags":{"name":"The Bell","amenity":"pub"},"name":"The Bell","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Bell Inn":{"tags":{"name":"The Bell Inn","amenity":"pub"},"name":"The Bell Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Black Horse":{"tags":{"name":"The Black Horse","amenity":"pub"},"name":"The Black Horse","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Bull":{"tags":{"name":"The Bull","amenity":"pub"},"name":"The Bull","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Castle":{"tags":{"name":"The Castle","amenity":"pub"},"name":"The Castle","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Chequers":{"tags":{"name":"The Chequers","amenity":"pub"},"name":"The Chequers","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Cricketers":{"tags":{"name":"The Cricketers","amenity":"pub"},"name":"The Cricketers","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Cross Keys":{"tags":{"name":"The Cross Keys","amenity":"pub"},"name":"The Cross Keys","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Crown":{"tags":{"name":"The Crown","amenity":"pub"},"name":"The Crown","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Crown Inn":{"tags":{"name":"The Crown Inn","amenity":"pub"},"name":"The Crown Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Fox":{"tags":{"name":"The Fox","amenity":"pub"},"name":"The Fox","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The George":{"tags":{"name":"The George","amenity":"pub"},"name":"The George","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Green Man":{"tags":{"name":"The Green Man","amenity":"pub"},"name":"The Green Man","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Greyhound":{"tags":{"name":"The Greyhound","amenity":"pub"},"name":"The Greyhound","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Kings Arms":{"tags":{"name":"The Kings Arms","amenity":"pub"},"name":"The Kings Arms","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Kings Head":{"tags":{"name":"The Kings Head","amenity":"pub"},"name":"The Kings Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The New Inn":{"tags":{"name":"The New Inn","amenity":"pub"},"name":"The New Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Plough":{"tags":{"name":"The Plough","amenity":"pub"},"name":"The Plough","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Plough Inn":{"tags":{"name":"The Plough Inn","amenity":"pub"},"name":"The Plough Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Queens Head":{"tags":{"name":"The Queens Head","amenity":"pub"},"name":"The Queens Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Railway":{"tags":{"name":"The Railway","amenity":"pub"},"name":"The Railway","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Red Lion":{"tags":{"name":"The Red Lion","amenity":"pub"},"name":"The Red Lion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Rising Sun":{"tags":{"name":"The Rising Sun","amenity":"pub"},"name":"The Rising Sun","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Royal Oak":{"tags":{"name":"The Royal Oak","amenity":"pub"},"name":"The Royal Oak","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Ship":{"tags":{"name":"The Ship","amenity":"pub"},"name":"The Ship","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Ship Inn":{"tags":{"name":"The Ship Inn","amenity":"pub"},"name":"The Ship Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Star":{"tags":{"name":"The Star","amenity":"pub"},"name":"The Star","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Star Inn":{"tags":{"name":"The Star Inn","amenity":"pub"},"name":"The Star Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Sun Inn":{"tags":{"name":"The Sun Inn","amenity":"pub"},"name":"The Sun Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Swan":{"tags":{"name":"The Swan","amenity":"pub"},"name":"The Swan","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Swan Inn":{"tags":{"name":"The Swan Inn","amenity":"pub"},"name":"The Swan Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Victoria":{"tags":{"name":"The Victoria","amenity":"pub"},"name":"The Victoria","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Wheatsheaf":{"tags":{"name":"The Wheatsheaf","amenity":"pub"},"name":"The Wheatsheaf","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The White Hart":{"tags":{"name":"The White Hart","amenity":"pub"},"name":"The White Hart","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The White Horse":{"tags":{"name":"The White Horse","amenity":"pub"},"name":"The White Horse","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The White Lion":{"tags":{"name":"The White Lion","amenity":"pub"},"name":"The White Lion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The White Swan":{"tags":{"name":"The White Swan","amenity":"pub"},"name":"The White Swan","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/魚民":{"tags":{"name":"魚民","amenity":"pub"},"name":"魚民","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/鳥貴族":{"tags":{"name":"鳥貴族","amenity":"pub"},"name":"鳥貴族","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/restaurant/Adler":{"tags":{"name":"Adler","amenity":"restaurant"},"name":"Adler","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Adria":{"tags":{"name":"Adria","amenity":"restaurant"},"name":"Adria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Adyar Ananda Bhavan":{"tags":{"name":"Adyar Ananda Bhavan","amenity":"restaurant"},"name":"Adyar Ananda Bhavan","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Akropolis":{"tags":{"name":"Akropolis","amenity":"restaurant"},"name":"Akropolis","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Alte Post":{"tags":{"name":"Alte Post","amenity":"restaurant"},"name":"Alte Post","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Applebee's":{"tags":{"name":"Applebee's","amenity":"restaurant"},"name":"Applebee's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Asia":{"tags":{"name":"Asia","amenity":"restaurant"},"name":"Asia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Athen":{"tags":{"name":"Athen","amenity":"restaurant"},"name":"Athen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Athos":{"tags":{"name":"Athos","amenity":"restaurant"},"name":"Athos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Autogrill":{"tags":{"name":"Autogrill","amenity":"restaurant"},"name":"Autogrill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bahnhof":{"tags":{"name":"Bahnhof","amenity":"restaurant"},"name":"Bahnhof","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bella Italia":{"tags":{"name":"Bella Italia","amenity":"restaurant"},"name":"Bella Italia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bella Napoli":{"tags":{"name":"Bella Napoli","amenity":"restaurant"},"name":"Bella Napoli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Big Boy":{"tags":{"name":"Big Boy","amenity":"restaurant"},"name":"Big Boy","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bob Evans":{"tags":{"name":"Bob Evans","amenity":"restaurant"},"name":"Bob Evans","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bonefish Grill":{"tags":{"name":"Bonefish Grill","amenity":"restaurant"},"name":"Bonefish Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Boston Pizza":{"tags":{"name":"Boston Pizza","amenity":"restaurant"},"name":"Boston Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Buffalo Grill":{"tags":{"name":"Buffalo Grill","amenity":"restaurant"},"name":"Buffalo Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Buffalo Wild Wings":{"tags":{"name":"Buffalo Wild Wings","amenity":"restaurant"},"name":"Buffalo Wild Wings","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bären":{"tags":{"name":"Bären","amenity":"restaurant"},"name":"Bären","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/California Pizza Kitchen":{"tags":{"name":"California Pizza Kitchen","amenity":"restaurant"},"name":"California Pizza Kitchen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Canteen":{"tags":{"name":"Canteen","amenity":"restaurant"},"name":"Canteen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Capri":{"tags":{"name":"Capri","amenity":"restaurant"},"name":"Capri","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Carluccio's":{"tags":{"name":"Carluccio's","amenity":"restaurant"},"name":"Carluccio's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Carpe Diem":{"tags":{"name":"Carpe Diem","amenity":"restaurant"},"name":"Carpe Diem","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Carrabba's Italian Grill":{"tags":{"name":"Carrabba's Italian Grill","amenity":"restaurant"},"name":"Carrabba's Italian Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Casa Mia":{"tags":{"name":"Casa Mia","amenity":"restaurant"},"name":"Casa Mia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Casablanca":{"tags":{"name":"Casablanca","amenity":"restaurant"},"name":"Casablanca","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Cheesecake Factory":{"tags":{"name":"Cheesecake Factory","amenity":"restaurant"},"name":"Cheesecake Factory","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chifa":{"tags":{"name":"Chifa","amenity":"restaurant"},"name":"Chifa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chili's":{"tags":{"name":"Chili's","amenity":"restaurant"},"name":"Chili's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Buffet":{"tags":{"name":"China Buffet","amenity":"restaurant"},"name":"China Buffet","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Garden":{"tags":{"name":"China Garden","amenity":"restaurant"},"name":"China Garden","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China House":{"tags":{"name":"China House","amenity":"restaurant"},"name":"China House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Town":{"tags":{"name":"China Town","amenity":"restaurant"},"name":"China Town","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Wok":{"tags":{"name":"China Wok","amenity":"restaurant"},"name":"China Wok","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chiquito":{"tags":{"name":"Chiquito","amenity":"restaurant"},"name":"Chiquito","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chuck E. Cheese's":{"tags":{"name":"Chuck E. Cheese's","amenity":"restaurant"},"name":"Chuck E. Cheese's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Cici's Pizza":{"tags":{"name":"Cici's Pizza","amenity":"restaurant"},"name":"Cici's Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Comedor":{"tags":{"name":"Comedor","amenity":"restaurant"},"name":"Comedor","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Comida China":{"tags":{"name":"Comida China","amenity":"restaurant"},"name":"Comida China","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Courtepaille":{"tags":{"name":"Courtepaille","amenity":"restaurant"},"name":"Courtepaille","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Cracker Barrel":{"tags":{"name":"Cracker Barrel","amenity":"restaurant"},"name":"Cracker Barrel","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Da Grasso":{"tags":{"name":"Da Grasso","amenity":"restaurant"},"name":"Da Grasso","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Da Vinci":{"tags":{"name":"Da Vinci","amenity":"restaurant"},"name":"Da Vinci","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Delphi":{"tags":{"name":"Delphi","amenity":"restaurant"},"name":"Delphi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Denny's":{"tags":{"name":"Denny's","amenity":"restaurant"},"name":"Denny's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Deutsches Haus":{"tags":{"name":"Deutsches Haus","amenity":"restaurant"},"name":"Deutsches Haus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Dionysos":{"tags":{"name":"Dionysos","amenity":"restaurant"},"name":"Dionysos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Dolce Vita":{"tags":{"name":"Dolce Vita","amenity":"restaurant"},"name":"Dolce Vita","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Dorfkrug":{"tags":{"name":"Dorfkrug","amenity":"restaurant"},"name":"Dorfkrug","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/East Side Mario's":{"tags":{"name":"East Side Mario's","amenity":"restaurant"},"name":"East Side Mario's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/El Greco":{"tags":{"name":"El Greco","amenity":"restaurant"},"name":"El Greco","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/El Paso":{"tags":{"name":"El Paso","amenity":"restaurant"},"name":"El Paso","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/El Rancho":{"tags":{"name":"El Rancho","amenity":"restaurant"},"name":"El Rancho","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Europa":{"tags":{"name":"Europa","amenity":"restaurant"},"name":"Europa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Famous Dave's":{"tags":{"name":"Famous Dave's","amenity":"restaurant"},"name":"Famous Dave's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Flunch":{"tags":{"name":"Flunch","amenity":"restaurant"},"name":"Flunch","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Frankie & Benny's":{"tags":{"name":"Frankie & Benny's","amenity":"restaurant"},"name":"Frankie & Benny's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Friendly's":{"tags":{"name":"Friendly's","amenity":"restaurant"},"name":"Friendly's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gasthaus Krone":{"tags":{"name":"Gasthaus Krone","amenity":"restaurant"},"name":"Gasthaus Krone","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gasthaus zur Linde":{"tags":{"name":"Gasthaus zur Linde","amenity":"restaurant"},"name":"Gasthaus zur Linde","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gasthof zur Post":{"tags":{"name":"Gasthof zur Post","amenity":"restaurant"},"name":"Gasthof zur Post","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Golden Corral":{"tags":{"name":"Golden Corral","amenity":"restaurant"},"name":"Golden Corral","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Golden Dragon":{"tags":{"name":"Golden Dragon","amenity":"restaurant"},"name":"Golden Dragon","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Great Wall":{"tags":{"name":"Great Wall","amenity":"restaurant"},"name":"Great Wall","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Grüner Baum":{"tags":{"name":"Grüner Baum","amenity":"restaurant"},"name":"Grüner Baum","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gusto":{"tags":{"name":"Gusto","amenity":"restaurant"},"name":"Gusto","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hard Rock Cafe":{"tags":{"name":"Hard Rock Cafe","amenity":"restaurant"},"name":"Hard Rock Cafe","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Harvester":{"tags":{"name":"Harvester","amenity":"restaurant"},"name":"Harvester","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hellas":{"tags":{"name":"Hellas","amenity":"restaurant"},"name":"Hellas","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hippopotamus":{"tags":{"name":"Hippopotamus","amenity":"restaurant"},"name":"Hippopotamus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hirsch":{"tags":{"name":"Hirsch","amenity":"restaurant"},"name":"Hirsch","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hirschen":{"tags":{"name":"Hirschen","amenity":"restaurant"},"name":"Hirschen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hong Kong":{"tags":{"name":"Hong Kong","amenity":"restaurant"},"name":"Hong Kong","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hooters":{"tags":{"name":"Hooters","amenity":"restaurant"},"name":"Hooters","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/IHOP":{"tags":{"name":"IHOP","amenity":"restaurant"},"name":"IHOP","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/IL Патио":{"tags":{"name":"IL Патио","amenity":"restaurant"},"name":"IL Патио","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Jason's Deli":{"tags":{"name":"Jason's Deli","amenity":"restaurant"},"name":"Jason's Deli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Joe's Crab Shack":{"tags":{"name":"Joe's Crab Shack","amenity":"restaurant"},"name":"Joe's Crab Shack","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Jägerhof":{"tags":{"name":"Jägerhof","amenity":"restaurant"},"name":"Jägerhof","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kantine":{"tags":{"name":"Kantine","amenity":"restaurant"},"name":"Kantine","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kelsey's":{"tags":{"name":"Kelsey's","amenity":"restaurant"},"name":"Kelsey's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kirchenwirt":{"tags":{"name":"Kirchenwirt","amenity":"restaurant"},"name":"Kirchenwirt","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kreta":{"tags":{"name":"Kreta","amenity":"restaurant"},"name":"Kreta","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kreuz":{"tags":{"name":"Kreuz","amenity":"restaurant"},"name":"Kreuz","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Krone":{"tags":{"name":"Krone","amenity":"restaurant"},"name":"Krone","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kudu":{"tags":{"name":"Kudu","amenity":"restaurant"},"name":"Kudu","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/L'Escale":{"tags":{"name":"L'Escale","amenity":"restaurant"},"name":"L'Escale","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/L'Osteria":{"tags":{"name":"L'Osteria","amenity":"restaurant"},"name":"L'Osteria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Bodega":{"tags":{"name":"La Bodega","amenity":"restaurant"},"name":"La Bodega","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Boucherie":{"tags":{"name":"La Boucherie","amenity":"restaurant"},"name":"La Boucherie","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Cantina":{"tags":{"name":"La Cantina","amenity":"restaurant"},"name":"La Cantina","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Casa":{"tags":{"name":"La Casa","amenity":"restaurant"},"name":"La Casa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Casona":{"tags":{"name":"La Casona","amenity":"restaurant"},"name":"La Casona","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Dolce Vita":{"tags":{"name":"La Dolce Vita","amenity":"restaurant"},"name":"La Dolce Vita","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Fontana":{"tags":{"name":"La Fontana","amenity":"restaurant"},"name":"La Fontana","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Gondola":{"tags":{"name":"La Gondola","amenity":"restaurant"},"name":"La Gondola","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Hacienda":{"tags":{"name":"La Hacienda","amenity":"restaurant"},"name":"La Hacienda","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Pataterie":{"tags":{"name":"La Pataterie","amenity":"restaurant"},"name":"La Pataterie","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Pergola":{"tags":{"name":"La Pergola","amenity":"restaurant"},"name":"La Pergola","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Perla":{"tags":{"name":"La Perla","amenity":"restaurant"},"name":"La Perla","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Piazza":{"tags":{"name":"La Piazza","amenity":"restaurant"},"name":"La Piazza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Piazzetta":{"tags":{"name":"La Piazzetta","amenity":"restaurant"},"name":"La Piazzetta","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Place":{"tags":{"name":"La Place","amenity":"restaurant"},"name":"La Place","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Scala":{"tags":{"name":"La Scala","amenity":"restaurant"},"name":"La Scala","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Strada":{"tags":{"name":"La Strada","amenity":"restaurant"},"name":"La Strada","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Tagliatella":{"tags":{"name":"La Tagliatella","amenity":"restaurant"},"name":"La Tagliatella","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Tasca":{"tags":{"name":"La Tasca","amenity":"restaurant"},"name":"La Tasca","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Taverna":{"tags":{"name":"La Taverna","amenity":"restaurant"},"name":"La Taverna","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Terrasse":{"tags":{"name":"La Terrasse","amenity":"restaurant"},"name":"La Terrasse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Terraza":{"tags":{"name":"La Terraza","amenity":"restaurant"},"name":"La Terraza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Terrazza":{"tags":{"name":"La Terrazza","amenity":"restaurant"},"name":"La Terrazza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Trattoria":{"tags":{"name":"La Trattoria","amenity":"restaurant"},"name":"La Trattoria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Lamm":{"tags":{"name":"Lamm","amenity":"restaurant"},"name":"Lamm","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Linde":{"tags":{"name":"Linde","amenity":"restaurant"},"name":"Linde","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Lindenhof":{"tags":{"name":"Lindenhof","amenity":"restaurant"},"name":"Lindenhof","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Little Chef":{"tags":{"name":"Little Chef","amenity":"restaurant"},"name":"Little Chef","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Little Italy":{"tags":{"name":"Little Italy","amenity":"restaurant"},"name":"Little Italy","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Logan's Roadhouse":{"tags":{"name":"Logan's Roadhouse","amenity":"restaurant"},"name":"Logan's Roadhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/LongHorn Steakhouse":{"tags":{"name":"LongHorn Steakhouse","amenity":"restaurant"},"name":"LongHorn Steakhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Lotus":{"tags":{"name":"Lotus","amenity":"restaurant"},"name":"Lotus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Léon de Bruxelles":{"tags":{"name":"Léon de Bruxelles","amenity":"restaurant"},"name":"Léon de Bruxelles","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Löwen":{"tags":{"name":"Löwen","amenity":"restaurant"},"name":"Löwen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/MK Restaurants":{"tags":{"name":"MK Restaurants","amenity":"restaurant"},"name":"MK Restaurants","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Maharaja":{"tags":{"name":"Maharaja","amenity":"restaurant"},"name":"Maharaja","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mamma Mia":{"tags":{"name":"Mamma Mia","amenity":"restaurant"},"name":"Mamma Mia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mandarin":{"tags":{"name":"Mandarin","amenity":"restaurant"},"name":"Mandarin","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mang Inasal":{"tags":{"name":"Mang Inasal","amenity":"restaurant"},"name":"Mang Inasal","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Marco Polo":{"tags":{"name":"Marco Polo","amenity":"restaurant"},"name":"Marco Polo","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Marco's Pizza":{"tags":{"name":"Marco's Pizza","amenity":"restaurant"},"name":"Marco's Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/McAlister's Deli":{"tags":{"name":"McAlister's Deli","amenity":"restaurant"},"name":"McAlister's Deli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mediterraneo":{"tags":{"name":"Mediterraneo","amenity":"restaurant"},"name":"Mediterraneo","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mellow Mushroom":{"tags":{"name":"Mellow Mushroom","amenity":"restaurant"},"name":"Mellow Mushroom","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mensa":{"tags":{"name":"Mensa","amenity":"restaurant"},"name":"Mensa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Milano":{"tags":{"name":"Milano","amenity":"restaurant"},"name":"Milano","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mimi's Cafe":{"tags":{"name":"Mimi's Cafe","amenity":"restaurant"},"name":"Mimi's Cafe","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Moe's Southwest Grill":{"tags":{"name":"Moe's Southwest Grill","amenity":"restaurant"},"name":"Moe's Southwest Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mykonos":{"tags":{"name":"Mykonos","amenity":"restaurant"},"name":"Mykonos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mythos":{"tags":{"name":"Mythos","amenity":"restaurant"},"name":"Mythos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Nando's":{"tags":{"name":"Nando's","amenity":"restaurant"},"name":"Nando's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Noodles & Company":{"tags":{"name":"Noodles & Company","amenity":"restaurant"},"name":"Noodles & Company","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/O'Charley's":{"tags":{"name":"O'Charley's","amenity":"restaurant"},"name":"O'Charley's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Oasis":{"tags":{"name":"Oasis","amenity":"restaurant"},"name":"Oasis","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ocean Basket":{"tags":{"name":"Ocean Basket","amenity":"restaurant"},"name":"Ocean Basket","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ochsen":{"tags":{"name":"Ochsen","amenity":"restaurant"},"name":"Ochsen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Old Chicago":{"tags":{"name":"Old Chicago","amenity":"restaurant"},"name":"Old Chicago","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Olive Garden":{"tags":{"name":"Olive Garden","amenity":"restaurant"},"name":"Olive Garden","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Olympia":{"tags":{"name":"Olympia","amenity":"restaurant"},"name":"Olympia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Osaka":{"tags":{"name":"Osaka","amenity":"restaurant"},"name":"Osaka","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Outback Steakhouse":{"tags":{"name":"Outback Steakhouse","amenity":"restaurant"},"name":"Outback Steakhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/P.F. Chang's":{"tags":{"name":"P.F. Chang's","amenity":"restaurant"},"name":"P.F. Chang's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pancake House":{"tags":{"name":"Pancake House","amenity":"restaurant"},"name":"Pancake House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Panda":{"tags":{"name":"Panda","amenity":"restaurant"},"name":"Panda","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Panera Bread":{"tags":{"name":"Panera Bread","amenity":"restaurant"},"name":"Panera Bread","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Panorama":{"tags":{"name":"Panorama","amenity":"restaurant"},"name":"Panorama","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Parrilla":{"tags":{"name":"Parrilla","amenity":"restaurant"},"name":"Parrilla","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Peking":{"tags":{"name":"Peking","amenity":"restaurant"},"name":"Peking","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Perkins":{"tags":{"name":"Perkins","amenity":"restaurant"},"name":"Perkins","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pinocchio":{"tags":{"name":"Pinocchio","amenity":"restaurant"},"name":"Pinocchio","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Express":{"tags":{"name":"Pizza Express","amenity":"restaurant"},"name":"Pizza Express","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Factory":{"tags":{"name":"Pizza Factory","amenity":"restaurant"},"name":"Pizza Factory","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza House":{"tags":{"name":"Pizza House","amenity":"restaurant"},"name":"Pizza House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Hut":{"tags":{"name":"Pizza Hut","cuisine":"pizza","amenity":"restaurant"},"name":"Pizza Hut","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Ranch":{"tags":{"name":"Pizza Ranch","amenity":"restaurant"},"name":"Pizza Ranch","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Italia":{"tags":{"name":"Pizzeria Italia","amenity":"restaurant"},"name":"Pizzeria Italia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Milano":{"tags":{"name":"Pizzeria Milano","amenity":"restaurant"},"name":"Pizzeria Milano","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Napoli":{"tags":{"name":"Pizzeria Napoli","amenity":"restaurant"},"name":"Pizzeria Napoli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Roma":{"tags":{"name":"Pizzeria Roma","amenity":"restaurant"},"name":"Pizzeria Roma","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Venezia":{"tags":{"name":"Pizzeria Venezia","amenity":"restaurant"},"name":"Pizzeria Venezia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Poivre Rouge":{"tags":{"name":"Poivre Rouge","amenity":"restaurant"},"name":"Poivre Rouge","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pomodoro":{"tags":{"name":"Pomodoro","amenity":"restaurant"},"name":"Pomodoro","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Portofino":{"tags":{"name":"Portofino","amenity":"restaurant"},"name":"Portofino","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Poseidon":{"tags":{"name":"Poseidon","amenity":"restaurant"},"name":"Poseidon","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Prezzo":{"tags":{"name":"Prezzo","amenity":"restaurant"},"name":"Prezzo","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Qdoba Mexican Grill":{"tags":{"name":"Qdoba Mexican Grill","amenity":"restaurant"},"name":"Qdoba Mexican Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ratskeller":{"tags":{"name":"Ratskeller","amenity":"restaurant"},"name":"Ratskeller","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Red Lobster":{"tags":{"name":"Red Lobster","amenity":"restaurant"},"name":"Red Lobster","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Red Robin":{"tags":{"name":"Red Robin","amenity":"restaurant"},"name":"Red Robin","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Restaurante Universitário":{"tags":{"name":"Restaurante Universitário","amenity":"restaurant"},"name":"Restaurante Universitário","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rhodos":{"tags":{"name":"Rhodos","amenity":"restaurant"},"name":"Rhodos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ristorante Del Arte":{"tags":{"name":"Ristorante Del Arte","amenity":"restaurant"},"name":"Ristorante Del Arte","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Roma":{"tags":{"name":"Roma","amenity":"restaurant"},"name":"Roma","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rose":{"tags":{"name":"Rose","amenity":"restaurant"},"name":"Rose","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Round Table Pizza":{"tags":{"name":"Round Table Pizza","amenity":"restaurant"},"name":"Round Table Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ruby Tuesday":{"tags":{"name":"Ruby Tuesday","amenity":"restaurant"},"name":"Ruby Tuesday","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rössle":{"tags":{"name":"Rössle","amenity":"restaurant"},"name":"Rössle","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rössli":{"tags":{"name":"Rössli","amenity":"restaurant"},"name":"Rössli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Saigon":{"tags":{"name":"Saigon","amenity":"restaurant"},"name":"Saigon","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sakura":{"tags":{"name":"Sakura","amenity":"restaurant"},"name":"Sakura","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/San Marco":{"tags":{"name":"San Marco","amenity":"restaurant"},"name":"San Marco","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Santorini":{"tags":{"name":"Santorini","amenity":"restaurant"},"name":"Santorini","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Schwarzer Adler":{"tags":{"name":"Schwarzer Adler","amenity":"restaurant"},"name":"Schwarzer Adler","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Schützenhaus":{"tags":{"name":"Schützenhaus","amenity":"restaurant"},"name":"Schützenhaus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shakey's":{"tags":{"name":"Shakey's","amenity":"restaurant"},"name":"Shakey's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shalimar":{"tags":{"name":"Shalimar","amenity":"restaurant"},"name":"Shalimar","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shanghai":{"tags":{"name":"Shanghai","amenity":"restaurant"},"name":"Shanghai","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shari's":{"tags":{"name":"Shari's","amenity":"restaurant"},"name":"Shari's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shoney's":{"tags":{"name":"Shoney's","amenity":"restaurant"},"name":"Shoney's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sizzler":{"tags":{"name":"Sizzler","amenity":"restaurant"},"name":"Sizzler","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sonne":{"tags":{"name":"Sonne","amenity":"restaurant"},"name":"Sonne","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sphinx":{"tags":{"name":"Sphinx","amenity":"restaurant"},"name":"Sphinx","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sportheim":{"tags":{"name":"Sportheim","amenity":"restaurant"},"name":"Sportheim","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Spur":{"tags":{"name":"Spur","amenity":"restaurant"},"name":"Spur","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Steak 'n Shake":{"tags":{"name":"Steak 'n Shake","cuisine":"burger","amenity":"restaurant"},"name":"Steak 'n Shake","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sternen":{"tags":{"name":"Sternen","amenity":"restaurant"},"name":"Sternen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sunset Grill":{"tags":{"name":"Sunset Grill","amenity":"restaurant"},"name":"Sunset Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sushi":{"tags":{"name":"Sushi","amenity":"restaurant"},"name":"Sushi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sushi Bar":{"tags":{"name":"Sushi Bar","amenity":"restaurant"},"name":"Sushi Bar","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Swiss Chalet":{"tags":{"name":"Swiss Chalet","amenity":"restaurant"},"name":"Swiss Chalet","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Syrtaki":{"tags":{"name":"Syrtaki","amenity":"restaurant"},"name":"Syrtaki","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/TGI Friday's":{"tags":{"name":"TGI Friday's","amenity":"restaurant"},"name":"TGI Friday's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Taj Mahal":{"tags":{"name":"Taj Mahal","amenity":"restaurant"},"name":"Taj Mahal","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Taste of India":{"tags":{"name":"Taste of India","amenity":"restaurant"},"name":"Taste of India","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Taverna":{"tags":{"name":"Taverna","amenity":"restaurant"},"name":"Taverna","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Texas Roadhouse":{"tags":{"name":"Texas Roadhouse","amenity":"restaurant"},"name":"Texas Roadhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/The Cheesecake Factory":{"tags":{"name":"The Cheesecake Factory","amenity":"restaurant"},"name":"The Cheesecake Factory","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Toby Carvery":{"tags":{"name":"Toby Carvery","amenity":"restaurant"},"name":"Toby Carvery","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Tony Roma's":{"tags":{"name":"Tony Roma's","amenity":"restaurant"},"name":"Tony Roma's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Toscana":{"tags":{"name":"Toscana","amenity":"restaurant"},"name":"Toscana","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Trattoria":{"tags":{"name":"Trattoria","amenity":"restaurant"},"name":"Trattoria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Traube":{"tags":{"name":"Traube","amenity":"restaurant"},"name":"Traube","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Vapiano":{"tags":{"name":"Vapiano","amenity":"restaurant"},"name":"Vapiano","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Venezia":{"tags":{"name":"Venezia","amenity":"restaurant"},"name":"Venezia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Village Inn":{"tags":{"name":"Village Inn","amenity":"restaurant"},"name":"Village Inn","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Vips":{"tags":{"name":"Vips","amenity":"restaurant"},"name":"Vips","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Waffle House":{"tags":{"name":"Waffle House","amenity":"restaurant"},"name":"Waffle House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Wagamama":{"tags":{"name":"Wagamama","amenity":"restaurant"},"name":"Wagamama","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Waldschänke":{"tags":{"name":"Waldschänke","amenity":"restaurant"},"name":"Waldschänke","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Warung":{"tags":{"name":"Warung","amenity":"restaurant"},"name":"Warung","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Wasabi":{"tags":{"name":"Wasabi","amenity":"restaurant"},"name":"Wasabi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zizzi":{"tags":{"name":"Zizzi","amenity":"restaurant"},"name":"Zizzi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zorbas":{"tags":{"name":"Zorbas","amenity":"restaurant"},"name":"Zorbas","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zum Hirschen":{"tags":{"name":"Zum Hirschen","amenity":"restaurant"},"name":"Zum Hirschen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zum Löwen":{"tags":{"name":"Zum Löwen","amenity":"restaurant"},"name":"Zum Löwen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Krone":{"tags":{"name":"Zur Krone","amenity":"restaurant"},"name":"Zur Krone","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Linde":{"tags":{"name":"Zur Linde","amenity":"restaurant"},"name":"Zur Linde","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Post":{"tags":{"name":"Zur Post","amenity":"restaurant"},"name":"Zur Post","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Sonne":{"tags":{"name":"Zur Sonne","amenity":"restaurant"},"name":"Zur Sonne","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Евразия":{"tags":{"name":"Евразия","amenity":"restaurant"},"name":"Евразия","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ресторан":{"tags":{"name":"Ресторан","amenity":"restaurant"},"name":"Ресторан","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Тануки":{"tags":{"name":"Тануки","amenity":"restaurant"},"name":"Тануки","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Якитория":{"tags":{"name":"Якитория","amenity":"restaurant"},"name":"Якитория","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/رستوران":{"tags":{"name":"رستوران","amenity":"restaurant"},"name":"رستوران","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/مطعم":{"tags":{"name":"مطعم","amenity":"restaurant"},"name":"مطعم","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/はま寿司":{"tags":{"name":"はま寿司","amenity":"restaurant"},"name":"はま寿司","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/びっくりドンキー":{"tags":{"name":"びっくりドンキー","amenity":"restaurant"},"name":"びっくりドンキー","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/やよい軒":{"tags":{"name":"やよい軒","amenity":"restaurant"},"name":"やよい軒","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ガスト":{"tags":{"name":"ガスト","name:en":"Gusto","amenity":"restaurant"},"name":"ガスト","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ココス":{"tags":{"name":"ココス","amenity":"restaurant"},"name":"ココス","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/サイゼリア":{"tags":{"name":"サイゼリア","amenity":"restaurant"},"name":"サイゼリア","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/サイゼリヤ":{"tags":{"name":"サイゼリヤ","amenity":"restaurant"},"name":"サイゼリヤ","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ジョイフル":{"tags":{"name":"ジョイフル","amenity":"restaurant"},"name":"ジョイフル","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ジョナサン":{"tags":{"name":"ジョナサン","amenity":"restaurant"},"name":"ジョナサン","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ジョリーパスタ":{"tags":{"name":"ジョリーパスタ","amenity":"restaurant"},"name":"ジョリーパスタ","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/デニーズ":{"tags":{"name":"デニーズ","amenity":"restaurant"},"name":"デニーズ","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/バーミヤン":{"tags":{"name":"バーミヤン","amenity":"restaurant"},"name":"バーミヤン","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ロイヤルホスト":{"tags":{"name":"ロイヤルホスト","amenity":"restaurant"},"name":"ロイヤルホスト","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/丸亀製麺":{"tags":{"name":"丸亀製麺","amenity":"restaurant"},"name":"丸亀製麺","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/八方雲集":{"tags":{"name":"八方雲集","amenity":"restaurant"},"name":"八方雲集","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/夢庵":{"tags":{"name":"夢庵","amenity":"restaurant"},"name":"夢庵","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/大戸屋":{"tags":{"name":"大戸屋","amenity":"restaurant"},"name":"大戸屋","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/大阪王将":{"tags":{"name":"大阪王将","amenity":"restaurant"},"name":"大阪王将","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/天下一品":{"tags":{"name":"天下一品","amenity":"restaurant"},"name":"天下一品","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/安楽亭":{"tags":{"name":"安楽亭","amenity":"restaurant"},"name":"安楽亭","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/牛角":{"tags":{"name":"牛角","amenity":"restaurant"},"name":"牛角","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/食堂":{"tags":{"name":"食堂","amenity":"restaurant"},"name":"食堂","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/餃子の王将":{"tags":{"name":"餃子の王将","amenity":"restaurant"},"name":"餃子の王将","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/바다횟집 (Bada Fish Restaurant)":{"tags":{"name":"바다횟집 (Bada Fish Restaurant)","amenity":"restaurant"},"name":"바다횟집 (Bada Fish Restaurant)","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/school/Adolfo Lopez Mateos":{"tags":{"name":"Adolfo Lopez Mateos","amenity":"school"},"name":"Adolfo Lopez Mateos","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Agustin Ya�ez":{"tags":{"name":"Agustin Ya�ez","amenity":"school"},"name":"Agustin Ya�ez","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Albert-Schweitzer-Schule":{"tags":{"name":"Albert-Schweitzer-Schule","amenity":"school"},"name":"Albert-Schweitzer-Schule","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Amado Nervo":{"tags":{"name":"Amado Nervo","amenity":"school"},"name":"Amado Nervo","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Astrid-Lindgren-Schule":{"tags":{"name":"Astrid-Lindgren-Schule","amenity":"school"},"name":"Astrid-Lindgren-Schule","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Benito Juarez":{"tags":{"name":"Benito Juarez","amenity":"school"},"name":"Benito Juarez","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Brown School":{"tags":{"name":"Brown School","amenity":"school"},"name":"Brown School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/CEM":{"tags":{"name":"CEM","amenity":"school"},"name":"CEM","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Center School":{"tags":{"name":"Center School","amenity":"school"},"name":"Center School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Central Elementary School":{"tags":{"name":"Central Elementary School","amenity":"school"},"name":"Central Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Central High School":{"tags":{"name":"Central High School","amenity":"school"},"name":"Central High School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Central School":{"tags":{"name":"Central School","amenity":"school"},"name":"Central School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Colegio San José":{"tags":{"name":"Colegio San José","amenity":"school"},"name":"Colegio San José","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Collège Jean Moulin":{"tags":{"name":"Collège Jean Moulin","amenity":"school"},"name":"Collège Jean Moulin","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Collège privé Saint-Joseph":{"tags":{"name":"Collège privé Saint-Joseph","amenity":"school"},"name":"Collège privé Saint-Joseph","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Cuauhtemoc":{"tags":{"name":"Cuauhtemoc","amenity":"school"},"name":"Cuauhtemoc","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Curso Comunitario":{"tags":{"name":"Curso Comunitario","amenity":"school"},"name":"Curso Comunitario","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Cursos Comunitarios":{"tags":{"name":"Cursos Comunitarios","amenity":"school"},"name":"Cursos Comunitarios","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/EPP":{"tags":{"name":"EPP","amenity":"school"},"name":"EPP","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Emiliano Zapata":{"tags":{"name":"Emiliano Zapata","amenity":"school"},"name":"Emiliano Zapata","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Fairview Elementary School":{"tags":{"name":"Fairview Elementary School","amenity":"school"},"name":"Fairview Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Fairview School":{"tags":{"name":"Fairview School","amenity":"school"},"name":"Fairview School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Francisco I Madero":{"tags":{"name":"Francisco I Madero","amenity":"school"},"name":"Francisco I Madero","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Francisco I. Madero":{"tags":{"name":"Francisco I. Madero","amenity":"school"},"name":"Francisco I. Madero","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Francisco Villa":{"tags":{"name":"Francisco Villa","amenity":"school"},"name":"Francisco Villa","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Franklin Elementary School":{"tags":{"name":"Franklin Elementary School","amenity":"school"},"name":"Franklin Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Franklin School":{"tags":{"name":"Franklin School","amenity":"school"},"name":"Franklin School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Garfield Elementary School":{"tags":{"name":"Garfield Elementary School","amenity":"school"},"name":"Garfield Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Garfield School":{"tags":{"name":"Garfield School","amenity":"school"},"name":"Garfield School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Gimnazjum nr 1":{"tags":{"name":"Gimnazjum nr 1","amenity":"school"},"name":"Gimnazjum nr 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Government School":{"tags":{"name":"Government School","amenity":"school"},"name":"Government School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Gregorio Torres Quintero":{"tags":{"name":"Gregorio Torres Quintero","amenity":"school"},"name":"Gregorio Torres Quintero","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Groupe Scolaire":{"tags":{"name":"Groupe Scolaire","amenity":"school"},"name":"Groupe Scolaire","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Guadalupe Victoria":{"tags":{"name":"Guadalupe Victoria","amenity":"school"},"name":"Guadalupe Victoria","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Highland School":{"tags":{"name":"Highland School","amenity":"school"},"name":"Highland School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Hillcrest Elementary School":{"tags":{"name":"Hillcrest Elementary School","amenity":"school"},"name":"Hillcrest Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Holy Cross School":{"tags":{"name":"Holy Cross School","amenity":"school"},"name":"Holy Cross School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Holy Family School":{"tags":{"name":"Holy Family School","amenity":"school"},"name":"Holy Family School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Holy Trinity School":{"tags":{"name":"Holy Trinity School","amenity":"school"},"name":"Holy Trinity School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Ignacio Allende":{"tags":{"name":"Ignacio Allende","amenity":"school"},"name":"Ignacio Allende","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Ignacio Zaragoza":{"tags":{"name":"Ignacio Zaragoza","amenity":"school"},"name":"Ignacio Zaragoza","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Immaculate Conception School":{"tags":{"name":"Immaculate Conception School","amenity":"school"},"name":"Immaculate Conception School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Jackson Elementary School":{"tags":{"name":"Jackson Elementary School","amenity":"school"},"name":"Jackson Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Jackson School":{"tags":{"name":"Jackson School","amenity":"school"},"name":"Jackson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Jefferson Elementary School":{"tags":{"name":"Jefferson Elementary School","amenity":"school"},"name":"Jefferson Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Jefferson School":{"tags":{"name":"Jefferson School","amenity":"school"},"name":"Jefferson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Jose Clemente Orozco":{"tags":{"name":"Jose Clemente Orozco","amenity":"school"},"name":"Jose Clemente Orozco","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Jose Ma Morelos Y Pavon":{"tags":{"name":"Jose Ma Morelos Y Pavon","amenity":"school"},"name":"Jose Ma Morelos Y Pavon","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Jose Vasconcelos":{"tags":{"name":"Jose Vasconcelos","amenity":"school"},"name":"Jose Vasconcelos","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Josefa Ortiz De Dominguez":{"tags":{"name":"Josefa Ortiz De Dominguez","amenity":"school"},"name":"Josefa Ortiz De Dominguez","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Juan Escutia":{"tags":{"name":"Juan Escutia","amenity":"school"},"name":"Juan Escutia","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Justo Sierra":{"tags":{"name":"Justo Sierra","amenity":"school"},"name":"Justo Sierra","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Kumon":{"tags":{"name":"Kumon","amenity":"school"},"name":"Kumon","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Lazaro Cardenas":{"tags":{"name":"Lazaro Cardenas","amenity":"school"},"name":"Lazaro Cardenas","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Lazaro Cardenas Del Rio":{"tags":{"name":"Lazaro Cardenas Del Rio","amenity":"school"},"name":"Lazaro Cardenas Del Rio","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Leona Vicario":{"tags":{"name":"Leona Vicario","amenity":"school"},"name":"Leona Vicario","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Liberty Elementary School":{"tags":{"name":"Liberty Elementary School","amenity":"school"},"name":"Liberty Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Liberty School":{"tags":{"name":"Liberty School","amenity":"school"},"name":"Liberty School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Lincoln Elementary School":{"tags":{"name":"Lincoln Elementary School","amenity":"school"},"name":"Lincoln Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Lincoln School":{"tags":{"name":"Lincoln School","amenity":"school"},"name":"Lincoln School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Longfellow Elementary School":{"tags":{"name":"Longfellow Elementary School","amenity":"school"},"name":"Longfellow Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Longfellow School":{"tags":{"name":"Longfellow School","amenity":"school"},"name":"Longfellow School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Madison Elementary School":{"tags":{"name":"Madison Elementary School","amenity":"school"},"name":"Madison Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Manuel Lopez Cotilla":{"tags":{"name":"Manuel Lopez Cotilla","amenity":"school"},"name":"Manuel Lopez Cotilla","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Maple Grove School":{"tags":{"name":"Maple Grove School","amenity":"school"},"name":"Maple Grove School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/McKinley Elementary School":{"tags":{"name":"McKinley Elementary School","amenity":"school"},"name":"McKinley Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/McKinley School":{"tags":{"name":"McKinley School","amenity":"school"},"name":"McKinley School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Miguel Hidalgo":{"tags":{"name":"Miguel Hidalgo","amenity":"school"},"name":"Miguel Hidalgo","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Miguel Hidalgo Y Costilla":{"tags":{"name":"Miguel Hidalgo Y Costilla","amenity":"school"},"name":"Miguel Hidalgo Y Costilla","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Miller School":{"tags":{"name":"Miller School","amenity":"school"},"name":"Miller School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Mount Pleasant School":{"tags":{"name":"Mount Pleasant School","amenity":"school"},"name":"Mount Pleasant School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Mount Zion School":{"tags":{"name":"Mount Zion School","amenity":"school"},"name":"Mount Zion School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Mountain View Elementary School":{"tags":{"name":"Mountain View Elementary School","amenity":"school"},"name":"Mountain View Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/New Hope School":{"tags":{"name":"New Hope School","amenity":"school"},"name":"New Hope School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Nicolas Bravo":{"tags":{"name":"Nicolas Bravo","amenity":"school"},"name":"Nicolas Bravo","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Ni�os Heroes":{"tags":{"name":"Ni�os Heroes","amenity":"school"},"name":"Ni�os Heroes","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Nombre En Tramite":{"tags":{"name":"Nombre En Tramite","amenity":"school"},"name":"Nombre En Tramite","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/North Elementary School":{"tags":{"name":"North Elementary School","amenity":"school"},"name":"North Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Oak Grove School":{"tags":{"name":"Oak Grove School","amenity":"school"},"name":"Oak Grove School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Pedro Moreno":{"tags":{"name":"Pedro Moreno","amenity":"school"},"name":"Pedro Moreno","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Pestalozzischule":{"tags":{"name":"Pestalozzischule","amenity":"school"},"name":"Pestalozzischule","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Pine Grove School":{"tags":{"name":"Pine Grove School","amenity":"school"},"name":"Pine Grove School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Pleasant Hill School":{"tags":{"name":"Pleasant Hill School","amenity":"school"},"name":"Pleasant Hill School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Pleasant Valley School":{"tags":{"name":"Pleasant Valley School","amenity":"school"},"name":"Pleasant Valley School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Pleasant View School":{"tags":{"name":"Pleasant View School","amenity":"school"},"name":"Pleasant View School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Primaria Comunitaria":{"tags":{"name":"Primaria Comunitaria","amenity":"school"},"name":"Primaria Comunitaria","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Ramon Corona":{"tags":{"name":"Ramon Corona","amenity":"school"},"name":"Ramon Corona","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Ricardo Flores Magon":{"tags":{"name":"Ricardo Flores Magon","amenity":"school"},"name":"Ricardo Flores Magon","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Riverside School":{"tags":{"name":"Riverside School","amenity":"school"},"name":"Riverside School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Roosevelt Elementary School":{"tags":{"name":"Roosevelt Elementary School","amenity":"school"},"name":"Roosevelt Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Roosevelt School":{"tags":{"name":"Roosevelt School","amenity":"school"},"name":"Roosevelt School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/SD":{"tags":{"name":"SD","amenity":"school"},"name":"SD","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/SDN":{"tags":{"name":"SDN","amenity":"school"},"name":"SDN","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Sacred Heart School":{"tags":{"name":"Sacred Heart School","amenity":"school"},"name":"Sacred Heart School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Francis School":{"tags":{"name":"Saint Francis School","amenity":"school"},"name":"Saint Francis School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint James School":{"tags":{"name":"Saint James School","amenity":"school"},"name":"Saint James School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Johns School":{"tags":{"name":"Saint Johns School","amenity":"school"},"name":"Saint Johns School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Joseph School":{"tags":{"name":"Saint Joseph School","amenity":"school"},"name":"Saint Joseph School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Josephs School":{"tags":{"name":"Saint Josephs School","amenity":"school"},"name":"Saint Josephs School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Kizito Primary School":{"tags":{"name":"Saint Kizito Primary School","amenity":"school"},"name":"Saint Kizito Primary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Mary School":{"tags":{"name":"Saint Mary School","amenity":"school"},"name":"Saint Mary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Marys School":{"tags":{"name":"Saint Marys School","amenity":"school"},"name":"Saint Marys School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Patricks School":{"tags":{"name":"Saint Patricks School","amenity":"school"},"name":"Saint Patricks School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Paul School":{"tags":{"name":"Saint Paul School","amenity":"school"},"name":"Saint Paul School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Pauls School":{"tags":{"name":"Saint Pauls School","amenity":"school"},"name":"Saint Pauls School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Peters School":{"tags":{"name":"Saint Peters School","amenity":"school"},"name":"Saint Peters School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Schillerschule":{"tags":{"name":"Schillerschule","amenity":"school"},"name":"Schillerschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/School Number 1":{"tags":{"name":"School Number 1","amenity":"school"},"name":"School Number 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/School Number 2":{"tags":{"name":"School Number 2","amenity":"school"},"name":"School Number 2","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/School Number 3":{"tags":{"name":"School Number 3","amenity":"school"},"name":"School Number 3","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/School Number 4":{"tags":{"name":"School Number 4","amenity":"school"},"name":"School Number 4","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Smith School":{"tags":{"name":"Smith School","amenity":"school"},"name":"Smith School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/South Elementary School":{"tags":{"name":"South Elementary School","amenity":"school"},"name":"South Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Sunnyside School":{"tags":{"name":"Sunnyside School","amenity":"school"},"name":"Sunnyside School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Szkoła Podstawowa nr 1":{"tags":{"name":"Szkoła Podstawowa nr 1","amenity":"school"},"name":"Szkoła Podstawowa nr 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Szkoła Podstawowa nr 2":{"tags":{"name":"Szkoła Podstawowa nr 2","amenity":"school"},"name":"Szkoła Podstawowa nr 2","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Szkoła Podstawowa nr 3":{"tags":{"name":"Szkoła Podstawowa nr 3","amenity":"school"},"name":"Szkoła Podstawowa nr 3","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Trinity School":{"tags":{"name":"Trinity School","amenity":"school"},"name":"Trinity School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/UNIDAD EDUCATIVA":{"tags":{"name":"UNIDAD EDUCATIVA","amenity":"school"},"name":"UNIDAD EDUCATIVA","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Union School":{"tags":{"name":"Union School","amenity":"school"},"name":"Union School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Valentin Gomez Farias":{"tags":{"name":"Valentin Gomez Farias","amenity":"school"},"name":"Valentin Gomez Farias","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Venustiano Carranza":{"tags":{"name":"Venustiano Carranza","amenity":"school"},"name":"Venustiano Carranza","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Vicente Guerrero":{"tags":{"name":"Vicente Guerrero","amenity":"school"},"name":"Vicente Guerrero","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Volkshochschule":{"tags":{"name":"Volkshochschule","amenity":"school"},"name":"Volkshochschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Volksschule":{"tags":{"name":"Volksschule","amenity":"school"},"name":"Volksschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Washington Elementary School":{"tags":{"name":"Washington Elementary School","amenity":"school"},"name":"Washington Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Washington School":{"tags":{"name":"Washington School","amenity":"school"},"name":"Washington School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/West Elementary School":{"tags":{"name":"West Elementary School","amenity":"school"},"name":"West Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/White School":{"tags":{"name":"White School","amenity":"school"},"name":"White School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Wilson Elementary School":{"tags":{"name":"Wilson Elementary School","amenity":"school"},"name":"Wilson Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Wilson School":{"tags":{"name":"Wilson School","amenity":"school"},"name":"Wilson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Általános iskola":{"tags":{"name":"Általános iskola","amenity":"school"},"name":"Általános iskola","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École Jules Ferry":{"tags":{"name":"École Jules Ferry","amenity":"school"},"name":"École Jules Ferry","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École Notre-Dame":{"tags":{"name":"École Notre-Dame","amenity":"school"},"name":"École Notre-Dame","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École Saint-Joseph":{"tags":{"name":"École Saint-Joseph","amenity":"school"},"name":"École Saint-Joseph","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École primaire Jean Jaurès":{"tags":{"name":"École primaire Jean Jaurès","amenity":"school"},"name":"École primaire Jean Jaurès","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École primaire Jules Ferry":{"tags":{"name":"École primaire Jules Ferry","amenity":"school"},"name":"École primaire Jules Ferry","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École primaire privée Notre-Dame":{"tags":{"name":"École primaire privée Notre-Dame","amenity":"school"},"name":"École primaire privée Notre-Dame","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École primaire privée Saint-Joseph":{"tags":{"name":"École primaire privée Saint-Joseph","amenity":"school"},"name":"École primaire privée Saint-Joseph","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École primaire privée Sainte-Marie":{"tags":{"name":"École primaire privée Sainte-Marie","amenity":"school"},"name":"École primaire privée Sainte-Marie","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École élémentaire Jules Ferry":{"tags":{"name":"École élémentaire Jules Ferry","amenity":"school"},"name":"École élémentaire Jules Ferry","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Școala Generală":{"tags":{"name":"Școala Generală","amenity":"school"},"name":"Școala Generală","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Școală":{"tags":{"name":"Școală","amenity":"school"},"name":"Școală","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Вечерняя школа":{"tags":{"name":"Вечерняя школа","amenity":"school"},"name":"Вечерняя школа","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Гимназия №1":{"tags":{"name":"Гимназия №1","amenity":"school"},"name":"Гимназия №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Средняя школа №1":{"tags":{"name":"Средняя школа №1","amenity":"school"},"name":"Средняя школа №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Средняя школа №2":{"tags":{"name":"Средняя школа №2","amenity":"school"},"name":"Средняя школа №2","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Средняя школа №3":{"tags":{"name":"Средняя школа №3","amenity":"school"},"name":"Средняя школа №3","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа № 1":{"tags":{"name":"Школа № 1","amenity":"school"},"name":"Школа № 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа № 2":{"tags":{"name":"Школа № 2","amenity":"school"},"name":"Школа № 2","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа № 3":{"tags":{"name":"Школа № 3","amenity":"school"},"name":"Школа № 3","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа № 4":{"tags":{"name":"Школа № 4","amenity":"school"},"name":"Школа № 4","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа № 5":{"tags":{"name":"Школа № 5","amenity":"school"},"name":"Школа № 5","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №1":{"tags":{"name":"Школа №1","amenity":"school"},"name":"Школа №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №10":{"tags":{"name":"Школа №10","amenity":"school"},"name":"Школа №10","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №11":{"tags":{"name":"Школа №11","amenity":"school"},"name":"Школа №11","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №12":{"tags":{"name":"Школа №12","amenity":"school"},"name":"Школа №12","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №13":{"tags":{"name":"Школа №13","amenity":"school"},"name":"Школа №13","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №14":{"tags":{"name":"Школа №14","amenity":"school"},"name":"Школа №14","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №15":{"tags":{"name":"Школа №15","amenity":"school"},"name":"Школа №15","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №16":{"tags":{"name":"Школа №16","amenity":"school"},"name":"Школа №16","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №17":{"tags":{"name":"Школа №17","amenity":"school"},"name":"Школа №17","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №18":{"tags":{"name":"Школа №18","amenity":"school"},"name":"Школа №18","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №19":{"tags":{"name":"Школа №19","amenity":"school"},"name":"Школа №19","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №2":{"tags":{"name":"Школа №2","amenity":"school"},"name":"Школа №2","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №20":{"tags":{"name":"Школа №20","amenity":"school"},"name":"Школа №20","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №21":{"tags":{"name":"Школа №21","amenity":"school"},"name":"Школа №21","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №22":{"tags":{"name":"Школа №22","amenity":"school"},"name":"Школа №22","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №23":{"tags":{"name":"Школа №23","amenity":"school"},"name":"Школа №23","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №24":{"tags":{"name":"Школа №24","amenity":"school"},"name":"Школа №24","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №25":{"tags":{"name":"Школа №25","amenity":"school"},"name":"Школа №25","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №26":{"tags":{"name":"Школа №26","amenity":"school"},"name":"Школа №26","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №27":{"tags":{"name":"Школа №27","amenity":"school"},"name":"Школа №27","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №28":{"tags":{"name":"Школа №28","amenity":"school"},"name":"Школа №28","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №3":{"tags":{"name":"Школа №3","amenity":"school"},"name":"Школа №3","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №31":{"tags":{"name":"Школа №31","amenity":"school"},"name":"Школа №31","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №35":{"tags":{"name":"Школа №35","amenity":"school"},"name":"Школа №35","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №4":{"tags":{"name":"Школа №4","amenity":"school"},"name":"Школа №4","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №5":{"tags":{"name":"Школа №5","amenity":"school"},"name":"Школа №5","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №6":{"tags":{"name":"Школа №6","amenity":"school"},"name":"Школа №6","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №7":{"tags":{"name":"Школа №7","amenity":"school"},"name":"Школа №7","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №8":{"tags":{"name":"Школа №8","amenity":"school"},"name":"Школа №8","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №9":{"tags":{"name":"Школа №9","amenity":"school"},"name":"Школа №9","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/مدرسة":{"tags":{"name":"مدرسة","amenity":"school"},"name":"مدرسة","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/مدرسه":{"tags":{"name":"مدرسه","amenity":"school"},"name":"مدرسه","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/市立南中学校":{"tags":{"name":"市立南中学校","amenity":"school"},"name":"市立南中学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/市立南小学校":{"tags":{"name":"市立南小学校","amenity":"school"},"name":"市立南小学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/市立東中学校":{"tags":{"name":"市立東中学校","amenity":"school"},"name":"市立東中学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/social_facility/Safe Haven":{"tags":{"name":"Safe Haven","amenity":"social_facility"},"name":"Safe Haven","icon":"poi-social-facility","geometry":["point","area"],"fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"suggestion":true},"amenity/social_facility/Детский дом":{"tags":{"name":"Детский дом","amenity":"social_facility"},"name":"Детский дом","icon":"poi-social-facility","geometry":["point","area"],"fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"suggestion":true},"amenity/social_facility/Социальный участковый":{"tags":{"name":"Социальный участковый","amenity":"social_facility"},"name":"Социальный участковый","icon":"poi-social-facility","geometry":["point","area"],"fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"suggestion":true},"amenity/theatre/Amfiteatr":{"tags":{"name":"Amfiteatr","amenity":"theatre"},"name":"Amfiteatr","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Amphitheater":{"tags":{"name":"Amphitheater","amenity":"theatre"},"name":"Amphitheater","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Amphitheatre":{"tags":{"name":"Amphitheatre","amenity":"theatre"},"name":"Amphitheatre","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Freilichtbühne":{"tags":{"name":"Freilichtbühne","amenity":"theatre"},"name":"Freilichtbühne","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Teatro Comunale":{"tags":{"name":"Teatro Comunale","amenity":"theatre"},"name":"Teatro Comunale","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"leisure/fitness_centre/LA Fitness":{"tags":{"name":"LA Fitness","leisure":"fitness_centre"},"name":"LA Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/fitness_centre/Planet Fitness":{"tags":{"name":"Planet Fitness","leisure":"fitness_centre"},"name":"Planet Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/fitness_centre/Snap Fitness":{"tags":{"name":"Snap Fitness","leisure":"fitness_centre"},"name":"Snap Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/playground/Çocuk Parkı":{"tags":{"name":"Çocuk Parkı","leisure":"playground"},"name":"Çocuk Parkı","icon":"playground","geometry":["point","area"],"fields":["name","operator","surface","playground/max_age","playground/min_age","access_simple"],"suggestion":true},"leisure/playground/놀이터":{"tags":{"name":"놀이터","leisure":"playground"},"name":"놀이터","icon":"playground","geometry":["point","area"],"fields":["name","operator","surface","playground/max_age","playground/min_age","access_simple"],"suggestion":true},"leisure/sports_centre/Anytime Fitness":{"tags":{"name":"Anytime Fitness","leisure":"sports_centre"},"name":"Anytime Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Complejo Municipal de Deportes":{"tags":{"name":"Complejo Municipal de Deportes","leisure":"sports_centre"},"name":"Complejo Municipal de Deportes","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Complexe Sportif":{"tags":{"name":"Complexe Sportif","leisure":"sports_centre"},"name":"Complexe Sportif","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Curves":{"tags":{"name":"Curves","leisure":"sports_centre"},"name":"Curves","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Fitness First":{"tags":{"name":"Fitness First","leisure":"sports_centre"},"name":"Fitness First","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Gold's Gym":{"tags":{"name":"Gold's Gym","leisure":"sports_centre"},"name":"Gold's Gym","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Kieser Training":{"tags":{"name":"Kieser Training","leisure":"sports_centre"},"name":"Kieser Training","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Life Time Fitness":{"tags":{"name":"Life Time Fitness","leisure":"sports_centre"},"name":"Life Time Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/McFit":{"tags":{"name":"McFit","leisure":"sports_centre"},"name":"McFit","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Mrs. Sporty":{"tags":{"name":"Mrs. Sporty","leisure":"sports_centre"},"name":"Mrs. Sporty","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Orlik":{"tags":{"name":"Orlik","leisure":"sports_centre"},"name":"Orlik","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Pabellón Municipal de Deportes":{"tags":{"name":"Pabellón Municipal de Deportes","leisure":"sports_centre"},"name":"Pabellón Municipal de Deportes","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Palestra Comunale":{"tags":{"name":"Palestra Comunale","leisure":"sports_centre"},"name":"Palestra Comunale","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Salle Omnisport":{"tags":{"name":"Salle Omnisport","leisure":"sports_centre"},"name":"Salle Omnisport","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Virgin Active":{"tags":{"name":"Virgin Active","leisure":"sports_centre"},"name":"Virgin Active","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/YMCA":{"tags":{"name":"YMCA","leisure":"sports_centre"},"name":"YMCA","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/ДЮСШ":{"tags":{"name":"ДЮСШ","leisure":"sports_centre"},"name":"ДЮСШ","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Ледовый дворец":{"tags":{"name":"Ледовый дворец","leisure":"sports_centre"},"name":"Ледовый дворец","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/体育館":{"tags":{"name":"体育館","leisure":"sports_centre"},"name":"体育館","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/swimming_pool/Schwimmerbecken":{"tags":{"name":"Schwimmerbecken","leisure":"swimming_pool"},"name":"Schwimmerbecken","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"leisure/swimming_pool/Yüzme Havuzu":{"tags":{"name":"Yüzme Havuzu","leisure":"swimming_pool"},"name":"Yüzme Havuzu","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"leisure/swimming_pool/プール":{"tags":{"name":"プール","leisure":"swimming_pool"},"name":"プール","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"leisure/swimming_pool/游泳池":{"tags":{"name":"游泳池","leisure":"swimming_pool"},"name":"游泳池","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"man_made/windmill/De Hoop":{"tags":{"name":"De Hoop","man_made":"windmill"},"name":"De Hoop","icon":"poi-windmill","geometry":["point","area"],"fields":["building_area"],"suggestion":true},"shop/alcohol/Alko":{"tags":{"name":"Alko","shop":"alcohol"},"name":"Alko","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/BC Liquor Store":{"tags":{"name":"BC Liquor Store","shop":"alcohol"},"name":"BC Liquor Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/BWS":{"tags":{"name":"BWS","shop":"alcohol"},"name":"BWS","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Bargain Booze":{"tags":{"name":"Bargain Booze","shop":"alcohol"},"name":"Bargain Booze","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Beer Store":{"tags":{"name":"Beer Store","shop":"alcohol"},"name":"Beer Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Botilleria":{"tags":{"name":"Botilleria","shop":"alcohol"},"name":"Botilleria","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Dan Murphy's":{"tags":{"name":"Dan Murphy's","shop":"alcohol"},"name":"Dan Murphy's","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Gall & Gall":{"tags":{"name":"Gall & Gall","shop":"alcohol"},"name":"Gall & Gall","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/LCBO":{"tags":{"name":"LCBO","shop":"alcohol"},"name":"LCBO","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Liquor Depot":{"tags":{"name":"Liquor Depot","shop":"alcohol"},"name":"Liquor Depot","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Liquor Store":{"tags":{"name":"Liquor Store","shop":"alcohol"},"name":"Liquor Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Liquorland":{"tags":{"name":"Liquorland","shop":"alcohol"},"name":"Liquorland","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Mitra":{"tags":{"name":"Mitra","shop":"alcohol"},"name":"Mitra","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Nicolas":{"tags":{"name":"Nicolas","shop":"alcohol"},"name":"Nicolas","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/SAQ":{"tags":{"name":"SAQ","shop":"alcohol"},"name":"SAQ","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Systembolaget":{"tags":{"name":"Systembolaget","shop":"alcohol"},"name":"Systembolaget","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/The Beer Store":{"tags":{"name":"The Beer Store","shop":"alcohol"},"name":"The Beer Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Vinmonopolet":{"tags":{"name":"Vinmonopolet","shop":"alcohol"},"name":"Vinmonopolet","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Алкомаркет":{"tags":{"name":"Алкомаркет","shop":"alcohol"},"name":"Алкомаркет","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Ароматный мир":{"tags":{"name":"Ароматный мир","shop":"alcohol"},"name":"Ароматный мир","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Бристоль":{"tags":{"name":"Бристоль","shop":"alcohol"},"name":"Бристоль","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Градус":{"tags":{"name":"Градус","shop":"alcohol"},"name":"Градус","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Живое пиво":{"tags":{"name":"Живое пиво","shop":"alcohol"},"name":"Живое пиво","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Красное & Белое":{"tags":{"name":"Красное & Белое","shop":"alcohol"},"name":"Красное & Белое","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Норман":{"tags":{"name":"Норман","shop":"alcohol"},"name":"Норман","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Отдохни":{"tags":{"name":"Отдохни","shop":"alcohol"},"name":"Отдохни","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Пиво":{"tags":{"name":"Пиво","shop":"alcohol"},"name":"Пиво","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Разливное пиво":{"tags":{"name":"Разливное пиво","shop":"alcohol"},"name":"Разливное пиво","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/baby_goods/Aubert":{"tags":{"name":"Aubert","shop":"baby_goods"},"name":"Aubert","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/baby_goods/Babies R Us":{"tags":{"name":"Babies R Us","shop":"baby_goods"},"name":"Babies R Us","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/baby_goods/BabyOne":{"tags":{"name":"BabyOne","shop":"baby_goods"},"name":"BabyOne","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/AILI":{"tags":{"name":"AILI","shop":"bakery"},"name":"AILI","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Anker":{"tags":{"name":"Anker","shop":"bakery"},"name":"Anker","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Awiteks":{"tags":{"name":"Awiteks","shop":"bakery"},"name":"Awiteks","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Backshop":{"tags":{"name":"Backshop","shop":"bakery"},"name":"Backshop","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Backwerk":{"tags":{"name":"Backwerk","shop":"bakery"},"name":"Backwerk","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Baguette":{"tags":{"name":"Baguette","shop":"bakery"},"name":"Baguette","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Bakers Delight":{"tags":{"name":"Bakers Delight","shop":"bakery"},"name":"Bakers Delight","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Bakker Bart":{"tags":{"name":"Bakker Bart","shop":"bakery"},"name":"Bakker Bart","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Banette":{"tags":{"name":"Banette","shop":"bakery"},"name":"Banette","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Bäckerei Fuchs":{"tags":{"name":"Bäckerei Fuchs","shop":"bakery"},"name":"Bäckerei Fuchs","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Bäckerei Grimminger":{"tags":{"name":"Bäckerei Grimminger","shop":"bakery"},"name":"Bäckerei Grimminger","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Bäckerei Müller":{"tags":{"name":"Bäckerei Müller","shop":"bakery"},"name":"Bäckerei Müller","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Bäckerei Schmidt":{"tags":{"name":"Bäckerei Schmidt","shop":"bakery"},"name":"Bäckerei Schmidt","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Bäckerei Schneider":{"tags":{"name":"Bäckerei Schneider","shop":"bakery"},"name":"Bäckerei Schneider","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Cooplands":{"tags":{"name":"Cooplands","shop":"bakery"},"name":"Cooplands","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Dat Backhus":{"tags":{"name":"Dat Backhus","shop":"bakery"},"name":"Dat Backhus","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Der Beck":{"tags":{"name":"Der Beck","shop":"bakery"},"name":"Der Beck","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Der Mann":{"tags":{"name":"Der Mann","shop":"bakery"},"name":"Der Mann","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Ditsch":{"tags":{"name":"Ditsch","shop":"bakery"},"name":"Ditsch","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Fornetti":{"tags":{"name":"Fornetti","shop":"bakery"},"name":"Fornetti","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Goeken backen":{"tags":{"name":"Goeken backen","shop":"bakery"},"name":"Goeken backen","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Goldilocks":{"tags":{"name":"Goldilocks","shop":"bakery"},"name":"Goldilocks","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Greggs":{"tags":{"name":"Greggs","shop":"bakery"},"name":"Greggs","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Hofpfisterei":{"tags":{"name":"Hofpfisterei","shop":"bakery"},"name":"Hofpfisterei","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Ihle":{"tags":{"name":"Ihle","shop":"bakery"},"name":"Ihle","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Julie's Bakeshop":{"tags":{"name":"Julie's Bakeshop","shop":"bakery"},"name":"Julie's Bakeshop","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/K&U":{"tags":{"name":"K&U","shop":"bakery"},"name":"K&U","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/K&U Bäckerei":{"tags":{"name":"K&U Bäckerei","shop":"bakery"},"name":"K&U Bäckerei","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Kamps":{"tags":{"name":"Kamps","shop":"bakery"},"name":"Kamps","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/La Mie Câline":{"tags":{"name":"La Mie Câline","shop":"bakery"},"name":"La Mie Câline","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Le Crobag":{"tags":{"name":"Le Crobag","shop":"bakery"},"name":"Le Crobag","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Le Fournil":{"tags":{"name":"Le Fournil","shop":"bakery"},"name":"Le Fournil","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Lila Bäcker":{"tags":{"name":"Lila Bäcker","shop":"bakery"},"name":"Lila Bäcker","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Lipóti Pékség":{"tags":{"name":"Lipóti Pékség","shop":"bakery"},"name":"Lipóti Pékség","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Marie Blachère":{"tags":{"name":"Marie Blachère","shop":"bakery"},"name":"Marie Blachère","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Mlinar":{"tags":{"name":"Mlinar","shop":"bakery"},"name":"Mlinar","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Musmanni":{"tags":{"name":"Musmanni","shop":"bakery"},"name":"Musmanni","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Oebel":{"tags":{"name":"Oebel","shop":"bakery"},"name":"Oebel","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Paul":{"tags":{"name":"Paul","shop":"bakery"},"name":"Paul","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Red Ribbon":{"tags":{"name":"Red Ribbon","shop":"bakery"},"name":"Red Ribbon","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Schäfer's":{"tags":{"name":"Schäfer's","shop":"bakery"},"name":"Schäfer's","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Sehne":{"tags":{"name":"Sehne","shop":"bakery"},"name":"Sehne","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Stadtbäckerei":{"tags":{"name":"Stadtbäckerei","shop":"bakery"},"name":"Stadtbäckerei","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Steinecke":{"tags":{"name":"Steinecke","shop":"bakery"},"name":"Steinecke","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Sternenbäck":{"tags":{"name":"Sternenbäck","shop":"bakery"},"name":"Sternenbäck","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Ströck":{"tags":{"name":"Ströck","shop":"bakery"},"name":"Ströck","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Wiener Feinbäcker":{"tags":{"name":"Wiener Feinbäcker","shop":"bakery"},"name":"Wiener Feinbäcker","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/von Allwörden":{"tags":{"name":"von Allwörden","shop":"bakery"},"name":"von Allwörden","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Булочная":{"tags":{"name":"Булочная","shop":"bakery"},"name":"Булочная","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Горячий хлеб":{"tags":{"name":"Горячий хлеб","shop":"bakery"},"name":"Горячий хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Каравай":{"tags":{"name":"Каравай","shop":"bakery"},"name":"Каравай","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Кулиничи":{"tags":{"name":"Кулиничи","shop":"bakery"},"name":"Кулиничи","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Кулиничі":{"tags":{"name":"Кулиничі","shop":"bakery"},"name":"Кулиничі","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Свежий хлеб":{"tags":{"name":"Свежий хлеб","shop":"bakery"},"name":"Свежий хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Хлеб":{"tags":{"name":"Хлеб","shop":"bakery"},"name":"Хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/مخبز":{"tags":{"name":"مخبز","shop":"bakery"},"name":"مخبز","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/مخبزة":{"tags":{"name":"مخبزة","shop":"bakery"},"name":"مخبزة","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نان لواش":{"tags":{"name":"نان لواش","shop":"bakery"},"name":"نان لواش","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نانوایی":{"tags":{"name":"نانوایی","shop":"bakery"},"name":"نانوایی","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نانوایی بربری":{"tags":{"name":"نانوایی بربری","shop":"bakery"},"name":"نانوایی بربری","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نانوایی سنگک":{"tags":{"name":"نانوایی سنگک","shop":"bakery"},"name":"نانوایی سنگک","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نانوایی سنگکی":{"tags":{"name":"نانوایی سنگکی","shop":"bakery"},"name":"نانوایی سنگکی","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نانوایی لواش":{"tags":{"name":"نانوایی لواش","shop":"bakery"},"name":"نانوایی لواش","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beauty/Sally Beauty Supply":{"tags":{"name":"Sally Beauty Supply","shop":"beauty"},"name":"Sally Beauty Supply","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","beauty","opening_hours","payment_multi"],"suggestion":true},"shop/beauty/Yves Rocher":{"tags":{"name":"Yves Rocher","shop":"beauty"},"name":"Yves Rocher","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","beauty","opening_hours","payment_multi"],"suggestion":true},"shop/bed/Matratzen Concord":{"tags":{"name":"Matratzen Concord","shop":"bed"},"name":"Matratzen Concord","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bed/Mattress Firm":{"tags":{"name":"Mattress Firm","shop":"bed"},"name":"Mattress Firm","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bed/Sleepy's":{"tags":{"name":"Sleepy's","shop":"bed"},"name":"Sleepy's","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/50嵐":{"tags":{"name":"50嵐","shop":"beverages"},"name":"50嵐","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Dursty":{"tags":{"name":"Dursty","shop":"beverages"},"name":"Dursty","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Edeka Getränkemarkt":{"tags":{"name":"Edeka Getränkemarkt","shop":"beverages"},"name":"Edeka Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Fristo":{"tags":{"name":"Fristo","shop":"beverages"},"name":"Fristo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Getränke Hoffmann":{"tags":{"name":"Getränke Hoffmann","shop":"beverages"},"name":"Getränke Hoffmann","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Getränkeland":{"tags":{"name":"Getränkeland","shop":"beverages"},"name":"Getränkeland","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Getränkemarkt":{"tags":{"name":"Getränkemarkt","shop":"beverages"},"name":"Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Orterer Getränkemarkt":{"tags":{"name":"Orterer Getränkemarkt","shop":"beverages"},"name":"Orterer Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Rewe Getränkemarkt":{"tags":{"name":"Rewe Getränkemarkt","shop":"beverages"},"name":"Rewe Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Trinkgut":{"tags":{"name":"Trinkgut","shop":"beverages"},"name":"Trinkgut","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/茶湯會":{"tags":{"name":"茶湯會","shop":"beverages"},"name":"茶湯會","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bicycle/Halfords":{"tags":{"name":"Halfords","shop":"bicycle"},"name":"Halfords","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],"suggestion":true},"shop/bicycle/Веломарка":{"tags":{"name":"Веломарка","shop":"bicycle"},"name":"Веломарка","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],"suggestion":true},"shop/bicycle/サイクルベースあさひ":{"tags":{"name":"サイクルベースあさひ","shop":"bicycle"},"name":"サイクルベースあさひ","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],"suggestion":true},"shop/bookmaker/Betfred":{"tags":{"name":"Betfred","shop":"bookmaker"},"name":"Betfred","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bookmaker/Coral":{"tags":{"name":"Coral","shop":"bookmaker"},"name":"Coral","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bookmaker/Ladbrokes":{"tags":{"name":"Ladbrokes","shop":"bookmaker"},"name":"Ladbrokes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bookmaker/Paddy Power":{"tags":{"name":"Paddy Power","shop":"bookmaker"},"name":"Paddy Power","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bookmaker/William Hill":{"tags":{"name":"William Hill","shop":"bookmaker"},"name":"William Hill","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bookmaker/ΟΠΑΠ":{"tags":{"name":"ΟΠΑΠ","shop":"bookmaker"},"name":"ΟΠΑΠ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Boucherie Charcuterie":{"tags":{"name":"Boucherie Charcuterie","shop":"butcher"},"name":"Boucherie Charcuterie","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Carnicería":{"tags":{"name":"Carnicería","shop":"butcher"},"name":"Carnicería","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Fleischerei Richter":{"tags":{"name":"Fleischerei Richter","shop":"butcher"},"name":"Fleischerei Richter","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Húsbolt":{"tags":{"name":"Húsbolt","shop":"butcher"},"name":"Húsbolt","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Macelleria":{"tags":{"name":"Macelleria","shop":"butcher"},"name":"Macelleria","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Vinzenzmurr":{"tags":{"name":"Vinzenzmurr","shop":"butcher"},"name":"Vinzenzmurr","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Ариант":{"tags":{"name":"Ариант","shop":"butcher"},"name":"Ариант","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Великолукский мясокомбинат":{"tags":{"name":"Великолукский мясокомбинат","shop":"butcher"},"name":"Великолукский мясокомбинат","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Мясная лавка":{"tags":{"name":"Мясная лавка","shop":"butcher"},"name":"Мясная лавка","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Мясницкий ряд":{"tags":{"name":"Мясницкий ряд","shop":"butcher"},"name":"Мясницкий ряд","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Мясной":{"tags":{"name":"Мясной","shop":"butcher"},"name":"Мясной","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Мясо":{"tags":{"name":"Мясо","shop":"butcher"},"name":"Мясо","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Наша Ряба":{"tags":{"name":"Наша Ряба","shop":"butcher"},"name":"Наша Ряба","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Свежее мясо":{"tags":{"name":"Свежее мясо","shop":"butcher"},"name":"Свежее мясо","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car/Audi":{"tags":{"name":"Audi","shop":"car"},"name":"Audi","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/BMW":{"tags":{"name":"BMW","shop":"car"},"name":"BMW","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Chevrolet":{"tags":{"name":"Chevrolet","shop":"car"},"name":"Chevrolet","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Citroën":{"tags":{"name":"Citroën","shop":"car"},"name":"Citroën","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Dacia":{"tags":{"name":"Dacia","shop":"car"},"name":"Dacia","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Fiat":{"tags":{"name":"Fiat","shop":"car"},"name":"Fiat","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Ford":{"tags":{"name":"Ford","shop":"car"},"name":"Ford","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Honda":{"tags":{"name":"Honda","shop":"car"},"name":"Honda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Hyundai":{"tags":{"name":"Hyundai","shop":"car"},"name":"Hyundai","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Isuzu":{"tags":{"name":"Isuzu","shop":"car"},"name":"Isuzu","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Kia":{"tags":{"name":"Kia","shop":"car"},"name":"Kia","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Land Rover":{"tags":{"name":"Land Rover","shop":"car"},"name":"Land Rover","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Lexus":{"tags":{"name":"Lexus","shop":"car"},"name":"Lexus","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Mazda":{"tags":{"name":"Mazda","shop":"car"},"name":"Mazda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Mercedes-Benz":{"tags":{"name":"Mercedes-Benz","shop":"car"},"name":"Mercedes-Benz","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Mitsubishi":{"tags":{"name":"Mitsubishi","shop":"car"},"name":"Mitsubishi","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Mitsubishi Motors":{"tags":{"name":"Mitsubishi Motors","shop":"car"},"name":"Mitsubishi Motors","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/NISSAN":{"tags":{"name":"NISSAN","shop":"car"},"name":"NISSAN","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Nissan":{"tags":{"name":"Nissan","shop":"car"},"name":"Nissan","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Opel":{"tags":{"name":"Opel","shop":"car"},"name":"Opel","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Peugeot":{"tags":{"name":"Peugeot","shop":"car"},"name":"Peugeot","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Porsche":{"tags":{"name":"Porsche","shop":"car"},"name":"Porsche","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Renault":{"tags":{"name":"Renault","shop":"car"},"name":"Renault","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Seat":{"tags":{"name":"Seat","shop":"car"},"name":"Seat","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Skoda":{"tags":{"name":"Skoda","shop":"car"},"name":"Skoda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Subaru":{"tags":{"name":"Subaru","shop":"car"},"name":"Subaru","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Suzuki":{"tags":{"name":"Suzuki","shop":"car"},"name":"Suzuki","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Toyota":{"tags":{"name":"Toyota","shop":"car"},"name":"Toyota","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Volkswagen":{"tags":{"name":"Volkswagen","shop":"car"},"name":"Volkswagen","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Volvo":{"tags":{"name":"Volvo","shop":"car"},"name":"Volvo","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/Advance Auto Parts":{"tags":{"name":"Advance Auto Parts","shop":"car_parts"},"name":"Advance Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/AutoZone":{"tags":{"name":"AutoZone","shop":"car_parts"},"name":"AutoZone","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/Brezan":{"tags":{"name":"Brezan","shop":"car_parts"},"name":"Brezan","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/NAPA Auto Parts":{"tags":{"name":"NAPA Auto Parts","shop":"car_parts"},"name":"NAPA Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/Napa Auto Parts":{"tags":{"name":"Napa Auto Parts","shop":"car_parts"},"name":"Napa Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/O'Reilly Auto Parts":{"tags":{"name":"O'Reilly Auto Parts","shop":"car_parts"},"name":"O'Reilly Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/Repco":{"tags":{"name":"Repco","shop":"car_parts"},"name":"Repco","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/Tokić":{"tags":{"name":"Tokić","shop":"car_parts"},"name":"Tokić","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/repuestos automotrices":{"tags":{"name":"repuestos automotrices","shop":"car_parts"},"name":"repuestos automotrices","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/Автозапчастини":{"tags":{"name":"Автозапчастини","shop":"car_parts"},"name":"Автозапчастини","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/Автомир":{"tags":{"name":"Автомир","shop":"car_parts"},"name":"Автомир","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/イエローハット":{"tags":{"name":"イエローハット","shop":"car_parts"},"name":"イエローハット","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/オートバックス":{"tags":{"name":"オートバックス","shop":"car_parts"},"name":"オートバックス","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/タイヤ館":{"tags":{"name":"タイヤ館","shop":"car_parts"},"name":"タイヤ館","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/A.T.U":{"tags":{"name":"A.T.U","shop":"car_repair"},"name":"A.T.U","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Bosch Car Service":{"tags":{"name":"Bosch Car Service","shop":"car_repair"},"name":"Bosch Car Service","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Carglass":{"tags":{"name":"Carglass","shop":"car_repair"},"name":"Carglass","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Euromaster":{"tags":{"name":"Euromaster","shop":"car_repair"},"name":"Euromaster","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Feu Vert":{"tags":{"name":"Feu Vert","shop":"car_repair"},"name":"Feu Vert","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Firestone":{"tags":{"name":"Firestone","shop":"car_repair"},"name":"Firestone","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Firestone Complete Auto Care":{"tags":{"name":"Firestone Complete Auto Care","shop":"car_repair"},"name":"Firestone Complete Auto Care","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Garage Renault":{"tags":{"name":"Garage Renault","shop":"car_repair"},"name":"Garage Renault","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Gomeria":{"tags":{"name":"Gomeria","shop":"car_repair"},"name":"Gomeria","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Gomería":{"tags":{"name":"Gomería","shop":"car_repair"},"name":"Gomería","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Goodyear":{"tags":{"name":"Goodyear","shop":"car_repair"},"name":"Goodyear","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Grease Monkey":{"tags":{"name":"Grease Monkey","shop":"car_repair"},"name":"Grease Monkey","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Jiffy Lube":{"tags":{"name":"Jiffy Lube","shop":"car_repair"},"name":"Jiffy Lube","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Kwik Fit":{"tags":{"name":"Kwik Fit","shop":"car_repair"},"name":"Kwik Fit","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Lubricentro":{"tags":{"name":"Lubricentro","shop":"car_repair"},"name":"Lubricentro","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Meineke":{"tags":{"name":"Meineke","shop":"car_repair"},"name":"Meineke","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Mekonomen":{"tags":{"name":"Mekonomen","shop":"car_repair"},"name":"Mekonomen","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Midas":{"tags":{"name":"Midas","shop":"car_repair"},"name":"Midas","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Mr. Lube":{"tags":{"name":"Mr. Lube","shop":"car_repair"},"name":"Mr. Lube","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Norauto":{"tags":{"name":"Norauto","shop":"car_repair"},"name":"Norauto","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Pep Boys":{"tags":{"name":"Pep Boys","shop":"car_repair"},"name":"Pep Boys","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Pit Stop":{"tags":{"name":"Pit Stop","shop":"car_repair"},"name":"Pit Stop","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Point S":{"tags":{"name":"Point S","shop":"car_repair"},"name":"Point S","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Roady":{"tags":{"name":"Roady","shop":"car_repair"},"name":"Roady","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Sears Auto Center":{"tags":{"name":"Sears Auto Center","shop":"car_repair"},"name":"Sears Auto Center","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Speedy":{"tags":{"name":"Speedy","shop":"car_repair"},"name":"Speedy","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Stacja Kontroli Pojazdów":{"tags":{"name":"Stacja Kontroli Pojazdów","shop":"car_repair"},"name":"Stacja Kontroli Pojazdów","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Taller":{"tags":{"name":"Taller","shop":"car_repair"},"name":"Taller","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Valvoline":{"tags":{"name":"Valvoline","shop":"car_repair"},"name":"Valvoline","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Valvoline Instant Oil Change":{"tags":{"name":"Valvoline Instant Oil Change","shop":"car_repair"},"name":"Valvoline Instant Oil Change","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Wulkanizacja":{"tags":{"name":"Wulkanizacja","shop":"car_repair"},"name":"Wulkanizacja","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/ÖAMTC":{"tags":{"name":"ÖAMTC","shop":"car_repair"},"name":"ÖAMTC","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Автомастерская":{"tags":{"name":"Автомастерская","shop":"car_repair"},"name":"Автомастерская","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Авторемонт":{"tags":{"name":"Авторемонт","shop":"car_repair"},"name":"Авторемонт","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Автосервис":{"tags":{"name":"Автосервис","shop":"car_repair"},"name":"Автосервис","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Автосервис+шиномонтаж":{"tags":{"name":"Автосервис+шиномонтаж","shop":"car_repair"},"name":"Автосервис+шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Замена масла":{"tags":{"name":"Замена масла","shop":"car_repair"},"name":"Замена масла","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/СТО":{"tags":{"name":"СТО","shop":"car_repair"},"name":"СТО","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Шиномонтаж":{"tags":{"name":"Шиномонтаж","shop":"car_repair"},"name":"Шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/шиномонтаж":{"tags":{"name":"шиномонтаж","shop":"car_repair"},"name":"шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/carpet/Carpet Right":{"tags":{"name":"Carpet Right","shop":"carpet"},"name":"Carpet Right","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/carpet/Carpetright":{"tags":{"name":"Carpetright","shop":"carpet"},"name":"Carpetright","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Age UK":{"tags":{"name":"Age UK","shop":"charity"},"name":"Age UK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Barnardo's":{"tags":{"name":"Barnardo's","shop":"charity"},"name":"Barnardo's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/British Heart Foundation":{"tags":{"name":"British Heart Foundation","shop":"charity"},"name":"British Heart Foundation","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Cancer Research UK":{"tags":{"name":"Cancer Research UK","shop":"charity"},"name":"Cancer Research UK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Oxfam":{"tags":{"name":"Oxfam","shop":"charity"},"name":"Oxfam","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Salvation Army":{"tags":{"name":"Salvation Army","shop":"charity"},"name":"Salvation Army","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Scope":{"tags":{"name":"Scope","shop":"charity"},"name":"Scope","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Sue Ryder":{"tags":{"name":"Sue Ryder","shop":"charity"},"name":"Sue Ryder","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/7 Дней":{"tags":{"name":"7 Дней","shop":"chemist"},"name":"7 Дней","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Bipa":{"tags":{"name":"Bipa","shop":"chemist"},"name":"Bipa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Budnikowsky":{"tags":{"name":"Budnikowsky","shop":"chemist"},"name":"Budnikowsky","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Etos":{"tags":{"name":"Etos","shop":"chemist"},"name":"Etos","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Kruidvat":{"tags":{"name":"Kruidvat","shop":"chemist"},"name":"Kruidvat","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Matas":{"tags":{"name":"Matas","shop":"chemist"},"name":"Matas","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Müller":{"tags":{"name":"Müller","shop":"chemist"},"name":"Müller","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Rossmann":{"tags":{"name":"Rossmann","shop":"chemist"},"name":"Rossmann","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Schlecker":{"tags":{"name":"Schlecker","shop":"chemist"},"name":"Schlecker","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Teta":{"tags":{"name":"Teta","shop":"chemist"},"name":"Teta","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Trekpleister":{"tags":{"name":"Trekpleister","shop":"chemist"},"name":"Trekpleister","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Watsons":{"tags":{"name":"Watsons","shop":"chemist"},"name":"Watsons","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/dm":{"tags":{"name":"dm","shop":"chemist"},"name":"dm","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Бытовая химия":{"tags":{"name":"Бытовая химия","shop":"chemist"},"name":"Бытовая химия","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Магнит Косметик":{"tags":{"name":"Магнит Косметик","shop":"chemist"},"name":"Магнит Косметик","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Мила":{"tags":{"name":"Мила","shop":"chemist"},"name":"Мила","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Остров чистоты":{"tags":{"name":"Остров чистоты","shop":"chemist"},"name":"Остров чистоты","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Рубль Бум":{"tags":{"name":"Рубль Бум","shop":"chemist"},"name":"Рубль Бум","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Улыбка радуги":{"tags":{"name":"Улыбка радуги","shop":"chemist"},"name":"Улыбка радуги","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/屈臣氏":{"tags":{"name":"屈臣氏","shop":"chemist"},"name":"屈臣氏","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/康是美":{"tags":{"name":"康是美","shop":"chemist"},"name":"康是美","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/AOKI":{"tags":{"name":"AOKI","shop":"clothes"},"name":"AOKI","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/AWG":{"tags":{"name":"AWG","shop":"clothes"},"name":"AWG","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Ackermans":{"tags":{"name":"Ackermans","shop":"clothes"},"name":"Ackermans","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Adidas":{"tags":{"name":"Adidas","shop":"clothes"},"name":"Adidas","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/American Apparel":{"tags":{"name":"American Apparel","shop":"clothes"},"name":"American Apparel","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/American Eagle Outfitters":{"tags":{"name":"American Eagle Outfitters","shop":"clothes"},"name":"American Eagle Outfitters","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Anthropologie":{"tags":{"name":"Anthropologie","shop":"clothes"},"name":"Anthropologie","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Ardene":{"tags":{"name":"Ardene","shop":"clothes"},"name":"Ardene","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Armand Thiery":{"tags":{"name":"Armand Thiery","shop":"clothes"},"name":"Armand Thiery","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Banana Republic":{"tags":{"name":"Banana Republic","shop":"clothes"},"name":"Banana Republic","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Benetton":{"tags":{"name":"Benetton","shop":"clothes"},"name":"Benetton","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Bershka":{"tags":{"name":"Bershka","shop":"clothes"},"name":"Bershka","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Bonita":{"tags":{"name":"Bonita","shop":"clothes"},"name":"Bonita","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Bonobo":{"tags":{"name":"Bonobo","shop":"clothes"},"name":"Bonobo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Brooks Brothers":{"tags":{"name":"Brooks Brothers","shop":"clothes"},"name":"Brooks Brothers","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Burberry":{"tags":{"name":"Burberry","shop":"clothes"},"name":"Burberry","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Burlington Coat Factory":{"tags":{"name":"Burlington Coat Factory","shop":"clothes"},"name":"Burlington Coat Factory","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Burton":{"tags":{"name":"Burton","shop":"clothes"},"name":"Burton","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/C&A":{"tags":{"name":"C&A","shop":"clothes"},"name":"C&A","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Cache Cache":{"tags":{"name":"Cache Cache","shop":"clothes"},"name":"Cache Cache","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Calvin Klein":{"tags":{"name":"Calvin Klein","shop":"clothes"},"name":"Calvin Klein","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Calzedonia":{"tags":{"name":"Calzedonia","shop":"clothes"},"name":"Calzedonia","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Camaïeu":{"tags":{"name":"Camaïeu","shop":"clothes"},"name":"Camaïeu","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Caroll":{"tags":{"name":"Caroll","shop":"clothes"},"name":"Caroll","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Carter's":{"tags":{"name":"Carter's","shop":"clothes"},"name":"Carter's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Cecil":{"tags":{"name":"Cecil","shop":"clothes"},"name":"Cecil","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Celio":{"tags":{"name":"Celio","shop":"clothes"},"name":"Celio","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Charles Vögele":{"tags":{"name":"Charles Vögele","shop":"clothes"},"name":"Charles Vögele","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Chico's":{"tags":{"name":"Chico's","shop":"clothes"},"name":"Chico's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Cropp":{"tags":{"name":"Cropp","shop":"clothes"},"name":"Cropp","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Cubus":{"tags":{"name":"Cubus","shop":"clothes"},"name":"Cubus","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Desigual":{"tags":{"name":"Desigual","shop":"clothes"},"name":"Desigual","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Devred":{"tags":{"name":"Devred","shop":"clothes"},"name":"Devred","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Didi":{"tags":{"name":"Didi","shop":"clothes"},"name":"Didi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Diesel":{"tags":{"name":"Diesel","shop":"clothes"},"name":"Diesel","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Dorothy Perkins":{"tags":{"name":"Dorothy Perkins","shop":"clothes"},"name":"Dorothy Perkins","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Dress Barn":{"tags":{"name":"Dress Barn","shop":"clothes"},"name":"Dress Barn","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Dressmann":{"tags":{"name":"Dressmann","shop":"clothes"},"name":"Dressmann","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Eddie Bauer":{"tags":{"name":"Eddie Bauer","shop":"clothes"},"name":"Eddie Bauer","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Edgars":{"tags":{"name":"Edgars","shop":"clothes"},"name":"Edgars","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Engbers":{"tags":{"name":"Engbers","shop":"clothes"},"name":"Engbers","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Ernsting's family":{"tags":{"name":"Ernsting's family","shop":"clothes"},"name":"Ernsting's family","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Esprit":{"tags":{"name":"Esprit","shop":"clothes"},"name":"Esprit","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Etam":{"tags":{"name":"Etam","shop":"clothes"},"name":"Etam","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Express":{"tags":{"name":"Express","shop":"clothes"},"name":"Express","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Fat Face":{"tags":{"name":"Fat Face","shop":"clothes"},"name":"Fat Face","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Forever 21":{"tags":{"name":"Forever 21","shop":"clothes"},"name":"Forever 21","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Gant":{"tags":{"name":"Gant","shop":"clothes"},"name":"Gant","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Gap":{"tags":{"name":"Gap","shop":"clothes"},"name":"Gap","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Gerry Weber":{"tags":{"name":"Gerry Weber","shop":"clothes"},"name":"Gerry Weber","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Gina Laura":{"tags":{"name":"Gina Laura","shop":"clothes"},"name":"Gina Laura","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Guess":{"tags":{"name":"Guess","shop":"clothes"},"name":"Guess","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Gymboree":{"tags":{"name":"Gymboree","shop":"clothes"},"name":"Gymboree","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Gémo":{"tags":{"name":"Gémo","shop":"clothes"},"name":"Gémo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/H&M":{"tags":{"name":"H&M","shop":"clothes"},"name":"H&M","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Hallhuber":{"tags":{"name":"Hallhuber","shop":"clothes"},"name":"Hallhuber","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/House":{"tags":{"name":"House","shop":"clothes"},"name":"House","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Hugo Boss":{"tags":{"name":"Hugo Boss","shop":"clothes"},"name":"Hugo Boss","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Humana":{"tags":{"name":"Humana","shop":"clothes"},"name":"Humana","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Hunkemöller":{"tags":{"name":"Hunkemöller","shop":"clothes"},"name":"Hunkemöller","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Intimissimi":{"tags":{"name":"Intimissimi","shop":"clothes"},"name":"Intimissimi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/JBC":{"tags":{"name":"JBC","shop":"clothes"},"name":"JBC","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Jack & Jones":{"tags":{"name":"Jack & Jones","shop":"clothes"},"name":"Jack & Jones","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Jack Wolfskin":{"tags":{"name":"Jack Wolfskin","shop":"clothes"},"name":"Jack Wolfskin","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Jeans Fritz":{"tags":{"name":"Jeans Fritz","shop":"clothes"},"name":"Jeans Fritz","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Jennyfer":{"tags":{"name":"Jennyfer","shop":"clothes"},"name":"Jennyfer","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Jigsaw":{"tags":{"name":"Jigsaw","shop":"clothes"},"name":"Jigsaw","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Jules":{"tags":{"name":"Jules","shop":"clothes"},"name":"Jules","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Justice":{"tags":{"name":"Justice","shop":"clothes"},"name":"Justice","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/KappAhl":{"tags":{"name":"KappAhl","shop":"clothes"},"name":"KappAhl","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/KiK":{"tags":{"name":"KiK","shop":"clothes"},"name":"KiK","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Kiabi":{"tags":{"name":"Kiabi","shop":"clothes"},"name":"Kiabi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/La Halle":{"tags":{"name":"La Halle","shop":"clothes"},"name":"La Halle","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Lacoste":{"tags":{"name":"Lacoste","shop":"clothes"},"name":"Lacoste","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Lane Bryant":{"tags":{"name":"Lane Bryant","shop":"clothes"},"name":"Lane Bryant","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Levi's":{"tags":{"name":"Levi's","shop":"clothes"},"name":"Levi's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Lindex":{"tags":{"name":"Lindex","shop":"clothes"},"name":"Lindex","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Loft":{"tags":{"name":"Loft","shop":"clothes"},"name":"Loft","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Mango":{"tags":{"name":"Mango","shop":"clothes"},"name":"Mango","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Marc O'Polo":{"tags":{"name":"Marc O'Polo","shop":"clothes"},"name":"Marc O'Polo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Mark's":{"tags":{"name":"Mark's","shop":"clothes"},"name":"Mark's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Marshalls":{"tags":{"name":"Marshalls","shop":"clothes"},"name":"Marshalls","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Massimo Dutti":{"tags":{"name":"Massimo Dutti","shop":"clothes"},"name":"Massimo Dutti","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Matalan":{"tags":{"name":"Matalan","shop":"clothes"},"name":"Matalan","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Maurices":{"tags":{"name":"Maurices","shop":"clothes"},"name":"Maurices","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Max Mara":{"tags":{"name":"Max Mara","shop":"clothes"},"name":"Max Mara","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Men's Wearhouse":{"tags":{"name":"Men's Wearhouse","shop":"clothes"},"name":"Men's Wearhouse","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Mexx":{"tags":{"name":"Mexx","shop":"clothes"},"name":"Mexx","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Michael Kors":{"tags":{"name":"Michael Kors","shop":"clothes"},"name":"Michael Kors","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Mim":{"tags":{"name":"Mim","shop":"clothes"},"name":"Mim","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Monsoon":{"tags":{"name":"Monsoon","shop":"clothes"},"name":"Monsoon","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Mr Price":{"tags":{"name":"Mr Price","shop":"clothes"},"name":"Mr Price","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/NKD":{"tags":{"name":"NKD","shop":"clothes"},"name":"NKD","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/New Look":{"tags":{"name":"New Look","shop":"clothes"},"name":"New Look","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/New Yorker":{"tags":{"name":"New Yorker","shop":"clothes"},"name":"New Yorker","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/NewYorker":{"tags":{"name":"NewYorker","shop":"clothes"},"name":"NewYorker","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Next":{"tags":{"name":"Next","shop":"clothes"},"name":"Next","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Nike":{"tags":{"name":"Nike","shop":"clothes"},"name":"Nike","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Nordstrom Rack":{"tags":{"name":"Nordstrom Rack","shop":"clothes"},"name":"Nordstrom Rack","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/OVS":{"tags":{"name":"OVS","shop":"clothes"},"name":"OVS","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Okaïdi":{"tags":{"name":"Okaïdi","shop":"clothes"},"name":"Okaïdi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Old Navy":{"tags":{"name":"Old Navy","shop":"clothes"},"name":"Old Navy","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Only":{"tags":{"name":"Only","shop":"clothes"},"name":"Only","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Orchestra":{"tags":{"name":"Orchestra","shop":"clothes"},"name":"Orchestra","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Original Marines":{"tags":{"name":"Original Marines","shop":"clothes"},"name":"Original Marines","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Orsay":{"tags":{"name":"Orsay","shop":"clothes"},"name":"Orsay","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Outfit":{"tags":{"name":"Outfit","shop":"clothes"},"name":"Outfit","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Outlet":{"tags":{"name":"Outlet","shop":"clothes"},"name":"Outlet","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Palmers":{"tags":{"name":"Palmers","shop":"clothes"},"name":"Palmers","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Peacocks":{"tags":{"name":"Peacocks","shop":"clothes"},"name":"Peacocks","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Peek & Cloppenburg":{"tags":{"name":"Peek & Cloppenburg","shop":"clothes"},"name":"Peek & Cloppenburg","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Pep":{"tags":{"name":"Pep","shop":"clothes"},"name":"Pep","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Pepco":{"tags":{"name":"Pepco","shop":"clothes"},"name":"Pepco","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Petit Bateau":{"tags":{"name":"Petit Bateau","shop":"clothes"},"name":"Petit Bateau","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Pimkie":{"tags":{"name":"Pimkie","shop":"clothes"},"name":"Pimkie","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Plato's Closet":{"tags":{"name":"Plato's Closet","shop":"clothes"},"name":"Plato's Closet","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Primark":{"tags":{"name":"Primark","shop":"clothes"},"name":"Primark","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Promod":{"tags":{"name":"Promod","shop":"clothes"},"name":"Promod","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Pull & Bear":{"tags":{"name":"Pull & Bear","shop":"clothes"},"name":"Pull & Bear","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Reitmans":{"tags":{"name":"Reitmans","shop":"clothes"},"name":"Reitmans","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Reserved":{"tags":{"name":"Reserved","shop":"clothes"},"name":"Reserved","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/River Island":{"tags":{"name":"River Island","shop":"clothes"},"name":"River Island","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Ross":{"tags":{"name":"Ross","shop":"clothes"},"name":"Ross","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Sela":{"tags":{"name":"Sela","shop":"clothes"},"name":"Sela","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Sergent Major":{"tags":{"name":"Sergent Major","shop":"clothes"},"name":"Sergent Major","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Shoeby":{"tags":{"name":"Shoeby","shop":"clothes"},"name":"Shoeby","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Sisley":{"tags":{"name":"Sisley","shop":"clothes"},"name":"Sisley","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Springfield":{"tags":{"name":"Springfield","shop":"clothes"},"name":"Springfield","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Stefanel":{"tags":{"name":"Stefanel","shop":"clothes"},"name":"Stefanel","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Steps":{"tags":{"name":"Steps","shop":"clothes"},"name":"Steps","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Stradivarius":{"tags":{"name":"Stradivarius","shop":"clothes"},"name":"Stradivarius","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Street One":{"tags":{"name":"Street One","shop":"clothes"},"name":"Street One","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Superdry":{"tags":{"name":"Superdry","shop":"clothes"},"name":"Superdry","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/TJ Maxx":{"tags":{"name":"TJ Maxx","shop":"clothes"},"name":"TJ Maxx","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/TK Maxx":{"tags":{"name":"TK Maxx","shop":"clothes"},"name":"TK Maxx","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Takko":{"tags":{"name":"Takko","shop":"clothes"},"name":"Takko","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Talbots":{"tags":{"name":"Talbots","shop":"clothes"},"name":"Talbots","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Tally Weijl":{"tags":{"name":"Tally Weijl","shop":"clothes"},"name":"Tally Weijl","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Tati":{"tags":{"name":"Tati","shop":"clothes"},"name":"Tati","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Terranova":{"tags":{"name":"Terranova","shop":"clothes"},"name":"Terranova","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Tesha":{"tags":{"name":"Tesha","shop":"clothes"},"name":"Tesha","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Tezenis":{"tags":{"name":"Tezenis","shop":"clothes"},"name":"Tezenis","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/The Children's Place":{"tags":{"name":"The Children's Place","shop":"clothes"},"name":"The Children's Place","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/The North Face":{"tags":{"name":"The North Face","shop":"clothes"},"name":"The North Face","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/The Sting":{"tags":{"name":"The Sting","shop":"clothes"},"name":"The Sting","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Timberland":{"tags":{"name":"Timberland","shop":"clothes"},"name":"Timberland","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Toko Pakaian":{"tags":{"name":"Toko Pakaian","shop":"clothes"},"name":"Toko Pakaian","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Tom Tailor":{"tags":{"name":"Tom Tailor","shop":"clothes"},"name":"Tom Tailor","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Tommy Hilfiger":{"tags":{"name":"Tommy Hilfiger","shop":"clothes"},"name":"Tommy Hilfiger","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Topshop":{"tags":{"name":"Topshop","shop":"clothes"},"name":"Topshop","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Triumph":{"tags":{"name":"Triumph","shop":"clothes"},"name":"Triumph","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Truworths":{"tags":{"name":"Truworths","shop":"clothes"},"name":"Truworths","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Ulla Popken":{"tags":{"name":"Ulla Popken","shop":"clothes"},"name":"Ulla Popken","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Uniqlo":{"tags":{"name":"Uniqlo","shop":"clothes"},"name":"Uniqlo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/United Colors of Benetton":{"tags":{"name":"United Colors of Benetton","shop":"clothes"},"name":"United Colors of Benetton","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Urban Outfitters":{"tags":{"name":"Urban Outfitters","shop":"clothes"},"name":"Urban Outfitters","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Vero Moda":{"tags":{"name":"Vero Moda","shop":"clothes"},"name":"Vero Moda","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Victoria's Secret":{"tags":{"name":"Victoria's Secret","shop":"clothes"},"name":"Victoria's Secret","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Vögele":{"tags":{"name":"Vögele","shop":"clothes"},"name":"Vögele","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/WE":{"tags":{"name":"WE","shop":"clothes"},"name":"WE","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Wibra":{"tags":{"name":"Wibra","shop":"clothes"},"name":"Wibra","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Winners":{"tags":{"name":"Winners","shop":"clothes"},"name":"Winners","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Yamamay":{"tags":{"name":"Yamamay","shop":"clothes"},"name":"Yamamay","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Zara":{"tags":{"name":"Zara","shop":"clothes"},"name":"Zara","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Zeeman":{"tags":{"name":"Zeeman","shop":"clothes"},"name":"Zeeman","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/mister*lady":{"tags":{"name":"mister*lady","shop":"clothes"},"name":"mister*lady","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/s.Oliver":{"tags":{"name":"s.Oliver","shop":"clothes"},"name":"s.Oliver","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Детская одежда":{"tags":{"name":"Детская одежда","shop":"clothes"},"name":"Детская одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Женская одежда":{"tags":{"name":"Женская одежда","shop":"clothes"},"name":"Женская одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Липненски":{"tags":{"name":"Липненски","shop":"clothes"},"name":"Липненски","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Московская ярмарка":{"tags":{"name":"Московская ярмарка","shop":"clothes"},"name":"Московская ярмарка","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Одежда":{"tags":{"name":"Одежда","shop":"clothes"},"name":"Одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Смешные цены":{"tags":{"name":"Смешные цены","shop":"clothes"},"name":"Смешные цены","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Спецодежда":{"tags":{"name":"Спецодежда","shop":"clothes"},"name":"Спецодежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/しまむら":{"tags":{"name":"しまむら","shop":"clothes"},"name":"しまむら","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/ユニクロ":{"tags":{"name":"ユニクロ","shop":"clothes"},"name":"ユニクロ","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/ワークマン":{"tags":{"name":"ワークマン","shop":"clothes"},"name":"ワークマン","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/洋服の青山":{"tags":{"name":"洋服の青山","shop":"clothes"},"name":"洋服の青山","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/西松屋":{"tags":{"name":"西松屋","shop":"clothes"},"name":"西松屋","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/coffee/Nespresso":{"tags":{"name":"Nespresso","shop":"coffee"},"name":"Nespresso","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/coffee/Tchibo":{"tags":{"name":"Tchibo","shop":"coffee"},"name":"Tchibo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/computer/Apple Store":{"tags":{"name":"Apple Store","shop":"computer"},"name":"Apple Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/computer/DNS":{"tags":{"name":"DNS","shop":"computer"},"name":"DNS","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/computer/PC World":{"tags":{"name":"PC World","shop":"computer"},"name":"PC World","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/computer/ДНС":{"tags":{"name":"ДНС","shop":"computer"},"name":"ДНС","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/confectionery/Fagyizó":{"tags":{"name":"Fagyizó","shop":"confectionery"},"name":"Fagyizó","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/confectionery/Hussel":{"tags":{"name":"Hussel","shop":"confectionery"},"name":"Hussel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/confectionery/Leonidas":{"tags":{"name":"Leonidas","shop":"confectionery"},"name":"Leonidas","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/confectionery/T. SN":{"tags":{"name":"T. SN","shop":"confectionery"},"name":"T. SN","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/confectionery/Thorntons":{"tags":{"name":"Thorntons","shop":"confectionery"},"name":"Thorntons","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/711":{"tags":{"name":"711","shop":"convenience"},"name":"711","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/777":{"tags":{"name":"777","shop":"convenience"},"name":"777","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/24 часа":{"tags":{"name":"24 часа","shop":"convenience"},"name":"24 часа","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/7-Eleven":{"tags":{"name":"7-Eleven","shop":"convenience"},"name":"7-Eleven","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/8 à Huit":{"tags":{"name":"8 à Huit","shop":"convenience"},"name":"8 à Huit","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/99 Speedmart":{"tags":{"name":"99 Speedmart","shop":"convenience"},"name":"99 Speedmart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ABC":{"tags":{"name":"ABC","shop":"convenience"},"name":"ABC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/AMPM":{"tags":{"name":"AMPM","shop":"convenience"},"name":"AMPM","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Aibė":{"tags":{"name":"Aibė","shop":"convenience"},"name":"Aibė","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Alepa":{"tags":{"name":"Alepa","shop":"convenience"},"name":"Alepa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Alfamart":{"tags":{"name":"Alfamart","shop":"convenience"},"name":"Alfamart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Alimentara":{"tags":{"name":"Alimentara","shop":"convenience"},"name":"Alimentara","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Almacen":{"tags":{"name":"Almacen","shop":"convenience"},"name":"Almacen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Almacén":{"tags":{"name":"Almacén","shop":"convenience"},"name":"Almacén","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/BP Shop":{"tags":{"name":"BP Shop","shop":"convenience"},"name":"BP Shop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Baqala":{"tags":{"name":"Baqala","shop":"convenience"},"name":"Baqala","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Best One":{"tags":{"name":"Best One","shop":"convenience"},"name":"Best One","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Best-One":{"tags":{"name":"Best-One","shop":"convenience"},"name":"Best-One","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Bodega":{"tags":{"name":"Bodega","shop":"convenience"},"name":"Bodega","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Bonjour":{"tags":{"name":"Bonjour","shop":"convenience"},"name":"Bonjour","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/CBA":{"tags":{"name":"CBA","shop":"convenience"},"name":"CBA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/COOP":{"tags":{"name":"COOP","shop":"convenience"},"name":"COOP","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/COOP Jednota":{"tags":{"name":"COOP Jednota","shop":"convenience"},"name":"COOP Jednota","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/CU":{"tags":{"name":"CU","shop":"convenience"},"name":"CU","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Casino Shop":{"tags":{"name":"Casino Shop","shop":"convenience"},"name":"Casino Shop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Centra":{"tags":{"name":"Centra","shop":"convenience"},"name":"Centra","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Central Convenience Store":{"tags":{"name":"Central Convenience Store","shop":"convenience"},"name":"Central Convenience Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Circle K":{"tags":{"name":"Circle K","shop":"convenience"},"name":"Circle K","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Coop Jednota":{"tags":{"name":"Coop Jednota","shop":"convenience"},"name":"Coop Jednota","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Corner Store":{"tags":{"name":"Corner Store","shop":"convenience"},"name":"Corner Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Costcutter":{"tags":{"name":"Costcutter","shop":"convenience"},"name":"Costcutter","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Couche-Tard":{"tags":{"name":"Couche-Tard","shop":"convenience"},"name":"Couche-Tard","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Cumberland Farms":{"tags":{"name":"Cumberland Farms","shop":"convenience"},"name":"Cumberland Farms","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Daisy Mart":{"tags":{"name":"Daisy Mart","shop":"convenience"},"name":"Daisy Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Delikatesy":{"tags":{"name":"Delikatesy","shop":"convenience"},"name":"Delikatesy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Dollar General":{"tags":{"name":"Dollar General","shop":"convenience"},"name":"Dollar General","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Dépanneur":{"tags":{"name":"Dépanneur","shop":"convenience"},"name":"Dépanneur","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/FamilyMart":{"tags":{"name":"FamilyMart","shop":"convenience"},"name":"FamilyMart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Food Mart":{"tags":{"name":"Food Mart","shop":"convenience"},"name":"Food Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Four Square":{"tags":{"name":"Four Square","shop":"convenience"},"name":"Four Square","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Fresh":{"tags":{"name":"Fresh","shop":"convenience"},"name":"Fresh","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Freshmarket":{"tags":{"name":"Freshmarket","shop":"convenience"},"name":"Freshmarket","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/GS25":{"tags":{"name":"GS25","shop":"convenience"},"name":"GS25","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Groszek":{"tags":{"name":"Groszek","shop":"convenience"},"name":"Groszek","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Hasty Market":{"tags":{"name":"Hasty Market","shop":"convenience"},"name":"Hasty Market","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Hruška":{"tags":{"name":"Hruška","shop":"convenience"},"name":"Hruška","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Indomaret":{"tags":{"name":"Indomaret","shop":"convenience"},"name":"Indomaret","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Jednota":{"tags":{"name":"Jednota","shop":"convenience"},"name":"Jednota","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Joker":{"tags":{"name":"Joker","shop":"convenience"},"name":"Joker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/K-Market":{"tags":{"name":"K-Market","shop":"convenience"},"name":"K-Market","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Kangaroo Express":{"tags":{"name":"Kangaroo Express","shop":"convenience"},"name":"Kangaroo Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Kisbolt":{"tags":{"name":"Kisbolt","shop":"convenience"},"name":"Kisbolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Lawson":{"tags":{"name":"Lawson","shop":"convenience"},"name":"Lawson","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Lewiatan":{"tags":{"name":"Lewiatan","shop":"convenience"},"name":"Lewiatan","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Lifestyle Express":{"tags":{"name":"Lifestyle Express","shop":"convenience"},"name":"Lifestyle Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Londis":{"tags":{"name":"Londis","shop":"convenience"},"name":"Londis","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/M&S Simply Food":{"tags":{"name":"M&S Simply Food","shop":"convenience"},"name":"M&S Simply Food","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mac's":{"tags":{"name":"Mac's","shop":"convenience"},"name":"Mac's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mace":{"tags":{"name":"Mace","shop":"convenience"},"name":"Mace","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Magazin":{"tags":{"name":"Magazin","shop":"convenience"},"name":"Magazin","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Magazin Mixt":{"tags":{"name":"Magazin Mixt","shop":"convenience"},"name":"Magazin Mixt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Magazin Non-Stop":{"tags":{"name":"Magazin Non-Stop","shop":"convenience"},"name":"Magazin Non-Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Magazin mixt":{"tags":{"name":"Magazin mixt","shop":"convenience"},"name":"Magazin mixt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Maxikiosco":{"tags":{"name":"Maxikiosco","shop":"convenience"},"name":"Maxikiosco","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Małpka Express":{"tags":{"name":"Małpka Express","shop":"convenience"},"name":"Małpka Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/McColl's":{"tags":{"name":"McColl's","shop":"convenience"},"name":"McColl's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Migrolino":{"tags":{"name":"Migrolino","shop":"convenience"},"name":"Migrolino","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mini ABC":{"tags":{"name":"Mini ABC","shop":"convenience"},"name":"Mini ABC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mini Market":{"tags":{"name":"Mini Market","shop":"convenience"},"name":"Mini Market","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mini Market Non-Stop":{"tags":{"name":"Mini Market Non-Stop","shop":"convenience"},"name":"Mini Market Non-Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mini Mart":{"tags":{"name":"Mini Mart","shop":"convenience"},"name":"Mini Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mini Stop":{"tags":{"name":"Mini Stop","shop":"convenience"},"name":"Mini Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Minimercado":{"tags":{"name":"Minimercado","shop":"convenience"},"name":"Minimercado","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mlin i pekare":{"tags":{"name":"Mlin i pekare","shop":"convenience"},"name":"Mlin i pekare","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Nasz Sklep":{"tags":{"name":"Nasz Sklep","shop":"convenience"},"name":"Nasz Sklep","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Nisa":{"tags":{"name":"Nisa","shop":"convenience"},"name":"Nisa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Nisa Local":{"tags":{"name":"Nisa Local","shop":"convenience"},"name":"Nisa Local","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/OK-Mart":{"tags":{"name":"OK-Mart","shop":"convenience"},"name":"OK-Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/OK便利商店":{"tags":{"name":"OK便利商店","shop":"convenience"},"name":"OK便利商店","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/OK便利店 Circle K":{"tags":{"name":"OK便利店 Circle K","shop":"convenience"},"name":"OK便利店 Circle K","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Odido":{"tags":{"name":"Odido","shop":"convenience"},"name":"Odido","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/On The Run":{"tags":{"name":"On The Run","shop":"convenience"},"name":"On The Run","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/On the Run":{"tags":{"name":"On the Run","shop":"convenience"},"name":"On the Run","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/One Stop":{"tags":{"name":"One Stop","shop":"convenience"},"name":"One Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Oxxo":{"tags":{"name":"Oxxo","shop":"convenience"},"name":"Oxxo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Parduotuvė":{"tags":{"name":"Parduotuvė","shop":"convenience"},"name":"Parduotuvė","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Petit Casino":{"tags":{"name":"Petit Casino","shop":"convenience"},"name":"Petit Casino","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Plaid Pantry":{"tags":{"name":"Plaid Pantry","shop":"convenience"},"name":"Plaid Pantry","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Potraviny":{"tags":{"name":"Potraviny","shop":"convenience"},"name":"Potraviny","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Prehrana":{"tags":{"name":"Prehrana","shop":"convenience"},"name":"Prehrana","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Premier":{"tags":{"name":"Premier","shop":"convenience"},"name":"Premier","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Proxi":{"tags":{"name":"Proxi","shop":"convenience"},"name":"Proxi","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Proxy":{"tags":{"name":"Proxy","shop":"convenience"},"name":"Proxy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Pulperia":{"tags":{"name":"Pulperia","shop":"convenience"},"name":"Pulperia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Royal Farms":{"tags":{"name":"Royal Farms","shop":"convenience"},"name":"Royal Farms","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Sale":{"tags":{"name":"Sale","shop":"convenience"},"name":"Sale","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Sari-sari Store":{"tags":{"name":"Sari-sari Store","shop":"convenience"},"name":"Sari-sari Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Select":{"tags":{"name":"Select","shop":"convenience"},"name":"Select","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Shell Select":{"tags":{"name":"Shell Select","shop":"convenience"},"name":"Shell Select","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Shop & Go":{"tags":{"name":"Shop & Go","shop":"convenience"},"name":"Shop & Go","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Siwa":{"tags":{"name":"Siwa","shop":"convenience"},"name":"Siwa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Sklep spożywczy":{"tags":{"name":"Sklep spożywczy","shop":"convenience"},"name":"Sklep spożywczy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Smíšené zboží":{"tags":{"name":"Smíšené zboží","shop":"convenience"},"name":"Smíšené zboží","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Społem":{"tags":{"name":"Społem","shop":"convenience"},"name":"Społem","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Spätkauf":{"tags":{"name":"Spätkauf","shop":"convenience"},"name":"Spätkauf","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Stewart's":{"tags":{"name":"Stewart's","shop":"convenience"},"name":"Stewart's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Stores":{"tags":{"name":"Stores","shop":"convenience"},"name":"Stores","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Stripes":{"tags":{"name":"Stripes","shop":"convenience"},"name":"Stripes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Studenac":{"tags":{"name":"Studenac","shop":"convenience"},"name":"Studenac","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Sunkus":{"tags":{"name":"Sunkus","shop":"convenience"},"name":"Sunkus","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Słoneczko":{"tags":{"name":"Słoneczko","shop":"convenience"},"name":"Słoneczko","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/TESCO Lotus Express":{"tags":{"name":"TESCO Lotus Express","shop":"convenience"},"name":"TESCO Lotus Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Tesco Express":{"tags":{"name":"Tesco Express","shop":"convenience"},"name":"Tesco Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Tesco Lotus Express":{"tags":{"name":"Tesco Lotus Express","shop":"convenience"},"name":"Tesco Lotus Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Tom Market 89":{"tags":{"name":"Tom Market 89","shop":"convenience"},"name":"Tom Market 89","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/United Dairy Farmers":{"tags":{"name":"United Dairy Farmers","shop":"convenience"},"name":"United Dairy Farmers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Vegyesbolt":{"tags":{"name":"Vegyesbolt","shop":"convenience"},"name":"Vegyesbolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Večerka":{"tags":{"name":"Večerka","shop":"convenience"},"name":"Večerka","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Vival":{"tags":{"name":"Vival","shop":"convenience"},"name":"Vival","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Wawa":{"tags":{"name":"Wawa","shop":"convenience"},"name":"Wawa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Weltladen":{"tags":{"name":"Weltladen","shop":"convenience"},"name":"Weltladen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/abc":{"tags":{"name":"abc","shop":"convenience"},"name":"abc","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ampm":{"tags":{"name":"ampm","shop":"convenience"},"name":"ampm","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/best-one":{"tags":{"name":"best-one","shop":"convenience"},"name":"best-one","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/odido":{"tags":{"name":"odido","shop":"convenience"},"name":"odido","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Élelmiszer":{"tags":{"name":"Élelmiszer","shop":"convenience"},"name":"Élelmiszer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Élelmiszerbolt":{"tags":{"name":"Élelmiszerbolt","shop":"convenience"},"name":"Élelmiszerbolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Żabka":{"tags":{"name":"Żabka","shop":"convenience"},"name":"Żabka","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Žabka":{"tags":{"name":"Žabka","shop":"convenience"},"name":"Žabka","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Августина":{"tags":{"name":"Августина","shop":"convenience"},"name":"Августина","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Авоська":{"tags":{"name":"Авоська","shop":"convenience"},"name":"Авоська","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Агрокомплекс":{"tags":{"name":"Агрокомплекс","shop":"convenience"},"name":"Агрокомплекс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Альянс":{"tags":{"name":"Альянс","shop":"convenience"},"name":"Альянс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Апельсин":{"tags":{"name":"Апельсин","shop":"convenience"},"name":"Апельсин","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ассорти":{"tags":{"name":"Ассорти","shop":"convenience"},"name":"Ассорти","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Белорусские продукты":{"tags":{"name":"Белорусские продукты","shop":"convenience"},"name":"Белорусские продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Берёзка":{"tags":{"name":"Берёзка","shop":"convenience"},"name":"Берёзка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Везунчик":{"tags":{"name":"Везунчик","shop":"convenience"},"name":"Везунчик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Весна":{"tags":{"name":"Весна","shop":"convenience"},"name":"Весна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ветеран":{"tags":{"name":"Ветеран","shop":"convenience"},"name":"Ветеран","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Визит":{"tags":{"name":"Визит","shop":"convenience"},"name":"Визит","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Виктория":{"tags":{"name":"Виктория","shop":"convenience"},"name":"Виктория","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ВкусВилл":{"tags":{"name":"ВкусВилл","shop":"convenience"},"name":"ВкусВилл","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Гастроном":{"tags":{"name":"Гастроном","shop":"convenience"},"name":"Гастроном","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Гермес":{"tags":{"name":"Гермес","shop":"convenience"},"name":"Гермес","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Гурман":{"tags":{"name":"Гурман","shop":"convenience"},"name":"Гурман","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Домашний":{"tags":{"name":"Домашний","shop":"convenience"},"name":"Домашний","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Елена":{"tags":{"name":"Елена","shop":"convenience"},"name":"Елена","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ермолино":{"tags":{"name":"Ермолино","shop":"convenience"},"name":"Ермолино","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Калинка":{"tags":{"name":"Калинка","shop":"convenience"},"name":"Калинка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Кировский":{"tags":{"name":"Кировский","shop":"convenience"},"name":"Кировский","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Колобок":{"tags":{"name":"Колобок","shop":"convenience"},"name":"Колобок","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Колосок":{"tags":{"name":"Колосок","shop":"convenience"},"name":"Колосок","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Копеечка":{"tags":{"name":"Копеечка","shop":"convenience"},"name":"Копеечка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Копейка":{"tags":{"name":"Копейка","shop":"convenience"},"name":"Копейка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Корзинка":{"tags":{"name":"Корзинка","shop":"convenience"},"name":"Корзинка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Крамниця":{"tags":{"name":"Крамниця","shop":"convenience"},"name":"Крамниця","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Кристалл":{"tags":{"name":"Кристалл","shop":"convenience"},"name":"Кристалл","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Кулинария":{"tags":{"name":"Кулинария","shop":"convenience"},"name":"Кулинария","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Купец":{"tags":{"name":"Купец","shop":"convenience"},"name":"Купец","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ласточка":{"tags":{"name":"Ласточка","shop":"convenience"},"name":"Ласточка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Лидер":{"tags":{"name":"Лидер","shop":"convenience"},"name":"Лидер","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Любимый":{"tags":{"name":"Любимый","shop":"convenience"},"name":"Любимый","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Люкс":{"tags":{"name":"Люкс","shop":"convenience"},"name":"Люкс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Магазин при АЗС":{"tags":{"name":"Магазин при АЗС","shop":"convenience"},"name":"Магазин при АЗС","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Мария-Ра":{"tags":{"name":"Мария-Ра","shop":"convenience"},"name":"Мария-Ра","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Маяк":{"tags":{"name":"Маяк","shop":"convenience"},"name":"Маяк","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Меркурий":{"tags":{"name":"Меркурий","shop":"convenience"},"name":"Меркурий","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Мечта":{"tags":{"name":"Мечта","shop":"convenience"},"name":"Мечта","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Минимаркет":{"tags":{"name":"Минимаркет","shop":"convenience"},"name":"Минимаркет","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Мираж":{"tags":{"name":"Мираж","shop":"convenience"},"name":"Мираж","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Надежда":{"tags":{"name":"Надежда","shop":"convenience"},"name":"Надежда","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ника":{"tags":{"name":"Ника","shop":"convenience"},"name":"Ника","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Оазис":{"tags":{"name":"Оазис","shop":"convenience"},"name":"Оазис","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Олимп":{"tags":{"name":"Олимп","shop":"convenience"},"name":"Олимп","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Подсолнух":{"tags":{"name":"Подсолнух","shop":"convenience"},"name":"Подсолнух","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Престиж":{"tags":{"name":"Престиж","shop":"convenience"},"name":"Престиж","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Продукти":{"tags":{"name":"Продукти","shop":"convenience"},"name":"Продукти","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Продуктовый":{"tags":{"name":"Продуктовый","shop":"convenience"},"name":"Продуктовый","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Продуктовый магазин":{"tags":{"name":"Продуктовый магазин","shop":"convenience"},"name":"Продуктовый магазин","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Продукты":{"tags":{"name":"Продукты","shop":"convenience"},"name":"Продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Продукты 24":{"tags":{"name":"Продукты 24","shop":"convenience"},"name":"Продукты 24","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Радуга":{"tags":{"name":"Радуга","shop":"convenience"},"name":"Радуга","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Родны кут":{"tags":{"name":"Родны кут","shop":"convenience"},"name":"Родны кут","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ромашка":{"tags":{"name":"Ромашка","shop":"convenience"},"name":"Ромашка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Русь":{"tags":{"name":"Русь","shop":"convenience"},"name":"Русь","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Светлана":{"tags":{"name":"Светлана","shop":"convenience"},"name":"Светлана","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Смак":{"tags":{"name":"Смак","shop":"convenience"},"name":"Смак","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Солнечный":{"tags":{"name":"Солнечный","shop":"convenience"},"name":"Солнечный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Татьяна":{"tags":{"name":"Татьяна","shop":"convenience"},"name":"Татьяна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Тройка":{"tags":{"name":"Тройка","shop":"convenience"},"name":"Тройка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/У Палыча":{"tags":{"name":"У Палыча","shop":"convenience"},"name":"У Палыча","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Универсам":{"tags":{"name":"Универсам","shop":"convenience"},"name":"Универсам","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Фортуна":{"tags":{"name":"Фортуна","shop":"convenience"},"name":"Фортуна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Хороший":{"tags":{"name":"Хороший","shop":"convenience"},"name":"Хороший","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Центральный":{"tags":{"name":"Центральный","shop":"convenience"},"name":"Центральный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Чайка":{"tags":{"name":"Чайка","shop":"convenience"},"name":"Чайка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Шанс":{"tags":{"name":"Шанс","shop":"convenience"},"name":"Шанс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Эконом":{"tags":{"name":"Эконом","shop":"convenience"},"name":"Эконом","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Юбилейный":{"tags":{"name":"Юбилейный","shop":"convenience"},"name":"Юбилейный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Юлия":{"tags":{"name":"Юлия","shop":"convenience"},"name":"Юлия","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/продукты":{"tags":{"name":"продукты","shop":"convenience"},"name":"продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/მარკეტი":{"tags":{"name":"მარკეტი","shop":"convenience"},"name":"მარკეტი","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/サンクス":{"tags":{"name":"サンクス","name:en":"sunkus","shop":"convenience"},"name":"サンクス","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/サークルK":{"tags":{"name":"サークルK","name:en":"Circle K","shop":"convenience"},"name":"サークルK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/スリーエフ":{"tags":{"name":"スリーエフ","shop":"convenience"},"name":"スリーエフ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/セイコーマート":{"tags":{"name":"セイコーマート","shop":"convenience"},"name":"セイコーマート","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/セブンイレブン":{"tags":{"name":"セブンイレブン","name:en":"7-Eleven","shop":"convenience"},"name":"セブンイレブン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/セブンイレブン(Seven-Eleven)":{"tags":{"name":"セブンイレブン(Seven-Eleven)","shop":"convenience"},"name":"セブンイレブン(Seven-Eleven)","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/セーブオン":{"tags":{"name":"セーブオン","shop":"convenience"},"name":"セーブオン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/デイリーヤマザキ":{"tags":{"name":"デイリーヤマザキ","shop":"convenience"},"name":"デイリーヤマザキ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ファミリーマート":{"tags":{"name":"ファミリーマート","name:en":"FamilyMart","shop":"convenience"},"name":"ファミリーマート","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ポプラ":{"tags":{"name":"ポプラ","shop":"convenience"},"name":"ポプラ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ミニストップ":{"tags":{"name":"ミニストップ","name:en":"MINISTOP","shop":"convenience"},"name":"ミニストップ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ヤマザキショップ":{"tags":{"name":"ヤマザキショップ","shop":"convenience"},"name":"ヤマザキショップ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ローソン":{"tags":{"name":"ローソン","name:en":"LAWSON","shop":"convenience"},"name":"ローソン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ローソンストア100":{"tags":{"name":"ローソンストア100","shop":"convenience"},"name":"ローソンストア100","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/全家":{"tags":{"name":"全家","shop":"convenience"},"name":"全家","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/全家便利商店":{"tags":{"name":"全家便利商店","shop":"convenience"},"name":"全家便利商店","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/萊爾富":{"tags":{"name":"萊爾富","shop":"convenience"},"name":"萊爾富","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/세븐일레븐":{"tags":{"name":"세븐일레븐","shop":"convenience"},"name":"세븐일레븐","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/copyshop/FedEx Office":{"tags":{"name":"FedEx Office","shop":"copyshop"},"name":"FedEx Office","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/copyshop/FedEx Office Print and Ship Center":{"tags":{"name":"FedEx Office Print and Ship Center","shop":"copyshop"},"name":"FedEx Office Print and Ship Center","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Douglas":{"tags":{"name":"Douglas","shop":"cosmetics"},"name":"Douglas","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Lush":{"tags":{"name":"Lush","shop":"cosmetics"},"name":"Lush","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Marionnaud":{"tags":{"name":"Marionnaud","shop":"cosmetics"},"name":"Marionnaud","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Sephora":{"tags":{"name":"Sephora","shop":"cosmetics"},"name":"Sephora","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/The Body Shop":{"tags":{"name":"The Body Shop","shop":"cosmetics"},"name":"The Body Shop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Л'Этуаль":{"tags":{"name":"Л'Этуаль","shop":"cosmetics"},"name":"Л'Этуаль","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Магнит косметик":{"tags":{"name":"Магнит косметик","shop":"cosmetics"},"name":"Магнит косметик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Магнит-Косметик":{"tags":{"name":"Магнит-Косметик","shop":"cosmetics"},"name":"Магнит-Косметик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Подружка":{"tags":{"name":"Подружка","shop":"cosmetics"},"name":"Подружка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/craft/Hobby Lobby":{"tags":{"name":"Hobby Lobby","shop":"craft"},"name":"Hobby Lobby","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/craft/Michaels":{"tags":{"name":"Michaels","shop":"craft"},"name":"Michaels","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Argos":{"tags":{"name":"Argos","shop":"department_store"},"name":"Argos","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Bed Bath & Beyond":{"tags":{"name":"Bed Bath & Beyond","shop":"department_store"},"name":"Bed Bath & Beyond","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Big Lots":{"tags":{"name":"Big Lots","shop":"department_store"},"name":"Big Lots","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Big W":{"tags":{"name":"Big W","shop":"department_store"},"name":"Big W","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Canadian Tire":{"tags":{"name":"Canadian Tire","shop":"department_store"},"name":"Canadian Tire","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Coppel":{"tags":{"name":"Coppel","shop":"department_store"},"name":"Coppel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Debenhams":{"tags":{"name":"Debenhams","shop":"department_store"},"name":"Debenhams","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Dillard's":{"tags":{"name":"Dillard's","shop":"department_store"},"name":"Dillard's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/El Corte Inglés":{"tags":{"name":"El Corte Inglés","shop":"department_store"},"name":"El Corte Inglés","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Galeria Kaufhof":{"tags":{"name":"Galeria Kaufhof","shop":"department_store"},"name":"Galeria Kaufhof","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/HEMA":{"tags":{"name":"HEMA","shop":"department_store"},"name":"HEMA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Harvey Norman":{"tags":{"name":"Harvey Norman","shop":"department_store"},"name":"Harvey Norman","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/JCPenney":{"tags":{"name":"JCPenney","shop":"department_store"},"name":"JCPenney","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Karstadt":{"tags":{"name":"Karstadt","shop":"department_store"},"name":"Karstadt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Kmart":{"tags":{"name":"Kmart","shop":"department_store"},"name":"Kmart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Kohl's":{"tags":{"name":"Kohl's","shop":"department_store"},"name":"Kohl's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Lojas Americanas":{"tags":{"name":"Lojas Americanas","shop":"department_store"},"name":"Lojas Americanas","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Macy's":{"tags":{"name":"Macy's","shop":"department_store"},"name":"Macy's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Marks & Spencer":{"tags":{"name":"Marks & Spencer","shop":"department_store"},"name":"Marks & Spencer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Myer":{"tags":{"name":"Myer","shop":"department_store"},"name":"Myer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Nordstrom":{"tags":{"name":"Nordstrom","shop":"department_store"},"name":"Nordstrom","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Sears":{"tags":{"name":"Sears","shop":"department_store"},"name":"Sears","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Shopko":{"tags":{"name":"Shopko","shop":"department_store"},"name":"Shopko","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Target":{"tags":{"name":"Target","shop":"department_store"},"name":"Target","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/The Warehouse":{"tags":{"name":"The Warehouse","shop":"department_store"},"name":"The Warehouse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Woolworth":{"tags":{"name":"Woolworth","shop":"department_store"},"name":"Woolworth","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Универмаг":{"tags":{"name":"Универмаг","shop":"department_store"},"name":"Универмаг","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Ace Hardware":{"tags":{"name":"Ace Hardware","shop":"doityourself"},"name":"Ace Hardware","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/B&Q":{"tags":{"name":"B&Q","shop":"doityourself"},"name":"B&Q","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Bauhaus":{"tags":{"name":"Bauhaus","shop":"doityourself"},"name":"Bauhaus","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Biltema":{"tags":{"name":"Biltema","shop":"doityourself"},"name":"Biltema","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Brico":{"tags":{"name":"Brico","shop":"doityourself"},"name":"Brico","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Bricomarché":{"tags":{"name":"Bricomarché","shop":"doityourself"},"name":"Bricomarché","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Bricorama":{"tags":{"name":"Bricorama","shop":"doityourself"},"name":"Bricorama","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Bunnings Warehouse":{"tags":{"name":"Bunnings Warehouse","shop":"doityourself"},"name":"Bunnings Warehouse","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Castorama":{"tags":{"name":"Castorama","shop":"doityourself"},"name":"Castorama","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Easy":{"tags":{"name":"Easy","shop":"doityourself"},"name":"Easy","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Gamma":{"tags":{"name":"Gamma","shop":"doityourself"},"name":"Gamma","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Globus Baumarkt":{"tags":{"name":"Globus Baumarkt","shop":"doityourself"},"name":"Globus Baumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Hagebaumarkt":{"tags":{"name":"Hagebaumarkt","shop":"doityourself"},"name":"Hagebaumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Hellweg":{"tags":{"name":"Hellweg","shop":"doityourself"},"name":"Hellweg","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Home Depot":{"tags":{"name":"Home Depot","shop":"doityourself"},"name":"Home Depot","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Home Hardware":{"tags":{"name":"Home Hardware","shop":"doityourself"},"name":"Home Hardware","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Homebase":{"tags":{"name":"Homebase","shop":"doityourself"},"name":"Homebase","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Hornbach":{"tags":{"name":"Hornbach","shop":"doityourself"},"name":"Hornbach","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Hubo":{"tags":{"name":"Hubo","shop":"doityourself"},"name":"Hubo","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Karwei":{"tags":{"name":"Karwei","shop":"doityourself"},"name":"Karwei","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Lagerhaus":{"tags":{"name":"Lagerhaus","shop":"doityourself"},"name":"Lagerhaus","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Leroy Merlin":{"tags":{"name":"Leroy Merlin","shop":"doityourself"},"name":"Leroy Merlin","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Lowe's":{"tags":{"name":"Lowe's","shop":"doityourself"},"name":"Lowe's","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Lowes":{"tags":{"name":"Lowes","shop":"doityourself"},"name":"Lowes","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Menards":{"tags":{"name":"Menards","shop":"doityourself"},"name":"Menards","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Mr Bricolage":{"tags":{"name":"Mr Bricolage","shop":"doityourself"},"name":"Mr Bricolage","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Mr.Bricolage":{"tags":{"name":"Mr.Bricolage","shop":"doityourself"},"name":"Mr.Bricolage","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/OBI":{"tags":{"name":"OBI","shop":"doityourself"},"name":"OBI","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Point P":{"tags":{"name":"Point P","shop":"doityourself"},"name":"Point P","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Praktiker":{"tags":{"name":"Praktiker","shop":"doityourself"},"name":"Praktiker","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Praxis":{"tags":{"name":"Praxis","shop":"doityourself"},"name":"Praxis","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Rona":{"tags":{"name":"Rona","shop":"doityourself"},"name":"Rona","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Screwfix":{"tags":{"name":"Screwfix","shop":"doityourself"},"name":"Screwfix","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Sonderpreis Baumarkt":{"tags":{"name":"Sonderpreis Baumarkt","shop":"doityourself"},"name":"Sonderpreis Baumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Tekzen":{"tags":{"name":"Tekzen","shop":"doityourself"},"name":"Tekzen","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Toom Baumarkt":{"tags":{"name":"Toom Baumarkt","shop":"doityourself"},"name":"Toom Baumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Weldom":{"tags":{"name":"Weldom","shop":"doityourself"},"name":"Weldom","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Wickes":{"tags":{"name":"Wickes","shop":"doityourself"},"name":"Wickes","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Леруа Мерлен":{"tags":{"name":"Леруа Мерлен","shop":"doityourself"},"name":"Леруа Мерлен","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Мастер":{"tags":{"name":"Мастер","shop":"doityourself"},"name":"Мастер","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Строитель":{"tags":{"name":"Строитель","shop":"doityourself"},"name":"Строитель","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Стройматериалы":{"tags":{"name":"Стройматериалы","shop":"doityourself"},"name":"Стройматериалы","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/カインズホーム":{"tags":{"name":"カインズホーム","shop":"doityourself"},"name":"カインズホーム","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/コメリ":{"tags":{"name":"コメリ","shop":"doityourself"},"name":"コメリ","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/コーナン":{"tags":{"name":"コーナン","shop":"doityourself"},"name":"コーナン","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/dry_cleaning/Cleaners":{"tags":{"name":"Cleaners","shop":"dry_cleaning"},"name":"Cleaners","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/dry_cleaning/Pressing":{"tags":{"name":"Pressing","shop":"dry_cleaning"},"name":"Pressing","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/dry_cleaning/Диана":{"tags":{"name":"Диана","shop":"dry_cleaning"},"name":"Диана","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/dry_cleaning/Химчистка":{"tags":{"name":"Химчистка","shop":"dry_cleaning"},"name":"Химчистка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/dry_cleaning/ホワイト急便":{"tags":{"name":"ホワイト急便","shop":"dry_cleaning"},"name":"ホワイト急便","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/BCC":{"tags":{"name":"BCC","shop":"electronics"},"name":"BCC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Batteries Plus Bulbs":{"tags":{"name":"Batteries Plus Bulbs","shop":"electronics"},"name":"Batteries Plus Bulbs","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Best Buy":{"tags":{"name":"Best Buy","shop":"electronics"},"name":"Best Buy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Boulanger":{"tags":{"name":"Boulanger","shop":"electronics"},"name":"Boulanger","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Currys":{"tags":{"name":"Currys","shop":"electronics"},"name":"Currys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Currys PC World":{"tags":{"name":"Currys PC World","shop":"electronics"},"name":"Currys PC World","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Darty":{"tags":{"name":"Darty","shop":"electronics"},"name":"Darty","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Elektra":{"tags":{"name":"Elektra","shop":"electronics"},"name":"Elektra","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Elgiganten":{"tags":{"name":"Elgiganten","shop":"electronics"},"name":"Elgiganten","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Euronics":{"tags":{"name":"Euronics","shop":"electronics"},"name":"Euronics","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Expert":{"tags":{"name":"Expert","shop":"electronics"},"name":"Expert","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Hartlauer":{"tags":{"name":"Hartlauer","shop":"electronics"},"name":"Hartlauer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Interdiscount":{"tags":{"name":"Interdiscount","shop":"electronics"},"name":"Interdiscount","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/La Curacao":{"tags":{"name":"La Curacao","shop":"electronics"},"name":"La Curacao","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Maplin":{"tags":{"name":"Maplin","shop":"electronics"},"name":"Maplin","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Media Expert":{"tags":{"name":"Media Expert","shop":"electronics"},"name":"Media Expert","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Media Markt":{"tags":{"name":"Media Markt","shop":"electronics"},"name":"Media Markt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Musimundo":{"tags":{"name":"Musimundo","shop":"electronics"},"name":"Musimundo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Neonet":{"tags":{"name":"Neonet","shop":"electronics"},"name":"Neonet","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/RTV Euro AGD":{"tags":{"name":"RTV Euro AGD","shop":"electronics"},"name":"RTV Euro AGD","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Radio Shack":{"tags":{"name":"Radio Shack","shop":"electronics"},"name":"Radio Shack","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Rogers":{"tags":{"name":"Rogers","shop":"electronics"},"name":"Rogers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Samsung":{"tags":{"name":"Samsung","shop":"electronics"},"name":"Samsung","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Saturn":{"tags":{"name":"Saturn","shop":"electronics"},"name":"Saturn","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Sony":{"tags":{"name":"Sony","shop":"electronics"},"name":"Sony","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/The Source":{"tags":{"name":"The Source","shop":"electronics"},"name":"The Source","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Unieuro":{"tags":{"name":"Unieuro","shop":"electronics"},"name":"Unieuro","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/М.Видео":{"tags":{"name":"М.Видео","shop":"electronics"},"name":"М.Видео","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Фокстрот":{"tags":{"name":"Фокстрот","shop":"electronics"},"name":"Фокстрот","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Эксперт":{"tags":{"name":"Эксперт","shop":"electronics"},"name":"Эксперт","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Эльдорадо":{"tags":{"name":"Эльдорадо","shop":"electronics"},"name":"Эльдорадо","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/エディオン":{"tags":{"name":"エディオン","shop":"electronics"},"name":"エディオン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/ケーズデンキ":{"tags":{"name":"ケーズデンキ","shop":"electronics"},"name":"ケーズデンキ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/コジマ":{"tags":{"name":"コジマ","shop":"electronics"},"name":"コジマ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/ヤマダ電機":{"tags":{"name":"ヤマダ電機","shop":"electronics"},"name":"ヤマダ電機","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/全國電子":{"tags":{"name":"全國電子","shop":"electronics"},"name":"全國電子","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/燦坤3C":{"tags":{"name":"燦坤3C","shop":"electronics"},"name":"燦坤3C","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/erotic/Orion":{"tags":{"name":"Orion","shop":"erotic"},"name":"Orion","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/fabric/Ткани":{"tags":{"name":"Ткани","shop":"fabric"},"name":"Ткани","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/farm/Hofladen":{"tags":{"name":"Hofladen","shop":"farm"},"name":"Hofladen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Blume 2000":{"tags":{"name":"Blume 2000","shop":"florist"},"name":"Blume 2000","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Blumen Risse":{"tags":{"name":"Blumen Risse","shop":"florist"},"name":"Blumen Risse","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Fleuriste":{"tags":{"name":"Fleuriste","shop":"florist"},"name":"Fleuriste","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Interflora":{"tags":{"name":"Interflora","shop":"florist"},"name":"Interflora","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Monceau Fleurs":{"tags":{"name":"Monceau Fleurs","shop":"florist"},"name":"Monceau Fleurs","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Virágbolt":{"tags":{"name":"Virágbolt","shop":"florist"},"name":"Virágbolt","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Квіти":{"tags":{"name":"Квіти","shop":"florist"},"name":"Квіти","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Цветочный магазин":{"tags":{"name":"Цветочный магазин","shop":"florist"},"name":"Цветочный магазин","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Цветы":{"tags":{"name":"Цветы","shop":"florist"},"name":"Цветы","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/frame/rumah penduduk":{"tags":{"name":"rumah penduduk","shop":"frame"},"name":"rumah penduduk","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/funeral_directors/The Co-operative Funeralcare":{"tags":{"name":"The Co-operative Funeralcare","shop":"funeral_directors"},"name":"The Co-operative Funeralcare","icon":"cemetery","geometry":["point","area"],"fields":["name","operator","address","building_area","religion","denomination"],"suggestion":true},"shop/funeral_directors/Ритуальные услуги":{"tags":{"name":"Ритуальные услуги","shop":"funeral_directors"},"name":"Ритуальные услуги","icon":"cemetery","geometry":["point","area"],"fields":["name","operator","address","building_area","religion","denomination"],"suggestion":true},"shop/furniture/Aaron's":{"tags":{"name":"Aaron's","shop":"furniture"},"name":"Aaron's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Black Red White":{"tags":{"name":"Black Red White","shop":"furniture"},"name":"Black Red White","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Bodzio":{"tags":{"name":"Bodzio","shop":"furniture"},"name":"Bodzio","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/But":{"tags":{"name":"But","shop":"furniture"},"name":"But","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Conforama":{"tags":{"name":"Conforama","shop":"furniture"},"name":"Conforama","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/DFS":{"tags":{"name":"DFS","shop":"furniture"},"name":"DFS","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Dänisches Bettenlager":{"tags":{"name":"Dänisches Bettenlager","shop":"furniture"},"name":"Dänisches Bettenlager","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Fly":{"tags":{"name":"Fly","shop":"furniture"},"name":"Fly","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Harveys":{"tags":{"name":"Harveys","shop":"furniture"},"name":"Harveys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/IKEA":{"tags":{"name":"IKEA","shop":"furniture"},"name":"IKEA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/JYSK":{"tags":{"name":"JYSK","shop":"furniture"},"name":"JYSK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Kwantum":{"tags":{"name":"Kwantum","shop":"furniture"},"name":"Kwantum","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Leen Bakker":{"tags":{"name":"Leen Bakker","shop":"furniture"},"name":"Leen Bakker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Pier 1 Imports":{"tags":{"name":"Pier 1 Imports","shop":"furniture"},"name":"Pier 1 Imports","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Roller":{"tags":{"name":"Roller","shop":"furniture"},"name":"Roller","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/The Brick":{"tags":{"name":"The Brick","shop":"furniture"},"name":"The Brick","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Меблі":{"tags":{"name":"Меблі","shop":"furniture"},"name":"Меблі","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/ニトリ":{"tags":{"name":"ニトリ","shop":"furniture"},"name":"ニトリ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/garden_centre/Dehner":{"tags":{"name":"Dehner","shop":"garden_centre"},"name":"Dehner","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/garden_centre/Gamm Vert":{"tags":{"name":"Gamm Vert","shop":"garden_centre"},"name":"Gamm Vert","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/garden_centre/Jardiland":{"tags":{"name":"Jardiland","shop":"garden_centre"},"name":"Jardiland","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/garden_centre/Point Vert":{"tags":{"name":"Point Vert","shop":"garden_centre"},"name":"Point Vert","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/garden_centre/Welkoop":{"tags":{"name":"Welkoop","shop":"garden_centre"},"name":"Welkoop","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/garden_centre/Семена":{"tags":{"name":"Семена","shop":"garden_centre"},"name":"Семена","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/gift/Card Factory":{"tags":{"name":"Card Factory","shop":"gift"},"name":"Card Factory","icon":"gift","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/gift/Hallmark":{"tags":{"name":"Hallmark","shop":"gift"},"name":"Hallmark","icon":"gift","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/gift/Подарки":{"tags":{"name":"Подарки","shop":"gift"},"name":"Подарки","icon":"gift","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/greengrocer/Frutería":{"tags":{"name":"Frutería","shop":"greengrocer"},"name":"Frutería","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/greengrocer/Овощи и фрукты":{"tags":{"name":"Овощи и фрукты","shop":"greengrocer"},"name":"Овощи и фрукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Berber":{"tags":{"name":"Berber","shop":"hairdresser"},"name":"Berber","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Cost Cutters":{"tags":{"name":"Cost Cutters","shop":"hairdresser"},"name":"Cost Cutters","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Fantastic Sams":{"tags":{"name":"Fantastic Sams","shop":"hairdresser"},"name":"Fantastic Sams","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Figaro":{"tags":{"name":"Figaro","shop":"hairdresser"},"name":"Figaro","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/First Choice Haircutters":{"tags":{"name":"First Choice Haircutters","shop":"hairdresser"},"name":"First Choice Haircutters","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Franck Provost":{"tags":{"name":"Franck Provost","shop":"hairdresser"},"name":"Franck Provost","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Frizerie":{"tags":{"name":"Frizerie","shop":"hairdresser"},"name":"Frizerie","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Great Clips":{"tags":{"name":"Great Clips","shop":"hairdresser"},"name":"Great Clips","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Haarmonie":{"tags":{"name":"Haarmonie","shop":"hairdresser"},"name":"Haarmonie","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Haarscharf":{"tags":{"name":"Haarscharf","shop":"hairdresser"},"name":"Haarscharf","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Hair Cuttery":{"tags":{"name":"Hair Cuttery","shop":"hairdresser"},"name":"Hair Cuttery","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Hairkiller":{"tags":{"name":"Hairkiller","shop":"hairdresser"},"name":"Hairkiller","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Jean Louis David":{"tags":{"name":"Jean Louis David","shop":"hairdresser"},"name":"Jean Louis David","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Jean-Louis David":{"tags":{"name":"Jean-Louis David","shop":"hairdresser"},"name":"Jean-Louis David","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Klier":{"tags":{"name":"Klier","shop":"hairdresser"},"name":"Klier","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Klipp":{"tags":{"name":"Klipp","shop":"hairdresser"},"name":"Klipp","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Le Salon":{"tags":{"name":"Le Salon","shop":"hairdresser"},"name":"Le Salon","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Marco Aldany":{"tags":{"name":"Marco Aldany","shop":"hairdresser"},"name":"Marco Aldany","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Peluquería":{"tags":{"name":"Peluquería","shop":"hairdresser"},"name":"Peluquería","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Salon fryzjerski":{"tags":{"name":"Salon fryzjerski","shop":"hairdresser"},"name":"Salon fryzjerski","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Sport Clips":{"tags":{"name":"Sport Clips","shop":"hairdresser"},"name":"Sport Clips","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Super Cuts":{"tags":{"name":"Super Cuts","shop":"hairdresser"},"name":"Super Cuts","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Supercuts":{"tags":{"name":"Supercuts","shop":"hairdresser"},"name":"Supercuts","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Tchip":{"tags":{"name":"Tchip","shop":"hairdresser"},"name":"Tchip","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/The Barber Shop":{"tags":{"name":"The Barber Shop","shop":"hairdresser"},"name":"The Barber Shop","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Toni & Guy":{"tags":{"name":"Toni & Guy","shop":"hairdresser"},"name":"Toni & Guy","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Top Hair":{"tags":{"name":"Top Hair","shop":"hairdresser"},"name":"Top Hair","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Локон":{"tags":{"name":"Локон","shop":"hairdresser"},"name":"Локон","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Парикмахерская":{"tags":{"name":"Парикмахерская","shop":"hairdresser"},"name":"Парикмахерская","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Перукарня":{"tags":{"name":"Перукарня","shop":"hairdresser"},"name":"Перукарня","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Салон красоты":{"tags":{"name":"Салон красоты","shop":"hairdresser"},"name":"Салон красоты","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Стиль":{"tags":{"name":"Стиль","shop":"hairdresser"},"name":"Стиль","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Шарм":{"tags":{"name":"Шарм","shop":"hairdresser"},"name":"Шарм","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/حلاق":{"tags":{"name":"حلاق","shop":"hairdresser"},"name":"حلاق","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/1000 мелочей":{"tags":{"name":"1000 мелочей","shop":"hardware"},"name":"1000 мелочей","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Ferretería":{"tags":{"name":"Ferretería","shop":"hardware"},"name":"Ferretería","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Harbor Freight Tools":{"tags":{"name":"Harbor Freight Tools","shop":"hardware"},"name":"Harbor Freight Tools","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Quincaillerie":{"tags":{"name":"Quincaillerie","shop":"hardware"},"name":"Quincaillerie","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/True Value":{"tags":{"name":"True Value","shop":"hardware"},"name":"True Value","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Würth":{"tags":{"name":"Würth","shop":"hardware"},"name":"Würth","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Промтовары":{"tags":{"name":"Промтовары","shop":"hardware"},"name":"Промтовары","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Сантехника":{"tags":{"name":"Сантехника","shop":"hardware"},"name":"Сантехника","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Товары для дома":{"tags":{"name":"Товары для дома","shop":"hardware"},"name":"Товары для дома","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Хозтовары":{"tags":{"name":"Хозтовары","shop":"hardware"},"name":"Хозтовары","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hearing_aids/Amplifon":{"tags":{"name":"Amplifon","shop":"hearing_aids"},"name":"Amplifon","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hearing_aids/Geers":{"tags":{"name":"Geers","shop":"hearing_aids"},"name":"Geers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hearing_aids/Kind Hörgeräte":{"tags":{"name":"Kind Hörgeräte","shop":"hearing_aids"},"name":"Kind Hörgeräte","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hearing_aids/amplifon":{"tags":{"name":"amplifon","shop":"hearing_aids"},"name":"amplifon","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hifi/Bang & Olufsen":{"tags":{"name":"Bang & Olufsen","shop":"hifi"},"name":"Bang & Olufsen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/houseware/Blokker":{"tags":{"name":"Blokker","shop":"houseware"},"name":"Blokker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/houseware/Marskramer":{"tags":{"name":"Marskramer","shop":"houseware"},"name":"Marskramer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/houseware/Xenos":{"tags":{"name":"Xenos","shop":"houseware"},"name":"Xenos","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/interior_decoration/Casa":{"tags":{"name":"Casa","shop":"interior_decoration"},"name":"Casa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/interior_decoration/Depot":{"tags":{"name":"Depot","shop":"interior_decoration"},"name":"Depot","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/585":{"tags":{"name":"585","shop":"jewelry"},"name":"585","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Apart":{"tags":{"name":"Apart","shop":"jewelry"},"name":"Apart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Bijou Brigitte":{"tags":{"name":"Bijou Brigitte","shop":"jewelry"},"name":"Bijou Brigitte","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Christ":{"tags":{"name":"Christ","shop":"jewelry"},"name":"Christ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Claire's":{"tags":{"name":"Claire's","shop":"jewelry"},"name":"Claire's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Ernest Jones":{"tags":{"name":"Ernest Jones","shop":"jewelry"},"name":"Ernest Jones","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/H Samuel":{"tags":{"name":"H Samuel","shop":"jewelry"},"name":"H Samuel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/James Avery Jewelry":{"tags":{"name":"James Avery Jewelry","shop":"jewelry"},"name":"James Avery Jewelry","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Julien d'Orcel":{"tags":{"name":"Julien d'Orcel","shop":"jewelry"},"name":"Julien d'Orcel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Kay Jewelers":{"tags":{"name":"Kay Jewelers","shop":"jewelry"},"name":"Kay Jewelers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Pandora":{"tags":{"name":"Pandora","shop":"jewelry"},"name":"Pandora","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Swarovski":{"tags":{"name":"Swarovski","shop":"jewelry"},"name":"Swarovski","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Адамас":{"tags":{"name":"Адамас","shop":"jewelry"},"name":"Адамас","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Золото":{"tags":{"name":"Золото","shop":"jewelry"},"name":"Золото","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/KIOS":{"tags":{"name":"KIOS","shop":"kiosk"},"name":"KIOS","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Kiosko":{"tags":{"name":"Kiosko","shop":"kiosk"},"name":"Kiosko","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Kiosque":{"tags":{"name":"Kiosque","shop":"kiosk"},"name":"Kiosque","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Kolporter":{"tags":{"name":"Kolporter","shop":"kiosk"},"name":"Kolporter","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Lietuvos spauda":{"tags":{"name":"Lietuvos spauda","shop":"kiosk"},"name":"Lietuvos spauda","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Narvesen":{"tags":{"name":"Narvesen","shop":"kiosk"},"name":"Narvesen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Pressbyrån":{"tags":{"name":"Pressbyrån","shop":"kiosk"},"name":"Pressbyrån","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Pulpería":{"tags":{"name":"Pulpería","shop":"kiosk"},"name":"Pulpería","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/R-Kioski":{"tags":{"name":"R-Kioski","shop":"kiosk"},"name":"R-Kioski","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Ruch":{"tags":{"name":"Ruch","shop":"kiosk"},"name":"Ruch","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Tabak Trafik":{"tags":{"name":"Tabak Trafik","shop":"kiosk"},"name":"Tabak Trafik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Tisak":{"tags":{"name":"Tisak","shop":"kiosk"},"name":"Tisak","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Trafik":{"tags":{"name":"Trafik","shop":"kiosk"},"name":"Trafik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Trafika":{"tags":{"name":"Trafika","shop":"kiosk"},"name":"Trafika","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Trinkhalle":{"tags":{"name":"Trinkhalle","shop":"kiosk"},"name":"Trinkhalle","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Белсоюзпечать":{"tags":{"name":"Белсоюзпечать","shop":"kiosk"},"name":"Белсоюзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Киоск":{"tags":{"name":"Киоск","shop":"kiosk"},"name":"Киоск","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/მარკეტი (Market)":{"tags":{"name":"მარკეტი (Market)","shop":"kiosk"},"name":"მარკეტი (Market)","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kitchen/Cuisinella":{"tags":{"name":"Cuisinella","shop":"kitchen"},"name":"Cuisinella","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kitchen/Home Utensils":{"tags":{"name":"Home Utensils","shop":"kitchen"},"name":"Home Utensils","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/laundry/Launderette":{"tags":{"name":"Launderette","shop":"laundry"},"name":"Launderette","icon":"laundry","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/laundry/Lavandería":{"tags":{"name":"Lavandería","shop":"laundry"},"name":"Lavandería","icon":"laundry","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/laundry/コインランドリー":{"tags":{"name":"コインランドリー","shop":"laundry"},"name":"コインランドリー","icon":"laundry","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/lottery/Loteria de la Provincia":{"tags":{"name":"Loteria de la Provincia","shop":"lottery"},"name":"Loteria de la Provincia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/lottery/Lotería Nacional":{"tags":{"name":"Lotería Nacional","shop":"lottery"},"name":"Lotería Nacional","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/lottery/Lotería de la Provincia":{"tags":{"name":"Lotería de la Provincia","shop":"lottery"},"name":"Lotería de la Provincia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/lottery/Lotto":{"tags":{"name":"Lotto","shop":"lottery"},"name":"Lotto","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/lottery/Lottózó":{"tags":{"name":"Lottózó","shop":"lottery"},"name":"Lottózó","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/lottery/ONCE":{"tags":{"name":"ONCE","shop":"lottery"},"name":"ONCE","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mall/Торговый центр":{"tags":{"name":"Торговый центр","shop":"mall"},"name":"Торговый центр","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/massage/Massage Envy":{"tags":{"name":"Massage Envy","shop":"massage"},"name":"Massage Envy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/medical_supply/Pofam-Poznań":{"tags":{"name":"Pofam-Poznań","shop":"medical_supply"},"name":"Pofam-Poznań","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/3 Store":{"tags":{"name":"3 Store","shop":"mobile_phone"},"name":"3 Store","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/AT&T":{"tags":{"name":"AT&T","shop":"mobile_phone"},"name":"AT&T","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Bell":{"tags":{"name":"Bell","shop":"mobile_phone"},"name":"Bell","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Bitė":{"tags":{"name":"Bitė","shop":"mobile_phone"},"name":"Bitė","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Boost Mobile":{"tags":{"name":"Boost Mobile","shop":"mobile_phone"},"name":"Boost Mobile","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Carphone Warehouse":{"tags":{"name":"Carphone Warehouse","shop":"mobile_phone"},"name":"Carphone Warehouse","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Claro":{"tags":{"name":"Claro","shop":"mobile_phone"},"name":"Claro","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Cricket Wireless":{"tags":{"name":"Cricket Wireless","shop":"mobile_phone"},"name":"Cricket Wireless","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Digicel":{"tags":{"name":"Digicel","shop":"mobile_phone"},"name":"Digicel","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/EE":{"tags":{"name":"EE","shop":"mobile_phone"},"name":"EE","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/MetroPCS":{"tags":{"name":"MetroPCS","shop":"mobile_phone"},"name":"MetroPCS","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Movistar":{"tags":{"name":"Movistar","shop":"mobile_phone"},"name":"Movistar","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/O2":{"tags":{"name":"O2","shop":"mobile_phone"},"name":"O2","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Orange":{"tags":{"name":"Orange","shop":"mobile_phone"},"name":"Orange","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Personal":{"tags":{"name":"Personal","shop":"mobile_phone"},"name":"Personal","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Play":{"tags":{"name":"Play","shop":"mobile_phone"},"name":"Play","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Plus":{"tags":{"name":"Plus","shop":"mobile_phone"},"name":"Plus","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/SFR":{"tags":{"name":"SFR","shop":"mobile_phone"},"name":"SFR","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Sprint":{"tags":{"name":"Sprint","shop":"mobile_phone"},"name":"Sprint","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/T-Mobile":{"tags":{"name":"T-Mobile","shop":"mobile_phone"},"name":"T-Mobile","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/TIM":{"tags":{"name":"TIM","shop":"mobile_phone"},"name":"TIM","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Telcel":{"tags":{"name":"Telcel","shop":"mobile_phone"},"name":"Telcel","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Tele2":{"tags":{"name":"Tele2","shop":"mobile_phone"},"name":"Tele2","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Telekom":{"tags":{"name":"Telekom","shop":"mobile_phone"},"name":"Telekom","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Telekom Shop":{"tags":{"name":"Telekom Shop","shop":"mobile_phone"},"name":"Telekom Shop","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Telenor":{"tags":{"name":"Telenor","shop":"mobile_phone"},"name":"Telenor","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Telus":{"tags":{"name":"Telus","shop":"mobile_phone"},"name":"Telus","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/The Phone House":{"tags":{"name":"The Phone House","shop":"mobile_phone"},"name":"The Phone House","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Three":{"tags":{"name":"Three","shop":"mobile_phone"},"name":"Three","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Tim":{"tags":{"name":"Tim","shop":"mobile_phone"},"name":"Tim","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Télécentre":{"tags":{"name":"Télécentre","shop":"mobile_phone"},"name":"Télécentre","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Verizon":{"tags":{"name":"Verizon","shop":"mobile_phone"},"name":"Verizon","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Verizon Wireless":{"tags":{"name":"Verizon Wireless","shop":"mobile_phone"},"name":"Verizon Wireless","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Vodafone":{"tags":{"name":"Vodafone","shop":"mobile_phone"},"name":"Vodafone","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Vodafone Shop":{"tags":{"name":"Vodafone Shop","shop":"mobile_phone"},"name":"Vodafone Shop","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Wind":{"tags":{"name":"Wind","shop":"mobile_phone"},"name":"Wind","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Yoigo":{"tags":{"name":"Yoigo","shop":"mobile_phone"},"name":"Yoigo","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/au":{"tags":{"name":"au","shop":"mobile_phone"},"name":"au","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/auショップ":{"tags":{"name":"auショップ","shop":"mobile_phone"},"name":"auショップ","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/mobilcom debitel":{"tags":{"name":"mobilcom debitel","shop":"mobile_phone"},"name":"mobilcom debitel","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Алло":{"tags":{"name":"Алло","shop":"mobile_phone"},"name":"Алло","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Билайн":{"tags":{"name":"Билайн","shop":"mobile_phone"},"name":"Билайн","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Евросеть":{"tags":{"name":"Евросеть","shop":"mobile_phone"},"name":"Евросеть","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Київстар":{"tags":{"name":"Київстар","shop":"mobile_phone"},"name":"Київстар","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/МТС":{"tags":{"name":"МТС","shop":"mobile_phone"},"name":"МТС","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Мегафон":{"tags":{"name":"Мегафон","shop":"mobile_phone"},"name":"Мегафон","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Связной":{"tags":{"name":"Связной","shop":"mobile_phone"},"name":"Связной","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Теле2":{"tags":{"name":"Теле2","shop":"mobile_phone"},"name":"Теле2","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/ソフトバンクショップ":{"tags":{"name":"ソフトバンクショップ","shop":"mobile_phone"},"name":"ソフトバンクショップ","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/ドコモショップ":{"tags":{"name":"ドコモショップ","shop":"mobile_phone"},"name":"ドコモショップ","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/money_lender/Money Mart":{"tags":{"name":"Money Mart","shop":"money_lender"},"name":"Money Mart","icon":"bank","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","currency_multi"],"suggestion":true},"shop/motorcycle/Harley Davidson":{"tags":{"name":"Harley Davidson","shop":"motorcycle"},"name":"Harley Davidson","icon":"scooter","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/motorcycle/Yamaha":{"tags":{"name":"Yamaha","shop":"motorcycle"},"name":"Yamaha","icon":"scooter","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/music/HMV":{"tags":{"name":"HMV","shop":"music"},"name":"HMV","icon":"music","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/musical_instrument/Guitar Center":{"tags":{"name":"Guitar Center","shop":"musical_instrument"},"name":"Guitar Center","icon":"music","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Edicola":{"tags":{"name":"Edicola","shop":"newsagent"},"name":"Edicola","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Maison de la Presse":{"tags":{"name":"Maison de la Presse","shop":"newsagent"},"name":"Maison de la Presse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Relay":{"tags":{"name":"Relay","shop":"newsagent"},"name":"Relay","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Tabac Presse":{"tags":{"name":"Tabac Presse","shop":"newsagent"},"name":"Tabac Presse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/WHSmith":{"tags":{"name":"WHSmith","shop":"newsagent"},"name":"WHSmith","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Витебскоблсоюзпечать":{"tags":{"name":"Витебскоблсоюзпечать","shop":"newsagent"},"name":"Витебскоблсоюзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Первая полоса":{"tags":{"name":"Первая полоса","shop":"newsagent"},"name":"Первая полоса","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Печать":{"tags":{"name":"Печать","shop":"newsagent"},"name":"Печать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Роспечать":{"tags":{"name":"Роспечать","shop":"newsagent"},"name":"Роспечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Союзпечать":{"tags":{"name":"Союзпечать","shop":"newsagent"},"name":"Союзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Alain Afflelou":{"tags":{"name":"Alain Afflelou","shop":"optician"},"name":"Alain Afflelou","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Apollo":{"tags":{"name":"Apollo","shop":"optician"},"name":"Apollo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Atol":{"tags":{"name":"Atol","shop":"optician"},"name":"Atol","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Boots Opticians":{"tags":{"name":"Boots Opticians","shop":"optician"},"name":"Boots Opticians","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Fielmann":{"tags":{"name":"Fielmann","shop":"optician"},"name":"Fielmann","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/General Óptica":{"tags":{"name":"General Óptica","shop":"optician"},"name":"General Óptica","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Grand Optical":{"tags":{"name":"Grand Optical","shop":"optician"},"name":"Grand Optical","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Générale d'Optique":{"tags":{"name":"Générale d'Optique","shop":"optician"},"name":"Générale d'Optique","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Hakim Optical":{"tags":{"name":"Hakim Optical","shop":"optician"},"name":"Hakim Optical","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Hans Anders":{"tags":{"name":"Hans Anders","shop":"optician"},"name":"Hans Anders","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Krys":{"tags":{"name":"Krys","shop":"optician"},"name":"Krys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Les Opticiens Mutualistes":{"tags":{"name":"Les Opticiens Mutualistes","shop":"optician"},"name":"Les Opticiens Mutualistes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Optic 2000":{"tags":{"name":"Optic 2000","shop":"optician"},"name":"Optic 2000","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Optical Center":{"tags":{"name":"Optical Center","shop":"optician"},"name":"Optical Center","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Pearle":{"tags":{"name":"Pearle","shop":"optician"},"name":"Pearle","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Pearle Vision":{"tags":{"name":"Pearle Vision","shop":"optician"},"name":"Pearle Vision","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Specsavers":{"tags":{"name":"Specsavers","shop":"optician"},"name":"Specsavers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Sunglass Hut":{"tags":{"name":"Sunglass Hut","shop":"optician"},"name":"Sunglass Hut","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Synoptik":{"tags":{"name":"Synoptik","shop":"optician"},"name":"Synoptik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Vision Express":{"tags":{"name":"Vision Express","shop":"optician"},"name":"Vision Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/แว่นท็อปเจริญ":{"tags":{"name":"แว่นท็อปเจริญ","shop":"optician"},"name":"แว่นท็อปเจริญ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/メガネスーパー":{"tags":{"name":"メガネスーパー","shop":"optician"},"name":"メガネスーパー","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/眼鏡市場":{"tags":{"name":"眼鏡市場","shop":"optician"},"name":"眼鏡市場","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/outdoor/Mountain Warehouse":{"tags":{"name":"Mountain Warehouse","shop":"outdoor"},"name":"Mountain Warehouse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/outdoor/REI":{"tags":{"name":"REI","shop":"outdoor"},"name":"REI","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/outdoor/Рыболов":{"tags":{"name":"Рыболов","shop":"outdoor"},"name":"Рыболов","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/paint/Benjamin Moore":{"tags":{"name":"Benjamin Moore","shop":"paint"},"name":"Benjamin Moore","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/paint/Comex":{"tags":{"name":"Comex","shop":"paint"},"name":"Comex","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/paint/Jotun":{"tags":{"name":"Jotun","shop":"paint"},"name":"Jotun","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/paint/National Paints":{"tags":{"name":"National Paints","shop":"paint"},"name":"National Paints","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/paint/Sherwin Williams":{"tags":{"name":"Sherwin Williams","shop":"paint"},"name":"Sherwin Williams","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/paint/Sherwin-Williams Paints":{"tags":{"name":"Sherwin-Williams Paints","shop":"paint"},"name":"Sherwin-Williams Paints","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pawnbroker/Cash Converters":{"tags":{"name":"Cash Converters","shop":"pawnbroker"},"name":"Cash Converters","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pawnbroker/Lombard":{"tags":{"name":"Lombard","shop":"pawnbroker"},"name":"Lombard","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pawnbroker/Palawan Pawnshop":{"tags":{"name":"Palawan Pawnshop","shop":"pawnbroker"},"name":"Palawan Pawnshop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Das Futterhaus":{"tags":{"name":"Das Futterhaus","shop":"pet"},"name":"Das Futterhaus","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Fressnapf":{"tags":{"name":"Fressnapf","shop":"pet"},"name":"Fressnapf","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Global Pet Foods":{"tags":{"name":"Global Pet Foods","shop":"pet"},"name":"Global Pet Foods","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Maxi Zoo":{"tags":{"name":"Maxi Zoo","shop":"pet"},"name":"Maxi Zoo","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Pet Valu":{"tags":{"name":"Pet Valu","shop":"pet"},"name":"Pet Valu","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/PetSmart":{"tags":{"name":"PetSmart","shop":"pet"},"name":"PetSmart","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Petco":{"tags":{"name":"Petco","shop":"pet"},"name":"Petco","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Pets at Home":{"tags":{"name":"Pets at Home","shop":"pet"},"name":"Pets at Home","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Бетховен":{"tags":{"name":"Бетховен","shop":"pet"},"name":"Бетховен","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Зоотовары":{"tags":{"name":"Зоотовары","shop":"pet"},"name":"Зоотовары","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Четыре лапы":{"tags":{"name":"Четыре лапы","shop":"pet"},"name":"Четыре лапы","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/second_hand/Goodwill":{"tags":{"name":"Goodwill","shop":"second_hand"},"name":"Goodwill","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/second_hand/Value Village":{"tags":{"name":"Value Village","shop":"second_hand"},"name":"Value Village","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Aldo":{"tags":{"name":"Aldo","shop":"shoes"},"name":"Aldo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Bata":{"tags":{"name":"Bata","shop":"shoes"},"name":"Bata","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Besson Chaussures":{"tags":{"name":"Besson Chaussures","shop":"shoes"},"name":"Besson Chaussures","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Brantano":{"tags":{"name":"Brantano","shop":"shoes"},"name":"Brantano","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/CCC":{"tags":{"name":"CCC","shop":"shoes"},"name":"CCC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Camper":{"tags":{"name":"Camper","shop":"shoes"},"name":"Camper","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Chaussea":{"tags":{"name":"Chaussea","shop":"shoes"},"name":"Chaussea","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Clarks":{"tags":{"name":"Clarks","shop":"shoes"},"name":"Clarks","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Converse":{"tags":{"name":"Converse","shop":"shoes"},"name":"Converse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Crocs":{"tags":{"name":"Crocs","shop":"shoes"},"name":"Crocs","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/DSW":{"tags":{"name":"DSW","shop":"shoes"},"name":"DSW","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Deichmann":{"tags":{"name":"Deichmann","shop":"shoes"},"name":"Deichmann","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Dosenbach":{"tags":{"name":"Dosenbach","shop":"shoes"},"name":"Dosenbach","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Ecco":{"tags":{"name":"Ecco","shop":"shoes"},"name":"Ecco","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Famous Footwear":{"tags":{"name":"Famous Footwear","shop":"shoes"},"name":"Famous Footwear","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Foot Locker":{"tags":{"name":"Foot Locker","shop":"shoes"},"name":"Foot Locker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Geox":{"tags":{"name":"Geox","shop":"shoes"},"name":"Geox","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Kari":{"tags":{"name":"Kari","shop":"shoes"},"name":"Kari","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/La Halle aux Chaussures":{"tags":{"name":"La Halle aux Chaussures","shop":"shoes"},"name":"La Halle aux Chaussures","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Mephisto":{"tags":{"name":"Mephisto","shop":"shoes"},"name":"Mephisto","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Minelli":{"tags":{"name":"Minelli","shop":"shoes"},"name":"Minelli","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/New Balance":{"tags":{"name":"New Balance","shop":"shoes"},"name":"New Balance","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Payless":{"tags":{"name":"Payless","shop":"shoes"},"name":"Payless","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Payless Shoe Source":{"tags":{"name":"Payless Shoe Source","shop":"shoes"},"name":"Payless Shoe Source","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Payless ShoeSource":{"tags":{"name":"Payless ShoeSource","shop":"shoes"},"name":"Payless ShoeSource","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Quick Schuh":{"tags":{"name":"Quick Schuh","shop":"shoes"},"name":"Quick Schuh","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Rack Room Shoes":{"tags":{"name":"Rack Room Shoes","shop":"shoes"},"name":"Rack Room Shoes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Reno":{"tags":{"name":"Reno","shop":"shoes"},"name":"Reno","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Rieker":{"tags":{"name":"Rieker","shop":"shoes"},"name":"Rieker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Salamander":{"tags":{"name":"Salamander","shop":"shoes"},"name":"Salamander","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/San Marina":{"tags":{"name":"San Marina","shop":"shoes"},"name":"San Marina","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Scapino":{"tags":{"name":"Scapino","shop":"shoes"},"name":"Scapino","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Shoe Carnival":{"tags":{"name":"Shoe Carnival","shop":"shoes"},"name":"Shoe Carnival","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Shoe Zone":{"tags":{"name":"Shoe Zone","shop":"shoes"},"name":"Shoe Zone","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Siemes Schuhcenter":{"tags":{"name":"Siemes Schuhcenter","shop":"shoes"},"name":"Siemes Schuhcenter","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Skechers":{"tags":{"name":"Skechers","shop":"shoes"},"name":"Skechers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Tamaris":{"tags":{"name":"Tamaris","shop":"shoes"},"name":"Tamaris","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/vanHaren":{"tags":{"name":"vanHaren","shop":"shoes"},"name":"vanHaren","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Éram":{"tags":{"name":"Éram","shop":"shoes"},"name":"Éram","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Ремонт обуви":{"tags":{"name":"Ремонт обуви","shop":"shoes"},"name":"Ремонт обуви","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/ЦентрОбувь":{"tags":{"name":"ЦентрОбувь","shop":"shoes"},"name":"ЦентрОбувь","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Юничел":{"tags":{"name":"Юничел","shop":"shoes"},"name":"Юничел","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/東京靴流通センター":{"tags":{"name":"東京靴流通センター","shop":"shoes"},"name":"東京靴流通センター","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Aktiesport":{"tags":{"name":"Aktiesport","shop":"sports"},"name":"Aktiesport","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Big 5 Sporting Goods":{"tags":{"name":"Big 5 Sporting Goods","shop":"sports"},"name":"Big 5 Sporting Goods","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Decathlon":{"tags":{"name":"Decathlon","shop":"sports"},"name":"Decathlon","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Dick's Sporting Goods":{"tags":{"name":"Dick's Sporting Goods","shop":"sports"},"name":"Dick's Sporting Goods","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Hervis":{"tags":{"name":"Hervis","shop":"sports"},"name":"Hervis","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Intersport":{"tags":{"name":"Intersport","shop":"sports"},"name":"Intersport","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/JD Sports":{"tags":{"name":"JD Sports","shop":"sports"},"name":"JD Sports","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Sport 2000":{"tags":{"name":"Sport 2000","shop":"sports"},"name":"Sport 2000","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Sports Authority":{"tags":{"name":"Sports Authority","shop":"sports"},"name":"Sports Authority","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Sports Direct":{"tags":{"name":"Sports Direct","shop":"sports"},"name":"Sports Direct","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Спортмастер":{"tags":{"name":"Спортмастер","shop":"sports"},"name":"Спортмастер","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Спорттовары":{"tags":{"name":"Спорттовары","shop":"sports"},"name":"Спорттовары","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Bureau Vallée":{"tags":{"name":"Bureau Vallée","shop":"stationery"},"name":"Bureau Vallée","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Libro":{"tags":{"name":"Libro","shop":"stationery"},"name":"Libro","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/McPaper":{"tags":{"name":"McPaper","shop":"stationery"},"name":"McPaper","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Office Depot":{"tags":{"name":"Office Depot","shop":"stationery"},"name":"Office Depot","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Office Max":{"tags":{"name":"Office Max","shop":"stationery"},"name":"Office Max","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Officeworks":{"tags":{"name":"Officeworks","shop":"stationery"},"name":"Officeworks","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Pagro":{"tags":{"name":"Pagro","shop":"stationery"},"name":"Pagro","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Paperchase":{"tags":{"name":"Paperchase","shop":"stationery"},"name":"Paperchase","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Ryman":{"tags":{"name":"Ryman","shop":"stationery"},"name":"Ryman","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Staples":{"tags":{"name":"Staples","shop":"stationery"},"name":"Staples","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Канцтовары":{"tags":{"name":"Канцтовары","shop":"stationery"},"name":"Канцтовары","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/A&O":{"tags":{"name":"A&O","shop":"supermarket"},"name":"A&O","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/A101":{"tags":{"name":"A101","shop":"supermarket"},"name":"A101","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/AD Delhaize":{"tags":{"name":"AD Delhaize","shop":"supermarket"},"name":"AD Delhaize","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/ADEG":{"tags":{"name":"ADEG","shop":"supermarket"},"name":"ADEG","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Ahorramás":{"tags":{"name":"Ahorramás","shop":"supermarket"},"name":"Ahorramás","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Albert":{"tags":{"name":"Albert","shop":"supermarket"},"name":"Albert","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Albert Heijn":{"tags":{"name":"Albert Heijn","shop":"supermarket"},"name":"Albert Heijn","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Albertsons":{"tags":{"name":"Albertsons","shop":"supermarket"},"name":"Albertsons","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Aldi":{"tags":{"name":"Aldi","shop":"supermarket"},"name":"Aldi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Aldi Nord":{"tags":{"name":"Aldi Nord","shop":"supermarket"},"name":"Aldi Nord","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Aldi Süd":{"tags":{"name":"Aldi Süd","shop":"supermarket"},"name":"Aldi Süd","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Alimerka":{"tags":{"name":"Alimerka","shop":"supermarket"},"name":"Alimerka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Alnatura":{"tags":{"name":"Alnatura","shop":"supermarket"},"name":"Alnatura","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Asda":{"tags":{"name":"Asda","shop":"supermarket"},"name":"Asda","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Atac":{"tags":{"name":"Atac","shop":"supermarket"},"name":"Atac","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Atacadão":{"tags":{"name":"Atacadão","shop":"supermarket"},"name":"Atacadão","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Auchan":{"tags":{"name":"Auchan","shop":"supermarket"},"name":"Auchan","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/BM":{"tags":{"name":"BM","shop":"supermarket"},"name":"BM","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Biedronka":{"tags":{"name":"Biedronka","shop":"supermarket"},"name":"Biedronka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Big C":{"tags":{"name":"Big C","shop":"supermarket"},"name":"Big C","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Billa":{"tags":{"name":"Billa","shop":"supermarket"},"name":"Billa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Bim":{"tags":{"name":"Bim","shop":"supermarket"},"name":"Bim","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Biocoop":{"tags":{"name":"Biocoop","shop":"supermarket"},"name":"Biocoop","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Bodega Aurrera":{"tags":{"name":"Bodega Aurrera","shop":"supermarket"},"name":"Bodega Aurrera","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Budgens":{"tags":{"name":"Budgens","shop":"supermarket"},"name":"Budgens","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Bulk Barn":{"tags":{"name":"Bulk Barn","shop":"supermarket"},"name":"Bulk Barn","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Bunnpris":{"tags":{"name":"Bunnpris","shop":"supermarket"},"name":"Bunnpris","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/CONAD":{"tags":{"name":"CONAD","shop":"supermarket"},"name":"CONAD","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/CRAI":{"tags":{"name":"CRAI","shop":"supermarket"},"name":"CRAI","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Caprabo":{"tags":{"name":"Caprabo","shop":"supermarket"},"name":"Caprabo","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Cargills Food City":{"tags":{"name":"Cargills Food City","shop":"supermarket"},"name":"Cargills Food City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Carrefour":{"tags":{"name":"Carrefour","shop":"supermarket"},"name":"Carrefour","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Carrefour City":{"tags":{"name":"Carrefour City","shop":"supermarket"},"name":"Carrefour City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Carrefour Contact":{"tags":{"name":"Carrefour Contact","shop":"supermarket"},"name":"Carrefour Contact","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Carrefour Express":{"tags":{"name":"Carrefour Express","shop":"supermarket"},"name":"Carrefour Express","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Centre Commercial E. Leclerc":{"tags":{"name":"Centre Commercial E. Leclerc","shop":"supermarket"},"name":"Centre Commercial E. Leclerc","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Checkers":{"tags":{"name":"Checkers","shop":"supermarket"},"name":"Checkers","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Chedraui":{"tags":{"name":"Chedraui","shop":"supermarket"},"name":"Chedraui","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Co-Op":{"tags":{"name":"Co-Op","shop":"supermarket"},"name":"Co-Op","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Co-op":{"tags":{"name":"Co-op","shop":"supermarket"},"name":"Co-op","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Co-operative":{"tags":{"name":"Co-operative","shop":"supermarket"},"name":"Co-operative","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Coles":{"tags":{"name":"Coles","shop":"supermarket"},"name":"Coles","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Colmado":{"tags":{"name":"Colmado","shop":"supermarket"},"name":"Colmado","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Colruyt":{"tags":{"name":"Colruyt","shop":"supermarket"},"name":"Colruyt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Combi":{"tags":{"name":"Combi","shop":"supermarket"},"name":"Combi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Comercial Mexicana":{"tags":{"name":"Comercial Mexicana","shop":"supermarket"},"name":"Comercial Mexicana","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Conad":{"tags":{"name":"Conad","shop":"supermarket"},"name":"Conad","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Conad City":{"tags":{"name":"Conad City","shop":"supermarket"},"name":"Conad City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Condis":{"tags":{"name":"Condis","shop":"supermarket"},"name":"Condis","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Consum":{"tags":{"name":"Consum","shop":"supermarket"},"name":"Consum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Continente":{"tags":{"name":"Continente","shop":"supermarket"},"name":"Continente","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Coop":{"tags":{"name":"Coop","shop":"supermarket"},"name":"Coop","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Coop Extra":{"tags":{"name":"Coop Extra","shop":"supermarket"},"name":"Coop Extra","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Coop Konsum":{"tags":{"name":"Coop Konsum","shop":"supermarket"},"name":"Coop Konsum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Costco Gasoline":{"tags":{"name":"Costco Gasoline","shop":"supermarket"},"name":"Costco Gasoline","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Coto":{"tags":{"name":"Coto","shop":"supermarket"},"name":"Coto","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Countdown":{"tags":{"name":"Countdown","shop":"supermarket"},"name":"Countdown","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Coviran":{"tags":{"name":"Coviran","shop":"supermarket"},"name":"Coviran","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Covirán":{"tags":{"name":"Covirán","shop":"supermarket"},"name":"Covirán","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Crai":{"tags":{"name":"Crai","shop":"supermarket"},"name":"Crai","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Cub Foods":{"tags":{"name":"Cub Foods","shop":"supermarket"},"name":"Cub Foods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Dagli'Brugsen":{"tags":{"name":"Dagli'Brugsen","shop":"supermarket"},"name":"Dagli'Brugsen","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Deen":{"tags":{"name":"Deen","shop":"supermarket"},"name":"Deen","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Delhaize":{"tags":{"name":"Delhaize","shop":"supermarket"},"name":"Delhaize","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Delikatesy Centrum":{"tags":{"name":"Delikatesy Centrum","shop":"supermarket"},"name":"Delikatesy Centrum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Denner":{"tags":{"name":"Denner","shop":"supermarket"},"name":"Denner","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Despar":{"tags":{"name":"Despar","shop":"supermarket"},"name":"Despar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Despensa Familiar":{"tags":{"name":"Despensa Familiar","shop":"supermarket"},"name":"Despensa Familiar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Dia":{"tags":{"name":"Dia","shop":"supermarket"},"name":"Dia","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Dia %":{"tags":{"name":"Dia %","shop":"supermarket"},"name":"Dia %","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Dia Market":{"tags":{"name":"Dia Market","shop":"supermarket"},"name":"Dia Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Dino":{"tags":{"name":"Dino","shop":"supermarket"},"name":"Dino","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Dirk van den Broek":{"tags":{"name":"Dirk van den Broek","shop":"supermarket"},"name":"Dirk van den Broek","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Disco":{"tags":{"name":"Disco","shop":"supermarket"},"name":"Disco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Diska":{"tags":{"name":"Diska","shop":"supermarket"},"name":"Diska","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Dunnes Stores":{"tags":{"name":"Dunnes Stores","shop":"supermarket"},"name":"Dunnes Stores","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/E-Center":{"tags":{"name":"E-Center","shop":"supermarket"},"name":"E-Center","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/E. Leclerc":{"tags":{"name":"E. Leclerc","shop":"supermarket"},"name":"E. Leclerc","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/E. Leclerc Drive":{"tags":{"name":"E. Leclerc Drive","shop":"supermarket"},"name":"E. Leclerc Drive","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/EMTÉ":{"tags":{"name":"EMTÉ","shop":"supermarket"},"name":"EMTÉ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Edeka":{"tags":{"name":"Edeka","shop":"supermarket"},"name":"Edeka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Ekom":{"tags":{"name":"Ekom","shop":"supermarket"},"name":"Ekom","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Ekono":{"tags":{"name":"Ekono","shop":"supermarket"},"name":"Ekono","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/El Árbol":{"tags":{"name":"El Árbol","shop":"supermarket"},"name":"El Árbol","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Eroski":{"tags":{"name":"Eroski","shop":"supermarket"},"name":"Eroski","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Esselunga":{"tags":{"name":"Esselunga","shop":"supermarket"},"name":"Esselunga","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/EuroSpin":{"tags":{"name":"EuroSpin","shop":"supermarket"},"name":"EuroSpin","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Eurospar":{"tags":{"name":"Eurospar","shop":"supermarket"},"name":"Eurospar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Eurospin":{"tags":{"name":"Eurospin","shop":"supermarket"},"name":"Eurospin","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Extra":{"tags":{"name":"Extra","shop":"supermarket"},"name":"Extra","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Famiglia Cooperativa":{"tags":{"name":"Famiglia Cooperativa","shop":"supermarket"},"name":"Famiglia Cooperativa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Famila":{"tags":{"name":"Famila","shop":"supermarket"},"name":"Famila","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Fareway":{"tags":{"name":"Fareway","shop":"supermarket"},"name":"Fareway","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Farmfoods":{"tags":{"name":"Farmfoods","shop":"supermarket"},"name":"Farmfoods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Feneberg":{"tags":{"name":"Feneberg","shop":"supermarket"},"name":"Feneberg","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Food Basics":{"tags":{"name":"Food Basics","shop":"supermarket"},"name":"Food Basics","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Food Lion":{"tags":{"name":"Food Lion","shop":"supermarket"},"name":"Food Lion","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Foodland":{"tags":{"name":"Foodland","shop":"supermarket"},"name":"Foodland","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Foodworks":{"tags":{"name":"Foodworks","shop":"supermarket"},"name":"Foodworks","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Franprix":{"tags":{"name":"Franprix","shop":"supermarket"},"name":"Franprix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Fred Meyer":{"tags":{"name":"Fred Meyer","shop":"supermarket"},"name":"Fred Meyer","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Froiz":{"tags":{"name":"Froiz","shop":"supermarket"},"name":"Froiz","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Føtex":{"tags":{"name":"Føtex","shop":"supermarket"},"name":"Føtex","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/G20":{"tags":{"name":"G20","shop":"supermarket"},"name":"G20","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Gadis":{"tags":{"name":"Gadis","shop":"supermarket"},"name":"Gadis","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Giant":{"tags":{"name":"Giant","shop":"supermarket"},"name":"Giant","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Giant Eagle":{"tags":{"name":"Giant Eagle","shop":"supermarket"},"name":"Giant Eagle","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Grand Frais":{"tags":{"name":"Grand Frais","shop":"supermarket"},"name":"Grand Frais","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Grocery Outlet":{"tags":{"name":"Grocery Outlet","shop":"supermarket"},"name":"Grocery Outlet","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Géant Casino":{"tags":{"name":"Géant Casino","shop":"supermarket"},"name":"Géant Casino","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/H-E-B":{"tags":{"name":"H-E-B","shop":"supermarket"},"name":"H-E-B","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/HIT":{"tags":{"name":"HIT","shop":"supermarket"},"name":"HIT","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Hannaford":{"tags":{"name":"Hannaford","shop":"supermarket"},"name":"Hannaford","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Harris Teeter":{"tags":{"name":"Harris Teeter","shop":"supermarket"},"name":"Harris Teeter","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Hemköp":{"tags":{"name":"Hemköp","shop":"supermarket"},"name":"Hemköp","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Heron Foods":{"tags":{"name":"Heron Foods","shop":"supermarket"},"name":"Heron Foods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Hofer":{"tags":{"name":"Hofer","shop":"supermarket"},"name":"Hofer","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Hoogvliet":{"tags":{"name":"Hoogvliet","shop":"supermarket"},"name":"Hoogvliet","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Hy-Vee":{"tags":{"name":"Hy-Vee","shop":"supermarket"},"name":"Hy-Vee","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/ICA":{"tags":{"name":"ICA","shop":"supermarket"},"name":"ICA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/ICA Kvantum":{"tags":{"name":"ICA Kvantum","shop":"supermarket"},"name":"ICA Kvantum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/IDEA":{"tags":{"name":"IDEA","shop":"supermarket"},"name":"IDEA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/IGA":{"tags":{"name":"IGA","shop":"supermarket"},"name":"IGA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Iceland":{"tags":{"name":"Iceland","shop":"supermarket"},"name":"Iceland","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Intermarché":{"tags":{"name":"Intermarché","shop":"supermarket"},"name":"Intermarché","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Intermarché Contact":{"tags":{"name":"Intermarché Contact","shop":"supermarket"},"name":"Intermarché Contact","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Intermarché Super":{"tags":{"name":"Intermarché Super","shop":"supermarket"},"name":"Intermarché Super","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Interspar":{"tags":{"name":"Interspar","shop":"supermarket"},"name":"Interspar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Irma":{"tags":{"name":"Irma","shop":"supermarket"},"name":"Irma","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Jewel-Osco":{"tags":{"name":"Jewel-Osco","shop":"supermarket"},"name":"Jewel-Osco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Jumbo":{"tags":{"name":"Jumbo","shop":"supermarket"},"name":"Jumbo","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/K+K":{"tags":{"name":"K+K","shop":"supermarket"},"name":"K+K","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Kaufland":{"tags":{"name":"Kaufland","shop":"supermarket"},"name":"Kaufland","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/King Soopers":{"tags":{"name":"King Soopers","shop":"supermarket"},"name":"King Soopers","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Kiwi":{"tags":{"name":"Kiwi","shop":"supermarket"},"name":"Kiwi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Konsum":{"tags":{"name":"Konsum","shop":"supermarket"},"name":"Konsum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Konzum":{"tags":{"name":"Konzum","shop":"supermarket"},"name":"Konzum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Kroger":{"tags":{"name":"Kroger","shop":"supermarket"},"name":"Kroger","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Kvickly":{"tags":{"name":"Kvickly","shop":"supermarket"},"name":"Kvickly","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/La Vie Claire":{"tags":{"name":"La Vie Claire","shop":"supermarket"},"name":"La Vie Claire","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Landi":{"tags":{"name":"Landi","shop":"supermarket"},"name":"Landi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Leader Price":{"tags":{"name":"Leader Price","shop":"supermarket"},"name":"Leader Price","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Leclerc Drive":{"tags":{"name":"Leclerc Drive","shop":"supermarket"},"name":"Leclerc Drive","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Lider":{"tags":{"name":"Lider","shop":"supermarket"},"name":"Lider","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Lidl":{"tags":{"name":"Lidl","shop":"supermarket"},"name":"Lidl","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Lupa":{"tags":{"name":"Lupa","shop":"supermarket"},"name":"Lupa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/MPREIS":{"tags":{"name":"MPREIS","shop":"supermarket"},"name":"MPREIS","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Makro":{"tags":{"name":"Makro","shop":"supermarket"},"name":"Makro","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Markant":{"tags":{"name":"Markant","shop":"supermarket"},"name":"Markant","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Market Basket":{"tags":{"name":"Market Basket","shop":"supermarket"},"name":"Market Basket","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Marktkauf":{"tags":{"name":"Marktkauf","shop":"supermarket"},"name":"Marktkauf","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Match":{"tags":{"name":"Match","shop":"supermarket"},"name":"Match","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Maxi":{"tags":{"name":"Maxi","shop":"supermarket"},"name":"Maxi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Maxi Dia":{"tags":{"name":"Maxi Dia","shop":"supermarket"},"name":"Maxi Dia","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Maxima":{"tags":{"name":"Maxima","shop":"supermarket"},"name":"Maxima","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Maxima X":{"tags":{"name":"Maxima X","shop":"supermarket"},"name":"Maxima X","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Maxima XX":{"tags":{"name":"Maxima XX","shop":"supermarket"},"name":"Maxima XX","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mega Image":{"tags":{"name":"Mega Image","shop":"supermarket"},"name":"Mega Image","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mego":{"tags":{"name":"Mego","shop":"supermarket"},"name":"Mego","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Meijer":{"tags":{"name":"Meijer","shop":"supermarket"},"name":"Meijer","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Meny":{"tags":{"name":"Meny","shop":"supermarket"},"name":"Meny","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mercado Municipal":{"tags":{"name":"Mercado Municipal","shop":"supermarket"},"name":"Mercado Municipal","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mercado de Abastos":{"tags":{"name":"Mercado de Abastos","shop":"supermarket"},"name":"Mercado de Abastos","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mercadona":{"tags":{"name":"Mercadona","shop":"supermarket"},"name":"Mercadona","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mercator":{"tags":{"name":"Mercator","shop":"supermarket"},"name":"Mercator","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Merkur":{"tags":{"name":"Merkur","shop":"supermarket"},"name":"Merkur","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Metro":{"tags":{"name":"Metro","shop":"supermarket"},"name":"Metro","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Migros":{"tags":{"name":"Migros","shop":"supermarket"},"name":"Migros","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mila":{"tags":{"name":"Mila","shop":"supermarket"},"name":"Mila","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Minipreço":{"tags":{"name":"Minipreço","shop":"supermarket"},"name":"Minipreço","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mix Markt":{"tags":{"name":"Mix Markt","shop":"supermarket"},"name":"Mix Markt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Monoprix":{"tags":{"name":"Monoprix","shop":"supermarket"},"name":"Monoprix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/More":{"tags":{"name":"More","shop":"supermarket"},"name":"More","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Morrisons":{"tags":{"name":"Morrisons","shop":"supermarket"},"name":"Morrisons","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/NORMA":{"tags":{"name":"NORMA","shop":"supermarket"},"name":"NORMA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/NP":{"tags":{"name":"NP","shop":"supermarket"},"name":"NP","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Nah & Frisch":{"tags":{"name":"Nah & Frisch","shop":"supermarket"},"name":"Nah & Frisch","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Nahkauf":{"tags":{"name":"Nahkauf","shop":"supermarket"},"name":"Nahkauf","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Netto":{"tags":{"name":"Netto","shop":"supermarket"},"name":"Netto","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Netto Marken-Discount":{"tags":{"name":"Netto Marken-Discount","shop":"supermarket"},"name":"Netto Marken-Discount","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/New World":{"tags":{"name":"New World","shop":"supermarket"},"name":"New World","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/No Frills":{"tags":{"name":"No Frills","shop":"supermarket"},"name":"No Frills","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Norfa XL":{"tags":{"name":"Norfa XL","shop":"supermarket"},"name":"Norfa XL","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Norma":{"tags":{"name":"Norma","shop":"supermarket"},"name":"Norma","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/PENNY":{"tags":{"name":"PENNY","shop":"supermarket"},"name":"PENNY","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/PLUS":{"tags":{"name":"PLUS","shop":"supermarket"},"name":"PLUS","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/POLOmarket":{"tags":{"name":"POLOmarket","shop":"supermarket"},"name":"POLOmarket","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Palí":{"tags":{"name":"Palí","shop":"supermarket"},"name":"Palí","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Pam":{"tags":{"name":"Pam","shop":"supermarket"},"name":"Pam","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Penny":{"tags":{"name":"Penny","shop":"supermarket"},"name":"Penny","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Penny Markt":{"tags":{"name":"Penny Markt","shop":"supermarket"},"name":"Penny Markt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Pick n Pay":{"tags":{"name":"Pick n Pay","shop":"supermarket"},"name":"Pick n Pay","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Piggly Wiggly":{"tags":{"name":"Piggly Wiggly","shop":"supermarket"},"name":"Piggly Wiggly","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Pingo Doce":{"tags":{"name":"Pingo Doce","shop":"supermarket"},"name":"Pingo Doce","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Piotr i Paweł":{"tags":{"name":"Piotr i Paweł","shop":"supermarket"},"name":"Piotr i Paweł","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Plaza Vea":{"tags":{"name":"Plaza Vea","shop":"supermarket"},"name":"Plaza Vea","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Plodine":{"tags":{"name":"Plodine","shop":"supermarket"},"name":"Plodine","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Poiesz":{"tags":{"name":"Poiesz","shop":"supermarket"},"name":"Poiesz","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Price Chopper":{"tags":{"name":"Price Chopper","shop":"supermarket"},"name":"Price Chopper","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Prix":{"tags":{"name":"Prix","shop":"supermarket"},"name":"Prix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Profi":{"tags":{"name":"Profi","shop":"supermarket"},"name":"Profi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Proxy Delhaize":{"tags":{"name":"Proxy Delhaize","shop":"supermarket"},"name":"Proxy Delhaize","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Publix":{"tags":{"name":"Publix","shop":"supermarket"},"name":"Publix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Punto Simply":{"tags":{"name":"Punto Simply","shop":"supermarket"},"name":"Punto Simply","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Puregold":{"tags":{"name":"Puregold","shop":"supermarket"},"name":"Puregold","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Pão de Açúcar":{"tags":{"name":"Pão de Açúcar","shop":"supermarket"},"name":"Pão de Açúcar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/QFC":{"tags":{"name":"QFC","shop":"supermarket"},"name":"QFC","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/REMA 1000":{"tags":{"name":"REMA 1000","shop":"supermarket"},"name":"REMA 1000","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Ralphs":{"tags":{"name":"Ralphs","shop":"supermarket"},"name":"Ralphs","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Real":{"tags":{"name":"Real","shop":"supermarket"},"name":"Real","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Real Canadian Superstore":{"tags":{"name":"Real Canadian Superstore","shop":"supermarket"},"name":"Real Canadian Superstore","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Reliance Fresh":{"tags":{"name":"Reliance Fresh","shop":"supermarket"},"name":"Reliance Fresh","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Rema 1000":{"tags":{"name":"Rema 1000","shop":"supermarket"},"name":"Rema 1000","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Rewe":{"tags":{"name":"Rewe","shop":"supermarket"},"name":"Rewe","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Rewe City":{"tags":{"name":"Rewe City","shop":"supermarket"},"name":"Rewe City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Rimi":{"tags":{"name":"Rimi","shop":"supermarket"},"name":"Rimi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/S-Market":{"tags":{"name":"S-Market","shop":"supermarket"},"name":"S-Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Safeway":{"tags":{"name":"Safeway","shop":"supermarket"},"name":"Safeway","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Sainsbury's":{"tags":{"name":"Sainsbury's","shop":"supermarket"},"name":"Sainsbury's","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Sainsbury's Local":{"tags":{"name":"Sainsbury's Local","shop":"supermarket"},"name":"Sainsbury's Local","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Sam's Club":{"tags":{"name":"Sam's Club","shop":"supermarket"},"name":"Sam's Club","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Santa Isabel":{"tags":{"name":"Santa Isabel","shop":"supermarket"},"name":"Santa Isabel","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Save-A-Lot":{"tags":{"name":"Save-A-Lot","shop":"supermarket"},"name":"Save-A-Lot","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/ShopRite":{"tags":{"name":"ShopRite","shop":"supermarket"},"name":"ShopRite","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Shoprite":{"tags":{"name":"Shoprite","shop":"supermarket"},"name":"Shoprite","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Sigma":{"tags":{"name":"Sigma","shop":"supermarket"},"name":"Sigma","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Simply Market":{"tags":{"name":"Simply Market","shop":"supermarket"},"name":"Simply Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Sky":{"tags":{"name":"Sky","shop":"supermarket"},"name":"Sky","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Smith's":{"tags":{"name":"Smith's","shop":"supermarket"},"name":"Smith's","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Sobeys":{"tags":{"name":"Sobeys","shop":"supermarket"},"name":"Sobeys","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Soriana":{"tags":{"name":"Soriana","shop":"supermarket"},"name":"Soriana","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Spar":{"tags":{"name":"Spar","shop":"supermarket"},"name":"Spar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Sprouts Farmers Market":{"tags":{"name":"Sprouts Farmers Market","shop":"supermarket"},"name":"Sprouts Farmers Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Stokrotka":{"tags":{"name":"Stokrotka","shop":"supermarket"},"name":"Stokrotka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Stop & Shop":{"tags":{"name":"Stop & Shop","shop":"supermarket"},"name":"Stop & Shop","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Super C":{"tags":{"name":"Super C","shop":"supermarket"},"name":"Super C","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Super U":{"tags":{"name":"Super U","shop":"supermarket"},"name":"Super U","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/SuperBrugsen":{"tags":{"name":"SuperBrugsen","shop":"supermarket"},"name":"SuperBrugsen","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/SuperValu":{"tags":{"name":"SuperValu","shop":"supermarket"},"name":"SuperValu","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Superama":{"tags":{"name":"Superama","shop":"supermarket"},"name":"Superama","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Supersol":{"tags":{"name":"Supersol","shop":"supermarket"},"name":"Supersol","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Superspar":{"tags":{"name":"Superspar","shop":"supermarket"},"name":"Superspar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tegut":{"tags":{"name":"Tegut","shop":"supermarket"},"name":"Tegut","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tengelmann":{"tags":{"name":"Tengelmann","shop":"supermarket"},"name":"Tengelmann","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tesco":{"tags":{"name":"Tesco","shop":"supermarket"},"name":"Tesco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tesco Extra":{"tags":{"name":"Tesco Extra","shop":"supermarket"},"name":"Tesco Extra","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tesco Lotus":{"tags":{"name":"Tesco Lotus","shop":"supermarket"},"name":"Tesco Lotus","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tesco Metro":{"tags":{"name":"Tesco Metro","shop":"supermarket"},"name":"Tesco Metro","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/The Co-operative":{"tags":{"name":"The Co-operative","shop":"supermarket"},"name":"The Co-operative","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/The Co-operative Food":{"tags":{"name":"The Co-operative Food","shop":"supermarket"},"name":"The Co-operative Food","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tommy":{"tags":{"name":"Tommy","shop":"supermarket"},"name":"Tommy","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tottus":{"tags":{"name":"Tottus","shop":"supermarket"},"name":"Tottus","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Trader Joe's":{"tags":{"name":"Trader Joe's","shop":"supermarket"},"name":"Trader Joe's","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Treff 3000":{"tags":{"name":"Treff 3000","shop":"supermarket"},"name":"Treff 3000","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/U Express":{"tags":{"name":"U Express","shop":"supermarket"},"name":"U Express","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Unimarc":{"tags":{"name":"Unimarc","shop":"supermarket"},"name":"Unimarc","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Unimarkt":{"tags":{"name":"Unimarkt","shop":"supermarket"},"name":"Unimarkt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Utile":{"tags":{"name":"Utile","shop":"supermarket"},"name":"Utile","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Vea":{"tags":{"name":"Vea","shop":"supermarket"},"name":"Vea","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Volg":{"tags":{"name":"Volg","shop":"supermarket"},"name":"Volg","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Waitrose":{"tags":{"name":"Waitrose","shop":"supermarket"},"name":"Waitrose","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Walmart":{"tags":{"name":"Walmart","shop":"supermarket"},"name":"Walmart","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Walmart Neighborhood Market":{"tags":{"name":"Walmart Neighborhood Market","shop":"supermarket"},"name":"Walmart Neighborhood Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Walmart Supercenter":{"tags":{"name":"Walmart Supercenter","shop":"supermarket"},"name":"Walmart Supercenter","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Wasgau":{"tags":{"name":"Wasgau","shop":"supermarket"},"name":"Wasgau","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Wegmans":{"tags":{"name":"Wegmans","shop":"supermarket"},"name":"Wegmans","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Wellcome":{"tags":{"name":"Wellcome","shop":"supermarket"},"name":"Wellcome","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Whole Foods Market":{"tags":{"name":"Whole Foods Market","shop":"supermarket"},"name":"Whole Foods Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Willys":{"tags":{"name":"Willys","shop":"supermarket"},"name":"Willys","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/WinCo Foods":{"tags":{"name":"WinCo Foods","shop":"supermarket"},"name":"WinCo Foods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Winn Dixie":{"tags":{"name":"Winn Dixie","shop":"supermarket"},"name":"Winn Dixie","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Woolworths":{"tags":{"name":"Woolworths","shop":"supermarket"},"name":"Woolworths","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/denn's Biomarkt":{"tags":{"name":"denn's Biomarkt","shop":"supermarket"},"name":"denn's Biomarkt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/fakta":{"tags":{"name":"fakta","shop":"supermarket"},"name":"fakta","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/real":{"tags":{"name":"real","shop":"supermarket"},"name":"real","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/tegut":{"tags":{"name":"tegut","shop":"supermarket"},"name":"tegut","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Şok":{"tags":{"name":"Şok","shop":"supermarket"},"name":"Şok","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/ΑΒ Βασιλόπουλος":{"tags":{"name":"ΑΒ Βασιλόπουλος","shop":"supermarket"},"name":"ΑΒ Βασιλόπουλος","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Γαλαξίας":{"tags":{"name":"Γαλαξίας","shop":"supermarket"},"name":"Γαλαξίας","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Μασούτης":{"tags":{"name":"Μασούτης","shop":"supermarket"},"name":"Μασούτης","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Σκλαβενίτης":{"tags":{"name":"Σκλαβενίτης","shop":"supermarket"},"name":"Σκλαβενίτης","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/АТБ":{"tags":{"name":"АТБ","shop":"supermarket"},"name":"АТБ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Абсолют":{"tags":{"name":"Абсолют","shop":"supermarket"},"name":"Абсолют","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Азбука Вкуса":{"tags":{"name":"Азбука Вкуса","shop":"supermarket"},"name":"Азбука Вкуса","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Атак":{"tags":{"name":"Атак","shop":"supermarket"},"name":"Атак","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Ашан":{"tags":{"name":"Ашан","shop":"supermarket"},"name":"Ашан","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Верный":{"tags":{"name":"Верный","shop":"supermarket"},"name":"Верный","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Вопак":{"tags":{"name":"Вопак","shop":"supermarket"},"name":"Вопак","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Гроздь":{"tags":{"name":"Гроздь","shop":"supermarket"},"name":"Гроздь","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Десяточка":{"tags":{"name":"Десяточка","shop":"supermarket"},"name":"Десяточка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Дикси":{"tags":{"name":"Дикси","shop":"supermarket"},"name":"Дикси","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Евроопт":{"tags":{"name":"Евроопт","shop":"supermarket"},"name":"Евроопт","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Карусель":{"tags":{"name":"Карусель","shop":"supermarket"},"name":"Карусель","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Квартал":{"tags":{"name":"Квартал","shop":"supermarket"},"name":"Квартал","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Командор":{"tags":{"name":"Командор","shop":"supermarket"},"name":"Командор","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Красный Яр":{"tags":{"name":"Красный Яр","shop":"supermarket"},"name":"Красный Яр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Лента":{"tags":{"name":"Лента","shop":"supermarket"},"name":"Лента","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Магнит":{"tags":{"name":"Магнит","shop":"supermarket"},"name":"Магнит","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Магнолия":{"tags":{"name":"Магнолия","shop":"supermarket"},"name":"Магнолия","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Монетка":{"tags":{"name":"Монетка","shop":"supermarket"},"name":"Монетка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Народная 7Я семьЯ":{"tags":{"name":"Народная 7Я семьЯ","shop":"supermarket"},"name":"Народная 7Я семьЯ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Перекресток":{"tags":{"name":"Перекресток","shop":"supermarket"},"name":"Перекресток","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Покупочка":{"tags":{"name":"Покупочка","shop":"supermarket"},"name":"Покупочка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Полушка":{"tags":{"name":"Полушка","shop":"supermarket"},"name":"Полушка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Пятёрочка":{"tags":{"name":"Пятёрочка","shop":"supermarket"},"name":"Пятёрочка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Радеж":{"tags":{"name":"Радеж","shop":"supermarket"},"name":"Радеж","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Рукавичка":{"tags":{"name":"Рукавичка","shop":"supermarket"},"name":"Рукавичка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Светофор":{"tags":{"name":"Светофор","shop":"supermarket"},"name":"Светофор","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Седьмой континент":{"tags":{"name":"Седьмой континент","shop":"supermarket"},"name":"Седьмой континент","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Семейный":{"tags":{"name":"Семейный","shop":"supermarket"},"name":"Семейный","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Семья":{"tags":{"name":"Семья","shop":"supermarket"},"name":"Семья","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Супермаркет":{"tags":{"name":"Супермаркет","shop":"supermarket"},"name":"Супермаркет","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Сільпо":{"tags":{"name":"Сільпо","shop":"supermarket"},"name":"Сільпо","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Таврія‑В":{"tags":{"name":"Таврія‑В","shop":"supermarket"},"name":"Таврія‑В","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Фора":{"tags":{"name":"Фора","shop":"supermarket"},"name":"Фора","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Фуршет":{"tags":{"name":"Фуршет","shop":"supermarket"},"name":"Фуршет","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Хүнсний дэлгүүр":{"tags":{"name":"Хүнсний дэлгүүр","shop":"supermarket"},"name":"Хүнсний дэлгүүр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Эдельвейс":{"tags":{"name":"Эдельвейс","shop":"supermarket"},"name":"Эдельвейс","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/хүнсний дэлгүүр":{"tags":{"name":"хүнсний дэлгүүр","shop":"supermarket"},"name":"хүнсний дэлгүүр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/بقالة":{"tags":{"name":"بقالة","shop":"supermarket"},"name":"بقالة","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/سوپر مارکت":{"tags":{"name":"سوپر مارکت","shop":"supermarket"},"name":"سوپر مارکت","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/سوپرمارکت":{"tags":{"name":"سوپرمارکت","shop":"supermarket"},"name":"سوپرمارکت","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/いなげや":{"tags":{"name":"いなげや","shop":"supermarket"},"name":"いなげや","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/まいばすけっと":{"tags":{"name":"まいばすけっと","shop":"supermarket"},"name":"まいばすけっと","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/イオン":{"tags":{"name":"イオン","shop":"supermarket"},"name":"イオン","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/イトーヨーカドー":{"tags":{"name":"イトーヨーカドー","shop":"supermarket"},"name":"イトーヨーカドー","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/カスミ":{"tags":{"name":"カスミ","shop":"supermarket"},"name":"カスミ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/マックスバリュ":{"tags":{"name":"マックスバリュ","shop":"supermarket"},"name":"マックスバリュ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/マルエツ":{"tags":{"name":"マルエツ","shop":"supermarket"},"name":"マルエツ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/ライフ":{"tags":{"name":"ライフ","shop":"supermarket"},"name":"ライフ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/全聯":{"tags":{"name":"全聯","shop":"supermarket"},"name":"全聯","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/全聯福利中心":{"tags":{"name":"全聯福利中心","shop":"supermarket"},"name":"全聯福利中心","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/惠康 Wellcome":{"tags":{"name":"惠康 Wellcome","shop":"supermarket"},"name":"惠康 Wellcome","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/業務スーパー":{"tags":{"name":"業務スーパー","shop":"supermarket"},"name":"業務スーパー","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/美廉社":{"tags":{"name":"美廉社","shop":"supermarket"},"name":"美廉社","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/西友":{"tags":{"name":"西友","shop":"supermarket"},"name":"西友","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tailor/Atelier de couture":{"tags":{"name":"Atelier de couture","shop":"tailor"},"name":"Atelier de couture","icon":"clothing-store","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/ticket/Boutique Grandes Lignes":{"tags":{"name":"Boutique Grandes Lignes","shop":"ticket"},"name":"Boutique Grandes Lignes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/ticket/Guichet Transilien":{"tags":{"name":"Guichet Transilien","shop":"ticket"},"name":"Guichet Transilien","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/ticket/Касса":{"tags":{"name":"Касса","shop":"ticket"},"name":"Касса","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/ticket/Проездные билеты":{"tags":{"name":"Проездные билеты","shop":"ticket"},"name":"Проездные билеты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tobacco/Dohánybolt":{"tags":{"name":"Dohánybolt","shop":"tobacco"},"name":"Dohánybolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tobacco/Estanco":{"tags":{"name":"Estanco","shop":"tobacco"},"name":"Estanco","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tobacco/Nemzeti Dohánybolt":{"tags":{"name":"Nemzeti Dohánybolt","shop":"tobacco"},"name":"Nemzeti Dohánybolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tobacco/Tabacos":{"tags":{"name":"Tabacos","shop":"tobacco"},"name":"Tabacos","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tobacco/Табакерка":{"tags":{"name":"Табакерка","shop":"tobacco"},"name":"Табакерка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/Dráčik":{"tags":{"name":"Dráčik","shop":"toys"},"name":"Dráčik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/Intertoys":{"tags":{"name":"Intertoys","shop":"toys"},"name":"Intertoys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/King Jouet":{"tags":{"name":"King Jouet","shop":"toys"},"name":"King Jouet","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/La Grande Récré":{"tags":{"name":"La Grande Récré","shop":"toys"},"name":"La Grande Récré","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/Maxi Toys":{"tags":{"name":"Maxi Toys","shop":"toys"},"name":"Maxi Toys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/Toys R Us":{"tags":{"name":"Toys R Us","shop":"toys"},"name":"Toys R Us","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/Детский мир":{"tags":{"name":"Детский мир","shop":"toys"},"name":"Детский мир","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/Игрушки":{"tags":{"name":"Игрушки","shop":"toys"},"name":"Игрушки","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/D-reizen":{"tags":{"name":"D-reizen","shop":"travel_agency"},"name":"D-reizen","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/DER Reisebüro":{"tags":{"name":"DER Reisebüro","shop":"travel_agency"},"name":"DER Reisebüro","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/First Reisebüro":{"tags":{"name":"First Reisebüro","shop":"travel_agency"},"name":"First Reisebüro","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/Flight Centre":{"tags":{"name":"Flight Centre","shop":"travel_agency"},"name":"Flight Centre","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/Reiseland":{"tags":{"name":"Reiseland","shop":"travel_agency"},"name":"Reiseland","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/TUI":{"tags":{"name":"TUI","shop":"travel_agency"},"name":"TUI","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/The Co-operative Travel":{"tags":{"name":"The Co-operative Travel","shop":"travel_agency"},"name":"The Co-operative Travel","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/Thomas Cook":{"tags":{"name":"Thomas Cook","shop":"travel_agency"},"name":"Thomas Cook","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/Thomson":{"tags":{"name":"Thomson","shop":"travel_agency"},"name":"Thomson","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tyres/Borracharia":{"tags":{"name":"Borracharia","shop":"tyres"},"name":"Borracharia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tyres/Bridgestone":{"tags":{"name":"Bridgestone","shop":"tyres"},"name":"Bridgestone","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tyres/Discount Tire":{"tags":{"name":"Discount Tire","shop":"tyres"},"name":"Discount Tire","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tyres/Les Schwab Tire Center":{"tags":{"name":"Les Schwab Tire Center","shop":"tyres"},"name":"Les Schwab Tire Center","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tyres/Vianor":{"tags":{"name":"Vianor","shop":"tyres"},"name":"Vianor","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tyres/Вулканизация":{"tags":{"name":"Вулканизация","shop":"tyres"},"name":"Вулканизация","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Action":{"tags":{"name":"Action","shop":"variety_store"},"name":"Action","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Bazar":{"tags":{"name":"Bazar","shop":"variety_store"},"name":"Bazar","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Big Bazar":{"tags":{"name":"Big Bazar","shop":"variety_store"},"name":"Big Bazar","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Dollar Tree":{"tags":{"name":"Dollar Tree","shop":"variety_store"},"name":"Dollar Tree","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Dollarama":{"tags":{"name":"Dollarama","shop":"variety_store"},"name":"Dollarama","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/EuroShop":{"tags":{"name":"EuroShop","shop":"variety_store"},"name":"EuroShop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Family Dollar":{"tags":{"name":"Family Dollar","shop":"variety_store"},"name":"Family Dollar","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Fix Price":{"tags":{"name":"Fix Price","shop":"variety_store"},"name":"Fix Price","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Fix price":{"tags":{"name":"Fix price","shop":"variety_store"},"name":"Fix price","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/FixPrice":{"tags":{"name":"FixPrice","shop":"variety_store"},"name":"FixPrice","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/GiFi":{"tags":{"name":"GiFi","shop":"variety_store"},"name":"GiFi","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Home Bargains":{"tags":{"name":"Home Bargains","shop":"variety_store"},"name":"Home Bargains","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Mäc-Geiz":{"tags":{"name":"Mäc-Geiz","shop":"variety_store"},"name":"Mäc-Geiz","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/NOZ":{"tags":{"name":"NOZ","shop":"variety_store"},"name":"NOZ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Poundland":{"tags":{"name":"Poundland","shop":"variety_store"},"name":"Poundland","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Poundworld":{"tags":{"name":"Poundworld","shop":"variety_store"},"name":"Poundworld","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Tedi":{"tags":{"name":"Tedi","shop":"variety_store"},"name":"Tedi","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/ダイソー":{"tags":{"name":"ダイソー","shop":"variety_store"},"name":"ダイソー","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video/Blockbuster":{"tags":{"name":"Blockbuster","shop":"video"},"name":"Blockbuster","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video/Family Video":{"tags":{"name":"Family Video","shop":"video"},"name":"Family Video","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video/TSUTAYA":{"tags":{"name":"TSUTAYA","shop":"video"},"name":"TSUTAYA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video/World of Video":{"tags":{"name":"World of Video","shop":"video"},"name":"World of Video","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video/ゲオ":{"tags":{"name":"ゲオ","shop":"video"},"name":"ゲオ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video_games/EB Games":{"tags":{"name":"EB Games","shop":"video_games"},"name":"EB Games","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video_games/Game":{"tags":{"name":"Game","shop":"video_games"},"name":"Game","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video_games/GameStop":{"tags":{"name":"GameStop","shop":"video_games"},"name":"GameStop","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video_games/Micromania":{"tags":{"name":"Micromania","shop":"video_games"},"name":"Micromania","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"tourism/alpine_hut/КОШ":{"tags":{"name":"КОШ","tourism":"alpine_hut"},"name":"КОШ","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/apartment/Двухкомнатная квартира на сутки":{"tags":{"name":"Двухкомнатная квартира на сутки","tourism":"apartment"},"name":"Двухкомнатная квартира на сутки","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/attraction/Arch":{"tags":{"name":"Arch","tourism":"attraction"},"name":"Arch","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Kursächsische Postmeilensäule":{"tags":{"name":"Kursächsische Postmeilensäule","tourism":"attraction"},"name":"Kursächsische Postmeilensäule","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Maibaum":{"tags":{"name":"Maibaum","tourism":"attraction"},"name":"Maibaum","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Moab trail":{"tags":{"name":"Moab trail","tourism":"attraction"},"name":"Moab trail","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Moai":{"tags":{"name":"Moai","tourism":"attraction"},"name":"Moai","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/OWŚ":{"tags":{"name":"OWŚ","tourism":"attraction"},"name":"OWŚ","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Sommerrodelbahn":{"tags":{"name":"Sommerrodelbahn","tourism":"attraction"},"name":"Sommerrodelbahn","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/path contiunes":{"tags":{"name":"path contiunes","tourism":"attraction"},"name":"path contiunes","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/white blaze":{"tags":{"name":"white blaze","tourism":"attraction"},"name":"white blaze","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Кладбище еврейское":{"tags":{"name":"Кладбище еврейское","tourism":"attraction"},"name":"Кладбище еврейское","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Колесо обозрения":{"tags":{"name":"Колесо обозрения","tourism":"attraction"},"name":"Колесо обозрения","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Приусадебный парк":{"tags":{"name":"Приусадебный парк","tourism":"attraction"},"name":"Приусадебный парк","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Усадьба":{"tags":{"name":"Усадьба","tourism":"attraction"},"name":"Усадьба","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Хозяйственный двор":{"tags":{"name":"Хозяйственный двор","tourism":"attraction"},"name":"Хозяйственный двор","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Часовня":{"tags":{"name":"Часовня","tourism":"attraction"},"name":"Часовня","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/дольмен":{"tags":{"name":"дольмен","tourism":"attraction"},"name":"дольмен","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/camp_site/Camping Municipal":{"tags":{"name":"Camping Municipal","tourism":"camp_site"},"name":"Camping Municipal","icon":"campsite","geometry":["point","vertex","area"],"fields":["name","operator","address","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/camp_site/Camping municipal":{"tags":{"name":"Camping municipal","tourism":"camp_site"},"name":"Camping municipal","icon":"campsite","geometry":["point","vertex","area"],"fields":["name","operator","address","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/guest_house/Home":{"tags":{"name":"Home","tourism":"guest_house"},"name":"Home","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/guest_house/OW Bielanka":{"tags":{"name":"OW Bielanka","tourism":"guest_house"},"name":"OW Bielanka","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hostel/Albergue de Peregrinos":{"tags":{"name":"Albergue de Peregrinos","tourism":"hostel"},"name":"Albergue de Peregrinos","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hostel/Hospedaje":{"tags":{"name":"Hospedaje","tourism":"hostel"},"name":"Hospedaje","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hostel/Hostal":{"tags":{"name":"Hostal","tourism":"hostel"},"name":"Hostal","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/B&B Hôtel":{"tags":{"name":"B&B Hôtel","tourism":"hotel"},"name":"B&B Hôtel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/B&b Hôtel":{"tags":{"name":"B&b Hôtel","tourism":"hotel"},"name":"B&b Hôtel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Best Western":{"tags":{"name":"Best Western","tourism":"hotel"},"name":"Best Western","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Campanile":{"tags":{"name":"Campanile","tourism":"hotel"},"name":"Campanile","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Central Hotel":{"tags":{"name":"Central Hotel","tourism":"hotel"},"name":"Central Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/City Hotel":{"tags":{"name":"City Hotel","tourism":"hotel"},"name":"City Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Comfort Inn":{"tags":{"name":"Comfort Inn","tourism":"hotel"},"name":"Comfort Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Comfort Inn & Suites":{"tags":{"name":"Comfort Inn & Suites","tourism":"hotel"},"name":"Comfort Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Comfort Suites":{"tags":{"name":"Comfort Suites","tourism":"hotel"},"name":"Comfort Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Country Inn & Suites":{"tags":{"name":"Country Inn & Suites","tourism":"hotel"},"name":"Country Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Courtyard by Marriott":{"tags":{"name":"Courtyard by Marriott","tourism":"hotel"},"name":"Courtyard by Marriott","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Crowne Plaza":{"tags":{"name":"Crowne Plaza","tourism":"hotel"},"name":"Crowne Plaza","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Days Inn":{"tags":{"name":"Days Inn","tourism":"hotel"},"name":"Days Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Embassy Suites":{"tags":{"name":"Embassy Suites","tourism":"hotel"},"name":"Embassy Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Extended Stay America":{"tags":{"name":"Extended Stay America","tourism":"hotel"},"name":"Extended Stay America","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Fairfield Inn":{"tags":{"name":"Fairfield Inn","tourism":"hotel"},"name":"Fairfield Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Fairfield Inn & Suites":{"tags":{"name":"Fairfield Inn & Suites","tourism":"hotel"},"name":"Fairfield Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Formule 1":{"tags":{"name":"Formule 1","tourism":"hotel"},"name":"Formule 1","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Grand Hotel":{"tags":{"name":"Grand Hotel","tourism":"hotel"},"name":"Grand Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hampton Inn":{"tags":{"name":"Hampton Inn","tourism":"hotel"},"name":"Hampton Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hampton Inn & Suites":{"tags":{"name":"Hampton Inn & Suites","tourism":"hotel"},"name":"Hampton Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hilton Garden Inn":{"tags":{"name":"Hilton Garden Inn","tourism":"hotel"},"name":"Hilton Garden Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Holiday Inn":{"tags":{"name":"Holiday Inn","tourism":"hotel"},"name":"Holiday Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Holiday Inn Express":{"tags":{"name":"Holiday Inn Express","tourism":"hotel"},"name":"Holiday Inn Express","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Holiday Inn Express & Suites":{"tags":{"name":"Holiday Inn Express & Suites","tourism":"hotel"},"name":"Holiday Inn Express & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Homewood Suites":{"tags":{"name":"Homewood Suites","tourism":"hotel"},"name":"Homewood Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Central":{"tags":{"name":"Hotel Central","tourism":"hotel"},"name":"Hotel Central","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Europa":{"tags":{"name":"Hotel Europa","tourism":"hotel"},"name":"Hotel Europa","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Ibis":{"tags":{"name":"Hotel Ibis","tourism":"hotel"},"name":"Hotel Ibis","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Krone":{"tags":{"name":"Hotel Krone","tourism":"hotel"},"name":"Hotel Krone","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Panorama":{"tags":{"name":"Hotel Panorama","tourism":"hotel"},"name":"Hotel Panorama","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Plaza":{"tags":{"name":"Hotel Plaza","tourism":"hotel"},"name":"Hotel Plaza","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Post":{"tags":{"name":"Hotel Post","tourism":"hotel"},"name":"Hotel Post","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Royal":{"tags":{"name":"Hotel Royal","tourism":"hotel"},"name":"Hotel Royal","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Victoria":{"tags":{"name":"Hotel Victoria","tourism":"hotel"},"name":"Hotel Victoria","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel zur Post":{"tags":{"name":"Hotel zur Post","tourism":"hotel"},"name":"Hotel zur Post","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hôtel Ibis":{"tags":{"name":"Hôtel Ibis","tourism":"hotel"},"name":"Hôtel Ibis","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hôtel de France":{"tags":{"name":"Hôtel de France","tourism":"hotel"},"name":"Hôtel de France","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ibis":{"tags":{"name":"Ibis","tourism":"hotel"},"name":"Ibis","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ibis Budget":{"tags":{"name":"Ibis Budget","tourism":"hotel"},"name":"Ibis Budget","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ibis Styles":{"tags":{"name":"Ibis Styles","tourism":"hotel"},"name":"Ibis Styles","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Kyriad":{"tags":{"name":"Kyriad","tourism":"hotel"},"name":"Kyriad","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/La Quinta":{"tags":{"name":"La Quinta","tourism":"hotel"},"name":"La Quinta","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Marriott":{"tags":{"name":"Marriott","tourism":"hotel"},"name":"Marriott","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Mercure":{"tags":{"name":"Mercure","tourism":"hotel"},"name":"Mercure","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Novotel":{"tags":{"name":"Novotel","tourism":"hotel"},"name":"Novotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Palace Hotel":{"tags":{"name":"Palace Hotel","tourism":"hotel"},"name":"Palace Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Park Hotel":{"tags":{"name":"Park Hotel","tourism":"hotel"},"name":"Park Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Parkhotel":{"tags":{"name":"Parkhotel","tourism":"hotel"},"name":"Parkhotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Premier Inn":{"tags":{"name":"Premier Inn","tourism":"hotel"},"name":"Premier Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Première Classe":{"tags":{"name":"Première Classe","tourism":"hotel"},"name":"Première Classe","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Quality Inn":{"tags":{"name":"Quality Inn","tourism":"hotel"},"name":"Quality Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Quality Inn & Suites":{"tags":{"name":"Quality Inn & Suites","tourism":"hotel"},"name":"Quality Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ramada":{"tags":{"name":"Ramada","tourism":"hotel"},"name":"Ramada","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Residence Inn":{"tags":{"name":"Residence Inn","tourism":"hotel"},"name":"Residence Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Royal Hotel":{"tags":{"name":"Royal Hotel","tourism":"hotel"},"name":"Royal Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Sheraton":{"tags":{"name":"Sheraton","tourism":"hotel"},"name":"Sheraton","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Sleep Inn":{"tags":{"name":"Sleep Inn","tourism":"hotel"},"name":"Sleep Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Staybridge Suites":{"tags":{"name":"Staybridge Suites","tourism":"hotel"},"name":"Staybridge Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Super 8":{"tags":{"name":"Super 8","tourism":"hotel"},"name":"Super 8","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Travelodge":{"tags":{"name":"Travelodge","tourism":"hotel"},"name":"Travelodge","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Гостиница":{"tags":{"name":"Гостиница","tourism":"hotel"},"name":"Гостиница","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/東横イン":{"tags":{"name":"東横イン","tourism":"hotel"},"name":"東横イン","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Budget Inn":{"tags":{"name":"Budget Inn","tourism":"motel"},"name":"Budget Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Econo Lodge":{"tags":{"name":"Econo Lodge","tourism":"motel"},"name":"Econo Lodge","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Motel 6":{"tags":{"name":"Motel 6","tourism":"motel"},"name":"Motel 6","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Rodeway Inn":{"tags":{"name":"Rodeway Inn","tourism":"motel"},"name":"Rodeway Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/museum/Heimatmuseum":{"tags":{"name":"Heimatmuseum","tourism":"museum"},"name":"Heimatmuseum","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Stadtmuseum":{"tags":{"name":"Stadtmuseum","tourism":"museum"},"name":"Stadtmuseum","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Tájház":{"tags":{"name":"Tájház","tourism":"museum"},"name":"Tájház","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Краеведческий музей":{"tags":{"name":"Краеведческий музей","tourism":"museum"},"name":"Краеведческий музей","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Музей":{"tags":{"name":"Музей","tourism":"museum"},"name":"Музей","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true}};
23647
23648 var defaults = {"area":["category-landuse","category-building","category-water-area","category-natural-area","leisure/park","amenity/hospital","amenity/place_of_worship","amenity/cafe","amenity/restaurant","area"],"line":["category-road","category-rail","category-path","category-water-line","category-barrier","category-natural-line","power/line","line"],"point":["category-natural-point","leisure/park","amenity/hospital","amenity/place_of_worship","amenity/cafe","amenity/restaurant","amenity/fast_food","amenity/bar","amenity/bank","shop/supermarket","point"],"vertex":["highway/crosswalk","highway/crossing","railway/level_crossing","highway/traffic_signals","highway/turning_circle","highway/turning_loop","traffic_calming","highway/mini_roundabout","highway/motorway_junction","vertex"],"relation":["category-route","category-restriction","public_transport/stop_area","type/boundary","type/waterway","type/multipolygon","type/site","relation"]};
23649
23650 var categories = {"category-barrier":{"icon":"roadblock","geometry":"line","name":"Barrier Features","members":["barrier/fence","barrier/wall","barrier/ditch","barrier/gate","barrier/hedge","barrier/kerb","barrier"]},"category-building":{"icon":"building","geometry":"area","name":"Building Features","members":["building","building/house","building/apartments","building/retail","building/commercial","building/industrial","building/residential"]},"category-golf":{"icon":"golf","geometry":"area","name":"Golf Features","members":["golf/fairway","golf/green","golf/lateral_water_hazard_area","golf/rough","golf/bunker","golf/tee","golf/water_hazard_area"]},"category-landuse":{"icon":"landuse","geometry":"area","name":"Land Use Features","members":["landuse/residential","landuse/industrial","landuse/commercial","landuse/retail","landuse/farmland","landuse/farmyard","landuse/forest","landuse/meadow","landuse/aquaculture","landuse/cemetery","landuse/military","landuse/religious"]},"category-natural-area":{"icon":"natural","geometry":"area","name":"Natural Features","members":["natural/water","natural/wood","natural/scrub","natural/wetland","natural/grassland","natural/heath","natural/bare_rock","natural/beach","natural/cave_entrance","natural/glacier"]},"category-natural-line":{"icon":"natural","geometry":"line","name":"Natural Features","members":["natural/coastline","natural/tree_row"]},"category-natural-point":{"icon":"natural","geometry":"point","name":"Natural Features","members":["natural/peak","natural/cliff","natural/beach","natural/cave_entrance"]},"category-path":{"icon":"category-path","geometry":"line","name":"Path Features","members":["footway/crosswalk","footway/sidewalk","highway/steps","highway/path","highway/footway","highway/cycleway","highway/bridleway","highway/pedestrian_line"]},"category-rail":{"icon":"category-rail","geometry":"line","name":"Rail Features","members":["railway/rail","railway/subway","railway/tram","railway/monorail","railway/disused","railway/abandoned"]},"category-restriction":{"icon":"restriction","geometry":"relation","name":"Restriction Features","members":["type/restriction/no_left_turn","type/restriction/no_right_turn","type/restriction/no_straight_on","type/restriction/no_u_turn","type/restriction/only_left_turn","type/restriction/only_right_turn","type/restriction/only_straight_on","type/restriction"]},"category-road":{"icon":"category-roads","geometry":"line","name":"Road Features","members":["highway/residential","highway/motorway","highway/trunk","highway/primary","highway/secondary","highway/tertiary","highway/living_street","highway/unclassified","highway/service","highway/track","highway/motorway_link","highway/trunk_link","highway/primary_link","highway/secondary_link","highway/tertiary_link","highway/road"]},"category-route":{"icon":"route","geometry":"relation","name":"Route Features","members":["type/route/road","type/route/bicycle","type/route/foot","type/route/hiking","type/route/horse","type/route/piste","type/route/bus","type/route/train","type/route/light_rail","type/route/tram","type/route/subway","type/route/ferry","type/route/power","type/route/pipeline","type/route/detour","type/route_master","type/route"]},"category-water-area":{"icon":"water","geometry":"area","name":"Water Features","members":["natural/water/lake","natural/water/pond","natural/water/reservoir","natural/water"]},"category-water-line":{"icon":"category-water","geometry":"line","name":"Water Features","members":["waterway/river","waterway/stream","waterway/canal","waterway/ditch","waterway/drain"]}};
23651
23652 var fields = {"access_simple":{"key":"access","type":"combo","label":"Allowed Access","options":["yes","permissive","private","customers","no"]},"access":{"keys":["access","foot","motor_vehicle","bicycle","horse"],"reference":{"key":"access"},"type":"access","label":"Allowed Access","placeholder":"Not Specified","strings":{"types":{"access":"All","foot":"Foot","motor_vehicle":"Motor Vehicles","bicycle":"Bicycles","horse":"Horses"},"options":{"yes":{"title":"Allowed","description":"Access permitted by law; a right of way"},"no":{"title":"Prohibited","description":"Access not permitted to the general public"},"permissive":{"title":"Permissive","description":"Access permitted until such time as the owner revokes the permission"},"private":{"title":"Private","description":"Access permitted only with permission of the owner on an individual basis"},"designated":{"title":"Designated","description":"Access permitted according to signs or specific local laws"},"destination":{"title":"Destination","description":"Access permitted only to reach a destination"},"dismount":{"title":"Dismount","description":"Access permitted but rider must dismount"}}}},"address":{"type":"address","keys":["addr:block_number","addr:city","addr:block_number","addr:conscriptionnumber","addr:county","addr:country","addr:county","addr:district","addr:floor","addr:hamlet","addr:housename","addr:housenumber","addr:neighbourhood","addr:place","addr:postcode","addr:province","addr:quarter","addr:state","addr:street","addr:subdistrict","addr:suburb","addr:unit"],"reference":{"key":"addr"},"icon":"address","universal":true,"label":"Address","strings":{"placeholders":{"block_number":"Block Number","block_number!jp":"Block No.","city":"City","city!jp":"City/Town/Village/Tokyo Special Ward","city!vn":"City/Town","conscriptionnumber":"123","country":"Country","county":"County","county!jp":"District","district":"District","district!vn":"Arrondissement/Town/District","floor":"Floor","hamlet":"Hamlet","housename":"Housename","housenumber":"123","housenumber!jp":"Building No./Lot No.","neighbourhood":"Neighbourhood","neighbourhood!jp":"Chōme/Aza/Koaza","place":"Place","postcode":"Postcode","province":"Province","province!jp":"Prefecture","quarter":"Quarter","quarter!jp":"Ōaza/Machi","state":"State","street":"Street","subdistrict":"Subdistrict","subdistrict!vn":"Ward/Commune/Townlet","suburb":"Suburb","suburb!jp":"Ward","unit":"Unit"}}},"admin_level":{"key":"admin_level","type":"number","label":"Admin Level"},"aerialway":{"key":"aerialway","type":"typeCombo","label":"Type"},"aerialway/access":{"key":"aerialway:access","type":"combo","label":"Access","strings":{"options":{"entry":"Entry","exit":"Exit","both":"Both"}}},"aerialway/bubble":{"key":"aerialway:bubble","type":"check","label":"Bubble"},"aerialway/capacity":{"key":"aerialway:capacity","type":"number","label":"Capacity (per hour)","placeholder":"500, 2500, 5000..."},"aerialway/duration":{"key":"aerialway:duration","type":"number","label":"Duration (minutes)","placeholder":"1, 2, 3..."},"aerialway/heating":{"key":"aerialway:heating","type":"check","label":"Heated"},"aerialway/occupancy":{"key":"aerialway:occupancy","type":"number","label":"Occupancy","placeholder":"2, 4, 8..."},"aerialway/summer/access":{"key":"aerialway:summer:access","type":"combo","label":"Access (summer)","strings":{"options":{"entry":"Entry","exit":"Exit","both":"Both"}}},"aeroway":{"key":"aeroway","type":"typeCombo","label":"Type"},"agrarian":{"key":"agrarian","type":"semiCombo","label":"Products"},"amenity":{"key":"amenity","type":"typeCombo","label":"Type"},"animal_boarding":{"key":"animal_boarding","type":"semiCombo","label":"For Animals"},"animal_breeding":{"key":"animal_breeding","type":"semiCombo","label":"For Animals"},"animal_shelter":{"key":"animal_shelter","type":"semiCombo","label":"For Animals"},"area/highway":{"key":"area:highway","type":"typeCombo","label":"Type"},"artist":{"key":"artist_name","type":"text","label":"Artist"},"artwork_type":{"key":"artwork_type","type":"combo","label":"Type"},"atm":{"key":"atm","type":"check","label":"ATM"},"backrest":{"key":"backrest","type":"check","label":"Backrest"},"barrier":{"key":"barrier","type":"typeCombo","label":"Type"},"bath/open_air":{"key":"bath:open_air","label":"Open Air","type":"check"},"bath/sand_bath":{"key":"bath:sand_bath","label":"Sand Bath","type":"check"},"bath/type":{"key":"bath:type","type":"combo","label":"Specialty","strings":{"options":{"onsen":"Japanese Onsen","foot_bath":"Foot Bath","hot_spring":"Hot Spring"}}},"beauty":{"key":"beauty","type":"combo","label":"Shop Type"},"bench":{"key":"bench","type":"check","label":"Bench"},"bicycle_parking":{"key":"bicycle_parking","type":"combo","label":"Type"},"bin":{"key":"bin","type":"check","label":"Waste Bin"},"blood_components":{"key":"blood:","type":"multiCombo","label":"Blood Components","strings":{"options":{"whole":"whole blood","plasma":"plasma","platelets":"platelets","stemcells":"stem cell samples"}}},"board_type":{"key":"board_type","type":"typeCombo","label":"Type"},"boules":{"key":"boules","type":"typeCombo","label":"Type"},"boundary":{"key":"boundary","type":"combo","label":"Type"},"brand":{"key":"brand","type":"text","label":"Brand"},"brewery":{"key":"brewery","type":"semiCombo","label":"Draft Beers"},"bridge":{"key":"bridge","type":"typeCombo","label":"Type","placeholder":"Default"},"building_area":{"key":"building","type":"combo","default":"yes","geometry":"area","label":"Building"},"building":{"key":"building","type":"combo","label":"Building"},"bunker_type":{"key":"bunker_type","type":"combo","label":"Type"},"cables":{"key":"cables","type":"number","label":"Cables","placeholder":"1, 2, 3..."},"camera/direction":{"key":"camera:direction","type":"number","label":"Direction (Degrees Clockwise)","placeholder":"45, 90, 180, 270"},"camera/mount":{"key":"camera:mount","type":"combo","label":"Camera Mount"},"camera/type":{"key":"camera:type","type":"combo","label":"Camera Type","strings":{"options":{"fixed":"Fixed","panning":"Panning","dome":"Dome"}}},"capacity":{"key":"capacity","type":"number","label":"Capacity","placeholder":"50, 100, 200..."},"castle_type":{"key":"castle_type","type":"combo","label":"Type"},"clothes":{"key":"clothes","type":"semiCombo","label":"Clothes"},"club":{"key":"club","type":"typeCombo","label":"Type"},"collection_times":{"key":"collection_times","type":"text","label":"Collection Times"},"comment":{"key":"comment","type":"textarea","label":"Changeset Comment","placeholder":"Brief description of your contributions (required)"},"communication_multi":{"key":"communication:","type":"multiCombo","label":"Communication Types"},"construction":{"key":"construction","type":"combo","label":"Type"},"contact/webcam":{"key":"contact:webcam","type":"url","icon":"website","label":"Webcam URL","placeholder":"http://example.com/"},"content":{"key":"content","type":"combo","label":"Content"},"country":{"key":"country","type":"combo","label":"Country"},"covered":{"key":"covered","type":"check","label":"Covered"},"craft":{"key":"craft","type":"typeCombo","label":"Type"},"crane/type":{"key":"crane:type","type":"combo","label":"Crane Type","strings":{"options":{"portal_crane":"Portal Crane","floor-mounted_crane":"Floor-mounted Crane","travel_lift":"Travel Lift"}}},"crop":{"key":"crop","type":"semiCombo","label":"Crops"},"crossing":{"key":"crossing","type":"combo","label":"Type"},"cuisine":{"key":"cuisine","type":"semiCombo","label":"Cuisines"},"currency_multi":{"key":"currency:","type":"multiCombo","label":"Currency Types"},"cutting":{"key":"cutting","type":"typeCombo","label":"Type","placeholder":"Default"},"cycle_network":{"key":"cycle_network","type":"networkCombo","label":"Network"},"cycleway":{"keys":["cycleway:left","cycleway:right"],"reference":{"key":"cycleway"},"type":"cycleway","label":"Bike Lanes","placeholder":"none","strings":{"types":{"cycleway:left":"Left side","cycleway:right":"Right side"},"options":{"none":{"title":"None","description":"No bike lane"},"lane":{"title":"Standard bike lane","description":"A bike lane separated from auto traffic by a painted line"},"shared_lane":{"title":"Shared bike lane","description":"A bike lane with no separation from auto traffic"},"track":{"title":"Bike track","description":"A bike lane separated from traffic by a physical barrier"},"share_busway":{"title":"Bike lane shared with bus","description":"A bike lane shared with a bus lane"},"opposite_lane":{"title":"Opposite bike lane","description":"A bike lane that travels in the opposite direction of traffic"},"opposite":{"title":"Contraflow bike lane","description":"A bike lane that travels in both directions on a one-way street"}}}},"dance/style":{"key":"dance:style","type":"semiCombo","label":"Dance Styles"},"date":{"key":"date","type":"check","label":"Date"},"delivery":{"key":"delivery","type":"check","label":"Delivery"},"denomination":{"key":"denomination","type":"combo","label":"Denomination"},"denotation":{"key":"denotation","type":"combo","label":"Denotation"},"description":{"key":"description","type":"textarea","label":"Description","universal":true},"devices":{"key":"devices","type":"number","label":"Devices","placeholder":"1, 2, 3..."},"diaper":{"key":"diaper","type":"combo","label":"Diaper Changing Available","options":["yes","no","room","1","2","3","4","5"]},"direction_cardinal":{"key":"direction","type":"combo","label":"Direction","strings":{"options":{"N":"North","E":"East","S":"South","W":"West","NE":"Northeast","SE":"Southeast","SW":"Southwest","NW":"Northwest","NNE":"North-northeast","ENE":"East-northeast","ESE":"East-southeast","SSE":"South-southeast","SSW":"South-southwest","WSW":"West-southwest","WNW":"West-northwest","NNW":"North-northwest"}}},"direction_clock":{"key":"direction","type":"combo","label":"Direction","strings":{"options":{"clockwise":"Clockwise","anticlockwise":"Counterclockwise"}}},"direction_vertex":{"key":"direction","type":"combo","label":"Direction","strings":{"options":{"forward":"Forward","backward":"Backward","both":"Both / All"}}},"direction":{"key":"direction","type":"number","label":"Direction (Degrees Clockwise)","placeholder":"45, 90, 180, 270"},"dispensing":{"key":"dispensing","type":"check","label":"Dispenses Prescriptions","default":"yes"},"display":{"key":"display","type":"combo","label":"Display","options":["analog","digital","sundial","unorthodox"]},"dock":{"key":"dock","type":"combo","label":"Type"},"drive_through":{"key":"drive_through","type":"check","label":"Drive-Through"},"duration":{"key":"duration","type":"text","label":"Duration","placeholder":"00:00"},"electrified":{"key":"electrified","type":"combo","label":"Electrification","placeholder":"Contact Line, Electrified Rail...","strings":{"options":{"contact_line":"Contact Line","rail":"Electrified Rail","yes":"Yes (unspecified)","no":"No"}}},"elevation":{"key":"ele","type":"number","icon":"elevation","universal":true,"label":"Elevation"},"email":{"key":"email","type":"email","placeholder":"example@example.com","universal":true,"label":"Email"},"embankment":{"key":"embankment","type":"typeCombo","label":"Type","placeholder":"Default"},"emergency":{"key":"emergency","type":"check","label":"Emergency"},"entrance":{"key":"entrance","type":"typeCombo","label":"Type"},"except":{"key":"except","type":"combo","label":"Exceptions"},"fax":{"key":"fax","type":"tel","label":"Fax","universal":true,"placeholder":"+31 42 123 4567"},"fee":{"key":"fee","type":"check","label":"Fee"},"fence_type":{"key":"fence_type","type":"combo","label":"Type"},"fire_hydrant/position":{"key":"fire_hydrant:position","type":"combo","label":"Position","strings":{"options":{"lane":"Lane","parking_lot":"Parking Lot","sidewalk":"Sidewalk","green":"Green"}}},"fire_hydrant/type":{"key":"fire_hydrant:type","type":"combo","label":"Type","strings":{"options":{"pillar":"Pillar/Aboveground","underground":"Underground","wall":"Wall","pond":"Pond"}}},"fitness_station":{"key":"fitness_station","type":"typeCombo","label":"Equipment Type"},"fixme":{"key":"fixme","type":"textarea","label":"Fix Me","universal":true},"ford":{"key":"ford","type":"typeCombo","label":"Type","placeholder":"Default"},"frequency":{"key":"frequency","type":"combo","label":"Operating Frequency"},"fuel_multi":{"key":"fuel:","type":"multiCombo","label":"Fuel Types"},"fuel":{"key":"fuel","type":"combo","label":"Fuel"},"gauge":{"key":"gauge","type":"combo","label":"Gauge"},"gender":{"type":"radio","keys":["male","female","unisex"],"label":"Gender","placeholder":"Unknown","strings":{"options":{"male":"Male","female":"Female","unisex":"Unisex"}}},"generator/method":{"key":"generator:method","type":"combo","label":"Method"},"generator/output/electricity":{"key":"generator:output:electricity","type":"text","label":"Power Output","placeholder":"50 MW, 100 MW, 200 MW..."},"generator/source":{"key":"generator:source","type":"combo","label":"Source"},"generator/type":{"key":"generator:type","type":"combo","label":"Type"},"government":{"key":"government","type":"typeCombo","label":"Type"},"grape_variety":{"key":"grape_variety","type":"semiCombo","label":"Grape Varieties"},"handicap":{"key":"handicap","type":"number","label":"Handicap","placeholder":"1-18"},"handrail":{"key":"handrail","type":"check","label":"Handrail"},"hashtags":{"key":"hashtags","type":"semiCombo","label":"Suggested Hashtags","placeholder":"#example"},"healthcare":{"key":"healthcare","type":"typeCombo","label":"Type"},"healthcare/speciality":{"key":"healthcare:speciality","type":"semiCombo","reference":{"key":"healthcare"},"label":"Specialties"},"height":{"key":"height","type":"number","label":"Height (Meters)"},"highway":{"key":"highway","type":"typeCombo","label":"Type"},"historic":{"key":"historic","type":"typeCombo","label":"Type"},"historic/civilization":{"key":"historic:civilization","type":"combo","label":"Historic Civilization"},"hoops":{"key":"hoops","type":"number","label":"Hoops","placeholder":"1, 2, 4..."},"iata":{"key":"iata","type":"text","label":"IATA"},"icao":{"key":"icao","type":"text","label":"ICAO"},"incline_steps":{"key":"incline","type":"combo","label":"Incline","strings":{"options":{"up":"Up","down":"Down"}}},"incline":{"key":"incline","type":"combo","label":"Incline"},"indoor":{"key":"indoor","type":"check","label":"Indoor"},"information":{"key":"information","type":"typeCombo","label":"Type"},"inscription":{"key":"inscription","type":"textarea","label":"Inscription"},"intermittent":{"key":"intermittent","type":"check","label":"Intermittent"},"internet_access":{"key":"internet_access","type":"combo","label":"Internet Access","strings":{"options":{"yes":"Yes","no":"No","wlan":"Wifi","wired":"Wired","terminal":"Terminal"}}},"internet_access/fee":{"key":"internet_access:fee","type":"check","label":"Internet Access Fee"},"internet_access/ssid":{"key":"internet_access:ssid","type":"text","label":"SSID (Network Name)"},"kerb":{"key":"kerb","type":"combo","label":"Curb"},"label":{"key":"label","type":"textarea","label":"Label"},"lamp_type":{"key":"lamp_type","type":"combo","label":"Type"},"landuse":{"key":"landuse","type":"typeCombo","label":"Type"},"lanes":{"key":"lanes","type":"number","label":"Lanes","placeholder":"1, 2, 3..."},"layer":{"key":"layer","type":"number","label":"Layer","placeholder":"0"},"leaf_cycle_singular":{"key":"leaf_cycle","type":"combo","label":"Leaf Cycle","strings":{"options":{"evergreen":"Evergreen","deciduous":"Deciduous","semi_evergreen":"Semi-Evergreen","semi_deciduous":"Semi-Deciduous"}}},"leaf_cycle":{"key":"leaf_cycle","type":"combo","label":"Leaf Cycle","strings":{"options":{"evergreen":"Evergreen","deciduous":"Deciduous","semi_evergreen":"Semi-Evergreen","semi_deciduous":"Semi-Deciduous","mixed":"Mixed"}}},"leaf_type_singular":{"key":"leaf_type","type":"combo","label":"Leaf Type","strings":{"options":{"broadleaved":"Broadleaved","needleleaved":"Needleleaved","leafless":"Leafless"}}},"leaf_type":{"key":"leaf_type","type":"combo","label":"Leaf Type","strings":{"options":{"broadleaved":"Broadleaved","needleleaved":"Needleleaved","mixed":"Mixed","leafless":"Leafless"}}},"leisure":{"key":"leisure","type":"typeCombo","label":"Type"},"length":{"key":"length","type":"number","label":"Length (Meters)"},"level":{"key":"level","type":"combo","label":"Level","universal":true},"levels":{"key":"building:levels","type":"number","label":"Levels","placeholder":"2, 4, 6..."},"lit":{"key":"lit","type":"check","label":"Lit"},"location":{"key":"location","type":"combo","label":"Location"},"man_made":{"key":"man_made","type":"typeCombo","label":"Type"},"manhole":{"key":"manhole","type":"typeCombo","label":"Type"},"map_size":{"key":"map_size","type":"typeCombo","label":"Coverage"},"map_type":{"key":"map_type","type":"typeCombo","label":"Type"},"maxheight":{"key":"maxheight","type":"combo","label":"Max Height","placeholder":"4, 4.5, 5, 14'0\", 14'6\", 15'0\"","snake_case":false},"maxspeed":{"key":"maxspeed","type":"maxspeed","label":"Speed Limit","placeholder":"40, 50, 60..."},"maxstay":{"key":"maxstay","type":"combo","label":"Max Stay","options":["15 min","30 min","45 min","1 hr","1.5 hr","2 hr","2.5 hr","3 hr","4 hr","1 day","2 day"],"snake_case":false},"maxweight":{"key":"maxweight","type":"combo","label":"Max Weight","snake_case":false},"memorial":{"key":"memorial","type":"typeCombo","label":"Type"},"monitoring_multi":{"key":"monitoring:","type":"multiCombo","label":"Monitoring"},"mtb/scale":{"key":"mtb:scale","type":"combo","label":"Mountain Biking Difficulty","placeholder":"0, 1, 2, 3...","strings":{"options":{"0":"0: Solid gravel/packed earth, no obstacles, wide curves","1":"1: Some loose surface, small obstacles, wide curves","2":"2: Much loose surface, large obstacles, easy hairpins","3":"3: Slippery surface, large obstacles, tight hairpins","4":"4: Loose surface or boulders, dangerous hairpins","5":"5: Maximum difficulty, boulder fields, landslides","6":"6: Not rideable except by the very best mountain bikers"}}},"mtb/scale/imba":{"key":"mtb:scale:imba","type":"combo","label":"IMBA Trail Difficulty","placeholder":"Easy, Medium, Difficult...","strings":{"options":{"0":"Easiest (white circle)","1":"Easy (green circle)","2":"Medium (blue square)","3":"Difficult (black diamond)","4":"Extremely Difficult (double black diamond)"}}},"mtb/scale/uphill":{"key":"mtb:scale:uphill","type":"combo","label":"Mountain Biking Uphill Difficulty","placeholder":"0, 1, 2, 3...","strings":{"options":{"0":"0: Avg. incline <10%, gravel/packed earth, no obstacles","1":"1: Avg. incline <15%, gravel/packed earth, few small objects","2":"2: Avg. incline <20%, stable surface, fistsize rocks/roots","3":"3: Avg. incline <25%, variable surface, fistsize rocks/branches","4":"4: Avg. incline <30%, poor condition, big rocks/branches","5":"5: Very steep, bike generally needs to be pushed or carried"}}},"name":{"key":"name","type":"localized","label":"Name","universal":true,"placeholder":"Common name (if any)"},"natural":{"key":"natural","type":"typeCombo","label":"Natural"},"network_bicycle":{"key":"network","type":"combo","label":"Network Type","placeholder":"Local, Regional, National, International","strings":{"options":{"lcn":"Local","rcn":"Regional","ncn":"National","icn":"International"}}},"network_foot":{"key":"network","type":"combo","label":"Network Type","placeholder":"Local, Regional, National, International","strings":{"options":{"lwn":"Local","rwn":"Regional","nwn":"National","iwn":"International"}}},"network_horse":{"key":"network","type":"combo","label":"Network Type","placeholder":"Local, Regional, National, International","strings":{"options":{"lhn":"Local","rhn":"Regional","nhn":"National","ihn":"International"}}},"network_road":{"key":"network","type":"networkCombo","label":"Network"},"network":{"key":"network","type":"text","label":"Network"},"note":{"key":"note","type":"textarea","universal":true,"icon":"note","label":"Note"},"office":{"key":"office","type":"typeCombo","label":"Type"},"oneway_yes":{"key":"oneway","type":"onewayCheck","label":"One Way","strings":{"options":{"undefined":"Assumed to be Yes","yes":"Yes","no":"No","reversible":"Reversible","alternating":"Alternating"}}},"oneway":{"key":"oneway","type":"onewayCheck","label":"One Way","strings":{"options":{"undefined":"Assumed to be No","yes":"Yes","no":"No","reversible":"Reversible","alternating":"Alternating"}}},"opening_hours":{"key":"opening_hours","type":"combo","label":"Hours","snake_case":false},"operator":{"key":"operator","type":"text","label":"Operator"},"outdoor_seating":{"key":"outdoor_seating","type":"check","label":"Outdoor Seating"},"par":{"key":"par","type":"number","label":"Par","placeholder":"3, 4, 5..."},"park_ride":{"key":"park_ride","type":"check","label":"Park and Ride"},"parking":{"key":"parking","type":"combo","label":"Type","strings":{"options":{"surface":"Surface","multi-storey":"Multilevel","underground":"Underground","sheds":"Sheds","carports":"Carports","garage_boxes":"Garage Boxes","lane":"Roadside Lane"}}},"payment_multi":{"key":"payment:","type":"multiCombo","label":"Payment Types","universal":true},"phases":{"key":"phases","type":"number","label":"Phases","placeholder":"1, 2, 3..."},"phone":{"key":"phone","type":"tel","icon":"telephone","universal":true,"label":"Phone","placeholder":"+31 42 123 4567"},"piste/difficulty":{"key":"piste:difficulty","type":"combo","label":"Difficulty","placeholder":"Easy, Intermediate, Advanced...","strings":{"options":{"novice":"Novice (instructional)","easy":"Easy (green circle)","intermediate":"Intermediate (blue square)","advanced":"Advanced (black diamond)","expert":"Expert (double black diamond)","freeride":"Freeride (off-piste)","extreme":"Extreme (climbing equipment required)"}}},"piste/grooming":{"key":"piste:grooming","type":"combo","label":"Grooming","strings":{"options":{"classic":"Classic","mogul":"Mogul","backcountry":"Backcountry","classic+skating":"Classic and Skating","scooter":"Scooter/Snowmobile","skating":"Skating"}}},"piste/type":{"key":"piste:type","type":"typeCombo","label":"Type","strings":{"options":{"downhill":"Downhill","nordic":"Nordic","skitour":"Skitour","sled":"Sled","hike":"Hike","sleigh":"Sleigh","ice_skate":"Ice Skate","snow_park":"Snow Park","playground":"Playground"}}},"place":{"key":"place","type":"typeCombo","label":"Type"},"plant":{"key":"plant","type":"combo","label":"Plant"},"plant/output/electricity":{"key":"plant:output:electricity","type":"text","label":"Power Output","placeholder":"500 MW, 1000 MW, 2000 MW..."},"playground/baby":{"key":"baby","type":"check","label":"Baby Seat"},"playground/max_age":{"key":"max_age","type":"number","label":"Maximum Age"},"playground/min_age":{"key":"min_age","type":"number","label":"Minimum Age"},"population":{"key":"population","type":"text","label":"Population"},"power_supply":{"key":"power_supply","type":"check","label":"Power Supply"},"power":{"key":"power","type":"typeCombo","label":"Type"},"produce":{"key":"produce","type":"semiCombo","label":"Produce"},"product":{"key":"product","type":"semiCombo","label":"Products"},"railway":{"key":"railway","type":"typeCombo","label":"Type"},"railway/position":{"key":"railway:position","type":"text","placeholder":"Distance to one decimal (123.4)","label":"Milestone Position"},"railway/signal/direction":{"key":"railway:signal:direction","type":"combo","label":"Direction","strings":{"options":{"forward":"Forward","backward":"Backward","both":"Both / All"}}},"rating":{"key":"rating","type":"combo","label":"Power Rating","snake_case":false},"recycling_accepts":{"key":"recycling:","type":"multiCombo","label":"Accepts"},"ref_aeroway_gate":{"key":"ref","type":"text","label":"Gate Number"},"ref_golf_hole":{"key":"ref","type":"text","label":"Hole Number","placeholder":"1-18"},"ref_highway_junction":{"key":"ref","type":"text","label":"Junction Number"},"ref_platform":{"key":"ref","type":"text","label":"Platform Number"},"ref_road_number":{"key":"ref","type":"text","label":"Road Number"},"ref_route":{"key":"ref","type":"text","label":"Route Number"},"ref_runway":{"key":"ref","type":"text","label":"Runway Number","placeholder":"e.g. 01L/19R"},"ref_stop_position":{"key":"ref","type":"text","label":"Stop Number"},"ref_taxiway":{"key":"ref","type":"text","label":"Taxiway Name","placeholder":"e.g. A5"},"ref":{"key":"ref","type":"text","label":"Reference Code"},"ref/isil":{"key":"ref:isil","type":"text","label":"ISIL Code"},"relation":{"key":"type","type":"combo","label":"Type"},"religion":{"key":"religion","type":"combo","label":"Religion"},"restriction":{"key":"restriction","type":"combo","label":"Type"},"restrictions":{"type":"restrictions","geometry":"vertex","icon":"restrictions","reference":{"rtype":"restriction"},"label":"Turn Restrictions"},"rooms":{"key":"rooms","type":"number","label":"Rooms"},"route_master":{"key":"route_master","type":"combo","label":"Type"},"route":{"key":"route","type":"combo","label":"Type"},"sac_scale":{"key":"sac_scale","type":"combo","label":"Hiking Difficulty","placeholder":"Mountain Hiking, Alpine Hiking...","strings":{"options":{"hiking":"T1: Hiking","mountain_hiking":"T2: Mountain Hiking","demanding_mountain_hiking":"T3: Demanding Mountain Hiking","alpine_hiking":"T4: Alpine Hiking","demanding_alpine_hiking":"T5: Demanding Alpine Hiking","difficult_alpine_hiking":"T6: Difficult Alpine Hiking"}}},"sanitary_dump_station":{"key":"sanitary_dump_station","type":"check","label":"Toilet Disposal"},"seasonal":{"key":"seasonal","type":"check","label":"Seasonal"},"second_hand":{"key":"second_hand","type":"combo","label":"Sells Used","placeholder":"Yes, No, Only","strings":{"options":{"yes":"Yes","no":"No","only":"Only"}}},"service_rail":{"key":"service","type":"combo","label":"Service Type","strings":{"options":{"spur":"Spur","yard":"Yard","siding":"Siding","crossover":"Crossover"}}},"service_times":{"key":"service_times","type":"text","label":"Service Times"},"service":{"key":"service","type":"combo","label":"Type","options":["parking_aisle","driveway","alley","emergency_access","drive-through"]},"service/bicycle":{"key":"service:bicycle:","type":"multiCombo","label":"Services"},"service/vehicle":{"key":"service:vehicle:","type":"multiCombo","label":"Services"},"shelter_type":{"key":"shelter_type","type":"combo","label":"Type"},"shelter":{"key":"shelter","type":"check","label":"Shelter"},"shop":{"key":"shop","type":"typeCombo","label":"Type"},"site":{"key":"site","type":"combo","label":"Type"},"smoking":{"key":"smoking","type":"combo","label":"Smoking","placeholder":"No, Separated, Yes...","strings":{"options":{"no":"No smoking anywhere","separated":"In smoking areas, not physically isolated","isolated":"In smoking areas, physically isolated","outside":"Allowed outside","yes":"Allowed everywhere","dedicated":"Dedicated to smokers (e.g. smokers' club)"}}},"smoothness":{"key":"smoothness","type":"combo","label":"Smoothness","placeholder":"Thin Rollers, Wheels, Off-Road...","strings":{"options":{"excellent":"Thin Rollers: rollerblade, skateboard","good":"Thin Wheels: racing bike","intermediate":"Wheels: city bike, wheelchair, scooter","bad":"Robust Wheels: trekking bike, car, rickshaw","very_bad":"High Clearance: light duty off-road vehicle","horrible":"Off-Road: heavy duty off-road vehicle","very_horrible":"Specialized off-road: tractor, ATV","impassable":"Impassable / No wheeled vehicle"}}},"social_facility_for":{"key":"social_facility:for","type":"combo","label":"People Served"},"social_facility":{"key":"social_facility","type":"combo","label":"Type"},"source":{"key":"source","type":"semiCombo","icon":"source","universal":true,"label":"Sources","snake_case":false,"caseSensitive":true,"options":["survey","local knowledge","gps","aerial imagery","streetlevel imagery"]},"sport_ice":{"key":"sport","type":"semiCombo","label":"Sports","options":["skating","hockey","multi","curling","ice_stock"]},"sport_racing_motor":{"key":"sport","type":"semiCombo","label":"Sports","options":["motor","karting","motocross"]},"sport_racing_nonmotor":{"key":"sport","type":"semiCombo","label":"Sports","options":["bmx","cycling","dog_racing","horse_racing","running"]},"sport":{"key":"sport","type":"semiCombo","label":"Sports"},"stars":{"key":"stars","type":"number","label":"Stars"},"start_date":{"key":"start_date","type":"text","universal":true,"label":"Start Date"},"step_count":{"key":"step_count","type":"number","label":"Number of Steps"},"stop":{"key":"stop","type":"combo","label":"Stop Type","strings":{"options":{"all":"All Ways","minor":"Minor Road"}}},"structure_waterway":{"type":"structureRadio","keys":["tunnel"],"label":"Structure","placeholder":"Unknown","strings":{"options":{"tunnel":"Tunnel"}}},"structure":{"type":"structureRadio","keys":["bridge","tunnel","embankment","cutting","ford"],"label":"Structure","placeholder":"Unknown","strings":{"options":{"bridge":"Bridge","tunnel":"Tunnel","embankment":"Embankment","cutting":"Cutting","ford":"Ford"}}},"studio":{"key":"studio","type":"combo","label":"Type"},"substance":{"key":"substance","type":"combo","label":"Substance"},"substation":{"key":"substation","type":"typeCombo","label":"Type"},"supervised":{"key":"supervised","type":"check","label":"Supervised"},"support":{"key":"support","type":"combo","label":"Support"},"surface":{"key":"surface","type":"combo","label":"Surface"},"surveillance":{"key":"surveillance","type":"combo","label":"Surveillance Kind"},"surveillance/type":{"key":"surveillance:type","type":"combo","label":"Surveillance Type","strings":{"options":{"camera":"Camera","guard":"Guard","ALPR":"Automatic License Plate Reader"}}},"surveillance/zone":{"key":"surveillance:zone","type":"combo","label":"Surveillance Zone"},"switch":{"key":"switch","type":"combo","label":"Type","strings":{"options":{"mechanical":"Mechanical","circuit_breaker":"Circuit Breaker","disconnector":"Disconnector","earthing":"Earthing"}}},"tactile_paving":{"key":"tactile_paving","type":"check","label":"Tactile Paving"},"takeaway":{"key":"takeaway","type":"combo","label":"Takeaway","placeholder":"Yes, No, Takeaway Only...","strings":{"options":{"yes":"Yes","no":"No","only":"Takeaway Only"}}},"toilets/disposal":{"key":"toilets:disposal","type":"combo","label":"Disposal","strings":{"options":{"flush":"Flush","pitlatrine":"Pit/Latrine","chemical":"Chemical","bucket":"Bucket"}}},"toll":{"key":"toll","type":"check","label":"Toll"},"tomb":{"key":"tomb","type":"typeCombo","label":"Type"},"tourism_attraction":{"key":"tourism","default":"attraction","type":"typeCombo","universal":true,"label":"Tourism"},"tourism":{"key":"tourism","type":"typeCombo","label":"Type"},"tower/construction":{"key":"tower:construction","type":"combo","label":"Construction","placeholder":"Guyed, Lattice, Concealed, ..."},"tower/type":{"key":"tower:type","type":"combo","label":"Type"},"tracktype":{"key":"tracktype","type":"combo","label":"Track Type","placeholder":"Solid, Mostly Solid, Soft...","strings":{"options":{"grade1":"Solid: paved or heavily compacted hardcore surface","grade2":"Mostly Solid: gravel/rock with some soft material mixed in","grade3":"Even mixture of hard and soft materials","grade4":"Mostly Soft: soil/sand/grass with some hard material mixed in","grade5":"Soft: soil/sand/grass"}}},"trade":{"key":"trade","type":"typeCombo","label":"Type"},"traffic_calming":{"key":"traffic_calming","type":"typeCombo","label":"Type"},"traffic_signals":{"key":"traffic_signals","type":"combo","label":"Type","default":"signal"},"traffic_signals/direction":{"key":"traffic_signals:direction","type":"combo","label":"Direction","strings":{"options":{"forward":"Forward","backward":"Backward","both":"Both / All"}}},"trail_visibility":{"key":"trail_visibility","type":"combo","label":"Trail Visibility","placeholder":"Excellent, Good, Bad...","strings":{"options":{"excellent":"Excellent: unambiguous path or markers everywhere","good":"Good: markers visible, sometimes require searching","intermediate":"Intermediate: few markers, path mostly visible","bad":"Bad: no markers, path sometimes invisible/pathless","horrible":"Horrible: often pathless, some orientation skills required","no":"No: pathless, excellent orientation skills required"}}},"transformer":{"key":"transformer","type":"combo","label":"Type","strings":{"options":{"distribution":"Distribution","generator":"Generator","converter":"Converter","traction":"Traction","auto":"Autotransformer","phase_angle_regulator":"Phase Angle Regulator","auxiliary":"Auxiliary","yes":"Unknown"}}},"trees":{"key":"trees","type":"semiCombo","label":"Trees"},"tunnel":{"key":"tunnel","type":"typeCombo","label":"Type","placeholder":"Default"},"vending":{"key":"vending","type":"combo","label":"Type of Goods"},"visibility":{"key":"visibility","type":"combo","label":"Visibility","strings":{"options":{"house":"Up to 5m (16ft)","street":"5 to 20m (16 to 65ft)","area":"Over 20m (65ft)"}}},"volcano/status":{"key":"volcano:status","type":"combo","label":"Volcano Status","strings":{"options":{"active":"Active","dormant":"Dormant","extinct":"Extinct"}}},"volcano/type":{"key":"volcano:type","type":"combo","label":"Volcano Type","strings":{"options":{"stratovolcano":"Stratovolcano","shield":"Shield","scoria":"Scoria"}}},"voltage":{"key":"voltage","type":"combo","label":"Voltage"},"voltage/primary":{"key":"voltage:primary","type":"combo","label":"Primary Voltage"},"voltage/secondary":{"key":"voltage:secondary","type":"combo","label":"Secondary Voltage"},"voltage/tertiary":{"key":"voltage:tertiary","type":"combo","label":"Tertiary Voltage"},"wall":{"key":"wall","type":"combo","label":"Type"},"water_point":{"key":"water_point","type":"check","label":"Water Point"},"water":{"key":"water","type":"combo","label":"Type"},"waterway":{"key":"waterway","type":"typeCombo","label":"Type"},"website":{"key":"website","type":"url","icon":"website","placeholder":"http://example.com/","universal":true,"label":"Website"},"wetland":{"key":"wetland","type":"combo","label":"Type"},"wheelchair":{"key":"wheelchair","type":"radio","options":["yes","limited","no"],"icon":"wheelchair","universal":true,"label":"Wheelchair Access"},"wholesale":{"key":"wholesale","type":"typeCombo","label":"Wholesale"},"width":{"key":"width","type":"number","label":"Width (Meters)"},"wikipedia":{"key":"wikipedia","keys":["wikipedia","wikidata"],"type":"wikipedia","icon":"wikipedia","universal":true,"label":"Wikipedia"},"windings":{"key":"windings","type":"number","label":"Windings","placeholder":"1, 2, 3..."},"windings/configuration":{"key":"windings:configuration","type":"combo","label":"Windings Configuration","strings":{"options":{"star":"Star / Wye","delta":"Delta","open-delta":"Open Delta","zigzag":"Zig Zag","open":"Open","scott":"Scott","leblanc":"Leblanc"}}}};
23653
23654 var all = ["aerialway","airfield","airport","alcohol-shop","america-football","amusement-park","aquarium","art-gallery","attraction","bakery","bank","bar","barrier","baseball","basketball","bbq","beer","bicycle","bicycle-share","blood-bank","buddhism","building","building-alt1","bus","cafe","campsite","car","castle","cemetery","cinema","circle","circle-stroked","city","clothing-store","college","commercial","cricket","cross","dam","danger","defibrillator","dentist","doctor","dog-park","drinking-water","embassy","emergency-phone","entrance","entrance-alt1","farm","fast-food","fence","ferry","fire-station","florist","fuel","gaming","garden","garden-center","gift","golf","grocery","hairdresser","harbor","heart","heliport","home","horse-riding","hospital","ice-cream","industry","information","karaoke","landmark","landuse","laundry","library","lighthouse","lodging","logging","marker","marker-stroked","mobile-phone","monument","mountain","museum","music","natural","park","park-alt1","parking","parking-garage","pharmacy","picnic-site","pitch","place-of-worship","playground","police","post","prison","rail","rail-light","rail-metro","ranger-station","recycling","religious-christian","religious-jewish","religious-muslim","residential-community","restaurant","roadblock","rocket","school","scooter","shelter","shop","skiing","slaughterhouse","snowmobile","soccer","square","square-stroked","stadium","star","star-stroked","suitcase","sushi","swimming","teahouse","telephone","tennis","theatre","toilet","town","town-hall","triangle","triangle-stroked","veterinary","village","volcano","warehouse","waste-basket","water","wetland","wheelchair","zoo"];
23655 var all$1 = {
23656         all: all
23657 };
23658
23659 var all$2 = Object.freeze({
23660         all: all,
23661         default: all$1
23662 });
23663
23664 var Airport = ["airfield","airport","heliport","rocket"];
23665 var Dining = ["bakery","bar","beer","cafe","fast-food","ice-cream","restaurant"];
23666 var Education = ["college","school"];
23667 var General = ["alcohol-shop","amusement-park","aquarium","art-gallery","attraction","bank","bicycle","bicycle-share","car","castle","cinema","circle","circle-stroked","clothing-store","drinking-water","embassy","fire-station","fuel","grocery","harbor","information","laundry","library","lodging","marker","monument","museum","music","place-of-worship","police","post","prison","religious-christian","religious-jewish","religious-muslim","shop","stadium","star","suitcase","swimming","theatre","toilet","town-hall","triangle","triangle-stroked","veterinary"];
23668 var Health = ["dentist","doctor","hospital","pharmacy"];
23669 var Outdoors = ["campsite","cemetery","dog-park","garden","golf","park","picnic-site","playground","zoo"];
23670 var Transit = ["bus","ferry"];
23671 var streets = {
23672         Airport: Airport,
23673         Dining: Dining,
23674         Education: Education,
23675         General: General,
23676         Health: Health,
23677         Outdoors: Outdoors,
23678         Transit: Transit,
23679         "Mountain peak": ["mountain","volcano"],
23680         "Rail station": ["entrance","rail","rail-light","rail-metro"]
23681 };
23682
23683 var streets$1 = Object.freeze({
23684         Airport: Airport,
23685         Dining: Dining,
23686         Education: Education,
23687         General: General,
23688         Health: Health,
23689         Outdoors: Outdoors,
23690         Transit: Transit,
23691         default: streets
23692 });
23693
23694 var require$$0$1 = ( all$2 && all$1 ) || all$2;
23695
23696 var require$$1$1 = ( streets$1 && streets ) || streets$1;
23697
23698 var maki = {
23699   layouts: {
23700     all: require$$0$1,
23701     streets: require$$1$1
23702   }
23703 };
23704
23705 var dataFeatureIcons = maki.layouts.all.all;
23706
23707 var data = {
23708     imagery: dataImagery,
23709     presets: {
23710         presets: presets,
23711         defaults: defaults,
23712         categories: categories,
23713         fields: fields
23714     }
23715 };
23716
23717 function osmEntity$$1(attrs) {
23718     // For prototypal inheritance.
23719     if (this instanceof osmEntity$$1) return;
23720
23721     // Create the appropriate subtype.
23722     if (attrs && attrs.type) {
23723         return osmEntity$$1[attrs.type].apply(this, arguments);
23724     } else if (attrs && attrs.id) {
23725         return osmEntity$$1[osmEntity$$1.id.type(attrs.id)].apply(this, arguments);
23726     }
23727
23728     // Initialize a generic Entity (used only in tests).
23729     return (new osmEntity$$1()).initialize(arguments);
23730 }
23731
23732
23733 osmEntity$$1.id = function(type) {
23734     return osmEntity$$1.id.fromOSM(type, osmEntity$$1.id.next[type]--);
23735 };
23736
23737
23738 osmEntity$$1.id.next = {
23739     changeset: -1, node: -1, way: -1, relation: -1
23740 };
23741
23742
23743 osmEntity$$1.id.fromOSM = function(type, id) {
23744     return type[0] + id;
23745 };
23746
23747
23748 osmEntity$$1.id.toOSM = function(id) {
23749     return id.slice(1);
23750 };
23751
23752
23753 osmEntity$$1.id.type = function(id) {
23754     return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
23755 };
23756
23757
23758 // A function suitable for use as the second argument to d3.selection#data().
23759 osmEntity$$1.key = function(entity) {
23760     return entity.id + 'v' + (entity.v || 0);
23761 };
23762
23763
23764 osmEntity$$1.prototype = {
23765
23766     tags: {},
23767
23768
23769     initialize: function(sources) {
23770         for (var i = 0; i < sources.length; ++i) {
23771             var source = sources[i];
23772             for (var prop in source) {
23773                 if (Object.prototype.hasOwnProperty.call(source, prop)) {
23774                     if (source[prop] === undefined) {
23775                         delete this[prop];
23776                     } else {
23777                         this[prop] = source[prop];
23778                     }
23779                 }
23780             }
23781         }
23782
23783         if (!this.id && this.type) {
23784             this.id = osmEntity$$1.id(this.type);
23785         }
23786         if (!this.hasOwnProperty('visible')) {
23787             this.visible = true;
23788         }
23789
23790         if (debug) {
23791             Object.freeze(this);
23792             Object.freeze(this.tags);
23793
23794             if (this.loc) Object.freeze(this.loc);
23795             if (this.nodes) Object.freeze(this.nodes);
23796             if (this.members) Object.freeze(this.members);
23797         }
23798
23799         return this;
23800     },
23801
23802
23803     copy: function(resolver, copies) {
23804         if (copies[this.id])
23805             return copies[this.id];
23806
23807         var copy = osmEntity$$1(this, {id: undefined, user: undefined, version: undefined});
23808         copies[this.id] = copy;
23809
23810         return copy;
23811     },
23812
23813
23814     osmId: function() {
23815         return osmEntity$$1.id.toOSM(this.id);
23816     },
23817
23818
23819     isNew: function() {
23820         return this.osmId() < 0;
23821     },
23822
23823
23824     update: function(attrs) {
23825         return osmEntity$$1(this, attrs, {v: 1 + (this.v || 0)});
23826     },
23827
23828
23829     mergeTags: function(tags) {
23830         var merged = clone(this.tags), changed = false;
23831         for (var k in tags) {
23832             var t1 = merged[k],
23833                 t2 = tags[k];
23834             if (!t1) {
23835                 changed = true;
23836                 merged[k] = t2;
23837             } else if (t1 !== t2) {
23838                 changed = true;
23839                 merged[k] = union(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
23840             }
23841         }
23842         return changed ? this.update({tags: merged}) : this;
23843     },
23844
23845
23846     intersects: function(extent, resolver) {
23847         return this.extent(resolver).intersects(extent);
23848     },
23849
23850
23851     isUsed: function(resolver) {
23852         return without(Object.keys(this.tags), 'area').length > 0 ||
23853             resolver.parentRelations(this).length > 0;
23854     },
23855
23856
23857     hasInterestingTags: function() {
23858         return keys$1(this.tags).some(osmIsInterestingTag);
23859     },
23860
23861
23862     isHighwayIntersection: function() {
23863         return false;
23864     },
23865
23866     isDegenerate: function() {
23867         return true;
23868     },
23869
23870     deprecatedTags: function() {
23871         var tags = toPairs(this.tags);
23872         var deprecated = {};
23873
23874         dataDeprecated.forEach(function(d) {
23875             var match = toPairs(d.old)[0];
23876             tags.forEach(function(t) {
23877                 if (t[0] === match[0] &&
23878                     (t[1] === match[1] || match[1] === '*')) {
23879                     deprecated[t[0]] = t[1];
23880                 }
23881             });
23882         });
23883
23884         return deprecated;
23885     }
23886 };
23887
23888 function geoExtent$$1(min, max) {
23889     if (!(this instanceof geoExtent$$1)) return new geoExtent$$1(min, max);
23890     if (min instanceof geoExtent$$1) {
23891         return min;
23892     } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
23893         this[0] = min[0];
23894         this[1] = min[1];
23895     } else {
23896         this[0] = min        || [ Infinity,  Infinity];
23897         this[1] = max || min || [-Infinity, -Infinity];
23898     }
23899 }
23900
23901 geoExtent$$1.prototype = new Array(2);
23902
23903 assignIn(geoExtent$$1.prototype, {
23904
23905     equals: function (obj) {
23906         return this[0][0] === obj[0][0] &&
23907             this[0][1] === obj[0][1] &&
23908             this[1][0] === obj[1][0] &&
23909             this[1][1] === obj[1][1];
23910     },
23911
23912
23913     extend: function(obj) {
23914         if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23915         return geoExtent$$1(
23916             [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
23917             [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
23918         );
23919     },
23920
23921
23922     _extend: function(extent) {
23923         this[0][0] = Math.min(extent[0][0], this[0][0]);
23924         this[0][1] = Math.min(extent[0][1], this[0][1]);
23925         this[1][0] = Math.max(extent[1][0], this[1][0]);
23926         this[1][1] = Math.max(extent[1][1], this[1][1]);
23927     },
23928
23929
23930     area: function() {
23931         return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
23932     },
23933
23934
23935     center: function() {
23936         return [(this[0][0] + this[1][0]) / 2,
23937                 (this[0][1] + this[1][1]) / 2];
23938     },
23939
23940
23941     rectangle: function() {
23942         return [this[0][0], this[0][1], this[1][0], this[1][1]];
23943     },
23944
23945
23946     bbox: function() {
23947         return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
23948     },
23949
23950
23951     polygon: function() {
23952         return [
23953             [this[0][0], this[0][1]],
23954             [this[0][0], this[1][1]],
23955             [this[1][0], this[1][1]],
23956             [this[1][0], this[0][1]],
23957             [this[0][0], this[0][1]]
23958         ];
23959     },
23960
23961
23962     contains: function(obj) {
23963         if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23964         return obj[0][0] >= this[0][0] &&
23965                obj[0][1] >= this[0][1] &&
23966                obj[1][0] <= this[1][0] &&
23967                obj[1][1] <= this[1][1];
23968     },
23969
23970
23971     intersects: function(obj) {
23972         if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23973         return obj[0][0] <= this[1][0] &&
23974                obj[0][1] <= this[1][1] &&
23975                obj[1][0] >= this[0][0] &&
23976                obj[1][1] >= this[0][1];
23977     },
23978
23979
23980     intersection: function(obj) {
23981         if (!this.intersects(obj)) return new geoExtent$$1();
23982         return new geoExtent$$1(
23983             [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
23984             [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
23985         );
23986     },
23987
23988
23989     percentContainedIn: function(obj) {
23990         if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23991         var a1 = this.intersection(obj).area(),
23992             a2 = this.area();
23993
23994         if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
23995             return 0;
23996         } else {
23997             return a1 / a2;
23998         }
23999     },
24000
24001
24002     padByMeters: function(meters) {
24003         var dLat = geoMetersToLat(meters),
24004             dLon = geoMetersToLon(meters, this.center()[1]);
24005         return geoExtent$$1(
24006             [this[0][0] - dLon, this[0][1] - dLat],
24007             [this[1][0] + dLon, this[1][1] + dLat]
24008         );
24009     },
24010
24011
24012     toParam: function() {
24013         return this.rectangle().join(',');
24014     }
24015
24016 });
24017
24018 // constants
24019 var TAU = 2 * Math.PI;
24020 var EQUATORIAL_RADIUS = 6356752.314245179;
24021 var POLAR_RADIUS = 6378137.0;
24022
24023
24024 function geoLatToMeters(dLat) {
24025     return dLat * (TAU * POLAR_RADIUS / 360);
24026 }
24027
24028
24029 function geoLonToMeters(dLon, atLat) {
24030     return Math.abs(atLat) >= 90 ? 0 :
24031         dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180)));
24032 }
24033
24034
24035 function geoMetersToLat(m) {
24036     return m / (TAU * POLAR_RADIUS / 360);
24037 }
24038
24039
24040 function geoMetersToLon(m, atLat) {
24041     return Math.abs(atLat) >= 90 ? 0 :
24042         m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180)));
24043 }
24044
24045
24046 function geoMetersToOffset(meters, tileSize) {
24047     tileSize = tileSize || 256;
24048     return [
24049         meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS),
24050         -meters[1] * tileSize / (TAU * POLAR_RADIUS)
24051     ];
24052 }
24053
24054
24055 function geoOffsetToMeters(offset, tileSize) {
24056     tileSize = tileSize || 256;
24057     return [
24058         offset[0] * TAU * EQUATORIAL_RADIUS / tileSize,
24059         -offset[1] * TAU * POLAR_RADIUS / tileSize
24060     ];
24061 }
24062
24063
24064 // Equirectangular approximation of spherical distances on Earth
24065 function geoSphericalDistance(a, b) {
24066     var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2);
24067     var y = geoLatToMeters(a[1] - b[1]);
24068     return Math.sqrt((x * x) + (y * y));
24069 }
24070
24071
24072 // scale to zoom
24073 function geoScaleToZoom(k, tileSize) {
24074     tileSize = tileSize || 256;
24075     var log2ts = Math.log(tileSize) * Math.LOG2E;
24076     return Math.log(k * TAU) / Math.LN2 - log2ts;
24077 }
24078
24079
24080 // zoom to scale
24081 function geoZoomToScale(z, tileSize) {
24082     tileSize = tileSize || 256;
24083     return tileSize * Math.pow(2, z) / TAU;
24084 }
24085
24086 /**
24087  * A specialized version of `_.every` for arrays without support for
24088  * iteratee shorthands.
24089  *
24090  * @private
24091  * @param {Array} [array] The array to iterate over.
24092  * @param {Function} predicate The function invoked per iteration.
24093  * @returns {boolean} Returns `true` if all elements pass the predicate check,
24094  *  else `false`.
24095  */
24096 function arrayEvery(array, predicate) {
24097   var index = -1,
24098       length = array == null ? 0 : array.length;
24099
24100   while (++index < length) {
24101     if (!predicate(array[index], index, array)) {
24102       return false;
24103     }
24104   }
24105   return true;
24106 }
24107
24108 /**
24109  * The base implementation of `_.every` without support for iteratee shorthands.
24110  *
24111  * @private
24112  * @param {Array|Object} collection The collection to iterate over.
24113  * @param {Function} predicate The function invoked per iteration.
24114  * @returns {boolean} Returns `true` if all elements pass the predicate check,
24115  *  else `false`
24116  */
24117 function baseEvery(collection, predicate) {
24118   var result = true;
24119   baseEach(collection, function(value, index, collection) {
24120     result = !!predicate(value, index, collection);
24121     return result;
24122   });
24123   return result;
24124 }
24125
24126 /**
24127  * Checks if `predicate` returns truthy for **all** elements of `collection`.
24128  * Iteration is stopped once `predicate` returns falsey. The predicate is
24129  * invoked with three arguments: (value, index|key, collection).
24130  *
24131  * **Note:** This method returns `true` for
24132  * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
24133  * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
24134  * elements of empty collections.
24135  *
24136  * @static
24137  * @memberOf _
24138  * @since 0.1.0
24139  * @category Collection
24140  * @param {Array|Object} collection The collection to iterate over.
24141  * @param {Function} [predicate=_.identity] The function invoked per iteration.
24142  * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
24143  * @returns {boolean} Returns `true` if all elements pass the predicate check,
24144  *  else `false`.
24145  * @example
24146  *
24147  * _.every([true, 1, null, 'yes'], Boolean);
24148  * // => false
24149  *
24150  * var users = [
24151  *   { 'user': 'barney', 'age': 36, 'active': false },
24152  *   { 'user': 'fred',   'age': 40, 'active': false }
24153  * ];
24154  *
24155  * // The `_.matches` iteratee shorthand.
24156  * _.every(users, { 'user': 'barney', 'active': false });
24157  * // => false
24158  *
24159  * // The `_.matchesProperty` iteratee shorthand.
24160  * _.every(users, ['active', false]);
24161  * // => true
24162  *
24163  * // The `_.property` iteratee shorthand.
24164  * _.every(users, 'active');
24165  * // => false
24166  */
24167 function every(collection, predicate, guard) {
24168   var func = isArray(collection) ? arrayEvery : baseEvery;
24169   if (guard && isIterateeCall(collection, predicate, guard)) {
24170     predicate = undefined;
24171   }
24172   return func(collection, baseIteratee(predicate, 3));
24173 }
24174
24175 /**
24176  * The base implementation of `_.some` without support for iteratee shorthands.
24177  *
24178  * @private
24179  * @param {Array|Object} collection The collection to iterate over.
24180  * @param {Function} predicate The function invoked per iteration.
24181  * @returns {boolean} Returns `true` if any element passes the predicate check,
24182  *  else `false`.
24183  */
24184 function baseSome(collection, predicate) {
24185   var result;
24186
24187   baseEach(collection, function(value, index, collection) {
24188     result = predicate(value, index, collection);
24189     return !result;
24190   });
24191   return !!result;
24192 }
24193
24194 /**
24195  * Checks if `predicate` returns truthy for **any** element of `collection`.
24196  * Iteration is stopped once `predicate` returns truthy. The predicate is
24197  * invoked with three arguments: (value, index|key, collection).
24198  *
24199  * @static
24200  * @memberOf _
24201  * @since 0.1.0
24202  * @category Collection
24203  * @param {Array|Object} collection The collection to iterate over.
24204  * @param {Function} [predicate=_.identity] The function invoked per iteration.
24205  * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
24206  * @returns {boolean} Returns `true` if any element passes the predicate check,
24207  *  else `false`.
24208  * @example
24209  *
24210  * _.some([null, 0, 'yes', false], Boolean);
24211  * // => true
24212  *
24213  * var users = [
24214  *   { 'user': 'barney', 'active': true },
24215  *   { 'user': 'fred',   'active': false }
24216  * ];
24217  *
24218  * // The `_.matches` iteratee shorthand.
24219  * _.some(users, { 'user': 'barney', 'active': false });
24220  * // => false
24221  *
24222  * // The `_.matchesProperty` iteratee shorthand.
24223  * _.some(users, ['active', false]);
24224  * // => true
24225  *
24226  * // The `_.property` iteratee shorthand.
24227  * _.some(users, 'active');
24228  * // => true
24229  */
24230 function some(collection, predicate, guard) {
24231   var func = isArray(collection) ? arraySome : baseSome;
24232   if (guard && isIterateeCall(collection, predicate, guard)) {
24233     predicate = undefined;
24234   }
24235   return func(collection, baseIteratee(predicate, 3));
24236 }
24237
24238 // vector equals
24239 function geoVecEqual(a, b, epsilon) {
24240     if (epsilon) {
24241         return (Math.abs(a[0] - b[0]) <= epsilon) && (Math.abs(a[1] - b[1]) <= epsilon);
24242     } else {
24243         return (a[0] === b[0]) && (a[1] === b[1]);
24244     }
24245 }
24246
24247 // vector addition
24248 function geoVecAdd(a, b) {
24249     return [ a[0] + b[0], a[1] + b[1] ];
24250 }
24251
24252 // vector subtraction
24253 function geoVecSubtract(a, b) {
24254     return [ a[0] - b[0], a[1] - b[1] ];
24255 }
24256
24257 // vector scaling
24258 function geoVecScale(a, mag) {
24259     return [ a[0] * mag, a[1] * mag ];
24260 }
24261
24262 // vector rounding (was: geoRoundCoordinates)
24263 function geoVecFloor(a) {
24264     return [ Math.floor(a[0]), Math.floor(a[1]) ];
24265 }
24266
24267 // linear interpolation
24268 function geoVecInterp(a, b, t) {
24269     return [
24270         a[0] + (b[0] - a[0]) * t,
24271         a[1] + (b[1] - a[1]) * t
24272     ];
24273 }
24274
24275 // http://jsperf.com/id-dist-optimization
24276 function geoVecLength(a, b) {
24277     var x = a[0] - b[0];
24278     var y = a[1] - b[1];
24279     return Math.sqrt((x * x) + (y * y));
24280 }
24281
24282 // Return the counterclockwise angle in the range (-pi, pi)
24283 // between the positive X axis and the line intersecting a and b.
24284 function geoVecAngle(a, b) {
24285     return Math.atan2(b[1] - a[1], b[0] - a[0]);
24286 }
24287
24288 // dot product
24289 function geoVecDot(a, b, origin) {
24290     origin = origin || [0, 0];
24291     return (a[0] - origin[0]) * (b[0] - origin[0]) +
24292         (a[1] - origin[1]) * (b[1] - origin[1]);
24293 }
24294
24295 // 2D cross product of OA and OB vectors, returns magnitude of Z vector
24296 // Returns a positive value, if OAB makes a counter-clockwise turn,
24297 // negative for clockwise turn, and zero if the points are collinear.
24298 function geoVecCross(a, b, origin) {
24299     origin = origin || [0, 0];
24300     return (a[0] - origin[0]) * (b[1] - origin[1]) -
24301         (a[1] - origin[1]) * (b[0] - origin[0]);
24302 }
24303
24304 // Return the counterclockwise angle in the range (-pi, pi)
24305 // between the positive X axis and the line intersecting a and b.
24306 function geoAngle(a, b, projection) {
24307     return geoVecAngle(projection(a.loc), projection(b.loc));
24308 }
24309
24310 function geoEdgeEqual(a, b) {
24311     return (a[0] === b[0] && a[1] === b[1]) ||
24312         (a[0] === b[1] && a[1] === b[0]);
24313 }
24314
24315 // Rotate all points counterclockwise around a pivot point by given angle
24316 function geoRotate(points, angle, around) {
24317     return points.map(function(point) {
24318         var radial = geoVecSubtract(point, around);
24319         return [
24320             radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0],
24321             radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]
24322         ];
24323     });
24324 }
24325
24326
24327 // Choose the edge with the minimal distance from `point` to its orthogonal
24328 // projection onto that edge, if such a projection exists, or the distance to
24329 // the closest vertex on that edge. Returns an object with the `index` of the
24330 // chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
24331 function geoChooseEdge(nodes, point, projection, activeID) {
24332     var dist = geoVecLength;
24333     var points = nodes.map(function(n) { return projection(n.loc); });
24334     var ids = nodes.map(function(n) { return n.id; });
24335     var min = Infinity;
24336     var idx;
24337     var loc;
24338
24339     for (var i = 0; i < points.length - 1; i++) {
24340         if (ids[i] === activeID || ids[i + 1] === activeID) continue;
24341
24342         var o = points[i];
24343         var s = geoVecSubtract(points[i + 1], o);
24344         var v = geoVecSubtract(point, o);
24345         var proj = geoVecDot(v, s) / geoVecDot(s, s);
24346         var p;
24347
24348         if (proj < 0) {
24349             p = o;
24350         } else if (proj > 1) {
24351             p = points[i + 1];
24352         } else {
24353             p = [o[0] + proj * s[0], o[1] + proj * s[1]];
24354         }
24355
24356         var d = dist(p, point);
24357         if (d < min) {
24358             min = d;
24359             idx = i + 1;
24360             loc = projection.invert(p);
24361         }
24362     }
24363
24364     if (idx !== undefined) {
24365         return { index: idx, distance: min, loc: loc };
24366     } else {
24367         return null;
24368     }
24369 }
24370
24371
24372 // Test active (dragged or drawing) segments against inactive segments
24373 // This is used to test e.g. multipolygon rings that cross
24374 // `activeNodes` is the ring containing the activeID being dragged.
24375 // `inactiveNodes` is the other ring to test against
24376 function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) {
24377     var actives = [];
24378     var inactives = [];
24379     var j, k, n1, n2, segment;
24380
24381     // gather active segments (only segments in activeNodes that contain the activeID)
24382     for (j = 0; j < activeNodes.length - 1; j++) {
24383         n1 = activeNodes[j];
24384         n2 = activeNodes[j+1];
24385         segment = [n1.loc, n2.loc];
24386         if (n1.id === activeID || n2.id === activeID) {
24387             actives.push(segment);
24388         }
24389     }
24390
24391     // gather inactive segments
24392     for (j = 0; j < inactiveNodes.length - 1; j++) {
24393         n1 = inactiveNodes[j];
24394         n2 = inactiveNodes[j+1];
24395         segment = [n1.loc, n2.loc];
24396         inactives.push(segment);
24397     }
24398
24399     // test
24400     for (j = 0; j < actives.length; j++) {
24401         for (k = 0; k < inactives.length; k++) {
24402             var p = actives[j];
24403             var q = inactives[k];
24404             var hit = geoLineIntersection(p, q);
24405             if (hit) {
24406                 return true;
24407             }
24408         }
24409     }
24410
24411     return false;
24412 }
24413
24414
24415 // Test active (dragged or drawing) segments against inactive segments
24416 // This is used to test whether a way intersects with itself.
24417 function geoHasSelfIntersections(nodes, activeID) {
24418     var actives = [];
24419     var inactives = [];
24420     var j, k;
24421
24422     // group active and passive segments along the nodes
24423     for (j = 0; j < nodes.length - 1; j++) {
24424         var n1 = nodes[j];
24425         var n2 = nodes[j+1];
24426         var segment = [n1.loc, n2.loc];
24427         if (n1.id === activeID || n2.id === activeID) {
24428             actives.push(segment);
24429         } else {
24430             inactives.push(segment);
24431         }
24432     }
24433
24434     // test
24435     for (j = 0; j < actives.length; j++) {
24436         for (k = 0; k < inactives.length; k++) {
24437             var p = actives[j];
24438             var q = inactives[k];
24439             // skip if segments share an endpoint
24440             if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) ||
24441                 geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1]) ) {
24442                 continue;
24443             }
24444
24445             var hit = geoLineIntersection(p, q);
24446             if (hit) {
24447                 var epsilon = 1e-8;
24448                 // skip if the hit is at the segment's endpoint
24449                 if (geoVecEqual(p[1], hit, epsilon) || geoVecEqual(p[0], hit, epsilon) ||
24450                     geoVecEqual(q[1], hit, epsilon) || geoVecEqual(q[0], hit, epsilon) ) {
24451                     continue;
24452                 } else {
24453                     return true;
24454                 }
24455             }
24456         }
24457     }
24458
24459     return false;
24460 }
24461
24462
24463 // Return the intersection point of 2 line segments.
24464 // From https://github.com/pgkelley4/line-segments-intersect
24465 // This uses the vector cross product approach described below:
24466 //  http://stackoverflow.com/a/565282/786339
24467 function geoLineIntersection(a, b) {
24468     var p = [a[0][0], a[0][1]];
24469     var p2 = [a[1][0], a[1][1]];
24470     var q = [b[0][0], b[0][1]];
24471     var q2 = [b[1][0], b[1][1]];
24472     var r = geoVecSubtract(p2, p);
24473     var s = geoVecSubtract(q2, q);
24474     var uNumerator = geoVecCross(geoVecSubtract(q, p), r);
24475     var denominator = geoVecCross(r, s);
24476
24477     if (uNumerator && denominator) {
24478         var u = uNumerator / denominator;
24479         var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
24480
24481         if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
24482             return geoVecInterp(p, p2, t);
24483         }
24484     }
24485
24486     return null;
24487 }
24488
24489
24490 function geoPathIntersections(path1, path2) {
24491     var intersections = [];
24492     for (var i = 0; i < path1.length - 1; i++) {
24493         for (var j = 0; j < path2.length - 1; j++) {
24494             var a = [ path1[i], path1[i+1] ];
24495             var b = [ path2[j], path2[j+1] ];
24496             var hit = geoLineIntersection(a, b);
24497             if (hit) {
24498                 intersections.push(hit);
24499             }
24500         }
24501     }
24502     return intersections;
24503 }
24504
24505 function geoPathHasIntersections(path1, path2) {
24506     for (var i = 0; i < path1.length - 1; i++) {
24507         for (var j = 0; j < path2.length - 1; j++) {
24508             var a = [ path1[i], path1[i+1] ];
24509             var b = [ path2[j], path2[j+1] ];
24510             var hit = geoLineIntersection(a, b);
24511             if (hit) {
24512                 return true;
24513             }
24514         }
24515     }
24516     return false;
24517 }
24518
24519
24520 // Return whether point is contained in polygon.
24521 //
24522 // `point` should be a 2-item array of coordinates.
24523 // `polygon` should be an array of 2-item arrays of coordinates.
24524 //
24525 // From https://github.com/substack/point-in-polygon.
24526 // ray-casting algorithm based on
24527 // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
24528 //
24529 function geoPointInPolygon(point, polygon) {
24530     var x = point[0];
24531     var y = point[1];
24532     var inside = false;
24533
24534     for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
24535         var xi = polygon[i][0];
24536         var yi = polygon[i][1];
24537         var xj = polygon[j][0];
24538         var yj = polygon[j][1];
24539
24540         var intersect = ((yi > y) !== (yj > y)) &&
24541             (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
24542         if (intersect) inside = !inside;
24543     }
24544
24545     return inside;
24546 }
24547
24548
24549 function geoPolygonContainsPolygon(outer, inner) {
24550     return every(inner, function(point) {
24551         return geoPointInPolygon(point, outer);
24552     });
24553 }
24554
24555
24556 function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
24557     function testPoints(outer, inner) {
24558         return some(inner, function(point) {
24559             return geoPointInPolygon(point, outer);
24560         });
24561     }
24562
24563    return testPoints(outer, inner) || (!!checkSegments && geoPathHasIntersections(outer, inner));
24564 }
24565
24566
24567 function geoPathLength(path) {
24568     var length = 0;
24569     for (var i = 0; i < path.length - 1; i++) {
24570         length += geoVecLength(path[i], path[i + 1]);
24571     }
24572     return length;
24573 }
24574
24575
24576 // If the given point is at the edge of the padded viewport,
24577 // return a vector that will nudge the viewport in that direction
24578 function geoViewportEdge(point, dimensions) {
24579     var pad = [80, 20, 50, 20];   // top, right, bottom, left
24580     var x = 0;
24581     var y = 0;
24582
24583     if (point[0] > dimensions[0] - pad[1])
24584         x = -10;
24585     if (point[0] < pad[3])
24586         x = 10;
24587     if (point[1] > dimensions[1] - pad[2])
24588         y = -10;
24589     if (point[1] < pad[0])
24590         y = 10;
24591
24592     if (x || y) {
24593         return [x, y];
24594     } else {
24595         return null;
24596     }
24597 }
24598
24599 /*
24600     Bypasses features of D3's default projection stream pipeline that are unnecessary:
24601     * Antimeridian clipping
24602     * Spherical rotation
24603     * Resampling
24604 */
24605 function geoRawMercator() {
24606     var project = mercatorRaw,
24607         k = 512 / Math.PI, // scale
24608         x = 0, y = 0, // translate
24609         clipExtent = [[0, 0], [0, 0]];
24610
24611
24612     function projection$$1(point) {
24613         point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
24614         return [point[0] * k + x, y - point[1] * k];
24615     }
24616
24617
24618     projection$$1.invert = function(point) {
24619         point = project.invert((point[0] - x) / k, (y - point[1]) / k);
24620         return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
24621     };
24622
24623
24624     projection$$1.scale = function(_) {
24625         if (!arguments.length) return k;
24626         k = +_;
24627         return projection$$1;
24628     };
24629
24630
24631     projection$$1.translate = function(_) {
24632         if (!arguments.length) return [x, y];
24633         x = +_[0];
24634         y = +_[1];
24635         return projection$$1;
24636     };
24637
24638
24639     projection$$1.clipExtent = function(_) {
24640         if (!arguments.length) return clipExtent;
24641         clipExtent = _;
24642         return projection$$1;
24643     };
24644
24645
24646     projection$$1.transform = function(_) {
24647         if (!arguments.length) return identity$7.translate(x, y).scale(k);
24648         x = +_.x;
24649         y = +_.y;
24650         k = +_.k;
24651         return projection$$1;
24652     };
24653
24654
24655     projection$$1.stream = d3_geoTransform({
24656         point: function(x, y) {
24657             x = projection$$1([x, y]);
24658             this.stream.point(x[0], x[1]);
24659         }
24660     }).stream;
24661
24662
24663     return projection$$1;
24664 }
24665
24666 function osmChangeset() {
24667     if (!(this instanceof osmChangeset)) {
24668         return (new osmChangeset()).initialize(arguments);
24669     } else if (arguments.length) {
24670         this.initialize(arguments);
24671     }
24672 }
24673
24674
24675 osmEntity$$1.changeset = osmChangeset;
24676
24677 osmChangeset.prototype = Object.create(osmEntity$$1.prototype);
24678
24679 assignIn(osmChangeset.prototype, {
24680
24681     type: 'changeset',
24682
24683
24684     extent: function() {
24685         return new geoExtent$$1();
24686     },
24687
24688
24689     geometry: function() {
24690         return 'changeset';
24691     },
24692
24693
24694     asJXON: function() {
24695         return {
24696             osm: {
24697                 changeset: {
24698                     tag: map$3(this.tags, function(value, key) {
24699                         return { '@k': key, '@v': value };
24700                     }),
24701                     '@version': 0.6,
24702                     '@generator': 'iD'
24703                 }
24704             }
24705         };
24706     },
24707
24708
24709     // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
24710     // XML. Returns a string.
24711     osmChangeJXON: function(changes) {
24712         var changeset_id = this.id;
24713
24714         function nest(x, order) {
24715             var groups = {};
24716             for (var i = 0; i < x.length; i++) {
24717                 var tagName = Object.keys(x[i])[0];
24718                 if (!groups[tagName]) groups[tagName] = [];
24719                 groups[tagName].push(x[i][tagName]);
24720             }
24721             var ordered = {};
24722             order.forEach(function(o) {
24723                 if (groups[o]) ordered[o] = groups[o];
24724             });
24725             return ordered;
24726         }
24727
24728
24729         // sort relations in a changeset by dependencies
24730         function sort(changes) {
24731
24732             // find a referenced relation in the current changeset
24733             function resolve(item) {
24734                 return find$1(relations, function(relation) {
24735                     return item.keyAttributes.type === 'relation'
24736                         && item.keyAttributes.ref === relation['@id'];
24737                 });
24738             }
24739
24740             // a new item is an item that has not been already processed
24741             function isNew(item) {
24742                 return !sorted[ item['@id'] ] && !find$1(processing, function(proc) {
24743                     return proc['@id'] === item['@id'];
24744                 });
24745             }
24746
24747             var processing = [],
24748                 sorted = {},
24749                 relations = changes.relation;
24750
24751             if (!relations) return changes;
24752
24753             for (var i = 0; i < relations.length; i++) {
24754                 var relation = relations[i];
24755
24756                 // skip relation if already sorted
24757                 if (!sorted[relation['@id']]) {
24758                     processing.push(relation);
24759                 }
24760
24761                 while (processing.length > 0) {
24762                     var next = processing[0],
24763                     deps = filter(compact(next.member.map(resolve)), isNew);
24764                     if (deps.length === 0) {
24765                         sorted[next['@id']] = next;
24766                         processing.shift();
24767                     } else {
24768                         processing = deps.concat(processing);
24769                     }
24770                 }
24771             }
24772
24773             changes.relation = values$1(sorted);
24774             return changes;
24775         }
24776
24777         function rep(entity) {
24778             return entity.asJXON(changeset_id);
24779         }
24780
24781         return {
24782             osmChange: {
24783                 '@version': 0.6,
24784                 '@generator': 'iD',
24785                 'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
24786                 'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
24787                 'delete': assignIn(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), { '@if-unused': true })
24788             }
24789         };
24790     },
24791
24792
24793     asGeoJSON: function() {
24794         return {};
24795     }
24796
24797 });
24798
24799 /**
24800  * Creates a duplicate-free version of an array, using
24801  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
24802  * for equality comparisons, in which only the first occurrence of each element
24803  * is kept. The order of result values is determined by the order they occur
24804  * in the array.
24805  *
24806  * @static
24807  * @memberOf _
24808  * @since 0.1.0
24809  * @category Array
24810  * @param {Array} array The array to inspect.
24811  * @returns {Array} Returns the new duplicate free array.
24812  * @example
24813  *
24814  * _.uniq([2, 1, 2]);
24815  * // => [2, 1]
24816  */
24817 function uniq(array) {
24818   return (array && array.length) ? baseUniq(array) : [];
24819 }
24820
24821 function osmNode() {
24822     if (!(this instanceof osmNode)) {
24823         return (new osmNode()).initialize(arguments);
24824     } else if (arguments.length) {
24825         this.initialize(arguments);
24826     }
24827 }
24828
24829 osmEntity$$1.node = osmNode;
24830
24831 osmNode.prototype = Object.create(osmEntity$$1.prototype);
24832
24833 assignIn(osmNode.prototype, {
24834
24835     type: 'node',
24836
24837
24838     extent: function() {
24839         return new geoExtent$$1(this.loc);
24840     },
24841
24842
24843     geometry: function(graph) {
24844         return graph.transient(this, 'geometry', function() {
24845             return graph.isPoi(this) ? 'point' : 'vertex';
24846         });
24847     },
24848
24849
24850     move: function(loc) {
24851         return this.update({loc: loc});
24852     },
24853
24854
24855     isDegenerate: function() {
24856         return !(
24857             Array.isArray(this.loc) && this.loc.length === 2 &&
24858             this.loc[0] >= -180 && this.loc[0] <= 180 &&
24859             this.loc[1] >= -90 && this.loc[1] <= 90
24860         );
24861     },
24862
24863
24864     // Inspect tags and geometry to determine which direction(s) this node/vertex points
24865     directions: function(resolver, projection) {
24866         var val;
24867         var i;
24868
24869         // which tag to use?
24870         if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') {
24871             // all-way stop tag on a highway intersection
24872             val = 'all';
24873         } else {
24874             // generic direction tag
24875             val = (this.tags.direction || '').toLowerCase();
24876
24877             // better suffix-style direction tag
24878             var re = /:direction$/i;
24879             var keys = Object.keys(this.tags);
24880             for (i = 0; i < keys.length; i++) {
24881                 if (re.test(keys[i])) {
24882                     val = this.tags[keys[i]].toLowerCase();
24883                     break;
24884                 }
24885             }
24886         }
24887
24888         if (val === '') return [];
24889
24890         var cardinal = {
24891             north: 0,               n: 0,
24892             northnortheast: 22,     nne: 22,
24893             northeast: 45,          ne: 45,
24894             eastnortheast: 67,      ene: 67,
24895             east: 90,               e: 90,
24896             eastsoutheast: 112,     ese: 112,
24897             southeast: 135,         se: 135,
24898             southsoutheast: 157,    sse: 157,
24899             south: 180,             s: 180,
24900             southsouthwest: 202,    ssw: 202,
24901             southwest: 225,         sw: 225,
24902             westsouthwest: 247,     wsw: 247,
24903             west: 270,              w: 270,
24904             westnorthwest: 292,     wnw: 292,
24905             northwest: 315,         nw: 315,
24906             northnorthwest: 337,    nnw: 337
24907         };
24908
24909
24910         var values = val.split(';');
24911         var results = [];
24912
24913         values.forEach(function(v) {
24914             // swap cardinal for numeric directions
24915             if (cardinal[v] !== undefined) {
24916                 v = cardinal[v];
24917             }
24918
24919             // numeric direction - just add to results
24920             if (v !== '' && !isNaN(+v)) {
24921                 results.push(+v);
24922                 return;
24923             }
24924
24925             // string direction - inspect parent ways
24926             var lookBackward =
24927                 (this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all');
24928             var lookForward =
24929                 (this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all');
24930
24931             if (!lookForward && !lookBackward) return;
24932
24933             var nodeIds = {};
24934             resolver.parentWays(this).forEach(function(parent) {
24935                 var nodes = parent.nodes;
24936                 for (i = 0; i < nodes.length; i++) {
24937                     if (nodes[i] === this.id) {  // match current entity
24938                         if (lookForward && i > 0) {
24939                             nodeIds[nodes[i - 1]] = true;  // look back to prev node
24940                         }
24941                         if (lookBackward && i < nodes.length - 1) {
24942                             nodeIds[nodes[i + 1]] = true;  // look ahead to next node
24943                         }
24944                     }
24945                 }
24946             }, this);
24947
24948             Object.keys(nodeIds).forEach(function(nodeId) {
24949                 // +90 because geoAngle returns angle from X axis, not Y (north)
24950                 results.push(
24951                     (geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI)) + 90
24952                 );
24953             }, this);
24954
24955         }, this);
24956
24957         return uniq(results);
24958     },
24959
24960
24961     isEndpoint: function(resolver) {
24962         return resolver.transient(this, 'isEndpoint', function() {
24963             var id = this.id;
24964             return resolver.parentWays(this).filter(function(parent) {
24965                 return !parent.isClosed() && !!parent.affix(id);
24966             }).length > 0;
24967         });
24968     },
24969
24970
24971     isConnected: function(resolver) {
24972         return resolver.transient(this, 'isConnected', function() {
24973             var parents = resolver.parentWays(this);
24974
24975             function isLine(entity) {
24976                 return entity.geometry(resolver) === 'line' &&
24977                     entity.hasInterestingTags();
24978             }
24979
24980             // vertex is connected to multiple parent lines
24981             if (parents.length > 1 && some(parents, isLine)) {
24982                 return true;
24983
24984             } else if (parents.length === 1) {
24985                 var way = parents[0],
24986                     nodes = way.nodes.slice();
24987                 if (way.isClosed()) { nodes.pop(); }  // ignore connecting node if closed
24988
24989                 // return true if vertex appears multiple times (way is self intersecting)
24990                 return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
24991             }
24992
24993             return false;
24994         });
24995     },
24996
24997
24998     isIntersection: function(resolver) {
24999         return resolver.transient(this, 'isIntersection', function() {
25000             return resolver.parentWays(this).filter(function(parent) {
25001                 return (parent.tags.highway ||
25002                     parent.tags.waterway ||
25003                     parent.tags.railway ||
25004                     parent.tags.aeroway) &&
25005                     parent.geometry(resolver) === 'line';
25006             }).length > 1;
25007         });
25008     },
25009
25010
25011     isHighwayIntersection: function(resolver) {
25012         return resolver.transient(this, 'isHighwayIntersection', function() {
25013             return resolver.parentWays(this).filter(function(parent) {
25014                 return parent.tags.highway && parent.geometry(resolver) === 'line';
25015             }).length > 1;
25016         });
25017     },
25018
25019
25020     isOnAddressLine: function(resolver) {
25021         return resolver.transient(this, 'isOnAddressLine', function() {
25022             return resolver.parentWays(this).filter(function(parent) {
25023                 return parent.tags.hasOwnProperty('addr:interpolation') &&
25024                     parent.geometry(resolver) === 'line';
25025             }).length > 0;
25026         });
25027     },
25028
25029
25030     asJXON: function(changeset_id) {
25031         var r = {
25032             node: {
25033                 '@id': this.osmId(),
25034                 '@lon': this.loc[0],
25035                 '@lat': this.loc[1],
25036                 '@version': (this.version || 0),
25037                 tag: map$3(this.tags, function(v, k) {
25038                     return { keyAttributes: { k: k, v: v } };
25039                 })
25040             }
25041         };
25042         if (changeset_id) r.node['@changeset'] = changeset_id;
25043         return r;
25044     },
25045
25046
25047     asGeoJSON: function() {
25048         return {
25049             type: 'Point',
25050             coordinates: this.loc
25051         };
25052     }
25053 });
25054
25055 /** Error message constants. */
25056 var FUNC_ERROR_TEXT$1 = 'Expected a function';
25057
25058 /**
25059  * Creates a function that negates the result of the predicate `func`. The
25060  * `func` predicate is invoked with the `this` binding and arguments of the
25061  * created function.
25062  *
25063  * @static
25064  * @memberOf _
25065  * @since 3.0.0
25066  * @category Function
25067  * @param {Function} predicate The predicate to negate.
25068  * @returns {Function} Returns the new negated function.
25069  * @example
25070  *
25071  * function isEven(n) {
25072  *   return n % 2 == 0;
25073  * }
25074  *
25075  * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
25076  * // => [1, 3, 5]
25077  */
25078 function negate(predicate) {
25079   if (typeof predicate != 'function') {
25080     throw new TypeError(FUNC_ERROR_TEXT$1);
25081   }
25082   return function() {
25083     var args = arguments;
25084     switch (args.length) {
25085       case 0: return !predicate.call(this);
25086       case 1: return !predicate.call(this, args[0]);
25087       case 2: return !predicate.call(this, args[0], args[1]);
25088       case 3: return !predicate.call(this, args[0], args[1], args[2]);
25089     }
25090     return !predicate.apply(this, args);
25091   };
25092 }
25093
25094 /**
25095  * The opposite of `_.filter`; this method returns the elements of `collection`
25096  * that `predicate` does **not** return truthy for.
25097  *
25098  * @static
25099  * @memberOf _
25100  * @since 0.1.0
25101  * @category Collection
25102  * @param {Array|Object} collection The collection to iterate over.
25103  * @param {Function} [predicate=_.identity] The function invoked per iteration.
25104  * @returns {Array} Returns the new filtered array.
25105  * @see _.filter
25106  * @example
25107  *
25108  * var users = [
25109  *   { 'user': 'barney', 'age': 36, 'active': false },
25110  *   { 'user': 'fred',   'age': 40, 'active': true }
25111  * ];
25112  *
25113  * _.reject(users, function(o) { return !o.active; });
25114  * // => objects for ['fred']
25115  *
25116  * // The `_.matches` iteratee shorthand.
25117  * _.reject(users, { 'age': 40, 'active': true });
25118  * // => objects for ['barney']
25119  *
25120  * // The `_.matchesProperty` iteratee shorthand.
25121  * _.reject(users, ['active', false]);
25122  * // => objects for ['fred']
25123  *
25124  * // The `_.property` iteratee shorthand.
25125  * _.reject(users, 'active');
25126  * // => objects for ['barney']
25127  */
25128 function reject(collection, predicate) {
25129   var func = isArray(collection) ? arrayFilter : baseFilter;
25130   return func(collection, negate(baseIteratee(predicate, 3)));
25131 }
25132
25133 /**
25134  * An alternative to `_.reduce`; this method transforms `object` to a new
25135  * `accumulator` object which is the result of running each of its own
25136  * enumerable string keyed properties thru `iteratee`, with each invocation
25137  * potentially mutating the `accumulator` object. If `accumulator` is not
25138  * provided, a new object with the same `[[Prototype]]` will be used. The
25139  * iteratee is invoked with four arguments: (accumulator, value, key, object).
25140  * Iteratee functions may exit iteration early by explicitly returning `false`.
25141  *
25142  * @static
25143  * @memberOf _
25144  * @since 1.3.0
25145  * @category Object
25146  * @param {Object} object The object to iterate over.
25147  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
25148  * @param {*} [accumulator] The custom accumulator value.
25149  * @returns {*} Returns the accumulated value.
25150  * @example
25151  *
25152  * _.transform([2, 3, 4], function(result, n) {
25153  *   result.push(n *= n);
25154  *   return n % 2 == 0;
25155  * }, []);
25156  * // => [4, 9]
25157  *
25158  * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
25159  *   (result[value] || (result[value] = [])).push(key);
25160  * }, {});
25161  * // => { '1': ['a', 'c'], '2': ['b'] }
25162  */
25163 function transform$1(object, iteratee, accumulator) {
25164   var isArr = isArray(object),
25165       isArrLike = isArr || isBuffer(object) || isTypedArray(object);
25166
25167   iteratee = baseIteratee(iteratee, 4);
25168   if (accumulator == null) {
25169     var Ctor = object && object.constructor;
25170     if (isArrLike) {
25171       accumulator = isArr ? new Ctor : [];
25172     }
25173     else if (isObject(object)) {
25174       accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
25175     }
25176     else {
25177       accumulator = {};
25178     }
25179   }
25180   (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
25181     return iteratee(accumulator, value, index, object);
25182   });
25183   return accumulator;
25184 }
25185
25186 /*
25187   Order the nodes of a way in reverse order and reverse any direction dependent tags
25188   other than `oneway`. (We assume that correcting a backwards oneway is the primary
25189   reason for reversing a way.)
25190
25191   The following transforms are performed:
25192
25193     Keys:
25194           *:right=* ⟺ *:left=*
25195         *:forward=* ⟺ *:backward=*
25196        direction=up ⟺ direction=down
25197          incline=up ⟺ incline=down
25198             *=right ⟺ *=left
25199
25200     Relation members:
25201        role=forward ⟺ role=backward
25202          role=north ⟺ role=south
25203           role=east ⟺ role=west
25204
25205    In addition, numeric-valued `incline` tags are negated.
25206
25207    The JOSM implementation was used as a guide, but transformations that were of unclear benefit
25208    or adjusted tags that don't seem to be used in practice were omitted.
25209
25210    Also, each node on the way is examined for its own tags and the following transformations are performed
25211    in order to ensure associated nodes (eg a Stop Sign) is also reversed
25212
25213     Node Keys:
25214         *direction=forward ⟺ *direction=backward
25215         *direction=left ⟺ *direction=right
25216         *:forward=* ⟺ *:backward=*
25217         *:left=* ⟺ *:right=*
25218
25219    References:
25220       http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
25221       http://wiki.openstreetmap.org/wiki/Key:direction#Steps
25222       http://wiki.openstreetmap.org/wiki/Key:incline
25223       http://wiki.openstreetmap.org/wiki/Route#Members
25224       http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
25225       http://wiki.openstreetmap.org/wiki/Tag:highway%3Dstop
25226       http://wiki.openstreetmap.org/wiki/Key:traffic_sign#On_a_way_or_area
25227  */
25228 function actionReverse(wayId, options) {
25229     var replacements = [
25230             [/:right$/, ':left'], [/:left$/, ':right'],
25231             [/:forward$/, ':backward'], [/:backward$/, ':forward']
25232         ],
25233         numeric = /^([+\-]?)(?=[\d.])/,
25234         roleReversals = {
25235             forward: 'backward',
25236             backward: 'forward',
25237             north: 'south',
25238             south: 'north',
25239             east: 'west',
25240             west: 'east'
25241         };
25242
25243
25244     function reverseKey(key) {
25245         for (var i = 0; i < replacements.length; ++i) {
25246             var replacement = replacements[i];
25247             if (replacement[0].test(key)) {
25248                 return key.replace(replacement[0], replacement[1]);
25249             }
25250         }
25251         return key;
25252     }
25253
25254
25255     function reverseValue(key, value) {
25256         if (key === 'incline' && numeric.test(value)) {
25257             return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
25258         } else if (key === 'incline' || key === 'direction') {
25259             return {up: 'down', down: 'up'}[value] || value;
25260         } else if (options && options.reverseOneway && key === 'oneway') {
25261             return {yes: '-1', '1': '-1', '-1': 'yes'}[value] || value;
25262         } else {
25263             return {left: 'right', right: 'left'}[value] || value;
25264         }
25265     }
25266
25267
25268     function reverseDirectionTags(node) {
25269         // Update the direction based tags as appropriate then return an updated node
25270         return node.update({tags: transform$1(node.tags, function(acc, tagValue, tagKey) {
25271             // See if this is a direction tag and reverse (or use existing value if not recognised)
25272             var re = /direction$/;
25273             if (re.test(tagKey)) {
25274                 acc[tagKey] = {forward: 'backward', backward: 'forward', left: 'right', right: 'left'}[tagValue] || tagValue;
25275             } else {
25276                 // Use the reverseKey method to cater for situations such as traffic_sign:forward=stop
25277                 // This will pass through other tags unchanged
25278                 acc[reverseKey(tagKey)] = tagValue;
25279             }
25280             return acc;
25281         }, {})});
25282     }
25283
25284
25285     function reverseTagsOnNodes(graph, nodeIds) {
25286         // Reverse the direction of appropriate tags attached to the nodes (#3076)
25287         return nodeIds
25288             // Get each node from the graph
25289             .map(function(nodeId) { return graph.entity(nodeId);})
25290             // Check tags on the node, if there aren't any, we can skip
25291             .filter(function(existingNode) { return existingNode.tags !== undefined;})
25292             // Get a new version of each node with the appropriate tags reversed
25293             .map(function(existingNode) { return reverseDirectionTags(existingNode);})
25294             // Chain together consecutive updates to the graph for each updated node and return
25295             .reduce(function (accGraph, value) { return accGraph.replace(value); }, graph);
25296     }
25297
25298
25299     return function(graph) {
25300         var way = graph.entity(wayId),
25301             nodes = way.nodes.slice().reverse(),
25302             tags = {}, key, role;
25303
25304         for (key in way.tags) {
25305             tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
25306         }
25307
25308         graph.parentRelations(way).forEach(function(relation) {
25309             relation.members.forEach(function(member, index) {
25310                 if (member.id === way.id && (role = roleReversals[member.role])) {
25311                     relation = relation.updateMember({role: role}, index);
25312                     graph = graph.replace(relation);
25313                 }
25314             });
25315         });
25316
25317         // Reverse any associated directions on nodes on the way and then replace
25318         // the way itself with the reversed node ids and updated way tags
25319         return reverseTagsOnNodes(graph, nodes).replace(way.update({nodes: nodes, tags: tags}));
25320     };
25321 }
25322
25323 /** `Object#toString` result references. */
25324 var numberTag$4 = '[object Number]';
25325
25326 /**
25327  * Checks if `value` is classified as a `Number` primitive or object.
25328  *
25329  * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
25330  * classified as numbers, use the `_.isFinite` method.
25331  *
25332  * @static
25333  * @memberOf _
25334  * @since 0.1.0
25335  * @category Lang
25336  * @param {*} value The value to check.
25337  * @returns {boolean} Returns `true` if `value` is a number, else `false`.
25338  * @example
25339  *
25340  * _.isNumber(3);
25341  * // => true
25342  *
25343  * _.isNumber(Number.MIN_VALUE);
25344  * // => true
25345  *
25346  * _.isNumber(Infinity);
25347  * // => true
25348  *
25349  * _.isNumber('3');
25350  * // => false
25351  */
25352 function isNumber(value) {
25353   return typeof value == 'number' ||
25354     (isObjectLike(value) && baseGetTag(value) == numberTag$4);
25355 }
25356
25357 /** `Object#toString` result references. */
25358 var stringTag$4 = '[object String]';
25359
25360 /**
25361  * Checks if `value` is classified as a `String` primitive or object.
25362  *
25363  * @static
25364  * @since 0.1.0
25365  * @memberOf _
25366  * @category Lang
25367  * @param {*} value The value to check.
25368  * @returns {boolean} Returns `true` if `value` is a string, else `false`.
25369  * @example
25370  *
25371  * _.isString('abc');
25372  * // => true
25373  *
25374  * _.isString(1);
25375  * // => false
25376  */
25377 function isString(value) {
25378   return typeof value == 'string' ||
25379     (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag$4);
25380 }
25381
25382 /**
25383  * Checks if `value` is `NaN`.
25384  *
25385  * **Note:** This method is based on
25386  * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
25387  * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
25388  * `undefined` and other non-number values.
25389  *
25390  * @static
25391  * @memberOf _
25392  * @since 0.1.0
25393  * @category Lang
25394  * @param {*} value The value to check.
25395  * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
25396  * @example
25397  *
25398  * _.isNaN(NaN);
25399  * // => true
25400  *
25401  * _.isNaN(new Number(NaN));
25402  * // => true
25403  *
25404  * isNaN(undefined);
25405  * // => true
25406  *
25407  * _.isNaN(undefined);
25408  * // => false
25409  */
25410 function isNaN$1(value) {
25411   // An `NaN` primitive is the only value that is not equal to itself.
25412   // Perform the `toStringTag` check first to avoid errors with some
25413   // ActiveX objects in IE.
25414   return isNumber(value) && value != +value;
25415 }
25416
25417 function osmLanes(entity) {
25418     if (entity.type !== 'way') return null;
25419     if (!entity.tags.highway) return null;
25420
25421     var tags = entity.tags;
25422     var isOneWay = entity.isOneWay();
25423     var laneCount = getLaneCount(tags, isOneWay);
25424     var maxspeed = parseMaxspeed(tags);
25425
25426     var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
25427     var forward = laneDirections.forward;
25428     var backward = laneDirections.backward;
25429     var bothways = laneDirections.bothways;
25430
25431     // parse the piped string 'x|y|z' format
25432     var turnLanes = {};
25433     turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
25434     turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
25435     turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
25436
25437     var maxspeedLanes = {};
25438     maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
25439     maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
25440     maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
25441
25442     var psvLanes = {};
25443     psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
25444     psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
25445     psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
25446
25447     var busLanes = {};
25448     busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
25449     busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
25450     busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
25451
25452     var taxiLanes = {};
25453     taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
25454     taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
25455     taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
25456
25457     var hovLanes = {};
25458     hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
25459     hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
25460     hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
25461
25462     var hgvLanes = {};
25463     hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
25464     hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
25465     hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
25466
25467     var bicyclewayLanes = {};
25468     bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
25469     bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
25470     bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
25471
25472     var lanesObj = {
25473         forward: [],
25474         backward: [],
25475         unspecified: []
25476     };
25477
25478     // map forward/backward/unspecified of each lane type to lanesObj
25479     mapToLanesObj(lanesObj, turnLanes, 'turnLane');
25480     mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
25481     mapToLanesObj(lanesObj, psvLanes, 'psv');
25482     mapToLanesObj(lanesObj, busLanes, 'bus');
25483     mapToLanesObj(lanesObj, taxiLanes, 'taxi');
25484     mapToLanesObj(lanesObj, hovLanes, 'hov');
25485     mapToLanesObj(lanesObj, hgvLanes, 'hgv');
25486     mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
25487
25488     return {
25489         metadata: {
25490             count: laneCount,
25491             oneway: isOneWay,
25492             forward: forward,
25493             backward: backward,
25494             bothways: bothways,
25495             turnLanes: turnLanes,
25496             maxspeed: maxspeed,
25497             maxspeedLanes: maxspeedLanes,
25498             psvLanes: psvLanes,
25499             busLanes: busLanes,
25500             taxiLanes: taxiLanes,
25501             hovLanes: hovLanes,
25502             hgvLanes: hgvLanes,
25503             bicyclewayLanes: bicyclewayLanes
25504         },
25505         lanes: lanesObj
25506     };
25507 }
25508
25509
25510 function getLaneCount(tags, isOneWay) {
25511     var count;
25512     if (tags.lanes) {
25513         count = parseInt(tags.lanes, 10);
25514         if (count > 0) {
25515             return count;
25516         }
25517     }
25518
25519
25520     switch (tags.highway) {
25521         case 'trunk':
25522         case 'motorway':
25523             count = isOneWay ? 2 : 4;
25524             break;
25525         default:
25526             count = isOneWay ? 1 : 2;
25527             break;
25528     }
25529
25530     return count;
25531 }
25532
25533
25534 function parseMaxspeed(tags) {
25535     var maxspeed = tags.maxspeed;
25536     if (isNumber(maxspeed)) return maxspeed;
25537     if (isString(maxspeed)) {
25538         maxspeed = maxspeed.match(/^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/g);
25539         if (!maxspeed) return;
25540         return parseInt(maxspeed, 10);
25541     }
25542 }
25543
25544
25545 function parseLaneDirections(tags, isOneWay, laneCount) {
25546     var forward = parseInt(tags['lanes:forward'], 10);
25547     var backward = parseInt(tags['lanes:backward'], 10);
25548     var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
25549
25550     if (parseInt(tags.oneway, 10) === -1) {
25551         forward = 0;
25552         bothways = 0;
25553         backward = laneCount;
25554     }
25555     else if (isOneWay) {
25556         forward = laneCount;
25557         bothways = 0;
25558         backward = 0;
25559     }
25560     else if (isNaN$1(forward) && isNaN$1(backward)) {
25561         backward = Math.floor((laneCount - bothways) / 2);
25562         forward = laneCount - bothways - backward;
25563     }
25564     else if (isNaN$1(forward)) {
25565         if (backward > laneCount - bothways) {
25566             backward = laneCount - bothways;
25567         }
25568         forward = laneCount - bothways - backward;
25569     }
25570     else if (isNaN$1(backward)) {
25571         if (forward > laneCount - bothways) {
25572             forward = laneCount - bothways;
25573         }
25574         backward = laneCount - bothways - forward;
25575     }
25576     return {
25577         forward: forward,
25578         backward: backward,
25579         bothways: bothways
25580     };
25581 }
25582
25583
25584 function parseTurnLanes(tag){
25585     if (!tag) return;
25586
25587     var validValues = [
25588         'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
25589         'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'
25590     ];
25591
25592     return tag.split('|')
25593         .map(function (s) {
25594             if (s === '') s = 'none';
25595             return s.split(';')
25596                 .map(function (d) {
25597                     return validValues.indexOf(d) === -1 ? 'unknown': d;
25598                 });
25599         });
25600 }
25601
25602
25603 function parseMaxspeedLanes(tag, maxspeed) {
25604     if (!tag) return;
25605
25606     return tag.split('|')
25607         .map(function (s) {
25608             if (s === 'none') return s;
25609             var m = parseInt(s, 10);
25610             if (s === '' || m === maxspeed) return null;
25611             return isNaN$1(m) ? 'unknown': m;
25612         });
25613 }
25614
25615
25616 function parseMiscLanes(tag) {
25617     if (!tag) return;
25618
25619     var validValues = [
25620         'yes', 'no', 'designated'
25621     ];
25622
25623     return tag.split('|')
25624         .map(function (s) {
25625             if (s === '') s = 'no';
25626             return validValues.indexOf(s) === -1 ? 'unknown': s;
25627         });
25628 }
25629
25630
25631 function parseBicycleWay(tag) {
25632     if (!tag) return;
25633
25634     var validValues = [
25635         'yes', 'no', 'designated', 'lane'
25636     ];
25637
25638     return tag.split('|')
25639         .map(function (s) {
25640             if (s === '') s = 'no';
25641             return validValues.indexOf(s) === -1 ? 'unknown': s;
25642         });
25643 }
25644
25645
25646 function mapToLanesObj(lanesObj, data, key) {
25647     if (data.forward) data.forward.forEach(function(l, i) {
25648         if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
25649         lanesObj.forward[i][key] = l;
25650     });
25651     if (data.backward) data.backward.forEach(function(l, i) {
25652         if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
25653         lanesObj.backward[i][key] = l;
25654     });
25655     if (data.unspecified) data.unspecified.forEach(function(l, i) {
25656         if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
25657         lanesObj.unspecified[i][key] = l;
25658     });
25659 }
25660
25661 /** Used to compose bitmasks for cloning. */
25662 var CLONE_DEEP_FLAG$2 = 1,
25663     CLONE_SYMBOLS_FLAG$3 = 4;
25664
25665 /**
25666  * This method is like `_.clone` except that it recursively clones `value`.
25667  *
25668  * @static
25669  * @memberOf _
25670  * @since 1.0.0
25671  * @category Lang
25672  * @param {*} value The value to recursively clone.
25673  * @returns {*} Returns the deep cloned value.
25674  * @see _.clone
25675  * @example
25676  *
25677  * var objects = [{ 'a': 1 }, { 'b': 2 }];
25678  *
25679  * var deep = _.cloneDeep(objects);
25680  * console.log(deep[0] === objects[0]);
25681  * // => false
25682  */
25683 function cloneDeep(value) {
25684   return baseClone(value, CLONE_DEEP_FLAG$2 | CLONE_SYMBOLS_FLAG$3);
25685 }
25686
25687 /**
25688  * Gets the timestamp of the number of milliseconds that have elapsed since
25689  * the Unix epoch (1 January 1970 00:00:00 UTC).
25690  *
25691  * @static
25692  * @memberOf _
25693  * @since 2.4.0
25694  * @category Date
25695  * @returns {number} Returns the timestamp.
25696  * @example
25697  *
25698  * _.defer(function(stamp) {
25699  *   console.log(_.now() - stamp);
25700  * }, _.now());
25701  * // => Logs the number of milliseconds it took for the deferred invocation.
25702  */
25703 var now$1 = function() {
25704   return root$2.Date.now();
25705 };
25706
25707 /** Error message constants. */
25708 var FUNC_ERROR_TEXT$2 = 'Expected a function';
25709
25710 /* Built-in method references for those with the same name as other `lodash` methods. */
25711 var nativeMax$2 = Math.max,
25712     nativeMin = Math.min;
25713
25714 /**
25715  * Creates a debounced function that delays invoking `func` until after `wait`
25716  * milliseconds have elapsed since the last time the debounced function was
25717  * invoked. The debounced function comes with a `cancel` method to cancel
25718  * delayed `func` invocations and a `flush` method to immediately invoke them.
25719  * Provide `options` to indicate whether `func` should be invoked on the
25720  * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
25721  * with the last arguments provided to the debounced function. Subsequent
25722  * calls to the debounced function return the result of the last `func`
25723  * invocation.
25724  *
25725  * **Note:** If `leading` and `trailing` options are `true`, `func` is
25726  * invoked on the trailing edge of the timeout only if the debounced function
25727  * is invoked more than once during the `wait` timeout.
25728  *
25729  * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
25730  * until to the next tick, similar to `setTimeout` with a timeout of `0`.
25731  *
25732  * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
25733  * for details over the differences between `_.debounce` and `_.throttle`.
25734  *
25735  * @static
25736  * @memberOf _
25737  * @since 0.1.0
25738  * @category Function
25739  * @param {Function} func The function to debounce.
25740  * @param {number} [wait=0] The number of milliseconds to delay.
25741  * @param {Object} [options={}] The options object.
25742  * @param {boolean} [options.leading=false]
25743  *  Specify invoking on the leading edge of the timeout.
25744  * @param {number} [options.maxWait]
25745  *  The maximum time `func` is allowed to be delayed before it's invoked.
25746  * @param {boolean} [options.trailing=true]
25747  *  Specify invoking on the trailing edge of the timeout.
25748  * @returns {Function} Returns the new debounced function.
25749  * @example
25750  *
25751  * // Avoid costly calculations while the window size is in flux.
25752  * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
25753  *
25754  * // Invoke `sendMail` when clicked, debouncing subsequent calls.
25755  * jQuery(element).on('click', _.debounce(sendMail, 300, {
25756  *   'leading': true,
25757  *   'trailing': false
25758  * }));
25759  *
25760  * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
25761  * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
25762  * var source = new EventSource('/stream');
25763  * jQuery(source).on('message', debounced);
25764  *
25765  * // Cancel the trailing debounced invocation.
25766  * jQuery(window).on('popstate', debounced.cancel);
25767  */
25768 function debounce(func, wait, options) {
25769   var lastArgs,
25770       lastThis,
25771       maxWait,
25772       result,
25773       timerId,
25774       lastCallTime,
25775       lastInvokeTime = 0,
25776       leading = false,
25777       maxing = false,
25778       trailing = true;
25779
25780   if (typeof func != 'function') {
25781     throw new TypeError(FUNC_ERROR_TEXT$2);
25782   }
25783   wait = toNumber(wait) || 0;
25784   if (isObject(options)) {
25785     leading = !!options.leading;
25786     maxing = 'maxWait' in options;
25787     maxWait = maxing ? nativeMax$2(toNumber(options.maxWait) || 0, wait) : maxWait;
25788     trailing = 'trailing' in options ? !!options.trailing : trailing;
25789   }
25790
25791   function invokeFunc(time) {
25792     var args = lastArgs,
25793         thisArg = lastThis;
25794
25795     lastArgs = lastThis = undefined;
25796     lastInvokeTime = time;
25797     result = func.apply(thisArg, args);
25798     return result;
25799   }
25800
25801   function leadingEdge(time) {
25802     // Reset any `maxWait` timer.
25803     lastInvokeTime = time;
25804     // Start the timer for the trailing edge.
25805     timerId = setTimeout(timerExpired, wait);
25806     // Invoke the leading edge.
25807     return leading ? invokeFunc(time) : result;
25808   }
25809
25810   function remainingWait(time) {
25811     var timeSinceLastCall = time - lastCallTime,
25812         timeSinceLastInvoke = time - lastInvokeTime,
25813         timeWaiting = wait - timeSinceLastCall;
25814
25815     return maxing
25816       ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
25817       : timeWaiting;
25818   }
25819
25820   function shouldInvoke(time) {
25821     var timeSinceLastCall = time - lastCallTime,
25822         timeSinceLastInvoke = time - lastInvokeTime;
25823
25824     // Either this is the first call, activity has stopped and we're at the
25825     // trailing edge, the system time has gone backwards and we're treating
25826     // it as the trailing edge, or we've hit the `maxWait` limit.
25827     return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
25828       (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
25829   }
25830
25831   function timerExpired() {
25832     var time = now$1();
25833     if (shouldInvoke(time)) {
25834       return trailingEdge(time);
25835     }
25836     // Restart the timer.
25837     timerId = setTimeout(timerExpired, remainingWait(time));
25838   }
25839
25840   function trailingEdge(time) {
25841     timerId = undefined;
25842
25843     // Only invoke if we have `lastArgs` which means `func` has been
25844     // debounced at least once.
25845     if (trailing && lastArgs) {
25846       return invokeFunc(time);
25847     }
25848     lastArgs = lastThis = undefined;
25849     return result;
25850   }
25851
25852   function cancel() {
25853     if (timerId !== undefined) {
25854       clearTimeout(timerId);
25855     }
25856     lastInvokeTime = 0;
25857     lastArgs = lastCallTime = lastThis = timerId = undefined;
25858   }
25859
25860   function flush() {
25861     return timerId === undefined ? result : trailingEdge(now$1());
25862   }
25863
25864   function debounced() {
25865     var time = now$1(),
25866         isInvoking = shouldInvoke(time);
25867
25868     lastArgs = arguments;
25869     lastThis = this;
25870     lastCallTime = time;
25871
25872     if (isInvoking) {
25873       if (timerId === undefined) {
25874         return leadingEdge(lastCallTime);
25875       }
25876       if (maxing) {
25877         // Handle invocations in a tight loop.
25878         timerId = setTimeout(timerExpired, wait);
25879         return invokeFunc(lastCallTime);
25880       }
25881     }
25882     if (timerId === undefined) {
25883       timerId = setTimeout(timerExpired, wait);
25884     }
25885     return result;
25886   }
25887   debounced.cancel = cancel;
25888   debounced.flush = flush;
25889   return debounced;
25890 }
25891
25892 /**
25893  * Casts `value` to `identity` if it's not a function.
25894  *
25895  * @private
25896  * @param {*} value The value to inspect.
25897  * @returns {Function} Returns cast function.
25898  */
25899 function castFunction(value) {
25900   return typeof value == 'function' ? value : identity$8;
25901 }
25902
25903 /**
25904  * Iterates over elements of `collection` and invokes `iteratee` for each element.
25905  * The iteratee is invoked with three arguments: (value, index|key, collection).
25906  * Iteratee functions may exit iteration early by explicitly returning `false`.
25907  *
25908  * **Note:** As with other "Collections" methods, objects with a "length"
25909  * property are iterated like arrays. To avoid this behavior use `_.forIn`
25910  * or `_.forOwn` for object iteration.
25911  *
25912  * @static
25913  * @memberOf _
25914  * @since 0.1.0
25915  * @alias each
25916  * @category Collection
25917  * @param {Array|Object} collection The collection to iterate over.
25918  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
25919  * @returns {Array|Object} Returns `collection`.
25920  * @see _.forEachRight
25921  * @example
25922  *
25923  * _.forEach([1, 2], function(value) {
25924  *   console.log(value);
25925  * });
25926  * // => Logs `1` then `2`.
25927  *
25928  * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
25929  *   console.log(key);
25930  * });
25931  * // => Logs 'a' then 'b' (iteration order is not guaranteed).
25932  */
25933 function forEach(collection, iteratee) {
25934   var func = isArray(collection) ? arrayEach : baseEach;
25935   return func(collection, castFunction(iteratee));
25936 }
25937
25938 /**
25939  * Iterates over own enumerable string keyed properties of an object and
25940  * invokes `iteratee` for each property. The iteratee is invoked with three
25941  * arguments: (value, key, object). Iteratee functions may exit iteration
25942  * early by explicitly returning `false`.
25943  *
25944  * @static
25945  * @memberOf _
25946  * @since 0.3.0
25947  * @category Object
25948  * @param {Object} object The object to iterate over.
25949  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
25950  * @returns {Object} Returns `object`.
25951  * @see _.forOwnRight
25952  * @example
25953  *
25954  * function Foo() {
25955  *   this.a = 1;
25956  *   this.b = 2;
25957  * }
25958  *
25959  * Foo.prototype.c = 3;
25960  *
25961  * _.forOwn(new Foo, function(value, key) {
25962  *   console.log(key);
25963  * });
25964  * // => Logs 'a' then 'b' (iteration order is not guaranteed).
25965  */
25966 function forOwn(object, iteratee) {
25967   return object && baseForOwn(object, castFunction(iteratee));
25968 }
25969
25970 //      
25971 var translations = Object.create(null);
25972
25973 var currentLocale = 'en';
25974 var textDirection = 'ltr';
25975
25976 function setLocale(_     )       {
25977     if (translations[_] !== undefined) {
25978         currentLocale = _;
25979     } else if (translations[_.split('-')[0]]) {
25980         currentLocale = _.split('-')[0];
25981     }
25982 }
25983
25984 function addTranslation(id        , value        )       {
25985     translations[id] = value;
25986 }
25987
25988 /**
25989  * Given a string identifier, try to find that string in the current
25990  * language, and return it.
25991  *
25992  * @param {string} s string identifier
25993  * @returns {string?} locale string
25994  */
25995 function t(s        , o     , loc         )         {
25996     loc = loc || currentLocale;
25997
25998     var path = s
25999         .split('.')
26000         .map(function (s) {
26001             return s.replace('<TX_DOT>', '.');
26002         })
26003         .reverse();
26004
26005     var rep = translations[loc];
26006
26007     while (rep !== undefined && path.length) rep = rep[path.pop()];
26008
26009     if (rep !== undefined) {
26010         if (o)
26011             for (var k in o) rep = rep.replace('{' + k + '}', o[k]);
26012         return rep;
26013     }
26014
26015     if (loc !== 'en') {
26016         return t(s, o, 'en');
26017     }
26018
26019     if (o && 'default' in o) {
26020         return o.default;
26021     }
26022
26023     var missing = 'Missing ' + loc + ' translation: ' + s;
26024     if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
26025
26026     return missing;
26027 }
26028
26029 /**
26030  * Given string 'ltr' or 'rtl', save that setting
26031  *
26032  * @param {string} s ltr or rtl
26033  */
26034
26035 function setTextDirection(dir        )       {
26036     textDirection = dir;
26037 }
26038
26039 /** Used to compose bitmasks for cloning. */
26040 var CLONE_DEEP_FLAG$3 = 1,
26041     CLONE_SYMBOLS_FLAG$4 = 4;
26042
26043 /**
26044  * This method is like `_.cloneWith` except that it recursively clones `value`.
26045  *
26046  * @static
26047  * @memberOf _
26048  * @since 4.0.0
26049  * @category Lang
26050  * @param {*} value The value to recursively clone.
26051  * @param {Function} [customizer] The function to customize cloning.
26052  * @returns {*} Returns the deep cloned value.
26053  * @see _.cloneWith
26054  * @example
26055  *
26056  * function customizer(value) {
26057  *   if (_.isElement(value)) {
26058  *     return value.cloneNode(true);
26059  *   }
26060  * }
26061  *
26062  * var el = _.cloneDeepWith(document.body, customizer);
26063  *
26064  * console.log(el === document.body);
26065  * // => false
26066  * console.log(el.nodeName);
26067  * // => 'BODY'
26068  * console.log(el.childNodes.length);
26069  * // => 20
26070  */
26071 function cloneDeepWith(value, customizer) {
26072   customizer = typeof customizer == 'function' ? customizer : undefined;
26073   return baseClone(value, CLONE_DEEP_FLAG$3 | CLONE_SYMBOLS_FLAG$4, customizer);
26074 }
26075
26076 /**
26077  * Creates an array of `array` values not included in the other given arrays
26078  * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
26079  * for equality comparisons. The order and references of result values are
26080  * determined by the first array.
26081  *
26082  * **Note:** Unlike `_.pullAll`, this method returns a new array.
26083  *
26084  * @static
26085  * @memberOf _
26086  * @since 0.1.0
26087  * @category Array
26088  * @param {Array} array The array to inspect.
26089  * @param {...Array} [values] The values to exclude.
26090  * @returns {Array} Returns the new array of filtered values.
26091  * @see _.without, _.xor
26092  * @example
26093  *
26094  * _.difference([2, 1], [2, 3]);
26095  * // => [1]
26096  */
26097 var difference = baseRest(function(array, values) {
26098   return isArrayLikeObject(array)
26099     ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
26100     : [];
26101 });
26102
26103 /** `Object#toString` result references. */
26104 var mapTag$7 = '[object Map]',
26105     setTag$7 = '[object Set]';
26106
26107 /** Used for built-in method references. */
26108 var objectProto$17 = Object.prototype;
26109
26110 /** Used to check objects for own properties. */
26111 var hasOwnProperty$14 = objectProto$17.hasOwnProperty;
26112
26113 /**
26114  * Checks if `value` is an empty object, collection, map, or set.
26115  *
26116  * Objects are considered empty if they have no own enumerable string keyed
26117  * properties.
26118  *
26119  * Array-like values such as `arguments` objects, arrays, buffers, strings, or
26120  * jQuery-like collections are considered empty if they have a `length` of `0`.
26121  * Similarly, maps and sets are considered empty if they have a `size` of `0`.
26122  *
26123  * @static
26124  * @memberOf _
26125  * @since 0.1.0
26126  * @category Lang
26127  * @param {*} value The value to check.
26128  * @returns {boolean} Returns `true` if `value` is empty, else `false`.
26129  * @example
26130  *
26131  * _.isEmpty(null);
26132  * // => true
26133  *
26134  * _.isEmpty(true);
26135  * // => true
26136  *
26137  * _.isEmpty(1);
26138  * // => true
26139  *
26140  * _.isEmpty([1, 2, 3]);
26141  * // => false
26142  *
26143  * _.isEmpty({ 'a': 1 });
26144  * // => false
26145  */
26146 function isEmpty(value) {
26147   if (value == null) {
26148     return true;
26149   }
26150   if (isArrayLike(value) &&
26151       (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
26152         isBuffer(value) || isTypedArray(value) || isArguments(value))) {
26153     return !value.length;
26154   }
26155   var tag = getTag$1(value);
26156   if (tag == mapTag$7 || tag == setTag$7) {
26157     return !value.size;
26158   }
26159   if (isPrototype(value)) {
26160     return !baseKeys(value).length;
26161   }
26162   for (var key in value) {
26163     if (hasOwnProperty$14.call(value, key)) {
26164       return false;
26165     }
26166   }
26167   return true;
26168 }
26169
26170 var detected;
26171
26172 function utilDetect(force) {
26173     if (detected && !force) return detected;
26174     detected = {};
26175
26176     var ua = navigator.userAgent,
26177         m = null;
26178
26179     m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i);   // Edge
26180     if (m !== null) {
26181         detected.browser = m[1];
26182         detected.version = m[2];
26183     }
26184     if (!detected.browser) {
26185         m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i);   // IE11
26186         if (m !== null) {
26187             detected.browser = 'msie';
26188             detected.version = m[1];
26189         }
26190     }
26191     if (!detected.browser) {
26192         m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i);   // Opera 15+
26193         if (m !== null) {
26194             detected.browser = 'Opera';
26195             detected.version = m[2];
26196         }
26197     }
26198     if (!detected.browser) {
26199         m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
26200         if (m !== null) {
26201             detected.browser = m[1];
26202             detected.version = m[2];
26203             m = ua.match(/version\/([\.\d]+)/i);
26204             if (m !== null) detected.version = m[1];
26205         }
26206     }
26207     if (!detected.browser) {
26208         detected.browser = navigator.appName;
26209         detected.version = navigator.appVersion;
26210     }
26211
26212     // keep major.minor version only..
26213     detected.version = detected.version.split(/\W/).slice(0,2).join('.');
26214
26215     if (detected.browser.toLowerCase() === 'msie') {
26216         detected.ie = true;
26217         detected.browser = 'Internet Explorer';
26218         detected.support = parseFloat(detected.version) >= 11;
26219     } else {
26220         detected.ie = false;
26221         detected.support = true;
26222     }
26223
26224     // Added due to incomplete svg style support. See #715
26225     detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
26226
26227     detected.locale = (navigator.language || navigator.userLanguage || 'en-US');
26228     detected.language = detected.locale.split('-')[0];
26229
26230     // Search `navigator.languages` for a better locale.. Prefer the first language,
26231     // unless the second language is a culture-specific version of the first one, see #3842
26232     if (navigator.languages && navigator.languages.length > 0) {
26233         var code0 = navigator.languages[0],
26234             parts0 = code0.split('-');
26235
26236         detected.locale = code0;
26237         detected.language = parts0[0];
26238
26239         if (navigator.languages.length > 1 && parts0.length === 1) {
26240             var code1 = navigator.languages[1],
26241                 parts1 = code1.split('-');
26242
26243             if (parts1[0] === parts0[0]) {
26244                 detected.locale = code1;
26245             }
26246         }
26247     }
26248
26249     // Loaded locale is stored in currentLocale
26250     // return that instead (except in the situation where 'en' might override 'en-US')
26251     var loadedLocale = currentLocale || 'en';
26252     if (loadedLocale !== 'en') {
26253         detected.locale = loadedLocale;
26254         detected.language = detected.locale.split('-')[0];
26255     }
26256
26257     // detect text direction
26258     var q = utilStringQs(window.location.hash.substring(1));
26259     var lang = dataLocales[detected.locale];
26260     if ((lang && lang.rtl) || (q.rtl === 'true')) {
26261         detected.textDirection = 'rtl';
26262     } else {
26263         detected.textDirection = 'ltr';
26264     }
26265     setTextDirection(detected.textDirection);
26266
26267     // detect host
26268     var loc = window.top.location;
26269     var origin = loc.origin;
26270     if (!origin) {  // for unpatched IE11
26271         origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port: '');
26272     }
26273
26274     detected.host = origin + loc.pathname;
26275
26276     detected.filedrop = (window.FileReader && 'ondrop' in window);
26277
26278     detected.download = !(detected.ie || detected.browser.toLowerCase() === 'edge');
26279
26280     detected.cssfilters = !(detected.ie || detected.browser.toLowerCase() === 'edge');
26281
26282     function nav(x) {
26283         return navigator.userAgent.indexOf(x) !== -1;
26284     }
26285
26286     if (nav('Win')) {
26287         detected.os = 'win';
26288         detected.platform = 'Windows';
26289     }
26290     else if (nav('Mac')) {
26291         detected.os = 'mac';
26292         detected.platform = 'Macintosh';
26293     }
26294     else if (nav('X11') || nav('Linux')) {
26295         detected.os = 'linux';
26296         detected.platform = 'Linux';
26297     }
26298     else {
26299         detected.os = 'win';
26300         detected.platform = 'Unknown';
26301     }
26302
26303     return detected;
26304 }
26305
26306 var remove$1 = removeDiacritics;
26307
26308 var replacementList = [
26309   {
26310     base: ' ',
26311     chars: "\u00A0",
26312   }, {
26313     base: '0',
26314     chars: "\u07C0",
26315   }, {
26316     base: 'A',
26317     chars: "\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F",
26318   }, {
26319     base: 'AA',
26320     chars: "\uA732",
26321   }, {
26322     base: 'AE',
26323     chars: "\u00C6\u01FC\u01E2",
26324   }, {
26325     base: 'AO',
26326     chars: "\uA734",
26327   }, {
26328     base: 'AU',
26329     chars: "\uA736",
26330   }, {
26331     base: 'AV',
26332     chars: "\uA738\uA73A",
26333   }, {
26334     base: 'AY',
26335     chars: "\uA73C",
26336   }, {
26337     base: 'B',
26338     chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181",
26339   }, {
26340     base: 'C',
26341     chars: "\u24b8\uff23\uA73E\u1E08\u0106\u0043\u0108\u010A\u010C\u00C7\u0187\u023B",
26342   }, {
26343     base: 'D',
26344     chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779",
26345   }, {
26346     base: 'Dh',
26347     chars: "\u00D0",
26348   }, {
26349     base: 'DZ',
26350     chars: "\u01F1\u01C4",
26351   }, {
26352     base: 'Dz',
26353     chars: "\u01F2\u01C5",
26354   }, {
26355     base: 'E',
26356     chars: "\u025B\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E\u1D07",
26357   }, {
26358     base: 'F',
26359     chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B",
26360   }, {
26361     base: 'G',
26362     chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262",
26363   }, {
26364     base: 'H',
26365     chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D",
26366   }, {
26367     base: 'I',
26368     chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197",
26369   }, {
26370     base: 'J',
26371     chars: "\u24BF\uFF2A\u0134\u0248\u0237",
26372   }, {
26373     base: 'K',
26374     chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2",
26375   }, {
26376     base: 'L',
26377     chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780",
26378   }, {
26379     base: 'LJ',
26380     chars: "\u01C7",
26381   }, {
26382     base: 'Lj',
26383     chars: "\u01C8",
26384   }, {
26385     base: 'M',
26386     chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB",
26387   }, {
26388     base: 'N',
26389     chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E",
26390   }, {
26391     base: 'NJ',
26392     chars: "\u01CA",
26393   }, {
26394     base: 'Nj',
26395     chars: "\u01CB",
26396   }, {
26397     base: 'O',
26398     chars: "\u24C4\uFF2F\xD2\xD3\xD4\u1ED2\u1ED0\u1ED6\u1ED4\xD5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\xD6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\xD8\u01FE\u0186\u019F\uA74A\uA74C",
26399   }, {
26400     base: 'OE',
26401     chars: "\u0152",
26402   }, {
26403     base: 'OI',
26404     chars: "\u01A2",
26405   }, {
26406     base: 'OO',
26407     chars: "\uA74E",
26408   }, {
26409     base: 'OU',
26410     chars: "\u0222",
26411   }, {
26412     base: 'P',
26413     chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754",
26414   }, {
26415     base: 'Q',
26416     chars: "\u24C6\uFF31\uA756\uA758\u024A",
26417   }, {
26418     base: 'R',
26419     chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782",
26420   }, {
26421     base: 'S',
26422     chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784",
26423   }, {
26424     base: 'T',
26425     chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786",
26426   }, {
26427     base: 'Th',
26428     chars: "\u00DE",
26429   }, {
26430     base: 'TZ',
26431     chars: "\uA728",
26432   }, {
26433     base: 'U',
26434     chars: "\u24CA\uFF35\xD9\xDA\xDB\u0168\u1E78\u016A\u1E7A\u016C\xDC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244",
26435   }, {
26436     base: 'V',
26437     chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245",
26438   }, {
26439     base: 'VY',
26440     chars: "\uA760",
26441   }, {
26442     base: 'W',
26443     chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72",
26444   }, {
26445     base: 'X',
26446     chars: "\u24CD\uFF38\u1E8A\u1E8C",
26447   }, {
26448     base: 'Y',
26449     chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE",
26450   }, {
26451     base: 'Z',
26452     chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762",
26453   }, {
26454     base: 'a',
26455     chars: "\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250\u0251",
26456   }, {
26457     base: 'aa',
26458     chars: "\uA733",
26459   }, {
26460     base: 'ae',
26461     chars: "\u00E6\u01FD\u01E3",
26462   }, {
26463     base: 'ao',
26464     chars: "\uA735",
26465   }, {
26466     base: 'au',
26467     chars: "\uA737",
26468   }, {
26469     base: 'av',
26470     chars: "\uA739\uA73B",
26471   }, {
26472     base: 'ay',
26473     chars: "\uA73D",
26474   }, {
26475     base: 'b',
26476     chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182",
26477   }, {
26478     base: 'c',
26479     chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184",
26480   }, {
26481     base: 'd',
26482     chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA",
26483   }, {
26484     base: 'dh',
26485     chars: "\u00F0",
26486   }, {
26487     base: 'dz',
26488     chars: "\u01F3\u01C6",
26489   }, {
26490     base: 'e',
26491     chars: "\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u01DD",
26492   }, {
26493     base: 'f',
26494     chars: "\u24D5\uFF46\u1E1F\u0192",
26495   }, {
26496     base: 'ff',
26497     chars: "\uFB00",
26498   }, {
26499     base: 'fi',
26500     chars: "\uFB01",
26501   }, {
26502     base: 'fl',
26503     chars: "\uFB02",
26504   }, {
26505     base: 'ffi',
26506     chars: "\uFB03",
26507   }, {
26508     base: 'ffl',
26509     chars: "\uFB04",
26510   }, {
26511     base: 'g',
26512     chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79",
26513   }, {
26514     base: 'h',
26515     chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265",
26516   }, {
26517     base: 'hv',
26518     chars: "\u0195",
26519   }, {
26520     base: 'i',
26521     chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131",
26522   }, {
26523     base: 'j',
26524     chars: "\u24D9\uFF4A\u0135\u01F0\u0249",
26525   }, {
26526     base: 'k',
26527     chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3",
26528   }, {
26529     base: 'l',
26530     chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D",
26531   }, {
26532     base: 'lj',
26533     chars: "\u01C9",
26534   }, {
26535     base: 'm',
26536     chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F",
26537   }, {
26538     base: 'n',
26539     chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509",
26540   }, {
26541     base: 'nj',
26542     chars: "\u01CC",
26543   }, {
26544     base: 'o',
26545     chars: "\u24DE\uFF4F\xF2\xF3\xF4\u1ED3\u1ED1\u1ED7\u1ED5\xF5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\xF6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\xF8\u01FF\uA74B\uA74D\u0275\u0254\u1D11",
26546   }, {
26547     base: 'oe',
26548     chars: "\u0153",
26549   }, {
26550     base: 'oi',
26551     chars: "\u01A3",
26552   }, {
26553     base: 'oo',
26554     chars: "\uA74F",
26555   }, {
26556     base: 'ou',
26557     chars: "\u0223",
26558   }, {
26559     base: 'p',
26560     chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1",
26561   }, {
26562     base: 'q',
26563     chars: "\u24E0\uFF51\u024B\uA757\uA759",
26564   }, {
26565     base: 'r',
26566     chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783",
26567   }, {
26568     base: 's',
26569     chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282",
26570   }, {
26571     base: 'ss',
26572     chars: "\xDF",
26573   }, {
26574     base: 't',
26575     chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787",
26576   }, {
26577     base: 'th',
26578     chars: "\u00FE",
26579   }, {
26580     base: 'tz',
26581     chars: "\uA729",
26582   }, {
26583     base: 'u',
26584     chars: "\u24E4\uFF55\xF9\xFA\xFB\u0169\u1E79\u016B\u1E7B\u016D\xFC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289",
26585   }, {
26586     base: 'v',
26587     chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C",
26588   }, {
26589     base: 'vy',
26590     chars: "\uA761",
26591   }, {
26592     base: 'w',
26593     chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73",
26594   }, {
26595     base: 'x',
26596     chars: "\u24E7\uFF58\u1E8B\u1E8D",
26597   }, {
26598     base: 'y',
26599     chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF",
26600   }, {
26601     base: 'z',
26602     chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763",
26603   }
26604 ];
26605
26606 var diacriticsMap = {};
26607 for (var i = 0; i < replacementList.length; i += 1) {
26608   var chars = replacementList[i].chars;
26609   for (var j = 0; j < chars.length; j += 1) {
26610     diacriticsMap[chars[j]] = replacementList[i].base;
26611   }
26612 }
26613
26614 function removeDiacritics(str) {
26615   return str.replace(/[^\u0000-\u007e]/g, function(c) {
26616     return diacriticsMap[c] || c;
26617   });
26618 }
26619
26620 // see https://github.com/openstreetmap/iD/pull/3707
26621 // https://gist.github.com/mapmeld/556b09ddec07a2044c76e1ef45f01c60
26622
26623 var chars$1 = {
26624     // madda above alef
26625     1570: { initial: 'آ‎', isolated: 'ﺁ', medial: 'ﺁ', final: 'ﺂ' },
26626
26627     // hamza above and below alef
26628     1571: { initial: 'أ', isolated: 'ﺃ', medial: '', final: 'ﺄ' },
26629     // 1572 is ؤ
26630     1573: { initial: 'إ', isolated: 'ﺇ', medial: '', final: 'ﺈ' },
26631     // 1574 is ئ
26632     1575: { initial: 'ا', isolated: 'ا', medial: '', final: 'ﺎ' },
26633     1576: { initial: 'ﺑ', isolated: 'ﺏ', medial: 'ﺒ', final: 'ﺐ' },
26634
26635     // 1577 ة
26636     1577: { initial: '', isolated: 'ة', medial: '', final: 'ﺔ' },
26637
26638     1578: { initial: 'ﺗ', isolated: 'ﺕ', medial: 'ﺘ', final: 'ﺖ' },
26639     1579: { initial: 'ﺛ', isolated: 'ﺙ', medial: 'ﺜ', final: 'ﺚ' },
26640     1580: { initial: 'ﺟ', isolated: 'ﺝ', medial: 'ﺠ', final: 'ﺞ' },
26641     1581: { initial: 'ﺣ', isolated: 'ﺡ', medial: 'ﺤ', final: 'ﺢ' },
26642     1582: { initial: 'ﺧ', isolated: 'ﺥ', medial: 'ﺨ', final: 'ﺦ' },
26643     1583: { initial: 'ﺩ', isolated: 'ﺩ', medial: '', final: 'ﺪ' },
26644     1584: { initial: 'ﺫ', isolated: 'ﺫ', medial: '', final: 'ﺬ' },
26645     1585: { initial: 'ﺭ', isolated: 'ﺭ', medial: '', final: 'ﺮ' },
26646     1586: { initial: 'ﺯ', isolated: 'ﺯ', medial: '', final: 'ﺰ' },
26647     1688: { initial: 'ﮊ', isolated: 'ﮊ', medial: '', final: 'ﮋ' },
26648     1587: { initial: 'ﺳ', isolated: 'ﺱ', medial: 'ﺴ', final: 'ﺲ' },
26649     1588: { initial: 'ﺷ', isolated: 'ﺵ', medial: 'ﺸ', final: 'ﺶ' },
26650     1589: { initial: 'ﺻ', isolated: 'ﺹ', medial: 'ﺼ', final: 'ﺺ' },
26651     1590: { initial: 'ﺿ', isolated: 'ﺽ', medial: 'ﻀ', final: 'ﺾ' },
26652     1591: { initial: 'ﻃ', isolated: 'ﻁ', medial: 'ﻄ', final: 'ﻂ' },
26653     1592: { initial: 'ﻇ', isolated: 'ﻅ', medial: 'ﻈ', final: 'ﻆ' },
26654     1593: { initial: 'ﻋ', isolated: 'ﻉ', medial: 'ﻌ', final: 'ﻊ' },
26655     1594: { initial: 'ﻏ', isolated: 'ﻍ', medial: 'ﻐ', final: 'ﻎ' },
26656
26657     // 1595 ػ - may be very rare
26658
26659     1601: { initial: 'ﻓ', isolated: 'ﻑ', medial: 'ﻔ', final: 'ﻒ' },
26660     1602: { initial: 'ﻗ', isolated: 'ﻕ', medial: 'ﻘ', final: 'ﻖ' },
26661     1604: { initial: 'ﻟ', isolated: 'ﻝ', medial: 'ﻠ', final: 'ﻞ' },
26662     1605: { initial: 'ﻣ', isolated: 'ﻡ', medial: 'ﻤ', final: 'ﻢ' },
26663     1606: { initial: 'ﻧ', isolated: 'ﻥ', medial: 'ﻨ', final: 'ﻦ' },
26664     1607: { initial: 'ﻫ', isolated: 'ﻩ', medial: 'ﻬ', final: 'ﻪ' },
26665     1608: { initial: 'ﻭ', isolated: 'ﻭ', medial: '', final: 'ﻮ' },
26666
26667     // 1609 ى
26668     1609: { initial: 'ﯨ', isolated: 'ﻯ', medial: 'ﯩ', final: 'ﻰ' },
26669     // 1610 ي
26670     1610: { initial: 'ﻳ', isolated: 'ﻱ', medial: 'ﻴ', final: 'ﻲ' },
26671
26672     // short vowel sounds / tashkil markings
26673
26674     1662: { initial: 'ﭘ', isolated: 'ﭖ', medial: 'ﭙ', final: 'ﭗ' },
26675
26676     1670: { initial: 'ﭼ', isolated: 'ﭺ', medial: 'ﭽ', final: 'ﭻ' },
26677     1603: { initial: 'ﻛ', isolated: 'ﻙ', medial: 'ﻜ', final: 'ﻚ' },
26678     1705: { initial: 'ﻛ', isolated: 'ﮎ', medial: 'ﻜ', final: 'ﮏ' },
26679     1711: { initial: 'ﮔ', isolated: 'ﮒ', medial: 'ﮕ', final: 'ﮓ' },
26680     1740: { initial: 'ﻳ', isolated: 'ﻯ', medial: 'ﻴ', final: 'ﻰ' },
26681     5000: { initial: 'ﻻ', isolated: 'ﻻ', medial: '', final: 'ﻼ' }
26682 };
26683
26684 var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0780-\u07BF]/;
26685
26686 function fixRTLTextForSvg(inputText) {
26687     var context = true;
26688     var ret = '';
26689     var rtlBuffer = [];
26690     var arabicRegex = /[\u0600-\u06FF]/g;
26691     var arabicTashkil = /[\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED]/;
26692     var thaanaVowel = /[\u07A6-\u07B0]/;
26693     var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
26694
26695     if (!arabicRegex.test(inputText)) {
26696         // Hebrew or Thaana RTL script
26697         for (var n = 0; n < inputText.length; n++) {
26698             var c = inputText[n];
26699             if ((thaanaVowel.test(c) || hebrewSign.test(c)) && rtlBuffer.length) {
26700                 rtlBuffer[rtlBuffer.length - 1] += c;
26701             } else if (rtlRegex.test(c)) {
26702                 rtlBuffer.push(c);
26703             } else if (c === ' ' && rtlBuffer.length) {
26704                 // whitespace within RTL text
26705                 rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
26706             } else {
26707                 // non-RTL character
26708                 ret += rtlBuffer.reverse().join('') + c;
26709                 rtlBuffer = [];
26710             }
26711         }
26712     } else {
26713         for (var i = 0, l = inputText.length; i < l; i++) {
26714             var code = inputText[i].charCodeAt(0);
26715             var nextCode = inputText[i + 1] ? inputText[i + 1].charCodeAt(0) : 0;
26716
26717             if (!chars$1[code]) {
26718                 if (code === 32 && rtlBuffer.length) {
26719                     // whitespace
26720                     rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
26721                 } else if (arabicTashkil.test(inputText[i]) && rtlBuffer.length) {
26722                     // tashkil mark
26723                     rtlBuffer[rtlBuffer.length - 1] += inputText[i];
26724                 } else {
26725                     // non-RTL character
26726                     ret += rtlBuffer.reverse().join('') + inputText[i];
26727                     rtlBuffer = [];
26728                 }
26729                 continue;
26730             }
26731             if (context) {
26732                 if (i === l - 1 || nextCode === 32) {
26733                     rtlBuffer.push(chars$1[code].isolated);
26734                 } else {
26735                     // special case for لا
26736                     if (code === 1604 && nextCode === 1575) {
26737                         rtlBuffer.push(chars$1[5000].initial);
26738                         i++;
26739                         context = true;
26740                         continue;
26741                     }
26742                     rtlBuffer.push(chars$1[code].initial);
26743                 }
26744             } else {
26745                 if (i === l - 1 || nextCode === 32){
26746                     rtlBuffer.push(chars$1[code].final);
26747                 } else {
26748                     // special case for ﻼ
26749                     if (code === 1604 && nextCode === 1575){
26750                         rtlBuffer.push(chars$1[5000].final);
26751                         i++;
26752                         context = true;
26753                         continue;
26754                     }
26755                     if (chars$1[code].medial === ''){
26756                         rtlBuffer.push(chars$1[code].final);
26757                     } else {
26758                         rtlBuffer.push(chars$1[code].medial);
26759                     }
26760                 }
26761             }
26762             context = (chars$1[code].medial === '') || nextCode === 32;
26763         }
26764     }
26765     ret += rtlBuffer.reverse().join('');
26766     return ret;
26767 }
26768
26769 function utilTagText(entity) {
26770     return map$3(entity.tags, function(v, k) {
26771         return k + '=' + v;
26772     }).join(', ');
26773 }
26774
26775
26776 function utilEntitySelector(ids) {
26777     return ids.length ? '.' + ids.join(',.') : 'nothing';
26778 }
26779
26780
26781 function utilEntityOrMemberSelector(ids, graph) {
26782     var s = utilEntitySelector(ids);
26783
26784     ids.forEach(function(id) {
26785         var entity = graph.hasEntity(id);
26786         if (entity && entity.type === 'relation') {
26787             entity.members.forEach(function(member) {
26788                 s += ',.' + member.id;
26789             });
26790         }
26791     });
26792
26793     return s;
26794 }
26795
26796
26797 function utilGetAllNodes(ids, graph) {
26798     var seen = {};
26799     var nodes = [];
26800     ids.forEach(getNodes);
26801     return nodes;
26802
26803     function getNodes(id) {
26804         if (seen[id]) return;
26805         seen[id] = true;
26806
26807         var entity = graph.hasEntity(id);
26808         if (!entity) return;
26809
26810         if (entity.type === 'node') {
26811             nodes.push(entity);
26812         } else if (entity.type === 'way') {
26813             entity.nodes.forEach(getNodes);
26814         } else {
26815             entity.members.map(function(member) { return member.id; }).forEach(getNodes);
26816         }
26817     }
26818 }
26819
26820
26821 function utilDisplayName(entity) {
26822     var localizedNameKey = 'name:' + utilDetect().locale.toLowerCase().split('-')[0],
26823         name = entity.tags[localizedNameKey] || entity.tags.name || '',
26824         network = entity.tags.cycle_network || entity.tags.network;
26825
26826     if (!name && entity.tags.ref) {
26827         name = entity.tags.ref;
26828         if (network) {
26829             name = network + ' ' + name;
26830         }
26831     }
26832
26833     return name;
26834 }
26835
26836
26837 function utilDisplayNameForPath(entity) {
26838     var name = utilDisplayName(entity);
26839     var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
26840
26841     if (!isFirefox && name && rtlRegex.test(name)) {
26842         name = fixRTLTextForSvg(name);
26843     }
26844
26845     return name;
26846 }
26847
26848
26849 function utilDisplayType(id) {
26850     return {
26851         n: t('inspector.node'),
26852         w: t('inspector.way'),
26853         r: t('inspector.relation')
26854     }[id.charAt(0)];
26855 }
26856
26857
26858 function utilStringQs(str) {
26859     return str.split('&').reduce(function(obj, pair){
26860         var parts = pair.split('=');
26861         if (parts.length === 2) {
26862             obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]);
26863         }
26864         return obj;
26865     }, {});
26866 }
26867
26868
26869 function utilQsString(obj, noencode) {
26870     function softEncode(s) {
26871       // encode everything except special characters used in certain hash parameters:
26872       // "/" in map states, ":", ",", {" and "}" in background
26873       return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
26874     }
26875     return Object.keys(obj).sort().map(function(key) {
26876         return encodeURIComponent(key) + '=' + (
26877             noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
26878     }).join('&');
26879 }
26880
26881
26882 function utilPrefixDOMProperty(property) {
26883     var prefixes = ['webkit', 'ms', 'moz', 'o'],
26884         i = -1,
26885         n = prefixes.length,
26886         s = document.body;
26887
26888     if (property in s)
26889         return property;
26890
26891     property = property.substr(0, 1).toUpperCase() + property.substr(1);
26892
26893     while (++i < n)
26894         if (prefixes[i] + property in s)
26895             return prefixes[i] + property;
26896
26897     return false;
26898 }
26899
26900
26901 function utilPrefixCSSProperty(property) {
26902     var prefixes = ['webkit', 'ms', 'Moz', 'O'],
26903         i = -1,
26904         n = prefixes.length,
26905         s = document.body.style;
26906
26907     if (property.toLowerCase() in s)
26908         return property.toLowerCase();
26909
26910     while (++i < n)
26911         if (prefixes[i] + property in s)
26912             return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
26913
26914     return false;
26915 }
26916
26917
26918 var transformProperty;
26919 function utilSetTransform(el, x, y, scale) {
26920     var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform'),
26921         translate = utilDetect().opera ?
26922             'translate('   + x + 'px,' + y + 'px)' :
26923             'translate3d(' + x + 'px,' + y + 'px,0)';
26924     return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
26925 }
26926
26927
26928 // Calculates Levenshtein distance between two strings
26929 // see:  https://en.wikipedia.org/wiki/Levenshtein_distance
26930 // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
26931 function utilEditDistance(a, b) {
26932     a = remove$1(a.toLowerCase());
26933     b = remove$1(b.toLowerCase());
26934     if (a.length === 0) return b.length;
26935     if (b.length === 0) return a.length;
26936     var matrix = [];
26937     for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; }
26938     for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; }
26939     for (i = 1; i <= b.length; i++) {
26940         for (j = 1; j <= a.length; j++) {
26941             if (b.charAt(i-1) === a.charAt(j-1)) {
26942                 matrix[i][j] = matrix[i-1][j-1];
26943             } else {
26944                 matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
26945                     Math.min(matrix[i][j-1] + 1, // insertion
26946                     matrix[i-1][j] + 1)); // deletion
26947             }
26948         }
26949     }
26950     return matrix[b.length][a.length];
26951 }
26952
26953
26954 // a d3.mouse-alike which
26955 // 1. Only works on HTML elements, not SVG
26956 // 2. Does not cause style recalculation
26957 function utilFastMouse(container) {
26958     var rect = container.getBoundingClientRect(),
26959         rectLeft = rect.left,
26960         rectTop = rect.top,
26961         clientLeft = +container.clientLeft,
26962         clientTop = +container.clientTop;
26963     if (textDirection === 'rtl') {
26964         rectLeft = 0;
26965     }
26966     return function(e) {
26967         return [
26968             e.clientX - rectLeft - clientLeft,
26969             e.clientY - rectTop - clientTop];
26970     };
26971 }
26972
26973
26974 /* eslint-disable no-proto */
26975 var utilGetPrototypeOf = Object.getPrototypeOf || function(obj) { return obj.__proto__; };
26976 /* eslint-enable no-proto */
26977
26978
26979 function utilAsyncMap(inputs, func, callback) {
26980     var remaining = inputs.length,
26981         results = [],
26982         errors = [];
26983
26984     inputs.forEach(function(d, i) {
26985         func(d, function done(err, data) {
26986             errors[i] = err;
26987             results[i] = data;
26988             remaining--;
26989             if (!remaining) callback(errors, results);
26990         });
26991     });
26992 }
26993
26994
26995 // wraps an index to an interval [0..length-1]
26996 function utilWrap(index, length) {
26997     if (index < 0)
26998         index += Math.ceil(-index/length)*length;
26999     return index % length;
27000 }
27001
27002
27003 /**
27004  * a replacement for functor
27005  *
27006  * @param {*} value any value
27007  * @returns {Function} a function that returns that value or the value if it's a function
27008  */
27009 function utilFunctor(value) {
27010     if (typeof value === 'function') return value;
27011     return function() {
27012         return value;
27013     };
27014 }
27015
27016
27017 function utilNoAuto(selection) {
27018     var isText = (selection.size() && selection.node().tagName.toLowerCase() === 'textarea');
27019
27020     return selection
27021         .attr('autocomplete', 'off')
27022         .attr('autocorrect', 'off')
27023         .attr('autocapitalize', 'off')
27024         .attr('spellcheck', isText ? 'true' : 'false');
27025 }
27026
27027 // note the function should be of low priority
27028 // and should not be returning a value.
27029 function utilCallWhenIdle(func, timeout) {
27030     return function() {
27031         var args = arguments;
27032         var that = this;
27033         window.requestIdleCallback(function() {
27034             func.apply(that, args);
27035         }, {timeout: timeout});
27036     };
27037 }
27038
27039 // Like selection.property('value', ...), but avoids no-op value sets,
27040 // which can result in layout/repaint thrashing in some situations.
27041 function utilGetSetValue(selection, value) {
27042     function d3_selection_value(value) {
27043         function valueNull() {
27044             delete this.value;
27045         }
27046
27047         function valueConstant() {
27048             if (this.value !== value) {
27049                 this.value = value;
27050             }
27051         }
27052
27053         function valueFunction() {
27054             var x = value.apply(this, arguments);
27055             if (x == null) {
27056                 delete this.value;
27057             } else if (this.value !== x) {
27058                 this.value = x;
27059             }
27060         }
27061
27062         return value == null
27063             ? valueNull : (typeof value === 'function'
27064             ? valueFunction : valueConstant);
27065     }
27066
27067     if (arguments.length === 1) {
27068         return selection.property('value');
27069     }
27070
27071     return selection.each(d3_selection_value(value));
27072 }
27073
27074 function utilIdleWorker(tasks, processor, callback) {
27075     var results = [], result;
27076     for (var i = 0; i < tasks.length; i++) {
27077         result = processor(tasks[i]);
27078         if (result) results.push(result);
27079     }
27080     callback(results);
27081
27082     // var processed = [];
27083     // var currentPos = 0;
27084     // var totalTasks = tasks.length;
27085
27086     // function worker(deadline) {
27087     //     while (deadline.timeRemaining() > 0 && currentPos < totalTasks) {
27088     //         var result = processor(tasks[currentPos]);
27089
27090     //         // if falsy dont add to the processed list
27091     //         if (result) processed.push(result);
27092     //         currentPos++;
27093     //     }
27094
27095     //     // more tasks are left, we might need more idleCallbacks
27096     //     if (currentPos < totalTasks) {
27097     //         return window.requestIdleCallback(function(deadline) {worker(deadline);});
27098     //     }
27099
27100     //     // tasks are completed
27101     //     return callback(processed);
27102     // }
27103
27104     // window.requestIdleCallback(function(deadline) {worker(deadline);});
27105 }
27106
27107 // shim
27108 window.requestIdleCallback =
27109     window.requestIdleCallback ||
27110     function(cb) {
27111         var start = Date.now();
27112         return setTimeout(function() {
27113             cb({
27114                 didTimeout: false,
27115                 timeRemaining: function() {
27116                     return Math.max(0, 50 - (Date.now() - start));
27117                 }
27118             });
27119         }, 1);
27120     };
27121
27122 window.cancelIdleCallback =
27123     window.cancelIdleCallback ||
27124     function(id) {
27125         clearTimeout(id);
27126     };
27127
27128 // Copies a variable number of methods from source to target.
27129 function utilRebind(target, source) {
27130     var i = 1, n = arguments.length, method;
27131     while (++i < n) {
27132         target[method = arguments[i]] = d3_rebind(target, source, source[method]);
27133     }
27134     return target;
27135 }
27136
27137 // Method is assumed to be a standard D3 getter-setter:
27138 // If passed with no arguments, gets the value.
27139 // If passed with arguments, sets the value and returns the target.
27140 function d3_rebind(target, source, method) {
27141     return function() {
27142         var value = method.apply(source, arguments);
27143         return value === source ? target : value;
27144     };
27145 }
27146
27147 //      
27148 // A per-domain session mutex backed by a cookie and dead man's
27149 // switch. If the session crashes, the mutex will auto-release
27150 // after 5 seconds.
27151
27152 // This is a type alias (https://flow.org/en/docs/types/aliases/) which allows flow to understand the object returned by utilSessionMutex in other files.
27153                              
27154                         
27155                        
27156                          
27157   
27158
27159 // This accepts a string and returns an object that complies with utilSessionMutexType
27160 function utilSessionMutex(name        )                       {
27161     var mutex = {};
27162     var intervalID             ; // This indicates a Maybe type - intervalId can be null so we need to use "?IntervalID", not "IntervalID"
27163
27164     function renew() {
27165         var expires = new Date();
27166         expires.setSeconds(expires.getSeconds() + 5);
27167         document.cookie = name + '=1; expires=' + expires.toUTCString();
27168     }
27169
27170     mutex.lock = function ()          {
27171         if (intervalID) return true;
27172         var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
27173         if (cookie) return false;
27174         renew();
27175         intervalID = window.setInterval(renew, 4000);
27176         return true;
27177     };
27178
27179     mutex.unlock = function ()       {
27180         if (!intervalID) return;
27181         document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
27182         clearInterval(intervalID);
27183         intervalID = null;
27184     };
27185
27186     mutex.locked = function ()          {
27187         return !!intervalID;
27188     };
27189
27190     return mutex;
27191 }
27192
27193 function utilSuggestNames(preset, suggestions) {
27194     preset = preset.id.split('/', 2);
27195     var k = preset[0],
27196         v = preset[1];
27197
27198     return function(value, callback) {
27199         var result = [];
27200         if (value && value.length > 2) {
27201             if (suggestions[k] && suggestions[k][v]) {
27202                 for (var sugg in suggestions[k][v]) {
27203                     var dist = utilEditDistance(value, sugg.substring(0, value.length));
27204                     if (dist < 3) {
27205                         result.push({
27206                             title: sugg,
27207                             value: sugg,
27208                             dist: dist
27209                         });
27210                     }
27211                 }
27212             }
27213             result.sort(function(a, b) {
27214                 return a.dist - b.dist;
27215             });
27216         }
27217         result = result.slice(0,3);
27218         callback(result);
27219     };
27220 }
27221
27222 function utilTriggerEvent(target, type) {
27223     target.each(function() {
27224         var evt = document.createEvent('HTMLEvents');
27225         evt.initEvent(type, true, true);
27226         this.dispatchEvent(evt);
27227     });
27228 }
27229
27230 function validationDeprecatedTag() {
27231
27232     var validation = function(changes) {
27233         var warnings = [];
27234         for (var i = 0; i < changes.created.length; i++) {
27235             var change = changes.created[i],
27236                 deprecatedTags = change.deprecatedTags();
27237
27238             if (!isEmpty(deprecatedTags)) {
27239                 var tags = utilTagText({ tags: deprecatedTags });
27240                 warnings.push({
27241                     id: 'deprecated_tags',
27242                     message: t('validations.deprecated_tags', { tags: tags }),
27243                     entity: change
27244                 });
27245             }
27246         }
27247
27248         return warnings;
27249     };
27250
27251
27252     return validation;
27253 }
27254
27255 function validationDisconnectedHighway() {
27256
27257     function isDisconnectedHighway(entity, graph) {
27258         if (!entity.tags.highway) return false;
27259         if (entity.geometry(graph) !== 'line') return false;
27260
27261         return graph.childNodes(entity)
27262             .every(function(vertex) {
27263                 var parents = graph.parentWays(vertex);
27264                 if (parents.length === 1) {  // standalone vertex
27265                     return true;
27266                 } else {                     // shared vertex
27267                     return !vertex.tags.entrance &&
27268                         parents.filter(function(parent) {
27269                             return parent.tags.highway && parent !== entity;
27270                         }).length === 0;
27271                 }
27272             });
27273     }
27274
27275
27276     var validation = function(changes, graph) {
27277         var warnings = [];
27278         for (var i = 0; i < changes.created.length; i++) {
27279             var entity = changes.created[i];
27280
27281             if (isDisconnectedHighway(entity, graph)) {
27282                 warnings.push({
27283                     id: 'disconnected_highway',
27284                     message: t('validations.disconnected_highway'),
27285                     tooltip: t('validations.disconnected_highway_tooltip'),
27286                     entity: entity
27287                 });
27288             }
27289         }
27290
27291         return warnings;
27292     };
27293
27294
27295     return validation;
27296 }
27297
27298 function validationManyDeletions() {
27299     var threshold = 100;
27300
27301     var validation = function(changes, graph) {
27302         var warnings = [];
27303         var nodes=0, ways=0, areas=0, relations=0;
27304
27305         changes.deleted.forEach(function(c) {
27306             if (c.type === 'node') {nodes++;}
27307             else if (c.type === 'way' && c.geometry(graph) === 'line') {ways++;}
27308             else if (c.type === 'way' && c.geometry(graph) === 'area') {areas++;}
27309             else if (c.type === 'relation') {relations++;}
27310         });
27311         if (changes.deleted.length > threshold) {
27312             warnings.push({
27313                 id: 'many_deletions',
27314                 message: t('validations.many_deletions',
27315                     { n: changes.deleted.length, p: nodes, l: ways, a:areas, r: relations })
27316             });
27317         }
27318
27319         return warnings;
27320     };
27321
27322
27323     return validation;
27324 }
27325
27326 function validationMissingTag() {
27327
27328     // Slightly stricter check than Entity#isUsed (#3091)
27329     function hasTags(entity, graph) {
27330         return without(Object.keys(entity.tags), 'area', 'name').length > 0 ||
27331             graph.parentRelations(entity).length > 0;
27332     }
27333
27334     var validation = function(changes, graph) {
27335         var types = ['point', 'line', 'area', 'relation'],
27336             warnings = [];
27337
27338         for (var i = 0; i < changes.created.length; i++) {
27339             var change = changes.created[i],
27340                 geometry = change.geometry(graph);
27341
27342             if (types.indexOf(geometry) !== -1 && !hasTags(change, graph)) {
27343                 warnings.push({
27344                     id: 'missing_tag',
27345                     message: t('validations.untagged_' + geometry),
27346                     tooltip: t('validations.untagged_' + geometry + '_tooltip'),
27347                     entity: change
27348                 });
27349             }
27350         }
27351
27352         return warnings;
27353     };
27354
27355
27356     return validation;
27357 }
27358
27359 function validationOldMultipolygon() {
27360
27361     return function validation(changes, graph) {
27362         var warnings = [];
27363         for (var i = 0; i < changes.created.length; i++) {
27364             var entity = changes.created[i];
27365             var parent = osmIsSimpleMultipolygonOuterMember(entity, graph);
27366             if (parent) {
27367                 warnings.push({
27368                     id: 'old_multipolygon',
27369                     message: t('validations.old_multipolygon'),
27370                     tooltip: t('validations.old_multipolygon_tooltip'),
27371                     entity: parent
27372                 });
27373             }
27374         }
27375         return warnings;
27376     };
27377 }
27378
27379 // https://github.com/openstreetmap/josm/blob/mirror/src/org/
27380 // openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80
27381 function validationTagSuggestsArea() {
27382
27383     function tagSuggestsArea(tags) {
27384         if (isEmpty(tags)) return false;
27385
27386         var presence = ['landuse', 'amenities', 'tourism', 'shop'];
27387         for (var i = 0; i < presence.length; i++) {
27388             if (tags[presence[i]] !== undefined) {
27389                 return presence[i] + '=' + tags[presence[i]];
27390             }
27391         }
27392
27393         if (tags.building && tags.building === 'yes') return 'building=yes';
27394     }
27395
27396
27397     var validation = function(changes, graph) {
27398         var warnings = [];
27399         for (var i = 0; i < changes.created.length; i++) {
27400             var change = changes.created[i],
27401                 geometry = change.geometry(graph),
27402                 suggestion = (geometry === 'line' ? tagSuggestsArea(change.tags) : undefined);
27403
27404             if (suggestion) {
27405                 warnings.push({
27406                     id: 'tag_suggests_area',
27407                     message: t('validations.tag_suggests_area', { tag: suggestion }),
27408                     entity: change
27409                 });
27410             }
27411         }
27412
27413         return warnings;
27414     };
27415
27416
27417     return validation;
27418 }
27419
27420
27421
27422 var Validations = Object.freeze({
27423         validationDeprecatedTag: validationDeprecatedTag,
27424         validationDisconnectedHighway: validationDisconnectedHighway,
27425         validationManyDeletions: validationManyDeletions,
27426         validationMissingTag: validationMissingTag,
27427         validationOldMultipolygon: validationOldMultipolygon,
27428         validationTagSuggestsArea: validationTagSuggestsArea
27429 });
27430
27431 /**
27432  * Performs a deep comparison between two values to determine if they are
27433  * equivalent.
27434  *
27435  * **Note:** This method supports comparing arrays, array buffers, booleans,
27436  * date objects, error objects, maps, numbers, `Object` objects, regexes,
27437  * sets, strings, symbols, and typed arrays. `Object` objects are compared
27438  * by their own, not inherited, enumerable properties. Functions and DOM
27439  * nodes are compared by strict equality, i.e. `===`.
27440  *
27441  * @static
27442  * @memberOf _
27443  * @since 0.1.0
27444  * @category Lang
27445  * @param {*} value The value to compare.
27446  * @param {*} other The other value to compare.
27447  * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
27448  * @example
27449  *
27450  * var object = { 'a': 1 };
27451  * var other = { 'a': 1 };
27452  *
27453  * _.isEqual(object, other);
27454  * // => true
27455  *
27456  * object === other;
27457  * // => false
27458  */
27459 function isEqual(value, other) {
27460   return baseIsEqual(value, other);
27461 }
27462
27463 /*
27464     iD.Difference represents the difference between two graphs.
27465     It knows how to calculate the set of entities that were
27466     created, modified, or deleted, and also contains the logic
27467     for recursively extending a difference to the complete set
27468     of entities that will require a redraw, taking into account
27469     child and parent relationships.
27470  */
27471 function coreDifference(base, head) {
27472     var _changes = {};
27473     var _diff = {};
27474     var _length = 0;
27475     var i, k, h, b, keys;
27476
27477     function changed(h, b) {
27478         if (h === b) return false;
27479         if (!h || !b) return true;
27480
27481         if (h.loc || b.loc) {
27482             if (!h.loc && b.loc || h.loc && !b.loc ||
27483                 h.loc[0] !== b.loc[0] || h.loc[1] !== b.loc[1]) return true;
27484         }
27485         if (h.nodes || b.nodes) {
27486             if (!isEqual(h.nodes, b.nodes)) return true;
27487         }
27488         if (h.members || b.members) {
27489             if (!isEqual(h.members, b.members)) return true;
27490         }
27491         return !isEqual(h.tags, b.tags);
27492     }
27493
27494
27495     keys = Object.keys(head.entities);
27496     for (i = 0; i < keys.length; i++) {
27497         k = keys[i];
27498         h = head.entities[k];
27499         b = base.entities[k];
27500         if (changed(h, b)) {
27501             _changes[k] = {base: b, head: h};
27502             _length++;
27503         }
27504     }
27505
27506     keys = Object.keys(base.entities);
27507     for (i = 0; i < keys.length; i++) {
27508         k = keys[i];
27509         h = head.entities[k];
27510         b = base.entities[k];
27511         if (!_changes[k] && changed(h, b)) {
27512             _changes[k] = {base: b, head: h};
27513             _length++;
27514         }
27515     }
27516
27517
27518     function addParents(parents, result) {
27519         for (var i = 0; i < parents.length; i++) {
27520             var parent = parents[i];
27521
27522             if (parent.id in result)
27523                 continue;
27524
27525             result[parent.id] = parent;
27526             addParents(head.parentRelations(parent), result);
27527         }
27528     }
27529
27530
27531     _diff.length = function length() {
27532         return _length;
27533     };
27534
27535
27536     _diff.changes = function changes() {
27537         return _changes;
27538     };
27539
27540
27541     _diff.extantIDs = function extantIDs() {
27542         var result = [];
27543         forEach(_changes, function(change, id) {
27544             if (change.head) result.push(id);
27545         });
27546         return result;
27547     };
27548
27549
27550     _diff.modified = function modified() {
27551         var result = [];
27552         forEach(_changes, function(change) {
27553             if (change.base && change.head) result.push(change.head);
27554         });
27555         return result;
27556     };
27557
27558
27559     _diff.created = function created() {
27560         var result = [];
27561         forEach(_changes, function(change) {
27562             if (!change.base && change.head) result.push(change.head);
27563         });
27564         return result;
27565     };
27566
27567
27568     _diff.deleted = function deleted() {
27569         var result = [];
27570         forEach(_changes, function(change) {
27571             if (change.base && !change.head) result.push(change.base);
27572         });
27573         return result;
27574     };
27575
27576
27577     _diff.summary = function summary() {
27578         var relevant = {};
27579
27580         function addEntity(entity, graph, changeType) {
27581             relevant[entity.id] = {
27582                 entity: entity,
27583                 graph: graph,
27584                 changeType: changeType
27585             };
27586         }
27587
27588         function addParents(entity) {
27589             var parents = head.parentWays(entity);
27590             for (var j = parents.length - 1; j >= 0; j--) {
27591                 var parent = parents[j];
27592                 if (!(parent.id in relevant)) addEntity(parent, head, 'modified');
27593             }
27594         }
27595
27596         var keys = Object.keys(_changes);
27597         for (var i = 0; i < keys.length; i++) {
27598             var change = _changes[keys[i]];
27599
27600             if (change.head && change.head.geometry(head) !== 'vertex') {
27601                 addEntity(change.head, head, change.base ? 'modified' : 'created');
27602
27603             } else if (change.base && change.base.geometry(base) !== 'vertex') {
27604                 addEntity(change.base, base, 'deleted');
27605
27606             } else if (change.base && change.head) { // modified vertex
27607                 var moved    = !isEqual(change.base.loc,  change.head.loc);
27608                 var retagged = !isEqual(change.base.tags, change.head.tags);
27609
27610                 if (moved) {
27611                     addParents(change.head);
27612                 }
27613
27614                 if (retagged || (moved && change.head.hasInterestingTags())) {
27615                     addEntity(change.head, head, 'modified');
27616                 }
27617
27618             } else if (change.head && change.head.hasInterestingTags()) { // created vertex
27619                 addEntity(change.head, head, 'created');
27620
27621             } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
27622                 addEntity(change.base, base, 'deleted');
27623             }
27624         }
27625
27626         return values$1(relevant);
27627     };
27628
27629
27630     _diff.complete = function complete(extent) {
27631         var result = {};
27632         var id, change;
27633
27634         for (id in _changes) {
27635             change = _changes[id];
27636
27637             var h = change.head;
27638             var b = change.base;
27639             var entity = h || b;
27640
27641             if (extent &&
27642                 (!h || !h.intersects(extent, head)) &&
27643                 (!b || !b.intersects(extent, base)))
27644                 continue;
27645
27646             result[id] = h;
27647
27648             if (entity.type === 'way') {
27649                 var nh = h ? h.nodes : [];
27650                 var nb = b ? b.nodes : [];
27651                 var diff, i;
27652
27653                 diff = difference(nh, nb);
27654                 for (i = 0; i < diff.length; i++) {
27655                     result[diff[i]] = head.hasEntity(diff[i]);
27656                 }
27657
27658                 diff = difference(nb, nh);
27659                 for (i = 0; i < diff.length; i++) {
27660                     result[diff[i]] = head.hasEntity(diff[i]);
27661                 }
27662             }
27663
27664             addParents(head.parentWays(entity), result);
27665             addParents(head.parentRelations(entity), result);
27666         }
27667
27668         return result;
27669     };
27670
27671
27672     return _diff;
27673 }
27674
27675 /** Used for built-in method references. */
27676 var objectProto$18 = Object.prototype;
27677
27678 /** Used to check objects for own properties. */
27679 var hasOwnProperty$15 = objectProto$18.hasOwnProperty;
27680
27681 /**
27682  * Assigns own enumerable string keyed properties of source objects to the
27683  * destination object. Source objects are applied from left to right.
27684  * Subsequent sources overwrite property assignments of previous sources.
27685  *
27686  * **Note:** This method mutates `object` and is loosely based on
27687  * [`Object.assign`](https://mdn.io/Object/assign).
27688  *
27689  * @static
27690  * @memberOf _
27691  * @since 0.10.0
27692  * @category Object
27693  * @param {Object} object The destination object.
27694  * @param {...Object} [sources] The source objects.
27695  * @returns {Object} Returns `object`.
27696  * @see _.assignIn
27697  * @example
27698  *
27699  * function Foo() {
27700  *   this.a = 1;
27701  * }
27702  *
27703  * function Bar() {
27704  *   this.c = 3;
27705  * }
27706  *
27707  * Foo.prototype.b = 2;
27708  * Bar.prototype.d = 4;
27709  *
27710  * _.assign({ 'a': 0 }, new Foo, new Bar);
27711  * // => { 'a': 1, 'c': 3 }
27712  */
27713 var assign = createAssigner(function(object, source) {
27714   if (isPrototype(source) || isArrayLike(source)) {
27715     copyObject(source, keys$1(source), object);
27716     return;
27717   }
27718   for (var key in source) {
27719     if (hasOwnProperty$15.call(source, key)) {
27720       assignValue(object, key, source[key]);
27721     }
27722   }
27723 });
27724
27725 /* Built-in method references for those with the same name as other `lodash` methods. */
27726 var nativeMax$3 = Math.max;
27727
27728 /**
27729  * Checks if `value` is in `collection`. If `collection` is a string, it's
27730  * checked for a substring of `value`, otherwise
27731  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
27732  * is used for equality comparisons. If `fromIndex` is negative, it's used as
27733  * the offset from the end of `collection`.
27734  *
27735  * @static
27736  * @memberOf _
27737  * @since 0.1.0
27738  * @category Collection
27739  * @param {Array|Object|string} collection The collection to inspect.
27740  * @param {*} value The value to search for.
27741  * @param {number} [fromIndex=0] The index to search from.
27742  * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
27743  * @returns {boolean} Returns `true` if `value` is found, else `false`.
27744  * @example
27745  *
27746  * _.includes([1, 2, 3], 1);
27747  * // => true
27748  *
27749  * _.includes([1, 2, 3], 1, 2);
27750  * // => false
27751  *
27752  * _.includes({ 'a': 1, 'b': 2 }, 1);
27753  * // => true
27754  *
27755  * _.includes('abcd', 'bc');
27756  * // => true
27757  */
27758 function includes(collection, value, fromIndex, guard) {
27759   collection = isArrayLike(collection) ? collection : values$1(collection);
27760   fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
27761
27762   var length = collection.length;
27763   if (fromIndex < 0) {
27764     fromIndex = nativeMax$3(length + fromIndex, 0);
27765   }
27766   return isString(collection)
27767     ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
27768     : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
27769 }
27770
27771 function coreGraph$$1(other, mutable) {
27772     if (!(this instanceof coreGraph$$1)) return new coreGraph$$1(other, mutable);
27773
27774     if (other instanceof coreGraph$$1) {
27775         var base = other.base();
27776         this.entities = assign(Object.create(base.entities), other.entities);
27777         this._parentWays = assign(Object.create(base.parentWays), other._parentWays);
27778         this._parentRels = assign(Object.create(base.parentRels), other._parentRels);
27779
27780     } else {
27781         this.entities = Object.create({});
27782         this._parentWays = Object.create({});
27783         this._parentRels = Object.create({});
27784         this.rebase(other || [], [this]);
27785     }
27786
27787     this.transients = {};
27788     this._childNodes = {};
27789     this.frozen = !mutable;
27790 }
27791
27792
27793 coreGraph$$1.prototype = {
27794
27795     hasEntity: function(id) {
27796         return this.entities[id];
27797     },
27798
27799
27800     entity: function(id) {
27801         var entity = this.entities[id];
27802
27803         //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
27804         if (!entity) {
27805             entity = this.entities.__proto__[id];  // eslint-disable-line no-proto
27806         }
27807
27808         if (!entity) {
27809             throw new Error('entity ' + id + ' not found');
27810         }
27811         return entity;
27812     },
27813
27814
27815     transient: function(entity, key, fn) {
27816         var id = entity.id,
27817             transients = this.transients[id] ||
27818             (this.transients[id] = {});
27819
27820         if (transients[key] !== undefined) {
27821             return transients[key];
27822         }
27823
27824         transients[key] = fn.call(entity);
27825
27826         return transients[key];
27827     },
27828
27829
27830     parentWays: function(entity) {
27831         var parents = this._parentWays[entity.id],
27832             result = [];
27833
27834         if (parents) {
27835             for (var i = 0; i < parents.length; i++) {
27836                 result.push(this.entity(parents[i]));
27837             }
27838         }
27839         return result;
27840     },
27841
27842
27843     isPoi: function(entity) {
27844         var parentWays = this._parentWays[entity.id];
27845         return !parentWays || parentWays.length === 0;
27846     },
27847
27848
27849     isShared: function(entity) {
27850         var parentWays = this._parentWays[entity.id];
27851         return parentWays && parentWays.length > 1;
27852     },
27853
27854
27855     parentRelations: function(entity) {
27856         var parents = this._parentRels[entity.id],
27857             result = [];
27858
27859         if (parents) {
27860             for (var i = 0; i < parents.length; i++) {
27861                 result.push(this.entity(parents[i]));
27862             }
27863         }
27864         return result;
27865     },
27866
27867
27868     childNodes: function(entity) {
27869         if (this._childNodes[entity.id]) return this._childNodes[entity.id];
27870         if (!entity.nodes) return [];
27871
27872         var nodes = [];
27873         for (var i = 0; i < entity.nodes.length; i++) {
27874             nodes[i] = this.entity(entity.nodes[i]);
27875         }
27876
27877         if (debug) Object.freeze(nodes);
27878
27879         this._childNodes[entity.id] = nodes;
27880         return this._childNodes[entity.id];
27881     },
27882
27883
27884     base: function() {
27885         return {
27886             'entities': utilGetPrototypeOf(this.entities),
27887             'parentWays': utilGetPrototypeOf(this._parentWays),
27888             'parentRels': utilGetPrototypeOf(this._parentRels)
27889         };
27890     },
27891
27892
27893     // Unlike other graph methods, rebase mutates in place. This is because it
27894     // is used only during the history operation that merges newly downloaded
27895     // data into each state. To external consumers, it should appear as if the
27896     // graph always contained the newly downloaded data.
27897     rebase: function(entities, stack, force) {
27898         var base = this.base(),
27899             i, j, k, id;
27900
27901         for (i = 0; i < entities.length; i++) {
27902             var entity = entities[i];
27903
27904             if (!entity.visible || (!force && base.entities[entity.id]))
27905                 continue;
27906
27907             // Merging data into the base graph
27908             base.entities[entity.id] = entity;
27909             this._updateCalculated(undefined, entity, base.parentWays, base.parentRels);
27910
27911             // Restore provisionally-deleted nodes that are discovered to have an extant parent
27912             if (entity.type === 'way') {
27913                 for (j = 0; j < entity.nodes.length; j++) {
27914                     id = entity.nodes[j];
27915                     for (k = 1; k < stack.length; k++) {
27916                         var ents = stack[k].entities;
27917                         if (ents.hasOwnProperty(id) && ents[id] === undefined) {
27918                             delete ents[id];
27919                         }
27920                     }
27921                 }
27922             }
27923         }
27924
27925         for (i = 0; i < stack.length; i++) {
27926             stack[i]._updateRebased();
27927         }
27928     },
27929
27930
27931     _updateRebased: function() {
27932         var base = this.base(),
27933             i, k, child, id, keys;
27934
27935         keys = Object.keys(this._parentWays);
27936         for (i = 0; i < keys.length; i++) {
27937             child = keys[i];
27938             if (base.parentWays[child]) {
27939                 for (k = 0; k < base.parentWays[child].length; k++) {
27940                     id = base.parentWays[child][k];
27941                     if (!this.entities.hasOwnProperty(id) && !includes(this._parentWays[child], id)) {
27942                         this._parentWays[child].push(id);
27943                     }
27944                 }
27945             }
27946         }
27947
27948         keys = Object.keys(this._parentRels);
27949         for (i = 0; i < keys.length; i++) {
27950             child = keys[i];
27951             if (base.parentRels[child]) {
27952                 for (k = 0; k < base.parentRels[child].length; k++) {
27953                     id = base.parentRels[child][k];
27954                     if (!this.entities.hasOwnProperty(id) && !includes(this._parentRels[child], id)) {
27955                         this._parentRels[child].push(id);
27956                     }
27957                 }
27958             }
27959         }
27960
27961         this.transients = {};
27962
27963         // this._childNodes is not updated, under the assumption that
27964         // ways are always downloaded with their child nodes.
27965     },
27966
27967
27968     // Updates calculated properties (parentWays, parentRels) for the specified change
27969     _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
27970
27971         parentWays = parentWays || this._parentWays;
27972         parentRels = parentRels || this._parentRels;
27973
27974         var type = entity && entity.type || oldentity && oldentity.type,
27975             removed, added, ways, rels, i;
27976
27977
27978         if (type === 'way') {
27979
27980             // Update parentWays
27981             if (oldentity && entity) {
27982                 removed = difference(oldentity.nodes, entity.nodes);
27983                 added = difference(entity.nodes, oldentity.nodes);
27984             } else if (oldentity) {
27985                 removed = oldentity.nodes;
27986                 added = [];
27987             } else if (entity) {
27988                 removed = [];
27989                 added = entity.nodes;
27990             }
27991             for (i = 0; i < removed.length; i++) {
27992                 parentWays[removed[i]] = without(parentWays[removed[i]], oldentity.id);
27993             }
27994             for (i = 0; i < added.length; i++) {
27995                 ways = without(parentWays[added[i]], entity.id);
27996                 ways.push(entity.id);
27997                 parentWays[added[i]] = ways;
27998             }
27999
28000         } else if (type === 'relation') {
28001
28002             // Update parentRels
28003             if (oldentity && entity) {
28004                 removed = difference(oldentity.members, entity.members);
28005                 added = difference(entity.members, oldentity);
28006             } else if (oldentity) {
28007                 removed = oldentity.members;
28008                 added = [];
28009             } else if (entity) {
28010                 removed = [];
28011                 added = entity.members;
28012             }
28013             for (i = 0; i < removed.length; i++) {
28014                 parentRels[removed[i].id] = without(parentRels[removed[i].id], oldentity.id);
28015             }
28016             for (i = 0; i < added.length; i++) {
28017                 rels = without(parentRels[added[i].id], entity.id);
28018                 rels.push(entity.id);
28019                 parentRels[added[i].id] = rels;
28020             }
28021         }
28022     },
28023
28024
28025     replace: function(entity) {
28026         if (this.entities[entity.id] === entity)
28027             return this;
28028
28029         return this.update(function() {
28030             this._updateCalculated(this.entities[entity.id], entity);
28031             this.entities[entity.id] = entity;
28032         });
28033     },
28034
28035
28036     remove: function(entity) {
28037         return this.update(function() {
28038             this._updateCalculated(entity, undefined);
28039             this.entities[entity.id] = undefined;
28040         });
28041     },
28042
28043
28044     revert: function(id) {
28045         var baseEntity = this.base().entities[id],
28046             headEntity = this.entities[id];
28047
28048         if (headEntity === baseEntity)
28049             return this;
28050
28051         return this.update(function() {
28052             this._updateCalculated(headEntity, baseEntity);
28053             delete this.entities[id];
28054         });
28055     },
28056
28057
28058     update: function() {
28059         var graph = this.frozen ? coreGraph$$1(this, true) : this;
28060
28061         for (var i = 0; i < arguments.length; i++) {
28062             arguments[i].call(graph, graph);
28063         }
28064
28065         if (this.frozen) graph.frozen = true;
28066
28067         return graph;
28068     },
28069
28070
28071     // Obliterates any existing entities
28072     load: function(entities) {
28073         var base = this.base();
28074         this.entities = Object.create(base.entities);
28075
28076         for (var i in entities) {
28077             this.entities[i] = entities[i];
28078             this._updateCalculated(base.entities[i], this.entities[i]);
28079         }
28080
28081         return this;
28082     }
28083 };
28084
28085 var quickselect_1 = quickselect;
28086 var default_1 = quickselect;
28087
28088 function quickselect(arr, k, left, right, compare) {
28089     quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
28090 }
28091 function quickselectStep(arr, k, left, right, compare) {
28092
28093     while (right > left) {
28094         if (right - left > 600) {
28095             var n = right - left + 1;
28096             var m = k - left + 1;
28097             var z = Math.log(n);
28098             var s = 0.5 * Math.exp(2 * z / 3);
28099             var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
28100             var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
28101             var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
28102             quickselectStep(arr, k, newLeft, newRight, compare);
28103         }
28104
28105         var t = arr[k];
28106         var i = left;
28107         var j = right;
28108
28109         swap(arr, left, k);
28110         if (compare(arr[right], t) > 0) swap(arr, left, right);
28111
28112         while (i < j) {
28113             swap(arr, i, j);
28114             i++;
28115             j--;
28116             while (compare(arr[i], t) < 0) i++;
28117             while (compare(arr[j], t) > 0) j--;
28118         }
28119
28120         if (compare(arr[left], t) === 0) swap(arr, left, j);
28121         else {
28122             j++;
28123             swap(arr, j, right);
28124         }
28125
28126         if (j <= k) left = j + 1;
28127         if (k <= j) right = j - 1;
28128     }
28129 }
28130
28131 function swap(arr, i, j) {
28132     var tmp = arr[i];
28133     arr[i] = arr[j];
28134     arr[j] = tmp;
28135 }
28136
28137 function defaultCompare(a, b) {
28138     return a < b ? -1 : a > b ? 1 : 0;
28139 }
28140 quickselect_1.default = default_1;
28141
28142 var rbush_1 = rbush;
28143 var default_1$1 = rbush;
28144
28145
28146
28147 function rbush(maxEntries, format) {
28148     if (!(this instanceof rbush)) return new rbush(maxEntries, format);
28149
28150     // max entries in a node is 9 by default; min node fill is 40% for best performance
28151     this._maxEntries = Math.max(4, maxEntries || 9);
28152     this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
28153
28154     if (format) {
28155         this._initFormat(format);
28156     }
28157
28158     this.clear();
28159 }
28160
28161 rbush.prototype = {
28162
28163     all: function () {
28164         return this._all(this.data, []);
28165     },
28166
28167     search: function (bbox) {
28168
28169         var node = this.data,
28170             result = [],
28171             toBBox = this.toBBox;
28172
28173         if (!intersects$1(bbox, node)) return result;
28174
28175         var nodesToSearch = [],
28176             i, len, child, childBBox;
28177
28178         while (node) {
28179             for (i = 0, len = node.children.length; i < len; i++) {
28180
28181                 child = node.children[i];
28182                 childBBox = node.leaf ? toBBox(child) : child;
28183
28184                 if (intersects$1(bbox, childBBox)) {
28185                     if (node.leaf) result.push(child);
28186                     else if (contains$2(bbox, childBBox)) this._all(child, result);
28187                     else nodesToSearch.push(child);
28188                 }
28189             }
28190             node = nodesToSearch.pop();
28191         }
28192
28193         return result;
28194     },
28195
28196     collides: function (bbox) {
28197
28198         var node = this.data,
28199             toBBox = this.toBBox;
28200
28201         if (!intersects$1(bbox, node)) return false;
28202
28203         var nodesToSearch = [],
28204             i, len, child, childBBox;
28205
28206         while (node) {
28207             for (i = 0, len = node.children.length; i < len; i++) {
28208
28209                 child = node.children[i];
28210                 childBBox = node.leaf ? toBBox(child) : child;
28211
28212                 if (intersects$1(bbox, childBBox)) {
28213                     if (node.leaf || contains$2(bbox, childBBox)) return true;
28214                     nodesToSearch.push(child);
28215                 }
28216             }
28217             node = nodesToSearch.pop();
28218         }
28219
28220         return false;
28221     },
28222
28223     load: function (data) {
28224         if (!(data && data.length)) return this;
28225
28226         if (data.length < this._minEntries) {
28227             for (var i = 0, len = data.length; i < len; i++) {
28228                 this.insert(data[i]);
28229             }
28230             return this;
28231         }
28232
28233         // recursively build the tree with the given data from scratch using OMT algorithm
28234         var node = this._build(data.slice(), 0, data.length - 1, 0);
28235
28236         if (!this.data.children.length) {
28237             // save as is if tree is empty
28238             this.data = node;
28239
28240         } else if (this.data.height === node.height) {
28241             // split root if trees have the same height
28242             this._splitRoot(this.data, node);
28243
28244         } else {
28245             if (this.data.height < node.height) {
28246                 // swap trees if inserted one is bigger
28247                 var tmpNode = this.data;
28248                 this.data = node;
28249                 node = tmpNode;
28250             }
28251
28252             // insert the small tree into the large tree at appropriate level
28253             this._insert(node, this.data.height - node.height - 1, true);
28254         }
28255
28256         return this;
28257     },
28258
28259     insert: function (item) {
28260         if (item) this._insert(item, this.data.height - 1);
28261         return this;
28262     },
28263
28264     clear: function () {
28265         this.data = createNode([]);
28266         return this;
28267     },
28268
28269     remove: function (item, equalsFn) {
28270         if (!item) return this;
28271
28272         var node = this.data,
28273             bbox = this.toBBox(item),
28274             path = [],
28275             indexes = [],
28276             i, parent, index, goingUp;
28277
28278         // depth-first iterative tree traversal
28279         while (node || path.length) {
28280
28281             if (!node) { // go up
28282                 node = path.pop();
28283                 parent = path[path.length - 1];
28284                 i = indexes.pop();
28285                 goingUp = true;
28286             }
28287
28288             if (node.leaf) { // check current node
28289                 index = findItem(item, node.children, equalsFn);
28290
28291                 if (index !== -1) {
28292                     // item found, remove the item and condense tree upwards
28293                     node.children.splice(index, 1);
28294                     path.push(node);
28295                     this._condense(path);
28296                     return this;
28297                 }
28298             }
28299
28300             if (!goingUp && !node.leaf && contains$2(node, bbox)) { // go down
28301                 path.push(node);
28302                 indexes.push(i);
28303                 i = 0;
28304                 parent = node;
28305                 node = node.children[0];
28306
28307             } else if (parent) { // go right
28308                 i++;
28309                 node = parent.children[i];
28310                 goingUp = false;
28311
28312             } else node = null; // nothing found
28313         }
28314
28315         return this;
28316     },
28317
28318     toBBox: function (item) { return item; },
28319
28320     compareMinX: compareNodeMinX,
28321     compareMinY: compareNodeMinY,
28322
28323     toJSON: function () { return this.data; },
28324
28325     fromJSON: function (data) {
28326         this.data = data;
28327         return this;
28328     },
28329
28330     _all: function (node, result) {
28331         var nodesToSearch = [];
28332         while (node) {
28333             if (node.leaf) result.push.apply(result, node.children);
28334             else nodesToSearch.push.apply(nodesToSearch, node.children);
28335
28336             node = nodesToSearch.pop();
28337         }
28338         return result;
28339     },
28340
28341     _build: function (items, left, right, height) {
28342
28343         var N = right - left + 1,
28344             M = this._maxEntries,
28345             node;
28346
28347         if (N <= M) {
28348             // reached leaf level; return leaf
28349             node = createNode(items.slice(left, right + 1));
28350             calcBBox(node, this.toBBox);
28351             return node;
28352         }
28353
28354         if (!height) {
28355             // target height of the bulk-loaded tree
28356             height = Math.ceil(Math.log(N) / Math.log(M));
28357
28358             // target number of root entries to maximize storage utilization
28359             M = Math.ceil(N / Math.pow(M, height - 1));
28360         }
28361
28362         node = createNode([]);
28363         node.leaf = false;
28364         node.height = height;
28365
28366         // split the items into M mostly square tiles
28367
28368         var N2 = Math.ceil(N / M),
28369             N1 = N2 * Math.ceil(Math.sqrt(M)),
28370             i, j, right2, right3;
28371
28372         multiSelect(items, left, right, N1, this.compareMinX);
28373
28374         for (i = left; i <= right; i += N1) {
28375
28376             right2 = Math.min(i + N1 - 1, right);
28377
28378             multiSelect(items, i, right2, N2, this.compareMinY);
28379
28380             for (j = i; j <= right2; j += N2) {
28381
28382                 right3 = Math.min(j + N2 - 1, right2);
28383
28384                 // pack each entry recursively
28385                 node.children.push(this._build(items, j, right3, height - 1));
28386             }
28387         }
28388
28389         calcBBox(node, this.toBBox);
28390
28391         return node;
28392     },
28393
28394     _chooseSubtree: function (bbox, node, level, path) {
28395
28396         var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
28397
28398         while (true) {
28399             path.push(node);
28400
28401             if (node.leaf || path.length - 1 === level) break;
28402
28403             minArea = minEnlargement = Infinity;
28404
28405             for (i = 0, len = node.children.length; i < len; i++) {
28406                 child = node.children[i];
28407                 area = bboxArea(child);
28408                 enlargement = enlargedArea(bbox, child) - area;
28409
28410                 // choose entry with the least area enlargement
28411                 if (enlargement < minEnlargement) {
28412                     minEnlargement = enlargement;
28413                     minArea = area < minArea ? area : minArea;
28414                     targetNode = child;
28415
28416                 } else if (enlargement === minEnlargement) {
28417                     // otherwise choose one with the smallest area
28418                     if (area < minArea) {
28419                         minArea = area;
28420                         targetNode = child;
28421                     }
28422                 }
28423             }
28424
28425             node = targetNode || node.children[0];
28426         }
28427
28428         return node;
28429     },
28430
28431     _insert: function (item, level, isNode) {
28432
28433         var toBBox = this.toBBox,
28434             bbox = isNode ? item : toBBox(item),
28435             insertPath = [];
28436
28437         // find the best node for accommodating the item, saving all nodes along the path too
28438         var node = this._chooseSubtree(bbox, this.data, level, insertPath);
28439
28440         // put the item into the node
28441         node.children.push(item);
28442         extend$1(node, bbox);
28443
28444         // split on node overflow; propagate upwards if necessary
28445         while (level >= 0) {
28446             if (insertPath[level].children.length > this._maxEntries) {
28447                 this._split(insertPath, level);
28448                 level--;
28449             } else break;
28450         }
28451
28452         // adjust bboxes along the insertion path
28453         this._adjustParentBBoxes(bbox, insertPath, level);
28454     },
28455
28456     // split overflowed node into two
28457     _split: function (insertPath, level) {
28458
28459         var node = insertPath[level],
28460             M = node.children.length,
28461             m = this._minEntries;
28462
28463         this._chooseSplitAxis(node, m, M);
28464
28465         var splitIndex = this._chooseSplitIndex(node, m, M);
28466
28467         var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
28468         newNode.height = node.height;
28469         newNode.leaf = node.leaf;
28470
28471         calcBBox(node, this.toBBox);
28472         calcBBox(newNode, this.toBBox);
28473
28474         if (level) insertPath[level - 1].children.push(newNode);
28475         else this._splitRoot(node, newNode);
28476     },
28477
28478     _splitRoot: function (node, newNode) {
28479         // split root node
28480         this.data = createNode([node, newNode]);
28481         this.data.height = node.height + 1;
28482         this.data.leaf = false;
28483         calcBBox(this.data, this.toBBox);
28484     },
28485
28486     _chooseSplitIndex: function (node, m, M) {
28487
28488         var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
28489
28490         minOverlap = minArea = Infinity;
28491
28492         for (i = m; i <= M - m; i++) {
28493             bbox1 = distBBox(node, 0, i, this.toBBox);
28494             bbox2 = distBBox(node, i, M, this.toBBox);
28495
28496             overlap = intersectionArea(bbox1, bbox2);
28497             area = bboxArea(bbox1) + bboxArea(bbox2);
28498
28499             // choose distribution with minimum overlap
28500             if (overlap < minOverlap) {
28501                 minOverlap = overlap;
28502                 index = i;
28503
28504                 minArea = area < minArea ? area : minArea;
28505
28506             } else if (overlap === minOverlap) {
28507                 // otherwise choose distribution with minimum area
28508                 if (area < minArea) {
28509                     minArea = area;
28510                     index = i;
28511                 }
28512             }
28513         }
28514
28515         return index;
28516     },
28517
28518     // sorts node children by the best axis for split
28519     _chooseSplitAxis: function (node, m, M) {
28520
28521         var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
28522             compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
28523             xMargin = this._allDistMargin(node, m, M, compareMinX),
28524             yMargin = this._allDistMargin(node, m, M, compareMinY);
28525
28526         // if total distributions margin value is minimal for x, sort by minX,
28527         // otherwise it's already sorted by minY
28528         if (xMargin < yMargin) node.children.sort(compareMinX);
28529     },
28530
28531     // total margin of all possible split distributions where each node is at least m full
28532     _allDistMargin: function (node, m, M, compare) {
28533
28534         node.children.sort(compare);
28535
28536         var toBBox = this.toBBox,
28537             leftBBox = distBBox(node, 0, m, toBBox),
28538             rightBBox = distBBox(node, M - m, M, toBBox),
28539             margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
28540             i, child;
28541
28542         for (i = m; i < M - m; i++) {
28543             child = node.children[i];
28544             extend$1(leftBBox, node.leaf ? toBBox(child) : child);
28545             margin += bboxMargin(leftBBox);
28546         }
28547
28548         for (i = M - m - 1; i >= m; i--) {
28549             child = node.children[i];
28550             extend$1(rightBBox, node.leaf ? toBBox(child) : child);
28551             margin += bboxMargin(rightBBox);
28552         }
28553
28554         return margin;
28555     },
28556
28557     _adjustParentBBoxes: function (bbox, path, level) {
28558         // adjust bboxes along the given tree path
28559         for (var i = level; i >= 0; i--) {
28560             extend$1(path[i], bbox);
28561         }
28562     },
28563
28564     _condense: function (path) {
28565         // go through the path, removing empty nodes and updating bboxes
28566         for (var i = path.length - 1, siblings; i >= 0; i--) {
28567             if (path[i].children.length === 0) {
28568                 if (i > 0) {
28569                     siblings = path[i - 1].children;
28570                     siblings.splice(siblings.indexOf(path[i]), 1);
28571
28572                 } else this.clear();
28573
28574             } else calcBBox(path[i], this.toBBox);
28575         }
28576     },
28577
28578     _initFormat: function (format) {
28579         // data format (minX, minY, maxX, maxY accessors)
28580
28581         // uses eval-type function compilation instead of just accepting a toBBox function
28582         // because the algorithms are very sensitive to sorting functions performance,
28583         // so they should be dead simple and without inner calls
28584
28585         var compareArr = ['return a', ' - b', ';'];
28586
28587         this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
28588         this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
28589
28590         this.toBBox = new Function('a',
28591             'return {minX: a' + format[0] +
28592             ', minY: a' + format[1] +
28593             ', maxX: a' + format[2] +
28594             ', maxY: a' + format[3] + '};');
28595     }
28596 };
28597
28598 function findItem(item, items, equalsFn) {
28599     if (!equalsFn) return items.indexOf(item);
28600
28601     for (var i = 0; i < items.length; i++) {
28602         if (equalsFn(item, items[i])) return i;
28603     }
28604     return -1;
28605 }
28606
28607 // calculate node's bbox from bboxes of its children
28608 function calcBBox(node, toBBox) {
28609     distBBox(node, 0, node.children.length, toBBox, node);
28610 }
28611
28612 // min bounding rectangle of node children from k to p-1
28613 function distBBox(node, k, p, toBBox, destNode) {
28614     if (!destNode) destNode = createNode(null);
28615     destNode.minX = Infinity;
28616     destNode.minY = Infinity;
28617     destNode.maxX = -Infinity;
28618     destNode.maxY = -Infinity;
28619
28620     for (var i = k, child; i < p; i++) {
28621         child = node.children[i];
28622         extend$1(destNode, node.leaf ? toBBox(child) : child);
28623     }
28624
28625     return destNode;
28626 }
28627
28628 function extend$1(a, b) {
28629     a.minX = Math.min(a.minX, b.minX);
28630     a.minY = Math.min(a.minY, b.minY);
28631     a.maxX = Math.max(a.maxX, b.maxX);
28632     a.maxY = Math.max(a.maxY, b.maxY);
28633     return a;
28634 }
28635
28636 function compareNodeMinX(a, b) { return a.minX - b.minX; }
28637 function compareNodeMinY(a, b) { return a.minY - b.minY; }
28638
28639 function bboxArea(a)   { return (a.maxX - a.minX) * (a.maxY - a.minY); }
28640 function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
28641
28642 function enlargedArea(a, b) {
28643     return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
28644            (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
28645 }
28646
28647 function intersectionArea(a, b) {
28648     var minX = Math.max(a.minX, b.minX),
28649         minY = Math.max(a.minY, b.minY),
28650         maxX = Math.min(a.maxX, b.maxX),
28651         maxY = Math.min(a.maxY, b.maxY);
28652
28653     return Math.max(0, maxX - minX) *
28654            Math.max(0, maxY - minY);
28655 }
28656
28657 function contains$2(a, b) {
28658     return a.minX <= b.minX &&
28659            a.minY <= b.minY &&
28660            b.maxX <= a.maxX &&
28661            b.maxY <= a.maxY;
28662 }
28663
28664 function intersects$1(a, b) {
28665     return b.minX <= a.maxX &&
28666            b.minY <= a.maxY &&
28667            b.maxX >= a.minX &&
28668            b.maxY >= a.minY;
28669 }
28670
28671 function createNode(children) {
28672     return {
28673         children: children,
28674         height: 1,
28675         leaf: true,
28676         minX: Infinity,
28677         minY: Infinity,
28678         maxX: -Infinity,
28679         maxY: -Infinity
28680     };
28681 }
28682
28683 // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
28684 // combines selection algorithm with binary divide & conquer approach
28685
28686 function multiSelect(arr, left, right, n, compare) {
28687     var stack = [left, right],
28688         mid;
28689
28690     while (stack.length) {
28691         right = stack.pop();
28692         left = stack.pop();
28693
28694         if (right - left <= n) continue;
28695
28696         mid = left + Math.ceil((right - left) / n / 2) * n;
28697         quickselect_1(arr, mid, left, right, compare);
28698
28699         stack.push(left, mid, mid, right);
28700     }
28701 }
28702 rbush_1.default = default_1$1;
28703
28704 function coreTree(head) {
28705     var rtree = rbush_1(),
28706         bboxes = {},
28707         tree = {};
28708
28709
28710     function entityBBox(entity) {
28711         var bbox = entity.extent(head).bbox();
28712         bbox.id = entity.id;
28713         bboxes[entity.id] = bbox;
28714         return bbox;
28715     }
28716
28717
28718     function updateParents(entity, insertions, memo) {
28719         head.parentWays(entity).forEach(function(way) {
28720             if (bboxes[way.id]) {
28721                 rtree.remove(bboxes[way.id]);
28722                 insertions[way.id] = way;
28723             }
28724             updateParents(way, insertions, memo);
28725         });
28726
28727         head.parentRelations(entity).forEach(function(relation) {
28728             if (memo[entity.id]) return;
28729             memo[entity.id] = true;
28730             if (bboxes[relation.id]) {
28731                 rtree.remove(bboxes[relation.id]);
28732                 insertions[relation.id] = relation;
28733             }
28734             updateParents(relation, insertions, memo);
28735         });
28736     }
28737
28738
28739     tree.rebase = function(entities, force) {
28740         var insertions = {};
28741
28742         for (var i = 0; i < entities.length; i++) {
28743             var entity = entities[i];
28744
28745             if (!entity.visible)
28746                 continue;
28747
28748             if (head.entities.hasOwnProperty(entity.id) || bboxes[entity.id]) {
28749                 if (!force) {
28750                     continue;
28751                 } else if (bboxes[entity.id]) {
28752                     rtree.remove(bboxes[entity.id]);
28753                 }
28754             }
28755
28756             insertions[entity.id] = entity;
28757             updateParents(entity, insertions, {});
28758         }
28759
28760         rtree.load(map$3(insertions, entityBBox));
28761
28762         return tree;
28763     };
28764
28765
28766     tree.intersects = function(extent, graph) {
28767         if (graph !== head) {
28768             var diff = coreDifference(head, graph),
28769                 insertions = {};
28770
28771             head = graph;
28772
28773             diff.deleted().forEach(function(entity) {
28774                 rtree.remove(bboxes[entity.id]);
28775                 delete bboxes[entity.id];
28776             });
28777
28778             diff.modified().forEach(function(entity) {
28779                 rtree.remove(bboxes[entity.id]);
28780                 insertions[entity.id] = entity;
28781                 updateParents(entity, insertions, {});
28782             });
28783
28784             diff.created().forEach(function(entity) {
28785                 insertions[entity.id] = entity;
28786             });
28787
28788             rtree.load(map$3(insertions, entityBBox));
28789         }
28790
28791         return rtree.search(extent.bbox()).map(function(bbox) {
28792             return head.entity(bbox.id);
28793         });
28794     };
28795
28796
28797     return tree;
28798 }
28799
28800 /*
28801  * This code is licensed under the MIT license.
28802  *
28803  * Copyright © 2013, iD authors.
28804  *
28805  * Portions copyright © 2011, Keith Cirkel
28806  * See https://github.com/keithamus/jwerty
28807  *
28808  */
28809 function d3keybinding(namespace$$1) {
28810     var bindings = [];
28811
28812
28813     function testBindings(isCapturing) {
28814         var didMatch = false,
28815             i, binding;
28816
28817         // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
28818         // so we don't strictly match on the shift key, but we prioritize
28819         // shifted bindings first, and fallback to unshifted only if no match.
28820         // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z')
28821
28822         // priority match shifted bindings first
28823         for (i = 0; i < bindings.length; i++) {
28824             binding = bindings[i];
28825             if (!binding.event.modifiers.shiftKey) continue;  // no shift
28826             if (!!binding.capture !== isCapturing) continue;
28827             if (matches(binding, true)) {
28828                 binding.callback();
28829                 didMatch = true;
28830             }
28831         }
28832
28833         // then unshifted bindings
28834         if (didMatch) return;
28835         for (i = 0; i < bindings.length; i++) {
28836             binding = bindings[i];
28837             if (binding.event.modifiers.shiftKey) continue;   // shift
28838             if (!!binding.capture !== isCapturing) continue;
28839             if (matches(binding, false)) {
28840                 binding.callback();
28841             }
28842         }
28843
28844
28845         function matches(binding, testShift) {
28846             var event$$1 = event;
28847             var isMatch = false;
28848             var tryKeyCode = true;
28849
28850             // Prefer a match on `KeyboardEvent.key`
28851             if (event$$1.key !== undefined) {
28852                 tryKeyCode = (event$$1.key.charCodeAt(0) > 255);  // outside ISO-Latin-1
28853                 isMatch = true;
28854
28855                 if (binding.event.key === undefined) {
28856                     isMatch = false;
28857                 } else if (Array.isArray(binding.event.key)) {
28858                     if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$$1.key.toLowerCase()) === -1)
28859                         isMatch = false;
28860                 } else {
28861                     if (event$$1.key.toLowerCase() !== binding.event.key.toLowerCase())
28862                         isMatch = false;
28863                 }
28864             }
28865
28866             // Fallback match on `KeyboardEvent.keyCode`, can happen if:
28867             // - browser doesn't support `KeyboardEvent.key`
28868             // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?)
28869             if (!isMatch && tryKeyCode) {
28870                 isMatch = (event$$1.keyCode === binding.event.keyCode);
28871             }
28872
28873             if (!isMatch) return false;
28874
28875             // test modifier keys
28876             if (!(event$$1.ctrlKey && event$$1.altKey)) {  // if both are set, assume AltGr and skip it - #4096
28877                 if (event$$1.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
28878                 if (event$$1.altKey !== binding.event.modifiers.altKey) return false;
28879             }
28880             if (event$$1.metaKey !== binding.event.modifiers.metaKey) return false;
28881             if (testShift && event$$1.shiftKey !== binding.event.modifiers.shiftKey) return false;
28882
28883             return true;
28884         }
28885     }
28886
28887
28888     function capture() {
28889         testBindings(true);
28890     }
28891
28892
28893     function bubble() {
28894         var tagName = d3_select(event.target).node().tagName;
28895         if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
28896             return;
28897         }
28898         testBindings(false);
28899     }
28900
28901
28902     function keybinding(selection$$1) {
28903         selection$$1 = selection$$1 || d3_select(document);
28904         selection$$1.on('keydown.capture' + namespace$$1, capture, true);
28905         selection$$1.on('keydown.bubble' + namespace$$1, bubble, false);
28906         return keybinding;
28907     }
28908
28909
28910     keybinding.off = function(selection$$1) {
28911         bindings = [];
28912         selection$$1 = selection$$1 || d3_select(document);
28913         selection$$1.on('keydown.capture' + namespace$$1, null);
28914         selection$$1.on('keydown.bubble' + namespace$$1, null);
28915         return keybinding;
28916     };
28917
28918
28919     keybinding.on = function(codes, callback, capture) {
28920         var arr = [].concat(codes);
28921         for (var i = 0; i < arr.length; i++) {
28922             var code = arr[i];
28923             var binding = {
28924                 event: {
28925                     key: undefined,  // preferred
28926                     keyCode: 0,      // fallback
28927                     modifiers: {
28928                         shiftKey: false,
28929                         ctrlKey: false,
28930                         altKey: false,
28931                         metaKey: false
28932                     }
28933                 },
28934                 capture: capture,
28935                 callback: callback
28936             };
28937
28938             code = code.toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
28939
28940             for (var j = 0; j < code.length; j++) {
28941                 // Normalise matching errors
28942                 if (code[j] === '++') code[j] = '+';
28943
28944                 if (code[j] in d3keybinding.modifierCodes) {
28945                     binding.event.modifiers[d3keybinding.modifierProperties[d3keybinding.modifierCodes[code[j]]]] = true;
28946                 } else {
28947                     binding.event.key = d3keybinding.keys[code[j]] || code[j];
28948                     if (code[j] in d3keybinding.keyCodes) {
28949                         binding.event.keyCode = d3keybinding.keyCodes[code[j]];
28950                     }
28951                 }
28952             }
28953
28954             bindings.push(binding);
28955         }
28956
28957         return keybinding;
28958     };
28959
28960     return keybinding;
28961 }
28962
28963
28964 d3keybinding.modifierCodes = {
28965     // Shift key, ⇧
28966     '⇧': 16, shift: 16,
28967     // CTRL key, on Mac: ⌃
28968     '⌃': 17, ctrl: 17,
28969     // ALT key, on Mac: ⌥ (Alt)
28970     '⌥': 18, alt: 18, option: 18,
28971     // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
28972     '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
28973 };
28974
28975 d3keybinding.modifierProperties = {
28976     16: 'shiftKey',
28977     17: 'ctrlKey',
28978     18: 'altKey',
28979     91: 'metaKey'
28980 };
28981
28982 d3keybinding.keys = {
28983     // Backspace key, on Mac: ⌫ (Backspace)
28984     '⌫': 'Backspace', backspace: 'Backspace',
28985     // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
28986     '⇥': 'Tab', '⇆': 'Tab', tab: 'Tab',
28987     // Return key, ↩
28988     '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter',
28989     // Pause/Break key
28990     'pause': 'Pause', 'pause-break': 'Pause',
28991     // Caps Lock key, ⇪
28992     '⇪': 'CapsLock', caps: 'CapsLock', 'caps-lock': 'CapsLock',
28993     // Escape key, on Mac: ⎋, on Windows: Esc
28994     '⎋': ['Escape', 'Esc'], escape: ['Escape', 'Esc'], esc: ['Escape', 'Esc'],
28995     // Space key
28996     space: [' ', 'Spacebar'],
28997     // Page-Up key, or pgup, on Mac: ↖
28998     '↖': 'PageUp', pgup: 'PageUp', 'page-up': 'PageUp',
28999     // Page-Down key, or pgdown, on Mac: ↘
29000     '↘': 'PageDown', pgdown: 'PageDown', 'page-down': 'PageDown',
29001     // END key, on Mac: ⇟
29002     '⇟': 'End', end: 'End',
29003     // HOME key, on Mac: ⇞
29004     '⇞': 'Home', home: 'Home',
29005     // Insert key, or ins
29006     ins: 'Insert', insert: 'Insert',
29007     // Delete key, on Mac: ⌦ (Delete)
29008     '⌦': ['Delete', 'Del'], del: ['Delete', 'Del'], 'delete': ['Delete', 'Del'],
29009     // Left Arrow Key, or ←
29010     '←': ['ArrowLeft', 'Left'], left: ['ArrowLeft', 'Left'], 'arrow-left': ['ArrowLeft', 'Left'],
29011     // Up Arrow Key, or ↑
29012     '↑': ['ArrowUp', 'Up'], up: ['ArrowUp', 'Up'], 'arrow-up': ['ArrowUp', 'Up'],
29013     // Right Arrow Key, or →
29014     '→': ['ArrowRight', 'Right'], right: ['ArrowRight', 'Right'], 'arrow-right': ['ArrowRight', 'Right'],
29015     // Up Arrow Key, or ↓
29016     '↓': ['ArrowDown', 'Down'], down: ['ArrowDown', 'Down'], 'arrow-down': ['ArrowDown', 'Down'],
29017     // odities, stuff for backward compatibility (browsers and code):
29018     // Num-Multiply, or *
29019     '*': ['*', 'Multiply'], star: ['*', 'Multiply'], asterisk: ['*', 'Multiply'], multiply: ['*', 'Multiply'],
29020     // Num-Plus or +
29021     '+': ['+', 'Add'], 'plus': ['+', 'Add'],
29022     // Num-Subtract, or -
29023     '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'],
29024     // Semicolon
29025     semicolon: ';',
29026     // = or equals
29027     equals: '=',
29028     // Comma, or ,
29029     comma: ',',
29030     // Period, or ., or full-stop
29031     period: '.', 'full-stop': '.',
29032     // Slash, or /, or forward-slash
29033     slash: '/', 'forward-slash': '/',
29034     // Tick, or `, or back-quote
29035     tick: '`', 'back-quote': '`',
29036     // Open bracket, or [
29037     'open-bracket': '[',
29038     // Back slash, or \
29039     'back-slash': '\\',
29040     // Close backet, or ]
29041     'close-bracket': ']',
29042     // Apostrophe, or Quote, or '
29043     quote: '\'', apostrophe: '\'',
29044     // NUMPAD 0-9
29045     'num-0': '0',
29046     'num-1': '1',
29047     'num-2': '2',
29048     'num-3': '3',
29049     'num-4': '4',
29050     'num-5': '5',
29051     'num-6': '6',
29052     'num-7': '7',
29053     'num-8': '8',
29054     'num-9': '9',
29055     // F1-F25
29056     f1: 'F1',
29057     f2: 'F2',
29058     f3: 'F3',
29059     f4: 'F4',
29060     f5: 'F5',
29061     f6: 'F6',
29062     f7: 'F7',
29063     f8: 'F8',
29064     f9: 'F9',
29065     f10: 'F10',
29066     f11: 'F11',
29067     f12: 'F12',
29068     f13: 'F13',
29069     f14: 'F14',
29070     f15: 'F15',
29071     f16: 'F16',
29072     f17: 'F17',
29073     f18: 'F18',
29074     f19: 'F19',
29075     f20: 'F20',
29076     f21: 'F21',
29077     f22: 'F22',
29078     f23: 'F23',
29079     f24: 'F24',
29080     f25: 'F25'
29081 };
29082
29083 d3keybinding.keyCodes = {
29084     // Backspace key, on Mac: ⌫ (Backspace)
29085     '⌫': 8, backspace: 8,
29086     // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29087     '⇥': 9, '⇆': 9, tab: 9,
29088     // Return key, ↩
29089     '↩': 13, 'return': 13, enter: 13, '⌅': 13,
29090     // Pause/Break key
29091     'pause': 19, 'pause-break': 19,
29092     // Caps Lock key, ⇪
29093     '⇪': 20, caps: 20, 'caps-lock': 20,
29094     // Escape key, on Mac: ⎋, on Windows: Esc
29095     '⎋': 27, escape: 27, esc: 27,
29096     // Space key
29097     space: 32,
29098     // Page-Up key, or pgup, on Mac: ↖
29099     '↖': 33, pgup: 33, 'page-up': 33,
29100     // Page-Down key, or pgdown, on Mac: ↘
29101     '↘': 34, pgdown: 34, 'page-down': 34,
29102     // END key, on Mac: ⇟
29103     '⇟': 35, end: 35,
29104     // HOME key, on Mac: ⇞
29105     '⇞': 36, home: 36,
29106     // Insert key, or ins
29107     ins: 45, insert: 45,
29108     // Delete key, on Mac: ⌦ (Delete)
29109     '⌦': 46, del: 46, 'delete': 46,
29110     // Left Arrow Key, or ←
29111     '←': 37, left: 37, 'arrow-left': 37,
29112     // Up Arrow Key, or ↑
29113     '↑': 38, up: 38, 'arrow-up': 38,
29114     // Right Arrow Key, or →
29115     '→': 39, right: 39, 'arrow-right': 39,
29116     // Up Arrow Key, or ↓
29117     '↓': 40, down: 40, 'arrow-down': 40,
29118     // odities, printing characters that come out wrong:
29119     // Firefox Equals
29120     'ffequals': 61,
29121     // Num-Multiply, or *
29122     '*': 106, star: 106, asterisk: 106, multiply: 106,
29123     // Num-Plus or +
29124     '+': 107, 'plus': 107,
29125     // Num-Subtract, or -
29126     '-': 109, subtract: 109,
29127     // Firefox Plus
29128     'ffplus': 171,
29129     // Firefox Minus
29130     'ffminus': 173,
29131     // Semicolon
29132     ';': 186, semicolon: 186,
29133     // = or equals
29134     '=': 187, 'equals': 187,
29135     // Comma, or ,
29136     ',': 188, comma: 188,
29137     // Dash / Underscore key
29138     'dash': 189,
29139     // Period, or ., or full-stop
29140     '.': 190, period: 190, 'full-stop': 190,
29141     // Slash, or /, or forward-slash
29142     '/': 191, slash: 191, 'forward-slash': 191,
29143     // Tick, or `, or back-quote
29144     '`': 192, tick: 192, 'back-quote': 192,
29145     // Open bracket, or [
29146     '[': 219, 'open-bracket': 219,
29147     // Back slash, or \
29148     '\\': 220, 'back-slash': 220,
29149     // Close backet, or ]
29150     ']': 221, 'close-bracket': 221,
29151     // Apostrophe, or Quote, or '
29152     '\'': 222, quote: 222, apostrophe: 222
29153 };
29154
29155 // NUMPAD 0-9
29156 var i$1 = 95, n = 0;
29157 while (++i$1 < 106) {
29158     d3keybinding.keyCodes['num-' + n] = i$1;
29159     ++n;
29160 }
29161
29162 // 0-9
29163 i$1 = 47; n = 0;
29164 while (++i$1 < 58) {
29165     d3keybinding.keyCodes[n] = i$1;
29166     ++n;
29167 }
29168
29169 // F1-F25
29170 i$1 = 111; n = 1;
29171 while (++i$1 < 136) {
29172     d3keybinding.keyCodes['f' + n] = i$1;
29173     ++n;
29174 }
29175
29176 // a-z
29177 i$1 = 64;
29178 while (++i$1 < 91) {
29179     d3keybinding.keyCodes[String.fromCharCode(i$1).toLowerCase()] = i$1;
29180 }
29181
29182 function tooltip() {
29183   var tooltip = function(selection$$1) {
29184       selection$$1.each(setup);
29185     },
29186     animation = utilFunctor(false),
29187     html = utilFunctor(false),
29188     title = function() {
29189       var title = this.getAttribute('data-original-title');
29190       if (title) {
29191         return title;
29192       } else {
29193         title = this.getAttribute('title');
29194         this.removeAttribute('title');
29195         this.setAttribute('data-original-title', title);
29196       }
29197       return title;
29198     },
29199     over = 'mouseenter.tooltip',
29200     out = 'mouseleave.tooltip',
29201     placement = utilFunctor('top');
29202
29203
29204   tooltip.title = function(_) {
29205     if (arguments.length) {
29206       title = utilFunctor(_);
29207       return tooltip;
29208     } else {
29209       return title;
29210     }
29211   };
29212
29213
29214   tooltip.html = function(_) {
29215     if (arguments.length) {
29216       html = utilFunctor(_);
29217       return tooltip;
29218     } else {
29219       return html;
29220     }
29221   };
29222
29223
29224   tooltip.placement = function(_) {
29225     if (arguments.length) {
29226       placement = utilFunctor(_);
29227       return tooltip;
29228     } else {
29229       return placement;
29230     }
29231   };
29232
29233
29234   tooltip.show = function(selection$$1) {
29235     selection$$1.each(show);
29236   };
29237
29238
29239   tooltip.hide = function(selection$$1) {
29240     selection$$1.each(hide);
29241   };
29242
29243
29244   tooltip.toggle = function(selection$$1) {
29245     selection$$1.each(toggle);
29246   };
29247
29248
29249   tooltip.destroy = function(selection$$1) {
29250     selection$$1
29251       .on(over, null)
29252       .on(out, null)
29253       .attr('title', function() {
29254         return this.getAttribute('data-original-title') || this.getAttribute('title');
29255       })
29256       .attr('data-original-title', null)
29257       .selectAll('.tooltip')
29258       .remove();
29259   };
29260
29261
29262   function setup() {
29263     var root = d3_select(this),
29264         animate = animation.apply(this, arguments),
29265         tip = root.selectAll('.tooltip').data([0]);
29266
29267     var enter = tip.enter()
29268       .append('div')
29269       .attr('class', 'tooltip');
29270
29271     enter
29272       .append('div')
29273       .attr('class', 'tooltip-arrow');
29274
29275     enter
29276       .append('div')
29277       .attr('class', 'tooltip-inner');
29278
29279     tip = enter
29280       .merge(tip);
29281
29282     if (animate) {
29283       tip.classed('fade', true);
29284     }
29285
29286     var place = placement.apply(this, arguments);
29287     tip.classed(place, true);
29288
29289     root.on(over, show);
29290     root.on(out, hide);
29291   }
29292
29293
29294   function show() {
29295     var root = d3_select(this),
29296       content = title.apply(this, arguments),
29297       tip = root.selectAll('.tooltip')
29298         .classed('in', true),
29299       markup = html.apply(this, arguments);
29300
29301     tip.selectAll('.tooltip-inner')[markup ? 'html' : 'text'](content);
29302     var place = placement.apply(this, arguments),
29303       outer = getPosition(root.node()),
29304       inner = getPosition(tip.node()),
29305       pos;
29306
29307     switch (place) {
29308       case 'top':
29309         pos = {x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h};
29310         break;
29311       case 'right':
29312         pos = {x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2};
29313         break;
29314       case 'left':
29315         pos = {x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2};
29316         break;
29317       case 'bottom':
29318         pos = {x: Math.max(0, outer.x + (outer.w - inner.w) / 2), y: outer.y + outer.h};
29319         break;
29320     }
29321
29322     if (pos) {
29323       tip.style('left', ~~pos.x + 'px').style('top', ~~pos.y + 'px');
29324     } else {
29325       tip.style('left', null).style('top', null);
29326     }
29327
29328     this.tooltipVisible = true;
29329   }
29330
29331
29332   function hide() {
29333     d3_select(this).selectAll('.tooltip')
29334       .classed('in', false);
29335
29336     this.tooltipVisible = false;
29337   }
29338
29339
29340   function toggle() {
29341     if (this.tooltipVisible) {
29342       hide.apply(this, arguments);
29343     } else {
29344       show.apply(this, arguments);
29345     }
29346   }
29347
29348   return tooltip;
29349 }
29350
29351
29352 function getPosition(node) {
29353   var mode = d3_select(node).style('position');
29354   if (mode === 'absolute' || mode === 'static') {
29355     return {
29356       x: node.offsetLeft,
29357       y: node.offsetTop,
29358       w: node.offsetWidth,
29359       h: node.offsetHeight
29360     };
29361   } else {
29362     return {
29363       x: 0,
29364       y: 0,
29365       w: node.offsetWidth,
29366       h: node.offsetHeight
29367     };
29368   }
29369 }
29370
29371 function behaviorEdit(context) {
29372
29373     function edit() {
29374         context.map()
29375             .minzoom(context.minEditableZoom());
29376     }
29377
29378
29379     edit.off = function() {
29380         context.map()
29381             .minzoom(0);
29382     };
29383
29384
29385     return edit;
29386 }
29387
29388 /*
29389    The hover behavior adds the `.hover` class on mouseover to all elements to which
29390    the identical datum is bound, and removes it on mouseout.
29391
29392    The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
29393    representation may consist of several elements scattered throughout the DOM hierarchy.
29394    Only one of these elements can have the :hover pseudo-class, but all of them will
29395    have the .hover class.
29396  */
29397 function behaviorHover(context) {
29398     var dispatch$$1 = dispatch('hover');
29399     var _selection = d3_select(null);
29400     var _newId = null;
29401     var _buttonDown;
29402     var _altDisables;
29403     var _target;
29404
29405
29406     function keydown() {
29407         if (_altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
29408             _selection.selectAll('.hover')
29409                 .classed('hover-suppressed', true)
29410                 .classed('hover', false);
29411
29412             _selection
29413                 .classed('hover-disabled', true);
29414
29415             dispatch$$1.call('hover', this, null);
29416         }
29417     }
29418
29419
29420     function keyup() {
29421         if (_altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
29422             _selection.selectAll('.hover-suppressed')
29423                 .classed('hover-suppressed', false)
29424                 .classed('hover', true);
29425
29426             _selection
29427                 .classed('hover-disabled', false);
29428
29429             dispatch$$1.call('hover', this, _target ? _target.id : null);
29430         }
29431     }
29432
29433
29434     var hover = function(selection$$1) {
29435         _selection = selection$$1;
29436         _newId = null;
29437
29438         _selection
29439             .on('mouseover.hover', mouseover)
29440             .on('mouseout.hover', mouseout)
29441             .on('mousedown.hover', mousedown);
29442
29443         d3_select(window)
29444             .on('keydown.hover', keydown)
29445             .on('keyup.hover', keyup);
29446
29447
29448         function mouseover() {
29449             if (_buttonDown) return;
29450             var target = event.target;
29451             enter(target ? target.__data__ : null);
29452         }
29453
29454
29455         function mouseout() {
29456             if (_buttonDown) return;
29457             var target = event.relatedTarget;
29458             enter(target ? target.__data__ : null);
29459         }
29460
29461
29462         function mousedown() {
29463             _buttonDown = true;
29464             d3_select(window)
29465                 .on('mouseup.hover', mouseup, true);
29466         }
29467
29468
29469         function mouseup() {
29470             _buttonDown = false;
29471             d3_select(window)
29472                 .on('mouseup.hover', null, true);
29473         }
29474
29475
29476         function enter(datum) {
29477             if (datum === _target) return;
29478             _target = datum;
29479
29480             _selection.selectAll('.hover')
29481                 .classed('hover', false);
29482             _selection.selectAll('.hover-suppressed')
29483                 .classed('hover-suppressed', false);
29484
29485             var entity;
29486             if (datum instanceof osmEntity$$1) {
29487                 entity = datum;
29488             } else {
29489                 entity = datum && datum.properties && datum.properties.entity;
29490             }
29491
29492             if (entity && entity.id !== _newId) {
29493                 // If drawing a way, don't hover on a node that was just placed. #3974
29494                 var mode = context.mode() && context.mode().id;
29495                 if ((mode === 'draw-line' || mode === 'draw-area') && !_newId && entity.type === 'node') {
29496                     _newId = entity.id;
29497                     return;
29498                 }
29499
29500                 var selector$$1 = '.' + entity.id;
29501
29502                 if (entity.type === 'relation') {
29503                     entity.members.forEach(function(member) {
29504                         selector$$1 += ', .' + member.id;
29505                     });
29506                 }
29507
29508                 var suppressed = _altDisables && event && event.altKey;
29509
29510                 _selection.selectAll(selector$$1)
29511                     .classed(suppressed ? 'hover-suppressed' : 'hover', true);
29512
29513                 dispatch$$1.call('hover', this, !suppressed && entity.id);
29514
29515             } else {
29516                 dispatch$$1.call('hover', this, null);
29517             }
29518         }
29519
29520     };
29521
29522
29523     hover.off = function(selection$$1) {
29524         selection$$1.selectAll('.hover')
29525             .classed('hover', false);
29526         selection$$1.selectAll('.hover-suppressed')
29527             .classed('hover-suppressed', false);
29528         selection$$1
29529             .classed('hover-disabled', false);
29530
29531         selection$$1
29532             .on('mouseover.hover', null)
29533             .on('mouseout.hover', null)
29534             .on('mousedown.hover', null);
29535
29536         d3_select(window)
29537             .on('keydown.hover', null)
29538             .on('keyup.hover', null);
29539     };
29540
29541
29542     hover.altDisables = function(_) {
29543         if (!arguments.length) return _altDisables;
29544         _altDisables = _;
29545         return hover;
29546     };
29547
29548
29549     return utilRebind(hover, dispatch$$1, 'on');
29550 }
29551
29552 function refresh(selection, node) {
29553     var cr = node.getBoundingClientRect();
29554     var prop = [cr.width, cr.height];
29555     selection.property('__dimensions__', prop);
29556     return prop;
29557 }
29558
29559 function utilGetDimensions(selection, force) {
29560     if (!selection || selection.empty()) {
29561         return [0, 0];
29562     }
29563     var node = selection.node(),
29564         cached = selection.property('__dimensions__');
29565     return (!cached || force) ? refresh(selection, node) : cached;
29566 }
29567
29568
29569 function utilSetDimensions(selection, dimensions) {
29570     if (!selection || selection.empty()) {
29571         return selection;
29572     }
29573     var node = selection.node();
29574     if (dimensions === null) {
29575         refresh(selection, node);
29576         return selection;
29577     }
29578     return selection
29579         .property('__dimensions__', [dimensions[0], dimensions[1]])
29580         .attr('width', dimensions[0])
29581         .attr('height', dimensions[1]);
29582 }
29583
29584 function behaviorTail() {
29585     var text,
29586         container,
29587         xmargin = 25,
29588         tooltipSize = [0, 0],
29589         selectionSize = [0, 0];
29590
29591
29592     function tail(selection$$1) {
29593         if (!text) return;
29594
29595         d3_select(window)
29596             .on('resize.tail', function() { selectionSize = utilGetDimensions(selection$$1); });
29597
29598         container = d3_select(document.body)
29599             .append('div')
29600             .style('display', 'none')
29601             .attr('class', 'tail tooltip-inner');
29602
29603         container.append('div')
29604             .text(text);
29605
29606         selection$$1
29607             .on('mousemove.tail', mousemove)
29608             .on('mouseenter.tail', mouseenter)
29609             .on('mouseleave.tail', mouseleave);
29610
29611         container
29612             .on('mousemove.tail', mousemove);
29613
29614         tooltipSize = utilGetDimensions(container);
29615         selectionSize = utilGetDimensions(selection$$1);
29616
29617
29618         function show() {
29619             container.style('display', 'block');
29620             tooltipSize = utilGetDimensions(container);
29621         }
29622
29623
29624         function mousemove() {
29625             if (container.style('display') === 'none') show();
29626             var xoffset = ((event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
29627                 -tooltipSize[0] - xmargin : xmargin;
29628             container.classed('left', xoffset > 0);
29629             utilSetTransform(container, event.clientX + xoffset, event.clientY);
29630         }
29631
29632
29633         function mouseleave() {
29634             if (event.relatedTarget !== container.node()) {
29635                 container.style('display', 'none');
29636             }
29637         }
29638
29639
29640         function mouseenter() {
29641             if (event.relatedTarget !== container.node()) {
29642                 show();
29643             }
29644         }
29645     }
29646
29647
29648     tail.off = function(selection$$1) {
29649         if (!text) return;
29650
29651         container
29652             .on('mousemove.tail', null)
29653             .remove();
29654
29655         selection$$1
29656             .on('mousemove.tail', null)
29657             .on('mouseenter.tail', null)
29658             .on('mouseleave.tail', null);
29659
29660         d3_select(window)
29661             .on('resize.tail', null);
29662     };
29663
29664
29665     tail.text = function(_) {
29666         if (!arguments.length) return text;
29667         text = _;
29668         return tail;
29669     };
29670
29671
29672     return tail;
29673 }
29674
29675 var _usedTails = {};
29676 var _disableSpace = false;
29677 var _lastSpace = null;
29678
29679
29680 function behaviorDraw(context) {
29681     var dispatch$$1 = dispatch(
29682         'move', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish'
29683     );
29684
29685     var keybinding = d3keybinding('draw');
29686
29687     var hover = behaviorHover(context).altDisables(true)
29688         .on('hover', context.ui().sidebar.hover);
29689     var tail = behaviorTail();
29690     var edit = behaviorEdit(context);
29691
29692     var closeTolerance = 4;
29693     var tolerance = 12;
29694     var _mouseLeave = false;
29695     var _lastMouse = null;
29696
29697
29698     // related code
29699     // - `mode/drag_node.js` `datum()`
29700     function datum() {
29701         if (event.altKey) return {};
29702
29703         var element;
29704         if (event.type === 'keydown') {
29705             element = _lastMouse && _lastMouse.target;
29706         } else {
29707             element = event.target;
29708         }
29709
29710         // When drawing, snap only to touch targets..
29711         // (this excludes area fills and active drawing elements)
29712         var d = element.__data__;
29713         return (d && d.properties && d.properties.target) ? d : {};
29714     }
29715
29716
29717     function mousedown() {
29718
29719         function point$$1() {
29720             var p = context.container().node();
29721             return touchId !== null ? d3_touches(p).filter(function(p) {
29722                 return p.identifier === touchId;
29723             })[0] : d3_mouse(p);
29724         }
29725
29726         var element = d3_select(this);
29727         var touchId = event.touches ? event.changedTouches[0].identifier : null;
29728         var t1 = +new Date();
29729         var p1 = point$$1();
29730
29731         element.on('mousemove.draw', null);
29732
29733         d3_select(window).on('mouseup.draw', function() {
29734             var t2 = +new Date();
29735             var p2 = point$$1();
29736             var dist = geoVecLength(p1, p2);
29737
29738             element.on('mousemove.draw', mousemove);
29739             d3_select(window).on('mouseup.draw', null);
29740
29741             if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
29742                 // Prevent a quick second click
29743                 d3_select(window).on('click.draw-block', function() {
29744                     event.stopPropagation();
29745                 }, true);
29746
29747                 context.map().dblclickEnable(false);
29748
29749                 window.setTimeout(function() {
29750                     context.map().dblclickEnable(true);
29751                     d3_select(window).on('click.draw-block', null);
29752                 }, 500);
29753
29754                 click();
29755             }
29756         }, true);
29757     }
29758
29759
29760     function mousemove() {
29761         _lastMouse = event;
29762         dispatch$$1.call('move', this, datum());
29763     }
29764
29765
29766     function mouseenter() {
29767         _mouseLeave = false;
29768     }
29769
29770
29771     function mouseleave() {
29772         _mouseLeave = true;
29773     }
29774
29775
29776     // related code
29777     // - `mode/drag_node.js`     `doMode()`
29778     // - `behavior/draw.js`      `click()`
29779     // - `behavior/draw_way.js`  `move()`
29780     function click() {
29781         var d = datum();
29782         var target = d && d.properties && d.properties.entity;
29783
29784         if (target && target.type === 'node') {   // Snap to a node
29785             dispatch$$1.call('clickNode', this, target, d);
29786             return;
29787
29788         } else if (target && target.type === 'way') {   // Snap to a way
29789             var choice = geoChooseEdge(
29790                 context.childNodes(target), context.mouse(), context.projection, context.activeID()
29791             );
29792             if (choice) {
29793                 var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
29794                 dispatch$$1.call('clickWay', this, choice.loc, edge, d);
29795                 return;
29796             }
29797         }
29798
29799         dispatch$$1.call('click', this, context.map().mouseCoordinates(), d);
29800     }
29801
29802
29803     function space() {
29804         event.preventDefault();
29805         event.stopPropagation();
29806
29807         var currSpace = context.mouse();
29808         if (_disableSpace && _lastSpace) {
29809             var dist = geoVecLength(_lastSpace, currSpace);
29810             if (dist > tolerance) {
29811                 _disableSpace = false;
29812             }
29813         }
29814
29815         if (_disableSpace || _mouseLeave || !_lastMouse) return;
29816
29817         // user must move mouse or release space bar to allow another click
29818         _lastSpace = currSpace;
29819         _disableSpace = true;
29820
29821         d3_select(window).on('keyup.space-block', function() {
29822             event.preventDefault();
29823             event.stopPropagation();
29824             _disableSpace = false;
29825             d3_select(window).on('keyup.space-block', null);
29826         });
29827
29828         click();
29829     }
29830
29831
29832     function backspace() {
29833         event.preventDefault();
29834         dispatch$$1.call('undo');
29835     }
29836
29837
29838     function del() {
29839         event.preventDefault();
29840         dispatch$$1.call('cancel');
29841     }
29842
29843
29844     function ret() {
29845         event.preventDefault();
29846         dispatch$$1.call('finish');
29847     }
29848
29849
29850     function draw(selection$$1) {
29851         context.install(hover);
29852         context.install(edit);
29853
29854         if (!context.inIntro() && !_usedTails[tail.text()]) {
29855             context.install(tail);
29856         }
29857
29858         keybinding
29859             .on('⌫', backspace)
29860             .on('⌦', del)
29861             .on('⎋', ret)
29862             .on('↩', ret)
29863             .on('space', space)
29864             .on('⌥space', space);
29865
29866         selection$$1
29867             .on('mouseenter.draw', mouseenter)
29868             .on('mouseleave.draw', mouseleave)
29869             .on('mousedown.draw', mousedown)
29870             .on('mousemove.draw', mousemove);
29871
29872         d3_select(document)
29873             .call(keybinding);
29874
29875         return draw;
29876     }
29877
29878
29879     draw.off = function(selection$$1) {
29880         context.ui().sidebar.hover.cancel();
29881         context.uninstall(hover);
29882         context.uninstall(edit);
29883
29884         if (!context.inIntro() && !_usedTails[tail.text()]) {
29885             context.uninstall(tail);
29886             _usedTails[tail.text()] = true;
29887         }
29888
29889         selection$$1
29890             .on('mouseenter.draw', null)
29891             .on('mouseleave.draw', null)
29892             .on('mousedown.draw', null)
29893             .on('mousemove.draw', null);
29894
29895         d3_select(window)
29896             .on('mouseup.draw', null);
29897             // note: keyup.space-block, click.draw-block should remain
29898
29899         d3_select(document)
29900             .call(keybinding.off);
29901     };
29902
29903
29904     draw.tail = function(_) {
29905         tail.text(_);
29906         return draw;
29907     };
29908
29909
29910     return utilRebind(draw, dispatch$$1, 'on');
29911 }
29912
29913 function modeAddArea$$1(context) {
29914     var mode = {
29915         id: 'add-area',
29916         button: 'area',
29917         title: t('modes.add_area.title'),
29918         description: t('modes.add_area.description'),
29919         key: '3'
29920     };
29921
29922     var behavior = behaviorAddWay(context)
29923             .tail(t('modes.add_area.tail'))
29924             .on('start', start)
29925             .on('startFromWay', startFromWay)
29926             .on('startFromNode', startFromNode),
29927         defaultTags = { area: 'yes' };
29928
29929
29930     function actionClose(wayId) {
29931         return function (graph) {
29932             return graph.replace(graph.entity(wayId).close());
29933         };
29934     }
29935
29936
29937     function start(loc) {
29938         var startGraph = context.graph(),
29939             node = osmNode({ loc: loc }),
29940             way = osmWay({ tags: defaultTags });
29941
29942         context.perform(
29943             actionAddEntity(node),
29944             actionAddEntity(way),
29945             actionAddVertex(way.id, node.id),
29946             actionClose(way.id)
29947         );
29948
29949         context.enter(modeDrawArea(context, way.id, startGraph));
29950     }
29951
29952
29953     function startFromWay(loc, edge) {
29954         var startGraph = context.graph(),
29955             node = osmNode({ loc: loc }),
29956             way = osmWay({ tags: defaultTags });
29957
29958         context.perform(
29959             actionAddEntity(node),
29960             actionAddEntity(way),
29961             actionAddVertex(way.id, node.id),
29962             actionClose(way.id),
29963             actionAddMidpoint({ loc: loc, edge: edge }, node)
29964         );
29965
29966         context.enter(modeDrawArea(context, way.id, startGraph));
29967     }
29968
29969
29970     function startFromNode(node) {
29971         var startGraph = context.graph(),
29972             way = osmWay({ tags: defaultTags });
29973
29974         context.perform(
29975             actionAddEntity(way),
29976             actionAddVertex(way.id, node.id),
29977             actionClose(way.id)
29978         );
29979
29980         context.enter(modeDrawArea(context, way.id, startGraph));
29981     }
29982
29983
29984     mode.enter = function() {
29985         context.install(behavior);
29986     };
29987
29988
29989     mode.exit = function() {
29990         context.uninstall(behavior);
29991     };
29992
29993
29994     return mode;
29995 }
29996
29997 function modeAddLine$$1(context) {
29998     var mode = {
29999         id: 'add-line',
30000         button: 'line',
30001         title: t('modes.add_line.title'),
30002         description: t('modes.add_line.description'),
30003         key: '2'
30004     };
30005
30006     var behavior = behaviorAddWay(context)
30007         .tail(t('modes.add_line.tail'))
30008         .on('start', start)
30009         .on('startFromWay', startFromWay)
30010         .on('startFromNode', startFromNode);
30011
30012
30013     function start(loc) {
30014         var startGraph = context.graph(),
30015             node = osmNode({ loc: loc }),
30016             way = osmWay();
30017
30018         context.perform(
30019             actionAddEntity(node),
30020             actionAddEntity(way),
30021             actionAddVertex(way.id, node.id)
30022         );
30023
30024         context.enter(modeDrawLine(context, way.id, startGraph));
30025     }
30026
30027
30028     function startFromWay(loc, edge) {
30029         var startGraph = context.graph(),
30030             node = osmNode({ loc: loc }),
30031             way = osmWay();
30032
30033         context.perform(
30034             actionAddEntity(node),
30035             actionAddEntity(way),
30036             actionAddVertex(way.id, node.id),
30037             actionAddMidpoint({ loc: loc, edge: edge }, node)
30038         );
30039
30040         context.enter(modeDrawLine(context, way.id, startGraph));
30041     }
30042
30043
30044     function startFromNode(node) {
30045         var startGraph = context.graph(),
30046             way = osmWay();
30047
30048         context.perform(
30049             actionAddEntity(way),
30050             actionAddVertex(way.id, node.id)
30051         );
30052
30053         context.enter(modeDrawLine(context, way.id, startGraph));
30054     }
30055
30056
30057     mode.enter = function() {
30058         context.install(behavior);
30059     };
30060
30061
30062     mode.exit = function() {
30063         context.uninstall(behavior);
30064     };
30065
30066     return mode;
30067 }
30068
30069 function modeAddPoint$$1(context) {
30070     var mode = {
30071         id: 'add-point',
30072         button: 'point',
30073         title: t('modes.add_point.title'),
30074         description: t('modes.add_point.description'),
30075         key: '1'
30076     };
30077
30078     var behavior = behaviorDraw(context)
30079         .tail(t('modes.add_point.tail'))
30080         .on('click', add)
30081         .on('clickWay', addWay)
30082         .on('clickNode', addNode)
30083         .on('cancel', cancel)
30084         .on('finish', cancel);
30085
30086
30087     function add(loc) {
30088         var node = osmNode({ loc: loc });
30089
30090         context.perform(
30091             actionAddEntity(node),
30092             t('operations.add.annotation.point')
30093         );
30094
30095         context.enter(
30096             modeSelect(context, [node.id]).newFeature(true)
30097         );
30098     }
30099
30100
30101     function addWay(loc) {
30102         add(loc);
30103     }
30104
30105
30106     function addNode(node) {
30107         add(node.loc);
30108     }
30109
30110
30111     function cancel() {
30112         context.enter(modeBrowse(context));
30113     }
30114
30115
30116     mode.enter = function() {
30117         context.install(behavior);
30118     };
30119
30120
30121     mode.exit = function() {
30122         context.uninstall(behavior);
30123     };
30124
30125
30126     return mode;
30127 }
30128
30129 function modeDragNode$$1(context) {
30130     var mode = {
30131         id: 'drag-node',
30132         button: 'browse'
30133     };
30134     var hover = behaviorHover(context).altDisables(true)
30135         .on('hover', context.ui().sidebar.hover);
30136     var edit = behaviorEdit(context);
30137
30138     var _nudgeInterval;
30139     var _restoreSelectedIDs = [];
30140     var _wasMidpoint = false;
30141     var _isCancelled = false;
30142     var _activeEntity;
30143     var _startLoc;
30144     var _lastLoc;
30145
30146
30147     function startNudge(entity, nudge) {
30148         if (_nudgeInterval) window.clearInterval(_nudgeInterval);
30149         _nudgeInterval = window.setInterval(function() {
30150             context.pan(nudge);
30151             doMove(entity, nudge);
30152         }, 50);
30153     }
30154
30155
30156     function stopNudge() {
30157         if (_nudgeInterval) {
30158             window.clearInterval(_nudgeInterval);
30159             _nudgeInterval = null;
30160         }
30161     }
30162
30163
30164     function moveAnnotation(entity) {
30165         return t('operations.move.annotation.' + entity.geometry(context.graph()));
30166     }
30167
30168
30169     function connectAnnotation(entity) {
30170         return t('operations.connect.annotation.' + entity.geometry(context.graph()));
30171     }
30172
30173
30174     function origin(entity) {
30175         return context.projection(entity.loc);
30176     }
30177
30178
30179     function keydown() {
30180         if (event.keyCode === d3keybinding.modifierCodes.alt) {
30181             if (context.surface().classed('nope')) {
30182                 context.surface()
30183                     .classed('nope-suppressed', true);
30184             }
30185             context.surface()
30186                 .classed('nope', false)
30187                 .classed('nope-disabled', true);
30188         }
30189     }
30190
30191
30192     function keyup() {
30193         if (event.keyCode === d3keybinding.modifierCodes.alt) {
30194             if (context.surface().classed('nope-suppressed')) {
30195                 context.surface()
30196                     .classed('nope', true);
30197             }
30198             context.surface()
30199                 .classed('nope-suppressed', false)
30200                 .classed('nope-disabled', false);
30201         }
30202     }
30203
30204
30205     function start(entity) {
30206         _wasMidpoint = entity.type === 'midpoint';
30207         var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
30208         _isCancelled = event.sourceEvent.shiftKey || hasHidden;
30209
30210
30211         if (_isCancelled) {
30212             if (hasHidden) {
30213                 uiFlash().text(t('modes.drag_node.connected_to_hidden'))();
30214             }
30215             return drag.cancel();
30216         }
30217
30218         if (_wasMidpoint) {
30219             var midpoint = entity;
30220             entity = osmNode();
30221             context.perform(actionAddMidpoint(midpoint, entity));
30222             entity = context.entity(entity.id);   // get post-action entity
30223
30224             var vertex = context.surface().selectAll('.' + entity.id);
30225             drag.target(vertex.node(), entity);
30226
30227         } else {
30228             context.perform(actionNoop());
30229         }
30230
30231         _activeEntity = entity;
30232         _startLoc = entity.loc;
30233
30234         context.surface().selectAll('.' + _activeEntity.id)
30235             .classed('active', true);
30236
30237         context.enter(mode);
30238     }
30239
30240
30241     // related code
30242     // - `behavior/draw.js` `datum()`
30243     function datum() {
30244         var event$$1 = event && event.sourceEvent;
30245         if (!event$$1 || event$$1.altKey) {
30246             return {};
30247         } else {
30248             // When dragging, snap only to touch targets..
30249             // (this excludes area fills and active drawing elements)
30250             var d = event$$1.target.__data__;
30251             return (d && d.properties && d.properties.target) ? d : {};
30252         }
30253     }
30254
30255
30256     function doMove(entity, nudge) {
30257         nudge = nudge || [0, 0];
30258
30259         var currPoint = (event && event.point) || context.projection(_lastLoc);
30260         var currMouse = geoVecSubtract(currPoint, nudge);
30261         var loc = context.projection.invert(currMouse);
30262
30263         if (!_nudgeInterval) {   // If not nudging at the edge of the viewport, try to snap..
30264             // related code
30265             // - `mode/drag_node.js`     `doMode()`
30266             // - `behavior/draw.js`      `click()`
30267             // - `behavior/draw_way.js`  `move()`
30268             var d = datum();
30269             var targetLoc = d && d.properties && d.properties.entity && d.properties.entity.loc;
30270             var targetNodes = d && d.properties && d.properties.nodes;
30271
30272             if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
30273                 loc = targetLoc;
30274
30275             } else if (targetNodes) {   // snap to way - a line target with `.nodes`
30276                 var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
30277                 if (choice) {
30278                     loc = choice.loc;
30279                 }
30280             }
30281         }
30282
30283         context.replace(
30284             actionMoveNode(entity.id, loc),
30285             moveAnnotation(entity)
30286         );
30287
30288
30289         // check if this movement causes the geometry to break
30290         var nopeDisabled = context.surface().classed('nope-disabled');
30291         var isInvalid = isInvalidGeometry(entity, context.graph());
30292         if (nopeDisabled) {
30293             context.surface()
30294                 .classed('nope', false)
30295                 .classed('nope-suppressed', isInvalid);
30296         } else {
30297             context.surface()
30298                 .classed('nope', isInvalid)
30299                 .classed('nope-suppressed', false);
30300         }
30301
30302         _lastLoc = loc;
30303     }
30304
30305
30306     function isInvalidGeometry(entity, graph) {
30307         var parents = graph.parentWays(entity);
30308         var i, j, k;
30309
30310         for (i = 0; i < parents.length; i++) {
30311             var parent = parents[i];
30312             var nodes = [];
30313             var activeIndex = null;    // which multipolygon ring contains node being dragged
30314
30315             // test any parent multipolygons for valid geometry
30316             var relations = graph.parentRelations(parent);
30317             for (j = 0; j < relations.length; j++) {
30318                 if (!relations[j].isMultipolygon()) continue;
30319
30320                 var rings = osmJoinWays(relations[j].members, graph);
30321
30322                 // find active ring and test it for self intersections
30323                 for (k = 0; k < rings.length; k++) {
30324                     nodes = rings[k].nodes;
30325                     if (find$1(nodes, function(n) { return n.id === entity.id; })) {
30326                         activeIndex = k;
30327                         if (geoHasSelfIntersections(nodes, entity.id)) {
30328                             return true;
30329                         }
30330                     }
30331                     rings[k].coords = nodes.map(function(n) { return n.loc; });
30332                 }
30333
30334                 // test active ring for intersections with other rings in the multipolygon
30335                 for (k = 0; k < rings.length; k++) {
30336                     if (k === activeIndex) continue;
30337
30338                     // make sure active ring doesnt cross passive rings
30339                     if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
30340                         return true;
30341                     }
30342                 }
30343             }
30344
30345
30346             // If we still haven't tested this node's parent way for self-intersections.
30347             // (because it's not a member of a multipolygon), test it now.
30348             if (activeIndex === null) {
30349                 nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
30350                 if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
30351                     return true;
30352                 }
30353             }
30354
30355         }
30356
30357         return false;
30358     }
30359
30360
30361     function move(entity) {
30362         if (_isCancelled) return;
30363         event.sourceEvent.stopPropagation();
30364
30365         context.surface().classed('nope-disabled', event.sourceEvent.altKey);
30366
30367         _lastLoc = context.projection.invert(event.point);
30368
30369         doMove(entity);
30370         var nudge = geoViewportEdge(event.point, context.map().dimensions());
30371         if (nudge) {
30372             startNudge(entity, nudge);
30373         } else {
30374             stopNudge();
30375         }
30376     }
30377
30378
30379     function end(entity) {
30380         if (_isCancelled) return;
30381
30382         var d = datum();
30383         var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope');
30384         var target = d && d.properties && d.properties.entity;   // entity to snap to
30385
30386         if (nope) {   // bounce back
30387             context.perform(
30388                 _actionBounceBack(entity.id, _startLoc)
30389             );
30390
30391         } else if (target && target.type === 'way') {
30392             var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id);
30393             context.replace(
30394                 actionAddMidpoint({
30395                     loc: choice.loc,
30396                     edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
30397                 }, entity),
30398                 connectAnnotation(target)
30399             );
30400
30401         } else if (target && target.type === 'node') {
30402             context.replace(
30403                 actionConnect([target.id, entity.id]),
30404                 connectAnnotation(target)
30405             );
30406
30407         } else if (_wasMidpoint) {
30408             context.replace(
30409                 actionNoop(),
30410                 t('operations.add.annotation.vertex')
30411             );
30412
30413         } else {
30414             context.replace(
30415                 actionNoop(),
30416                 moveAnnotation(entity)
30417             );
30418         }
30419
30420         var reselection = _restoreSelectedIDs.filter(function(id) {
30421             return context.graph().hasEntity(id);
30422         });
30423
30424         if (reselection.length) {
30425             context.enter(modeSelect(context, reselection));
30426         } else {
30427             context.enter(modeBrowse(context));
30428         }
30429     }
30430
30431
30432     function _actionBounceBack(nodeID, toLoc) {
30433         var moveNode = actionMoveNode(nodeID, toLoc);
30434         var action = function(graph, t$$1) {
30435             // last time through, pop off the bounceback perform.
30436             // it will then overwrite the initial perform with a moveNode that does nothing
30437             if (t$$1 === 1) context.pop();
30438             return moveNode(graph, t$$1);
30439         };
30440         action.transitionable = true;
30441         return action;
30442     }
30443
30444
30445     function cancel() {
30446         drag.cancel();
30447         context.enter(modeBrowse(context));
30448     }
30449
30450
30451     var drag = behaviorDrag()
30452         .selector('.layer-points-targets .target')
30453         .surface(d3_select('#map').node())
30454         .origin(origin)
30455         .on('start', start)
30456         .on('move', move)
30457         .on('end', end);
30458
30459
30460     mode.enter = function() {
30461         context.install(hover);
30462         context.install(edit);
30463
30464         d3_select(window)
30465             .on('keydown.drawWay', keydown)
30466             .on('keyup.drawWay', keyup);
30467
30468         context.history()
30469             .on('undone.drag-node', cancel);
30470     };
30471
30472
30473     mode.exit = function() {
30474         context.ui().sidebar.hover.cancel();
30475         context.uninstall(hover);
30476         context.uninstall(edit);
30477
30478         d3_select(window)
30479             .on('keydown.hover', null)
30480             .on('keyup.hover', null);
30481
30482         context.history()
30483             .on('undone.drag-node', null);
30484
30485         context.map()
30486             .on('drawn.drag-node', null);
30487
30488         _activeEntity = null;
30489
30490         context.surface()
30491             .classed('nope', false)
30492             .classed('nope-suppressed', false)
30493             .classed('nope-disabled', false)
30494             .selectAll('.active')
30495             .classed('active', false);
30496
30497         stopNudge();
30498     };
30499
30500
30501     mode.selectedIDs = function() {
30502         if (!arguments.length) return _activeEntity ? [_activeEntity.id] : [];
30503         // no assign
30504         return mode;
30505     };
30506
30507
30508     mode.activeID = function() {
30509         if (!arguments.length) return _activeEntity && _activeEntity.id;
30510         // no assign
30511         return mode;
30512     };
30513
30514
30515     mode.restoreSelectedIDs = function(_) {
30516         if (!arguments.length) return _restoreSelectedIDs;
30517         _restoreSelectedIDs = _;
30518         return mode;
30519     };
30520
30521
30522     mode.behavior = drag;
30523
30524
30525     return mode;
30526 }
30527
30528 function modeBrowse(context) {
30529     var mode = {
30530         button: 'browse',
30531         id: 'browse',
30532         title: t('modes.browse.title'),
30533         description: t('modes.browse.description')
30534     }, sidebar;
30535
30536     var behaviors = [
30537         behaviorPaste(context),
30538         behaviorHover(context).on('hover', context.ui().sidebar.hover),
30539         behaviorSelect(context),
30540         behaviorLasso(context),
30541         modeDragNode$$1(context).behavior
30542     ];
30543
30544
30545     mode.enter = function() {
30546         behaviors.forEach(function(behavior) {
30547             context.install(behavior);
30548         });
30549
30550         // Get focus on the body.
30551         if (document.activeElement && document.activeElement.blur) {
30552             document.activeElement.blur();
30553         }
30554
30555         if (sidebar) {
30556             context.ui().sidebar.show(sidebar);
30557         } else {
30558             context.ui().sidebar.select(null);
30559         }
30560     };
30561
30562
30563     mode.exit = function() {
30564         context.ui().sidebar.hover.cancel();
30565         behaviors.forEach(function(behavior) {
30566             context.uninstall(behavior);
30567         });
30568
30569         if (sidebar) {
30570             context.ui().sidebar.hide();
30571         }
30572     };
30573
30574
30575     mode.sidebar = function(_) {
30576         if (!arguments.length) return sidebar;
30577         sidebar = _;
30578         return mode;
30579     };
30580
30581
30582     return mode;
30583 }
30584
30585 function modeDrawArea(context, wayId, startGraph) {
30586     var mode = {
30587         button: 'area',
30588         id: 'draw-area'
30589     };
30590
30591     var behavior;
30592
30593
30594     mode.enter = function() {
30595         var way = context.entity(wayId);
30596
30597         behavior = behaviorDrawWay(context, wayId, undefined, mode, startGraph)
30598             .tail(t('modes.draw_area.tail'));
30599
30600         var addNode = behavior.addNode;
30601
30602         behavior.addNode = function(node, d) {
30603             var length = way.nodes.length;
30604             var penultimate = length > 2 ? way.nodes[length - 2] : null;
30605
30606             if (node.id === way.first() || node.id === penultimate) {
30607                 behavior.finish();
30608             } else {
30609                 addNode(node, d);
30610             }
30611         };
30612
30613         context.install(behavior);
30614     };
30615
30616
30617     mode.exit = function() {
30618         context.uninstall(behavior);
30619     };
30620
30621
30622     mode.selectedIDs = function() {
30623         return [wayId];
30624     };
30625
30626
30627     mode.activeID = function() {
30628         return (behavior && behavior.activeID()) || [];
30629     };
30630
30631
30632     return mode;
30633 }
30634
30635 function modeDrawLine(context, wayId, startGraph, affix) {
30636     var mode = {
30637         button: 'line',
30638         id: 'draw-line'
30639     };
30640
30641     var behavior;
30642
30643
30644     mode.enter = function() {
30645         var way = context.entity(wayId);
30646         var index = (affix === 'prefix') ? 0 : undefined;
30647         var headId = (affix === 'prefix') ? way.first() : way.last();
30648
30649         behavior = behaviorDrawWay(context, wayId, index, mode, startGraph)
30650             .tail(t('modes.draw_line.tail'));
30651
30652         var addNode = behavior.addNode;
30653         behavior.addNode = function(node, d) {
30654             if (node.id === headId) {
30655                 behavior.finish();
30656             } else {
30657                 addNode(node, d);
30658             }
30659         };
30660
30661         context.install(behavior);
30662     };
30663
30664
30665     mode.exit = function() {
30666         context.uninstall(behavior);
30667     };
30668
30669
30670     mode.selectedIDs = function() {
30671         return [wayId];
30672     };
30673
30674
30675     mode.activeID = function() {
30676         return (behavior && behavior.activeID()) || [];
30677     };
30678
30679     return mode;
30680 }
30681
30682 function operationCircularize(selectedIDs, context) {
30683     var entityId = selectedIDs[0],
30684         entity = context.entity(entityId),
30685         extent = entity.extent(context.graph()),
30686         geometry = context.geometry(entityId),
30687         action = actionCircularize(entityId, context.projection);
30688
30689
30690     var operation = function() {
30691         context.perform(action, operation.annotation());
30692     };
30693
30694
30695     operation.available = function() {
30696         return selectedIDs.length === 1 &&
30697             entity.type === 'way' &&
30698             uniq(entity.nodes).length > 1;
30699     };
30700
30701
30702     operation.disabled = function() {
30703         var reason;
30704         if (extent.percentContainedIn(context.extent()) < 0.8) {
30705             reason = 'too_large';
30706         } else if (context.hasHiddenConnections(entityId)) {
30707             reason = 'connected_to_hidden';
30708         }
30709         return action.disabled(context.graph()) || reason;
30710     };
30711
30712
30713     operation.tooltip = function() {
30714         var disable = operation.disabled();
30715         return disable ?
30716             t('operations.circularize.' + disable) :
30717             t('operations.circularize.description.' + geometry);
30718     };
30719
30720
30721     operation.annotation = function() {
30722         return t('operations.circularize.annotation.' + geometry);
30723     };
30724
30725
30726     operation.id = 'circularize';
30727     operation.keys = [t('operations.circularize.key')];
30728     operation.title = t('operations.circularize.title');
30729     operation.behavior = behaviorOperation(context).which(operation);
30730
30731     return operation;
30732 }
30733
30734 function operationContinue(selectedIDs, context) {
30735     var graph = context.graph(),
30736         entities = selectedIDs.map(function(id) { return graph.entity(id); }),
30737         geometries = assignIn({ line: [], vertex: [] },
30738             groupBy(entities, function(entity) { return entity.geometry(graph); })),
30739         vertex = geometries.vertex[0];
30740
30741
30742     function candidateWays() {
30743         return graph.parentWays(vertex).filter(function(parent) {
30744             return parent.geometry(graph) === 'line' &&
30745                 !parent.isClosed() &&
30746                 parent.affix(vertex.id) &&
30747                 (geometries.line.length === 0 || geometries.line[0] === parent);
30748         });
30749     }
30750
30751
30752     var operation = function() {
30753         var candidate = candidateWays()[0];
30754         context.enter(
30755             modeDrawLine(context, candidate.id, context.graph(), candidate.affix(vertex.id))
30756         );
30757     };
30758
30759
30760     operation.available = function() {
30761         return geometries.vertex.length === 1 && geometries.line.length <= 1 &&
30762             !context.features().hasHiddenConnections(vertex, context.graph());
30763     };
30764
30765
30766     operation.disabled = function() {
30767         var candidates = candidateWays();
30768         if (candidates.length === 0)
30769             return 'not_eligible';
30770         if (candidates.length > 1)
30771             return 'multiple';
30772     };
30773
30774
30775     operation.tooltip = function() {
30776         var disable = operation.disabled();
30777         return disable ?
30778             t('operations.continue.' + disable) :
30779             t('operations.continue.description');
30780     };
30781
30782
30783     operation.annotation = function() {
30784         return t('operations.continue.annotation.line');
30785     };
30786
30787
30788     operation.id = 'continue';
30789     operation.keys = [t('operations.continue.key')];
30790     operation.title = t('operations.continue.title');
30791     operation.behavior = behaviorOperation(context).which(operation);
30792
30793     return operation;
30794 }
30795
30796 function operationDelete(selectedIDs, context) {
30797     var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
30798         action = actionDeleteMultiple(selectedIDs),
30799         extent = selectedIDs.reduce(function(extent, id) {
30800                 return extent.extend(context.entity(id).extent(context.graph()));
30801             }, geoExtent$$1());
30802
30803
30804     var operation = function() {
30805         var nextSelectedID;
30806         var nextSelectedLoc;
30807
30808         if (selectedIDs.length === 1) {
30809             var id = selectedIDs[0],
30810                 entity = context.entity(id),
30811                 geometry = context.geometry(id),
30812                 parents = context.graph().parentWays(entity),
30813                 parent = parents[0];
30814
30815             // Select the next closest node in the way.
30816             if (geometry === 'vertex') {
30817                 var nodes = parent.nodes,
30818                     i = nodes.indexOf(id);
30819
30820                 if (i === 0) {
30821                     i++;
30822                 } else if (i === nodes.length - 1) {
30823                     i--;
30824                 } else {
30825                     var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc),
30826                         b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
30827                     i = a < b ? i - 1 : i + 1;
30828                 }
30829
30830                 nextSelectedID = nodes[i];
30831                 nextSelectedLoc = context.entity(nextSelectedID).loc;
30832             }
30833         }
30834
30835         context.perform(action, operation.annotation());
30836
30837         if (nextSelectedID && nextSelectedLoc) {
30838             if (context.hasEntity(nextSelectedID)) {
30839                 context.enter(modeSelect(context, [nextSelectedID]).follow(true));
30840             } else {
30841                 context.map().centerEase(nextSelectedLoc);
30842                 context.enter(modeBrowse(context));
30843             }
30844         } else {
30845             context.enter(modeBrowse(context));
30846         }
30847
30848     };
30849
30850
30851     operation.available = function() {
30852         return true;
30853     };
30854
30855
30856     operation.disabled = function() {
30857         var reason;
30858         if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
30859             reason = 'too_large';
30860         } else if (some(selectedIDs, context.hasHiddenConnections)) {
30861             reason = 'connected_to_hidden';
30862         } else if (some(selectedIDs, protectedMember)) {
30863             reason = 'part_of_relation';
30864         } else if (some(selectedIDs, incompleteRelation)) {
30865             reason = 'incomplete_relation';
30866         }
30867         return reason;
30868
30869         function incompleteRelation(id) {
30870             var entity = context.entity(id);
30871             return entity.type === 'relation' && !entity.isComplete(context.graph());
30872         }
30873
30874         function protectedMember(id) {
30875             var entity = context.entity(id);
30876             if (entity.type !== 'way') return false;
30877
30878             var parents = context.graph().parentRelations(entity);
30879             for (var i = 0; i < parents.length; i++) {
30880                 var parent = parents[i],
30881                     type = parent.tags.type,
30882                     role = parent.memberById(id).role || 'outer';
30883                 if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) {
30884                     return true;
30885                 }
30886             }
30887             return false;
30888         }
30889
30890     };
30891
30892
30893     operation.tooltip = function() {
30894         var disable = operation.disabled();
30895         return disable ?
30896             t('operations.delete.' + disable + '.' + multi) :
30897             t('operations.delete.description' + '.' + multi);
30898     };
30899
30900
30901     operation.annotation = function() {
30902         return selectedIDs.length === 1 ?
30903             t('operations.delete.annotation.' + context.geometry(selectedIDs[0])) :
30904             t('operations.delete.annotation.multiple', { n: selectedIDs.length });
30905     };
30906
30907
30908     operation.id = 'delete';
30909     operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
30910     operation.title = t('operations.delete.title');
30911     operation.behavior = behaviorOperation(context).which(operation);
30912
30913     return operation;
30914 }
30915
30916 function operationDisconnect(selectedIDs, context) {
30917     var vertices = filter(selectedIDs, function(entityId) {
30918         return context.geometry(entityId) === 'vertex';
30919     });
30920
30921     var entityId = vertices[0],
30922         action = actionDisconnect(entityId);
30923
30924     if (selectedIDs.length > 1) {
30925         action.limitWays(without(selectedIDs, entityId));
30926     }
30927
30928
30929     var operation = function() {
30930         context.perform(action, operation.annotation());
30931     };
30932
30933
30934     operation.available = function() {
30935         return vertices.length === 1;
30936     };
30937
30938
30939     operation.disabled = function() {
30940         var reason;
30941         if (some(selectedIDs, context.hasHiddenConnections)) {
30942             reason = 'connected_to_hidden';
30943         }
30944         return action.disabled(context.graph()) || reason;
30945     };
30946
30947
30948     operation.tooltip = function() {
30949         var disable = operation.disabled();
30950         return disable ?
30951             t('operations.disconnect.' + disable) :
30952             t('operations.disconnect.description');
30953     };
30954
30955
30956     operation.annotation = function() {
30957         return t('operations.disconnect.annotation');
30958     };
30959
30960
30961     operation.id = 'disconnect';
30962     operation.keys = [t('operations.disconnect.key')];
30963     operation.title = t('operations.disconnect.title');
30964     operation.behavior = behaviorOperation(context).which(operation);
30965
30966     return operation;
30967 }
30968
30969 function operationMerge(selectedIDs, context) {
30970
30971     function updatePresetTags(newGraph, ids) {
30972         var id = ids[0],
30973             newEntity = newGraph.hasEntity(id);
30974
30975         if (!newEntity) return;
30976
30977         var newPreset = context.presets().match(newEntity, newGraph);
30978
30979         context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
30980     }
30981
30982
30983     var join = actionJoin(selectedIDs),
30984         merge = actionMerge(selectedIDs),
30985         mergePolygon = actionMergePolygon(selectedIDs);
30986
30987
30988     var operation = function() {
30989         var origGraph = context.graph(),
30990             action;
30991
30992         if (!join.disabled(origGraph)) {
30993             action = join;
30994         } else if (!merge.disabled(origGraph)) {
30995             action = merge;
30996         } else {
30997             action = mergePolygon;
30998         }
30999
31000         context.perform(action, operation.annotation());
31001
31002         var ids = selectedIDs.filter(function(id) {
31003             var entity = context.hasEntity(id);
31004             return entity && entity.type !== 'node';
31005         });
31006
31007         // if we merged tags, rematch preset to update tags if necessary (#3851)
31008         if (action === merge) {
31009             updatePresetTags(context.graph(), ids);
31010         }
31011
31012         context.enter(modeSelect(context, ids));
31013     };
31014
31015
31016     operation.available = function() {
31017         return selectedIDs.length >= 2;
31018     };
31019
31020
31021     operation.disabled = function() {
31022         return join.disabled(context.graph()) &&
31023             merge.disabled(context.graph()) &&
31024             mergePolygon.disabled(context.graph());
31025     };
31026
31027
31028     operation.tooltip = function() {
31029         var j = join.disabled(context.graph()),
31030             m = merge.disabled(context.graph()),
31031             p = mergePolygon.disabled(context.graph());
31032
31033         if (j === 'restriction' && m && p) {
31034             return t('operations.merge.restriction',
31035                 { relation: context.presets().item('type/restriction').name() });
31036         }
31037
31038         if (p === 'incomplete_relation' && j && m) {
31039             return t('operations.merge.incomplete_relation');
31040         }
31041
31042         if (j && m && p) {
31043             return t('operations.merge.' + j);
31044         }
31045
31046         return t('operations.merge.description');
31047     };
31048
31049
31050     operation.annotation = function() {
31051         return t('operations.merge.annotation', { n: selectedIDs.length });
31052     };
31053
31054
31055     operation.id = 'merge';
31056     operation.keys = [t('operations.merge.key')];
31057     operation.title = t('operations.merge.title');
31058     operation.behavior = behaviorOperation(context).which(operation);
31059
31060     return operation;
31061 }
31062
31063 function operationMove(selectedIDs, context) {
31064     var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
31065     var extent = selectedIDs.reduce(function(extent, id) {
31066         return extent.extend(context.entity(id).extent(context.graph()));
31067     }, geoExtent$$1());
31068
31069
31070     var operation = function() {
31071         context.enter(modeMove$$1(context, selectedIDs));
31072     };
31073
31074
31075     operation.available = function() {
31076         return selectedIDs.length > 1 ||
31077             context.entity(selectedIDs[0]).type !== 'node';
31078     };
31079
31080
31081     operation.disabled = function() {
31082         var reason;
31083         if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
31084             reason = 'too_large';
31085         } else if (some(selectedIDs, context.hasHiddenConnections)) {
31086             reason = 'connected_to_hidden';
31087         } else if (some(selectedIDs, incompleteRelation)) {
31088             reason = 'incomplete_relation';
31089         }
31090         return reason;
31091
31092         function incompleteRelation(id) {
31093             var entity = context.entity(id);
31094             return entity.type === 'relation' && !entity.isComplete(context.graph());
31095         }
31096     };
31097
31098
31099     operation.tooltip = function() {
31100         var disable = operation.disabled();
31101         return disable ?
31102             t('operations.move.' + disable + '.' + multi) :
31103             t('operations.move.description.' + multi);
31104     };
31105
31106
31107     operation.annotation = function() {
31108         return selectedIDs.length === 1 ?
31109             t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
31110             t('operations.move.annotation.multiple');
31111     };
31112
31113
31114     operation.id = 'move';
31115     operation.keys = [t('operations.move.key')];
31116     operation.title = t('operations.move.title');
31117     operation.behavior = behaviorOperation(context).which(operation);
31118
31119     return operation;
31120 }
31121
31122 function operationOrthogonalize(selectedIDs, context) {
31123     var entityId = selectedIDs[0],
31124         entity = context.entity(entityId),
31125         extent = entity.extent(context.graph()),
31126         geometry = context.geometry(entityId),
31127         action = actionOrthogonalize(entityId, context.projection);
31128
31129
31130     var operation = function() {
31131         context.perform(action, operation.annotation());
31132     };
31133
31134
31135     operation.available = function() {
31136         return selectedIDs.length === 1 &&
31137             entity.type === 'way' &&
31138             entity.isClosed() &&
31139             uniq(entity.nodes).length > 2;
31140     };
31141
31142
31143     operation.disabled = function() {
31144         var reason;
31145         if (extent.percentContainedIn(context.extent()) < 0.8) {
31146             reason = 'too_large';
31147         } else if (context.hasHiddenConnections(entityId)) {
31148             reason = 'connected_to_hidden';
31149         }
31150         return action.disabled(context.graph()) || reason;
31151     };
31152
31153
31154     operation.tooltip = function() {
31155         var disable = operation.disabled();
31156         return disable ?
31157             t('operations.orthogonalize.' + disable) :
31158             t('operations.orthogonalize.description.' + geometry);
31159     };
31160
31161
31162     operation.annotation = function() {
31163         return t('operations.orthogonalize.annotation.' + geometry);
31164     };
31165
31166
31167     operation.id = 'orthogonalize';
31168     operation.keys = [t('operations.orthogonalize.key')];
31169     operation.title = t('operations.orthogonalize.title');
31170     operation.behavior = behaviorOperation(context).which(operation);
31171
31172     return operation;
31173 }
31174
31175 /**
31176  * This method is like `_.uniq` except that it accepts `iteratee` which is
31177  * invoked for each element in `array` to generate the criterion by which
31178  * uniqueness is computed. The order of result values is determined by the
31179  * order they occur in the array. The iteratee is invoked with one argument:
31180  * (value).
31181  *
31182  * @static
31183  * @memberOf _
31184  * @since 4.0.0
31185  * @category Array
31186  * @param {Array} array The array to inspect.
31187  * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
31188  * @returns {Array} Returns the new duplicate free array.
31189  * @example
31190  *
31191  * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
31192  * // => [2.1, 1.2]
31193  *
31194  * // The `_.property` iteratee shorthand.
31195  * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
31196  * // => [{ 'x': 1 }, { 'x': 2 }]
31197  */
31198 function uniqBy(array, iteratee) {
31199   return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];
31200 }
31201
31202 function operationReflectShort(selectedIDs, context) {
31203     return operationReflect(selectedIDs, context, 'short');
31204 }
31205
31206
31207 function operationReflectLong(selectedIDs, context) {
31208     return operationReflect(selectedIDs, context, 'long');
31209 }
31210
31211
31212 function operationReflect(selectedIDs, context, axis) {
31213     axis = axis || 'long';
31214     var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
31215         extent = selectedIDs.reduce(function(extent, id) {
31216             return extent.extend(context.entity(id).extent(context.graph()));
31217         }, geoExtent$$1());
31218
31219
31220     var operation = function() {
31221         var action = actionReflect(selectedIDs, context.projection)
31222             .useLongAxis(Boolean(axis === 'long'));
31223         context.perform(action, operation.annotation());
31224     };
31225
31226
31227     operation.available = function() {
31228         var nodes = utilGetAllNodes(selectedIDs, context.graph());
31229         return uniqBy(nodes, function(n) { return n.loc; }).length >= 3;
31230     };
31231
31232
31233     operation.disabled = function() {
31234         var reason;
31235         if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
31236             reason = 'too_large';
31237         } else if (some(selectedIDs, context.hasHiddenConnections)) {
31238             reason = 'connected_to_hidden';
31239         } else if (some(selectedIDs, incompleteRelation)) {
31240             reason = 'incomplete_relation';
31241         }
31242         return reason;
31243
31244         function incompleteRelation(id) {
31245             var entity = context.entity(id);
31246             return entity.type === 'relation' && !entity.isComplete(context.graph());
31247         }
31248     };
31249
31250
31251     operation.tooltip = function() {
31252         var disable = operation.disabled();
31253         return disable ?
31254             t('operations.reflect.' + disable + '.' + multi) :
31255             t('operations.reflect.description.' + axis + '.' + multi);
31256     };
31257
31258
31259     operation.annotation = function() {
31260         return t('operations.reflect.annotation.' + axis + '.' + multi);
31261     };
31262
31263
31264     operation.id = 'reflect-' + axis;
31265     operation.keys = [t('operations.reflect.key.' + axis)];
31266     operation.title = t('operations.reflect.title.' + axis);
31267     operation.behavior = behaviorOperation(context).which(operation);
31268
31269     return operation;
31270 }
31271
31272 function operationReverse(selectedIDs, context) {
31273     var entityId = selectedIDs[0];
31274
31275     var operation = function() {
31276         context.perform(actionReverse(entityId), operation.annotation());
31277     };
31278
31279
31280     operation.available = function() {
31281         return selectedIDs.length === 1 && context.geometry(entityId) === 'line';
31282     };
31283
31284
31285     operation.disabled = function() {
31286         return false;
31287     };
31288
31289
31290     operation.tooltip = function() {
31291         return t('operations.reverse.description');
31292     };
31293
31294
31295     operation.annotation = function() {
31296         return t('operations.reverse.annotation');
31297     };
31298
31299
31300     operation.id = 'reverse';
31301     operation.keys = [t('operations.reverse.key')];
31302     operation.title = t('operations.reverse.title');
31303     operation.behavior = behaviorOperation(context).which(operation);
31304
31305     return operation;
31306 }
31307
31308 function operationRotate(selectedIDs, context) {
31309     var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
31310         extent = selectedIDs.reduce(function(extent, id) {
31311             return extent.extend(context.entity(id).extent(context.graph()));
31312         }, geoExtent$$1());
31313
31314
31315     var operation = function() {
31316         context.enter(modeRotate$$1(context, selectedIDs));
31317     };
31318
31319
31320     operation.available = function() {
31321         var nodes = utilGetAllNodes(selectedIDs, context.graph());
31322         return uniqBy(nodes, function(n) { return n.loc; }).length >= 2;
31323     };
31324
31325
31326     operation.disabled = function() {
31327         var reason;
31328         if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
31329             reason = 'too_large';
31330         } else if (some(selectedIDs, context.hasHiddenConnections)) {
31331             reason = 'connected_to_hidden';
31332         } else if (some(selectedIDs, incompleteRelation)) {
31333             reason = 'incomplete_relation';
31334         }
31335         return reason;
31336
31337         function incompleteRelation(id) {
31338             var entity = context.entity(id);
31339             return entity.type === 'relation' && !entity.isComplete(context.graph());
31340         }
31341     };
31342
31343
31344     operation.tooltip = function() {
31345         var disable = operation.disabled();
31346         return disable ?
31347             t('operations.rotate.' + disable + '.' + multi) :
31348             t('operations.rotate.description.' + multi);
31349     };
31350
31351
31352     operation.annotation = function() {
31353         return selectedIDs.length === 1 ?
31354             t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
31355             t('operations.rotate.annotation.multiple');
31356     };
31357
31358
31359     operation.id = 'rotate';
31360     operation.keys = [t('operations.rotate.key')];
31361     operation.title = t('operations.rotate.title');
31362     operation.behavior = behaviorOperation(context).which(operation);
31363
31364     return operation;
31365 }
31366
31367 function operationSplit(selectedIDs, context) {
31368     var vertices = filter(selectedIDs, function(entityId) {
31369         return context.geometry(entityId) === 'vertex';
31370     });
31371
31372     var entityId = vertices[0],
31373         action = actionSplit(entityId),
31374         ways = [];
31375
31376     if (vertices.length === 1) {
31377         if (selectedIDs.length > 1) {
31378             action.limitWays(without(selectedIDs, entityId));
31379         }
31380         ways = action.ways(context.graph());
31381     }
31382
31383
31384     var operation = function() {
31385         var difference = context.perform(action, operation.annotation());
31386         context.enter(modeSelect(context, difference.extantIDs()));
31387     };
31388
31389
31390     operation.available = function() {
31391         return vertices.length === 1;
31392     };
31393
31394
31395     operation.disabled = function() {
31396         var reason;
31397         if (some(selectedIDs, context.hasHiddenConnections)) {
31398             reason = 'connected_to_hidden';
31399         }
31400         return action.disabled(context.graph()) || reason;
31401     };
31402
31403
31404     operation.tooltip = function() {
31405         var disable = operation.disabled();
31406         if (disable) {
31407             return t('operations.split.' + disable);
31408         }
31409         if (ways.length === 1) {
31410             return t('operations.split.description.' + context.geometry(ways[0].id));
31411         } else {
31412             return t('operations.split.description.multiple');
31413         }
31414     };
31415
31416
31417     operation.annotation = function() {
31418         return ways.length === 1 ?
31419             t('operations.split.annotation.' + context.geometry(ways[0].id)) :
31420             t('operations.split.annotation.multiple', { n: ways.length });
31421     };
31422
31423
31424     operation.id = 'split';
31425     operation.keys = [t('operations.split.key')];
31426     operation.title = t('operations.split.title');
31427     operation.behavior = behaviorOperation(context).which(operation);
31428
31429     return operation;
31430 }
31431
31432 function operationStraighten(selectedIDs, context) {
31433     var entityId = selectedIDs[0],
31434         action = actionStraighten(entityId, context.projection);
31435
31436
31437     function operation() {
31438         context.perform(action, operation.annotation());
31439     }
31440
31441
31442     operation.available = function() {
31443         var entity = context.entity(entityId);
31444         return selectedIDs.length === 1 &&
31445             entity.type === 'way' &&
31446             !entity.isClosed() &&
31447             uniq(entity.nodes).length > 2;
31448     };
31449
31450
31451     operation.disabled = function() {
31452         var reason;
31453         if (context.hasHiddenConnections(entityId)) {
31454             reason = 'connected_to_hidden';
31455         }
31456         return action.disabled(context.graph()) || reason;
31457     };
31458
31459
31460     operation.tooltip = function() {
31461         var disable = operation.disabled();
31462         return disable ?
31463             t('operations.straighten.' + disable) :
31464             t('operations.straighten.description');
31465     };
31466
31467
31468     operation.annotation = function() {
31469         return t('operations.straighten.annotation');
31470     };
31471
31472
31473     operation.id = 'straighten';
31474     operation.keys = [t('operations.straighten.key')];
31475     operation.title = t('operations.straighten.title');
31476     operation.behavior = behaviorOperation(context).which(operation);
31477
31478     return operation;
31479 }
31480
31481
31482
31483 var Operations = Object.freeze({
31484         operationCircularize: operationCircularize,
31485         operationContinue: operationContinue,
31486         operationDelete: operationDelete,
31487         operationDisconnect: operationDisconnect,
31488         operationMerge: operationMerge,
31489         operationMove: operationMove,
31490         operationOrthogonalize: operationOrthogonalize,
31491         operationReflectShort: operationReflectShort,
31492         operationReflectLong: operationReflectLong,
31493         operationReverse: operationReverse,
31494         operationRotate: operationRotate,
31495         operationSplit: operationSplit,
31496         operationStraighten: operationStraighten
31497 });
31498
31499 function modeMove$$1(context, entityIDs, baseGraph) {
31500     var mode = {
31501         id: 'move',
31502         button: 'browse'
31503     };
31504
31505     var keybinding = d3keybinding('move');
31506     var behaviors = [
31507         behaviorEdit(context),
31508         operationCircularize(entityIDs, context).behavior,
31509         operationDelete(entityIDs, context).behavior,
31510         operationOrthogonalize(entityIDs, context).behavior,
31511         operationReflectLong(entityIDs, context).behavior,
31512         operationReflectShort(entityIDs, context).behavior,
31513         operationRotate(entityIDs, context).behavior
31514     ];
31515     var annotation = entityIDs.length === 1 ?
31516         t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
31517         t('operations.move.annotation.multiple');
31518
31519     var _prevGraph;
31520     var _cache;
31521     var _origin;
31522     var _nudgeInterval;
31523
31524
31525     function doMove(nudge) {
31526         nudge = nudge || [0, 0];
31527
31528         var fn;
31529         if (_prevGraph !== context.graph()) {
31530             _cache = {};
31531             _origin = context.map().mouseCoordinates();
31532             fn = context.perform;
31533         } else {
31534             fn = context.overwrite;
31535         }
31536
31537         var currMouse = context.mouse();
31538         var origMouse = context.projection(_origin);
31539         var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
31540
31541         fn(actionMove(entityIDs, delta, context.projection, _cache), annotation);
31542         _prevGraph = context.graph();
31543     }
31544
31545
31546     function startNudge(nudge) {
31547         if (_nudgeInterval) window.clearInterval(_nudgeInterval);
31548         _nudgeInterval = window.setInterval(function() {
31549             context.pan(nudge);
31550             doMove(nudge);
31551         }, 50);
31552     }
31553
31554
31555     function stopNudge() {
31556         if (_nudgeInterval) {
31557             window.clearInterval(_nudgeInterval);
31558             _nudgeInterval = null;
31559         }
31560     }
31561
31562
31563     function move() {
31564         doMove();
31565         var nudge = geoViewportEdge(context.mouse(), context.map().dimensions());
31566         if (nudge) {
31567             startNudge(nudge);
31568         } else {
31569             stopNudge();
31570         }
31571     }
31572
31573
31574     function finish() {
31575         event.stopPropagation();
31576         context.enter(modeSelect(context, entityIDs));
31577         stopNudge();
31578     }
31579
31580
31581     function cancel() {
31582         if (baseGraph) {
31583             while (context.graph() !== baseGraph) context.pop();
31584             context.enter(modeBrowse(context));
31585         } else {
31586             context.pop();
31587             context.enter(modeSelect(context, entityIDs));
31588         }
31589         stopNudge();
31590     }
31591
31592
31593     function undone() {
31594         context.enter(modeBrowse(context));
31595     }
31596
31597
31598     mode.enter = function() {
31599         _origin = context.map().mouseCoordinates();
31600         _prevGraph = null;
31601         _cache = {};
31602
31603         behaviors.forEach(function(behavior) {
31604             context.install(behavior);
31605         });
31606
31607         context.surface()
31608             .on('mousemove.move', move)
31609             .on('click.move', finish);
31610
31611         context.history()
31612             .on('undone.move', undone);
31613
31614         keybinding
31615             .on('⎋', cancel)
31616             .on('↩', finish);
31617
31618         d3_select(document)
31619             .call(keybinding);
31620     };
31621
31622
31623     mode.exit = function() {
31624         stopNudge();
31625
31626         behaviors.forEach(function(behavior) {
31627             context.uninstall(behavior);
31628         });
31629
31630         context.surface()
31631             .on('mousemove.move', null)
31632             .on('click.move', null);
31633
31634         context.history()
31635             .on('undone.move', null);
31636
31637         keybinding.off();
31638     };
31639
31640
31641     mode.selectedIDs = function() {
31642         if (!arguments.length) return entityIDs;
31643         // no assign
31644         return mode;
31645     };
31646
31647
31648     return mode;
31649 }
31650
31651 function modeRotate$$1(context, entityIDs) {
31652     var mode = {
31653         id: 'rotate',
31654         button: 'browse'
31655     };
31656
31657     var keybinding = d3keybinding('rotate');
31658     var behaviors = [
31659         behaviorEdit(context),
31660         operationCircularize(entityIDs, context).behavior,
31661         operationDelete(entityIDs, context).behavior,
31662         operationMove(entityIDs, context).behavior,
31663         operationOrthogonalize(entityIDs, context).behavior,
31664         operationReflectLong(entityIDs, context).behavior,
31665         operationReflectShort(entityIDs, context).behavior
31666     ];
31667     var annotation = entityIDs.length === 1 ?
31668         t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
31669         t('operations.rotate.annotation.multiple');
31670
31671     var _prevGraph;
31672     var _prevAngle;
31673     var _prevTransform;
31674     var _pivot;
31675
31676
31677     function doRotate() {
31678         var fn;
31679         if (context.graph() !== _prevGraph) {
31680             fn = context.perform;
31681         } else {
31682             fn = context.replace;
31683         }
31684
31685         // projection changed, recalculate _pivot
31686         var projection = context.projection;
31687         var currTransform = projection.transform();
31688         if (!_prevTransform ||
31689             currTransform.k !== _prevTransform.k ||
31690             currTransform.x !== _prevTransform.x ||
31691             currTransform.y !== _prevTransform.y) {
31692
31693             var nodes = utilGetAllNodes(entityIDs, context.graph());
31694             var points = nodes.map(function(n) { return projection(n.loc); });
31695
31696             if (points.length === 1) {  // degenerate case
31697                 _pivot = points[0];
31698             } else if (points.length === 2) {
31699                 _pivot = geoVecInterp(points[0], points[1], 0.5);
31700             } else {
31701                 _pivot = d3_polygonCentroid(d3_polygonHull(points));
31702             }
31703             _prevAngle = undefined;
31704         }
31705
31706
31707         var currMouse = context.mouse();
31708         var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
31709
31710         if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
31711         var delta = currAngle - _prevAngle;
31712
31713         fn(actionRotate(entityIDs, _pivot, delta, projection), annotation);
31714
31715         _prevTransform = currTransform;
31716         _prevAngle = currAngle;
31717         _prevGraph = context.graph();
31718     }
31719
31720
31721     function finish() {
31722         event.stopPropagation();
31723         context.enter(modeSelect(context, entityIDs));
31724     }
31725
31726
31727     function cancel() {
31728         context.pop();
31729         context.enter(modeSelect(context, entityIDs));
31730     }
31731
31732
31733     function undone() {
31734         context.enter(modeBrowse(context));
31735     }
31736
31737
31738     mode.enter = function() {
31739         behaviors.forEach(function(behavior) {
31740             context.install(behavior);
31741         });
31742
31743         context.surface()
31744             .on('mousemove.rotate', doRotate)
31745             .on('click.rotate', finish);
31746
31747         context.history()
31748             .on('undone.rotate', undone);
31749
31750         keybinding
31751             .on('⎋', cancel)
31752             .on('↩', finish);
31753
31754         d3_select(document)
31755             .call(keybinding);
31756     };
31757
31758
31759     mode.exit = function() {
31760         behaviors.forEach(function(behavior) {
31761             context.uninstall(behavior);
31762         });
31763
31764         context.surface()
31765             .on('mousemove.rotate', null)
31766             .on('click.rotate', null);
31767
31768         context.history()
31769             .on('undone.rotate', null);
31770
31771         keybinding.off();
31772     };
31773
31774
31775     mode.selectedIDs = function() {
31776         if (!arguments.length) return entityIDs;
31777         // no assign
31778         return mode;
31779     };
31780
31781
31782     return mode;
31783 }
31784
31785 /**
31786  * A specialized version of `_.reduce` for arrays without support for
31787  * iteratee shorthands.
31788  *
31789  * @private
31790  * @param {Array} [array] The array to iterate over.
31791  * @param {Function} iteratee The function invoked per iteration.
31792  * @param {*} [accumulator] The initial value.
31793  * @param {boolean} [initAccum] Specify using the first element of `array` as
31794  *  the initial value.
31795  * @returns {*} Returns the accumulated value.
31796  */
31797 function arrayReduce(array, iteratee, accumulator, initAccum) {
31798   var index = -1,
31799       length = array == null ? 0 : array.length;
31800
31801   if (initAccum && length) {
31802     accumulator = array[++index];
31803   }
31804   while (++index < length) {
31805     accumulator = iteratee(accumulator, array[index], index, array);
31806   }
31807   return accumulator;
31808 }
31809
31810 /**
31811  * The base implementation of `_.reduce` and `_.reduceRight`, without support
31812  * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
31813  *
31814  * @private
31815  * @param {Array|Object} collection The collection to iterate over.
31816  * @param {Function} iteratee The function invoked per iteration.
31817  * @param {*} accumulator The initial value.
31818  * @param {boolean} initAccum Specify using the first or last element of
31819  *  `collection` as the initial value.
31820  * @param {Function} eachFunc The function to iterate over `collection`.
31821  * @returns {*} Returns the accumulated value.
31822  */
31823 function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
31824   eachFunc(collection, function(value, index, collection) {
31825     accumulator = initAccum
31826       ? (initAccum = false, value)
31827       : iteratee(accumulator, value, index, collection);
31828   });
31829   return accumulator;
31830 }
31831
31832 /**
31833  * Reduces `collection` to a value which is the accumulated result of running
31834  * each element in `collection` thru `iteratee`, where each successive
31835  * invocation is supplied the return value of the previous. If `accumulator`
31836  * is not given, the first element of `collection` is used as the initial
31837  * value. The iteratee is invoked with four arguments:
31838  * (accumulator, value, index|key, collection).
31839  *
31840  * Many lodash methods are guarded to work as iteratees for methods like
31841  * `_.reduce`, `_.reduceRight`, and `_.transform`.
31842  *
31843  * The guarded methods are:
31844  * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
31845  * and `sortBy`
31846  *
31847  * @static
31848  * @memberOf _
31849  * @since 0.1.0
31850  * @category Collection
31851  * @param {Array|Object} collection The collection to iterate over.
31852  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
31853  * @param {*} [accumulator] The initial value.
31854  * @returns {*} Returns the accumulated value.
31855  * @see _.reduceRight
31856  * @example
31857  *
31858  * _.reduce([1, 2], function(sum, n) {
31859  *   return sum + n;
31860  * }, 0);
31861  * // => 3
31862  *
31863  * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
31864  *   (result[value] || (result[value] = [])).push(key);
31865  *   return result;
31866  * }, {});
31867  * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
31868  */
31869 function reduce(collection, iteratee, accumulator) {
31870   var func = isArray(collection) ? arrayReduce : baseReduce,
31871       initAccum = arguments.length < 3;
31872
31873   return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);
31874 }
31875
31876 var _isSaving = false;
31877
31878
31879 function modeSave$$1(context) {
31880     var mode = { id: 'save' };
31881     var keybinding = d3keybinding('modeSave');
31882
31883     var loading = uiLoading(context)
31884         .message(t('save.uploading'))
31885         .blocking(true);
31886
31887     var commit = uiCommit(context)
31888         .on('cancel', cancel)
31889         .on('save', save);
31890
31891     var _toCheck = [];
31892     var _toLoad = [];
31893     var _loaded = {};
31894     var _toLoadCount = 0;
31895     var _toLoadTotal = 0;
31896
31897     var _conflicts = [];
31898     var _errors = [];
31899     var _origChanges;
31900
31901
31902     function cancel(selectedID) {
31903         if (selectedID) {
31904             context.enter(modeSelect(context, [selectedID]));
31905         } else {
31906             context.enter(modeBrowse(context));
31907         }
31908     }
31909
31910
31911     function save(changeset, tryAgain, checkConflicts) {
31912         // Guard against accidentally entering save code twice - #4641
31913         if (_isSaving && !tryAgain) {
31914             return;
31915         }
31916
31917         var osm = context.connection();
31918         if (!osm) {
31919             cancel();
31920             return;
31921         }
31922
31923         // If user somehow got logged out mid-save, try to reauthenticate..
31924         // This can happen if they were logged in from before, but the tokens are no longer valid.
31925         if (!osm.authenticated()) {
31926             osm.authenticate(function(err) {
31927                 if (err) {
31928                     cancel();   // quit save mode..
31929                 } else {
31930                     save(changeset, tryAgain, checkConflicts);  // continue where we left off..
31931                 }
31932             });
31933             return;
31934         }
31935
31936         if (!_isSaving) {
31937             keybindingOff();
31938             context.container().call(loading);  // block input
31939             _isSaving = true;
31940         }
31941
31942         var history = context.history();
31943         var localGraph = context.graph();
31944         var remoteGraph = coreGraph$$1(history.base(), true);
31945
31946         _conflicts = [];
31947         _errors = [];
31948
31949         // Store original changes, in case user wants to download them as an .osc file
31950         _origChanges = history.changes(actionDiscardTags(history.difference()));
31951
31952         // First time, `history.perform` a no-op action.
31953         // Any conflict resolutions will be done as `history.replace`
31954         if (!tryAgain) {
31955             history.perform(actionNoop());
31956         }
31957
31958         // Attempt a fast upload.. If there are conflicts, re-enter with `checkConflicts = true`
31959         if (!checkConflicts) {
31960             upload(changeset);
31961
31962         // Do the full (slow) conflict check..
31963         } else {
31964             var modified = filter(history.difference().summary(), { changeType: 'modified' });
31965             _toCheck = map$3(map$3(modified, 'entity'), 'id');
31966             _toLoad = withChildNodes(_toCheck, localGraph);
31967             _loaded = {};
31968             _toLoadCount = 0;
31969             _toLoadTotal = _toLoad.length;
31970
31971             if (_toCheck.length) {
31972                 showProgress(_toLoadCount, _toLoadTotal);
31973                 _toLoad.forEach(function(id) { _loaded[id] = false; });
31974                 osm.loadMultiple(_toLoad, loaded);
31975             } else {
31976                 upload(changeset);
31977             }
31978         }
31979
31980         return;
31981
31982
31983         function withChildNodes(ids, graph) {
31984             return uniq(reduce(ids, function(result, id) {
31985                 var entity = graph.entity(id);
31986                 if (entity.type === 'way') {
31987                     try {
31988                         var children = graph.childNodes(entity);
31989                         result.push.apply(result, map$3(filter(children, 'version'), 'id'));
31990                     } catch (err) {
31991                         /* eslint-disable no-console */
31992                         if (typeof console !== 'undefined') console.error(err);
31993                         /* eslint-enable no-console */
31994                     }
31995                 }
31996                 return result;
31997             }, clone(ids)));
31998         }
31999
32000
32001         // Reload modified entities into an alternate graph and check for conflicts..
32002         function loaded(err, result) {
32003             if (_errors.length) return;
32004
32005             if (err) {
32006                 _errors.push({
32007                     msg: err.message || err.responseText,
32008                     details: [ t('save.status_code', { code: err.status }) ]
32009                 });
32010                 showErrors();
32011
32012             } else {
32013                 var loadMore = [];
32014
32015                 result.data.forEach(function(entity) {
32016                     remoteGraph.replace(entity);
32017                     _loaded[entity.id] = true;
32018                     _toLoad = without(_toLoad, entity.id);
32019
32020                     if (!entity.visible) return;
32021
32022                     // Because loadMultiple doesn't download /full like loadEntity,
32023                     // need to also load children that aren't already being checked..
32024                     var i, id;
32025                     if (entity.type === 'way') {
32026                         for (i = 0; i < entity.nodes.length; i++) {
32027                             id = entity.nodes[i];
32028                             if (_loaded[id] === undefined) {
32029                                 _loaded[id] = false;
32030                                 loadMore.push(id);
32031                             }
32032                         }
32033                     } else if (entity.type === 'relation' && entity.isMultipolygon()) {
32034                         for (i = 0; i < entity.members.length; i++) {
32035                             id = entity.members[i].id;
32036                             if (_loaded[id] === undefined) {
32037                                 _loaded[id] = false;
32038                                 loadMore.push(id);
32039                             }
32040                         }
32041                     }
32042                 });
32043
32044                 _toLoadCount += result.data.length;
32045                 _toLoadTotal += loadMore.length;
32046                 showProgress(_toLoadCount, _toLoadTotal);
32047
32048                 if (loadMore.length) {
32049                     _toLoad.push.apply(_toLoad, loadMore);
32050                     osm.loadMultiple(loadMore, loaded);
32051                 }
32052
32053                 if (!_toLoad.length) {
32054                     detectConflicts();
32055                 }
32056             }
32057         }
32058
32059
32060         function detectConflicts() {
32061             function choice(id, text, action) {
32062                 return { id: id, text: text, action: function() { history.replace(action); } };
32063             }
32064             function formatUser(d) {
32065                 return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
32066             }
32067             function entityName(entity) {
32068                 return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
32069             }
32070
32071             function sameVersions(local$$1, remote) {
32072                 if (local$$1.version !== remote.version) return false;
32073
32074                 if (local$$1.type === 'way') {
32075                     var children = union(local$$1.nodes, remote.nodes);
32076                     for (var i = 0; i < children.length; i++) {
32077                         var a = localGraph.hasEntity(children[i]);
32078                         var b = remoteGraph.hasEntity(children[i]);
32079                         if (a && b && a.version !== b.version) return false;
32080                     }
32081                 }
32082
32083                 return true;
32084             }
32085
32086             _toCheck.forEach(function(id) {
32087                 var local$$1 = localGraph.entity(id);
32088                 var remote = remoteGraph.entity(id);
32089
32090                 if (sameVersions(local$$1, remote)) return;
32091
32092                 var action = actionMergeRemoteChanges;
32093                 var merge = action(id, localGraph, remoteGraph, formatUser);
32094
32095                 history.replace(merge);
32096
32097                 var mergeConflicts = merge.conflicts();
32098                 if (!mergeConflicts.length) return;  // merged safely
32099
32100                 var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local');
32101                 var forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote');
32102                 var keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore'));
32103                 var keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
32104
32105                 _conflicts.push({
32106                     id: id,
32107                     name: entityName(local$$1),
32108                     details: mergeConflicts,
32109                     chosen: 1,
32110                     choices: [
32111                         choice(id, keepMine, forceLocal),
32112                         choice(id, keepTheirs, forceRemote)
32113                     ]
32114                 });
32115             });
32116
32117             upload(changeset);
32118         }
32119     }
32120
32121
32122     function upload(changeset) {
32123         var osm = context.connection();
32124         if (!osm) {
32125             _errors.push({ msg: 'No OSM Service' });
32126         }
32127
32128         if (_conflicts.length) {
32129             _conflicts.sort(function(a, b) { return b.id.localeCompare(a.id); });
32130             showConflicts(changeset);
32131
32132         } else if (_errors.length) {
32133             showErrors();
32134
32135         } else {
32136             var history = context.history();
32137             var changes = history.changes(actionDiscardTags(history.difference()));
32138             if (changes.modified.length || changes.created.length || changes.deleted.length) {
32139                 osm.putChangeset(changeset, changes, uploadCallback);
32140             } else {        // changes were insignificant or reverted by user
32141                 d3_select('.inspector-wrap *').remove();
32142                 loading.close();
32143                 _isSaving = false;
32144                 context.flush();
32145                 cancel();
32146             }
32147         }
32148     }
32149
32150
32151     function uploadCallback(err, changeset) {
32152         if (err) {
32153             if (err.status === 409) {          // 409 Conflict
32154                 save(changeset, true, true);   // tryAgain = true, checkConflicts = true
32155             } else {
32156                 _errors.push({
32157                     msg: err.message || err.responseText,
32158                     details: [ t('save.status_code', { code: err.status }) ]
32159                 });
32160                 showErrors();
32161             }
32162
32163         } else {
32164             context.history().clearSaved();
32165             success(changeset);
32166             // Add delay to allow for postgres replication #1646 #2678
32167             window.setTimeout(function() {
32168                 d3_select('.inspector-wrap *').remove();
32169                 loading.close();
32170                 _isSaving = false;
32171                 context.flush();
32172             }, 2500);
32173         }
32174     }
32175
32176
32177     function showProgress(num, total) {
32178         var modal = context.container().select('.loading-modal .modal-section');
32179         var progress = modal.selectAll('.progress')
32180             .data([0]);
32181
32182         // enter/update
32183         progress.enter()
32184             .append('div')
32185             .attr('class', 'progress')
32186             .merge(progress)
32187             .text(t('save.conflict_progress', { num: num, total: total }));
32188     }
32189
32190
32191     function showConflicts(changeset) {
32192         var history = context.history();
32193         var selection$$1 = context.container()
32194             .select('#sidebar')
32195             .append('div')
32196             .attr('class','sidebar-component');
32197
32198         loading.close();
32199         _isSaving = false;
32200
32201         var ui = uiConflicts(context)
32202             .conflictList(_conflicts)
32203             .origChanges(_origChanges)
32204             .on('cancel', function() {
32205                 history.pop();
32206                 selection$$1.remove();
32207                 keybindingOn();
32208             })
32209             .on('save', function() {
32210                 for (var i = 0; i < _conflicts.length; i++) {
32211                     if (_conflicts[i].chosen === 1) {  // user chose "keep theirs"
32212                         var entity = context.hasEntity(_conflicts[i].id);
32213                         if (entity && entity.type === 'way') {
32214                             var children = uniq(entity.nodes);
32215                             for (var j = 0; j < children.length; j++) {
32216                                 history.replace(actionRevert(children[j]));
32217                             }
32218                         }
32219                         history.replace(actionRevert(_conflicts[i].id));
32220                     }
32221                 }
32222
32223                 selection$$1.remove();
32224                 save(changeset, true, false);  // tryAgain = true, checkConflicts = false
32225             });
32226
32227         selection$$1.call(ui);
32228     }
32229
32230
32231     function showErrors() {
32232         keybindingOn();
32233         context.history().pop();
32234         loading.close();
32235         _isSaving = false;
32236
32237         var selection$$1 = uiConfirm(context.container());
32238         selection$$1
32239             .select('.modal-section.header')
32240             .append('h3')
32241             .text(t('save.error'));
32242
32243         addErrors(selection$$1, _errors);
32244         selection$$1.okButton();
32245     }
32246
32247
32248     function addErrors(selection$$1, data) {
32249         var message = selection$$1
32250             .select('.modal-section.message-text');
32251
32252         var items = message
32253             .selectAll('.error-container')
32254             .data(data);
32255
32256         var enter = items.enter()
32257             .append('div')
32258             .attr('class', 'error-container');
32259
32260         enter
32261             .append('a')
32262             .attr('class', 'error-description')
32263             .attr('href', '#')
32264             .classed('hide-toggle', true)
32265             .text(function(d) { return d.msg || t('save.unknown_error_details'); })
32266             .on('click', function() {
32267                 event.preventDefault();
32268
32269                 var error = d3_select(this);
32270                 var detail = d3_select(this.nextElementSibling);
32271                 var exp = error.classed('expanded');
32272
32273                 detail.style('display', exp ? 'none' : 'block');
32274                 error.classed('expanded', !exp);
32275             });
32276
32277         var details = enter
32278             .append('div')
32279             .attr('class', 'error-detail-container')
32280             .style('display', 'none');
32281
32282         details
32283             .append('ul')
32284             .attr('class', 'error-detail-list')
32285             .selectAll('li')
32286             .data(function(d) { return d.details || []; })
32287             .enter()
32288             .append('li')
32289             .attr('class', 'error-detail-item')
32290             .text(function(d) { return d; });
32291
32292         items.exit()
32293             .remove();
32294     }
32295
32296
32297     function success(changeset) {
32298         commit.reset();
32299
32300         var ui = uiSuccess(context)
32301             .changeset(changeset)
32302             .on('cancel', function() { context.ui().sidebar.hide(); });
32303
32304         context.enter(modeBrowse(context).sidebar(ui));
32305     }
32306
32307
32308     function keybindingOn() {
32309         d3_select(document)
32310             .call(keybinding.on('⎋', cancel, true));
32311     }
32312
32313
32314     function keybindingOff() {
32315         d3_select(document)
32316             .call(keybinding.off);
32317     }
32318
32319
32320     mode.enter = function() {
32321         function done() {
32322             context.ui().sidebar.show(commit);
32323         }
32324
32325         keybindingOn();
32326
32327         context.container().selectAll('#content')
32328             .attr('class', 'inactive');
32329
32330         var osm = context.connection();
32331         if (!osm) {
32332             cancel();
32333             return;
32334         }
32335
32336         if (osm.authenticated()) {
32337             done();
32338         } else {
32339             osm.authenticate(function(err) {
32340                 if (err) {
32341                     cancel();
32342                 } else {
32343                     done();
32344                 }
32345             });
32346         }
32347     };
32348
32349
32350     mode.exit = function() {
32351         _isSaving = false;
32352
32353         keybindingOff();
32354
32355         context.container().selectAll('#content')
32356             .attr('class', 'active');
32357
32358         context.ui().sidebar.hide();
32359     };
32360
32361     return mode;
32362 }
32363
32364 /* Built-in method references for those with the same name as other `lodash` methods. */
32365 var nativeMin$1 = Math.min;
32366
32367 /**
32368  * The base implementation of methods like `_.intersection`, without support
32369  * for iteratee shorthands, that accepts an array of arrays to inspect.
32370  *
32371  * @private
32372  * @param {Array} arrays The arrays to inspect.
32373  * @param {Function} [iteratee] The iteratee invoked per element.
32374  * @param {Function} [comparator] The comparator invoked per element.
32375  * @returns {Array} Returns the new array of shared values.
32376  */
32377 function baseIntersection(arrays, iteratee, comparator) {
32378   var includes = comparator ? arrayIncludesWith : arrayIncludes,
32379       length = arrays[0].length,
32380       othLength = arrays.length,
32381       othIndex = othLength,
32382       caches = Array(othLength),
32383       maxLength = Infinity,
32384       result = [];
32385
32386   while (othIndex--) {
32387     var array = arrays[othIndex];
32388     if (othIndex && iteratee) {
32389       array = arrayMap(array, baseUnary(iteratee));
32390     }
32391     maxLength = nativeMin$1(array.length, maxLength);
32392     caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
32393       ? new SetCache(othIndex && array)
32394       : undefined;
32395   }
32396   array = arrays[0];
32397
32398   var index = -1,
32399       seen = caches[0];
32400
32401   outer:
32402   while (++index < length && result.length < maxLength) {
32403     var value = array[index],
32404         computed = iteratee ? iteratee(value) : value;
32405
32406     value = (comparator || value !== 0) ? value : 0;
32407     if (!(seen
32408           ? cacheHas(seen, computed)
32409           : includes(result, computed, comparator)
32410         )) {
32411       othIndex = othLength;
32412       while (--othIndex) {
32413         var cache = caches[othIndex];
32414         if (!(cache
32415               ? cacheHas(cache, computed)
32416               : includes(arrays[othIndex], computed, comparator))
32417             ) {
32418           continue outer;
32419         }
32420       }
32421       if (seen) {
32422         seen.push(computed);
32423       }
32424       result.push(value);
32425     }
32426   }
32427   return result;
32428 }
32429
32430 /**
32431  * Casts `value` to an empty array if it's not an array like object.
32432  *
32433  * @private
32434  * @param {*} value The value to inspect.
32435  * @returns {Array|Object} Returns the cast array-like object.
32436  */
32437 function castArrayLikeObject(value) {
32438   return isArrayLikeObject(value) ? value : [];
32439 }
32440
32441 /**
32442  * Creates an array of unique values that are included in all given arrays
32443  * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
32444  * for equality comparisons. The order and references of result values are
32445  * determined by the first array.
32446  *
32447  * @static
32448  * @memberOf _
32449  * @since 0.1.0
32450  * @category Array
32451  * @param {...Array} [arrays] The arrays to inspect.
32452  * @returns {Array} Returns the new array of intersecting values.
32453  * @example
32454  *
32455  * _.intersection([2, 1], [2, 3]);
32456  * // => [2]
32457  */
32458 var intersection = baseRest(function(arrays) {
32459   var mapped = arrayMap(arrays, castArrayLikeObject);
32460   return (mapped.length && mapped[0] === arrays[0])
32461     ? baseIntersection(mapped)
32462     : [];
32463 });
32464
32465 // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
32466 // For example, ⌘Z -> Ctrl+Z
32467 var uiCmd = function (code) {
32468     var detected = utilDetect();
32469
32470     if (detected.os === 'mac') {
32471         return code;
32472     }
32473
32474     if (detected.os === 'win') {
32475         if (code === '⌘⇧Z') return 'Ctrl+Y';
32476     }
32477
32478     var result = '',
32479         replacements = {
32480             '⌘': 'Ctrl',
32481             '⇧': 'Shift',
32482             '⌥': 'Alt',
32483             '⌫': 'Backspace',
32484             '⌦': 'Delete'
32485         };
32486
32487     for (var i = 0; i < code.length; i++) {
32488         if (code[i] in replacements) {
32489             result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
32490         } else {
32491             result += code[i];
32492         }
32493     }
32494
32495     return result;
32496 };
32497
32498
32499 // return a display-focused string for a given keyboard code
32500 uiCmd.display = function(code) {
32501     if (code.length !== 1) return code;
32502
32503     var detected = utilDetect();
32504     var mac = (detected.os === 'mac');
32505     var replacements = {
32506         '⌘': mac ? '⌘ ' + t('shortcuts.key.cmd')    : t('shortcuts.key.ctrl'),
32507         '⇧': mac ? '⇧ ' + t('shortcuts.key.shift')  : t('shortcuts.key.shift'),
32508         '⌥': mac ? '⌥ ' + t('shortcuts.key.option') : t('shortcuts.key.alt'),
32509         '⌃': mac ? '⌃ ' + t('shortcuts.key.ctrl')   : t('shortcuts.key.ctrl'),
32510         '⌫': mac ? '⌫ ' + t('shortcuts.key.delete') : t('shortcuts.key.backspace'),
32511         '⌦': mac ? '⌦ ' + t('shortcuts.key.del')    : t('shortcuts.key.del'),
32512         '↖': mac ? '↖ ' + t('shortcuts.key.pgup')   : t('shortcuts.key.pgup'),
32513         '↘': mac ? '↘ ' + t('shortcuts.key.pgdn')   : t('shortcuts.key.pgdn'),
32514         '⇞': mac ? '⇞ ' + t('shortcuts.key.home')   : t('shortcuts.key.home'),
32515         '⇟': mac ? '⇟ ' + t('shortcuts.key.end')    : t('shortcuts.key.end'),
32516         '↵': mac ? '↵ ' + t('shortcuts.key.return') : t('shortcuts.key.enter'),
32517         '⎋': mac ? '⎋ ' + t('shortcuts.key.esc')    : t('shortcuts.key.esc'),
32518     };
32519
32520     return replacements[code] || code;
32521 };
32522
32523 var relatedParent;
32524
32525
32526 function modeSelect(context, selectedIDs) {
32527     var mode = {
32528         id: 'select',
32529         button: 'browse'
32530     };
32531
32532     var keybinding = d3keybinding('select');
32533     var timeout = null;
32534     var behaviors = [
32535         behaviorCopy(context),
32536         behaviorPaste(context),
32537         behaviorBreathe(context),
32538         behaviorHover(context),
32539         behaviorSelect(context),
32540         behaviorLasso(context),
32541         modeDragNode$$1(context).restoreSelectedIDs(selectedIDs).behavior
32542     ];
32543     var inspector;
32544     var editMenu;
32545     var newFeature = false;
32546     var suppressMenu = true;
32547     var follow = false;
32548
32549
32550     var wrap = context.container()
32551         .select('.inspector-wrap');
32552
32553
32554     function singular() {
32555         if (selectedIDs.length === 1) {
32556             return context.hasEntity(selectedIDs[0]);
32557         }
32558     }
32559
32560
32561     function checkSelectedIDs() {
32562         var ids = [];
32563         if (Array.isArray(selectedIDs)) {
32564             ids = selectedIDs.filter(function(id) {
32565                 return context.hasEntity(id);
32566             });
32567         }
32568
32569         if (ids.length) {
32570             selectedIDs = ids;
32571         } else {
32572             context.enter(modeBrowse(context));
32573         }
32574         return !!ids.length;
32575     }
32576
32577
32578     // find the common parent ways for nextVertex, previousVertex
32579     function commonParents() {
32580         var graph = context.graph();
32581         var commonParents = [];
32582
32583         for (var i = 0; i < selectedIDs.length; i++) {
32584             var entity = context.hasEntity(selectedIDs[i]);
32585             if (!entity || entity.geometry(graph) !== 'vertex') {
32586                 return [];  // selection includes some not vertexes
32587             }
32588
32589             var currParents = map$3(graph.parentWays(entity), 'id');
32590             if (!commonParents.length) {
32591                 commonParents = currParents;
32592                 continue;
32593             }
32594
32595             commonParents = intersection(commonParents, currParents);
32596             if (!commonParents.length) {
32597                 return [];
32598             }
32599         }
32600
32601         return commonParents;
32602     }
32603
32604
32605     function singularParent() {
32606         var parents = commonParents();
32607         if (!parents || parents.length === 0) {
32608             relatedParent = null;
32609             return null;
32610         }
32611
32612         // relatedParent is used when we visit a vertex with multiple
32613         // parents, and we want to remember which parent line we started on.
32614
32615         if (parents.length === 1) {
32616             relatedParent = parents[0];  // remember this parent for later
32617             return relatedParent;
32618         }
32619
32620         if (parents.indexOf(relatedParent) !== -1) {
32621             return relatedParent;   // prefer the previously seen parent
32622         }
32623
32624         return parents[0];
32625     }
32626
32627
32628     function closeMenu() {
32629         if (editMenu) {
32630             context.surface().call(editMenu.close);
32631         }
32632     }
32633
32634
32635     function positionMenu() {
32636         if (!editMenu) { return; }
32637
32638         var entity = singular();
32639         if (entity && context.geometry(entity.id) === 'relation') {
32640             suppressMenu = true;
32641         } else {
32642             var point$$1 = context.mouse();
32643             var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
32644
32645             if (point$$1 && geoPointInPolygon(point$$1, viewport)) {
32646                 editMenu.center(point$$1);
32647             } else {
32648                 suppressMenu = true;
32649             }
32650         }
32651     }
32652
32653
32654     function showMenu() {
32655         closeMenu();
32656         if (editMenu) {
32657             context.surface().call(editMenu);
32658         }
32659     }
32660
32661
32662     function toggleMenu() {
32663         // deprecation warning - Radial Menu to be removed in iD v3
32664         if (d3_select('.edit-menu, .radial-menu').empty()) {
32665             positionMenu();
32666             showMenu();
32667         } else {
32668             closeMenu();
32669         }
32670     }
32671
32672
32673     mode.selectedIDs = function() {
32674         return selectedIDs;
32675     };
32676
32677
32678     mode.reselect = function() {
32679         if (!checkSelectedIDs()) return;
32680
32681         var surfaceNode = context.surface().node();
32682         if (surfaceNode.focus) {   // FF doesn't support it
32683             surfaceNode.focus();
32684         }
32685
32686         positionMenu();
32687         if (!suppressMenu) {
32688             showMenu();
32689         }
32690     };
32691
32692
32693     mode.newFeature = function(_) {
32694         if (!arguments.length) return newFeature;
32695         newFeature = _;
32696         return mode;
32697     };
32698
32699
32700     mode.suppressMenu = function(_) {
32701         if (!arguments.length) return suppressMenu;
32702         suppressMenu = _;
32703         return mode;
32704     };
32705
32706
32707     mode.follow = function(_) {
32708         if (!arguments.length) return follow;
32709         follow = _;
32710         return mode;
32711     };
32712
32713
32714     mode.enter = function() {
32715
32716         function update() {
32717             closeMenu();
32718             checkSelectedIDs();
32719         }
32720
32721
32722         function dblclick() {
32723             var target = d3_select(event.target);
32724
32725             var datum = target.datum();
32726             var entity = datum && datum.properties && datum.properties.entity;
32727             if (!entity) return;
32728
32729             if (entity instanceof osmWay && target.classed('target')) {
32730                 var choice = geoChooseEdge(context.childNodes(entity), context.mouse(), context.projection);
32731                 var prev = entity.nodes[choice.index - 1];
32732                 var next = entity.nodes[choice.index];
32733
32734                 context.perform(
32735                     actionAddMidpoint({loc: choice.loc, edge: [prev, next]}, osmNode()),
32736                     t('operations.add.annotation.vertex')
32737                 );
32738
32739                 event.preventDefault();
32740                 event.stopPropagation();
32741
32742             } else if (entity.type === 'midpoint') {
32743                 context.perform(
32744                     actionAddMidpoint({loc: entity.loc, edge: entity.edge}, osmNode()),
32745                     t('operations.add.annotation.vertex'));
32746
32747                 event.preventDefault();
32748                 event.stopPropagation();
32749             }
32750         }
32751
32752
32753         function selectElements(drawn) {
32754             if (!checkSelectedIDs()) return;
32755
32756             var surface = context.surface();
32757             var entity = singular();
32758
32759             if (entity && context.geometry(entity.id) === 'relation') {
32760                 suppressMenu = true;
32761                 return;
32762             }
32763
32764             surface.selectAll('.related')
32765                 .classed('related', false);
32766
32767             singularParent();
32768             if (relatedParent) {
32769                 surface.selectAll(utilEntitySelector([relatedParent]))
32770                     .classed('related', true);
32771             }
32772
32773             var selection$$1 = context.surface()
32774                 .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
32775
32776             if (selection$$1.empty()) {
32777                 // Return to browse mode if selected DOM elements have
32778                 // disappeared because the user moved them out of view..
32779                 var source = event && event.type === 'zoom' && event.sourceEvent;
32780                 if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
32781                     context.enter(modeBrowse(context));
32782                 }
32783             } else {
32784                 selection$$1
32785                     .classed('selected', true);
32786             }
32787         }
32788
32789
32790         function esc() {
32791             context.enter(modeBrowse(context));
32792         }
32793
32794
32795         function firstVertex() {
32796             event.preventDefault();
32797             var entity = singular();
32798             var parent = singularParent();
32799             var way;
32800
32801             if (entity && entity.type === 'way') {
32802                 way = entity;
32803             } else if (parent) {
32804                 way = context.entity(parent);
32805             }
32806
32807             if (way) {
32808                 context.enter(
32809                     modeSelect(context, [way.first()]).follow(true)
32810                 );
32811             }
32812         }
32813
32814
32815         function lastVertex() {
32816             event.preventDefault();
32817             var entity = singular();
32818             var parent = singularParent();
32819             var way;
32820
32821             if (entity && entity.type === 'way') {
32822                 way = entity;
32823             } else if (parent) {
32824                 way = context.entity(parent);
32825             }
32826
32827             if (way) {
32828                 context.enter(
32829                     modeSelect(context, [way.last()]).follow(true)
32830                 );
32831             }
32832         }
32833
32834
32835         function previousVertex() {
32836             event.preventDefault();
32837             var parent = singularParent();
32838             if (!parent) return;
32839
32840             var way = context.entity(parent);
32841             var length = way.nodes.length;
32842             var curr = way.nodes.indexOf(selectedIDs[0]);
32843             var index = -1;
32844
32845             if (curr > 0) {
32846                 index = curr - 1;
32847             } else if (way.isClosed()) {
32848                 index = length - 2;
32849             }
32850
32851             if (index !== -1) {
32852                 context.enter(
32853                     modeSelect(context, [way.nodes[index]]).follow(true)
32854                 );
32855             }
32856         }
32857
32858
32859         function nextVertex() {
32860             event.preventDefault();
32861             var parent = singularParent();
32862             if (!parent) return;
32863
32864             var way = context.entity(parent);
32865             var length = way.nodes.length;
32866             var curr = way.nodes.indexOf(selectedIDs[0]);
32867             var index = -1;
32868
32869             if (curr < length - 1) {
32870                 index = curr + 1;
32871             } else if (way.isClosed()) {
32872                 index = 0;
32873             }
32874
32875             if (index !== -1) {
32876                 context.enter(
32877                     modeSelect(context, [way.nodes[index]]).follow(true)
32878                 );
32879             }
32880         }
32881
32882
32883         function nextParent() {
32884             event.preventDefault();
32885             var parents = uniq(commonParents());
32886             if (!parents || parents.length < 2) return;
32887
32888             var index = parents.indexOf(relatedParent);
32889             if (index < 0 || index > parents.length - 2) {
32890                 relatedParent = parents[0];
32891             } else {
32892                 relatedParent = parents[index + 1];
32893             }
32894
32895             var surface = context.surface();
32896             surface.selectAll('.related')
32897                 .classed('related', false);
32898
32899             if (relatedParent) {
32900                 surface.selectAll(utilEntitySelector([relatedParent]))
32901                     .classed('related', true);
32902             }
32903         }
32904
32905
32906         if (!checkSelectedIDs()) return;
32907
32908         var operations = without(values$1(Operations), operationDelete)
32909             .map(function(o) { return o(selectedIDs, context); })
32910             .filter(function(o) { return o.available(); });
32911
32912         // deprecation warning - Radial Menu to be removed in iD v3
32913         var isRadialMenu = context.storage('edit-menu-style') === 'radial';
32914         if (isRadialMenu) {
32915             operations = operations.slice(0,7);
32916             operations.unshift(operationDelete(selectedIDs, context));
32917         } else {
32918             operations.push(operationDelete(selectedIDs, context));
32919         }
32920
32921         operations.forEach(function(operation) {
32922             if (operation.behavior) {
32923                 behaviors.push(operation.behavior);
32924             }
32925         });
32926
32927         behaviors.forEach(function(behavior) {
32928             context.install(behavior);
32929         });
32930
32931         keybinding
32932             .on(['[', 'pgup'], previousVertex)
32933             .on([']', 'pgdown'], nextVertex)
32934             .on(['{', uiCmd('⌘['), 'home'], firstVertex)
32935             .on(['}', uiCmd('⌘]'), 'end'], lastVertex)
32936             .on(['\\', 'pause'], nextParent)
32937             .on('⎋', esc, true)
32938             .on('space', toggleMenu);
32939
32940         d3_select(document)
32941             .call(keybinding);
32942
32943
32944         // deprecation warning - Radial Menu to be removed in iD v3
32945         editMenu = isRadialMenu
32946             ? uiRadialMenu(context, operations)
32947             : uiEditMenu(context, operations);
32948
32949         context.ui().sidebar
32950             .select(singular() ? singular().id : null, newFeature);
32951
32952         context.history()
32953             .on('undone.select', update)
32954             .on('redone.select', update);
32955
32956         context.map()
32957             .on('move.select', closeMenu)
32958             .on('drawn.select', selectElements);
32959
32960         context.surface()
32961             .on('dblclick.select', dblclick);
32962
32963
32964         selectElements();
32965
32966         if (selectedIDs.length > 1) {
32967             var entities = uiSelectionList(context, selectedIDs);
32968             context.ui().sidebar.show(entities);
32969         }
32970
32971         if (follow) {
32972             var extent = geoExtent$$1();
32973             var graph = context.graph();
32974             selectedIDs.forEach(function(id) {
32975                 var entity = context.entity(id);
32976                 extent._extend(entity.extent(graph));
32977             });
32978
32979             var loc = extent.center();
32980             context.map().centerEase(loc);
32981         } else if (singular() && singular().type === 'way') {
32982             context.map().pan([0,0]);  // full redraw, to adjust z-sorting #2914
32983         }
32984
32985         timeout = window.setTimeout(function() {
32986             positionMenu();
32987             if (!suppressMenu) {
32988                 showMenu();
32989             }
32990         }, 270);  /* after any centerEase completes */
32991
32992     };
32993
32994
32995     mode.exit = function() {
32996         if (timeout) window.clearTimeout(timeout);
32997         if (inspector) wrap.call(inspector.close);
32998
32999         behaviors.forEach(function(behavior) {
33000             context.uninstall(behavior);
33001         });
33002
33003         keybinding.off();
33004         closeMenu();
33005         editMenu = undefined;
33006
33007         context.history()
33008             .on('undone.select', null)
33009             .on('redone.select', null);
33010
33011         var surface = context.surface();
33012
33013         surface
33014             .on('dblclick.select', null);
33015
33016         surface
33017             .selectAll('.selected')
33018             .classed('selected', false);
33019
33020         surface
33021             .selectAll('.related')
33022             .classed('related', false);
33023
33024         context.map().on('drawn.select', null);
33025         context.ui().sidebar.hide();
33026     };
33027
33028
33029     return mode;
33030 }
33031
33032 function behaviorAddWay(context) {
33033     var dispatch$$1 = dispatch('start', 'startFromWay', 'startFromNode'),
33034         draw = behaviorDraw(context);
33035
33036     var addWay = function(surface) {
33037         draw.on('click', function() { dispatch$$1.apply('start', this, arguments); })
33038             .on('clickWay', function() { dispatch$$1.apply('startFromWay', this, arguments); })
33039             .on('clickNode', function() { dispatch$$1.apply('startFromNode', this, arguments); })
33040             .on('cancel', addWay.cancel)
33041             .on('finish', addWay.cancel);
33042
33043         context.map()
33044             .dblclickEnable(false);
33045
33046         surface.call(draw);
33047     };
33048
33049
33050     addWay.off = function(surface) {
33051         surface.call(draw.off);
33052     };
33053
33054
33055     addWay.cancel = function() {
33056         window.setTimeout(function() {
33057             context.map().dblclickEnable(true);
33058         }, 1000);
33059
33060         context.enter(modeBrowse(context));
33061     };
33062
33063
33064     addWay.tail = function(text) {
33065         draw.tail(text);
33066         return addWay;
33067     };
33068
33069
33070     return utilRebind(addWay, dispatch$$1, 'on');
33071 }
33072
33073 function behaviorBreathe() {
33074     var duration = 800,
33075         steps = 4,
33076         selector$$1 = '.selected.shadow, .selected .shadow',
33077         selected = d3_select(null),
33078         classed = '',
33079         params = {},
33080         done = false,
33081         timer$$1;
33082
33083
33084     function ratchetyInterpolator(a, b, steps, units) {
33085         a = parseFloat(a);
33086         b = parseFloat(b);
33087         var sample = quantize()
33088             .domain([0, 1])
33089             .range(d3_quantize(d3_interpolateNumber(a, b), steps));
33090
33091         return function(t) {
33092             return String(sample(t)) + (units || '');
33093         };
33094     }
33095
33096
33097     function reset(selection$$1) {
33098         selection$$1
33099             .style('stroke-opacity', null)
33100             .style('stroke-width', null)
33101             .style('fill-opacity', null)
33102             .style('r', null);
33103     }
33104
33105
33106     function setAnimationParams(transition, fromTo) {
33107         var toFrom = (fromTo === 'from' ? 'to' : 'from');
33108
33109         transition
33110             .styleTween('stroke-opacity', function(d) {
33111                 return ratchetyInterpolator(
33112                     params[d.id][toFrom].opacity,
33113                     params[d.id][fromTo].opacity,
33114                     steps
33115                 );
33116             })
33117             .styleTween('stroke-width', function(d) {
33118                 return ratchetyInterpolator(
33119                     params[d.id][toFrom].width,
33120                     params[d.id][fromTo].width,
33121                     steps,
33122                     'px'
33123                 );
33124             })
33125             .styleTween('fill-opacity', function(d) {
33126                 return ratchetyInterpolator(
33127                     params[d.id][toFrom].opacity,
33128                     params[d.id][fromTo].opacity,
33129                     steps
33130                 );
33131             })
33132             .styleTween('r', function(d) {
33133                 return ratchetyInterpolator(
33134                     params[d.id][toFrom].width,
33135                     params[d.id][fromTo].width,
33136                     steps,
33137                     'px'
33138                 );
33139             });
33140     }
33141
33142
33143     function calcAnimationParams(selection$$1) {
33144         selection$$1
33145             .call(reset)
33146             .each(function(d) {
33147                 var s = d3_select(this),
33148                     tag = s.node().tagName,
33149                     p = {'from': {}, 'to': {}},
33150                     opacity, width;
33151
33152                 // determine base opacity and width
33153                 if (tag === 'circle') {
33154                     opacity = parseFloat(s.style('fill-opacity') || 0.5);
33155                     width = parseFloat(s.style('r') || 15.5);
33156                 } else {
33157                     opacity = parseFloat(s.style('stroke-opacity') || 0.7);
33158                     width = parseFloat(s.style('stroke-width') || 10);
33159                 }
33160
33161                 // calculate from/to interpolation params..
33162                 p.tag = tag;
33163                 p.from.opacity = opacity * 0.6;
33164                 p.to.opacity = opacity * 1.25;
33165                 p.from.width = width * 0.7;
33166                 p.to.width = width * (tag === 'circle' ? 1.5 : 1);
33167                 params[d.id] = p;
33168             });
33169     }
33170
33171
33172     function run(surface, fromTo) {
33173         var toFrom = (fromTo === 'from' ? 'to' : 'from'),
33174             currSelected = surface.selectAll(selector$$1),
33175             currClassed = surface.attr('class');
33176
33177         if (done || currSelected.empty()) {
33178             selected.call(reset);
33179             return;
33180         }
33181
33182         if (!isEqual(currSelected.data(), selected.data()) || currClassed !== classed) {
33183             selected.call(reset);
33184             classed = currClassed;
33185             selected = currSelected.call(calcAnimationParams);
33186         }
33187
33188         selected
33189             .transition()
33190             .duration(duration)
33191             .call(setAnimationParams, fromTo)
33192             .on('end', function() {
33193                 surface.call(run, toFrom);
33194             });
33195     }
33196
33197
33198     var breathe = function(surface) {
33199         done = false;
33200         timer$$1 = timer(function() {
33201             // wait for elements to actually become selected
33202             if (surface.selectAll(selector$$1).empty()) {
33203                 return false;
33204             }
33205
33206             surface.call(run, 'from');
33207             timer$$1.stop();
33208             return true;
33209         }, 20);
33210     };
33211
33212
33213     breathe.off = function() {
33214         done = true;
33215         if (timer$$1) {
33216             timer$$1.stop();
33217         }
33218         selected
33219             .interrupt()
33220             .call(reset);
33221     };
33222
33223
33224     return breathe;
33225 }
33226
33227 function behaviorCopy(context) {
33228     var keybinding = d3keybinding('copy');
33229
33230
33231     function groupEntities(ids, graph) {
33232         var entities = ids.map(function (id) { return graph.entity(id); });
33233         return assignIn({relation: [], way: [], node: []},
33234             groupBy(entities, function(entity) { return entity.type; }));
33235     }
33236
33237
33238     function getDescendants(id, graph, descendants) {
33239         var entity = graph.entity(id),
33240             i, children;
33241
33242         descendants = descendants || {};
33243
33244         if (entity.type === 'relation') {
33245             children = map$3(entity.members, 'id');
33246         } else if (entity.type === 'way') {
33247             children = entity.nodes;
33248         } else {
33249             children = [];
33250         }
33251
33252         for (i = 0; i < children.length; i++) {
33253             if (!descendants[children[i]]) {
33254                 descendants[children[i]] = true;
33255                 descendants = getDescendants(children[i], graph, descendants);
33256             }
33257         }
33258
33259         return descendants;
33260     }
33261
33262
33263     function doCopy() {
33264         if (!getSelectionText()) event.preventDefault();
33265
33266         var graph = context.graph(),
33267             selected = groupEntities(context.selectedIDs(), graph),
33268             canCopy = [],
33269             skip = {},
33270             i, entity;
33271
33272         for (i = 0; i < selected.relation.length; i++) {
33273             entity = selected.relation[i];
33274             if (!skip[entity.id] && entity.isComplete(graph)) {
33275                 canCopy.push(entity.id);
33276                 skip = getDescendants(entity.id, graph, skip);
33277             }
33278         }
33279         for (i = 0; i < selected.way.length; i++) {
33280             entity = selected.way[i];
33281             if (!skip[entity.id]) {
33282                 canCopy.push(entity.id);
33283                 skip = getDescendants(entity.id, graph, skip);
33284             }
33285         }
33286         for (i = 0; i < selected.node.length; i++) {
33287             entity = selected.node[i];
33288             if (!skip[entity.id]) {
33289                 canCopy.push(entity.id);
33290             }
33291         }
33292
33293         context.copyIDs(canCopy);
33294     }
33295
33296
33297     function copy() {
33298         keybinding.on(uiCmd('⌘C'), doCopy);
33299         d3_select(document).call(keybinding);
33300         return copy;
33301     }
33302
33303     function getSelectionText() {
33304         return window.getSelection().toString();
33305     }
33306
33307     copy.off = function() {
33308         d3_select(document).call(keybinding.off);
33309     };
33310
33311
33312     return copy;
33313 }
33314
33315 /*
33316     `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
33317
33318     * The `origin` function is expected to return an [x, y] tuple rather than an
33319       {x, y} object.
33320     * The events are `start`, `move`, and `end`.
33321       (https://github.com/mbostock/d3/issues/563)
33322     * The `start` event is not dispatched until the first cursor movement occurs.
33323       (https://github.com/mbostock/d3/pull/368)
33324     * The `move` event has a `point` and `delta` [x, y] tuple properties rather
33325       than `x`, `y`, `dx`, and `dy` properties.
33326     * The `end` event is not dispatched if no movement occurs.
33327     * An `off` function is available that unbinds the drag's internal event handlers.
33328  */
33329
33330 function behaviorDrag() {
33331     var dispatch$$1 = dispatch('start', 'move', 'end');
33332     var _origin = null;
33333     var _selector = '';
33334     var _event;
33335     var _target;
33336     var _surface;
33337
33338
33339     var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect');
33340     var d3_event_userSelectSuppress = function() {
33341             var selection$$1 = selection();
33342             var select$$1 = selection$$1.style(d3_event_userSelectProperty);
33343             selection$$1.style(d3_event_userSelectProperty, 'none');
33344             return function() {
33345                 selection$$1.style(d3_event_userSelectProperty, select$$1);
33346             };
33347         };
33348
33349
33350     function d3_eventCancel() {
33351         event.stopPropagation();
33352         event.preventDefault();
33353     }
33354
33355
33356     function eventOf(thiz, argumentz) {
33357         return function(e1) {
33358             e1.target = drag;
33359             customEvent(e1, dispatch$$1.apply, dispatch$$1, [e1.type, thiz, argumentz]);
33360         };
33361     }
33362
33363
33364     function dragstart() {
33365         _target = this;
33366         _event = eventOf(_target, arguments);
33367
33368         var eventTarget = event.target;
33369         var touchId = event.touches ? event.changedTouches[0].identifier : null;
33370         var offset;
33371         var startOrigin = point$$1();
33372         var started = false;
33373         var selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
33374
33375         d3_select(window)
33376             .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
33377             .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
33378
33379         if (_origin) {
33380             offset = _origin.apply(_target, arguments);
33381             offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
33382         } else {
33383             offset = [0, 0];
33384         }
33385
33386         if (touchId === null) {
33387             event.stopPropagation();
33388         }
33389
33390
33391         function point$$1() {
33392             var p = _surface || _target.parentNode;
33393             return touchId !== null ? d3_touches(p).filter(function(p) {
33394                 return p.identifier === touchId;
33395             })[0] : d3_mouse(p);
33396         }
33397
33398
33399         function dragmove() {
33400             var p = point$$1();
33401             var dx = p[0] - startOrigin[0];
33402             var dy = p[1] - startOrigin[1];
33403
33404             if (dx === 0 && dy === 0)
33405                 return;
33406
33407             startOrigin = p;
33408             d3_eventCancel();
33409
33410             if (!started) {
33411                 started = true;
33412                 _event({ type: 'start' });
33413             } else {
33414                 _event({
33415                     type: 'move',
33416                     point: [p[0] + offset[0],  p[1] + offset[1]],
33417                     delta: [dx, dy]
33418                 });
33419             }
33420         }
33421
33422
33423         function dragend() {
33424             if (started) {
33425                 _event({ type: 'end' });
33426
33427                 d3_eventCancel();
33428                 if (event.target === eventTarget) {
33429                     d3_select(window)
33430                         .on('click.drag', click, true);
33431                 }
33432             }
33433
33434             d3_select(window)
33435                 .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
33436                 .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
33437
33438             selectEnable();
33439         }
33440
33441
33442         function click() {
33443             d3_eventCancel();
33444             d3_select(window)
33445                 .on('click.drag', null);
33446         }
33447     }
33448
33449
33450     function drag(selection$$1) {
33451         var matchesSelector = utilPrefixDOMProperty('matchesSelector');
33452         var delegate = dragstart;
33453
33454         if (_selector) {
33455             delegate = function() {
33456                 var root = this;
33457                 var target = event.target;
33458                 for (; target && target !== root; target = target.parentNode) {
33459                     var datum = target.__data__;
33460                     var entity = datum && datum.properties && datum.properties.entity;
33461                     if (entity && target[matchesSelector](_selector)) {
33462                         return dragstart.call(target, entity);
33463                     }
33464                 }
33465             };
33466         }
33467
33468         selection$$1
33469             .on('mousedown.drag' + _selector, delegate)
33470             .on('touchstart.drag' + _selector, delegate);
33471     }
33472
33473
33474     drag.off = function(selection$$1) {
33475         selection$$1
33476             .on('mousedown.drag' + _selector, null)
33477             .on('touchstart.drag' + _selector, null);
33478     };
33479
33480
33481     drag.selector = function(_) {
33482         if (!arguments.length) return _selector;
33483         _selector = _;
33484         return drag;
33485     };
33486
33487
33488     drag.origin = function (_) {
33489         if (!arguments.length) return _origin;
33490         _origin = _;
33491         return drag;
33492     };
33493
33494
33495     drag.cancel = function() {
33496         d3_select(window)
33497             .on('mousemove.drag', null)
33498             .on('mouseup.drag', null);
33499         return drag;
33500     };
33501
33502
33503     drag.target = function() {
33504         if (!arguments.length) return _target;
33505         _target = arguments[0];
33506         _event = eventOf(_target, Array.prototype.slice.call(arguments, 1));
33507         return drag;
33508     };
33509
33510
33511     drag.surface = function() {
33512         if (!arguments.length) return _surface;
33513         _surface = arguments[0];
33514         return drag;
33515     };
33516
33517
33518     return utilRebind(drag, dispatch$$1, 'on');
33519 }
33520
33521 function behaviorDrawWay(context, wayId, index, mode, startGraph) {
33522     var origWay = context.entity(wayId);
33523     var annotation = t((origWay.isDegenerate() ?
33524         'operations.start.annotation.' :
33525         'operations.continue.annotation.') + context.geometry(wayId)
33526     );
33527     var behavior = behaviorDraw(context);
33528     var _tempEdits = 0;
33529
33530     var end = osmNode({ loc: context.map().mouseCoordinates() });
33531
33532     // Push an annotated state for undo to return back to.
33533     // We must make sure to remove this edit later.
33534     context.perform(actionNoop(), annotation);
33535     _tempEdits++;
33536
33537     // Add the drawing node to the graph.
33538     // We must make sure to remove this edit later.
33539     context.perform(_actionAddDrawNode());
33540     _tempEdits++;
33541
33542
33543
33544     function keydown() {
33545         if (event.keyCode === d3keybinding.modifierCodes.alt) {
33546             if (context.surface().classed('nope')) {
33547                 context.surface()
33548                     .classed('nope-suppressed', true);
33549             }
33550             context.surface()
33551                 .classed('nope', false)
33552                 .classed('nope-disabled', true);
33553         }
33554     }
33555
33556
33557     function keyup() {
33558         if (event.keyCode === d3keybinding.modifierCodes.alt) {
33559             if (context.surface().classed('nope-suppressed')) {
33560                 context.surface()
33561                     .classed('nope', true);
33562             }
33563             context.surface()
33564                 .classed('nope-suppressed', false)
33565                 .classed('nope-disabled', false);
33566         }
33567     }
33568
33569
33570     // related code
33571     // - `mode/drag_node.js`     `doMode()`
33572     // - `behavior/draw.js`      `click()`
33573     // - `behavior/draw_way.js`  `move()`
33574     function move(datum) {
33575         context.surface().classed('nope-disabled', event.altKey);
33576
33577         var targetLoc = datum && datum.properties && datum.properties.entity && datum.properties.entity.loc;
33578         var targetNodes = datum && datum.properties && datum.properties.nodes;
33579         var loc = context.map().mouseCoordinates();
33580
33581         if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
33582             loc = targetLoc;
33583
33584         } else if (targetNodes) {   // snap to way - a line target with `.nodes`
33585             var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
33586             if (choice) {
33587                 loc = choice.loc;
33588             }
33589         }
33590
33591         context.replace(actionMoveNode(end.id, loc));
33592         end = context.entity(end.id);
33593         checkGeometry(false);
33594     }
33595
33596
33597     // Check whether this edit causes the geometry to break.
33598     // If so, class the surface with a nope cursor.
33599     // `finishDraw` - Only checks the relevant line segments if finishing drawing
33600     function checkGeometry(finishDraw) {
33601         var nopeDisabled = context.surface().classed('nope-disabled');
33602         var isInvalid = isInvalidGeometry(end, context.graph(), finishDraw);
33603
33604         if (nopeDisabled) {
33605             context.surface()
33606                 .classed('nope', false)
33607                 .classed('nope-suppressed', isInvalid);
33608         } else {
33609             context.surface()
33610                 .classed('nope', isInvalid)
33611                 .classed('nope-suppressed', false);
33612         }
33613     }
33614
33615
33616     function isInvalidGeometry(entity, graph, finishDraw) {
33617         var parents = graph.parentWays(entity);
33618
33619         for (var i = 0; i < parents.length; i++) {
33620             var parent = parents[i];
33621             var nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
33622             
33623             if (origWay.isClosed()) { // Check if Area
33624                 if (finishDraw) {
33625                     nodes.splice(-2, 1);
33626                     entity = nodes[nodes.length-2];
33627                 } else {
33628                     nodes.pop();
33629                 }
33630             } else { // Line
33631                 if (finishDraw) {
33632                     nodes.pop();
33633                 }
33634             }
33635
33636             if (geoHasSelfIntersections(nodes, entity.id)) {
33637                 return true;
33638             }
33639         }
33640
33641         return false;
33642     }
33643
33644
33645     function undone() {
33646         // Undo popped the history back to the initial annotated no-op edit.
33647         // Remove initial no-op edit and whatever edit happened immediately before it.
33648         context.pop(2);
33649         _tempEdits = 0;
33650
33651         if (context.hasEntity(wayId)) {
33652             context.enter(mode);
33653         } else {
33654             context.enter(modeBrowse(context));
33655         }
33656     }
33657
33658
33659     function setActiveElements() {
33660         context.surface().selectAll('.' + end.id)
33661             .classed('active', true);
33662     }
33663
33664
33665     var drawWay = function(surface) {
33666         behavior
33667             .on('move', move)
33668             .on('click', drawWay.add)
33669             .on('clickWay', drawWay.addWay)
33670             .on('clickNode', drawWay.addNode)
33671             .on('undo', context.undo)
33672             .on('cancel', drawWay.cancel)
33673             .on('finish', drawWay.finish);
33674
33675         d3_select(window)
33676             .on('keydown.drawWay', keydown)
33677             .on('keyup.drawWay', keyup);
33678
33679         context.map()
33680             .dblclickEnable(false)
33681             .on('drawn.draw', setActiveElements);
33682
33683         setActiveElements();
33684
33685         surface.call(behavior);
33686
33687         context.history()
33688             .on('undone.draw', undone);
33689     };
33690
33691
33692     drawWay.off = function(surface) {
33693         // Drawing was interrupted unexpectedly.
33694         // This can happen if the user changes modes,
33695         // clicks geolocate button, a hashchange event occurs, etc.
33696         if (_tempEdits) {
33697             context.pop(_tempEdits);
33698             while (context.graph() !== startGraph) {
33699                 context.pop();
33700             }
33701         }
33702
33703         context.map()
33704             .on('drawn.draw', null);
33705
33706         surface.call(behavior.off)
33707             .selectAll('.active')
33708             .classed('active', false);
33709
33710         surface
33711             .classed('nope', false)
33712             .classed('nope-suppressed', false)
33713             .classed('nope-disabled', false);
33714
33715         d3_select(window)
33716             .on('keydown.hover', null)
33717             .on('keyup.hover', null);
33718
33719         context.history()
33720             .on('undone.draw', null);
33721     };
33722
33723
33724     function _actionAddDrawNode() {
33725         return function(graph) {
33726             return graph
33727                 .replace(end)
33728                 .replace(origWay.addNode(end.id, index));
33729         };
33730     }
33731
33732
33733     function _actionReplaceDrawNode(newNode) {
33734         return function(graph) {
33735             return graph
33736                 .replace(origWay.addNode(newNode.id, index))
33737                 .remove(end);
33738         };
33739     }
33740
33741
33742     // Accept the current position of the drawing node and continue drawing.
33743     drawWay.add = function(loc, d) {
33744         if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
33745             return;   // can't click here
33746         }
33747
33748         context.pop(_tempEdits);
33749         _tempEdits = 0;
33750
33751         context.perform(
33752             _actionAddDrawNode(),
33753             annotation
33754         );
33755
33756         checkGeometry(false);   // finishDraw = false
33757         context.enter(mode);
33758     };
33759
33760
33761     // Connect the way to an existing way.
33762     drawWay.addWay = function(loc, edge, d) {
33763         if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
33764             return;   // can't click here
33765         }
33766
33767         context.pop(_tempEdits);
33768         _tempEdits = 0;
33769
33770         context.perform(
33771             _actionAddDrawNode(),
33772             actionAddMidpoint({ loc: loc, edge: edge }, end),
33773             annotation
33774         );
33775
33776         checkGeometry(false);   // finishDraw = false
33777         context.enter(mode);
33778     };
33779
33780
33781     // Connect the way to an existing node and continue drawing.
33782     drawWay.addNode = function(node, d) {
33783         if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
33784             return;   // can't click here
33785         }
33786
33787         context.pop(_tempEdits);
33788         _tempEdits = 0;
33789
33790         context.perform(
33791             _actionReplaceDrawNode(node),
33792             annotation
33793         );
33794
33795         checkGeometry(false);   // finishDraw = false
33796         context.enter(mode);
33797     };
33798
33799
33800     // Finish the draw operation, removing the temporary edits.
33801     // If the way has enough nodes to be valid, it's selected.
33802     // Otherwise, delete everything and return to browse mode.
33803     drawWay.finish = function() {
33804         checkGeometry(true);   // finishDraw = true
33805         if (context.surface().classed('nope')) {
33806             return;   // can't click here
33807         }
33808
33809         context.pop(_tempEdits);
33810         _tempEdits = 0;
33811
33812         var way = context.hasEntity(wayId);
33813         if (!way || way.isDegenerate()) {
33814             drawWay.cancel();
33815             return;
33816         }
33817
33818         window.setTimeout(function() {
33819             context.map().dblclickEnable(true);
33820         }, 1000);
33821
33822         context.enter(modeSelect(context, [wayId]).newFeature(true));
33823     };
33824
33825
33826     // Cancel the draw operation, delete everything, and return to browse mode.
33827     drawWay.cancel = function() {
33828         context.pop(_tempEdits);
33829         _tempEdits = 0;
33830
33831         while (context.graph() !== startGraph) {
33832             context.pop();
33833         }
33834
33835         window.setTimeout(function() {
33836             context.map().dblclickEnable(true);
33837         }, 1000);
33838
33839         context.surface()
33840             .classed('nope', false)
33841             .classed('nope-disabled', false)
33842             .classed('nope-suppressed', false);
33843
33844         context.enter(modeBrowse(context));
33845     };
33846
33847
33848     drawWay.activeID = function() {
33849         if (!arguments.length) return end.id;
33850         // no assign
33851         return drawWay;
33852     };
33853
33854
33855     drawWay.tail = function(text) {
33856         behavior.tail(text);
33857         return drawWay;
33858     };
33859
33860
33861     return drawWay;
33862 }
33863
33864 /** Error message constants. */
33865 var FUNC_ERROR_TEXT$3 = 'Expected a function';
33866
33867 /**
33868  * Creates a throttled function that only invokes `func` at most once per
33869  * every `wait` milliseconds. The throttled function comes with a `cancel`
33870  * method to cancel delayed `func` invocations and a `flush` method to
33871  * immediately invoke them. Provide `options` to indicate whether `func`
33872  * should be invoked on the leading and/or trailing edge of the `wait`
33873  * timeout. The `func` is invoked with the last arguments provided to the
33874  * throttled function. Subsequent calls to the throttled function return the
33875  * result of the last `func` invocation.
33876  *
33877  * **Note:** If `leading` and `trailing` options are `true`, `func` is
33878  * invoked on the trailing edge of the timeout only if the throttled function
33879  * is invoked more than once during the `wait` timeout.
33880  *
33881  * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
33882  * until to the next tick, similar to `setTimeout` with a timeout of `0`.
33883  *
33884  * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
33885  * for details over the differences between `_.throttle` and `_.debounce`.
33886  *
33887  * @static
33888  * @memberOf _
33889  * @since 0.1.0
33890  * @category Function
33891  * @param {Function} func The function to throttle.
33892  * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
33893  * @param {Object} [options={}] The options object.
33894  * @param {boolean} [options.leading=true]
33895  *  Specify invoking on the leading edge of the timeout.
33896  * @param {boolean} [options.trailing=true]
33897  *  Specify invoking on the trailing edge of the timeout.
33898  * @returns {Function} Returns the new throttled function.
33899  * @example
33900  *
33901  * // Avoid excessively updating the position while scrolling.
33902  * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
33903  *
33904  * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
33905  * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
33906  * jQuery(element).on('click', throttled);
33907  *
33908  * // Cancel the trailing throttled invocation.
33909  * jQuery(window).on('popstate', throttled.cancel);
33910  */
33911 function throttle(func, wait, options) {
33912   var leading = true,
33913       trailing = true;
33914
33915   if (typeof func != 'function') {
33916     throw new TypeError(FUNC_ERROR_TEXT$3);
33917   }
33918   if (isObject(options)) {
33919     leading = 'leading' in options ? !!options.leading : leading;
33920     trailing = 'trailing' in options ? !!options.trailing : trailing;
33921   }
33922   return debounce(func, wait, {
33923     'leading': leading,
33924     'maxWait': wait,
33925     'trailing': trailing
33926   });
33927 }
33928
33929 function behaviorHash(context) {
33930     var s0 = null, // cached window.location.hash
33931         lat = 90 - 1e-8; // allowable latitude range
33932
33933
33934     var parser = function(map, s) {
33935         var q = utilStringQs(s);
33936         var args = (q.map || '').split('/').map(Number);
33937
33938         if (args.length < 3 || args.some(isNaN)) {
33939             return true; // replace bogus hash
33940
33941         } else if (s !== formatter(map).slice(1)) {   // hash has changed
33942             var mode = context.mode(),
33943                 dist = geoSphericalDistance(map.center(), [args[2], args[1]]),
33944                 maxdist = 500;
33945
33946             // Don't allow the hash location to change too much while drawing
33947             // This can happen if the user accidently hit the back button.  #3996
33948             if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
33949                 context.enter(modeBrowse(context));
33950             }
33951
33952             map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
33953         }
33954     };
33955
33956
33957     var formatter = function(map) {
33958         var center = map.center(),
33959             zoom = map.zoom(),
33960             precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2)),
33961             q = omit(utilStringQs(window.location.hash.substring(1)),
33962                 ['comment', 'hashtags', 'walkthrough']
33963             ),
33964             newParams = {};
33965
33966         delete q.id;
33967         var selected = context.selectedIDs().filter(function(id) {
33968             return !context.entity(id).isNew();
33969         });
33970         if (selected.length) {
33971             newParams.id = selected.join(',');
33972         }
33973
33974         newParams.map = zoom.toFixed(2) +
33975             '/' + center[1].toFixed(precision) +
33976             '/' + center[0].toFixed(precision);
33977
33978         return '#' + utilQsString(assign(q, newParams), true);
33979     };
33980
33981
33982     function update() {
33983         if (context.inIntro()) return;
33984         var s1 = formatter(context.map());
33985         if (s0 !== s1) {
33986             window.location.replace(s0 = s1);  // don't recenter the map!
33987         }
33988     }
33989
33990
33991     var throttledUpdate = throttle(update, 500);
33992
33993
33994     function hashchange() {
33995         if (window.location.hash === s0) return;  // ignore spurious hashchange events
33996         if (parser(context.map(), (s0 = window.location.hash).substring(1))) {
33997             update(); // replace bogus hash
33998         }
33999     }
34000
34001
34002     function hash() {
34003         context.map()
34004             .on('move.hash', throttledUpdate);
34005
34006         context
34007             .on('enter.hash', throttledUpdate);
34008
34009         d3_select(window)
34010             .on('hashchange.hash', hashchange);
34011
34012         if (window.location.hash) {
34013
34014             var q = utilStringQs(window.location.hash.substring(1));
34015
34016             if (q.id) {
34017                 context.zoomToEntity(q.id.split(',')[0], !q.map);
34018             }
34019
34020             if (q.comment) {
34021                 context.storage('comment', q.comment);
34022                 context.storage('commentDate', Date.now());
34023             }
34024
34025             if (q.hashtags) {
34026                 context.storage('hashtags', q.hashtags);
34027             }
34028
34029             if (q.walkthrough === 'true') {
34030                 hash.startWalkthrough = true;
34031             }
34032
34033             hashchange();
34034
34035             if (q.map) {
34036                 hash.hadHash = true;
34037             }
34038         }
34039     }
34040
34041
34042     hash.off = function() {
34043         throttledUpdate.cancel();
34044
34045         context.map()
34046             .on('move.hash', null);
34047
34048         context
34049             .on('enter.hash', null);
34050
34051         d3_select(window)
34052             .on('hashchange.hash', null);
34053
34054         window.location.hash = '';
34055     };
34056
34057
34058     return hash;
34059 }
34060
34061 function behaviorLasso(context) {
34062
34063     var behavior = function(selection$$1) {
34064         var lasso;
34065
34066
34067         function mousedown() {
34068             var button = 0;  // left
34069             if (event.button === button && event.shiftKey === true) {
34070                 lasso = null;
34071
34072                 d3_select(window)
34073                     .on('mousemove.lasso', mousemove)
34074                     .on('mouseup.lasso', mouseup);
34075
34076                 event.stopPropagation();
34077             }
34078         }
34079
34080
34081         function mousemove() {
34082             if (!lasso) {
34083                 lasso = uiLasso(context);
34084                 context.surface().call(lasso);
34085             }
34086
34087             lasso.p(context.mouse());
34088         }
34089
34090
34091         function normalize(a, b) {
34092             return [
34093                 [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
34094                 [Math.max(a[0], b[0]), Math.max(a[1], b[1])]];
34095         }
34096
34097
34098         function lassoed() {
34099             if (!lasso) return [];
34100
34101             var graph = context.graph(),
34102                 bounds = lasso.extent().map(context.projection.invert),
34103                 extent = geoExtent$$1(normalize(bounds[0], bounds[1]));
34104
34105             return map$3(context.intersects(extent).filter(function(entity) {
34106                 return entity.type === 'node' &&
34107                     geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) &&
34108                     !context.features().isHidden(entity, graph, entity.geometry(graph));
34109             }), 'id');
34110         }
34111
34112
34113         function mouseup() {
34114             d3_select(window)
34115                 .on('mousemove.lasso', null)
34116                 .on('mouseup.lasso', null);
34117
34118             if (!lasso) return;
34119
34120             var ids = lassoed();
34121             lasso.close();
34122
34123             if (ids.length) {
34124                 context.enter(modeSelect(context, ids));
34125             }
34126         }
34127
34128         selection$$1
34129             .on('mousedown.lasso', mousedown);
34130     };
34131
34132
34133     behavior.off = function(selection$$1) {
34134         selection$$1.on('mousedown.lasso', null);
34135     };
34136
34137
34138     return behavior;
34139 }
34140
34141 /* Creates a keybinding behavior for an operation */
34142 function behaviorOperation() {
34143     var _operation, keybinding;
34144
34145     var behavior = function () {
34146         if (_operation && _operation.available()) {
34147             keybinding = d3keybinding('behavior.key.' + _operation.id);
34148             keybinding.on(_operation.keys, function() {
34149                 event.preventDefault();
34150                 var disabled = _operation.disabled();
34151                 var flash;
34152
34153                 if (disabled) {
34154                     flash = uiFlash()
34155                         .duration(4000)
34156                         .iconName('#operation-' + _operation.id)
34157                         .iconClass('operation disabled')
34158                         .text(_operation.tooltip);
34159
34160                     flash();
34161
34162                 } else {
34163                     flash = uiFlash()
34164                         .duration(2000)
34165                         .iconName('#operation-' + _operation.id)
34166                         .iconClass('operation')
34167                         .text(_operation.annotation() || _operation.title);
34168
34169                     flash();
34170                     _operation();
34171                 }
34172             });
34173
34174             d3_select(document).call(keybinding);
34175         }
34176
34177         return behavior;
34178     };
34179
34180
34181     behavior.off = function() {
34182         if (keybinding) {
34183             d3_select(document).call(keybinding.off);
34184         }
34185     };
34186
34187
34188     behavior.which = function (_) {
34189         if (!arguments.length) return _operation;
34190         _operation = _;
34191         return behavior;
34192     };
34193
34194
34195     return behavior;
34196 }
34197
34198 /**
34199  * The base implementation of `_.invert` and `_.invertBy` which inverts
34200  * `object` with values transformed by `iteratee` and set by `setter`.
34201  *
34202  * @private
34203  * @param {Object} object The object to iterate over.
34204  * @param {Function} setter The function to set `accumulator` values.
34205  * @param {Function} iteratee The iteratee to transform values.
34206  * @param {Object} accumulator The initial inverted object.
34207  * @returns {Function} Returns `accumulator`.
34208  */
34209 function baseInverter(object, setter, iteratee, accumulator) {
34210   baseForOwn(object, function(value, key, object) {
34211     setter(accumulator, iteratee(value), key, object);
34212   });
34213   return accumulator;
34214 }
34215
34216 /**
34217  * Creates a function like `_.invertBy`.
34218  *
34219  * @private
34220  * @param {Function} setter The function to set accumulator values.
34221  * @param {Function} toIteratee The function to resolve iteratees.
34222  * @returns {Function} Returns the new inverter function.
34223  */
34224 function createInverter(setter, toIteratee) {
34225   return function(object, iteratee) {
34226     return baseInverter(object, setter, toIteratee(iteratee), {});
34227   };
34228 }
34229
34230 /** Used for built-in method references. */
34231 var objectProto$19 = Object.prototype;
34232
34233 /**
34234  * Used to resolve the
34235  * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
34236  * of values.
34237  */
34238 var nativeObjectToString$2 = objectProto$19.toString;
34239
34240 /**
34241  * Creates an object composed of the inverted keys and values of `object`.
34242  * If `object` contains duplicate values, subsequent values overwrite
34243  * property assignments of previous values.
34244  *
34245  * @static
34246  * @memberOf _
34247  * @since 0.7.0
34248  * @category Object
34249  * @param {Object} object The object to invert.
34250  * @returns {Object} Returns the new inverted object.
34251  * @example
34252  *
34253  * var object = { 'a': 1, 'b': 2, 'c': 1 };
34254  *
34255  * _.invert(object);
34256  * // => { '1': 'c', '2': 'b' }
34257  */
34258 var invert = createInverter(function(result, value, key) {
34259   if (value != null &&
34260       typeof value.toString != 'function') {
34261     value = nativeObjectToString$2.call(value);
34262   }
34263
34264   result[value] = key;
34265 }, constant$13(identity$8));
34266
34267 /**
34268  * Creates an object with the same keys as `object` and values generated
34269  * by running each own enumerable string keyed property of `object` thru
34270  * `iteratee`. The iteratee is invoked with three arguments:
34271  * (value, key, object).
34272  *
34273  * @static
34274  * @memberOf _
34275  * @since 2.4.0
34276  * @category Object
34277  * @param {Object} object The object to iterate over.
34278  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
34279  * @returns {Object} Returns the new mapped object.
34280  * @see _.mapKeys
34281  * @example
34282  *
34283  * var users = {
34284  *   'fred':    { 'user': 'fred',    'age': 40 },
34285  *   'pebbles': { 'user': 'pebbles', 'age': 1 }
34286  * };
34287  *
34288  * _.mapValues(users, function(o) { return o.age; });
34289  * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
34290  *
34291  * // The `_.property` iteratee shorthand.
34292  * _.mapValues(users, 'age');
34293  * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
34294  */
34295 function mapValues(object, iteratee) {
34296   var result = {};
34297   iteratee = baseIteratee(iteratee, 3);
34298
34299   baseForOwn(object, function(value, key, object) {
34300     baseAssignValue(result, key, iteratee(value, key, object));
34301   });
34302   return result;
34303 }
34304
34305 function behaviorPaste(context) {
34306     var keybinding = d3keybinding('paste');
34307
34308
34309     function doPaste() {
34310         event.preventDefault();
34311
34312         var baseGraph = context.graph(),
34313             mouse = context.mouse(),
34314             projection = context.projection,
34315             viewport = geoExtent$$1(projection.clipExtent()).polygon();
34316
34317         if (!geoPointInPolygon(mouse, viewport)) return;
34318
34319         var extent = geoExtent$$1(),
34320             oldIDs = context.copyIDs(),
34321             oldGraph = context.copyGraph(),
34322             newIDs = [];
34323
34324         if (!oldIDs.length) return;
34325
34326         var action = actionCopyEntities(oldIDs, oldGraph);
34327         context.perform(action);
34328
34329         var copies = action.copies();
34330         var originals = invert(mapValues(copies, 'id'));
34331         for (var id in copies) {
34332             var oldEntity = oldGraph.entity(id),
34333                 newEntity = copies[id];
34334
34335             extent._extend(oldEntity.extent(oldGraph));
34336
34337             // Exclude child nodes from newIDs if their parent way was also copied.
34338             var parents = context.graph().parentWays(newEntity),
34339                 parentCopied = false;
34340             for (var i = 0; i < parents.length; i++) {
34341                 if (originals[parents[i].id]) {
34342                     parentCopied = true;
34343                     break;
34344                 }
34345             }
34346
34347             if (!parentCopied) {
34348                 newIDs.push(newEntity.id);
34349             }
34350         }
34351
34352         // Put pasted objects where mouse pointer is..
34353         var center = projection(extent.center()),
34354             delta = [ mouse[0] - center[0], mouse[1] - center[1] ];
34355
34356         context.perform(actionMove(newIDs, delta, projection));
34357         context.enter(modeMove$$1(context, newIDs, baseGraph));
34358     }
34359
34360
34361     function paste() {
34362         keybinding.on(uiCmd('⌘V'), doPaste);
34363         d3_select(document).call(keybinding);
34364         return paste;
34365     }
34366
34367
34368     paste.off = function() {
34369         d3_select(document).call(keybinding.off);
34370     };
34371
34372
34373     return paste;
34374 }
34375
34376 function behaviorSelect(context) {
34377     var lastMouse = null;
34378     var suppressMenu = true;
34379     var tolerance = 4;
34380     var p1 = null;
34381
34382
34383     function point$$1() {
34384         return d3_mouse(context.container().node());
34385     }
34386
34387
34388     function keydown() {
34389         var e = event;
34390         if (e && e.shiftKey) {
34391             context.surface()
34392                 .classed('behavior-multiselect', true);
34393         }
34394
34395         if (e && e.keyCode === 93) {  // context menu
34396             e.preventDefault();
34397             e.stopPropagation();
34398         }
34399     }
34400
34401
34402     function keyup() {
34403         var e = event;
34404         if (!e || !e.shiftKey) {
34405             context.surface()
34406                 .classed('behavior-multiselect', false);
34407         }
34408
34409
34410         if (e && e.keyCode === 93) {  // context menu
34411             e.preventDefault();
34412             e.stopPropagation();
34413             contextmenu();
34414         }
34415     }
34416
34417
34418     function mousedown() {
34419         if (!p1) p1 = point$$1();
34420         d3_select(window)
34421             .on('mouseup.select', mouseup, true);
34422
34423         var isShowAlways = +context.storage('edit-menu-show-always') === 1;
34424         suppressMenu = !isShowAlways;
34425     }
34426
34427
34428     function mousemove() {
34429         if (event) lastMouse = event;
34430     }
34431
34432
34433     function mouseup() {
34434         click();
34435     }
34436
34437
34438     function contextmenu() {
34439         var e = event;
34440         e.preventDefault();
34441         e.stopPropagation();
34442
34443         if (!+e.clientX && !+e.clientY) {
34444             if (lastMouse) {
34445                 e.sourceEvent = lastMouse;
34446             } else {
34447                 return;
34448             }
34449         }
34450
34451         if (!p1) p1 = point$$1();
34452         suppressMenu = false;
34453         click();
34454     }
34455
34456
34457     function click() {
34458         d3_select(window)
34459             .on('mouseup.select', null, true);
34460
34461         if (!p1) return;
34462         var p2 = point$$1();
34463         var dist = geoVecLength(p1, p2);
34464
34465         p1 = null;
34466         if (dist > tolerance) {
34467             return;
34468         }
34469
34470         var isMultiselect = event.shiftKey || d3_select('#surface .lasso').node();
34471         var isShowAlways = +context.storage('edit-menu-show-always') === 1;
34472         var datum = event.target.__data__ || (lastMouse && lastMouse.target.__data__);
34473         var mode = context.mode();
34474
34475         var entity = datum && datum.properties && datum.properties.entity;
34476         if (entity) datum = entity;
34477
34478         if (datum && datum.type === 'midpoint') {
34479             datum = datum.parents[0];
34480         }
34481
34482         if (!(datum instanceof osmEntity$$1)) {
34483             // clicked nothing..
34484             if (!isMultiselect && mode.id !== 'browse') {
34485                 context.enter(modeBrowse(context));
34486             }
34487
34488         } else {
34489             // clicked an entity..
34490             var selectedIDs = context.selectedIDs();
34491
34492             if (!isMultiselect) {
34493                 if (selectedIDs.length > 1 && (!suppressMenu && !isShowAlways)) {
34494                     // multiple things already selected, just show the menu...
34495                     mode.suppressMenu(false).reselect();
34496                 } else {
34497                     // select a single thing..
34498                     context.enter(modeSelect(context, [datum.id]).suppressMenu(suppressMenu));
34499                 }
34500
34501             } else {
34502                 if (selectedIDs.indexOf(datum.id) !== -1) {
34503                     // clicked entity is already in the selectedIDs list..
34504                     if (!suppressMenu && !isShowAlways) {
34505                         // don't deselect clicked entity, just show the menu.
34506                         mode.suppressMenu(false).reselect();
34507                     } else {
34508                         // deselect clicked entity, then reenter select mode or return to browse mode..
34509                         selectedIDs = without(selectedIDs, datum.id);
34510                         context.enter(selectedIDs.length ? modeSelect(context, selectedIDs) : modeBrowse(context));
34511                     }
34512                 } else {
34513                     // clicked entity is not in the selected list, add it..
34514                     selectedIDs = selectedIDs.concat([datum.id]);
34515                     context.enter(modeSelect(context, selectedIDs).suppressMenu(suppressMenu));
34516                 }
34517             }
34518         }
34519
34520         // reset for next time..
34521         suppressMenu = true;
34522     }
34523
34524
34525     var behavior = function(selection$$1) {
34526         lastMouse = null;
34527         suppressMenu = true;
34528         p1 = null;
34529
34530         d3_select(window)
34531             .on('keydown.select', keydown)
34532             .on('keyup.select', keyup)
34533             .on('contextmenu.select-window', function() {
34534                 // Edge and IE really like to show the contextmenu on the
34535                 // menubar when user presses a keyboard menu button
34536                 // even after we've already preventdefaulted the key event.
34537                 var e = event;
34538                 if (+e.clientX === 0 && +e.clientY === 0) {
34539                     event.preventDefault();
34540                     event.stopPropagation();
34541                 }
34542             });
34543
34544         selection$$1
34545             .on('mousedown.select', mousedown)
34546             .on('mousemove.select', mousemove)
34547             .on('contextmenu.select', contextmenu);
34548
34549         if (event && event.shiftKey) {
34550             context.surface()
34551                 .classed('behavior-multiselect', true);
34552         }
34553     };
34554
34555
34556     behavior.off = function(selection$$1) {
34557         d3_select(window)
34558             .on('keydown.select', null)
34559             .on('keyup.select', null)
34560             .on('contextmenu.select-window', null)
34561             .on('mouseup.select', null, true);
34562
34563         selection$$1
34564             .on('mousedown.select', null)
34565             .on('mousemove.select', null)
34566             .on('contextmenu.select', null);
34567
34568         context.surface()
34569             .classed('behavior-multiselect', false);
34570     };
34571
34572
34573     return behavior;
34574 }
34575
34576 function d3geoTile() {
34577   var size = [960, 500],
34578       scale = 256,
34579       scaleExtent = [0, 20],
34580       translate = [size[0] / 2, size[1] / 2],
34581       zoomDelta = 0;
34582
34583   function bound(_) {
34584       return Math.min(scaleExtent[1], Math.max(scaleExtent[0], _));
34585   }
34586
34587   function tile() {
34588     var z = Math.max(Math.log(scale) / Math.LN2 - 8, 0),
34589         z0 = bound(Math.round(z + zoomDelta)),
34590         k = Math.pow(2, z - z0 + 8),
34591         origin = [(translate[0] - scale / 2) / k, (translate[1] - scale / 2) / k],
34592         tiles = [],
34593         cols = d3_range(Math.max(0, Math.floor(-origin[0])), Math.max(0, Math.ceil(size[0] / k - origin[0]))),
34594         rows = d3_range(Math.max(0, Math.floor(-origin[1])), Math.max(0, Math.ceil(size[1] / k - origin[1])));
34595
34596     rows.forEach(function(y) {
34597       cols.forEach(function(x) {
34598         tiles.push([x, y, z0]);
34599       });
34600     });
34601
34602     tiles.translate = origin;
34603     tiles.scale = k;
34604
34605     return tiles;
34606   }
34607
34608   tile.scaleExtent = function(_) {
34609     if (!arguments.length) return scaleExtent;
34610     scaleExtent = _;
34611     return tile;
34612   };
34613
34614   tile.size = function(_) {
34615     if (!arguments.length) return size;
34616     size = _;
34617     return tile;
34618   };
34619
34620   tile.scale = function(_) {
34621     if (!arguments.length) return scale;
34622     scale = _;
34623     return tile;
34624   };
34625
34626   tile.translate = function(_) {
34627     if (!arguments.length) return translate;
34628     translate = _;
34629     return tile;
34630   };
34631
34632   tile.zoomDelta = function(_) {
34633     if (!arguments.length) return zoomDelta;
34634     zoomDelta = +_;
34635     return tile;
34636   };
34637
34638   return tile;
34639 }
34640
34641 /* global Mapillary:false */
34642
34643
34644 var apibase = 'https://a.mapillary.com/v3/',
34645     viewercss = 'mapillary-js/mapillary.min.css',
34646     viewerjs = 'mapillary-js/mapillary.min.js',
34647     clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi',
34648     maxResults = 1000,
34649     tileZoom = 14,
34650     dispatch$1 = dispatch('loadedImages', 'loadedSigns'),
34651     _mlyFallback = false,
34652     _mlyCache,
34653     _mlyClicks,
34654     _mlySelectedImage,
34655     _mlySignDefs,
34656     _mlySignSprite,
34657     _mlyViewer;
34658
34659
34660 function abortRequest(i) {
34661     i.abort();
34662 }
34663
34664
34665 function nearNullIsland(x, y, z) {
34666     if (z >= 7) {
34667         var center = Math.pow(2, z - 1),
34668             width = Math.pow(2, z - 6),
34669             min$$1 = center - (width / 2),
34670             max$$1 = center + (width / 2) - 1;
34671         return x >= min$$1 && x <= max$$1 && y >= min$$1 && y <= max$$1;
34672     }
34673     return false;
34674 }
34675
34676
34677 function maxPageAtZoom(z) {
34678     if (z < 15)   return 2;
34679     if (z === 15) return 5;
34680     if (z === 16) return 10;
34681     if (z === 17) return 20;
34682     if (z === 18) return 40;
34683     if (z > 18)   return 80;
34684 }
34685
34686
34687 function localeTimestamp(s) {
34688     if (!s) return null;
34689     var detected = utilDetect();
34690     var options = {
34691         day: 'numeric', month: 'short', year: 'numeric',
34692         hour: 'numeric', minute: 'numeric', second: 'numeric',
34693         timeZone: 'UTC'
34694     };
34695     var d = new Date(s);
34696     if (isNaN(d.getTime())) return null;
34697     return d.toLocaleString(detected.locale, options);
34698 }
34699
34700
34701 function getTiles(projection) {
34702     var s = projection.scale() * 2 * Math.PI,
34703         z = Math.max(Math.log(s) / Math.log(2) - 8, 0),
34704         ts = 256 * Math.pow(2, z - tileZoom),
34705         origin = [
34706             s / 2 - projection.translate()[0],
34707             s / 2 - projection.translate()[1]];
34708
34709     return d3geoTile()
34710         .scaleExtent([tileZoom, tileZoom])
34711         .scale(s)
34712         .size(projection.clipExtent()[1])
34713         .translate(projection.translate())()
34714         .map(function(tile) {
34715             var x = tile[0] * ts - origin[0],
34716                 y = tile[1] * ts - origin[1];
34717
34718             return {
34719                 id: tile.toString(),
34720                 xyz: tile,
34721                 extent: geoExtent$$1(
34722                     projection.invert([x, y + ts]),
34723                     projection.invert([x + ts, y])
34724                 )
34725             };
34726         });
34727 }
34728
34729
34730 function loadTiles(which, url, projection) {
34731     var s = projection.scale() * 2 * Math.PI,
34732         currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0));
34733
34734     var tiles = getTiles(projection).filter(function(t) {
34735             return !nearNullIsland(t.xyz[0], t.xyz[1], t.xyz[2]);
34736         });
34737
34738     filter(which.inflight, function(v, k) {
34739         var wanted = find$1(tiles, function(tile) { return k === (tile.id + ',0'); });
34740         if (!wanted) delete which.inflight[k];
34741         return !wanted;
34742     }).map(abortRequest);
34743
34744     tiles.forEach(function(tile) {
34745         loadNextTilePage(which, currZoom, url, tile);
34746     });
34747 }
34748
34749
34750 function loadNextTilePage(which, currZoom, url, tile) {
34751     var cache = _mlyCache[which],
34752         rect = tile.extent.rectangle(),
34753         maxPages = maxPageAtZoom(currZoom),
34754         nextPage = cache.nextPage[tile.id] || 0,
34755         nextURL = cache.nextURL[tile.id] || url +
34756             utilQsString({
34757                 per_page: maxResults,
34758                 page: nextPage,
34759                 client_id: clientId,
34760                 bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
34761             });
34762
34763     if (nextPage > maxPages) return;
34764
34765     var id = tile.id + ',' + String(nextPage);
34766     if (cache.loaded[id] || cache.inflight[id]) return;
34767     cache.inflight[id] = d3_request(nextURL)
34768         .mimeType('application/json')
34769         .response(function(xhr) {
34770             var linkHeader = xhr.getResponseHeader('Link');
34771             if (linkHeader) {
34772                 var pagination = parsePagination(xhr.getResponseHeader('Link'));
34773                 if (pagination.next) {
34774                     cache.nextURL[tile.id] = pagination.next;
34775                 }
34776             }
34777             return JSON.parse(xhr.responseText);
34778         })
34779         .get(function(err, data) {
34780             cache.loaded[id] = true;
34781             delete cache.inflight[id];
34782             if (err || !data.features || !data.features.length) return;
34783
34784             var features = data.features.map(function(feature) {
34785                 var loc = feature.geometry.coordinates,
34786                     d;
34787
34788                 if (which === 'images') {
34789                     d = {
34790                         loc: loc,
34791                         key: feature.properties.key,
34792                         ca: feature.properties.ca,
34793                         captured_at: feature.properties.captured_at,
34794                         captured_by: feature.properties.username,
34795                         pano: feature.properties.pano
34796                     };
34797                     cache.forImageKey[d.key] = d;     // cache imageKey -> image
34798
34799                 } else if (which === 'sequences') {
34800                     var sequenceKey = feature.properties.key;
34801                     cache.lineString[sequenceKey] = feature;           // cache sequenceKey -> lineString
34802                     feature.properties.coordinateProperties.image_keys.forEach(function(imageKey) {
34803                         cache.forImageKey[imageKey] = sequenceKey;     // cache imageKey -> sequenceKey
34804                     });
34805                     return false;  // because no `d` data worth loading into an rbush
34806
34807                 } else if (which === 'objects') {
34808                     d = {
34809                         loc: loc,
34810                         key: feature.properties.key,
34811                         value: feature.properties.value,
34812                         package: feature.properties.package,
34813                         detections: feature.properties.detections
34814                     };
34815
34816                     // cache imageKey -> detectionKey
34817                     feature.properties.detections.forEach(function(detection) {
34818                         var imageKey = detection.image_key;
34819                         var detectionKey = detection.detection_key;
34820                         if (!_mlyCache.detections[imageKey]) {
34821                             _mlyCache.detections[imageKey] = {};
34822                         }
34823                         if (!_mlyCache.detections[imageKey][detectionKey]) {
34824                             _mlyCache.detections[imageKey][detectionKey] = {};
34825                         }
34826                     });
34827                 }
34828
34829                 return {
34830                     minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
34831                 };
34832
34833             }).filter(Boolean);
34834
34835             cache.rtree.load(features);
34836
34837             if (which === 'images' || which === 'sequences') {
34838                 dispatch$1.call('loadedImages');
34839             } else if (which === 'objects') {
34840                 dispatch$1.call('loadedSigns');
34841             }
34842
34843             if (data.features.length === maxResults) {  // more pages to load
34844                 cache.nextPage[tile.id] = nextPage + 1;
34845                 loadNextTilePage(which, currZoom, url, tile);
34846             } else {
34847                 cache.nextPage[tile.id] = Infinity;     // no more pages to load
34848             }
34849         });
34850 }
34851
34852 // extract links to pages of API results
34853 function parsePagination(links) {
34854     return links.split(',').map(function(rel) {
34855         var elements = rel.split(';');
34856         if (elements.length === 2) {
34857             return [
34858                 /<(.+)>/.exec(elements[0])[1],
34859                 /rel="(.+)"/.exec(elements[1])[1]
34860                 ];
34861         } else {
34862             return ['',''];
34863         }
34864     }).reduce(function(pagination, val) {
34865         pagination[val[1]] = val[0];
34866         return pagination;
34867     }, {});
34868 }
34869
34870
34871 // partition viewport into `psize` x `psize` regions
34872 function partitionViewport(psize, projection) {
34873     var dimensions = projection.clipExtent()[1];
34874     psize = psize || 16;
34875     var cols = d3_range(0, dimensions[0], psize),
34876         rows = d3_range(0, dimensions[1], psize),
34877         partitions = [];
34878
34879     rows.forEach(function(y) {
34880         cols.forEach(function(x) {
34881             var min$$1 = [x, y + psize],
34882                 max$$1 = [x + psize, y];
34883             partitions.push(
34884                 geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
34885         });
34886     });
34887
34888     return partitions;
34889 }
34890
34891
34892 // no more than `limit` results per partition.
34893 function searchLimited(psize, limit, projection, rtree) {
34894     limit = limit || 3;
34895
34896     var partitions = partitionViewport(psize, projection);
34897     var results;
34898
34899     // console.time('previous');
34900     results =  flatten(map$3(partitions, function(extent$$1) {
34901         return rtree.search(extent$$1.bbox())
34902             .slice(0, limit)
34903             .map(function(d) { return d.data; });
34904     }));
34905     // console.timeEnd('previous');
34906
34907     // console.time('new');
34908     // results = partitions.reduce(function(result, extent) {
34909     //     var found = rtree.search(extent.bbox())
34910     //         .map(function(d) { return d.data; })
34911     //         .sort(function(a, b) {
34912     //             return a.loc[1] - b.loc[1];
34913     //             // return a.key.localeCompare(b.key);
34914     //         })
34915     //         .slice(0, limit);
34916
34917     //     return (found.length ? result.concat(found) : result);
34918     // }, []);
34919     // console.timeEnd('new');
34920
34921     return results;
34922 }
34923
34924
34925
34926 var serviceMapillary = {
34927
34928     init: function() {
34929         if (!_mlyCache) {
34930             this.reset();
34931         }
34932
34933         this.event = utilRebind(this, dispatch$1, 'on');
34934     },
34935
34936     reset: function() {
34937         var cache = _mlyCache;
34938
34939         if (cache) {
34940             if (cache.images && cache.images.inflight) {
34941                 forEach(cache.images.inflight, abortRequest);
34942             }
34943             if (cache.objects && cache.objects.inflight) {
34944                 forEach(cache.objects.inflight, abortRequest);
34945             }
34946             if (cache.sequences && cache.sequences.inflight) {
34947                 forEach(cache.sequences.inflight, abortRequest);
34948             }
34949         }
34950
34951         _mlyCache = {
34952             images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {} },
34953             objects: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
34954             sequences: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {}, lineString: {} },
34955             detections: {}
34956         };
34957
34958         _mlySelectedImage = null;
34959         _mlyClicks = [];
34960     },
34961
34962
34963     images: function(projection) {
34964         var psize = 16, limit = 3;
34965         return searchLimited(psize, limit, projection, _mlyCache.images.rtree);
34966     },
34967
34968
34969     signs: function(projection) {
34970         var psize = 32, limit = 3;
34971         return searchLimited(psize, limit, projection, _mlyCache.objects.rtree);
34972     },
34973
34974
34975     sequences: function(projection) {
34976         var viewport = projection.clipExtent();
34977         var min$$1 = [viewport[0][0], viewport[1][1]];
34978         var max$$1 = [viewport[1][0], viewport[0][1]];
34979         var bbox = geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)).bbox();
34980         var sequenceKeys = {};
34981
34982         // all sequences for images in viewport
34983         _mlyCache.images.rtree.search(bbox)
34984             .forEach(function(d) {
34985                 var sequenceKey = _mlyCache.sequences.forImageKey[d.data.key];
34986                 if (sequenceKey) {
34987                     sequenceKeys[sequenceKey] = true;
34988                 }
34989             });
34990
34991         // Return lineStrings for the sequences
34992         return Object.keys(sequenceKeys).map(function(sequenceKey) {
34993             return _mlyCache.sequences.lineString[sequenceKey];
34994         });
34995     },
34996
34997
34998     signsSupported: function() {
34999         var detected = utilDetect();
35000         if (detected.ie) return false;
35001         if ((detected.browser.toLowerCase() === 'safari') && (parseFloat(detected.version) < 10)) return false;
35002         return true;
35003     },
35004
35005
35006     signHTML: function(d) {
35007         if (!_mlySignDefs || !_mlySignSprite) return;
35008         var position = _mlySignDefs[d.value];
35009         if (!position) return '<div></div>';
35010         var iconStyle = [
35011             'background-image:url(' + _mlySignSprite + ')',
35012             'background-repeat:no-repeat',
35013             'height:' + position.height + 'px',
35014             'width:' + position.width + 'px',
35015             'background-position-x:-' + position.x + 'px',
35016             'background-position-y:-' + position.y + 'px',
35017         ];
35018
35019         return '<div style="' + iconStyle.join(';') +'"></div>';
35020     },
35021
35022
35023     loadImages: function(projection) {
35024         loadTiles('images', apibase + 'images?', projection);
35025         loadTiles('sequences', apibase + 'sequences?', projection);
35026     },
35027
35028
35029     loadSigns: function(context, projection) {
35030         // if we are looking at signs, we'll actually need to fetch images too
35031         loadTiles('images', apibase + 'images?', projection);
35032         loadTiles('objects', apibase + 'objects?', projection);
35033
35034         // load traffic sign defs
35035         if (!_mlySignDefs) {
35036             _mlySignSprite = context.asset('img/traffic-signs/traffic-signs.png');
35037             _mlySignDefs = {};
35038             d3_json(context.asset('img/traffic-signs/traffic-signs.json'), function(err, data) {
35039                 if (err) return;
35040                 _mlySignDefs = data;
35041             });
35042         }
35043     },
35044
35045
35046     loadViewer: function(context) {
35047         // add mly-wrapper
35048         var wrap = d3_select('#photoviewer').selectAll('.mly-wrapper')
35049             .data([0]);
35050
35051         var wrapEnter = wrap.enter()
35052             .append('div')
35053             .attr('id', 'mly')
35054             .attr('class', 'photo-wrapper mly-wrapper')
35055             .classed('hide', true);
35056
35057         wrapEnter
35058             .append('div')
35059             .attr('class', 'photo-attribution fillD');
35060
35061
35062         // load mapillary-viewercss
35063         d3_select('head').selectAll('#mapillary-viewercss')
35064             .data([0])
35065             .enter()
35066             .append('link')
35067             .attr('id', 'mapillary-viewercss')
35068             .attr('rel', 'stylesheet')
35069             .attr('href', context.asset(viewercss));
35070
35071         // load mapillary-viewerjs
35072         d3_select('head').selectAll('#mapillary-viewerjs')
35073             .data([0])
35074             .enter()
35075             .append('script')
35076             .attr('id', 'mapillary-viewerjs')
35077             .attr('src', context.asset(viewerjs));
35078     },
35079
35080
35081     showViewer: function() {
35082         var wrap = d3_select('#photoviewer')
35083             .classed('hide', false);
35084
35085         var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size();
35086
35087         if (isHidden) {
35088             wrap
35089                 .selectAll('.photo-wrapper:not(.mly-wrapper)')
35090                 .classed('hide', true);
35091
35092             wrap
35093                 .selectAll('.photo-wrapper.mly-wrapper')
35094                 .classed('hide', false);
35095
35096             _mlyViewer.resize();
35097         }
35098
35099         return this;
35100     },
35101
35102
35103     hideViewer: function() {
35104         _mlySelectedImage = null;
35105
35106         if (!_mlyFallback && _mlyViewer) {
35107             _mlyViewer.getComponent('sequence').stop();
35108         }
35109
35110         var viewer = d3_select('#photoviewer');
35111         if (!viewer.empty()) viewer.datum(null);
35112
35113         viewer
35114             .classed('hide', true)
35115             .selectAll('.photo-wrapper')
35116             .classed('hide', true);
35117
35118         d3_selectAll('.viewfield-group, .sequence, .icon-sign')
35119             .classed('selected', false);
35120
35121         return this.setStyles(null, true);
35122     },
35123
35124
35125     parsePagination: parsePagination,
35126
35127
35128     updateViewer: function(imageKey, context) {
35129         if (!imageKey) return this;
35130
35131         if (!_mlyViewer) {
35132             this.initViewer(imageKey, context);
35133         } else {
35134             _mlyViewer.moveToKey(imageKey)
35135                 .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
35136         }
35137
35138         return this;
35139     },
35140
35141
35142     initViewer: function(imageKey, context) {
35143         var that = this;
35144         if (Mapillary && imageKey) {
35145             var opts = {
35146                 baseImageSize: 320,
35147                 component: {
35148                     cover: false,
35149                     keyboard: false,
35150                     tag: true
35151                 }
35152             };
35153
35154             // Disable components requiring WebGL support
35155             if (!Mapillary.isSupported() && Mapillary.isFallbackSupported()) {
35156                 _mlyFallback = true;
35157                 opts.component = {
35158                     cover: false,
35159                     direction: false,
35160                     imagePlane: false,
35161                     keyboard: false,
35162                     mouse: false,
35163                     sequence: false,
35164                     tag: false,
35165                     image: true,        // fallback
35166                     navigation: true    // fallback
35167                 };
35168             }
35169
35170             _mlyViewer = new Mapillary.Viewer('mly', clientId, null, opts);
35171             _mlyViewer.on('nodechanged', nodeChanged);
35172             _mlyViewer.moveToKey(imageKey)
35173                 .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
35174         }
35175
35176         // nodeChanged: called after the viewer has changed images and is ready.
35177         //
35178         // There is some logic here to batch up clicks into a _mlyClicks array
35179         // because the user might click on a lot of markers quickly and nodechanged
35180         // may be called out of order asychronously.
35181         //
35182         // Clicks are added to the array in `selectedImage` and removed here.
35183         //
35184         function nodeChanged(node) {
35185             if (!_mlyFallback) {
35186                 _mlyViewer.getComponent('tag').removeAll();  // remove previous detections
35187             }
35188
35189             var clicks = _mlyClicks;
35190             var index = clicks.indexOf(node.key);
35191             var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
35192
35193             if (index > -1) {              // `nodechanged` initiated from clicking on a marker..
35194                 clicks.splice(index, 1);   // remove the click
35195                 // If `node.key` matches the current _mlySelectedImage, call `selectImage()`
35196                 // one more time to update the detections and attribution..
35197                 if (node.key === selectedKey) {
35198                     that.selectImage(_mlySelectedImage, node.key, true);
35199                 }
35200             } else {             // `nodechanged` initiated from the Mapillary viewer controls..
35201                 var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat];
35202                 context.map().centerEase(loc);
35203                 that.selectImage(undefined, node.key, true);
35204             }
35205         }
35206     },
35207
35208
35209     // Pass the image datum itself in `d` or the `imageKey` string.
35210     // This allows images to be selected from places that dont have access
35211     // to the full image datum (like the street signs layer or the js viewer)
35212     selectImage: function(d, imageKey, fromViewer) {
35213         if (!d && imageKey) {
35214             // If the user clicked on something that's not an image marker, we
35215             // might get in here.. Cache lookup can fail, e.g. if the user
35216             // clicked a streetsign, but images are loading slowly asynchronously.
35217             // We'll try to carry on anyway if there is no datum.  There just
35218             // might be a delay before user sees detections, captured_at, etc.
35219             d = _mlyCache.images.forImageKey[imageKey];
35220         }
35221
35222         _mlySelectedImage = d;
35223         var viewer = d3_select('#photoviewer');
35224         if (!viewer.empty()) viewer.datum(d);
35225
35226         imageKey = (d && d.key) || imageKey;
35227         if (!fromViewer && imageKey) {
35228             _mlyClicks.push(imageKey);
35229         }
35230
35231         this.setStyles(null, true);
35232
35233         d3_selectAll('.layer-mapillary-signs .icon-sign')
35234             .classed('selected', function(d) {
35235                 return some(d.detections, function(detection) {
35236                     return detection.image_key === imageKey;
35237                 });
35238             });
35239
35240         var wrap = d3_select('#photoviewer .mly-wrapper');
35241         var attribution = wrap.selectAll('.photo-attribution').html('');
35242
35243         if (d) {
35244             if (d.captured_by) {
35245                 attribution
35246                     .append('a')
35247                     .attr('class', 'captured_by')
35248                     .attr('target', '_blank')
35249                     .attr('href', 'https://www.mapillary.com/app/user/' + encodeURIComponent(d.captured_by))
35250                     .text('@' + d.captured_by);
35251
35252                 attribution
35253                     .append('span')
35254                     .text('|');
35255             }
35256
35257             if (d.captured_at) {
35258                 attribution
35259                     .append('span')
35260                     .attr('class', 'captured_at')
35261                     .text(localeTimestamp(d.captured_at));
35262
35263                 attribution
35264                     .append('span')
35265                     .text('|');
35266             }
35267
35268             attribution
35269                 .append('a')
35270                 .attr('class', 'image_link')
35271                 .attr('target', '_blank')
35272                 .attr('href', 'https://www.mapillary.com/app/?pKey=' + encodeURIComponent(d.key) +
35273                     '&focus=photo&lat=' + d.loc[1] + '&lng=' + d.loc[0] + '&z=17')
35274                 .text('mapillary.com');
35275
35276             this.updateDetections(d);
35277         }
35278
35279         return this;
35280     },
35281
35282
35283     getSelectedImage: function() {
35284         return _mlySelectedImage;
35285     },
35286
35287
35288     getSequenceKeyForImage: function(d) {
35289         var imageKey = d && d.key;
35290         return imageKey && _mlyCache.sequences.forImageKey[imageKey];
35291     },
35292
35293
35294     setStyles: function(hovered, reset) {
35295         if (reset) {  // reset all layers
35296             d3_selectAll('.viewfield-group')
35297                 .classed('highlighted', false)
35298                 .classed('hovered', false)
35299                 .classed('selected', false);
35300
35301             d3_selectAll('.sequence')
35302                 .classed('highlighted', false)
35303                 .classed('selected', false);
35304         }
35305
35306         var hoveredImageKey = hovered && hovered.key;
35307         var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
35308         var hoveredLineString = hoveredSequenceKey && _mlyCache.sequences.lineString[hoveredSequenceKey];
35309         var hoveredImageKeys = (hoveredLineString && hoveredLineString.properties.coordinateProperties.image_keys) || [];
35310
35311         var viewer = d3_select('#photoviewer');
35312         var selected = viewer.empty() ? undefined : viewer.datum();
35313         var selectedImageKey = selected && selected.key;
35314         var selectedSequenceKey = this.getSequenceKeyForImage(selected);
35315         var selectedLineString = selectedSequenceKey && _mlyCache.sequences.lineString[selectedSequenceKey];
35316         var selectedImageKeys = (selectedLineString && selectedLineString.properties.coordinateProperties.image_keys) || [];
35317
35318         // highlight sibling viewfields on either the selected or the hovered sequences
35319         var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
35320
35321         d3_selectAll('.layer-mapillary-images .viewfield-group')
35322             .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
35323             .classed('hovered', function(d) { return d.key === hoveredImageKey; })
35324             .classed('selected', function(d) { return d.key === selectedImageKey; });
35325
35326         d3_selectAll('.layer-mapillary-images .sequence')
35327             .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
35328             .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
35329
35330         return this;
35331     },
35332
35333
35334     updateDetections: function(d) {
35335         if (!_mlyViewer || _mlyFallback) return;
35336
35337         var imageKey = d && d.key;
35338         var detections = (imageKey && _mlyCache.detections[imageKey]) || [];
35339
35340         forEach(detections, function(data, k) {
35341             if (isEmpty(data)) {
35342                 loadDetection(k);
35343             } else {
35344                 var tag = makeTag(data);
35345                 if (tag) {
35346                     var tagComponent = _mlyViewer.getComponent('tag');
35347                     tagComponent.add([tag]);
35348                 }
35349             }
35350         });
35351
35352
35353         function loadDetection(detectionKey) {
35354             var url = apibase + 'detections/'+
35355                 detectionKey + '?' + utilQsString({
35356                     client_id: clientId,
35357                 });
35358
35359             d3_request(url)
35360                 .mimeType('application/json')
35361                 .response(function(xhr) {
35362                     return JSON.parse(xhr.responseText);
35363                 })
35364                 .get(function(err, data) {
35365                     if (!data || !data.properties) return;
35366
35367                     var imageKey = data.properties.image_key;
35368                     _mlyCache.detections[imageKey][detectionKey] = data;
35369
35370                     var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
35371                     if (imageKey === selectedKey) {
35372                         var tag = makeTag(data);
35373                         if (tag) {
35374                             var tagComponent = _mlyViewer.getComponent('tag');
35375                             tagComponent.add([tag]);
35376                         }
35377                     }
35378                 });
35379         }
35380
35381
35382         function makeTag(data) {
35383             var valueParts = data.properties.value.split('--');
35384             if (valueParts.length !== 3) return;
35385
35386             var text = valueParts[1].replace(/-/g, ' ');
35387             var tag;
35388
35389             // Currently only two shapes <Polygon|Point>
35390             if (data.properties.shape.type === 'Polygon') {
35391                 var polygonGeometry = new Mapillary
35392                     .TagComponent
35393                     .PolygonGeometry(data.properties.shape.coordinates[0]);
35394
35395                 tag = new Mapillary.TagComponent.OutlineTag(
35396                     data.properties.key,
35397                     polygonGeometry,
35398                     {
35399                         text: text,
35400                         textColor: 0xffff00,
35401                         lineColor: 0xffff00,
35402                         lineWidth: 2,
35403                         fillColor: 0xffff00,
35404                         fillOpacity: 0.3,
35405                     }
35406                 );
35407
35408             } else if (data.properties.shape.type === 'Point') {
35409                 var pointGeometry = new Mapillary
35410                     .TagComponent
35411                     .PointGeometry(data.properties.shape.coordinates[0]);
35412
35413                 tag = new Mapillary.TagComponent.SpotTag(
35414                     data.properties.key,
35415                     pointGeometry,
35416                     {
35417                         text: text,
35418                         color: 0xffff00,
35419                         textColor: 0xffff00
35420                     }
35421                 );
35422             }
35423
35424             return tag;
35425         }
35426     },
35427
35428
35429     cache: function() {
35430         return _mlyCache;
35431     },
35432
35433
35434     signDefs: function(_) {
35435         if (!arguments.length) return _mlySignDefs;
35436         _mlySignDefs = _;
35437         return this;
35438     }
35439
35440 };
35441
35442 var apibase$1 = 'https://nominatim.openstreetmap.org/',
35443     inflight = {},
35444     nominatimCache;
35445
35446
35447 var serviceNominatim = {
35448
35449     init: function() {
35450         inflight = {};
35451         nominatimCache = rbush_1();
35452     },
35453
35454     reset: function() {
35455         forEach(inflight, function(req) { req.abort(); });
35456         inflight = {};
35457         nominatimCache = rbush_1();
35458     },
35459
35460
35461     countryCode: function (location, callback) {
35462         this.reverse(location, function(err, result) {
35463             if (err) {
35464                 return callback(err);
35465             } else if (result.address) {
35466                 return callback(null, result.address.country_code);
35467             } else {
35468                 return callback('Unable to geocode', null);
35469             }
35470         });
35471     },
35472
35473
35474     reverse: function (location, callback) {
35475         var cached = nominatimCache.search(
35476             { minX: location[0], minY: location[1], maxX: location[0], maxY: location[1] }
35477         );
35478
35479         if (cached.length > 0) {
35480             return callback(null, cached[0].data);
35481         }
35482
35483         var params = { zoom: 13, format: 'json', addressdetails: 1, lat: location[1], lon: location[0] };
35484         var url = apibase$1 + 'reverse?' + utilQsString(params);
35485         if (inflight[url]) return;
35486
35487         inflight[url] = d3_json(url, function(err, result) {
35488             delete inflight[url];
35489
35490             if (err) {
35491                 return callback(err);
35492             } else if (result && result.error) {
35493                 return callback(result.error);
35494             }
35495
35496             var extent = geoExtent$$1(location).padByMeters(200);
35497             nominatimCache.insert(assign(extent.bbox(), {data: result}));
35498
35499             callback(null, result);
35500         });
35501     },
35502
35503
35504     search: function (val, callback) {
35505         var searchVal = encodeURIComponent(val);
35506         var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
35507         if (inflight[url]) return;
35508
35509         inflight[url] = d3_json(url, function(err, result) {
35510             delete inflight[url];
35511             callback(err, result);
35512         });
35513     }
35514
35515 };
35516
35517 var apibase$2 = 'https://openstreetcam.org',
35518     maxResults$1 = 1000,
35519     tileZoom$1 = 14,
35520     dispatch$2 = dispatch('loadedImages'),
35521     imgZoom = d3_zoom()
35522         .extent([[0, 0], [320, 240]])
35523         .translateExtent([[0, 0], [320, 240]])
35524         .scaleExtent([1, 15])
35525         .on('zoom', zoomPan),
35526     _oscCache,
35527     _oscSelectedImage;
35528
35529
35530 function abortRequest$1(i) {
35531     i.abort();
35532 }
35533
35534
35535 function nearNullIsland$1(x, y, z) {
35536     if (z >= 7) {
35537         var center = Math.pow(2, z - 1),
35538             width = Math.pow(2, z - 6),
35539             min$$1 = center - (width / 2),
35540             max$$1 = center + (width / 2) - 1;
35541         return x >= min$$1 && x <= max$$1 && y >= min$$1 && y <= max$$1;
35542     }
35543     return false;
35544 }
35545
35546
35547 function maxPageAtZoom$1(z) {
35548     if (z < 15)   return 2;
35549     if (z === 15) return 5;
35550     if (z === 16) return 10;
35551     if (z === 17) return 20;
35552     if (z === 18) return 40;
35553     if (z > 18)   return 80;
35554 }
35555
35556
35557 function getTiles$1(projection) {
35558     var s = projection.scale() * 2 * Math.PI,
35559         z = Math.max(Math.log(s) / Math.log(2) - 8, 0),
35560         ts = 256 * Math.pow(2, z - tileZoom$1),
35561         origin = [
35562             s / 2 - projection.translate()[0],
35563             s / 2 - projection.translate()[1]];
35564
35565     return d3geoTile()
35566         .scaleExtent([tileZoom$1, tileZoom$1])
35567         .scale(s)
35568         .size(projection.clipExtent()[1])
35569         .translate(projection.translate())()
35570         .map(function(tile) {
35571             var x = tile[0] * ts - origin[0],
35572                 y = tile[1] * ts - origin[1];
35573
35574             return {
35575                 id: tile.toString(),
35576                 xyz: tile,
35577                 extent: geoExtent$$1(
35578                     projection.invert([x, y + ts]),
35579                     projection.invert([x + ts, y])
35580                 )
35581             };
35582         });
35583 }
35584
35585
35586 function loadTiles$1(which, url, projection) {
35587     var s = projection.scale() * 2 * Math.PI,
35588         currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0));
35589
35590     var tiles = getTiles$1(projection).filter(function(t) {
35591             return !nearNullIsland$1(t.xyz[0], t.xyz[1], t.xyz[2]);
35592         });
35593
35594     filter(which.inflight, function(v, k) {
35595         var wanted = find$1(tiles, function(tile) { return k === (tile.id + ',0'); });
35596         if (!wanted) delete which.inflight[k];
35597         return !wanted;
35598     }).map(abortRequest$1);
35599
35600     tiles.forEach(function(tile) {
35601         loadNextTilePage$1(which, currZoom, url, tile);
35602     });
35603 }
35604
35605
35606 function loadNextTilePage$1(which, currZoom, url, tile) {
35607     var cache = _oscCache[which];
35608     var bbox = tile.extent.bbox();
35609     var maxPages = maxPageAtZoom$1(currZoom);
35610     var nextPage = cache.nextPage[tile.id] || 1;
35611     var params = utilQsString({
35612             ipp: maxResults$1,
35613             page: nextPage,
35614             // client_id: clientId,
35615             bbTopLeft: [bbox.maxY, bbox.minX].join(','),
35616             bbBottomRight: [bbox.minY, bbox.maxX].join(',')
35617         }, true);
35618
35619     if (nextPage > maxPages) return;
35620
35621     var id = tile.id + ',' + String(nextPage);
35622     if (cache.loaded[id] || cache.inflight[id]) return;
35623
35624     cache.inflight[id] = d3_request(url)
35625         .mimeType('application/json')
35626         .header('Content-type', 'application/x-www-form-urlencoded')
35627         .response(function(xhr) { return JSON.parse(xhr.responseText); })
35628         .post(params, function(err, data) {
35629             cache.loaded[id] = true;
35630             delete cache.inflight[id];
35631             if (err || !data.currentPageItems || !data.currentPageItems.length) return;
35632
35633             function localeDateString(s) {
35634                 if (!s) return null;
35635                 var detected = utilDetect();
35636                 var options = { day: 'numeric', month: 'short', year: 'numeric' };
35637                 var d = new Date(s);
35638                 if (isNaN(d.getTime())) return null;
35639                 return d.toLocaleDateString(detected.locale, options);
35640             }
35641
35642             var features = data.currentPageItems.map(function(item) {
35643                 var loc = [+item.lng, +item.lat],
35644                     d;
35645
35646                 if (which === 'images') {
35647                     d = {
35648                         loc: loc,
35649                         key: item.id,
35650                         ca: +item.heading,
35651                         captured_at: localeDateString(item.shot_date || item.date_added),
35652                         captured_by: item.username,
35653                         imagePath: item.lth_name,
35654                         sequence_id: item.sequence_id,
35655                         sequence_index: +item.sequence_index
35656                     };
35657
35658                     // cache sequence info
35659                     var seq = _oscCache.sequences[d.sequence_id];
35660                     if (!seq) {
35661                         seq = { rotation: 0, images: [] };
35662                         _oscCache.sequences[d.sequence_id] = seq;
35663                     }
35664                     seq.images[d.sequence_index] = d;
35665                 }
35666
35667                 return {
35668                     minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
35669                 };
35670             });
35671
35672             cache.rtree.load(features);
35673
35674             if (which === 'images') {
35675                 dispatch$2.call('loadedImages');
35676             }
35677
35678             if (data.currentPageItems.length === maxResults$1) {  // more pages to load
35679                 cache.nextPage[tile.id] = nextPage + 1;
35680                 loadNextTilePage$1(which, currZoom, url, tile);
35681             } else {
35682                 cache.nextPage[tile.id] = Infinity;     // no more pages to load
35683             }
35684         });
35685 }
35686
35687
35688 // partition viewport into `psize` x `psize` regions
35689 function partitionViewport$1(psize, projection) {
35690     var dimensions = projection.clipExtent()[1];
35691     psize = psize || 16;
35692     var cols = d3_range(0, dimensions[0], psize),
35693         rows = d3_range(0, dimensions[1], psize),
35694         partitions = [];
35695
35696     rows.forEach(function(y) {
35697         cols.forEach(function(x) {
35698             var min$$1 = [x, y + psize],
35699                 max$$1 = [x + psize, y];
35700             partitions.push(
35701                 geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
35702         });
35703     });
35704
35705     return partitions;
35706 }
35707
35708
35709 // no more than `limit` results per partition.
35710 function searchLimited$1(psize, limit, projection, rtree) {
35711     limit = limit || 3;
35712
35713     var partitions = partitionViewport$1(psize, projection);
35714     var results;
35715
35716     results = flatten(map$3(partitions, function(extent$$1) {
35717         return rtree.search(extent$$1.bbox())
35718             .slice(0, limit)
35719             .map(function(d) { return d.data; });
35720     }));
35721     return results;
35722 }
35723
35724
35725 function zoomPan() {
35726     var t = event.transform;
35727     d3_select('#photoviewer .osc-image-wrap')
35728         .call(utilSetTransform, t.x, t.y, t.k);
35729 }
35730
35731
35732 var serviceOpenstreetcam = {
35733
35734     init: function() {
35735         if (!_oscCache) {
35736             this.reset();
35737         }
35738
35739         this.event = utilRebind(this, dispatch$2, 'on');
35740     },
35741
35742     reset: function() {
35743         var cache = _oscCache;
35744
35745         if (cache) {
35746             if (cache.images && cache.images.inflight) {
35747                 forEach(cache.images.inflight, abortRequest$1);
35748             }
35749         }
35750
35751         _oscCache = {
35752             images: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1() },
35753             sequences: {}
35754         };
35755
35756         _oscSelectedImage = null;
35757     },
35758
35759
35760     images: function(projection) {
35761         var psize = 16, limit = 3;
35762         return searchLimited$1(psize, limit, projection, _oscCache.images.rtree);
35763     },
35764
35765
35766     sequences: function(projection) {
35767         var viewport = projection.clipExtent();
35768         var min$$1 = [viewport[0][0], viewport[1][1]];
35769         var max$$1 = [viewport[1][0], viewport[0][1]];
35770         var bbox = geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)).bbox();
35771         var sequenceKeys = {};
35772
35773         // all sequences for images in viewport
35774         _oscCache.images.rtree.search(bbox)
35775             .forEach(function(d) { sequenceKeys[d.data.sequence_id] = true; });
35776
35777         // make linestrings from those sequences
35778         var lineStrings = [];
35779         Object.keys(sequenceKeys)
35780             .forEach(function(sequenceKey) {
35781                 var seq = _oscCache.sequences[sequenceKey];
35782                 var images = seq && seq.images;
35783                 if (images) {
35784                     lineStrings.push({
35785                         type: 'LineString',
35786                         coordinates: images.map(function (d) { return d.loc; }).filter(Boolean),
35787                         properties: { key: sequenceKey }
35788                     });
35789                 }
35790             });
35791         return lineStrings;
35792     },
35793
35794
35795     loadImages: function(projection) {
35796         var url = apibase$2 + '/1.0/list/nearby-photos/';
35797         loadTiles$1('images', url, projection);
35798     },
35799
35800
35801     loadViewer: function(context) {
35802         var that = this;
35803
35804         // add osc-wrapper
35805         var wrap = d3_select('#photoviewer').selectAll('.osc-wrapper')
35806             .data([0]);
35807
35808         var wrapEnter = wrap.enter()
35809             .append('div')
35810             .attr('class', 'photo-wrapper osc-wrapper')
35811             .classed('hide', true)
35812             .call(imgZoom)
35813             .on('dblclick.zoom', null);
35814
35815         wrapEnter
35816             .append('div')
35817             .attr('class', 'photo-attribution fillD');
35818
35819         var controlsEnter = wrapEnter
35820             .append('div')
35821             .attr('class', 'osc-controls-wrap')
35822             .append('div')
35823             .attr('class', 'osc-controls');
35824
35825         controlsEnter
35826             .append('button')
35827             .on('click.back', step(-1))
35828             .text('◄');
35829
35830         controlsEnter
35831             .append('button')
35832             .on('click.rotate-ccw', rotate(-90))
35833             .text('⤿');
35834
35835         controlsEnter
35836             .append('button')
35837             .on('click.rotate-cw', rotate(90))
35838             .text('⤾');
35839
35840         controlsEnter
35841             .append('button')
35842             .on('click.forward', step(1))
35843             .text('►');
35844
35845         wrapEnter
35846             .append('div')
35847             .attr('class', 'osc-image-wrap');
35848
35849
35850         function rotate(deg) {
35851             return function() {
35852                 if (!_oscSelectedImage) return;
35853                 var sequenceKey = _oscSelectedImage.sequence_id;
35854                 var sequence = _oscCache.sequences[sequenceKey];
35855                 if (!sequence) return;
35856
35857                 var r = sequence.rotation || 0;
35858                 r += deg;
35859
35860                 if (r > 180) r -= 360;
35861                 if (r < -180) r += 360;
35862                 sequence.rotation = r;
35863
35864                 var wrap = d3_select('#photoviewer .osc-wrapper');
35865
35866                 wrap
35867                     .transition()
35868                     .duration(100)
35869                     .call(imgZoom.transform, identity$7);
35870
35871                 wrap.selectAll('.osc-image')
35872                     .transition()
35873                     .duration(100)
35874                     .style('transform', 'rotate(' + r + 'deg)');
35875             };
35876         }
35877
35878         function step(stepBy) {
35879             return function() {
35880                 if (!_oscSelectedImage) return;
35881                 var sequenceKey = _oscSelectedImage.sequence_id;
35882                 var sequence = _oscCache.sequences[sequenceKey];
35883                 if (!sequence) return;
35884
35885                 var nextIndex = _oscSelectedImage.sequence_index + stepBy;
35886                 var nextImage = sequence.images[nextIndex];
35887                 if (!nextImage) return;
35888
35889                 context.map().centerEase(nextImage.loc);
35890
35891                 that
35892                     .selectImage(nextImage)
35893                     .updateViewer(nextImage);
35894             };
35895         }
35896     },
35897
35898
35899     showViewer: function() {
35900         var viewer = d3_select('#photoviewer')
35901             .classed('hide', false);
35902
35903         var isHidden = viewer.selectAll('.photo-wrapper.osc-wrapper.hide').size();
35904
35905         if (isHidden) {
35906             viewer
35907                 .selectAll('.photo-wrapper:not(.osc-wrapper)')
35908                 .classed('hide', true);
35909
35910             viewer
35911                 .selectAll('.photo-wrapper.osc-wrapper')
35912                 .classed('hide', false);
35913         }
35914
35915         return this;
35916     },
35917
35918
35919     hideViewer: function() {
35920         _oscSelectedImage = null;
35921
35922         var viewer = d3_select('#photoviewer');
35923         if (!viewer.empty()) viewer.datum(null);
35924
35925         viewer
35926             .classed('hide', true)
35927             .selectAll('.photo-wrapper')
35928             .classed('hide', true);
35929
35930         d3_selectAll('.viewfield-group, .sequence, .icon-sign')
35931             .classed('selected', false);
35932
35933         return this.setStyles(null, true);
35934     },
35935
35936
35937     updateViewer: function(d) {
35938         var wrap = d3_select('#photoviewer .osc-wrapper');
35939         var imageWrap = wrap.selectAll('.osc-image-wrap');
35940         var attribution = wrap.selectAll('.photo-attribution').html('');
35941
35942         wrap
35943             .transition()
35944             .duration(100)
35945             .call(imgZoom.transform, identity$7);
35946
35947         imageWrap
35948             .selectAll('.osc-image')
35949             .remove();
35950
35951         if (d) {
35952             var sequence = _oscCache.sequences[d.sequence_id];
35953             var r = (sequence && sequence.rotation) || 0;
35954
35955             imageWrap
35956                 .append('img')
35957                 .attr('class', 'osc-image')
35958                 .attr('src', apibase$2 + '/' + d.imagePath)
35959                 .style('transform', 'rotate(' + r + 'deg)');
35960
35961             if (d.captured_by) {
35962                 attribution
35963                     .append('a')
35964                     .attr('class', 'captured_by')
35965                     .attr('target', '_blank')
35966                     .attr('href', 'https://openstreetcam.org/user/' + encodeURIComponent(d.captured_by))
35967                     .text('@' + d.captured_by);
35968
35969                 attribution
35970                     .append('span')
35971                     .text('|');
35972             }
35973
35974             if (d.captured_at) {
35975                 attribution
35976                     .append('span')
35977                     .attr('class', 'captured_at')
35978                     .text(d.captured_at);
35979
35980                 attribution
35981                     .append('span')
35982                     .text('|');
35983             }
35984
35985             attribution
35986                 .append('a')
35987                 .attr('class', 'image_link')
35988                 .attr('target', '_blank')
35989                 .attr('href', 'https://openstreetcam.org/details/' + d.sequence_id + '/' + d.sequence_index)
35990                 .text('openstreetcam.org');
35991         }
35992         return this;
35993     },
35994
35995
35996     selectImage: function(d) {
35997         _oscSelectedImage = d;
35998         var viewer = d3_select('#photoviewer');
35999         if (!viewer.empty()) viewer.datum(d);
36000
36001         this.setStyles(null, true);
36002
36003         d3_selectAll('.icon-sign')
36004             .classed('selected', false);
36005
36006         return this;
36007     },
36008
36009
36010     getSelectedImage: function() {
36011         return _oscSelectedImage;
36012     },
36013
36014
36015     getSequenceKeyForImage: function(d) {
36016         return d && d.sequence_id;
36017     },
36018
36019
36020     setStyles: function(hovered, reset) {
36021         if (reset) {  // reset all layers
36022             d3_selectAll('.viewfield-group')
36023                 .classed('highlighted', false)
36024                 .classed('hovered', false)
36025                 .classed('selected', false);
36026
36027             d3_selectAll('.sequence')
36028                 .classed('highlighted', false)
36029                 .classed('selected', false);
36030         }
36031
36032         var hoveredImageKey = hovered && hovered.key;
36033         var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
36034         var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
36035         var hoveredImageKeys = (hoveredSequence && hoveredSequence.images.map(function (d) { return d.key; })) || [];
36036
36037         var viewer = d3_select('#photoviewer');
36038         var selected = viewer.empty() ? undefined : viewer.datum();
36039         var selectedImageKey = selected && selected.key;
36040         var selectedSequenceKey = this.getSequenceKeyForImage(selected);
36041         var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
36042         var selectedImageKeys = (selectedSequence && selectedSequence.images.map(function (d) { return d.key; })) || [];
36043
36044         // highlight sibling viewfields on either the selected or the hovered sequences
36045         var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
36046
36047         d3_selectAll('.layer-openstreetcam-images .viewfield-group')
36048             .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
36049             .classed('hovered', function(d) { return d.key === hoveredImageKey; })
36050             .classed('selected', function(d) { return d.key === selectedImageKey; });
36051
36052         d3_selectAll('.layer-openstreetcam-images .sequence')
36053             .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
36054             .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
36055
36056         return this;
36057     },
36058
36059
36060     cache: function() {
36061         return _oscCache;
36062     }
36063
36064 };
36065
36066 /* Built-in method references for those with the same name as other `lodash` methods. */
36067 var nativeCeil = Math.ceil,
36068     nativeMax$4 = Math.max;
36069
36070 /**
36071  * Creates an array of elements split into groups the length of `size`.
36072  * If `array` can't be split evenly, the final chunk will be the remaining
36073  * elements.
36074  *
36075  * @static
36076  * @memberOf _
36077  * @since 3.0.0
36078  * @category Array
36079  * @param {Array} array The array to process.
36080  * @param {number} [size=1] The length of each chunk
36081  * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
36082  * @returns {Array} Returns the new array of chunks.
36083  * @example
36084  *
36085  * _.chunk(['a', 'b', 'c', 'd'], 2);
36086  * // => [['a', 'b'], ['c', 'd']]
36087  *
36088  * _.chunk(['a', 'b', 'c', 'd'], 3);
36089  * // => [['a', 'b', 'c'], ['d']]
36090  */
36091 function chunk(array, size, guard) {
36092   if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
36093     size = 1;
36094   } else {
36095     size = nativeMax$4(toInteger(size), 0);
36096   }
36097   var length = array == null ? 0 : array.length;
36098   if (!length || size < 1) {
36099     return [];
36100   }
36101   var index = 0,
36102       resIndex = 0,
36103       result = Array(nativeCeil(length / size));
36104
36105   while (index < length) {
36106     result[resIndex++] = baseSlice(array, index, (index += size));
36107   }
36108   return result;
36109 }
36110
36111 var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
36112
36113 function createCommonjsModule(fn, module) {
36114         return module = { exports: {} }, fn(module, module.exports), module.exports;
36115 }
36116
36117 var hashes = createCommonjsModule(function (module, exports) {
36118 /**
36119  * jshashes - https://github.com/h2non/jshashes
36120  * Released under the "New BSD" license
36121  *
36122  * Algorithms specification:
36123  *
36124  * MD5 - http://www.ietf.org/rfc/rfc1321.txt
36125  * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
36126  * SHA1   - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
36127  * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
36128  * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
36129  * HMAC - http://www.ietf.org/rfc/rfc2104.txt
36130  */
36131 (function() {
36132   var Hashes;
36133
36134   function utf8Encode(str) {
36135     var x, y, output = '',
36136       i = -1,
36137       l;
36138
36139     if (str && str.length) {
36140       l = str.length;
36141       while ((i += 1) < l) {
36142         /* Decode utf-16 surrogate pairs */
36143         x = str.charCodeAt(i);
36144         y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
36145         if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
36146           x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
36147           i += 1;
36148         }
36149         /* Encode output as utf-8 */
36150         if (x <= 0x7F) {
36151           output += String.fromCharCode(x);
36152         } else if (x <= 0x7FF) {
36153           output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
36154             0x80 | (x & 0x3F));
36155         } else if (x <= 0xFFFF) {
36156           output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
36157             0x80 | ((x >>> 6) & 0x3F),
36158             0x80 | (x & 0x3F));
36159         } else if (x <= 0x1FFFFF) {
36160           output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
36161             0x80 | ((x >>> 12) & 0x3F),
36162             0x80 | ((x >>> 6) & 0x3F),
36163             0x80 | (x & 0x3F));
36164         }
36165       }
36166     }
36167     return output;
36168   }
36169
36170   function utf8Decode(str) {
36171     var i, ac, c1, c2, c3, arr = [],
36172       l;
36173     i = ac = c1 = c2 = c3 = 0;
36174
36175     if (str && str.length) {
36176       l = str.length;
36177       str += '';
36178
36179       while (i < l) {
36180         c1 = str.charCodeAt(i);
36181         ac += 1;
36182         if (c1 < 128) {
36183           arr[ac] = String.fromCharCode(c1);
36184           i += 1;
36185         } else if (c1 > 191 && c1 < 224) {
36186           c2 = str.charCodeAt(i + 1);
36187           arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
36188           i += 2;
36189         } else {
36190           c2 = str.charCodeAt(i + 1);
36191           c3 = str.charCodeAt(i + 2);
36192           arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
36193           i += 3;
36194         }
36195       }
36196     }
36197     return arr.join('');
36198   }
36199
36200   /**
36201    * Add integers, wrapping at 2^32. This uses 16-bit operations internally
36202    * to work around bugs in some JS interpreters.
36203    */
36204
36205   function safe_add(x, y) {
36206     var lsw = (x & 0xFFFF) + (y & 0xFFFF),
36207       msw = (x >> 16) + (y >> 16) + (lsw >> 16);
36208     return (msw << 16) | (lsw & 0xFFFF);
36209   }
36210
36211   /**
36212    * Bitwise rotate a 32-bit number to the left.
36213    */
36214
36215   function bit_rol(num, cnt) {
36216     return (num << cnt) | (num >>> (32 - cnt));
36217   }
36218
36219   /**
36220    * Convert a raw string to a hex string
36221    */
36222
36223   function rstr2hex(input, hexcase) {
36224     var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
36225       output = '',
36226       x, i = 0,
36227       l = input.length;
36228     for (; i < l; i += 1) {
36229       x = input.charCodeAt(i);
36230       output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
36231     }
36232     return output;
36233   }
36234
36235   /**
36236    * Convert an array of big-endian words to a string
36237    */
36238
36239   function binb2rstr(input) {
36240     var i, l = input.length * 32,
36241       output = '';
36242     for (i = 0; i < l; i += 8) {
36243       output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
36244     }
36245     return output;
36246   }
36247
36248   /**
36249    * Convert an array of little-endian words to a string
36250    */
36251
36252   function binl2rstr(input) {
36253     var i, l = input.length * 32,
36254       output = '';
36255     for (i = 0; i < l; i += 8) {
36256       output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
36257     }
36258     return output;
36259   }
36260
36261   /**
36262    * Convert a raw string to an array of little-endian words
36263    * Characters >255 have their high-byte silently ignored.
36264    */
36265
36266   function rstr2binl(input) {
36267     var i, l = input.length * 8,
36268       output = Array(input.length >> 2),
36269       lo = output.length;
36270     for (i = 0; i < lo; i += 1) {
36271       output[i] = 0;
36272     }
36273     for (i = 0; i < l; i += 8) {
36274       output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
36275     }
36276     return output;
36277   }
36278
36279   /**
36280    * Convert a raw string to an array of big-endian words
36281    * Characters >255 have their high-byte silently ignored.
36282    */
36283
36284   function rstr2binb(input) {
36285     var i, l = input.length * 8,
36286       output = Array(input.length >> 2),
36287       lo = output.length;
36288     for (i = 0; i < lo; i += 1) {
36289       output[i] = 0;
36290     }
36291     for (i = 0; i < l; i += 8) {
36292       output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
36293     }
36294     return output;
36295   }
36296
36297   /**
36298    * Convert a raw string to an arbitrary string encoding
36299    */
36300
36301   function rstr2any(input, encoding) {
36302     var divisor = encoding.length,
36303       remainders = Array(),
36304       i, q, x, ld, quotient, dividend, output, full_length;
36305
36306     /* Convert to an array of 16-bit big-endian values, forming the dividend */
36307     dividend = Array(Math.ceil(input.length / 2));
36308     ld = dividend.length;
36309     for (i = 0; i < ld; i += 1) {
36310       dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
36311     }
36312
36313     /**
36314      * Repeatedly perform a long division. The binary array forms the dividend,
36315      * the length of the encoding is the divisor. Once computed, the quotient
36316      * forms the dividend for the next step. We stop when the dividend is zerHashes.
36317      * All remainders are stored for later use.
36318      */
36319     while (dividend.length > 0) {
36320       quotient = Array();
36321       x = 0;
36322       for (i = 0; i < dividend.length; i += 1) {
36323         x = (x << 16) + dividend[i];
36324         q = Math.floor(x / divisor);
36325         x -= q * divisor;
36326         if (quotient.length > 0 || q > 0) {
36327           quotient[quotient.length] = q;
36328         }
36329       }
36330       remainders[remainders.length] = x;
36331       dividend = quotient;
36332     }
36333
36334     /* Convert the remainders to the output string */
36335     output = '';
36336     for (i = remainders.length - 1; i >= 0; i--) {
36337       output += encoding.charAt(remainders[i]);
36338     }
36339
36340     /* Append leading zero equivalents */
36341     full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
36342     for (i = output.length; i < full_length; i += 1) {
36343       output = encoding[0] + output;
36344     }
36345     return output;
36346   }
36347
36348   /**
36349    * Convert a raw string to a base-64 string
36350    */
36351
36352   function rstr2b64(input, b64pad) {
36353     var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
36354       output = '',
36355       len = input.length,
36356       i, j, triplet;
36357     b64pad = b64pad || '=';
36358     for (i = 0; i < len; i += 3) {
36359       triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
36360       for (j = 0; j < 4; j += 1) {
36361         if (i * 8 + j * 6 > input.length * 8) {
36362           output += b64pad;
36363         } else {
36364           output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
36365         }
36366       }
36367     }
36368     return output;
36369   }
36370
36371   Hashes = {
36372     /**
36373      * @property {String} version
36374      * @readonly
36375      */
36376     VERSION: '1.0.6',
36377     /**
36378      * @member Hashes
36379      * @class Base64
36380      * @constructor
36381      */
36382     Base64: function() {
36383       // private properties
36384       var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
36385         pad = '=', // default pad according with the RFC standard
36386         utf8 = true; // by default enable UTF-8 support encoding
36387
36388       // public method for encoding
36389       this.encode = function(input) {
36390         var i, j, triplet,
36391           output = '',
36392           len = input.length;
36393
36394         pad = pad || '=';
36395         input = (utf8) ? utf8Encode(input) : input;
36396
36397         for (i = 0; i < len; i += 3) {
36398           triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
36399           for (j = 0; j < 4; j += 1) {
36400             if (i * 8 + j * 6 > len * 8) {
36401               output += pad;
36402             } else {
36403               output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
36404             }
36405           }
36406         }
36407         return output;
36408       };
36409
36410       // public method for decoding
36411       this.decode = function(input) {
36412         // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
36413         var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
36414           dec = '',
36415           arr = [];
36416         if (!input) {
36417           return input;
36418         }
36419
36420         i = ac = 0;
36421         input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
36422         //input += '';
36423
36424         do { // unpack four hexets into three octets using index points in b64
36425           h1 = tab.indexOf(input.charAt(i += 1));
36426           h2 = tab.indexOf(input.charAt(i += 1));
36427           h3 = tab.indexOf(input.charAt(i += 1));
36428           h4 = tab.indexOf(input.charAt(i += 1));
36429
36430           bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
36431
36432           o1 = bits >> 16 & 0xff;
36433           o2 = bits >> 8 & 0xff;
36434           o3 = bits & 0xff;
36435           ac += 1;
36436
36437           if (h3 === 64) {
36438             arr[ac] = String.fromCharCode(o1);
36439           } else if (h4 === 64) {
36440             arr[ac] = String.fromCharCode(o1, o2);
36441           } else {
36442             arr[ac] = String.fromCharCode(o1, o2, o3);
36443           }
36444         } while (i < input.length);
36445
36446         dec = arr.join('');
36447         dec = (utf8) ? utf8Decode(dec) : dec;
36448
36449         return dec;
36450       };
36451
36452       // set custom pad string
36453       this.setPad = function(str) {
36454         pad = str || pad;
36455         return this;
36456       };
36457       // set custom tab string characters
36458       this.setTab = function(str) {
36459         tab = str || tab;
36460         return this;
36461       };
36462       this.setUTF8 = function(bool) {
36463         if (typeof bool === 'boolean') {
36464           utf8 = bool;
36465         }
36466         return this;
36467       };
36468     },
36469
36470     /**
36471      * CRC-32 calculation
36472      * @member Hashes
36473      * @method CRC32
36474      * @static
36475      * @param {String} str Input String
36476      * @return {String}
36477      */
36478     CRC32: function(str) {
36479       var crc = 0,
36480         x = 0,
36481         y = 0,
36482         table, i, iTop;
36483       str = utf8Encode(str);
36484
36485       table = [
36486         '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
36487         '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
36488         '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
36489         '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
36490         'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
36491         '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
36492         'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
36493         '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
36494         'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
36495         '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
36496         'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
36497         '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
36498         'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
36499         '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
36500         '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
36501         '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
36502         '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
36503         'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
36504         '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
36505         'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
36506         '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
36507         'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
36508         '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
36509         'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
36510         '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
36511         'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
36512       ].join('');
36513
36514       crc = crc ^ (-1);
36515       for (i = 0, iTop = str.length; i < iTop; i += 1) {
36516         y = (crc ^ str.charCodeAt(i)) & 0xFF;
36517         x = '0x' + table.substr(y * 9, 8);
36518         crc = (crc >>> 8) ^ x;
36519       }
36520       // always return a positive number (that's what >>> 0 does)
36521       return (crc ^ (-1)) >>> 0;
36522     },
36523     /**
36524      * @member Hashes
36525      * @class MD5
36526      * @constructor
36527      * @param {Object} [config]
36528      *
36529      * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
36530      * Digest Algorithm, as defined in RFC 1321.
36531      * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
36532      * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
36533      * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
36534      */
36535     MD5: function(options) {
36536       /**
36537        * Private config properties. You may need to tweak these to be compatible with
36538        * the server-side, but the defaults work in most cases.
36539        * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
36540        */
36541       var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
36542         b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
36543         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
36544
36545       // privileged (public) methods
36546       this.hex = function(s) {
36547         return rstr2hex(rstr(s, utf8), hexcase);
36548       };
36549       this.b64 = function(s) {
36550         return rstr2b64(rstr(s), b64pad);
36551       };
36552       this.any = function(s, e) {
36553         return rstr2any(rstr(s, utf8), e);
36554       };
36555       this.raw = function(s) {
36556         return rstr(s, utf8);
36557       };
36558       this.hex_hmac = function(k, d) {
36559         return rstr2hex(rstr_hmac(k, d), hexcase);
36560       };
36561       this.b64_hmac = function(k, d) {
36562         return rstr2b64(rstr_hmac(k, d), b64pad);
36563       };
36564       this.any_hmac = function(k, d, e) {
36565         return rstr2any(rstr_hmac(k, d), e);
36566       };
36567       /**
36568        * Perform a simple self-test to see if the VM is working
36569        * @return {String} Hexadecimal hash sample
36570        */
36571       this.vm_test = function() {
36572         return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
36573       };
36574       /**
36575        * Enable/disable uppercase hexadecimal returned string
36576        * @param {Boolean}
36577        * @return {Object} this
36578        */
36579       this.setUpperCase = function(a) {
36580         if (typeof a === 'boolean') {
36581           hexcase = a;
36582         }
36583         return this;
36584       };
36585       /**
36586        * Defines a base64 pad string
36587        * @param {String} Pad
36588        * @return {Object} this
36589        */
36590       this.setPad = function(a) {
36591         b64pad = a || b64pad;
36592         return this;
36593       };
36594       /**
36595        * Defines a base64 pad string
36596        * @param {Boolean}
36597        * @return {Object} [this]
36598        */
36599       this.setUTF8 = function(a) {
36600         if (typeof a === 'boolean') {
36601           utf8 = a;
36602         }
36603         return this;
36604       };
36605
36606       // private methods
36607
36608       /**
36609        * Calculate the MD5 of a raw string
36610        */
36611
36612       function rstr(s) {
36613         s = (utf8) ? utf8Encode(s) : s;
36614         return binl2rstr(binl(rstr2binl(s), s.length * 8));
36615       }
36616
36617       /**
36618        * Calculate the HMAC-MD5, of a key and some data (raw strings)
36619        */
36620
36621       function rstr_hmac(key, data) {
36622         var bkey, ipad, opad, hash, i;
36623
36624         key = (utf8) ? utf8Encode(key) : key;
36625         data = (utf8) ? utf8Encode(data) : data;
36626         bkey = rstr2binl(key);
36627         if (bkey.length > 16) {
36628           bkey = binl(bkey, key.length * 8);
36629         }
36630
36631         ipad = Array(16), opad = Array(16);
36632         for (i = 0; i < 16; i += 1) {
36633           ipad[i] = bkey[i] ^ 0x36363636;
36634           opad[i] = bkey[i] ^ 0x5C5C5C5C;
36635         }
36636         hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
36637         return binl2rstr(binl(opad.concat(hash), 512 + 128));
36638       }
36639
36640       /**
36641        * Calculate the MD5 of an array of little-endian words, and a bit length.
36642        */
36643
36644       function binl(x, len) {
36645         var i, olda, oldb, oldc, oldd,
36646           a = 1732584193,
36647           b = -271733879,
36648           c = -1732584194,
36649           d = 271733878;
36650
36651         /* append padding */
36652         x[len >> 5] |= 0x80 << ((len) % 32);
36653         x[(((len + 64) >>> 9) << 4) + 14] = len;
36654
36655         for (i = 0; i < x.length; i += 16) {
36656           olda = a;
36657           oldb = b;
36658           oldc = c;
36659           oldd = d;
36660
36661           a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
36662           d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
36663           c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
36664           b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
36665           a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
36666           d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
36667           c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
36668           b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
36669           a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
36670           d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
36671           c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
36672           b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
36673           a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
36674           d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
36675           c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
36676           b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
36677
36678           a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
36679           d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
36680           c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
36681           b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
36682           a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
36683           d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
36684           c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
36685           b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
36686           a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
36687           d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
36688           c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
36689           b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
36690           a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
36691           d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
36692           c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
36693           b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
36694
36695           a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
36696           d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
36697           c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
36698           b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
36699           a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
36700           d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
36701           c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
36702           b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
36703           a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
36704           d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
36705           c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
36706           b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
36707           a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
36708           d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
36709           c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
36710           b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
36711
36712           a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
36713           d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
36714           c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
36715           b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
36716           a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
36717           d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
36718           c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
36719           b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
36720           a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
36721           d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
36722           c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
36723           b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
36724           a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
36725           d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
36726           c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
36727           b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
36728
36729           a = safe_add(a, olda);
36730           b = safe_add(b, oldb);
36731           c = safe_add(c, oldc);
36732           d = safe_add(d, oldd);
36733         }
36734         return Array(a, b, c, d);
36735       }
36736
36737       /**
36738        * These functions implement the four basic operations the algorithm uses.
36739        */
36740
36741       function md5_cmn(q, a, b, x, s, t) {
36742         return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
36743       }
36744
36745       function md5_ff(a, b, c, d, x, s, t) {
36746         return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
36747       }
36748
36749       function md5_gg(a, b, c, d, x, s, t) {
36750         return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
36751       }
36752
36753       function md5_hh(a, b, c, d, x, s, t) {
36754         return md5_cmn(b ^ c ^ d, a, b, x, s, t);
36755       }
36756
36757       function md5_ii(a, b, c, d, x, s, t) {
36758         return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
36759       }
36760     },
36761     /**
36762      * @member Hashes
36763      * @class Hashes.SHA1
36764      * @param {Object} [config]
36765      * @constructor
36766      *
36767      * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
36768      * Version 2.2 Copyright Paul Johnston 2000 - 2009.
36769      * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
36770      * See http://pajhome.org.uk/crypt/md5 for details.
36771      */
36772     SHA1: function(options) {
36773       /**
36774        * Private config properties. You may need to tweak these to be compatible with
36775        * the server-side, but the defaults work in most cases.
36776        * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
36777        */
36778       var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
36779         b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
36780         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
36781
36782       // public methods
36783       this.hex = function(s) {
36784         return rstr2hex(rstr(s, utf8), hexcase);
36785       };
36786       this.b64 = function(s) {
36787         return rstr2b64(rstr(s, utf8), b64pad);
36788       };
36789       this.any = function(s, e) {
36790         return rstr2any(rstr(s, utf8), e);
36791       };
36792       this.raw = function(s) {
36793         return rstr(s, utf8);
36794       };
36795       this.hex_hmac = function(k, d) {
36796         return rstr2hex(rstr_hmac(k, d));
36797       };
36798       this.b64_hmac = function(k, d) {
36799         return rstr2b64(rstr_hmac(k, d), b64pad);
36800       };
36801       this.any_hmac = function(k, d, e) {
36802         return rstr2any(rstr_hmac(k, d), e);
36803       };
36804       /**
36805        * Perform a simple self-test to see if the VM is working
36806        * @return {String} Hexadecimal hash sample
36807        * @public
36808        */
36809       this.vm_test = function() {
36810         return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
36811       };
36812       /**
36813        * @description Enable/disable uppercase hexadecimal returned string
36814        * @param {boolean}
36815        * @return {Object} this
36816        * @public
36817        */
36818       this.setUpperCase = function(a) {
36819         if (typeof a === 'boolean') {
36820           hexcase = a;
36821         }
36822         return this;
36823       };
36824       /**
36825        * @description Defines a base64 pad string
36826        * @param {string} Pad
36827        * @return {Object} this
36828        * @public
36829        */
36830       this.setPad = function(a) {
36831         b64pad = a || b64pad;
36832         return this;
36833       };
36834       /**
36835        * @description Defines a base64 pad string
36836        * @param {boolean}
36837        * @return {Object} this
36838        * @public
36839        */
36840       this.setUTF8 = function(a) {
36841         if (typeof a === 'boolean') {
36842           utf8 = a;
36843         }
36844         return this;
36845       };
36846
36847       // private methods
36848
36849       /**
36850        * Calculate the SHA-512 of a raw string
36851        */
36852
36853       function rstr(s) {
36854         s = (utf8) ? utf8Encode(s) : s;
36855         return binb2rstr(binb(rstr2binb(s), s.length * 8));
36856       }
36857
36858       /**
36859        * Calculate the HMAC-SHA1 of a key and some data (raw strings)
36860        */
36861
36862       function rstr_hmac(key, data) {
36863         var bkey, ipad, opad, i, hash;
36864         key = (utf8) ? utf8Encode(key) : key;
36865         data = (utf8) ? utf8Encode(data) : data;
36866         bkey = rstr2binb(key);
36867
36868         if (bkey.length > 16) {
36869           bkey = binb(bkey, key.length * 8);
36870         }
36871         ipad = Array(16), opad = Array(16);
36872         for (i = 0; i < 16; i += 1) {
36873           ipad[i] = bkey[i] ^ 0x36363636;
36874           opad[i] = bkey[i] ^ 0x5C5C5C5C;
36875         }
36876         hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
36877         return binb2rstr(binb(opad.concat(hash), 512 + 160));
36878       }
36879
36880       /**
36881        * Calculate the SHA-1 of an array of big-endian words, and a bit length
36882        */
36883
36884       function binb(x, len) {
36885         var i, j, t, olda, oldb, oldc, oldd, olde,
36886           w = Array(80),
36887           a = 1732584193,
36888           b = -271733879,
36889           c = -1732584194,
36890           d = 271733878,
36891           e = -1009589776;
36892
36893         /* append padding */
36894         x[len >> 5] |= 0x80 << (24 - len % 32);
36895         x[((len + 64 >> 9) << 4) + 15] = len;
36896
36897         for (i = 0; i < x.length; i += 16) {
36898           olda = a;
36899           oldb = b;
36900           oldc = c;
36901           oldd = d;
36902           olde = e;
36903
36904           for (j = 0; j < 80; j += 1) {
36905             if (j < 16) {
36906               w[j] = x[i + j];
36907             } else {
36908               w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
36909             }
36910             t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
36911               safe_add(safe_add(e, w[j]), sha1_kt(j)));
36912             e = d;
36913             d = c;
36914             c = bit_rol(b, 30);
36915             b = a;
36916             a = t;
36917           }
36918
36919           a = safe_add(a, olda);
36920           b = safe_add(b, oldb);
36921           c = safe_add(c, oldc);
36922           d = safe_add(d, oldd);
36923           e = safe_add(e, olde);
36924         }
36925         return Array(a, b, c, d, e);
36926       }
36927
36928       /**
36929        * Perform the appropriate triplet combination function for the current
36930        * iteration
36931        */
36932
36933       function sha1_ft(t, b, c, d) {
36934         if (t < 20) {
36935           return (b & c) | ((~b) & d);
36936         }
36937         if (t < 40) {
36938           return b ^ c ^ d;
36939         }
36940         if (t < 60) {
36941           return (b & c) | (b & d) | (c & d);
36942         }
36943         return b ^ c ^ d;
36944       }
36945
36946       /**
36947        * Determine the appropriate additive constant for the current iteration
36948        */
36949
36950       function sha1_kt(t) {
36951         return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
36952           (t < 60) ? -1894007588 : -899497514;
36953       }
36954     },
36955     /**
36956      * @class Hashes.SHA256
36957      * @param {config}
36958      *
36959      * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
36960      * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
36961      * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
36962      * See http://pajhome.org.uk/crypt/md5 for details.
36963      * Also http://anmar.eu.org/projects/jssha2/
36964      */
36965     SHA256: function(options) {
36966       /**
36967        * Private properties configuration variables. You may need to tweak these to be compatible with
36968        * the server-side, but the defaults work in most cases.
36969        * @see this.setUpperCase() method
36970        * @see this.setPad() method
36971        */
36972       var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase  */
36973         b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
36974         /* base-64 pad character. Default '=' for strict RFC compliance   */
36975         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
36976         /* enable/disable utf8 encoding */
36977         sha256_K;
36978
36979       /* privileged (public) methods */
36980       this.hex = function(s) {
36981         return rstr2hex(rstr(s, utf8));
36982       };
36983       this.b64 = function(s) {
36984         return rstr2b64(rstr(s, utf8), b64pad);
36985       };
36986       this.any = function(s, e) {
36987         return rstr2any(rstr(s, utf8), e);
36988       };
36989       this.raw = function(s) {
36990         return rstr(s, utf8);
36991       };
36992       this.hex_hmac = function(k, d) {
36993         return rstr2hex(rstr_hmac(k, d));
36994       };
36995       this.b64_hmac = function(k, d) {
36996         return rstr2b64(rstr_hmac(k, d), b64pad);
36997       };
36998       this.any_hmac = function(k, d, e) {
36999         return rstr2any(rstr_hmac(k, d), e);
37000       };
37001       /**
37002        * Perform a simple self-test to see if the VM is working
37003        * @return {String} Hexadecimal hash sample
37004        * @public
37005        */
37006       this.vm_test = function() {
37007         return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
37008       };
37009       /**
37010        * Enable/disable uppercase hexadecimal returned string
37011        * @param {boolean}
37012        * @return {Object} this
37013        * @public
37014        */
37015       this.setUpperCase = function(a) {
37016         if (typeof a === 'boolean') {
37017           hexcase = a;
37018         }
37019         return this;
37020       };
37021       /**
37022        * @description Defines a base64 pad string
37023        * @param {string} Pad
37024        * @return {Object} this
37025        * @public
37026        */
37027       this.setPad = function(a) {
37028         b64pad = a || b64pad;
37029         return this;
37030       };
37031       /**
37032        * Defines a base64 pad string
37033        * @param {boolean}
37034        * @return {Object} this
37035        * @public
37036        */
37037       this.setUTF8 = function(a) {
37038         if (typeof a === 'boolean') {
37039           utf8 = a;
37040         }
37041         return this;
37042       };
37043
37044       // private methods
37045
37046       /**
37047        * Calculate the SHA-512 of a raw string
37048        */
37049
37050       function rstr(s, utf8) {
37051         s = (utf8) ? utf8Encode(s) : s;
37052         return binb2rstr(binb(rstr2binb(s), s.length * 8));
37053       }
37054
37055       /**
37056        * Calculate the HMAC-sha256 of a key and some data (raw strings)
37057        */
37058
37059       function rstr_hmac(key, data) {
37060         key = (utf8) ? utf8Encode(key) : key;
37061         data = (utf8) ? utf8Encode(data) : data;
37062         var hash, i = 0,
37063           bkey = rstr2binb(key),
37064           ipad = Array(16),
37065           opad = Array(16);
37066
37067         if (bkey.length > 16) {
37068           bkey = binb(bkey, key.length * 8);
37069         }
37070
37071         for (; i < 16; i += 1) {
37072           ipad[i] = bkey[i] ^ 0x36363636;
37073           opad[i] = bkey[i] ^ 0x5C5C5C5C;
37074         }
37075
37076         hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
37077         return binb2rstr(binb(opad.concat(hash), 512 + 256));
37078       }
37079
37080       /*
37081        * Main sha256 function, with its support functions
37082        */
37083
37084       function sha256_S(X, n) {
37085         return (X >>> n) | (X << (32 - n));
37086       }
37087
37088       function sha256_R(X, n) {
37089         return (X >>> n);
37090       }
37091
37092       function sha256_Ch(x, y, z) {
37093         return ((x & y) ^ ((~x) & z));
37094       }
37095
37096       function sha256_Maj(x, y, z) {
37097         return ((x & y) ^ (x & z) ^ (y & z));
37098       }
37099
37100       function sha256_Sigma0256(x) {
37101         return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
37102       }
37103
37104       function sha256_Sigma1256(x) {
37105         return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
37106       }
37107
37108       function sha256_Gamma0256(x) {
37109         return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
37110       }
37111
37112       function sha256_Gamma1256(x) {
37113         return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
37114       }
37115
37116       sha256_K = [
37117         1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
37118         1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
37119         264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
37120         113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
37121         1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
37122         430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
37123         1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998
37124       ];
37125
37126       function binb(m, l) {
37127         var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
37128           1359893119, -1694144372, 528734635, 1541459225
37129         ];
37130         var W = new Array(64);
37131         var a, b, c, d, e, f, g, h;
37132         var i, j, T1, T2;
37133
37134         /* append padding */
37135         m[l >> 5] |= 0x80 << (24 - l % 32);
37136         m[((l + 64 >> 9) << 4) + 15] = l;
37137
37138         for (i = 0; i < m.length; i += 16) {
37139           a = HASH[0];
37140           b = HASH[1];
37141           c = HASH[2];
37142           d = HASH[3];
37143           e = HASH[4];
37144           f = HASH[5];
37145           g = HASH[6];
37146           h = HASH[7];
37147
37148           for (j = 0; j < 64; j += 1) {
37149             if (j < 16) {
37150               W[j] = m[j + i];
37151             } else {
37152               W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
37153                 sha256_Gamma0256(W[j - 15])), W[j - 16]);
37154             }
37155
37156             T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
37157               sha256_K[j]), W[j]);
37158             T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
37159             h = g;
37160             g = f;
37161             f = e;
37162             e = safe_add(d, T1);
37163             d = c;
37164             c = b;
37165             b = a;
37166             a = safe_add(T1, T2);
37167           }
37168
37169           HASH[0] = safe_add(a, HASH[0]);
37170           HASH[1] = safe_add(b, HASH[1]);
37171           HASH[2] = safe_add(c, HASH[2]);
37172           HASH[3] = safe_add(d, HASH[3]);
37173           HASH[4] = safe_add(e, HASH[4]);
37174           HASH[5] = safe_add(f, HASH[5]);
37175           HASH[6] = safe_add(g, HASH[6]);
37176           HASH[7] = safe_add(h, HASH[7]);
37177         }
37178         return HASH;
37179       }
37180
37181     },
37182
37183     /**
37184      * @class Hashes.SHA512
37185      * @param {config}
37186      *
37187      * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
37188      * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
37189      * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
37190      * See http://pajhome.org.uk/crypt/md5 for details.
37191      */
37192     SHA512: function(options) {
37193       /**
37194        * Private properties configuration variables. You may need to tweak these to be compatible with
37195        * the server-side, but the defaults work in most cases.
37196        * @see this.setUpperCase() method
37197        * @see this.setPad() method
37198        */
37199       var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
37200         /* hexadecimal output case format. false - lowercase; true - uppercase  */
37201         b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
37202         /* base-64 pad character. Default '=' for strict RFC compliance   */
37203         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
37204         /* enable/disable utf8 encoding */
37205         sha512_k;
37206
37207       /* privileged (public) methods */
37208       this.hex = function(s) {
37209         return rstr2hex(rstr(s));
37210       };
37211       this.b64 = function(s) {
37212         return rstr2b64(rstr(s), b64pad);
37213       };
37214       this.any = function(s, e) {
37215         return rstr2any(rstr(s), e);
37216       };
37217       this.raw = function(s) {
37218         return rstr(s, utf8);
37219       };
37220       this.hex_hmac = function(k, d) {
37221         return rstr2hex(rstr_hmac(k, d));
37222       };
37223       this.b64_hmac = function(k, d) {
37224         return rstr2b64(rstr_hmac(k, d), b64pad);
37225       };
37226       this.any_hmac = function(k, d, e) {
37227         return rstr2any(rstr_hmac(k, d), e);
37228       };
37229       /**
37230        * Perform a simple self-test to see if the VM is working
37231        * @return {String} Hexadecimal hash sample
37232        * @public
37233        */
37234       this.vm_test = function() {
37235         return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
37236       };
37237       /**
37238        * @description Enable/disable uppercase hexadecimal returned string
37239        * @param {boolean}
37240        * @return {Object} this
37241        * @public
37242        */
37243       this.setUpperCase = function(a) {
37244         if (typeof a === 'boolean') {
37245           hexcase = a;
37246         }
37247         return this;
37248       };
37249       /**
37250        * @description Defines a base64 pad string
37251        * @param {string} Pad
37252        * @return {Object} this
37253        * @public
37254        */
37255       this.setPad = function(a) {
37256         b64pad = a || b64pad;
37257         return this;
37258       };
37259       /**
37260        * @description Defines a base64 pad string
37261        * @param {boolean}
37262        * @return {Object} this
37263        * @public
37264        */
37265       this.setUTF8 = function(a) {
37266         if (typeof a === 'boolean') {
37267           utf8 = a;
37268         }
37269         return this;
37270       };
37271
37272       /* private methods */
37273
37274       /**
37275        * Calculate the SHA-512 of a raw string
37276        */
37277
37278       function rstr(s) {
37279         s = (utf8) ? utf8Encode(s) : s;
37280         return binb2rstr(binb(rstr2binb(s), s.length * 8));
37281       }
37282       /*
37283        * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
37284        */
37285
37286       function rstr_hmac(key, data) {
37287         key = (utf8) ? utf8Encode(key) : key;
37288         data = (utf8) ? utf8Encode(data) : data;
37289
37290         var hash, i = 0,
37291           bkey = rstr2binb(key),
37292           ipad = Array(32),
37293           opad = Array(32);
37294
37295         if (bkey.length > 32) {
37296           bkey = binb(bkey, key.length * 8);
37297         }
37298
37299         for (; i < 32; i += 1) {
37300           ipad[i] = bkey[i] ^ 0x36363636;
37301           opad[i] = bkey[i] ^ 0x5C5C5C5C;
37302         }
37303
37304         hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
37305         return binb2rstr(binb(opad.concat(hash), 1024 + 512));
37306       }
37307
37308       /**
37309        * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
37310        */
37311
37312       function binb(x, len) {
37313         var j, i, l,
37314           W = new Array(80),
37315           hash = new Array(16),
37316           //Initial hash values
37317           H = [
37318             new int64(0x6a09e667, -205731576),
37319             new int64(-1150833019, -2067093701),
37320             new int64(0x3c6ef372, -23791573),
37321             new int64(-1521486534, 0x5f1d36f1),
37322             new int64(0x510e527f, -1377402159),
37323             new int64(-1694144372, 0x2b3e6c1f),
37324             new int64(0x1f83d9ab, -79577749),
37325             new int64(0x5be0cd19, 0x137e2179)
37326           ],
37327           T1 = new int64(0, 0),
37328           T2 = new int64(0, 0),
37329           a = new int64(0, 0),
37330           b = new int64(0, 0),
37331           c = new int64(0, 0),
37332           d = new int64(0, 0),
37333           e = new int64(0, 0),
37334           f = new int64(0, 0),
37335           g = new int64(0, 0),
37336           h = new int64(0, 0),
37337           //Temporary variables not specified by the document
37338           s0 = new int64(0, 0),
37339           s1 = new int64(0, 0),
37340           Ch = new int64(0, 0),
37341           Maj = new int64(0, 0),
37342           r1 = new int64(0, 0),
37343           r2 = new int64(0, 0),
37344           r3 = new int64(0, 0);
37345
37346         if (sha512_k === undefined) {
37347           //SHA512 constants
37348           sha512_k = [
37349             new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
37350             new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
37351             new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
37352             new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
37353             new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
37354             new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
37355             new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
37356             new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
37357             new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
37358             new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
37359             new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
37360             new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
37361             new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
37362             new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
37363             new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
37364             new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
37365             new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
37366             new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
37367             new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
37368             new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
37369             new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
37370             new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
37371             new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
37372             new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
37373             new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
37374             new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
37375             new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
37376             new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
37377             new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
37378             new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
37379             new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
37380             new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
37381             new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
37382             new int64(-354779690, -840897762), new int64(-176337025, -294727304),
37383             new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
37384             new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
37385             new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
37386             new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
37387             new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
37388             new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
37389           ];
37390         }
37391
37392         for (i = 0; i < 80; i += 1) {
37393           W[i] = new int64(0, 0);
37394         }
37395
37396         // append padding to the source string. The format is described in the FIPS.
37397         x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
37398         x[((len + 128 >> 10) << 5) + 31] = len;
37399         l = x.length;
37400         for (i = 0; i < l; i += 32) { //32 dwords is the block size
37401           int64copy(a, H[0]);
37402           int64copy(b, H[1]);
37403           int64copy(c, H[2]);
37404           int64copy(d, H[3]);
37405           int64copy(e, H[4]);
37406           int64copy(f, H[5]);
37407           int64copy(g, H[6]);
37408           int64copy(h, H[7]);
37409
37410           for (j = 0; j < 16; j += 1) {
37411             W[j].h = x[i + 2 * j];
37412             W[j].l = x[i + 2 * j + 1];
37413           }
37414
37415           for (j = 16; j < 80; j += 1) {
37416             //sigma1
37417             int64rrot(r1, W[j - 2], 19);
37418             int64revrrot(r2, W[j - 2], 29);
37419             int64shr(r3, W[j - 2], 6);
37420             s1.l = r1.l ^ r2.l ^ r3.l;
37421             s1.h = r1.h ^ r2.h ^ r3.h;
37422             //sigma0
37423             int64rrot(r1, W[j - 15], 1);
37424             int64rrot(r2, W[j - 15], 8);
37425             int64shr(r3, W[j - 15], 7);
37426             s0.l = r1.l ^ r2.l ^ r3.l;
37427             s0.h = r1.h ^ r2.h ^ r3.h;
37428
37429             int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
37430           }
37431
37432           for (j = 0; j < 80; j += 1) {
37433             //Ch
37434             Ch.l = (e.l & f.l) ^ (~e.l & g.l);
37435             Ch.h = (e.h & f.h) ^ (~e.h & g.h);
37436
37437             //Sigma1
37438             int64rrot(r1, e, 14);
37439             int64rrot(r2, e, 18);
37440             int64revrrot(r3, e, 9);
37441             s1.l = r1.l ^ r2.l ^ r3.l;
37442             s1.h = r1.h ^ r2.h ^ r3.h;
37443
37444             //Sigma0
37445             int64rrot(r1, a, 28);
37446             int64revrrot(r2, a, 2);
37447             int64revrrot(r3, a, 7);
37448             s0.l = r1.l ^ r2.l ^ r3.l;
37449             s0.h = r1.h ^ r2.h ^ r3.h;
37450
37451             //Maj
37452             Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
37453             Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
37454
37455             int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
37456             int64add(T2, s0, Maj);
37457
37458             int64copy(h, g);
37459             int64copy(g, f);
37460             int64copy(f, e);
37461             int64add(e, d, T1);
37462             int64copy(d, c);
37463             int64copy(c, b);
37464             int64copy(b, a);
37465             int64add(a, T1, T2);
37466           }
37467           int64add(H[0], H[0], a);
37468           int64add(H[1], H[1], b);
37469           int64add(H[2], H[2], c);
37470           int64add(H[3], H[3], d);
37471           int64add(H[4], H[4], e);
37472           int64add(H[5], H[5], f);
37473           int64add(H[6], H[6], g);
37474           int64add(H[7], H[7], h);
37475         }
37476
37477         //represent the hash as an array of 32-bit dwords
37478         for (i = 0; i < 8; i += 1) {
37479           hash[2 * i] = H[i].h;
37480           hash[2 * i + 1] = H[i].l;
37481         }
37482         return hash;
37483       }
37484
37485       //A constructor for 64-bit numbers
37486
37487       function int64(h, l) {
37488         this.h = h;
37489         this.l = l;
37490         //this.toString = int64toString;
37491       }
37492
37493       //Copies src into dst, assuming both are 64-bit numbers
37494
37495       function int64copy(dst, src) {
37496         dst.h = src.h;
37497         dst.l = src.l;
37498       }
37499
37500       //Right-rotates a 64-bit number by shift
37501       //Won't handle cases of shift>=32
37502       //The function revrrot() is for that
37503
37504       function int64rrot(dst, x, shift) {
37505         dst.l = (x.l >>> shift) | (x.h << (32 - shift));
37506         dst.h = (x.h >>> shift) | (x.l << (32 - shift));
37507       }
37508
37509       //Reverses the dwords of the source and then rotates right by shift.
37510       //This is equivalent to rotation by 32+shift
37511
37512       function int64revrrot(dst, x, shift) {
37513         dst.l = (x.h >>> shift) | (x.l << (32 - shift));
37514         dst.h = (x.l >>> shift) | (x.h << (32 - shift));
37515       }
37516
37517       //Bitwise-shifts right a 64-bit number by shift
37518       //Won't handle shift>=32, but it's never needed in SHA512
37519
37520       function int64shr(dst, x, shift) {
37521         dst.l = (x.l >>> shift) | (x.h << (32 - shift));
37522         dst.h = (x.h >>> shift);
37523       }
37524
37525       //Adds two 64-bit numbers
37526       //Like the original implementation, does not rely on 32-bit operations
37527
37528       function int64add(dst, x, y) {
37529         var w0 = (x.l & 0xffff) + (y.l & 0xffff);
37530         var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
37531         var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
37532         var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
37533         dst.l = (w0 & 0xffff) | (w1 << 16);
37534         dst.h = (w2 & 0xffff) | (w3 << 16);
37535       }
37536
37537       //Same, except with 4 addends. Works faster than adding them one by one.
37538
37539       function int64add4(dst, a, b, c, d) {
37540         var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
37541         var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
37542         var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
37543         var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
37544         dst.l = (w0 & 0xffff) | (w1 << 16);
37545         dst.h = (w2 & 0xffff) | (w3 << 16);
37546       }
37547
37548       //Same, except with 5 addends
37549
37550       function int64add5(dst, a, b, c, d, e) {
37551         var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
37552           w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
37553           w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
37554           w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
37555         dst.l = (w0 & 0xffff) | (w1 << 16);
37556         dst.h = (w2 & 0xffff) | (w3 << 16);
37557       }
37558     },
37559     /**
37560      * @class Hashes.RMD160
37561      * @constructor
37562      * @param {Object} [config]
37563      *
37564      * A JavaScript implementation of the RIPEMD-160 Algorithm
37565      * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
37566      * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
37567      * See http://pajhome.org.uk/crypt/md5 for details.
37568      * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
37569      */
37570     RMD160: function(options) {
37571       /**
37572        * Private properties configuration variables. You may need to tweak these to be compatible with
37573        * the server-side, but the defaults work in most cases.
37574        * @see this.setUpperCase() method
37575        * @see this.setPad() method
37576        */
37577       var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
37578         /* hexadecimal output case format. false - lowercase; true - uppercase  */
37579         b64pad = (options && typeof options.pad === 'string') ? options.pa : '=',
37580         /* base-64 pad character. Default '=' for strict RFC compliance   */
37581         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
37582         /* enable/disable utf8 encoding */
37583         rmd160_r1 = [
37584           0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
37585           7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
37586           3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
37587           1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
37588           4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
37589         ],
37590         rmd160_r2 = [
37591           5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
37592           6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
37593           15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
37594           8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
37595           12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
37596         ],
37597         rmd160_s1 = [
37598           11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
37599           7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
37600           11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
37601           11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
37602           9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
37603         ],
37604         rmd160_s2 = [
37605           8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
37606           9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
37607           9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
37608           15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
37609           8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
37610         ];
37611
37612       /* privileged (public) methods */
37613       this.hex = function(s) {
37614         return rstr2hex(rstr(s, utf8));
37615       };
37616       this.b64 = function(s) {
37617         return rstr2b64(rstr(s, utf8), b64pad);
37618       };
37619       this.any = function(s, e) {
37620         return rstr2any(rstr(s, utf8), e);
37621       };
37622       this.raw = function(s) {
37623         return rstr(s, utf8);
37624       };
37625       this.hex_hmac = function(k, d) {
37626         return rstr2hex(rstr_hmac(k, d));
37627       };
37628       this.b64_hmac = function(k, d) {
37629         return rstr2b64(rstr_hmac(k, d), b64pad);
37630       };
37631       this.any_hmac = function(k, d, e) {
37632         return rstr2any(rstr_hmac(k, d), e);
37633       };
37634       /**
37635        * Perform a simple self-test to see if the VM is working
37636        * @return {String} Hexadecimal hash sample
37637        * @public
37638        */
37639       this.vm_test = function() {
37640         return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
37641       };
37642       /**
37643        * @description Enable/disable uppercase hexadecimal returned string
37644        * @param {boolean}
37645        * @return {Object} this
37646        * @public
37647        */
37648       this.setUpperCase = function(a) {
37649         if (typeof a === 'boolean') {
37650           hexcase = a;
37651         }
37652         return this;
37653       };
37654       /**
37655        * @description Defines a base64 pad string
37656        * @param {string} Pad
37657        * @return {Object} this
37658        * @public
37659        */
37660       this.setPad = function(a) {
37661         if (typeof a !== 'undefined') {
37662           b64pad = a;
37663         }
37664         return this;
37665       };
37666       /**
37667        * @description Defines a base64 pad string
37668        * @param {boolean}
37669        * @return {Object} this
37670        * @public
37671        */
37672       this.setUTF8 = function(a) {
37673         if (typeof a === 'boolean') {
37674           utf8 = a;
37675         }
37676         return this;
37677       };
37678
37679       /* private methods */
37680
37681       /**
37682        * Calculate the rmd160 of a raw string
37683        */
37684
37685       function rstr(s) {
37686         s = (utf8) ? utf8Encode(s) : s;
37687         return binl2rstr(binl(rstr2binl(s), s.length * 8));
37688       }
37689
37690       /**
37691        * Calculate the HMAC-rmd160 of a key and some data (raw strings)
37692        */
37693
37694       function rstr_hmac(key, data) {
37695         key = (utf8) ? utf8Encode(key) : key;
37696         data = (utf8) ? utf8Encode(data) : data;
37697         var i, hash,
37698           bkey = rstr2binl(key),
37699           ipad = Array(16),
37700           opad = Array(16);
37701
37702         if (bkey.length > 16) {
37703           bkey = binl(bkey, key.length * 8);
37704         }
37705
37706         for (i = 0; i < 16; i += 1) {
37707           ipad[i] = bkey[i] ^ 0x36363636;
37708           opad[i] = bkey[i] ^ 0x5C5C5C5C;
37709         }
37710         hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
37711         return binl2rstr(binl(opad.concat(hash), 512 + 160));
37712       }
37713
37714       /**
37715        * Convert an array of little-endian words to a string
37716        */
37717
37718       function binl2rstr(input) {
37719         var i, output = '',
37720           l = input.length * 32;
37721         for (i = 0; i < l; i += 8) {
37722           output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
37723         }
37724         return output;
37725       }
37726
37727       /**
37728        * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
37729        */
37730
37731       function binl(x, len) {
37732         var T, j, i, l,
37733           h0 = 0x67452301,
37734           h1 = 0xefcdab89,
37735           h2 = 0x98badcfe,
37736           h3 = 0x10325476,
37737           h4 = 0xc3d2e1f0,
37738           A1, B1, C1, D1, E1,
37739           A2, B2, C2, D2, E2;
37740
37741         /* append padding */
37742         x[len >> 5] |= 0x80 << (len % 32);
37743         x[(((len + 64) >>> 9) << 4) + 14] = len;
37744         l = x.length;
37745
37746         for (i = 0; i < l; i += 16) {
37747           A1 = A2 = h0;
37748           B1 = B2 = h1;
37749           C1 = C2 = h2;
37750           D1 = D2 = h3;
37751           E1 = E2 = h4;
37752           for (j = 0; j <= 79; j += 1) {
37753             T = safe_add(A1, rmd160_f(j, B1, C1, D1));
37754             T = safe_add(T, x[i + rmd160_r1[j]]);
37755             T = safe_add(T, rmd160_K1(j));
37756             T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
37757             A1 = E1;
37758             E1 = D1;
37759             D1 = bit_rol(C1, 10);
37760             C1 = B1;
37761             B1 = T;
37762             T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
37763             T = safe_add(T, x[i + rmd160_r2[j]]);
37764             T = safe_add(T, rmd160_K2(j));
37765             T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
37766             A2 = E2;
37767             E2 = D2;
37768             D2 = bit_rol(C2, 10);
37769             C2 = B2;
37770             B2 = T;
37771           }
37772
37773           T = safe_add(h1, safe_add(C1, D2));
37774           h1 = safe_add(h2, safe_add(D1, E2));
37775           h2 = safe_add(h3, safe_add(E1, A2));
37776           h3 = safe_add(h4, safe_add(A1, B2));
37777           h4 = safe_add(h0, safe_add(B1, C2));
37778           h0 = T;
37779         }
37780         return [h0, h1, h2, h3, h4];
37781       }
37782
37783       // specific algorithm methods
37784
37785       function rmd160_f(j, x, y, z) {
37786         return (0 <= j && j <= 15) ? (x ^ y ^ z) :
37787           (16 <= j && j <= 31) ? (x & y) | (~x & z) :
37788           (32 <= j && j <= 47) ? (x | ~y) ^ z :
37789           (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
37790           (64 <= j && j <= 79) ? x ^ (y | ~z) :
37791           'rmd160_f: j out of range';
37792       }
37793
37794       function rmd160_K1(j) {
37795         return (0 <= j && j <= 15) ? 0x00000000 :
37796           (16 <= j && j <= 31) ? 0x5a827999 :
37797           (32 <= j && j <= 47) ? 0x6ed9eba1 :
37798           (48 <= j && j <= 63) ? 0x8f1bbcdc :
37799           (64 <= j && j <= 79) ? 0xa953fd4e :
37800           'rmd160_K1: j out of range';
37801       }
37802
37803       function rmd160_K2(j) {
37804         return (0 <= j && j <= 15) ? 0x50a28be6 :
37805           (16 <= j && j <= 31) ? 0x5c4dd124 :
37806           (32 <= j && j <= 47) ? 0x6d703ef3 :
37807           (48 <= j && j <= 63) ? 0x7a6d76e9 :
37808           (64 <= j && j <= 79) ? 0x00000000 :
37809           'rmd160_K2: j out of range';
37810       }
37811     }
37812   };
37813
37814   // exposes Hashes
37815   (function(window, undefined) {
37816     var freeExports = false;
37817     {
37818       freeExports = exports;
37819       if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
37820         window = commonjsGlobal;
37821       }
37822     }
37823
37824     if (typeof undefined === 'function' && typeof undefined.amd === 'object' && undefined.amd) {
37825       // define as an anonymous module, so, through path mapping, it can be aliased
37826       undefined(function() {
37827         return Hashes;
37828       });
37829     } else if (freeExports) {
37830       // in Node.js or RingoJS v0.8.0+
37831       if ('object' === 'object' && module && module.exports === freeExports) {
37832         module.exports = Hashes;
37833       }
37834       // in Narwhal or RingoJS v0.7.0-
37835       else {
37836         freeExports.Hashes = Hashes;
37837       }
37838     } else {
37839       // in a browser or Rhino
37840       window.Hashes = Hashes;
37841     }
37842   }(this));
37843 }()); // IIFE
37844 });
37845
37846 var immutable = extend$2;
37847
37848 var hasOwnProperty$16 = Object.prototype.hasOwnProperty;
37849
37850 function extend$2() {
37851     var target = {};
37852
37853     for (var i = 0; i < arguments.length; i++) {
37854         var source = arguments[i];
37855
37856         for (var key in source) {
37857             if (hasOwnProperty$16.call(source, key)) {
37858                 target[key] = source[key];
37859             }
37860         }
37861     }
37862
37863     return target
37864 }
37865
37866 var sha1 = new hashes.SHA1();
37867
37868 var ohauth = {};
37869
37870 ohauth.qsString = function(obj) {
37871     return Object.keys(obj).sort().map(function(key) {
37872         return ohauth.percentEncode(key) + '=' +
37873             ohauth.percentEncode(obj[key]);
37874     }).join('&');
37875 };
37876
37877 ohauth.stringQs = function(str) {
37878     return str.split('&').filter(function (pair) {
37879         return pair !== '';
37880     }).reduce(function(obj, pair){
37881         var parts = pair.split('=');
37882         obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
37883             '' : decodeURIComponent(parts[1]);
37884         return obj;
37885     }, {});
37886 };
37887
37888 ohauth.rawxhr = function(method, url, data, headers, callback) {
37889     var xhr = new XMLHttpRequest(),
37890         twoHundred = /^20\d$/;
37891     xhr.onreadystatechange = function() {
37892         if (4 === xhr.readyState && 0 !== xhr.status) {
37893             if (twoHundred.test(xhr.status)) callback(null, xhr);
37894             else return callback(xhr, null);
37895         }
37896     };
37897     xhr.onerror = function(e) { return callback(e, null); };
37898     xhr.open(method, url, true);
37899     for (var h in headers) xhr.setRequestHeader(h, headers[h]);
37900     xhr.send(data);
37901     return xhr;
37902 };
37903
37904 ohauth.xhr = function(method, url, auth, data, options, callback) {
37905     var headers = (options && options.header) || {
37906         'Content-Type': 'application/x-www-form-urlencoded'
37907     };
37908     headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
37909     return ohauth.rawxhr(method, url, data, headers, callback);
37910 };
37911
37912 ohauth.nonce = function() {
37913     for (var o = ''; o.length < 6;) {
37914         o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
37915     }
37916     return o;
37917 };
37918
37919 ohauth.authHeader = function(obj) {
37920     return Object.keys(obj).sort().map(function(key) {
37921         return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
37922     }).join(', ');
37923 };
37924
37925 ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
37926
37927 ohauth.percentEncode = function(s) {
37928     return encodeURIComponent(s)
37929         .replace(/\!/g, '%21').replace(/\'/g, '%27')
37930         .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
37931 };
37932
37933 ohauth.baseString = function(method, url, params) {
37934     if (params.oauth_signature) delete params.oauth_signature;
37935     return [
37936         method,
37937         ohauth.percentEncode(url),
37938         ohauth.percentEncode(ohauth.qsString(params))].join('&');
37939 };
37940
37941 ohauth.signature = function(oauth_secret, token_secret, baseString) {
37942     return sha1.b64_hmac(
37943         ohauth.percentEncode(oauth_secret) + '&' +
37944         ohauth.percentEncode(token_secret),
37945         baseString);
37946 };
37947
37948 /**
37949  * Takes an options object for configuration (consumer_key,
37950  * consumer_secret, version, signature_method, token, token_secret)
37951  * and returns a function that generates the Authorization header
37952  * for given data.
37953  *
37954  * The returned function takes these parameters:
37955  * - method: GET/POST/...
37956  * - uri: full URI with protocol, port, path and query string
37957  * - extra_params: any extra parameters (that are passed in the POST data),
37958  *   can be an object or a from-urlencoded string.
37959  *
37960  * Returned function returns full OAuth header with "OAuth" string in it.
37961  */
37962
37963 ohauth.headerGenerator = function(options) {
37964     options = options || {};
37965     var consumer_key = options.consumer_key || '',
37966         consumer_secret = options.consumer_secret || '',
37967         signature_method = options.signature_method || 'HMAC-SHA1',
37968         version = options.version || '1.0',
37969         token = options.token || '',
37970         token_secret = options.token_secret || '';
37971
37972     return function(method, uri, extra_params) {
37973         method = method.toUpperCase();
37974         if (typeof extra_params === 'string' && extra_params.length > 0) {
37975             extra_params = ohauth.stringQs(extra_params);
37976         }
37977
37978         var uri_parts = uri.split('?', 2),
37979         base_uri = uri_parts[0];
37980
37981         var query_params = uri_parts.length === 2 ?
37982             ohauth.stringQs(uri_parts[1]) : {};
37983
37984         var oauth_params = {
37985             oauth_consumer_key: consumer_key,
37986             oauth_signature_method: signature_method,
37987             oauth_version: version,
37988             oauth_timestamp: ohauth.timestamp(),
37989             oauth_nonce: ohauth.nonce()
37990         };
37991
37992         if (token) oauth_params.oauth_token = token;
37993
37994         var all_params = immutable({}, oauth_params, query_params, extra_params),
37995             base_str = ohauth.baseString(method, base_uri, all_params);
37996
37997         oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
37998
37999         return 'OAuth ' + ohauth.authHeader(oauth_params);
38000     };
38001 };
38002
38003 var ohauth_1 = ohauth;
38004
38005 var resolveUrl = createCommonjsModule(function (module, exports) {
38006 // Copyright 2014 Simon Lydell
38007 // X11 (“MIT”) Licensed. (See LICENSE.)
38008
38009 void (function(root, factory) {
38010   if (typeof undefined === "function" && undefined.amd) {
38011     undefined(factory);
38012   } else {
38013     module.exports = factory();
38014   }
38015 }(commonjsGlobal, function() {
38016
38017   function resolveUrl(/* ...urls */) {
38018     var numUrls = arguments.length;
38019
38020     if (numUrls === 0) {
38021       throw new Error("resolveUrl requires at least one argument; got none.")
38022     }
38023
38024     var base = document.createElement("base");
38025     base.href = arguments[0];
38026
38027     if (numUrls === 1) {
38028       return base.href
38029     }
38030
38031     var head = document.getElementsByTagName("head")[0];
38032     head.insertBefore(base, head.firstChild);
38033
38034     var a = document.createElement("a");
38035     var resolved;
38036
38037     for (var index = 1; index < numUrls; index++) {
38038       a.href = arguments[index];
38039       resolved = a.href;
38040       base.href = resolved;
38041     }
38042
38043     head.removeChild(base);
38044
38045     return resolved
38046   }
38047
38048   return resolveUrl
38049
38050 }));
38051 });
38052
38053 var assign$1 = make_assign();
38054 var create$2 = make_create();
38055 var trim = make_trim();
38056 var Global = (typeof window !== 'undefined' ? window : commonjsGlobal);
38057
38058 var util = {
38059         assign: assign$1,
38060         create: create$2,
38061         trim: trim,
38062         bind: bind,
38063         slice: slice$7,
38064         each: each,
38065         map: map$4,
38066         pluck: pluck,
38067         isList: isList,
38068         isFunction: isFunction$1,
38069         isObject: isObject$1,
38070         Global: Global
38071 };
38072
38073 function make_assign() {
38074         if (Object.assign) {
38075                 return Object.assign
38076         } else {
38077                 return function shimAssign(obj, props1, props2, etc) {
38078                         for (var i = 1; i < arguments.length; i++) {
38079                                 each(Object(arguments[i]), function(val, key) {
38080                                         obj[key] = val;
38081                                 });
38082                         }                       
38083                         return obj
38084                 }
38085         }
38086 }
38087
38088 function make_create() {
38089         if (Object.create) {
38090                 return function create(obj, assignProps1, assignProps2, etc) {
38091                         var assignArgsList = slice$7(arguments, 1);
38092                         return assign$1.apply(this, [Object.create(obj)].concat(assignArgsList))
38093                 }
38094         } else {
38095                 function F() {} // eslint-disable-line no-inner-declarations
38096                 return function create(obj, assignProps1, assignProps2, etc) {
38097                         var assignArgsList = slice$7(arguments, 1);
38098                         F.prototype = obj;
38099                         return assign$1.apply(this, [new F()].concat(assignArgsList))
38100                 }
38101         }
38102 }
38103
38104 function make_trim() {
38105         if (String.prototype.trim) {
38106                 return function trim(str) {
38107                         return String.prototype.trim.call(str)
38108                 }
38109         } else {
38110                 return function trim(str) {
38111                         return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
38112                 }
38113         }
38114 }
38115
38116 function bind(obj, fn) {
38117         return function() {
38118                 return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
38119         }
38120 }
38121
38122 function slice$7(arr, index) {
38123         return Array.prototype.slice.call(arr, index || 0)
38124 }
38125
38126 function each(obj, fn) {
38127         pluck(obj, function(val, key) {
38128                 fn(val, key);
38129                 return false
38130         });
38131 }
38132
38133 function map$4(obj, fn) {
38134         var res = (isList(obj) ? [] : {});
38135         pluck(obj, function(v, k) {
38136                 res[k] = fn(v, k);
38137                 return false
38138         });
38139         return res
38140 }
38141
38142 function pluck(obj, fn) {
38143         if (isList(obj)) {
38144                 for (var i=0; i<obj.length; i++) {
38145                         if (fn(obj[i], i)) {
38146                                 return obj[i]
38147                         }
38148                 }
38149         } else {
38150                 for (var key in obj) {
38151                         if (obj.hasOwnProperty(key)) {
38152                                 if (fn(obj[key], key)) {
38153                                         return obj[key]
38154                                 }
38155                         }
38156                 }
38157         }
38158 }
38159
38160 function isList(val) {
38161         return (val != null && typeof val != 'function' && typeof val.length == 'number')
38162 }
38163
38164 function isFunction$1(val) {
38165         return val && {}.toString.call(val) === '[object Function]'
38166 }
38167
38168 function isObject$1(val) {
38169         return val && {}.toString.call(val) === '[object Object]'
38170 }
38171
38172 var slice$8 = util.slice;
38173 var pluck$1 = util.pluck;
38174 var each$1 = util.each;
38175 var bind$1 = util.bind;
38176 var create$3 = util.create;
38177 var isList$1 = util.isList;
38178 var isFunction$2 = util.isFunction;
38179 var isObject$2 = util.isObject;
38180
38181 var storeEngine = {
38182         createStore: createStore
38183 };
38184
38185 var storeAPI = {
38186         version: '2.0.12',
38187         enabled: false,
38188         
38189         // get returns the value of the given key. If that value
38190         // is undefined, it returns optionalDefaultValue instead.
38191         get: function(key, optionalDefaultValue) {
38192                 var data = this.storage.read(this._namespacePrefix + key);
38193                 return this._deserialize(data, optionalDefaultValue)
38194         },
38195
38196         // set will store the given value at key and returns value.
38197         // Calling set with value === undefined is equivalent to calling remove.
38198         set: function(key, value) {
38199                 if (value === undefined) {
38200                         return this.remove(key)
38201                 }
38202                 this.storage.write(this._namespacePrefix + key, this._serialize(value));
38203                 return value
38204         },
38205
38206         // remove deletes the key and value stored at the given key.
38207         remove: function(key) {
38208                 this.storage.remove(this._namespacePrefix + key);
38209         },
38210
38211         // each will call the given callback once for each key-value pair
38212         // in this store.
38213         each: function(callback) {
38214                 var self = this;
38215                 this.storage.each(function(val, namespacedKey) {
38216                         callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
38217                 });
38218         },
38219
38220         // clearAll will remove all the stored key-value pairs in this store.
38221         clearAll: function() {
38222                 this.storage.clearAll();
38223         },
38224
38225         // additional functionality that can't live in plugins
38226         // ---------------------------------------------------
38227
38228         // hasNamespace returns true if this store instance has the given namespace.
38229         hasNamespace: function(namespace) {
38230                 return (this._namespacePrefix == '__storejs_'+namespace+'_')
38231         },
38232
38233         // createStore creates a store.js instance with the first
38234         // functioning storage in the list of storage candidates,
38235         // and applies the the given mixins to the instance.
38236         createStore: function() {
38237                 return createStore.apply(this, arguments)
38238         },
38239         
38240         addPlugin: function(plugin) {
38241                 this._addPlugin(plugin);
38242         },
38243         
38244         namespace: function(namespace) {
38245                 return createStore(this.storage, this.plugins, namespace)
38246         }
38247 };
38248
38249 function _warn() {
38250         var _console = (typeof console == 'undefined' ? null : console);
38251         if (!_console) { return }
38252         var fn = (_console.warn ? _console.warn : _console.log);
38253         fn.apply(_console, arguments);
38254 }
38255
38256 function createStore(storages, plugins, namespace) {
38257         if (!namespace) {
38258                 namespace = '';
38259         }
38260         if (storages && !isList$1(storages)) {
38261                 storages = [storages];
38262         }
38263         if (plugins && !isList$1(plugins)) {
38264                 plugins = [plugins];
38265         }
38266
38267         var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '');
38268         var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null);
38269         var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
38270         if (!legalNamespaces.test(namespace)) {
38271                 throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes')
38272         }
38273         
38274         var _privateStoreProps = {
38275                 _namespacePrefix: namespacePrefix,
38276                 _namespaceRegexp: namespaceRegexp,
38277
38278                 _testStorage: function(storage) {
38279                         try {
38280                                 var testStr = '__storejs__test__';
38281                                 storage.write(testStr, testStr);
38282                                 var ok = (storage.read(testStr) === testStr);
38283                                 storage.remove(testStr);
38284                                 return ok
38285                         } catch(e) {
38286                                 return false
38287                         }
38288                 },
38289
38290                 _assignPluginFnProp: function(pluginFnProp, propName) {
38291                         var oldFn = this[propName];
38292                         this[propName] = function pluginFn() {
38293                                 var args = slice$8(arguments, 0);
38294                                 var self = this;
38295
38296                                 // super_fn calls the old function which was overwritten by
38297                                 // this mixin.
38298                                 function super_fn() {
38299                                         if (!oldFn) { return }
38300                                         each$1(arguments, function(arg, i) {
38301                                                 args[i] = arg;
38302                                         });
38303                                         return oldFn.apply(self, args)
38304                                 }
38305
38306                                 // Give mixing function access to super_fn by prefixing all mixin function
38307                                 // arguments with super_fn.
38308                                 var newFnArgs = [super_fn].concat(args);
38309
38310                                 return pluginFnProp.apply(self, newFnArgs)
38311                         };
38312                 },
38313
38314                 _serialize: function(obj) {
38315                         return JSON.stringify(obj)
38316                 },
38317
38318                 _deserialize: function(strVal, defaultVal) {
38319                         if (!strVal) { return defaultVal }
38320                         // It is possible that a raw string value has been previously stored
38321                         // in a storage without using store.js, meaning it will be a raw
38322                         // string value instead of a JSON serialized string. By defaulting
38323                         // to the raw string value in case of a JSON parse error, we allow
38324                         // for past stored values to be forwards-compatible with store.js
38325                         var val = '';
38326                         try { val = JSON.parse(strVal); }
38327                         catch(e) { val = strVal; }
38328
38329                         return (val !== undefined ? val : defaultVal)
38330                 },
38331                 
38332                 _addStorage: function(storage) {
38333                         if (this.enabled) { return }
38334                         if (this._testStorage(storage)) {
38335                                 this.storage = storage;
38336                                 this.enabled = true;
38337                         }
38338                 },
38339
38340                 _addPlugin: function(plugin) {
38341                         var self = this;
38342
38343                         // If the plugin is an array, then add all plugins in the array.
38344                         // This allows for a plugin to depend on other plugins.
38345                         if (isList$1(plugin)) {
38346                                 each$1(plugin, function(plugin) {
38347                                         self._addPlugin(plugin);
38348                                 });
38349                                 return
38350                         }
38351
38352                         // Keep track of all plugins we've seen so far, so that we
38353                         // don't add any of them twice.
38354                         var seenPlugin = pluck$1(this.plugins, function(seenPlugin) {
38355                                 return (plugin === seenPlugin)
38356                         });
38357                         if (seenPlugin) {
38358                                 return
38359                         }
38360                         this.plugins.push(plugin);
38361
38362                         // Check that the plugin is properly formed
38363                         if (!isFunction$2(plugin)) {
38364                                 throw new Error('Plugins must be function values that return objects')
38365                         }
38366
38367                         var pluginProperties = plugin.call(this);
38368                         if (!isObject$2(pluginProperties)) {
38369                                 throw new Error('Plugins must return an object of function properties')
38370                         }
38371
38372                         // Add the plugin function properties to this store instance.
38373                         each$1(pluginProperties, function(pluginFnProp, propName) {
38374                                 if (!isFunction$2(pluginFnProp)) {
38375                                         throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
38376                                 }
38377                                 self._assignPluginFnProp(pluginFnProp, propName);
38378                         });
38379                 },
38380                 
38381                 // Put deprecated properties in the private API, so as to not expose it to accidential
38382                 // discovery through inspection of the store object.
38383                 
38384                 // Deprecated: addStorage
38385                 addStorage: function(storage) {
38386                         _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
38387                         this._addStorage(storage);
38388                 }
38389         };
38390
38391         var store = create$3(_privateStoreProps, storeAPI, {
38392                 plugins: []
38393         });
38394         store.raw = {};
38395         each$1(store, function(prop, propName) {
38396                 if (isFunction$2(prop)) {
38397                         store.raw[propName] = bind$1(store, prop);                      
38398                 }
38399         });
38400         each$1(storages, function(storage) {
38401                 store._addStorage(storage);
38402         });
38403         each$1(plugins, function(plugin) {
38404                 store._addPlugin(plugin);
38405         });
38406         return store
38407 }
38408
38409 var Global$1 = util.Global;
38410
38411 var localStorage_1 = {
38412         name: 'localStorage',
38413         read: read,
38414         write: write,
38415         each: each$2,
38416         remove: remove$2,
38417         clearAll: clearAll,
38418 };
38419
38420 function localStorage$1() {
38421         return Global$1.localStorage
38422 }
38423
38424 function read(key) {
38425         return localStorage$1().getItem(key)
38426 }
38427
38428 function write(key, data) {
38429         return localStorage$1().setItem(key, data)
38430 }
38431
38432 function each$2(fn) {
38433         for (var i = localStorage$1().length - 1; i >= 0; i--) {
38434                 var key = localStorage$1().key(i);
38435                 fn(read(key), key);
38436         }
38437 }
38438
38439 function remove$2(key) {
38440         return localStorage$1().removeItem(key)
38441 }
38442
38443 function clearAll() {
38444         return localStorage$1().clear()
38445 }
38446
38447 // oldFF-globalStorage provides storage for Firefox
38448 // versions 6 and 7, where no localStorage, etc
38449 // is available.
38450
38451
38452 var Global$2 = util.Global;
38453
38454 var oldFFGlobalStorage = {
38455         name: 'oldFF-globalStorage',
38456         read: read$1,
38457         write: write$1,
38458         each: each$3,
38459         remove: remove$3,
38460         clearAll: clearAll$1,
38461 };
38462
38463 var globalStorage = Global$2.globalStorage;
38464
38465 function read$1(key) {
38466         return globalStorage[key]
38467 }
38468
38469 function write$1(key, data) {
38470         globalStorage[key] = data;
38471 }
38472
38473 function each$3(fn) {
38474         for (var i = globalStorage.length - 1; i >= 0; i--) {
38475                 var key = globalStorage.key(i);
38476                 fn(globalStorage[key], key);
38477         }
38478 }
38479
38480 function remove$3(key) {
38481         return globalStorage.removeItem(key)
38482 }
38483
38484 function clearAll$1() {
38485         each$3(function(key, _) {
38486                 delete globalStorage[key];
38487         });
38488 }
38489
38490 // oldIE-userDataStorage provides storage for Internet Explorer
38491 // versions 6 and 7, where no localStorage, sessionStorage, etc
38492 // is available.
38493
38494
38495 var Global$3 = util.Global;
38496
38497 var oldIEUserDataStorage = {
38498         name: 'oldIE-userDataStorage',
38499         write: write$2,
38500         read: read$2,
38501         each: each$4,
38502         remove: remove$4,
38503         clearAll: clearAll$2,
38504 };
38505
38506 var storageName = 'storejs';
38507 var doc = Global$3.document;
38508 var _withStorageEl = _makeIEStorageElFunction();
38509 var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
38510
38511 function write$2(unfixedKey, data) {
38512         if (disable) { return }
38513         var fixedKey = fixKey(unfixedKey);
38514         _withStorageEl(function(storageEl) {
38515                 storageEl.setAttribute(fixedKey, data);
38516                 storageEl.save(storageName);
38517         });
38518 }
38519
38520 function read$2(unfixedKey) {
38521         if (disable) { return }
38522         var fixedKey = fixKey(unfixedKey);
38523         var res = null;
38524         _withStorageEl(function(storageEl) {
38525                 res = storageEl.getAttribute(fixedKey);
38526         });
38527         return res
38528 }
38529
38530 function each$4(callback) {
38531         _withStorageEl(function(storageEl) {
38532                 var attributes = storageEl.XMLDocument.documentElement.attributes;
38533                 for (var i=attributes.length-1; i>=0; i--) {
38534                         var attr = attributes[i];
38535                         callback(storageEl.getAttribute(attr.name), attr.name);
38536                 }
38537         });
38538 }
38539
38540 function remove$4(unfixedKey) {
38541         var fixedKey = fixKey(unfixedKey);
38542         _withStorageEl(function(storageEl) {
38543                 storageEl.removeAttribute(fixedKey);
38544                 storageEl.save(storageName);
38545         });
38546 }
38547
38548 function clearAll$2() {
38549         _withStorageEl(function(storageEl) {
38550                 var attributes = storageEl.XMLDocument.documentElement.attributes;
38551                 storageEl.load(storageName);
38552                 for (var i=attributes.length-1; i>=0; i--) {
38553                         storageEl.removeAttribute(attributes[i].name);
38554                 }
38555                 storageEl.save(storageName);
38556         });
38557 }
38558
38559 // Helpers
38560 //////////
38561
38562 // In IE7, keys cannot start with a digit or contain certain chars.
38563 // See https://github.com/marcuswestin/store.js/issues/40
38564 // See https://github.com/marcuswestin/store.js/issues/83
38565 var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
38566 function fixKey(key) {
38567         return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___')
38568 }
38569
38570 function _makeIEStorageElFunction() {
38571         if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
38572                 return null
38573         }
38574         var scriptTag = 'script',
38575                 storageOwner,
38576                 storageContainer,
38577                 storageEl;
38578
38579         // Since #userData storage applies only to specific paths, we need to
38580         // somehow link our data to a specific path.  We choose /favicon.ico
38581         // as a pretty safe option, since all browsers already make a request to
38582         // this URL anyway and being a 404 will not hurt us here.  We wrap an
38583         // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
38584         // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
38585         // since the iframe access rules appear to allow direct access and
38586         // manipulation of the document element, even for a 404 page.  This
38587         // document can be used instead of the current document (which would
38588         // have been limited to the current path) to perform #userData storage.
38589         try {
38590                 /* global ActiveXObject */
38591                 storageContainer = new ActiveXObject('htmlfile');
38592                 storageContainer.open();
38593                 storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>');
38594                 storageContainer.close();
38595                 storageOwner = storageContainer.w.frames[0].document;
38596                 storageEl = storageOwner.createElement('div');
38597         } catch(e) {
38598                 // somehow ActiveXObject instantiation failed (perhaps some special
38599                 // security settings or otherwse), fall back to per-path storage
38600                 storageEl = doc.createElement('div');
38601                 storageOwner = doc.body;
38602         }
38603
38604         return function(storeFunction) {
38605                 var args = [].slice.call(arguments, 0);
38606                 args.unshift(storageEl);
38607                 // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
38608                 // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
38609                 storageOwner.appendChild(storageEl);
38610                 storageEl.addBehavior('#default#userData');
38611                 storageEl.load(storageName);
38612                 storeFunction.apply(this, args);
38613                 storageOwner.removeChild(storageEl);
38614                 return
38615         }
38616 }
38617
38618 // cookieStorage is useful Safari private browser mode, where localStorage
38619 // doesn't work but cookies do. This implementation is adopted from
38620 // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
38621
38622
38623 var Global$4 = util.Global;
38624 var trim$1 = util.trim;
38625
38626 var cookieStorage = {
38627         name: 'cookieStorage',
38628         read: read$3,
38629         write: write$3,
38630         each: each$5,
38631         remove: remove$5,
38632         clearAll: clearAll$3,
38633 };
38634
38635 var doc$1 = Global$4.document;
38636
38637 function read$3(key) {
38638         if (!key || !_has(key)) { return null }
38639         var regexpStr = "(?:^|.*;\\s*)" +
38640                 escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
38641                 "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
38642         return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1"))
38643 }
38644
38645 function each$5(callback) {
38646         var cookies = doc$1.cookie.split(/; ?/g);
38647         for (var i = cookies.length - 1; i >= 0; i--) {
38648                 if (!trim$1(cookies[i])) {
38649                         continue
38650                 }
38651                 var kvp = cookies[i].split('=');
38652                 var key = unescape(kvp[0]);
38653                 var val = unescape(kvp[1]);
38654                 callback(val, key);
38655         }
38656 }
38657
38658 function write$3(key, data) {
38659         if(!key) { return }
38660         doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
38661 }
38662
38663 function remove$5(key) {
38664         if (!key || !_has(key)) {
38665                 return
38666         }
38667         doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
38668 }
38669
38670 function clearAll$3() {
38671         each$5(function(_, key) {
38672                 remove$5(key);
38673         });
38674 }
38675
38676 function _has(key) {
38677         return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
38678 }
38679
38680 var Global$5 = util.Global;
38681
38682 var sessionStorage_1 = {
38683         name: 'sessionStorage',
38684         read: read$4,
38685         write: write$4,
38686         each: each$6,
38687         remove: remove$6,
38688         clearAll: clearAll$4
38689 };
38690
38691 function sessionStorage() {
38692         return Global$5.sessionStorage
38693 }
38694
38695 function read$4(key) {
38696         return sessionStorage().getItem(key)
38697 }
38698
38699 function write$4(key, data) {
38700         return sessionStorage().setItem(key, data)
38701 }
38702
38703 function each$6(fn) {
38704         for (var i = sessionStorage().length - 1; i >= 0; i--) {
38705                 var key = sessionStorage().key(i);
38706                 fn(read$4(key), key);
38707         }
38708 }
38709
38710 function remove$6(key) {
38711         return sessionStorage().removeItem(key)
38712 }
38713
38714 function clearAll$4() {
38715         return sessionStorage().clear()
38716 }
38717
38718 // memoryStorage is a useful last fallback to ensure that the store
38719 // is functions (meaning store.get(), store.set(), etc will all function).
38720 // However, stored values will not persist when the browser navigates to
38721 // a new page or reloads the current page.
38722
38723 var memoryStorage_1 = {
38724         name: 'memoryStorage',
38725         read: read$5,
38726         write: write$5,
38727         each: each$7,
38728         remove: remove$7,
38729         clearAll: clearAll$5,
38730 };
38731
38732 var memoryStorage = {};
38733
38734 function read$5(key) {
38735         return memoryStorage[key]
38736 }
38737
38738 function write$5(key, data) {
38739         memoryStorage[key] = data;
38740 }
38741
38742 function each$7(callback) {
38743         for (var key in memoryStorage) {
38744                 if (memoryStorage.hasOwnProperty(key)) {
38745                         callback(memoryStorage[key], key);
38746                 }
38747         }
38748 }
38749
38750 function remove$7(key) {
38751         delete memoryStorage[key];
38752 }
38753
38754 function clearAll$5(key) {
38755         memoryStorage = {};
38756 }
38757
38758 var all$3 = [
38759         // Listed in order of usage preference
38760         localStorage_1,
38761         oldFFGlobalStorage,
38762         oldIEUserDataStorage,
38763         cookieStorage,
38764         sessionStorage_1,
38765         memoryStorage_1
38766 ];
38767
38768 /* eslint-disable */
38769
38770 //  json2.js
38771 //  2016-10-28
38772 //  Public Domain.
38773 //  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
38774 //  See http://www.JSON.org/js.html
38775 //  This code should be minified before deployment.
38776 //  See http://javascript.crockford.com/jsmin.html
38777
38778 //  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
38779 //  NOT CONTROL.
38780
38781 //  This file creates a global JSON object containing two methods: stringify
38782 //  and parse. This file provides the ES5 JSON capability to ES3 systems.
38783 //  If a project might run on IE8 or earlier, then this file should be included.
38784 //  This file does nothing on ES5 systems.
38785
38786 //      JSON.stringify(value, replacer, space)
38787 //          value       any JavaScript value, usually an object or array.
38788 //          replacer    an optional parameter that determines how object
38789 //                      values are stringified for objects. It can be a
38790 //                      function or an array of strings.
38791 //          space       an optional parameter that specifies the indentation
38792 //                      of nested structures. If it is omitted, the text will
38793 //                      be packed without extra whitespace. If it is a number,
38794 //                      it will specify the number of spaces to indent at each
38795 //                      level. If it is a string (such as "\t" or "&nbsp;"),
38796 //                      it contains the characters used to indent at each level.
38797 //          This method produces a JSON text from a JavaScript value.
38798 //          When an object value is found, if the object contains a toJSON
38799 //          method, its toJSON method will be called and the result will be
38800 //          stringified. A toJSON method does not serialize: it returns the
38801 //          value represented by the name/value pair that should be serialized,
38802 //          or undefined if nothing should be serialized. The toJSON method
38803 //          will be passed the key associated with the value, and this will be
38804 //          bound to the value.
38805
38806 //          For example, this would serialize Dates as ISO strings.
38807
38808 //              Date.prototype.toJSON = function (key) {
38809 //                  function f(n) {
38810 //                      // Format integers to have at least two digits.
38811 //                      return (n < 10)
38812 //                          ? "0" + n
38813 //                          : n;
38814 //                  }
38815 //                  return this.getUTCFullYear()   + "-" +
38816 //                       f(this.getUTCMonth() + 1) + "-" +
38817 //                       f(this.getUTCDate())      + "T" +
38818 //                       f(this.getUTCHours())     + ":" +
38819 //                       f(this.getUTCMinutes())   + ":" +
38820 //                       f(this.getUTCSeconds())   + "Z";
38821 //              };
38822
38823 //          You can provide an optional replacer method. It will be passed the
38824 //          key and value of each member, with this bound to the containing
38825 //          object. The value that is returned from your method will be
38826 //          serialized. If your method returns undefined, then the member will
38827 //          be excluded from the serialization.
38828
38829 //          If the replacer parameter is an array of strings, then it will be
38830 //          used to select the members to be serialized. It filters the results
38831 //          such that only members with keys listed in the replacer array are
38832 //          stringified.
38833
38834 //          Values that do not have JSON representations, such as undefined or
38835 //          functions, will not be serialized. Such values in objects will be
38836 //          dropped; in arrays they will be replaced with null. You can use
38837 //          a replacer function to replace those with JSON values.
38838
38839 //          JSON.stringify(undefined) returns undefined.
38840
38841 //          The optional space parameter produces a stringification of the
38842 //          value that is filled with line breaks and indentation to make it
38843 //          easier to read.
38844
38845 //          If the space parameter is a non-empty string, then that string will
38846 //          be used for indentation. If the space parameter is a number, then
38847 //          the indentation will be that many spaces.
38848
38849 //          Example:
38850
38851 //          text = JSON.stringify(["e", {pluribus: "unum"}]);
38852 //          // text is '["e",{"pluribus":"unum"}]'
38853
38854 //          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
38855 //          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
38856
38857 //          text = JSON.stringify([new Date()], function (key, value) {
38858 //              return this[key] instanceof Date
38859 //                  ? "Date(" + this[key] + ")"
38860 //                  : value;
38861 //          });
38862 //          // text is '["Date(---current time---)"]'
38863
38864 //      JSON.parse(text, reviver)
38865 //          This method parses a JSON text to produce an object or array.
38866 //          It can throw a SyntaxError exception.
38867
38868 //          The optional reviver parameter is a function that can filter and
38869 //          transform the results. It receives each of the keys and values,
38870 //          and its return value is used instead of the original value.
38871 //          If it returns what it received, then the structure is not modified.
38872 //          If it returns undefined then the member is deleted.
38873
38874 //          Example:
38875
38876 //          // Parse the text. Values that look like ISO date strings will
38877 //          // be converted to Date objects.
38878
38879 //          myData = JSON.parse(text, function (key, value) {
38880 //              var a;
38881 //              if (typeof value === "string") {
38882 //                  a =
38883 //   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
38884 //                  if (a) {
38885 //                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
38886 //                          +a[5], +a[6]));
38887 //                  }
38888 //              }
38889 //              return value;
38890 //          });
38891
38892 //          myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
38893 //              var d;
38894 //              if (typeof value === "string" &&
38895 //                      value.slice(0, 5) === "Date(" &&
38896 //                      value.slice(-1) === ")") {
38897 //                  d = new Date(value.slice(5, -1));
38898 //                  if (d) {
38899 //                      return d;
38900 //                  }
38901 //              }
38902 //              return value;
38903 //          });
38904
38905 //  This is a reference implementation. You are free to copy, modify, or
38906 //  redistribute.
38907
38908 /*jslint
38909     eval, for, this
38910 */
38911
38912 /*property
38913     JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
38914     getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
38915     lastIndex, length, parse, prototype, push, replace, slice, stringify,
38916     test, toJSON, toString, valueOf
38917 */
38918
38919
38920 // Create a JSON object only if one does not already exist. We create the
38921 // methods in a closure to avoid creating global variables.
38922
38923 if (typeof JSON !== "object") {
38924     JSON = {};
38925 }
38926
38927 (function () {
38928
38929     var rx_one = /^[\],:{}\s]*$/;
38930     var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
38931     var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
38932     var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
38933     var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
38934     var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
38935
38936     function f(n) {
38937         // Format integers to have at least two digits.
38938         return n < 10
38939             ? "0" + n
38940             : n;
38941     }
38942
38943     function this_value() {
38944         return this.valueOf();
38945     }
38946
38947     if (typeof Date.prototype.toJSON !== "function") {
38948
38949         Date.prototype.toJSON = function () {
38950
38951             return isFinite(this.valueOf())
38952                 ? this.getUTCFullYear() + "-" +
38953                         f(this.getUTCMonth() + 1) + "-" +
38954                         f(this.getUTCDate()) + "T" +
38955                         f(this.getUTCHours()) + ":" +
38956                         f(this.getUTCMinutes()) + ":" +
38957                         f(this.getUTCSeconds()) + "Z"
38958                 : null;
38959         };
38960
38961         Boolean.prototype.toJSON = this_value;
38962         Number.prototype.toJSON = this_value;
38963         String.prototype.toJSON = this_value;
38964     }
38965
38966     var gap;
38967     var indent;
38968     var meta;
38969     var rep;
38970
38971
38972     function quote(string) {
38973
38974 // If the string contains no control characters, no quote characters, and no
38975 // backslash characters, then we can safely slap some quotes around it.
38976 // Otherwise we must also replace the offending characters with safe escape
38977 // sequences.
38978
38979         rx_escapable.lastIndex = 0;
38980         return rx_escapable.test(string)
38981             ? "\"" + string.replace(rx_escapable, function (a) {
38982                 var c = meta[a];
38983                 return typeof c === "string"
38984                     ? c
38985                     : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
38986             }) + "\""
38987             : "\"" + string + "\"";
38988     }
38989
38990
38991     function str(key, holder) {
38992
38993 // Produce a string from holder[key].
38994
38995         var i;          // The loop counter.
38996         var k;          // The member key.
38997         var v;          // The member value.
38998         var length;
38999         var mind = gap;
39000         var partial;
39001         var value = holder[key];
39002
39003 // If the value has a toJSON method, call it to obtain a replacement value.
39004
39005         if (value && typeof value === "object" &&
39006                 typeof value.toJSON === "function") {
39007             value = value.toJSON(key);
39008         }
39009
39010 // If we were called with a replacer function, then call the replacer to
39011 // obtain a replacement value.
39012
39013         if (typeof rep === "function") {
39014             value = rep.call(holder, key, value);
39015         }
39016
39017 // What happens next depends on the value's type.
39018
39019         switch (typeof value) {
39020         case "string":
39021             return quote(value);
39022
39023         case "number":
39024
39025 // JSON numbers must be finite. Encode non-finite numbers as null.
39026
39027             return isFinite(value)
39028                 ? String(value)
39029                 : "null";
39030
39031         case "boolean":
39032         case "null":
39033
39034 // If the value is a boolean or null, convert it to a string. Note:
39035 // typeof null does not produce "null". The case is included here in
39036 // the remote chance that this gets fixed someday.
39037
39038             return String(value);
39039
39040 // If the type is "object", we might be dealing with an object or an array or
39041 // null.
39042
39043         case "object":
39044
39045 // Due to a specification blunder in ECMAScript, typeof null is "object",
39046 // so watch out for that case.
39047
39048             if (!value) {
39049                 return "null";
39050             }
39051
39052 // Make an array to hold the partial results of stringifying this object value.
39053
39054             gap += indent;
39055             partial = [];
39056
39057 // Is the value an array?
39058
39059             if (Object.prototype.toString.apply(value) === "[object Array]") {
39060
39061 // The value is an array. Stringify every element. Use null as a placeholder
39062 // for non-JSON values.
39063
39064                 length = value.length;
39065                 for (i = 0; i < length; i += 1) {
39066                     partial[i] = str(i, value) || "null";
39067                 }
39068
39069 // Join all of the elements together, separated with commas, and wrap them in
39070 // brackets.
39071
39072                 v = partial.length === 0
39073                     ? "[]"
39074                     : gap
39075                         ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
39076                         : "[" + partial.join(",") + "]";
39077                 gap = mind;
39078                 return v;
39079             }
39080
39081 // If the replacer is an array, use it to select the members to be stringified.
39082
39083             if (rep && typeof rep === "object") {
39084                 length = rep.length;
39085                 for (i = 0; i < length; i += 1) {
39086                     if (typeof rep[i] === "string") {
39087                         k = rep[i];
39088                         v = str(k, value);
39089                         if (v) {
39090                             partial.push(quote(k) + (
39091                                 gap
39092                                     ? ": "
39093                                     : ":"
39094                             ) + v);
39095                         }
39096                     }
39097                 }
39098             } else {
39099
39100 // Otherwise, iterate through all of the keys in the object.
39101
39102                 for (k in value) {
39103                     if (Object.prototype.hasOwnProperty.call(value, k)) {
39104                         v = str(k, value);
39105                         if (v) {
39106                             partial.push(quote(k) + (
39107                                 gap
39108                                     ? ": "
39109                                     : ":"
39110                             ) + v);
39111                         }
39112                     }
39113                 }
39114             }
39115
39116 // Join all of the member texts together, separated with commas,
39117 // and wrap them in braces.
39118
39119             v = partial.length === 0
39120                 ? "{}"
39121                 : gap
39122                     ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
39123                     : "{" + partial.join(",") + "}";
39124             gap = mind;
39125             return v;
39126         }
39127     }
39128
39129 // If the JSON object does not yet have a stringify method, give it one.
39130
39131     if (typeof JSON.stringify !== "function") {
39132         meta = {    // table of character substitutions
39133             "\b": "\\b",
39134             "\t": "\\t",
39135             "\n": "\\n",
39136             "\f": "\\f",
39137             "\r": "\\r",
39138             "\"": "\\\"",
39139             "\\": "\\\\"
39140         };
39141         JSON.stringify = function (value, replacer, space) {
39142
39143 // The stringify method takes a value and an optional replacer, and an optional
39144 // space parameter, and returns a JSON text. The replacer can be a function
39145 // that can replace values, or an array of strings that will select the keys.
39146 // A default replacer method can be provided. Use of the space parameter can
39147 // produce text that is more easily readable.
39148
39149             var i;
39150             gap = "";
39151             indent = "";
39152
39153 // If the space parameter is a number, make an indent string containing that
39154 // many spaces.
39155
39156             if (typeof space === "number") {
39157                 for (i = 0; i < space; i += 1) {
39158                     indent += " ";
39159                 }
39160
39161 // If the space parameter is a string, it will be used as the indent string.
39162
39163             } else if (typeof space === "string") {
39164                 indent = space;
39165             }
39166
39167 // If there is a replacer, it must be a function or an array.
39168 // Otherwise, throw an error.
39169
39170             rep = replacer;
39171             if (replacer && typeof replacer !== "function" &&
39172                     (typeof replacer !== "object" ||
39173                     typeof replacer.length !== "number")) {
39174                 throw new Error("JSON.stringify");
39175             }
39176
39177 // Make a fake root object containing our value under the key of "".
39178 // Return the result of stringifying the value.
39179
39180             return str("", {"": value});
39181         };
39182     }
39183
39184
39185 // If the JSON object does not yet have a parse method, give it one.
39186
39187     if (typeof JSON.parse !== "function") {
39188         JSON.parse = function (text, reviver) {
39189
39190 // The parse method takes a text and an optional reviver function, and returns
39191 // a JavaScript value if the text is a valid JSON text.
39192
39193             var j;
39194
39195             function walk(holder, key) {
39196
39197 // The walk method is used to recursively walk the resulting structure so
39198 // that modifications can be made.
39199
39200                 var k;
39201                 var v;
39202                 var value = holder[key];
39203                 if (value && typeof value === "object") {
39204                     for (k in value) {
39205                         if (Object.prototype.hasOwnProperty.call(value, k)) {
39206                             v = walk(value, k);
39207                             if (v !== undefined) {
39208                                 value[k] = v;
39209                             } else {
39210                                 delete value[k];
39211                             }
39212                         }
39213                     }
39214                 }
39215                 return reviver.call(holder, key, value);
39216             }
39217
39218
39219 // Parsing happens in four stages. In the first stage, we replace certain
39220 // Unicode characters with escape sequences. JavaScript handles many characters
39221 // incorrectly, either silently deleting them, or treating them as line endings.
39222
39223             text = String(text);
39224             rx_dangerous.lastIndex = 0;
39225             if (rx_dangerous.test(text)) {
39226                 text = text.replace(rx_dangerous, function (a) {
39227                     return "\\u" +
39228                             ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
39229                 });
39230             }
39231
39232 // In the second stage, we run the text against regular expressions that look
39233 // for non-JSON patterns. We are especially concerned with "()" and "new"
39234 // because they can cause invocation, and "=" because it can cause mutation.
39235 // But just to be safe, we want to reject all unexpected forms.
39236
39237 // We split the second stage into 4 regexp operations in order to work around
39238 // crippling inefficiencies in IE's and Safari's regexp engines. First we
39239 // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
39240 // replace all simple value tokens with "]" characters. Third, we delete all
39241 // open brackets that follow a colon or comma or that begin the text. Finally,
39242 // we look to see that the remaining characters are only whitespace or "]" or
39243 // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
39244
39245             if (
39246                 rx_one.test(
39247                     text
39248                         .replace(rx_two, "@")
39249                         .replace(rx_three, "]")
39250                         .replace(rx_four, "")
39251                 )
39252             ) {
39253
39254 // In the third stage we use the eval function to compile the text into a
39255 // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
39256 // in JavaScript: it can begin a block or an object literal. We wrap the text
39257 // in parens to eliminate the ambiguity.
39258
39259                 j = eval("(" + text + ")");
39260
39261 // In the optional fourth stage, we recursively walk the new structure, passing
39262 // each name/value pair to a reviver function for possible transformation.
39263
39264                 return (typeof reviver === "function")
39265                     ? walk({"": j}, "")
39266                     : j;
39267             }
39268
39269 // If the text is not JSON parseable, then a SyntaxError is thrown.
39270
39271             throw new SyntaxError("JSON.parse");
39272         };
39273     }
39274 }());
39275
39276 var json2 = json2Plugin;
39277
39278 function json2Plugin() {
39279         
39280         return {}
39281 }
39282
39283 var plugins = [json2];
39284
39285 var store_legacy = storeEngine.createStore(all$3, plugins);
39286
39287 // # osm-auth
39288 //
39289 // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
39290 // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
39291 // does not support custom headers, which this uses everywhere.
39292 var osmAuth = function(o) {
39293
39294     var oauth = {};
39295
39296     // authenticated users will also have a request token secret, but it's
39297     // not used in transactions with the server
39298     oauth.authenticated = function() {
39299         return !!(token('oauth_token') && token('oauth_token_secret'));
39300     };
39301
39302     oauth.logout = function() {
39303         token('oauth_token', '');
39304         token('oauth_token_secret', '');
39305         token('oauth_request_token_secret', '');
39306         return oauth;
39307     };
39308
39309     // TODO: detect lack of click event
39310     oauth.authenticate = function(callback) {
39311         if (oauth.authenticated()) return callback();
39312
39313         oauth.logout();
39314
39315         // ## Getting a request token
39316         var params = timenonce(getAuth(o)),
39317             url = o.url + '/oauth/request_token';
39318
39319         params.oauth_signature = ohauth_1.signature(
39320             o.oauth_secret, '',
39321             ohauth_1.baseString('POST', url, params));
39322
39323         if (!o.singlepage) {
39324             // Create a 600x550 popup window in the center of the screen
39325             var w = 600, h = 550,
39326                 settings = [
39327                     ['width', w], ['height', h],
39328                     ['left', screen.width / 2 - w / 2],
39329                     ['top', screen.height / 2 - h / 2]].map(function(x) {
39330                         return x.join('=');
39331                     }).join(','),
39332                 popup = window.open('about:blank', 'oauth_window', settings);
39333         }
39334
39335         // Request a request token. When this is complete, the popup
39336         // window is redirected to OSM's authorization page.
39337         ohauth_1.xhr('POST', url, params, null, {}, reqTokenDone);
39338         o.loading();
39339
39340         function reqTokenDone(err, xhr) {
39341             o.done();
39342             if (err) return callback(err);
39343             var resp = ohauth_1.stringQs(xhr.response);
39344             token('oauth_request_token_secret', resp.oauth_token_secret);
39345             var authorize_url = o.url + '/oauth/authorize?' + ohauth_1.qsString({
39346                 oauth_token: resp.oauth_token,
39347                 oauth_callback: resolveUrl(o.landing)
39348             });
39349
39350             if (o.singlepage) {
39351                 location.href = authorize_url;
39352             } else {
39353                 popup.location = authorize_url;
39354             }
39355         }
39356
39357         // Called by a function in a landing page, in the popup window. The
39358         // window closes itself.
39359         window.authComplete = function(token) {
39360             var oauth_token = ohauth_1.stringQs(token.split('?')[1]);
39361             get_access_token(oauth_token.oauth_token);
39362             delete window.authComplete;
39363         };
39364
39365         // ## Getting an request token
39366         //
39367         // At this point we have an `oauth_token`, brought in from a function
39368         // call on a landing page popup.
39369         function get_access_token(oauth_token) {
39370             var url = o.url + '/oauth/access_token',
39371                 params = timenonce(getAuth(o)),
39372                 request_token_secret = token('oauth_request_token_secret');
39373             params.oauth_token = oauth_token;
39374             params.oauth_signature = ohauth_1.signature(
39375                 o.oauth_secret,
39376                 request_token_secret,
39377                 ohauth_1.baseString('POST', url, params));
39378
39379             // ## Getting an access token
39380             //
39381             // The final token required for authentication. At this point
39382             // we have a `request token secret`
39383             ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
39384             o.loading();
39385         }
39386
39387         function accessTokenDone(err, xhr) {
39388             o.done();
39389             if (err) return callback(err);
39390             var access_token = ohauth_1.stringQs(xhr.response);
39391             token('oauth_token', access_token.oauth_token);
39392             token('oauth_token_secret', access_token.oauth_token_secret);
39393             callback(null, oauth);
39394         }
39395     };
39396
39397     oauth.bootstrapToken = function(oauth_token, callback) {
39398         // ## Getting an request token
39399         // At this point we have an `oauth_token`, brought in from a function
39400         // call on a landing page popup.
39401         function get_access_token(oauth_token) {
39402             var url = o.url + '/oauth/access_token',
39403                 params = timenonce(getAuth(o)),
39404                 request_token_secret = token('oauth_request_token_secret');
39405             params.oauth_token = oauth_token;
39406             params.oauth_signature = ohauth_1.signature(
39407                 o.oauth_secret,
39408                 request_token_secret,
39409                 ohauth_1.baseString('POST', url, params));
39410
39411             // ## Getting an access token
39412             // The final token required for authentication. At this point
39413             // we have a `request token secret`
39414             ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
39415             o.loading();
39416         }
39417
39418         function accessTokenDone(err, xhr) {
39419             o.done();
39420             if (err) return callback(err);
39421             var access_token = ohauth_1.stringQs(xhr.response);
39422             token('oauth_token', access_token.oauth_token);
39423             token('oauth_token_secret', access_token.oauth_token_secret);
39424             callback(null, oauth);
39425         }
39426
39427         get_access_token(oauth_token);
39428     };
39429
39430     // # xhr
39431     //
39432     // A single XMLHttpRequest wrapper that does authenticated calls if the
39433     // user has logged in.
39434     oauth.xhr = function(options, callback) {
39435         if (!oauth.authenticated()) {
39436             if (o.auto) {
39437                 return oauth.authenticate(run);
39438             } else {
39439                 callback('not authenticated', null);
39440                 return;
39441             }
39442         } else {
39443             return run();
39444         }
39445
39446         function run() {
39447             var params = timenonce(getAuth(o)),
39448                 oauth_token_secret = token('oauth_token_secret'),
39449                 url = (options.prefix !== false) ? o.url + options.path : options.path,
39450                 url_parts = url.replace(/#.*$/, '').split('?', 2),
39451                 base_url = url_parts[0],
39452                 query = (url_parts.length === 2) ? url_parts[1] : '';
39453
39454             // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
39455             if ((!options.options || !options.options.header ||
39456                 options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
39457                 options.content) {
39458                 params = immutable(params, ohauth_1.stringQs(options.content));
39459             }
39460
39461             params.oauth_token = token('oauth_token');
39462             params.oauth_signature = ohauth_1.signature(
39463                 o.oauth_secret,
39464                 oauth_token_secret,
39465                 ohauth_1.baseString(options.method, base_url, immutable(params, ohauth_1.stringQs(query)))
39466             );
39467
39468             return ohauth_1.xhr(options.method, url, params, options.content, options.options, done);
39469         }
39470
39471         function done(err, xhr) {
39472             if (err) return callback(err);
39473             else if (xhr.responseXML) return callback(err, xhr.responseXML);
39474             else return callback(err, xhr.response);
39475         }
39476     };
39477
39478     // pre-authorize this object, if we can just get a token and token_secret
39479     // from the start
39480     oauth.preauth = function(c) {
39481         if (!c) return;
39482         if (c.oauth_token) token('oauth_token', c.oauth_token);
39483         if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
39484         return oauth;
39485     };
39486
39487     oauth.options = function(_) {
39488         if (!arguments.length) return o;
39489
39490         o = _;
39491         o.url = o.url || 'https://www.openstreetmap.org';
39492         o.landing = o.landing || 'land.html';
39493         o.singlepage = o.singlepage || false;
39494
39495         // Optional loading and loading-done functions for nice UI feedback.
39496         // by default, no-ops
39497         o.loading = o.loading || function() {};
39498         o.done = o.done || function() {};
39499
39500         return oauth.preauth(o);
39501     };
39502
39503     // 'stamp' an authentication object from `getAuth()`
39504     // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
39505     // and timestamp
39506     function timenonce(o) {
39507         o.oauth_timestamp = ohauth_1.timestamp();
39508         o.oauth_nonce = ohauth_1.nonce();
39509         return o;
39510     }
39511
39512     // get/set tokens. These are prefixed with the base URL so that `osm-auth`
39513     // can be used with multiple APIs and the keys in `localStorage`
39514     // will not clash
39515     var token;
39516
39517     if (store_legacy.enabled) {
39518         token = function (x, y) {
39519             if (arguments.length === 1) return store_legacy.get(o.url + x);
39520             else if (arguments.length === 2) return store_legacy.set(o.url + x, y);
39521         };
39522     } else {
39523         var storage = {};
39524         token = function (x, y) {
39525             if (arguments.length === 1) return storage[o.url + x];
39526             else if (arguments.length === 2) return storage[o.url + x] = y;
39527         };
39528     }
39529
39530     // Get an authentication object. If you just add and remove properties
39531     // from a single object, you'll need to use `delete` to make sure that
39532     // it doesn't contain undesired properties for authentication
39533     function getAuth(o) {
39534         return {
39535             oauth_consumer_key: o.oauth_consumer_key,
39536             oauth_signature_method: 'HMAC-SHA1'
39537         };
39538     }
39539
39540     // potentially pre-authorize
39541     oauth.options(o);
39542
39543     return oauth;
39544 };
39545
39546 var JXON = new (function () {
39547   var
39548     sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */
39549     aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
39550
39551   function parseText (sValue) {
39552     if (rIsNull.test(sValue)) { return null; }
39553     if (rIsBool.test(sValue)) { return sValue.toLowerCase() === 'true'; }
39554     if (isFinite(sValue)) { return parseFloat(sValue); }
39555     if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
39556     return sValue;
39557   }
39558
39559   function EmptyTree () { }
39560   EmptyTree.prototype.toString = function () { return 'null'; };
39561   EmptyTree.prototype.valueOf = function () { return null; };
39562
39563   function objectify (vValue) {
39564     return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
39565   }
39566
39567   function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
39568     var
39569       nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
39570       bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
39571
39572     var
39573       sProp, vContent, nLength = 0, sCollectedTxt = '',
39574       vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
39575
39576     if (bChildren) {
39577       for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
39578         oNode = oParentNode.childNodes.item(nItem);
39579         if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is 'CDATASection' (4) */
39580         else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is 'Text' (3) */
39581         else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is 'Element' (1) */
39582       }
39583     }
39584
39585     var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
39586
39587     if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
39588
39589     for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
39590       sProp = aCache[nElId].nodeName.toLowerCase();
39591       vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
39592       if (vResult.hasOwnProperty(sProp)) {
39593         if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
39594         vResult[sProp].push(vContent);
39595       } else {
39596         vResult[sProp] = vContent;
39597         nLength++;
39598       }
39599     }
39600
39601     if (bAttributes) {
39602       var
39603         nAttrLen = oParentNode.attributes.length,
39604         sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
39605
39606       for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
39607         oAttrib = oParentNode.attributes.item(nAttrib);
39608         oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
39609       }
39610
39611       if (bNesteAttr) {
39612         if (bFreeze) { Object.freeze(oAttrParent); }
39613         vResult[sAttributesProp] = oAttrParent;
39614         nLength -= nAttrLen - 1;
39615       }
39616     }
39617
39618     if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
39619       vResult[sValueProp] = vBuiltVal;
39620     } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
39621       vResult = vBuiltVal;
39622     }
39623
39624     if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
39625
39626     aCache.length = nLevelStart;
39627
39628     return vResult;
39629   }
39630
39631   function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
39632     var vValue, oChild;
39633
39634     if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
39635       oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
39636     } else if (oParentObj.constructor === Date) {
39637       oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));    
39638     }
39639
39640     for (var sName in oParentObj) {
39641       vValue = oParentObj[sName];
39642       if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
39643       if (sName === sValueProp) {
39644         if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
39645       } else if (sName === sAttributesProp) { /* verbosity level is 3 */
39646         for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
39647       } else if (sName.charAt(0) === sAttrPref) {
39648         oParentEl.setAttribute(sName.slice(1), vValue);
39649       } else if (vValue.constructor === Array) {
39650         for (var nItem = 0; nItem < vValue.length; nItem++) {
39651           oChild = oXMLDoc.createElement(sName);
39652           loadObjTree(oXMLDoc, oChild, vValue[nItem]);
39653           oParentEl.appendChild(oChild);
39654         }
39655       } else {
39656         oChild = oXMLDoc.createElement(sName);
39657         if (vValue instanceof Object) {
39658           loadObjTree(oXMLDoc, oChild, vValue);
39659         } else if (vValue !== null && vValue !== true) {
39660           oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
39661         }
39662         oParentEl.appendChild(oChild);
39663      }
39664    }
39665   }
39666
39667   this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
39668     var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
39669     return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);    
39670   };
39671
39672   this.unbuild = function (oObjTree) {    
39673     var oNewDoc = document.implementation.createDocument('', '', null);
39674     loadObjTree(oNewDoc, oNewDoc, oObjTree);
39675     return oNewDoc;
39676   };
39677
39678   this.stringify = function (oObjTree) {
39679     return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
39680   };
39681 })();
39682
39683 // var myObject = JXON.build(doc);
39684 // we got our javascript object! try: alert(JSON.stringify(myObject));
39685
39686 // var newDoc = JXON.unbuild(myObject);
39687 // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
39688
39689 var dispatch$3 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded');
39690 var urlroot = 'https://www.openstreetmap.org';
39691 var oauth = osmAuth({
39692     url: urlroot,
39693     oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
39694     oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
39695     loading: authLoading,
39696     done: authDone
39697 });
39698
39699 var _blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
39700 var _tiles = { loaded: {}, inflight: {} };
39701 var _changeset = {};
39702 var _entityCache = {};
39703 var _connectionID = 1;
39704 var _tileZoom = 16;
39705 var _rateLimitError;
39706 var _userChangesets;
39707 var _userDetails;
39708 var _off;
39709
39710
39711 function authLoading() {
39712     dispatch$3.call('authLoading');
39713 }
39714
39715
39716 function authDone() {
39717     dispatch$3.call('authDone');
39718 }
39719
39720
39721 function abortRequest$2(i) {
39722     if (i) {
39723         i.abort();
39724     }
39725 }
39726
39727
39728 function getLoc(attrs) {
39729     var lon = attrs.lon && attrs.lon.value;
39730     var lat = attrs.lat && attrs.lat.value;
39731     return [parseFloat(lon), parseFloat(lat)];
39732 }
39733
39734
39735 function getNodes(obj) {
39736     var elems = obj.getElementsByTagName('nd');
39737     var nodes = new Array(elems.length);
39738     for (var i = 0, l = elems.length; i < l; i++) {
39739         nodes[i] = 'n' + elems[i].attributes.ref.value;
39740     }
39741     return nodes;
39742 }
39743
39744
39745 function getTags(obj) {
39746     var elems = obj.getElementsByTagName('tag');
39747     var tags = {};
39748     for (var i = 0, l = elems.length; i < l; i++) {
39749         var attrs = elems[i].attributes;
39750         tags[attrs.k.value] = attrs.v.value;
39751     }
39752
39753     return tags;
39754 }
39755
39756
39757 function getMembers(obj) {
39758     var elems = obj.getElementsByTagName('member');
39759     var members = new Array(elems.length);
39760     for (var i = 0, l = elems.length; i < l; i++) {
39761         var attrs = elems[i].attributes;
39762         members[i] = {
39763             id: attrs.type.value[0] + attrs.ref.value,
39764             type: attrs.type.value,
39765             role: attrs.role.value
39766         };
39767     }
39768     return members;
39769 }
39770
39771
39772 function getVisible(attrs) {
39773     return (!attrs.visible || attrs.visible.value !== 'false');
39774 }
39775
39776
39777 var parsers = {
39778     node: function nodeData(obj, uid) {
39779         var attrs = obj.attributes;
39780         return new osmNode({
39781             id:uid,
39782             visible: getVisible(attrs),
39783             version: attrs.version.value,
39784             changeset: attrs.changeset && attrs.changeset.value,
39785             timestamp: attrs.timestamp && attrs.timestamp.value,
39786             user: attrs.user && attrs.user.value,
39787             uid: attrs.uid && attrs.uid.value,
39788             loc: getLoc(attrs),
39789             tags: getTags(obj)
39790         });
39791     },
39792
39793     way: function wayData(obj, uid) {
39794         var attrs = obj.attributes;
39795         return new osmWay({
39796             id: uid,
39797             visible: getVisible(attrs),
39798             version: attrs.version.value,
39799             changeset: attrs.changeset && attrs.changeset.value,
39800             timestamp: attrs.timestamp && attrs.timestamp.value,
39801             user: attrs.user && attrs.user.value,
39802             uid: attrs.uid && attrs.uid.value,
39803             tags: getTags(obj),
39804             nodes: getNodes(obj),
39805         });
39806     },
39807
39808     relation: function relationData(obj, uid) {
39809         var attrs = obj.attributes;
39810         return new osmRelation({
39811             id: uid,
39812             visible: getVisible(attrs),
39813             version: attrs.version.value,
39814             changeset: attrs.changeset && attrs.changeset.value,
39815             timestamp: attrs.timestamp && attrs.timestamp.value,
39816             user: attrs.user && attrs.user.value,
39817             uid: attrs.uid && attrs.uid.value,
39818             tags: getTags(obj),
39819             members: getMembers(obj)
39820         });
39821     }
39822 };
39823
39824
39825 function parse(xml$$1, callback, options) {
39826     options = assignIn({ cache: true }, options);
39827     if (!xml$$1 || !xml$$1.childNodes) return;
39828
39829     var root = xml$$1.childNodes[0];
39830     var children = root.childNodes;
39831
39832     function parseChild(child) {
39833         var parser = parsers[child.nodeName];
39834         if (parser) {
39835             var uid = osmEntity$$1.id.fromOSM(child.nodeName, child.attributes.id.value);
39836             if (options.cache && _entityCache[uid]) {
39837                 return null;
39838             }
39839             return parser(child, uid);
39840         }
39841     }
39842
39843     utilIdleWorker(children, parseChild, callback);
39844 }
39845
39846
39847 var serviceOsm = {
39848
39849     init: function() {
39850         utilRebind(this, dispatch$3, 'on');
39851     },
39852
39853
39854     reset: function() {
39855         _connectionID++;
39856         _userChangesets = undefined;
39857         _userDetails = undefined;
39858         _rateLimitError = undefined;
39859         forEach(_tiles.inflight, abortRequest$2);
39860         if (_changeset.inflight) abortRequest$2(_changeset.inflight);
39861         _tiles = { loaded: {}, inflight: {} };
39862         _changeset = {};
39863         _entityCache = {};
39864         return this;
39865     },
39866
39867
39868     getConnectionId: function() {
39869         return _connectionID;
39870     },
39871
39872
39873     changesetURL: function(changesetId) {
39874         return urlroot + '/changeset/' + changesetId;
39875     },
39876
39877
39878     changesetsURL: function(center, zoom) {
39879         var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
39880         return urlroot + '/history#map=' +
39881             Math.floor(zoom) + '/' +
39882             center[1].toFixed(precision) + '/' +
39883             center[0].toFixed(precision);
39884     },
39885
39886
39887     entityURL: function(entity) {
39888         return urlroot + '/' + entity.type + '/' + entity.osmId();
39889     },
39890
39891
39892     historyURL: function(entity) {
39893         return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
39894     },
39895
39896
39897     userURL: function(username) {
39898         return urlroot + '/user/' + username;
39899     },
39900
39901
39902     loadFromAPI: function(path, callback, options) {
39903         options = assignIn({ cache: true }, options);
39904         var that = this;
39905         var cid = _connectionID;
39906
39907         function done(err, xml$$1) {
39908             if (that.getConnectionId() !== cid) {
39909                 if (callback) callback({ message: 'Connection Switched', status: -1 });
39910                 return;
39911             }
39912
39913             var isAuthenticated = that.authenticated();
39914
39915             // 400 Bad Request, 401 Unauthorized, 403 Forbidden
39916             // Logout and retry the request..
39917             if (isAuthenticated && err && (err.status === 400 || err.status === 401 || err.status === 403)) {
39918                 that.logout();
39919                 that.loadFromAPI(path, callback);
39920
39921             // else, no retry..
39922             } else {
39923                 // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
39924                 // Set the rateLimitError flag and trigger a warning..
39925                 if (!isAuthenticated && !_rateLimitError && err &&
39926                         (err.status === 509 || err.status === 429)) {
39927                     _rateLimitError = err;
39928                     dispatch$3.call('change');
39929                 }
39930
39931                 if (callback) {
39932                     if (err) return callback(err, null);
39933                     parse(xml$$1, function (entities) {
39934                         if (options.cache) {
39935                             for (var i in entities) {
39936                                 _entityCache[entities[i].id] = true;
39937                             }
39938                         }
39939                         callback(null, entities);
39940                     }, options);
39941                 }
39942             }
39943         }
39944
39945         if (this.authenticated()) {
39946             return oauth.xhr({ method: 'GET', path: path }, done);
39947         } else {
39948             var url = urlroot + path;
39949             return d3_xml(url).get(done);
39950         }
39951     },
39952
39953
39954     loadEntity: function(id, callback) {
39955         var type = osmEntity$$1.id.type(id);
39956         var osmID = osmEntity$$1.id.toOSM(id);
39957         var options = { cache: false };
39958
39959         this.loadFromAPI(
39960             '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
39961             function(err, entities) {
39962                 if (callback) callback(err, { data: entities });
39963             },
39964             options
39965         );
39966     },
39967
39968
39969     loadEntityVersion: function(id, version, callback) {
39970         var type = osmEntity$$1.id.type(id);
39971         var osmID = osmEntity$$1.id.toOSM(id);
39972         var options = { cache: false };
39973
39974         this.loadFromAPI(
39975             '/api/0.6/' + type + '/' + osmID + '/' + version,
39976             function(err, entities) {
39977                 if (callback) callback(err, { data: entities });
39978             },
39979             options
39980         );
39981     },
39982
39983
39984     loadMultiple: function(ids, callback) {
39985         var that = this;
39986
39987         forEach(groupBy(uniq(ids), osmEntity$$1.id.type), function(v, k) {
39988             var type = k + 's';
39989             var osmIDs = map$3(v, osmEntity$$1.id.toOSM);
39990             var options = { cache: false };
39991
39992             forEach(chunk(osmIDs, 150), function(arr) {
39993                 that.loadFromAPI(
39994                     '/api/0.6/' + type + '?' + type + '=' + arr.join(),
39995                     function(err, entities) {
39996                         if (callback) callback(err, { data: entities });
39997                     },
39998                     options
39999                 );
40000             });
40001         });
40002     },
40003
40004
40005     authenticated: function() {
40006         return oauth.authenticated();
40007     },
40008
40009
40010     putChangeset: function(changeset, changes, callback) {
40011         if (_changeset.inflight) {
40012             return callback({ message: 'Changeset already inflight', status: -2 }, changeset);
40013         }
40014
40015         var that = this;
40016         var cid = _connectionID;
40017
40018         if (_changeset.open) {   // reuse existing open changeset..
40019             createdChangeset(null, _changeset.open);
40020         } else {                 // open a new changeset..
40021             _changeset.inflight = oauth.xhr({
40022                 method: 'PUT',
40023                 path: '/api/0.6/changeset/create',
40024                 options: { header: { 'Content-Type': 'text/xml' } },
40025                 content: JXON.stringify(changeset.asJXON())
40026             }, createdChangeset);
40027         }
40028
40029
40030         function createdChangeset(err, changesetID) {
40031             _changeset.inflight = null;
40032
40033             if (err) {
40034                 // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
40035                 if (err.status === 400 || err.status === 401 || err.status === 403) {
40036                     that.logout();
40037                 }
40038                 return callback(err, changeset);
40039             }
40040             if (that.getConnectionId() !== cid) {
40041                 return callback({ message: 'Connection Switched', status: -1 }, changeset);
40042             }
40043
40044             _changeset.open = changesetID;
40045             changeset = changeset.update({ id: changesetID });
40046
40047             // Upload the changeset..
40048             _changeset.inflight = oauth.xhr({
40049                 method: 'POST',
40050                 path: '/api/0.6/changeset/' + changesetID + '/upload',
40051                 options: { header: { 'Content-Type': 'text/xml' } },
40052                 content: JXON.stringify(changeset.osmChangeJXON(changes))
40053             }, uploadedChangeset);
40054         }
40055
40056
40057         function uploadedChangeset(err) {
40058             _changeset.inflight = null;
40059
40060             if (err) return callback(err, changeset);
40061
40062             // Upload was successful, safe to call the callback.
40063             // Add delay to allow for postgres replication #1646 #2678
40064             window.setTimeout(function() {
40065                 callback(null, changeset);
40066             }, 2500);
40067
40068             _changeset.open = null;
40069
40070             // At this point, we don't really care if the connection was switched..
40071             // Only try to close the changeset if we're still talking to the same server.
40072             if (that.getConnectionId() === cid) {
40073                 // Still attempt to close changeset, but ignore response because #2667
40074                 oauth.xhr({
40075                     method: 'PUT',
40076                     path: '/api/0.6/changeset/' + changeset.id + '/close',
40077                     options: { header: { 'Content-Type': 'text/xml' } }
40078                 }, function() { return true; });
40079             }
40080         }
40081     },
40082
40083
40084     userDetails: function(callback) {
40085         if (_userDetails) {
40086             callback(undefined, _userDetails);
40087             return;
40088         }
40089
40090         var that = this;
40091         var cid = _connectionID;
40092
40093         function done(err, user_details) {
40094             if (err) {
40095                 // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
40096                 if (err.status === 400 || err.status === 401 || err.status === 403) {
40097                     that.logout();
40098                 }
40099                 return callback(err);
40100             }
40101             if (that.getConnectionId() !== cid) {
40102                 return callback({ message: 'Connection Switched', status: -1 });
40103             }
40104
40105
40106             var u = user_details.getElementsByTagName('user')[0];
40107             var img = u.getElementsByTagName('img');
40108             var image_url = '';
40109
40110             if (img && img[0] && img[0].getAttribute('href')) {
40111                 image_url = img[0].getAttribute('href');
40112             }
40113
40114             var changesets = u.getElementsByTagName('changesets');
40115             var changesets_count = 0;
40116
40117             if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
40118                 changesets_count = changesets[0].getAttribute('count');
40119             }
40120
40121             _userDetails = {
40122                 id: u.attributes.id.value,
40123                 display_name: u.attributes.display_name.value,
40124                 image_url: image_url,
40125                 changesets_count: changesets_count
40126             };
40127
40128             callback(undefined, _userDetails);
40129         }
40130
40131         oauth.xhr({ method: 'GET', path: '/api/0.6/user/details' }, done);
40132     },
40133
40134
40135     userChangesets: function(callback) {
40136         if (_userChangesets) {
40137             callback(undefined, _userChangesets);
40138             return;
40139         }
40140
40141         var that = this;
40142         var cid = _connectionID;
40143
40144         this.userDetails(function(err, user) {
40145             if (err) {
40146                 return callback(err);
40147             }
40148             if (that.getConnectionId() !== cid) {
40149                 return callback({ message: 'Connection Switched', status: -1 });
40150             }
40151
40152             function done(err, changesets) {
40153                 if (err) {
40154                     // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
40155                     if (err.status === 400 || err.status === 401 || err.status === 403) {
40156                         that.logout();
40157                     }
40158                     return callback(err);
40159                 }
40160                 if (that.getConnectionId() !== cid) {
40161                     return callback({ message: 'Connection Switched', status: -1 });
40162                 }
40163
40164                 _userChangesets = Array.prototype.map.call(
40165                     changesets.getElementsByTagName('changeset'),
40166                     function (changeset) {
40167                         return { tags: getTags(changeset) };
40168                     }
40169                 ).filter(function (changeset) {
40170                     var comment = changeset.tags.comment;
40171                     return comment && comment !== '';
40172                 });
40173
40174                 callback(undefined, _userChangesets);
40175             }
40176
40177             oauth.xhr({ method: 'GET', path: '/api/0.6/changesets?user=' + user.id }, done);
40178         });
40179     },
40180
40181
40182     status: function(callback) {
40183         var that = this;
40184         var cid = _connectionID;
40185
40186         function done(xml$$1) {
40187             if (that.getConnectionId() !== cid) {
40188                 return callback({ message: 'Connection Switched', status: -1 }, 'connectionSwitched');
40189             }
40190
40191             // update blacklists
40192             var elements = xml$$1.getElementsByTagName('blacklist');
40193             var regexes = [];
40194             for (var i = 0; i < elements.length; i++) {
40195                 var regex = elements[i].getAttribute('regex');  // needs unencode?
40196                 if (regex) {
40197                     regexes.push(regex);
40198                 }
40199             }
40200             if (regexes.length) {
40201                 _blacklists = regexes;
40202             }
40203
40204
40205             if (_rateLimitError) {
40206                 callback(_rateLimitError, 'rateLimited');
40207             } else {
40208                 var apiStatus = xml$$1.getElementsByTagName('status');
40209                 var val = apiStatus[0].getAttribute('api');
40210
40211                 callback(undefined, val);
40212             }
40213         }
40214
40215         d3_xml(urlroot + '/api/capabilities').get()
40216             .on('load', done)
40217             .on('error', callback);
40218     },
40219
40220
40221     imageryBlacklists: function() {
40222         return _blacklists;
40223     },
40224
40225
40226     tileZoom: function(_) {
40227         if (!arguments.length) return _tileZoom;
40228         _tileZoom = _;
40229         return this;
40230     },
40231
40232
40233     loadTiles: function(projection, dimensions, callback) {
40234         if (_off) return;
40235
40236         var that = this;
40237         var s = projection.scale() * 2 * Math.PI;
40238         var z = Math.max(Math.log(s) / Math.log(2) - 8, 0);
40239         var ts = 256 * Math.pow(2, z - _tileZoom);
40240         var origin = [
40241             s / 2 - projection.translate()[0],
40242             s / 2 - projection.translate()[1]
40243         ];
40244
40245         var tiles = d3geoTile()
40246             .scaleExtent([_tileZoom, _tileZoom])
40247             .scale(s)
40248             .size(dimensions)
40249             .translate(projection.translate())()
40250             .map(function(tile) {
40251                 var x = tile[0] * ts - origin[0];
40252                 var y = tile[1] * ts - origin[1];
40253
40254                 return {
40255                     id: tile.toString(),
40256                     extent: geoExtent$$1(
40257                         projection.invert([x, y + ts]),
40258                         projection.invert([x + ts, y]))
40259                 };
40260             });
40261
40262         filter(_tiles.inflight, function(v, i) {
40263             var wanted = find$1(tiles, function(tile) {
40264                 return i === tile.id;
40265             });
40266             if (!wanted) delete _tiles.inflight[i];
40267             return !wanted;
40268         }).map(abortRequest$2);
40269
40270         tiles.forEach(function(tile) {
40271             var id = tile.id;
40272
40273             if (_tiles.loaded[id] || _tiles.inflight[id]) return;
40274
40275             if (isEmpty(_tiles.inflight)) {
40276                 dispatch$3.call('loading');
40277             }
40278
40279             _tiles.inflight[id] = that.loadFromAPI(
40280                 '/api/0.6/map?bbox=' + tile.extent.toParam(),
40281                 function(err, parsed) {
40282                     delete _tiles.inflight[id];
40283                     if (!err) {
40284                         _tiles.loaded[id] = true;
40285                     }
40286
40287                     if (callback) {
40288                         callback(err, assignIn({ data: parsed }, tile));
40289                     }
40290
40291                     if (isEmpty(_tiles.inflight)) {
40292                         dispatch$3.call('loaded');
40293                     }
40294                 }
40295             );
40296         });
40297     },
40298
40299
40300     switch: function(options) {
40301         urlroot = options.urlroot;
40302
40303         oauth.options(assignIn({
40304             url: urlroot,
40305             loading: authLoading,
40306             done: authDone
40307         }, options));
40308
40309         this.reset();
40310         this.userChangesets(function() {});  // eagerly load user details/changesets
40311         dispatch$3.call('change');
40312         return this;
40313     },
40314
40315
40316     toggle: function(_) {
40317         _off = !_;
40318         return this;
40319     },
40320
40321
40322     loadedTiles: function(_) {
40323         if (!arguments.length) return _tiles.loaded;
40324         _tiles.loaded = _;
40325         return this;
40326     },
40327
40328
40329     logout: function() {
40330         _userChangesets = undefined;
40331         _userDetails = undefined;
40332         oauth.logout();
40333         dispatch$3.call('change');
40334         return this;
40335     },
40336
40337
40338     authenticate: function(callback) {
40339         var that = this;
40340         var cid = _connectionID;
40341         _userChangesets = undefined;
40342         _userDetails = undefined;
40343
40344         function done(err, res) {
40345             if (err) {
40346                 if (callback) callback(err);
40347                 return;
40348             }
40349             if (that.getConnectionId() !== cid) {
40350                 if (callback) callback({ message: 'Connection Switched', status: -1 });
40351                 return;
40352             }
40353             _rateLimitError = undefined;
40354             dispatch$3.call('change');
40355             if (callback) callback(err, res);
40356             that.userChangesets(function() {});  // eagerly load user details/changesets
40357         }
40358
40359         return oauth.authenticate(done);
40360     }
40361 };
40362
40363 var apibase$3 = 'https://taginfo.openstreetmap.org/api/4/',
40364     inflight$1 = {},
40365     popularKeys = {},
40366     taginfoCache = {},
40367     tag_sorts = {
40368         point: 'count_nodes',
40369         vertex: 'count_nodes',
40370         area: 'count_ways',
40371         line: 'count_ways'
40372     },
40373     tag_sort_members = {
40374         point: 'count_node_members',
40375         vertex: 'count_node_members',
40376         area: 'count_way_members',
40377         line: 'count_way_members',
40378         relation: 'count_relation_members'
40379     },
40380     tag_filters = {
40381         point: 'nodes',
40382         vertex: 'nodes',
40383         area: 'ways',
40384         line: 'ways'
40385     },
40386     tag_members_fractions = {
40387         point: 'count_node_members_fraction',
40388         vertex: 'count_node_members_fraction',
40389         area: 'count_way_members_fraction',
40390         line: 'count_way_members_fraction',
40391         relation: 'count_relation_members_fraction'
40392     };
40393
40394
40395 function sets(params, n, o) {
40396     if (params.geometry && o[params.geometry]) {
40397         params[n] = o[params.geometry];
40398     }
40399     return params;
40400 }
40401
40402
40403 function setFilter(params) {
40404     return sets(params, 'filter', tag_filters);
40405 }
40406
40407
40408 function setSort(params) {
40409     return sets(params, 'sortname', tag_sorts);
40410 }
40411
40412
40413 function setSortMembers(params) {
40414     return sets(params, 'sortname', tag_sort_members);
40415 }
40416
40417
40418 function clean(params) {
40419     return omit(params, ['geometry', 'debounce']);
40420 }
40421
40422
40423 function filterKeys(type) {
40424     var count_type = type ? 'count_' + type : 'count_all';
40425     return function(d) {
40426         return parseFloat(d[count_type]) > 2500 || d.in_wiki;
40427     };
40428 }
40429
40430
40431 function filterMultikeys(prefix) {
40432     return function(d) {
40433         // d.key begins with prefix, and d.key contains no additional ':'s
40434         var re = new RegExp('^' + prefix + '(.*)$');
40435         var matches = d.key.match(re) || [];
40436         return (matches.length === 2 && matches[1].indexOf(':') === -1);
40437     };
40438 }
40439
40440
40441 function filterValues(allowUpperCase) {
40442     return function(d) {
40443         if (d.value.match(/[;,]/) !== null) return false;  // exclude some punctuation
40444         if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false;  // exclude uppercase letters
40445         return parseFloat(d.fraction) > 0.0 || d.in_wiki;
40446     };
40447 }
40448
40449
40450 function filterRoles(geometry) {
40451     return function(d) {
40452         if (d.role === '') return false; // exclude empty role
40453         if (d.role.match(/[A-Z*;,]/) !== null) return false;  // exclude uppercase letters and some punctuation
40454         return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
40455     };
40456 }
40457
40458
40459 function valKey(d) {
40460     return {
40461         value: d.key,
40462         title: d.key
40463     };
40464 }
40465
40466
40467 function valKeyDescription(d) {
40468     return {
40469         value: d.value,
40470         title: d.description || d.value
40471     };
40472 }
40473
40474
40475 function roleKey(d) {
40476     return {
40477         value: d.role,
40478         title: d.role
40479     };
40480 }
40481
40482
40483 // sort keys with ':' lower than keys without ':'
40484 function sortKeys(a, b) {
40485     return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
40486         : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1
40487         : 0;
40488 }
40489
40490
40491 var debouncedRequest = debounce(request, 500, { leading: false });
40492
40493 function request(url, params, exactMatch, callback, loaded) {
40494     if (inflight$1[url]) return;
40495
40496     if (checkCache(url, params, exactMatch, callback)) return;
40497
40498     inflight$1[url] = d3_json(url, function (err, data) {
40499         delete inflight$1[url];
40500         loaded(err, data);
40501     });
40502 }
40503
40504
40505 function checkCache(url, params, exactMatch, callback) {
40506     var rp = params.rp || 25,
40507         testQuery = params.query || '',
40508         testUrl = url;
40509
40510     do {
40511         var hit = taginfoCache[testUrl];
40512
40513         // exact match, or shorter match yielding fewer than max results (rp)
40514         if (hit && (url === testUrl || hit.length < rp)) {
40515             callback(null, hit);
40516             return true;
40517         }
40518
40519         // don't try to shorten the query
40520         if (exactMatch || !testQuery.length) return false;
40521
40522         // do shorten the query to see if we already have a cached result
40523         // that has returned fewer than max results (rp)
40524         testQuery = testQuery.slice(0, -1);
40525         testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
40526     } while (testQuery.length >= 0);
40527
40528     return false;
40529 }
40530
40531
40532 var serviceTaginfo = {
40533
40534     init: function() {
40535         inflight$1 = {};
40536         taginfoCache = {};
40537         popularKeys = {};
40538
40539         // Fetch popular keys.  We'll exclude these from `values`
40540         // lookups because they stress taginfo, and they aren't likely
40541         // to yield meaningful autocomplete results.. see #3955
40542         var params = { rp: 100, sortname: 'values_all', sortorder: 'desc', page: 1, debounce: false };
40543         this.keys(params, function(err, data) {
40544             if (err) return;
40545             data.forEach(function(d) {
40546                 if (d.value === 'opening_hours') return;  // exception
40547                 popularKeys[d.value] = true;
40548             });
40549         });
40550     },
40551
40552
40553     reset: function() {
40554         forEach(inflight$1, function(req) { req.abort(); });
40555         inflight$1 = {};
40556     },
40557
40558
40559     keys: function(params, callback) {
40560         var doRequest = params.debounce ? debouncedRequest : request;
40561         params = clean(setSort(params));
40562         params = assignIn({ rp: 10, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
40563
40564         var url = apibase$3 + 'keys/all?' + utilQsString(params);
40565         doRequest(url, params, false, callback, function(err, d) {
40566             if (err) {
40567                 callback(err);
40568             } else {
40569                 var f = filterKeys(params.filter);
40570                 var result = d.data.filter(f).sort(sortKeys).map(valKey);
40571                 taginfoCache[url] = result;
40572                 callback(null, result);
40573             }
40574         });
40575     },
40576
40577
40578     multikeys: function(params, callback) {
40579         var doRequest = params.debounce ? debouncedRequest : request;
40580         params = clean(setSort(params));
40581         params = assignIn({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
40582         var prefix = params.query;
40583
40584         var url = apibase$3 + 'keys/all?' + utilQsString(params);
40585         doRequest(url, params, true, callback, function(err, d) {
40586             if (err) {
40587                 callback(err);
40588             } else {
40589                 var f = filterMultikeys(prefix);
40590                 var result = d.data.filter(f).map(valKey);
40591                 taginfoCache[url] = result;
40592                 callback(null, result);
40593             }
40594         });
40595     },
40596
40597
40598     values: function(params, callback) {
40599         // Exclude popular keys from values lookups.. see #3955
40600         var key = params.key;
40601         if (key && popularKeys[key]) {
40602             callback(null, []);
40603             return;
40604         }
40605
40606         var doRequest = params.debounce ? debouncedRequest : request;
40607         params = clean(setSort(setFilter(params)));
40608         params = assignIn({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
40609
40610         var url = apibase$3 + 'key/values?' + utilQsString(params);
40611         doRequest(url, params, false, callback, function(err, d) {
40612             if (err) {
40613                 callback(err);
40614             } else {
40615                 // In most cases we prefer taginfo value results with lowercase letters.
40616                 // A few OSM keys expect values to contain uppercase values (see #3377).
40617                 // This is not an exhaustive list (e.g. `name` also has uppercase values)
40618                 // but these are the fields where taginfo value lookup is most useful.
40619                 var re = /network|taxon|genus|species|brand|grape_variety|rating|:output|_hours|_times/;
40620                 var allowUpperCase = (params.key.match(re) !== null);
40621                 var f = filterValues(allowUpperCase);
40622
40623                 var result = d.data.filter(f).map(valKeyDescription);
40624                 taginfoCache[url] = result;
40625                 callback(null, result);
40626             }
40627         });
40628     },
40629
40630
40631     roles: function(params, callback) {
40632         var doRequest = params.debounce ? debouncedRequest : request;
40633         var geometry = params.geometry;
40634         params = clean(setSortMembers(params));
40635         params = assignIn({ rp: 25, sortname: 'count_all_members', sortorder: 'desc', page: 1 }, params);
40636
40637         var url = apibase$3 + 'relation/roles?' + utilQsString(params);
40638         doRequest(url, params, true, callback, function(err, d) {
40639             if (err) {
40640                 callback(err);
40641             } else {
40642                 var f = filterRoles(geometry);
40643                 var result = d.data.filter(f).map(roleKey);
40644                 taginfoCache[url] = result;
40645                 callback(null, result);
40646             }
40647         });
40648     },
40649
40650
40651     docs: function(params, callback) {
40652         var doRequest = params.debounce ? debouncedRequest : request;
40653         params = clean(setSort(params));
40654
40655         var path = 'key/wiki_pages?';
40656         if (params.value) path = 'tag/wiki_pages?';
40657         else if (params.rtype) path = 'relation/wiki_pages?';
40658
40659         var url = apibase$3 + path + utilQsString(params);
40660         doRequest(url, params, true, callback, function(err, d) {
40661             if (err) {
40662                 callback(err);
40663             } else {
40664                 taginfoCache[url] = d.data;
40665                 callback(null, d.data);
40666             }
40667         });
40668     },
40669
40670
40671     apibase: function(_) {
40672         if (!arguments.length) return apibase$3;
40673         apibase$3 = _;
40674         return this;
40675     }
40676
40677 };
40678
40679 var jsonpCache = {};
40680 window.jsonpCache = jsonpCache;
40681
40682 function jsonpRequest(url, callback) {
40683
40684   if (window.JSONP_FIX) {
40685     if (window.JSONP_DELAY === 0) {
40686       callback(window.JSONP_FIX);
40687     } else {
40688       setTimeout(function() {
40689         callback(window.JSONP_FIX);
40690       }, window.JSONP_DELAY || 0);
40691     }
40692     return;
40693   }
40694
40695   function rand() {
40696     var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
40697       c = '', i = -1;
40698     while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
40699     return c;
40700   }
40701
40702   function create$$1(url) {
40703     var e = url.match(/callback=(\w+)/),
40704       c = e ? e[1] : rand();
40705     jsonpCache[c] = function(data) {
40706       callback(data);
40707       delete jsonpCache[c];
40708       script.remove();
40709     };
40710     return 'jsonpCache.' + c;
40711   }
40712
40713   var cb = create$$1(url),
40714     script = d3_select('head')
40715     .append('script')
40716     .attr('type', 'text/javascript')
40717     .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
40718 }
40719
40720 var endpoint = 'https://www.wikidata.org/w/api.php?';
40721
40722 var serviceWikidata = {
40723
40724     init: function() {},
40725     reset: function() {},
40726
40727
40728     // Given a Wikipedia language and article title, return an array of
40729     // corresponding Wikidata entities.
40730     itemsByTitle: function(lang, title, callback) {
40731         if (!title) {
40732             callback('', {});
40733             return;
40734         }
40735
40736         lang = lang || 'en';
40737         jsonpRequest(endpoint + utilQsString({
40738             action: 'wbgetentities',
40739             format: 'json',
40740             sites: lang.replace(/-/g, '_') + 'wiki',
40741             titles: title,
40742             languages: 'en', // shrink response by filtering to one language
40743             callback: '{callback}'
40744         }), function(data) {
40745             if (!data || data.error) {
40746                 callback('', {});
40747             } else {
40748                 callback(title, data.entities || {});
40749             }
40750         });
40751     }
40752
40753 };
40754
40755 var endpoint$1 = 'https://en.wikipedia.org/w/api.php?';
40756
40757 var serviceWikipedia = {
40758
40759     init: function() {},
40760     reset: function() {},
40761
40762
40763     search: function(lang, query, callback) {
40764         if (!query) {
40765             callback('', []);
40766             return;
40767         }
40768
40769         lang = lang || 'en';
40770         jsonpRequest(endpoint$1.replace('en', lang) +
40771             utilQsString({
40772                 action: 'query',
40773                 list: 'search',
40774                 srlimit: '10',
40775                 srinfo: 'suggestion',
40776                 format: 'json',
40777                 callback: '{callback}',
40778                 srsearch: query
40779             }), function(data) {
40780                 if (!data || !data.query || !data.query.search || data.error) {
40781                     callback('', []);
40782                 } else {
40783                     var results = data.query.search.map(function(d) { return d.title; });
40784                     callback(query, results);
40785                 }
40786             }
40787         );
40788     },
40789
40790
40791     suggestions: function(lang, query, callback) {
40792         if (!query) {
40793             callback('', []);
40794             return;
40795         }
40796
40797         lang = lang || 'en';
40798         jsonpRequest(endpoint$1.replace('en', lang) +
40799             utilQsString({
40800                 action: 'opensearch',
40801                 namespace: 0,
40802                 suggest: '',
40803                 format: 'json',
40804                 callback: '{callback}',
40805                 search: query
40806             }), function(data) {
40807                 if (!data || data.error) {
40808                     callback('', []);
40809                 } else {
40810                     callback(data[0], data[1] || []);
40811                 }
40812             }
40813         );
40814     },
40815
40816
40817     translations: function(lang, title, callback) {
40818         if (!title) {
40819             callback({});
40820             return;
40821         }
40822
40823         jsonpRequest(endpoint$1.replace('en', lang) +
40824             utilQsString({
40825                 action: 'query',
40826                 prop: 'langlinks',
40827                 format: 'json',
40828                 callback: '{callback}',
40829                 lllimit: 500,
40830                 titles: title
40831             }), function(data) {
40832                 if (!data || !data.query || !data.query.pages || data.error) {
40833                     callback({});
40834                 } else {
40835                     var list = data.query.pages[Object.keys(data.query.pages)[0]],
40836                         translations = {};
40837                     if (list && list.langlinks) {
40838                         list.langlinks.forEach(function(d) {
40839                             translations[d.lang] = d['*'];
40840                         });
40841                     }
40842                     callback(translations);
40843                 }
40844             }
40845         );
40846     }
40847
40848 };
40849
40850 var services = {
40851     geocoder: serviceNominatim,
40852     mapillary: serviceMapillary,
40853     openstreetcam: serviceOpenstreetcam,
40854     osm: serviceOsm,
40855     taginfo: serviceTaginfo,
40856     wikidata: serviceWikidata,
40857     wikipedia: serviceWikipedia
40858 };
40859
40860 function svgAreas$$1(projection, context) {
40861     // Patterns only work in Firefox when set directly on element.
40862     // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
40863     var patterns = {
40864         beach: 'beach',
40865         cemetery: 'cemetery',
40866         construction: 'construction',
40867         farm: 'farmland',
40868         farmland: 'farmland',
40869         grave_yard: 'cemetery',
40870         meadow: 'meadow',
40871         military: 'construction',
40872         orchard: 'orchard',
40873         sand: 'beach',
40874         scrub: 'scrub',
40875         wetland: 'wetland',
40876     };
40877
40878     var patternKeys = ['landuse', 'natural', 'amenity'];
40879
40880
40881     function setPattern(d) {
40882         for (var i = 0; i < patternKeys.length; i++) {
40883             if (d.tags.building && d.tags.building !== 'no') continue;
40884
40885             if (patterns.hasOwnProperty(d.tags[patternKeys[i]])) {
40886                 this.style.fill = this.style.stroke = 'url("#pattern-' + patterns[d.tags[patternKeys[i]]] + '")';
40887                 return;
40888             }
40889         }
40890         this.style.fill = this.style.stroke = '';
40891     }
40892
40893
40894     function drawTargets(selection, graph, entities, filter) {
40895         var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
40896         var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
40897         var getPath = svgPath(projection).geojson;
40898         var activeID = context.activeID();
40899
40900         // The targets and nopes will be MultiLineString sub-segments of the ways
40901         var data = { targets: [], nopes: [] };
40902
40903         entities.forEach(function(way) {
40904             var features = svgSegmentWay(way, graph, activeID);
40905             data.targets.push.apply(data.targets, features.passive);
40906             data.nopes.push.apply(data.nopes, features.active);
40907         });
40908
40909
40910         // Targets allow hover and vertex snapping
40911         var targetData = data.targets.filter(getPath);
40912         var targets = selection.selectAll('.area.target-allowed')
40913             .filter(function(d) { return filter(d.properties.entity); })
40914             .data(targetData, function key(d) { return d.id; });
40915
40916         // exit
40917         targets.exit()
40918             .remove();
40919
40920         // enter/update
40921         targets.enter()
40922             .append('path')
40923             .merge(targets)
40924             .attr('d', getPath)
40925             .attr('class', function(d) { return 'way area target target-allowed ' + targetClass + d.id; });
40926
40927
40928         // NOPE
40929         var nopeData = data.nopes.filter(getPath);
40930         var nopes = selection.selectAll('.area.target-nope')
40931             .filter(function(d) { return filter(d.properties.entity); })
40932             .data(nopeData, function key(d) { return d.id; });
40933
40934         // exit
40935         nopes.exit()
40936             .remove();
40937
40938         // enter/update
40939         nopes.enter()
40940             .append('path')
40941             .merge(nopes)
40942             .attr('d', getPath)
40943             .attr('class', function(d) { return 'way area target target-nope ' + nopeClass + d.id; });
40944     }
40945
40946
40947     function drawAreas(selection, graph, entities, filter) {
40948         var path = svgPath(projection, graph, true),
40949             areas = {},
40950             multipolygon;
40951
40952         for (var i = 0; i < entities.length; i++) {
40953             var entity = entities[i];
40954             if (entity.geometry(graph) !== 'area') continue;
40955
40956             multipolygon = osmIsSimpleMultipolygonOuterMember(entity, graph);
40957             if (multipolygon) {
40958                 areas[multipolygon.id] = {
40959                     entity: multipolygon.mergeTags(entity.tags),
40960                     area: Math.abs(entity.area(graph))
40961                 };
40962             } else if (!areas[entity.id]) {
40963                 areas[entity.id] = {
40964                     entity: entity,
40965                     area: Math.abs(entity.area(graph))
40966                 };
40967             }
40968         }
40969
40970         areas = values$1(areas).filter(function hasPath(a) { return path(a.entity); });
40971         areas.sort(function areaSort(a, b) { return b.area - a.area; });
40972         areas = map$3(areas, 'entity');
40973
40974         var strokes = areas.filter(function(area) {
40975             return area.type === 'way';
40976         });
40977
40978         var data = {
40979             clip: areas,
40980             shadow: strokes,
40981             stroke: strokes,
40982             fill: areas
40983         };
40984
40985         var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath')
40986            .filter(filter)
40987            .data(data.clip, osmEntity$$1.key);
40988
40989         clipPaths.exit()
40990            .remove();
40991
40992         var clipPathsEnter = clipPaths.enter()
40993            .append('clipPath')
40994            .attr('class', 'clipPath')
40995            .attr('id', function(entity) { return entity.id + '-clippath'; });
40996
40997         clipPathsEnter
40998            .append('path');
40999
41000         clipPaths.merge(clipPathsEnter)
41001            .selectAll('path')
41002            .attr('d', path);
41003
41004
41005         var layer = selection.selectAll('.layer-areas .layer-areas-areas');
41006
41007         var areagroup = layer
41008             .selectAll('g.areagroup')
41009             .data(['fill', 'shadow', 'stroke']);
41010
41011         areagroup = areagroup.enter()
41012             .append('g')
41013             .attr('class', function(d) { return 'areagroup area-' + d; })
41014             .merge(areagroup);
41015
41016         var paths = areagroup
41017             .selectAll('path')
41018             .filter(filter)
41019             .data(function(layer) { return data[layer]; }, osmEntity$$1.key);
41020
41021         paths.exit()
41022             .remove();
41023
41024         var fills = selection.selectAll('.area-fill path.area').nodes();
41025
41026         var bisect = d3_bisector(function(node) {
41027             return -node.__data__.area(graph);
41028         }).left;
41029
41030         function sortedByArea(entity) {
41031             if (this._parent.__data__ === 'fill') {
41032                 return fills[bisect(fills, -entity.area(graph))];
41033             }
41034         }
41035
41036         paths = paths.enter()
41037             .insert('path', sortedByArea)
41038             .merge(paths)
41039             .each(function(entity) {
41040                 var layer = this.parentNode.__data__;
41041
41042                 this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
41043
41044                 if (layer === 'fill') {
41045                     this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
41046                     setPattern.apply(this, arguments);
41047                 }
41048             })
41049             .call(svgTagClasses())
41050             .attr('d', path);
41051
41052
41053         // touch targets
41054         selection.selectAll('.layer-areas .layer-areas-targets')
41055             .call(drawTargets, graph, data.stroke, filter);
41056     }
41057
41058     return drawAreas;
41059 }
41060
41061 function svgDebug$$1(projection, context) {
41062
41063     function multipolygons(imagery) {
41064         return imagery.map(function(data$$1) {
41065             return {
41066                 type: 'MultiPolygon',
41067                 coordinates: [ data$$1.polygon ]
41068             };
41069         });
41070     }
41071
41072     function drawDebug(selection$$1) {
41073         var showsTile = context.getDebug('tile');
41074         var showsCollision = context.getDebug('collision');
41075         var showsImagery = context.getDebug('imagery');
41076         var showsImperial = context.getDebug('imperial');
41077         var showsDriveLeft = context.getDebug('driveLeft');
41078         var showsTouchTargets = context.getDebug('target');
41079
41080         var debugData = [];
41081         if (showsTile) {
41082             debugData.push({ class: 'red', label: 'tile' });
41083         }
41084         if (showsCollision) {
41085             debugData.push({ class: 'yellow', label: 'collision' });
41086         }
41087         if (showsImagery) {
41088             debugData.push({ class: 'orange', label: 'imagery' });
41089         }
41090         if (showsImperial) {
41091             debugData.push({ class: 'cyan', label: 'imperial' });
41092         }
41093         if (showsDriveLeft) {
41094             debugData.push({ class: 'green', label: 'driveLeft' });
41095         }
41096         if (showsTouchTargets) {
41097             debugData.push({ class: 'pink', label: 'touchTargets' });
41098         }
41099
41100
41101         var legend = d3_select('#content')
41102             .selectAll('.debug-legend')
41103             .data(debugData.length ? [0] : []);
41104
41105         legend.exit()
41106             .remove();
41107
41108         legend = legend.enter()
41109             .append('div')
41110             .attr('class', 'fillD debug-legend')
41111             .merge(legend);
41112
41113
41114         var legendItems = legend.selectAll('.debug-legend-item')
41115             .data(debugData, function(d) { return d.label; });
41116
41117         legendItems.exit()
41118             .remove();
41119
41120         legendItems.enter()
41121             .append('span')
41122             .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
41123             .text(function(d) { return d.label; });
41124
41125
41126         var layer = selection$$1.selectAll('.layer-debug')
41127             .data(showsImagery || showsImperial || showsDriveLeft ? [0] : []);
41128
41129         layer.exit()
41130             .remove();
41131
41132         layer = layer.enter()
41133             .append('g')
41134             .attr('class', 'layer-debug')
41135             .merge(layer);
41136
41137
41138         var extent = context.map().extent();
41139         var dataImagery = data.imagery || [];
41140         var availableImagery = showsImagery && multipolygons(dataImagery.filter(function(source) {
41141             if (!source.polygon) return false;
41142             return source.polygon.some(function(polygon) {
41143                 return geoPolygonIntersectsPolygon(polygon, extent, true);
41144             });
41145         }));
41146
41147         var imagery = layer.selectAll('path.debug-imagery')
41148             .data(showsImagery ? availableImagery : []);
41149
41150         imagery.exit()
41151             .remove();
41152
41153         imagery.enter()
41154             .append('path')
41155             .attr('class', 'debug-imagery debug orange');
41156
41157
41158         var imperial = layer
41159             .selectAll('path.debug-imperial')
41160             .data(showsImperial ? [dataImperial] : []);
41161
41162         imperial.exit()
41163             .remove();
41164
41165         imperial.enter()
41166             .append('path')
41167             .attr('class', 'debug-imperial debug cyan');
41168
41169
41170         var driveLeft = layer
41171             .selectAll('path.debug-drive-left')
41172             .data(showsDriveLeft ? [dataDriveLeft] : []);
41173
41174         driveLeft.exit()
41175             .remove();
41176
41177         driveLeft.enter()
41178             .append('path')
41179             .attr('class', 'debug-drive-left debug green');
41180
41181
41182         // update
41183         layer.selectAll('path')
41184             .attr('d', svgPath(projection).geojson);
41185     }
41186
41187
41188     // This looks strange because `enabled` methods on other layers are
41189     // chainable getter/setters, and this one is just a getter.
41190     drawDebug.enabled = function() {
41191         if (!arguments.length) {
41192             return context.getDebug('tile') ||
41193                 context.getDebug('collision') ||
41194                 context.getDebug('imagery') ||
41195                 context.getDebug('imperial') ||
41196                 context.getDebug('driveLeft') ||
41197                 context.getDebug('target');
41198         } else {
41199             return this;
41200         }
41201     };
41202
41203
41204     return drawDebug;
41205 }
41206
41207 /*
41208     A standalone SVG element that contains only a `defs` sub-element. To be
41209     used once globally, since defs IDs must be unique within a document.
41210 */
41211 function svgDefs(context) {
41212
41213     function SVGSpriteDefinition(id, href) {
41214         return function(defs) {
41215             d3_request(href)
41216                 .mimeType('image/svg+xml')
41217                 .response(function(xhr) { return xhr.responseXML; })
41218                 .get(function(err, svg) {
41219                     if (err) return;
41220                     defs.node().appendChild(
41221                         d3_select(svg.documentElement).attr('id', id).node()
41222                     );
41223                 });
41224         };
41225     }
41226
41227
41228     return function drawDefs(selection$$1) {
41229         var defs = selection$$1.append('defs');
41230
41231         // markers
41232         defs
41233             .append('marker')
41234             .attr('id', 'oneway-marker')
41235             .attr('viewBox', '0 0 10 5')
41236             .attr('refX', 2.5)
41237             .attr('refY', 2.5)
41238             .attr('markerWidth', 2)
41239             .attr('markerHeight', 2)
41240             .attr('markerUnits', 'strokeWidth')
41241             .attr('orient', 'auto')
41242             .append('path')
41243             .attr('class', 'oneway-marker-path')
41244             .attr('d', 'M 5,3 L 0,3 L 0,2 L 5,2 L 5,0 L 10,2.5 L 5,5 z')
41245             .attr('stroke', 'none')
41246             .attr('fill', '#000')
41247             .attr('opacity', '0.75');
41248
41249         defs
41250             .append('marker')
41251             .attr('id', 'viewfield-marker')
41252             .attr('viewBox', '0 0 16 16')
41253             .attr('refX', 8)
41254             .attr('refY', 16)
41255             .attr('markerWidth', 4)
41256             .attr('markerHeight', 4)
41257             .attr('markerUnits', 'strokeWidth')
41258             .attr('orient', 'auto')
41259             .append('path')
41260             .attr('class', 'viewfield-marker-path')
41261             .attr('d', 'M 6,14 C 8,13.4 8,13.4 10,14 L 16,3 C 12,0 4,0 0,3 z')
41262             .attr('fill', '#333')
41263             .attr('fill-opacity', '0.75')
41264             .attr('stroke', '#fff')
41265             .attr('stroke-width', '0.5px')
41266             .attr('stroke-opacity', '0.75');
41267
41268         defs
41269             .append('marker')
41270             .attr('id', 'viewfield-marker-wireframe')
41271             .attr('viewBox', '0 0 16 16')
41272             .attr('refX', 8)
41273             .attr('refY', 16)
41274             .attr('markerWidth', 4)
41275             .attr('markerHeight', 4)
41276             .attr('markerUnits', 'strokeWidth')
41277             .attr('orient', 'auto')
41278             .append('path')
41279             .attr('class', 'viewfield-marker-path')
41280             .attr('d', 'M 6,14 C 8,13.4 8,13.4 10,14 L 16,3 C 12,0 4,0 0,3 z')
41281             .attr('fill', 'none')
41282             .attr('stroke', '#fff')
41283             .attr('stroke-width', '0.5px')
41284             .attr('stroke-opacity', '0.75');
41285
41286         // patterns
41287         var patterns = defs.selectAll('pattern')
41288             .data([
41289                 // pattern name, pattern image name
41290                 ['wetland', 'wetland'],
41291                 ['construction', 'construction'],
41292                 ['cemetery', 'cemetery'],
41293                 ['orchard', 'orchard'],
41294                 ['farmland', 'farmland'],
41295                 ['beach', 'dots'],
41296                 ['scrub', 'dots'],
41297                 ['meadow', 'dots']
41298             ])
41299             .enter()
41300             .append('pattern')
41301             .attr('id', function (d) { return 'pattern-' + d[0]; })
41302             .attr('width', 32)
41303             .attr('height', 32)
41304             .attr('patternUnits', 'userSpaceOnUse');
41305
41306         patterns
41307             .append('rect')
41308             .attr('x', 0)
41309             .attr('y', 0)
41310             .attr('width', 32)
41311             .attr('height', 32)
41312             .attr('class', function (d) { return 'pattern-color-' + d[0]; });
41313
41314         patterns
41315             .append('image')
41316             .attr('x', 0)
41317             .attr('y', 0)
41318             .attr('width', 32)
41319             .attr('height', 32)
41320             .attr('xlink:href', function (d) {
41321                 return context.imagePath('pattern/' + d[1] + '.png');
41322             });
41323
41324         // clip paths
41325         defs.selectAll('clipPath')
41326             .data([12, 18, 20, 32, 45])
41327             .enter()
41328             .append('clipPath')
41329             .attr('id', function (d) { return 'clip-square-' + d; })
41330             .append('rect')
41331             .attr('x', 0)
41332             .attr('y', 0)
41333             .attr('width', function (d) { return d; })
41334             .attr('height', function (d) { return d; });
41335
41336         // symbol spritesheets
41337         defs
41338             .call(SVGSpriteDefinition('iD-sprite', context.imagePath('iD-sprite.svg')))
41339             .call(SVGSpriteDefinition('maki-sprite', context.imagePath('maki-sprite.svg')));
41340     };
41341 }
41342
41343 /**
41344  * Checks if `value` is `undefined`.
41345  *
41346  * @static
41347  * @since 0.1.0
41348  * @memberOf _
41349  * @category Lang
41350  * @param {*} value The value to check.
41351  * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
41352  * @example
41353  *
41354  * _.isUndefined(void 0);
41355  * // => true
41356  *
41357  * _.isUndefined(null);
41358  * // => false
41359  */
41360 function isUndefined(value) {
41361   return value === undefined;
41362 }
41363
41364 //[4]           NameStartChar      ::=          ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
41365 //[4a]          NameChar           ::=          NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
41366 //[5]           Name       ::=          NameStartChar (NameChar)*
41367 var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/;//\u10000-\uEFFFF
41368 var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
41369 var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
41370 //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
41371 //var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')
41372
41373 //S_TAG,        S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
41374 //S_ATTR_SPACE, S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
41375 var S_TAG = 0;//tag name offerring
41376 var S_ATTR = 1;//attr name offerring 
41377 var S_ATTR_SPACE=2;//attr name end and space offer
41378 var S_EQ = 3;//=space?
41379 var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
41380 var S_ATTR_END = 5;//attr value end and no space(quot end)
41381 var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
41382 var S_TAG_CLOSE = 7;//closed el<el />
41383
41384 function XMLReader(){
41385         
41386 }
41387
41388 XMLReader.prototype = {
41389         parse:function(source,defaultNSMap,entityMap){
41390                 var domBuilder = this.domBuilder;
41391                 domBuilder.startDocument();
41392                 _copy(defaultNSMap ,defaultNSMap = {});
41393                 parse$1(source,defaultNSMap,entityMap,
41394                                 domBuilder,this.errorHandler);
41395                 domBuilder.endDocument();
41396         }
41397 };
41398 function parse$1(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
41399         function fixedFromCharCode(code) {
41400                 // String.prototype.fromCharCode does not supports
41401                 // > 2 bytes unicode chars directly
41402                 if (code > 0xffff) {
41403                         code -= 0x10000;
41404                         var surrogate1 = 0xd800 + (code >> 10)
41405                                 , surrogate2 = 0xdc00 + (code & 0x3ff);
41406
41407                         return String.fromCharCode(surrogate1, surrogate2);
41408                 } else {
41409                         return String.fromCharCode(code);
41410                 }
41411         }
41412         function entityReplacer(a){
41413                 var k = a.slice(1,-1);
41414                 if(k in entityMap){
41415                         return entityMap[k]; 
41416                 }else if(k.charAt(0) === '#'){
41417                         return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
41418                 }else{
41419                         errorHandler.error('entity not found:'+a);
41420                         return a;
41421                 }
41422         }
41423         function appendText(end){//has some bugs
41424                 if(end>start){
41425                         var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
41426                         locator&&position(start);
41427                         domBuilder.characters(xt,0,end-start);
41428                         start = end;
41429                 }
41430         }
41431         function position(p,m){
41432                 while(p>=lineEnd && (m = linePattern.exec(source))){
41433                         lineStart = m.index;
41434                         lineEnd = lineStart + m[0].length;
41435                         locator.lineNumber++;
41436                         //console.log('line++:',locator,startPos,endPos)
41437                 }
41438                 locator.columnNumber = p-lineStart+1;
41439         }
41440         var lineStart = 0;
41441         var lineEnd = 0;
41442         var linePattern = /.*(?:\r\n?|\n)|.*$/g;
41443         var locator = domBuilder.locator;
41444         
41445         var parseStack = [{currentNSMap:defaultNSMapCopy}];
41446         var closeMap = {};
41447         var start = 0;
41448         while(true){
41449                 try{
41450                         var tagStart = source.indexOf('<',start);
41451                         if(tagStart<0){
41452                                 if(!source.substr(start).match(/^\s*$/)){
41453                                         var doc = domBuilder.doc;
41454                                 var text = doc.createTextNode(source.substr(start));
41455                                 doc.appendChild(text);
41456                                 domBuilder.currentElement = text;
41457                                 }
41458                                 return;
41459                         }
41460                         if(tagStart>start){
41461                                 appendText(tagStart);
41462                         }
41463                         switch(source.charAt(tagStart+1)){
41464                         case '/':
41465                                 var end = source.indexOf('>',tagStart+3);
41466                                 var tagName = source.substring(tagStart+2,end);
41467                                 var config = parseStack.pop();
41468                                 if(end<0){
41469                                         
41470                                 tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
41471                                 //console.error('#@@@@@@'+tagName)
41472                                 errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
41473                                 end = tagStart+1+tagName.length;
41474                         }else if(tagName.match(/\s</)){
41475                                 tagName = tagName.replace(/[\s<].*/,'');
41476                                 errorHandler.error("end tag name: "+tagName+' maybe not complete');
41477                                 end = tagStart+1+tagName.length;
41478                                 }
41479                                 //console.error(parseStack.length,parseStack)
41480                                 //console.error(config);
41481                                 var localNSMap = config.localNSMap;
41482                                 var endMatch = config.tagName == tagName;
41483                                 var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase();
41484                         if(endIgnoreCaseMach){
41485                                 domBuilder.endElement(config.uri,config.localName,tagName);
41486                                         if(localNSMap){
41487                                                 for(var prefix in localNSMap){
41488                                                         domBuilder.endPrefixMapping(prefix) ;
41489                                                 }
41490                                         }
41491                                         if(!endMatch){
41492                                 errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
41493                                         }
41494                         }else{
41495                                 parseStack.push(config);
41496                         }
41497                                 
41498                                 end++;
41499                                 break;
41500                                 // end elment
41501                         case '?':// <?...?>
41502                                 locator&&position(tagStart);
41503                                 end = parseInstruction(source,tagStart,domBuilder);
41504                                 break;
41505                         case '!':// <!doctype,<![CDATA,<!--
41506                                 locator&&position(tagStart);
41507                                 end = parseDCC(source,tagStart,domBuilder,errorHandler);
41508                                 break;
41509                         default:
41510                                 locator&&position(tagStart);
41511                                 var el = new ElementAttributes();
41512                                 var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
41513                                 //elStartEnd
41514                                 var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
41515                                 var len = el.length;
41516                                 
41517                                 
41518                                 if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
41519                                         el.closed = true;
41520                                         if(!entityMap.nbsp){
41521                                                 errorHandler.warning('unclosed xml attribute');
41522                                         }
41523                                 }
41524                                 if(locator && len){
41525                                         var locator2 = copyLocator(locator,{});
41526                                         //try{//attribute position fixed
41527                                         for(var i = 0;i<len;i++){
41528                                                 var a = el[i];
41529                                                 position(a.offset);
41530                                                 a.locator = copyLocator(locator,{});
41531                                         }
41532                                         //}catch(e){console.error('@@@@@'+e)}
41533                                         domBuilder.locator = locator2;
41534                                         if(appendElement(el,domBuilder,currentNSMap)){
41535                                                 parseStack.push(el);
41536                                         }
41537                                         domBuilder.locator = locator;
41538                                 }else{
41539                                         if(appendElement(el,domBuilder,currentNSMap)){
41540                                                 parseStack.push(el);
41541                                         }
41542                                 }
41543                                 
41544                                 
41545                                 
41546                                 if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
41547                                         end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
41548                                 }else{
41549                                         end++;
41550                                 }
41551                         }
41552                 }catch(e){
41553                         errorHandler.error('element parse error: '+e);
41554                         //errorHandler.error('element parse error: '+e);
41555                         end = -1;
41556                         //throw e;
41557                 }
41558                 if(end>start){
41559                         start = end;
41560                 }else{
41561                         //TODO: 这里有可能sax回退,有位置错误风险
41562                         appendText(Math.max(tagStart,start)+1);
41563                 }
41564         }
41565 }
41566 function copyLocator(f,t){
41567         t.lineNumber = f.lineNumber;
41568         t.columnNumber = f.columnNumber;
41569         return t;
41570 }
41571
41572 /**
41573  * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
41574  * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
41575  */
41576 function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
41577         var attrName;
41578         var value;
41579         var p = ++start;
41580         var s = S_TAG;//status
41581         while(true){
41582                 var c = source.charAt(p);
41583                 switch(c){
41584                 case '=':
41585                         if(s === S_ATTR){//attrName
41586                                 attrName = source.slice(start,p);
41587                                 s = S_EQ;
41588                         }else if(s === S_ATTR_SPACE){
41589                                 s = S_EQ;
41590                         }else{
41591                                 //fatalError: equal must after attrName or space after attrName
41592                                 throw new Error('attribute equal must after attrName');
41593                         }
41594                         break;
41595                 case '\'':
41596                 case '"':
41597                         if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
41598                                 ){//equal
41599                                 if(s === S_ATTR){
41600                                         errorHandler.warning('attribute value must after "="');
41601                                         attrName = source.slice(start,p);
41602                                 }
41603                                 start = p+1;
41604                                 p = source.indexOf(c,start);
41605                                 if(p>0){
41606                                         value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
41607                                         el.add(attrName,value,start-1);
41608                                         s = S_ATTR_END;
41609                                 }else{
41610                                         //fatalError: no end quot match
41611                                         throw new Error('attribute value no end \''+c+'\' match');
41612                                 }
41613                         }else if(s == S_ATTR_NOQUOT_VALUE){
41614                                 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
41615                                 //console.log(attrName,value,start,p)
41616                                 el.add(attrName,value,start);
41617                                 //console.dir(el)
41618                                 errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
41619                                 start = p+1;
41620                                 s = S_ATTR_END;
41621                         }else{
41622                                 //fatalError: no equal before
41623                                 throw new Error('attribute value must after "="');
41624                         }
41625                         break;
41626                 case '/':
41627                         switch(s){
41628                         case S_TAG:
41629                                 el.setTagName(source.slice(start,p));
41630                         case S_ATTR_END:
41631                         case S_TAG_SPACE:
41632                         case S_TAG_CLOSE:
41633                                 s =S_TAG_CLOSE;
41634                                 el.closed = true;
41635                         case S_ATTR_NOQUOT_VALUE:
41636                         case S_ATTR:
41637                         case S_ATTR_SPACE:
41638                                 break;
41639                         //case S_EQ:
41640                         default:
41641                                 throw new Error("attribute invalid close char('/')")
41642                         }
41643                         break;
41644                 case ''://end document
41645                         //throw new Error('unexpected end of input')
41646                         errorHandler.error('unexpected end of input');
41647                         if(s == S_TAG){
41648                                 el.setTagName(source.slice(start,p));
41649                         }
41650                         return p;
41651                 case '>':
41652                         switch(s){
41653                         case S_TAG:
41654                                 el.setTagName(source.slice(start,p));
41655                         case S_ATTR_END:
41656                         case S_TAG_SPACE:
41657                         case S_TAG_CLOSE:
41658                                 break;//normal
41659                         case S_ATTR_NOQUOT_VALUE://Compatible state
41660                         case S_ATTR:
41661                                 value = source.slice(start,p);
41662                                 if(value.slice(-1) === '/'){
41663                                         el.closed  = true;
41664                                         value = value.slice(0,-1);
41665                                 }
41666                         case S_ATTR_SPACE:
41667                                 if(s === S_ATTR_SPACE){
41668                                         value = attrName;
41669                                 }
41670                                 if(s == S_ATTR_NOQUOT_VALUE){
41671                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
41672                                         el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
41673                                 }else{
41674                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
41675                                                 errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
41676                                         }
41677                                         el.add(value,value,start);
41678                                 }
41679                                 break;
41680                         case S_EQ:
41681                                 throw new Error('attribute value missed!!');
41682                         }
41683 //                      console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
41684                         return p;
41685                 /*xml space '\x20' | #x9 | #xD | #xA; */
41686                 case '\u0080':
41687                         c = ' ';
41688                 default:
41689                         if(c<= ' '){//space
41690                                 switch(s){
41691                                 case S_TAG:
41692                                         el.setTagName(source.slice(start,p));//tagName
41693                                         s = S_TAG_SPACE;
41694                                         break;
41695                                 case S_ATTR:
41696                                         attrName = source.slice(start,p);
41697                                         s = S_ATTR_SPACE;
41698                                         break;
41699                                 case S_ATTR_NOQUOT_VALUE:
41700                                         var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
41701                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
41702                                         el.add(attrName,value,start);
41703                                 case S_ATTR_END:
41704                                         s = S_TAG_SPACE;
41705                                         break;
41706                                 //case S_TAG_SPACE:
41707                                 //case S_EQ:
41708                                 //case S_ATTR_SPACE:
41709                                 //      void();break;
41710                                 //case S_TAG_CLOSE:
41711                                         //ignore warning
41712                                 }
41713                         }else{//not space
41714 //S_TAG,        S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
41715 //S_ATTR_SPACE, S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
41716                                 switch(s){
41717                                 //case S_TAG:void();break;
41718                                 //case S_ATTR:void();break;
41719                                 //case S_ATTR_NOQUOT_VALUE:void();break;
41720                                 case S_ATTR_SPACE:
41721                                         var tagName =  el.tagName;
41722                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
41723                                                 errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!');
41724                                         }
41725                                         el.add(attrName,attrName,start);
41726                                         start = p;
41727                                         s = S_ATTR;
41728                                         break;
41729                                 case S_ATTR_END:
41730                                         errorHandler.warning('attribute space is required"'+attrName+'"!!');
41731                                 case S_TAG_SPACE:
41732                                         s = S_ATTR;
41733                                         start = p;
41734                                         break;
41735                                 case S_EQ:
41736                                         s = S_ATTR_NOQUOT_VALUE;
41737                                         start = p;
41738                                         break;
41739                                 case S_TAG_CLOSE:
41740                                         throw new Error("elements closed character '/' and '>' must be connected to");
41741                                 }
41742                         }
41743                 }//end outer switch
41744                 //console.log('p++',p)
41745                 p++;
41746         }
41747 }
41748 /**
41749  * @return true if has new namespace define
41750  */
41751 function appendElement(el,domBuilder,currentNSMap){
41752         var tagName = el.tagName;
41753         var localNSMap = null;
41754         //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
41755         var i = el.length;
41756         while(i--){
41757                 var a = el[i];
41758                 var qName = a.qName;
41759                 var value = a.value;
41760                 var nsp = qName.indexOf(':');
41761                 if(nsp>0){
41762                         var prefix = a.prefix = qName.slice(0,nsp);
41763                         var localName = qName.slice(nsp+1);
41764                         var nsPrefix = prefix === 'xmlns' && localName;
41765                 }else{
41766                         localName = qName;
41767                         prefix = null;
41768                         nsPrefix = qName === 'xmlns' && '';
41769                 }
41770                 //can not set prefix,because prefix !== ''
41771                 a.localName = localName ;
41772                 //prefix == null for no ns prefix attribute 
41773                 if(nsPrefix !== false){//hack!!
41774                         if(localNSMap == null){
41775                                 localNSMap = {};
41776                                 //console.log(currentNSMap,0)
41777                                 _copy(currentNSMap,currentNSMap={});
41778                                 //console.log(currentNSMap,1)
41779                         }
41780                         currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
41781                         a.uri = 'http://www.w3.org/2000/xmlns/';
41782                         domBuilder.startPrefixMapping(nsPrefix, value); 
41783                 }
41784         }
41785         var i = el.length;
41786         while(i--){
41787                 a = el[i];
41788                 var prefix = a.prefix;
41789                 if(prefix){//no prefix attribute has no namespace
41790                         if(prefix === 'xml'){
41791                                 a.uri = 'http://www.w3.org/XML/1998/namespace';
41792                         }if(prefix !== 'xmlns'){
41793                                 a.uri = currentNSMap[prefix || ''];
41794                                 
41795                                 //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
41796                         }
41797                 }
41798         }
41799         var nsp = tagName.indexOf(':');
41800         if(nsp>0){
41801                 prefix = el.prefix = tagName.slice(0,nsp);
41802                 localName = el.localName = tagName.slice(nsp+1);
41803         }else{
41804                 prefix = null;//important!!
41805                 localName = el.localName = tagName;
41806         }
41807         //no prefix element has default namespace
41808         var ns = el.uri = currentNSMap[prefix || ''];
41809         domBuilder.startElement(ns,localName,tagName,el);
41810         //endPrefixMapping and startPrefixMapping have not any help for dom builder
41811         //localNSMap = null
41812         if(el.closed){
41813                 domBuilder.endElement(ns,localName,tagName);
41814                 if(localNSMap){
41815                         for(prefix in localNSMap){
41816                                 domBuilder.endPrefixMapping(prefix); 
41817                         }
41818                 }
41819         }else{
41820                 el.currentNSMap = currentNSMap;
41821                 el.localNSMap = localNSMap;
41822                 //parseStack.push(el);
41823                 return true;
41824         }
41825 }
41826 function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
41827         if(/^(?:script|textarea)$/i.test(tagName)){
41828                 var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
41829                 var text = source.substring(elStartEnd+1,elEndStart);
41830                 if(/[&<]/.test(text)){
41831                         if(/^script$/i.test(tagName)){
41832                                 //if(!/\]\]>/.test(text)){
41833                                         //lexHandler.startCDATA();
41834                                         domBuilder.characters(text,0,text.length);
41835                                         //lexHandler.endCDATA();
41836                                         return elEndStart;
41837                                 //}
41838                         }//}else{//text area
41839                                 text = text.replace(/&#?\w+;/g,entityReplacer);
41840                                 domBuilder.characters(text,0,text.length);
41841                                 return elEndStart;
41842                         //}
41843                         
41844                 }
41845         }
41846         return elStartEnd+1;
41847 }
41848 function fixSelfClosed(source,elStartEnd,tagName,closeMap){
41849         //if(tagName in closeMap){
41850         var pos = closeMap[tagName];
41851         if(pos == null){
41852                 //console.log(tagName)
41853                 pos =  source.lastIndexOf('</'+tagName+'>');
41854                 if(pos<elStartEnd){//忘记闭合
41855                         pos = source.lastIndexOf('</'+tagName);
41856                 }
41857                 closeMap[tagName] =pos;
41858         }
41859         return pos<elStartEnd;
41860         //} 
41861 }
41862 function _copy(source,target){
41863         for(var n in source){target[n] = source[n];}
41864 }
41865 function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
41866         var next= source.charAt(start+2);
41867         switch(next){
41868         case '-':
41869                 if(source.charAt(start + 3) === '-'){
41870                         var end = source.indexOf('-->',start+4);
41871                         //append comment source.substring(4,end)//<!--
41872                         if(end>start){
41873                                 domBuilder.comment(source,start+4,end-start-4);
41874                                 return end+3;
41875                         }else{
41876                                 errorHandler.error("Unclosed comment");
41877                                 return -1;
41878                         }
41879                 }else{
41880                         //error
41881                         return -1;
41882                 }
41883         default:
41884                 if(source.substr(start+3,6) == 'CDATA['){
41885                         var end = source.indexOf(']]>',start+9);
41886                         domBuilder.startCDATA();
41887                         domBuilder.characters(source,start+9,end-start-9);
41888                         domBuilder.endCDATA(); 
41889                         return end+3;
41890                 }
41891                 //<!DOCTYPE
41892                 //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
41893                 var matchs = split(source,start);
41894                 var len = matchs.length;
41895                 if(len>1 && /!doctype/i.test(matchs[0][0])){
41896                         var name = matchs[1][0];
41897                         var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0];
41898                         var sysid = len>4 && matchs[4][0];
41899                         var lastMatch = matchs[len-1];
41900                         domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
41901                                         sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
41902                         domBuilder.endDTD();
41903                         
41904                         return lastMatch.index+lastMatch[0].length
41905                 }
41906         }
41907         return -1;
41908 }
41909
41910
41911
41912 function parseInstruction(source,start,domBuilder){
41913         var end = source.indexOf('?>',start);
41914         if(end){
41915                 var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
41916                 if(match){
41917                         var len = match[0].length;
41918                         domBuilder.processingInstruction(match[1], match[2]) ;
41919                         return end+2;
41920                 }else{//error
41921                         return -1;
41922                 }
41923         }
41924         return -1;
41925 }
41926
41927 /**
41928  * @param source
41929  */
41930 function ElementAttributes(source){
41931         
41932 }
41933 ElementAttributes.prototype = {
41934         setTagName:function(tagName){
41935                 if(!tagNamePattern.test(tagName)){
41936                         throw new Error('invalid tagName:'+tagName)
41937                 }
41938                 this.tagName = tagName;
41939         },
41940         add:function(qName,value,offset){
41941                 if(!tagNamePattern.test(qName)){
41942                         throw new Error('invalid attribute:'+qName)
41943                 }
41944                 this[this.length++] = {qName:qName,value:value,offset:offset};
41945         },
41946         length:0,
41947         getLocalName:function(i){return this[i].localName},
41948         getLocator:function(i){return this[i].locator},
41949         getQName:function(i){return this[i].qName},
41950         getURI:function(i){return this[i].uri},
41951         getValue:function(i){return this[i].value}
41952 //      ,getIndex:function(uri, localName)){
41953 //              if(localName){
41954 //                      
41955 //              }else{
41956 //                      var qName = uri
41957 //              }
41958 //      },
41959 //      getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
41960 //      getType:function(uri,localName){}
41961 //      getType:function(i){},
41962 };
41963
41964
41965
41966
41967 function _set_proto_(thiz,parent){
41968         thiz.__proto__ = parent;
41969         return thiz;
41970 }
41971 if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
41972         _set_proto_ = function(thiz,parent){
41973                 function p(){}          p.prototype = parent;
41974                 p = new p();
41975                 for(parent in thiz){
41976                         p[parent] = thiz[parent];
41977                 }
41978                 return p;
41979         };
41980 }
41981
41982 function split(source,start){
41983         var match;
41984         var buf = [];
41985         var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
41986         reg.lastIndex = start;
41987         reg.exec(source);//skip <
41988         while(match = reg.exec(source)){
41989                 buf.push(match);
41990                 if(match[1])return buf;
41991         }
41992 }
41993
41994 var XMLReader_1 = XMLReader;
41995
41996 var sax = {
41997         XMLReader: XMLReader_1
41998 };
41999
42000 /*
42001  * DOM Level 2
42002  * Object DOMException
42003  * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
42004  * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
42005  */
42006
42007 function copy$1(src,dest){
42008         for(var p in src){
42009                 dest[p] = src[p];
42010         }
42011 }
42012 /**
42013 ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
42014 ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
42015  */
42016 function _extends(Class,Super){
42017         var pt = Class.prototype;
42018         if(Object.create){
42019                 var ppt = Object.create(Super.prototype);
42020                 pt.__proto__ = ppt;
42021         }
42022         if(!(pt instanceof Super)){
42023                 function t(){}          t.prototype = Super.prototype;
42024                 t = new t();
42025                 copy$1(pt,t);
42026                 Class.prototype = pt = t;
42027         }
42028         if(pt.constructor != Class){
42029                 if(typeof Class != 'function'){
42030                         console.error("unknow Class:"+Class);
42031                 }
42032                 pt.constructor = Class;
42033         }
42034 }
42035 var htmlns = 'http://www.w3.org/1999/xhtml' ;
42036 // Node Types
42037 var NodeType = {};
42038 var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
42039 var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
42040 var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
42041 var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
42042 var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
42043 var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
42044 var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
42045 var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
42046 var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
42047 var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
42048 var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
42049 var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;
42050
42051 // ExceptionCode
42052 var ExceptionCode = {};
42053 var ExceptionMessage = {};
42054 var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = (ExceptionMessage[1]="Index size error", 1);
42055 var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = (ExceptionMessage[2]="DOMString size error", 2);
42056 var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = (ExceptionMessage[3]="Hierarchy request error", 3);
42057 var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = (ExceptionMessage[4]="Wrong document", 4);
42058 var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = (ExceptionMessage[5]="Invalid character", 5);
42059 var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = (ExceptionMessage[6]="No data allowed", 6);
42060 var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = (ExceptionMessage[7]="No modification allowed", 7);
42061 var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = (ExceptionMessage[8]="Not found", 8);
42062 var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = (ExceptionMessage[9]="Not supported", 9);
42063 var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = (ExceptionMessage[10]="Attribute in use", 10);
42064 //level2
42065 var INVALID_STATE_ERR           = ExceptionCode.INVALID_STATE_ERR               = (ExceptionMessage[11]="Invalid state", 11);
42066 var SYNTAX_ERR                  = ExceptionCode.SYNTAX_ERR                      = (ExceptionMessage[12]="Syntax error", 12);
42067 var INVALID_MODIFICATION_ERR    = ExceptionCode.INVALID_MODIFICATION_ERR        = (ExceptionMessage[13]="Invalid modification", 13);
42068 var NAMESPACE_ERR               = ExceptionCode.NAMESPACE_ERR                   = (ExceptionMessage[14]="Invalid namespace", 14);
42069 var INVALID_ACCESS_ERR          = ExceptionCode.INVALID_ACCESS_ERR              = (ExceptionMessage[15]="Invalid access", 15);
42070
42071
42072 function DOMException(code, message) {
42073         if(message instanceof Error){
42074                 var error = message;
42075         }else{
42076                 error = this;
42077                 Error.call(this, ExceptionMessage[code]);
42078                 this.message = ExceptionMessage[code];
42079                 if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
42080         }
42081         error.code = code;
42082         if(message) this.message = this.message + ": " + message;
42083         return error;
42084 }DOMException.prototype = Error.prototype;
42085 copy$1(ExceptionCode,DOMException);
42086 /**
42087  * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
42088  * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.
42089  * The items in the NodeList are accessible via an integral index, starting from 0.
42090  */
42091 function NodeList() {
42092 }NodeList.prototype = {
42093         /**
42094          * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
42095          * @standard level1
42096          */
42097         length:0, 
42098         /**
42099          * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.
42100          * @standard level1
42101          * @param index  unsigned long 
42102          *   Index into the collection.
42103          * @return Node
42104          *      The node at the indexth position in the NodeList, or null if that is not a valid index. 
42105          */
42106         item: function(index) {
42107                 return this[index] || null;
42108         },
42109         toString:function(isHTML,nodeFilter){
42110                 for(var buf = [], i = 0;i<this.length;i++){
42111                         serializeToString(this[i],buf,isHTML,nodeFilter);
42112                 }
42113                 return buf.join('');
42114         }
42115 };
42116 function LiveNodeList(node,refresh){
42117         this._node = node;
42118         this._refresh = refresh;
42119         _updateLiveList(this);
42120 }
42121 function _updateLiveList(list){
42122         var inc = list._node._inc || list._node.ownerDocument._inc;
42123         if(list._inc != inc){
42124                 var ls = list._refresh(list._node);
42125                 //console.log(ls.length)
42126                 __set__(list,'length',ls.length);
42127                 copy$1(ls,list);
42128                 list._inc = inc;
42129         }
42130 }
42131 LiveNodeList.prototype.item = function(i){
42132         _updateLiveList(this);
42133         return this[i];
42134 };
42135
42136 _extends(LiveNodeList,NodeList);
42137 /**
42138  * 
42139  * Objects implementing the NamedNodeMap interface are used to represent collections of nodes that can be accessed by name. Note that NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not maintained in any particular order. Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, and does not imply that the DOM specifies an order to these Nodes.
42140  * NamedNodeMap objects in the DOM are live.
42141  * used for attributes or DocumentType entities 
42142  */
42143 function NamedNodeMap() {
42144 }
42145 function _findNodeIndex(list,node){
42146         var i = list.length;
42147         while(i--){
42148                 if(list[i] === node){return i}
42149         }
42150 }
42151
42152 function _addNamedNode(el,list,newAttr,oldAttr){
42153         if(oldAttr){
42154                 list[_findNodeIndex(list,oldAttr)] = newAttr;
42155         }else{
42156                 list[list.length++] = newAttr;
42157         }
42158         if(el){
42159                 newAttr.ownerElement = el;
42160                 var doc = el.ownerDocument;
42161                 if(doc){
42162                         oldAttr && _onRemoveAttribute(doc,el,oldAttr);
42163                         _onAddAttribute(doc,el,newAttr);
42164                 }
42165         }
42166 }
42167 function _removeNamedNode(el,list,attr){
42168         //console.log('remove attr:'+attr)
42169         var i = _findNodeIndex(list,attr);
42170         if(i>=0){
42171                 var lastIndex = list.length-1;
42172                 while(i<lastIndex){
42173                         list[i] = list[++i];
42174                 }
42175                 list.length = lastIndex;
42176                 if(el){
42177                         var doc = el.ownerDocument;
42178                         if(doc){
42179                                 _onRemoveAttribute(doc,el,attr);
42180                                 attr.ownerElement = null;
42181                         }
42182                 }
42183         }else{
42184                 throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
42185         }
42186 }
42187 NamedNodeMap.prototype = {
42188         length:0,
42189         item:NodeList.prototype.item,
42190         getNamedItem: function(key) {
42191 //              if(key.indexOf(':')>0 || key == 'xmlns'){
42192 //                      return null;
42193 //              }
42194                 //console.log()
42195                 var i = this.length;
42196                 while(i--){
42197                         var attr = this[i];
42198                         //console.log(attr.nodeName,key)
42199                         if(attr.nodeName == key){
42200                                 return attr;
42201                         }
42202                 }
42203         },
42204         setNamedItem: function(attr) {
42205                 var el = attr.ownerElement;
42206                 if(el && el!=this._ownerElement){
42207                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
42208                 }
42209                 var oldAttr = this.getNamedItem(attr.nodeName);
42210                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
42211                 return oldAttr;
42212         },
42213         /* returns Node */
42214         setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
42215                 var el = attr.ownerElement, oldAttr;
42216                 if(el && el!=this._ownerElement){
42217                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
42218                 }
42219                 oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
42220                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
42221                 return oldAttr;
42222         },
42223
42224         /* returns Node */
42225         removeNamedItem: function(key) {
42226                 var attr = this.getNamedItem(key);
42227                 _removeNamedNode(this._ownerElement,this,attr);
42228                 return attr;
42229                 
42230                 
42231         },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
42232         
42233         //for level2
42234         removeNamedItemNS:function(namespaceURI,localName){
42235                 var attr = this.getNamedItemNS(namespaceURI,localName);
42236                 _removeNamedNode(this._ownerElement,this,attr);
42237                 return attr;
42238         },
42239         getNamedItemNS: function(namespaceURI, localName) {
42240                 var i = this.length;
42241                 while(i--){
42242                         var node = this[i];
42243                         if(node.localName == localName && node.namespaceURI == namespaceURI){
42244                                 return node;
42245                         }
42246                 }
42247                 return null;
42248         }
42249 };
42250 /**
42251  * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
42252  */
42253 function DOMImplementation(/* Object */ features) {
42254         this._features = {};
42255         if (features) {
42256                 for (var feature in features) {
42257                          this._features = features[feature];
42258                 }
42259         }
42260 }
42261 DOMImplementation.prototype = {
42262         hasFeature: function(/* string */ feature, /* string */ version) {
42263                 var versions = this._features[feature.toLowerCase()];
42264                 if (versions && (!version || version in versions)) {
42265                         return true;
42266                 } else {
42267                         return false;
42268                 }
42269         },
42270         // Introduced in DOM Level 2:
42271         createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
42272                 var doc = new Document();
42273                 doc.implementation = this;
42274                 doc.childNodes = new NodeList();
42275                 doc.doctype = doctype;
42276                 if(doctype){
42277                         doc.appendChild(doctype);
42278                 }
42279                 if(qualifiedName){
42280                         var root = doc.createElementNS(namespaceURI,qualifiedName);
42281                         doc.appendChild(root);
42282                 }
42283                 return doc;
42284         },
42285         // Introduced in DOM Level 2:
42286         createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
42287                 var node = new DocumentType();
42288                 node.name = qualifiedName;
42289                 node.nodeName = qualifiedName;
42290                 node.publicId = publicId;
42291                 node.systemId = systemId;
42292                 // Introduced in DOM Level 2:
42293                 //readonly attribute DOMString        internalSubset;
42294                 
42295                 //TODO:..
42296                 //  readonly attribute NamedNodeMap     entities;
42297                 //  readonly attribute NamedNodeMap     notations;
42298                 return node;
42299         }
42300 };
42301
42302
42303 /**
42304  * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
42305  */
42306
42307 function Node$2() {
42308 }
42309 Node$2.prototype = {
42310         firstChild : null,
42311         lastChild : null,
42312         previousSibling : null,
42313         nextSibling : null,
42314         attributes : null,
42315         parentNode : null,
42316         childNodes : null,
42317         ownerDocument : null,
42318         nodeValue : null,
42319         namespaceURI : null,
42320         prefix : null,
42321         localName : null,
42322         // Modified in DOM Level 2:
42323         insertBefore:function(newChild, refChild){//raises 
42324                 return _insertBefore(this,newChild,refChild);
42325         },
42326         replaceChild:function(newChild, oldChild){//raises 
42327                 this.insertBefore(newChild,oldChild);
42328                 if(oldChild){
42329                         this.removeChild(oldChild);
42330                 }
42331         },
42332         removeChild:function(oldChild){
42333                 return _removeChild(this,oldChild);
42334         },
42335         appendChild:function(newChild){
42336                 return this.insertBefore(newChild,null);
42337         },
42338         hasChildNodes:function(){
42339                 return this.firstChild != null;
42340         },
42341         cloneNode:function(deep){
42342                 return cloneNode(this.ownerDocument||this,this,deep);
42343         },
42344         // Modified in DOM Level 2:
42345         normalize:function(){
42346                 var child = this.firstChild;
42347                 while(child){
42348                         var next = child.nextSibling;
42349                         if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
42350                                 this.removeChild(next);
42351                                 child.appendData(next.data);
42352                         }else{
42353                                 child.normalize();
42354                                 child = next;
42355                         }
42356                 }
42357         },
42358         // Introduced in DOM Level 2:
42359         isSupported:function(feature, version){
42360                 return this.ownerDocument.implementation.hasFeature(feature,version);
42361         },
42362     // Introduced in DOM Level 2:
42363     hasAttributes:function(){
42364         return this.attributes.length>0;
42365     },
42366     lookupPrefix:function(namespaceURI){
42367         var el = this;
42368         while(el){
42369                 var map = el._nsMap;
42370                 //console.dir(map)
42371                 if(map){
42372                         for(var n in map){
42373                                 if(map[n] == namespaceURI){
42374                                         return n;
42375                                 }
42376                         }
42377                 }
42378                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
42379         }
42380         return null;
42381     },
42382     // Introduced in DOM Level 3:
42383     lookupNamespaceURI:function(prefix){
42384         var el = this;
42385         while(el){
42386                 var map = el._nsMap;
42387                 //console.dir(map)
42388                 if(map){
42389                         if(prefix in map){
42390                                 return map[prefix] ;
42391                         }
42392                 }
42393                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
42394         }
42395         return null;
42396     },
42397     // Introduced in DOM Level 3:
42398     isDefaultNamespace:function(namespaceURI){
42399         var prefix = this.lookupPrefix(namespaceURI);
42400         return prefix == null;
42401     }
42402 };
42403
42404
42405 function _xmlEncoder(c){
42406         return c == '<' && '&lt;' ||
42407          c == '>' && '&gt;' ||
42408          c == '&' && '&amp;' ||
42409          c == '"' && '&quot;' ||
42410          '&#'+c.charCodeAt()+';'
42411 }
42412
42413
42414 copy$1(NodeType,Node$2);
42415 copy$1(NodeType,Node$2.prototype);
42416
42417 /**
42418  * @param callback return true for continue,false for break
42419  * @return boolean true: break visit;
42420  */
42421 function _visitNode(node,callback){
42422         if(callback(node)){
42423                 return true;
42424         }
42425         if(node = node.firstChild){
42426                 do{
42427                         if(_visitNode(node,callback)){return true}
42428         }while(node=node.nextSibling)
42429     }
42430 }
42431
42432
42433
42434 function Document(){
42435 }
42436 function _onAddAttribute(doc,el,newAttr){
42437         doc && doc._inc++;
42438         var ns = newAttr.namespaceURI ;
42439         if(ns == 'http://www.w3.org/2000/xmlns/'){
42440                 //update namespace
42441                 el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
42442         }
42443 }
42444 function _onRemoveAttribute(doc,el,newAttr,remove){
42445         doc && doc._inc++;
42446         var ns = newAttr.namespaceURI ;
42447         if(ns == 'http://www.w3.org/2000/xmlns/'){
42448                 //update namespace
42449                 delete el._nsMap[newAttr.prefix?newAttr.localName:''];
42450         }
42451 }
42452 function _onUpdateChild(doc,el,newChild){
42453         if(doc && doc._inc){
42454                 doc._inc++;
42455                 //update childNodes
42456                 var cs = el.childNodes;
42457                 if(newChild){
42458                         cs[cs.length++] = newChild;
42459                 }else{
42460                         //console.log(1)
42461                         var child = el.firstChild;
42462                         var i = 0;
42463                         while(child){
42464                                 cs[i++] = child;
42465                                 child =child.nextSibling;
42466                         }
42467                         cs.length = i;
42468                 }
42469         }
42470 }
42471
42472 /**
42473  * attributes;
42474  * children;
42475  * 
42476  * writeable properties:
42477  * nodeValue,Attr:value,CharacterData:data
42478  * prefix
42479  */
42480 function _removeChild(parentNode,child){
42481         var previous = child.previousSibling;
42482         var next = child.nextSibling;
42483         if(previous){
42484                 previous.nextSibling = next;
42485         }else{
42486                 parentNode.firstChild = next;
42487         }
42488         if(next){
42489                 next.previousSibling = previous;
42490         }else{
42491                 parentNode.lastChild = previous;
42492         }
42493         _onUpdateChild(parentNode.ownerDocument,parentNode);
42494         return child;
42495 }
42496 /**
42497  * preformance key(refChild == null)
42498  */
42499 function _insertBefore(parentNode,newChild,nextChild){
42500         var cp = newChild.parentNode;
42501         if(cp){
42502                 cp.removeChild(newChild);//remove and update
42503         }
42504         if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
42505                 var newFirst = newChild.firstChild;
42506                 if (newFirst == null) {
42507                         return newChild;
42508                 }
42509                 var newLast = newChild.lastChild;
42510         }else{
42511                 newFirst = newLast = newChild;
42512         }
42513         var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
42514
42515         newFirst.previousSibling = pre;
42516         newLast.nextSibling = nextChild;
42517         
42518         
42519         if(pre){
42520                 pre.nextSibling = newFirst;
42521         }else{
42522                 parentNode.firstChild = newFirst;
42523         }
42524         if(nextChild == null){
42525                 parentNode.lastChild = newLast;
42526         }else{
42527                 nextChild.previousSibling = newLast;
42528         }
42529         do{
42530                 newFirst.parentNode = parentNode;
42531         }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
42532         _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
42533         //console.log(parentNode.lastChild.nextSibling == null)
42534         if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
42535                 newChild.firstChild = newChild.lastChild = null;
42536         }
42537         return newChild;
42538 }
42539 function _appendSingleChild(parentNode,newChild){
42540         var cp = newChild.parentNode;
42541         if(cp){
42542                 var pre = parentNode.lastChild;
42543                 cp.removeChild(newChild);//remove and update
42544                 var pre = parentNode.lastChild;
42545         }
42546         var pre = parentNode.lastChild;
42547         newChild.parentNode = parentNode;
42548         newChild.previousSibling = pre;
42549         newChild.nextSibling = null;
42550         if(pre){
42551                 pre.nextSibling = newChild;
42552         }else{
42553                 parentNode.firstChild = newChild;
42554         }
42555         parentNode.lastChild = newChild;
42556         _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
42557         return newChild;
42558         //console.log("__aa",parentNode.lastChild.nextSibling == null)
42559 }
42560 Document.prototype = {
42561         //implementation : null,
42562         nodeName :  '#document',
42563         nodeType :  DOCUMENT_NODE,
42564         doctype :  null,
42565         documentElement :  null,
42566         _inc : 1,
42567         
42568         insertBefore :  function(newChild, refChild){//raises 
42569                 if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
42570                         var child = newChild.firstChild;
42571                         while(child){
42572                                 var next = child.nextSibling;
42573                                 this.insertBefore(child,refChild);
42574                                 child = next;
42575                         }
42576                         return newChild;
42577                 }
42578                 if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
42579                         this.documentElement = newChild;
42580                 }
42581                 
42582                 return _insertBefore(this,newChild,refChild), newChild.ownerDocument = this, newChild;
42583         },
42584         removeChild :  function(oldChild){
42585                 if(this.documentElement == oldChild){
42586                         this.documentElement = null;
42587                 }
42588                 return _removeChild(this,oldChild);
42589         },
42590         // Introduced in DOM Level 2:
42591         importNode : function(importedNode,deep){
42592                 return importNode(this,importedNode,deep);
42593         },
42594         // Introduced in DOM Level 2:
42595         getElementById :        function(id){
42596                 var rtv = null;
42597                 _visitNode(this.documentElement,function(node){
42598                         if(node.nodeType == ELEMENT_NODE){
42599                                 if(node.getAttribute('id') == id){
42600                                         rtv = node;
42601                                         return true;
42602                                 }
42603                         }
42604                 });
42605                 return rtv;
42606         },
42607         
42608         //document factory method:
42609         createElement : function(tagName){
42610                 var node = new Element();
42611                 node.ownerDocument = this;
42612                 node.nodeName = tagName;
42613                 node.tagName = tagName;
42614                 node.childNodes = new NodeList();
42615                 var attrs       = node.attributes = new NamedNodeMap();
42616                 attrs._ownerElement = node;
42617                 return node;
42618         },
42619         createDocumentFragment :        function(){
42620                 var node = new DocumentFragment();
42621                 node.ownerDocument = this;
42622                 node.childNodes = new NodeList();
42623                 return node;
42624         },
42625         createTextNode :        function(data){
42626                 var node = new Text();
42627                 node.ownerDocument = this;
42628                 node.appendData(data);
42629                 return node;
42630         },
42631         createComment : function(data){
42632                 var node = new Comment();
42633                 node.ownerDocument = this;
42634                 node.appendData(data);
42635                 return node;
42636         },
42637         createCDATASection :    function(data){
42638                 var node = new CDATASection();
42639                 node.ownerDocument = this;
42640                 node.appendData(data);
42641                 return node;
42642         },
42643         createProcessingInstruction :   function(target,data){
42644                 var node = new ProcessingInstruction();
42645                 node.ownerDocument = this;
42646                 node.tagName = node.target = target;
42647                 node.nodeValue= node.data = data;
42648                 return node;
42649         },
42650         createAttribute :       function(name){
42651                 var node = new Attr();
42652                 node.ownerDocument      = this;
42653                 node.name = name;
42654                 node.nodeName   = name;
42655                 node.localName = name;
42656                 node.specified = true;
42657                 return node;
42658         },
42659         createEntityReference : function(name){
42660                 var node = new EntityReference();
42661                 node.ownerDocument      = this;
42662                 node.nodeName   = name;
42663                 return node;
42664         },
42665         // Introduced in DOM Level 2:
42666         createElementNS :       function(namespaceURI,qualifiedName){
42667                 var node = new Element();
42668                 var pl = qualifiedName.split(':');
42669                 var attrs       = node.attributes = new NamedNodeMap();
42670                 node.childNodes = new NodeList();
42671                 node.ownerDocument = this;
42672                 node.nodeName = qualifiedName;
42673                 node.tagName = qualifiedName;
42674                 node.namespaceURI = namespaceURI;
42675                 if(pl.length == 2){
42676                         node.prefix = pl[0];
42677                         node.localName = pl[1];
42678                 }else{
42679                         //el.prefix = null;
42680                         node.localName = qualifiedName;
42681                 }
42682                 attrs._ownerElement = node;
42683                 return node;
42684         },
42685         // Introduced in DOM Level 2:
42686         createAttributeNS :     function(namespaceURI,qualifiedName){
42687                 var node = new Attr();
42688                 var pl = qualifiedName.split(':');
42689                 node.ownerDocument = this;
42690                 node.nodeName = qualifiedName;
42691                 node.name = qualifiedName;
42692                 node.namespaceURI = namespaceURI;
42693                 node.specified = true;
42694                 if(pl.length == 2){
42695                         node.prefix = pl[0];
42696                         node.localName = pl[1];
42697                 }else{
42698                         //el.prefix = null;
42699                         node.localName = qualifiedName;
42700                 }
42701                 return node;
42702         }
42703 };
42704 _extends(Document,Node$2);
42705
42706
42707 function Element() {
42708         this._nsMap = {};
42709 }Element.prototype = {
42710         nodeType : ELEMENT_NODE,
42711         hasAttribute : function(name){
42712                 return this.getAttributeNode(name)!=null;
42713         },
42714         getAttribute : function(name){
42715                 var attr = this.getAttributeNode(name);
42716                 return attr && attr.value || '';
42717         },
42718         getAttributeNode : function(name){
42719                 return this.attributes.getNamedItem(name);
42720         },
42721         setAttribute : function(name, value){
42722                 var attr = this.ownerDocument.createAttribute(name);
42723                 attr.value = attr.nodeValue = "" + value;
42724                 this.setAttributeNode(attr);
42725         },
42726         removeAttribute : function(name){
42727                 var attr = this.getAttributeNode(name);
42728                 attr && this.removeAttributeNode(attr);
42729         },
42730         
42731         //four real opeartion method
42732         appendChild:function(newChild){
42733                 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
42734                         return this.insertBefore(newChild,null);
42735                 }else{
42736                         return _appendSingleChild(this,newChild);
42737                 }
42738         },
42739         setAttributeNode : function(newAttr){
42740                 return this.attributes.setNamedItem(newAttr);
42741         },
42742         setAttributeNodeNS : function(newAttr){
42743                 return this.attributes.setNamedItemNS(newAttr);
42744         },
42745         removeAttributeNode : function(oldAttr){
42746                 //console.log(this == oldAttr.ownerElement)
42747                 return this.attributes.removeNamedItem(oldAttr.nodeName);
42748         },
42749         //get real attribute name,and remove it by removeAttributeNode
42750         removeAttributeNS : function(namespaceURI, localName){
42751                 var old = this.getAttributeNodeNS(namespaceURI, localName);
42752                 old && this.removeAttributeNode(old);
42753         },
42754         
42755         hasAttributeNS : function(namespaceURI, localName){
42756                 return this.getAttributeNodeNS(namespaceURI, localName)!=null;
42757         },
42758         getAttributeNS : function(namespaceURI, localName){
42759                 var attr = this.getAttributeNodeNS(namespaceURI, localName);
42760                 return attr && attr.value || '';
42761         },
42762         setAttributeNS : function(namespaceURI, qualifiedName, value){
42763                 var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
42764                 attr.value = attr.nodeValue = "" + value;
42765                 this.setAttributeNode(attr);
42766         },
42767         getAttributeNodeNS : function(namespaceURI, localName){
42768                 return this.attributes.getNamedItemNS(namespaceURI, localName);
42769         },
42770         
42771         getElementsByTagName : function(tagName){
42772                 return new LiveNodeList(this,function(base){
42773                         var ls = [];
42774                         _visitNode(base,function(node){
42775                                 if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
42776                                         ls.push(node);
42777                                 }
42778                         });
42779                         return ls;
42780                 });
42781         },
42782         getElementsByTagNameNS : function(namespaceURI, localName){
42783                 return new LiveNodeList(this,function(base){
42784                         var ls = [];
42785                         _visitNode(base,function(node){
42786                                 if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
42787                                         ls.push(node);
42788                                 }
42789                         });
42790                         return ls;
42791                         
42792                 });
42793         }
42794 };
42795 Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
42796 Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
42797
42798
42799 _extends(Element,Node$2);
42800 function Attr() {
42801 }Attr.prototype.nodeType = ATTRIBUTE_NODE;
42802 _extends(Attr,Node$2);
42803
42804
42805 function CharacterData() {
42806 }CharacterData.prototype = {
42807         data : '',
42808         substringData : function(offset, count) {
42809                 return this.data.substring(offset, offset+count);
42810         },
42811         appendData: function(text) {
42812                 text = this.data+text;
42813                 this.nodeValue = this.data = text;
42814                 this.length = text.length;
42815         },
42816         insertData: function(offset,text) {
42817                 this.replaceData(offset,0,text);
42818         
42819         },
42820         appendChild:function(newChild){
42821                 throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
42822         },
42823         deleteData: function(offset, count) {
42824                 this.replaceData(offset,count,"");
42825         },
42826         replaceData: function(offset, count, text) {
42827                 var start = this.data.substring(0,offset);
42828                 var end = this.data.substring(offset+count);
42829                 text = start + text + end;
42830                 this.nodeValue = this.data = text;
42831                 this.length = text.length;
42832         }
42833 };
42834 _extends(CharacterData,Node$2);
42835 function Text() {
42836 }Text.prototype = {
42837         nodeName : "#text",
42838         nodeType : TEXT_NODE,
42839         splitText : function(offset) {
42840                 var text = this.data;
42841                 var newText = text.substring(offset);
42842                 text = text.substring(0, offset);
42843                 this.data = this.nodeValue = text;
42844                 this.length = text.length;
42845                 var newNode = this.ownerDocument.createTextNode(newText);
42846                 if(this.parentNode){
42847                         this.parentNode.insertBefore(newNode, this.nextSibling);
42848                 }
42849                 return newNode;
42850         }
42851 };
42852 _extends(Text,CharacterData);
42853 function Comment() {
42854 }Comment.prototype = {
42855         nodeName : "#comment",
42856         nodeType : COMMENT_NODE
42857 };
42858 _extends(Comment,CharacterData);
42859
42860 function CDATASection() {
42861 }CDATASection.prototype = {
42862         nodeName : "#cdata-section",
42863         nodeType : CDATA_SECTION_NODE
42864 };
42865 _extends(CDATASection,CharacterData);
42866
42867
42868 function DocumentType() {
42869 }DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
42870 _extends(DocumentType,Node$2);
42871
42872 function Notation() {
42873 }Notation.prototype.nodeType = NOTATION_NODE;
42874 _extends(Notation,Node$2);
42875
42876 function Entity() {
42877 }Entity.prototype.nodeType = ENTITY_NODE;
42878 _extends(Entity,Node$2);
42879
42880 function EntityReference() {
42881 }EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
42882 _extends(EntityReference,Node$2);
42883
42884 function DocumentFragment() {
42885 }DocumentFragment.prototype.nodeName =  "#document-fragment";
42886 DocumentFragment.prototype.nodeType =   DOCUMENT_FRAGMENT_NODE;
42887 _extends(DocumentFragment,Node$2);
42888
42889
42890 function ProcessingInstruction() {
42891 }
42892 ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
42893 _extends(ProcessingInstruction,Node$2);
42894 function XMLSerializer$1(){}
42895 XMLSerializer$1.prototype.serializeToString = function(node,isHtml,nodeFilter){
42896         return nodeSerializeToString.call(node,isHtml,nodeFilter);
42897 };
42898 Node$2.prototype.toString = nodeSerializeToString;
42899 function nodeSerializeToString(isHtml,nodeFilter){
42900         var buf = [];
42901         var refNode = this.nodeType == 9?this.documentElement:this;
42902         var prefix = refNode.prefix;
42903         var uri = refNode.namespaceURI;
42904         
42905         if(uri && prefix == null){
42906                 //console.log(prefix)
42907                 var prefix = refNode.lookupPrefix(uri);
42908                 if(prefix == null){
42909                         //isHTML = true;
42910                         var visibleNamespaces=[
42911                         {namespace:uri,prefix:null}
42912                         //{namespace:uri,prefix:''}
42913                         ];
42914                 }
42915         }
42916         serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
42917         //console.log('###',this.nodeType,uri,prefix,buf.join(''))
42918         return buf.join('');
42919 }
42920 function needNamespaceDefine(node,isHTML, visibleNamespaces) {
42921         var prefix = node.prefix||'';
42922         var uri = node.namespaceURI;
42923         if (!prefix && !uri){
42924                 return false;
42925         }
42926         if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
42927                 || uri == 'http://www.w3.org/2000/xmlns/'){
42928                 return false;
42929         }
42930         
42931         var i = visibleNamespaces.length; 
42932         //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
42933         while (i--) {
42934                 var ns = visibleNamespaces[i];
42935                 // get namespace prefix
42936                 //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
42937                 if (ns.prefix == prefix){
42938                         return ns.namespace != uri;
42939                 }
42940         }
42941         //console.log(isHTML,uri,prefix=='')
42942         //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
42943         //      return false;
42944         //}
42945         //node.flag = '11111'
42946         //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
42947         return true;
42948 }
42949 function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
42950         if(nodeFilter){
42951                 node = nodeFilter(node);
42952                 if(node){
42953                         if(typeof node == 'string'){
42954                                 buf.push(node);
42955                                 return;
42956                         }
42957                 }else{
42958                         return;
42959                 }
42960                 //buf.sort.apply(attrs, attributeSorter);
42961         }
42962         switch(node.nodeType){
42963         case ELEMENT_NODE:
42964                 if (!visibleNamespaces) visibleNamespaces = [];
42965                 var startVisibleNamespaces = visibleNamespaces.length;
42966                 var attrs = node.attributes;
42967                 var len = attrs.length;
42968                 var child = node.firstChild;
42969                 var nodeName = node.tagName;
42970                 
42971                 isHTML =  (htmlns === node.namespaceURI) ||isHTML; 
42972                 buf.push('<',nodeName);
42973                 
42974                 
42975                 
42976                 for(var i=0;i<len;i++){
42977                         // add namespaces for attributes
42978                         var attr = attrs.item(i);
42979                         if (attr.prefix == 'xmlns') {
42980                                 visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
42981                         }else if(attr.nodeName == 'xmlns'){
42982                                 visibleNamespaces.push({ prefix: '', namespace: attr.value });
42983                         }
42984                 }
42985                 for(var i=0;i<len;i++){
42986                         var attr = attrs.item(i);
42987                         if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
42988                                 var prefix = attr.prefix||'';
42989                                 var uri = attr.namespaceURI;
42990                                 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
42991                                 buf.push(ns, '="' , uri , '"');
42992                                 visibleNamespaces.push({ prefix: prefix, namespace:uri });
42993                         }
42994                         serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
42995                 }
42996                 // add namespace for current node               
42997                 if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
42998                         var prefix = node.prefix||'';
42999                         var uri = node.namespaceURI;
43000                         var ns = prefix ? ' xmlns:' + prefix : " xmlns";
43001                         buf.push(ns, '="' , uri , '"');
43002                         visibleNamespaces.push({ prefix: prefix, namespace:uri });
43003                 }
43004                 
43005                 if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
43006                         buf.push('>');
43007                         //if is cdata child node
43008                         if(isHTML && /^script$/i.test(nodeName)){
43009                                 while(child){
43010                                         if(child.data){
43011                                                 buf.push(child.data);
43012                                         }else{
43013                                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
43014                                         }
43015                                         child = child.nextSibling;
43016                                 }
43017                         }else
43018                         {
43019                                 while(child){
43020                                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
43021                                         child = child.nextSibling;
43022                                 }
43023                         }
43024                         buf.push('</',nodeName,'>');
43025                 }else{
43026                         buf.push('/>');
43027                 }
43028                 // remove added visible namespaces
43029                 //visibleNamespaces.length = startVisibleNamespaces;
43030                 return;
43031         case DOCUMENT_NODE:
43032         case DOCUMENT_FRAGMENT_NODE:
43033                 var child = node.firstChild;
43034                 while(child){
43035                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
43036                         child = child.nextSibling;
43037                 }
43038                 return;
43039         case ATTRIBUTE_NODE:
43040                 return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
43041         case TEXT_NODE:
43042                 return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
43043         case CDATA_SECTION_NODE:
43044                 return buf.push( '<![CDATA[',node.data,']]>');
43045         case COMMENT_NODE:
43046                 return buf.push( "<!--",node.data,"-->");
43047         case DOCUMENT_TYPE_NODE:
43048                 var pubid = node.publicId;
43049                 var sysid = node.systemId;
43050                 buf.push('<!DOCTYPE ',node.name);
43051                 if(pubid){
43052                         buf.push(' PUBLIC "',pubid);
43053                         if (sysid && sysid!='.') {
43054                                 buf.push( '" "',sysid);
43055                         }
43056                         buf.push('">');
43057                 }else if(sysid && sysid!='.'){
43058                         buf.push(' SYSTEM "',sysid,'">');
43059                 }else{
43060                         var sub = node.internalSubset;
43061                         if(sub){
43062                                 buf.push(" [",sub,"]");
43063                         }
43064                         buf.push(">");
43065                 }
43066                 return;
43067         case PROCESSING_INSTRUCTION_NODE:
43068                 return buf.push( "<?",node.target," ",node.data,"?>");
43069         case ENTITY_REFERENCE_NODE:
43070                 return buf.push( '&',node.nodeName,';');
43071         //case ENTITY_NODE:
43072         //case NOTATION_NODE:
43073         default:
43074                 buf.push('??',node.nodeName);
43075         }
43076 }
43077 function importNode(doc,node,deep){
43078         var node2;
43079         switch (node.nodeType) {
43080         case ELEMENT_NODE:
43081                 node2 = node.cloneNode(false);
43082                 node2.ownerDocument = doc;
43083                 //var attrs = node2.attributes;
43084                 //var len = attrs.length;
43085                 //for(var i=0;i<len;i++){
43086                         //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
43087                 //}
43088         case DOCUMENT_FRAGMENT_NODE:
43089                 break;
43090         case ATTRIBUTE_NODE:
43091                 deep = true;
43092                 break;
43093         //case ENTITY_REFERENCE_NODE:
43094         //case PROCESSING_INSTRUCTION_NODE:
43095         ////case TEXT_NODE:
43096         //case CDATA_SECTION_NODE:
43097         //case COMMENT_NODE:
43098         //      deep = false;
43099         //      break;
43100         //case DOCUMENT_NODE:
43101         //case DOCUMENT_TYPE_NODE:
43102         //cannot be imported.
43103         //case ENTITY_NODE:
43104         //case NOTATION_NODE:
43105         //can not hit in level3
43106         //default:throw e;
43107         }
43108         if(!node2){
43109                 node2 = node.cloneNode(false);//false
43110         }
43111         node2.ownerDocument = doc;
43112         node2.parentNode = null;
43113         if(deep){
43114                 var child = node.firstChild;
43115                 while(child){
43116                         node2.appendChild(importNode(doc,child,deep));
43117                         child = child.nextSibling;
43118                 }
43119         }
43120         return node2;
43121 }
43122 //
43123 //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
43124 //                                      attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
43125 function cloneNode(doc,node,deep){
43126         var node2 = new node.constructor();
43127         for(var n in node){
43128                 var v = node[n];
43129                 if(typeof v != 'object' ){
43130                         if(v != node2[n]){
43131                                 node2[n] = v;
43132                         }
43133                 }
43134         }
43135         if(node.childNodes){
43136                 node2.childNodes = new NodeList();
43137         }
43138         node2.ownerDocument = doc;
43139         switch (node2.nodeType) {
43140         case ELEMENT_NODE:
43141                 var attrs       = node.attributes;
43142                 var attrs2      = node2.attributes = new NamedNodeMap();
43143                 var len = attrs.length;
43144                 attrs2._ownerElement = node2;
43145                 for(var i=0;i<len;i++){
43146                         node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
43147                 }
43148                 break;
43149         case ATTRIBUTE_NODE:
43150                 deep = true;
43151         }
43152         if(deep){
43153                 var child = node.firstChild;
43154                 while(child){
43155                         node2.appendChild(cloneNode(doc,child,deep));
43156                         child = child.nextSibling;
43157                 }
43158         }
43159         return node2;
43160 }
43161
43162 function __set__(object,key,value){
43163         object[key] = value;
43164 }
43165 //do dynamic
43166 try{
43167         if(Object.defineProperty){
43168                 Object.defineProperty(LiveNodeList.prototype,'length',{
43169                         get:function(){
43170                                 _updateLiveList(this);
43171                                 return this.$$length;
43172                         }
43173                 });
43174                 Object.defineProperty(Node$2.prototype,'textContent',{
43175                         get:function(){
43176                                 return getTextContent(this);
43177                         },
43178                         set:function(data){
43179                                 switch(this.nodeType){
43180                                 case ELEMENT_NODE:
43181                                 case DOCUMENT_FRAGMENT_NODE:
43182                                         while(this.firstChild){
43183                                                 this.removeChild(this.firstChild);
43184                                         }
43185                                         if(data || String(data)){
43186                                                 this.appendChild(this.ownerDocument.createTextNode(data));
43187                                         }
43188                                         break;
43189                                 default:
43190                                         //TODO:
43191                                         this.data = data;
43192                                         this.value = data;
43193                                         this.nodeValue = data;
43194                                 }
43195                         }
43196                 });
43197                 
43198                 function getTextContent(node){
43199                         switch(node.nodeType){
43200                         case ELEMENT_NODE:
43201                         case DOCUMENT_FRAGMENT_NODE:
43202                                 var buf = [];
43203                                 node = node.firstChild;
43204                                 while(node){
43205                                         if(node.nodeType!==7 && node.nodeType !==8){
43206                                                 buf.push(getTextContent(node));
43207                                         }
43208                                         node = node.nextSibling;
43209                                 }
43210                                 return buf.join('');
43211                         default:
43212                                 return node.nodeValue;
43213                         }
43214                 }
43215                 __set__ = function(object,key,value){
43216                         //console.log(value)
43217                         object['$$'+key] = value;
43218                 };
43219         }
43220 }catch(e){//ie8
43221 }
43222
43223 //if(typeof require == 'function'){
43224         var DOMImplementation_1 = DOMImplementation;
43225         var XMLSerializer_1 = XMLSerializer$1;
43226 //}
43227
43228 var dom = {
43229         DOMImplementation: DOMImplementation_1,
43230         XMLSerializer: XMLSerializer_1
43231 };
43232
43233 var domParser = createCommonjsModule(function (module, exports) {
43234 function DOMParser(options){
43235         this.options = options ||{locator:{}};
43236         
43237 }
43238 DOMParser.prototype.parseFromString = function(source,mimeType){
43239         var options = this.options;
43240         var sax$$1 =  new XMLReader();
43241         var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
43242         var errorHandler = options.errorHandler;
43243         var locator = options.locator;
43244         var defaultNSMap = options.xmlns||{};
43245         var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"};
43246         if(locator){
43247                 domBuilder.setDocumentLocator(locator);
43248         }
43249         
43250         sax$$1.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
43251         sax$$1.domBuilder = options.domBuilder || domBuilder;
43252         if(/\/x?html?$/.test(mimeType)){
43253                 entityMap.nbsp = '\xa0';
43254                 entityMap.copy = '\xa9';
43255                 defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
43256         }
43257         defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
43258         if(source){
43259                 sax$$1.parse(source,defaultNSMap,entityMap);
43260         }else{
43261                 sax$$1.errorHandler.error("invalid doc source");
43262         }
43263         return domBuilder.doc;
43264 };
43265 function buildErrorHandler(errorImpl,domBuilder,locator){
43266         if(!errorImpl){
43267                 if(domBuilder instanceof DOMHandler){
43268                         return domBuilder;
43269                 }
43270                 errorImpl = domBuilder ;
43271         }
43272         var errorHandler = {};
43273         var isCallback = errorImpl instanceof Function;
43274         locator = locator||{};
43275         function build(key){
43276                 var fn = errorImpl[key];
43277                 if(!fn && isCallback){
43278                         fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl;
43279                 }
43280                 errorHandler[key] = fn && function(msg){
43281                         fn('[xmldom '+key+']\t'+msg+_locator(locator));
43282                 }||function(){};
43283         }
43284         build('warning');
43285         build('error');
43286         build('fatalError');
43287         return errorHandler;
43288 }
43289
43290 //console.log('#\n\n\n\n\n\n\n####')
43291 /**
43292  * +ContentHandler+ErrorHandler
43293  * +LexicalHandler+EntityResolver2
43294  * -DeclHandler-DTDHandler 
43295  * 
43296  * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
43297  * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
43298  * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
43299  */
43300 function DOMHandler() {
43301     this.cdata = false;
43302 }
43303 function position(locator,node){
43304         node.lineNumber = locator.lineNumber;
43305         node.columnNumber = locator.columnNumber;
43306 }
43307 /**
43308  * @see org.xml.sax.ContentHandler#startDocument
43309  * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
43310  */ 
43311 DOMHandler.prototype = {
43312         startDocument : function() {
43313         this.doc = new DOMImplementation().createDocument(null, null, null);
43314         if (this.locator) {
43315                 this.doc.documentURI = this.locator.systemId;
43316         }
43317         },
43318         startElement:function(namespaceURI, localName, qName, attrs) {
43319                 var doc = this.doc;
43320             var el = doc.createElementNS(namespaceURI, qName||localName);
43321             var len = attrs.length;
43322             appendElement(this, el);
43323             this.currentElement = el;
43324             
43325                 this.locator && position(this.locator,el);
43326             for (var i = 0 ; i < len; i++) {
43327                 var namespaceURI = attrs.getURI(i);
43328                 var value = attrs.getValue(i);
43329                 var qName = attrs.getQName(i);
43330                         var attr = doc.createAttributeNS(namespaceURI, qName);
43331                         this.locator &&position(attrs.getLocator(i),attr);
43332                         attr.value = attr.nodeValue = value;
43333                         el.setAttributeNode(attr);
43334             }
43335         },
43336         endElement:function(namespaceURI, localName, qName) {
43337                 var current = this.currentElement;
43338                 var tagName = current.tagName;
43339                 this.currentElement = current.parentNode;
43340         },
43341         startPrefixMapping:function(prefix, uri) {
43342         },
43343         endPrefixMapping:function(prefix) {
43344         },
43345         processingInstruction:function(target, data) {
43346             var ins = this.doc.createProcessingInstruction(target, data);
43347             this.locator && position(this.locator,ins);
43348             appendElement(this, ins);
43349         },
43350         ignorableWhitespace:function(ch, start, length) {
43351         },
43352         characters:function(chars, start, length) {
43353                 chars = _toString.apply(this,arguments);
43354                 //console.log(chars)
43355                 if(chars){
43356                         if (this.cdata) {
43357                                 var charNode = this.doc.createCDATASection(chars);
43358                         } else {
43359                                 var charNode = this.doc.createTextNode(chars);
43360                         }
43361                         if(this.currentElement){
43362                                 this.currentElement.appendChild(charNode);
43363                         }else if(/^\s*$/.test(chars)){
43364                                 this.doc.appendChild(charNode);
43365                                 //process xml
43366                         }
43367                         this.locator && position(this.locator,charNode);
43368                 }
43369         },
43370         skippedEntity:function(name) {
43371         },
43372         endDocument:function() {
43373                 this.doc.normalize();
43374         },
43375         setDocumentLocator:function (locator) {
43376             if(this.locator = locator){// && !('lineNumber' in locator)){
43377                 locator.lineNumber = 0;
43378             }
43379         },
43380         //LexicalHandler
43381         comment:function(chars, start, length) {
43382                 chars = _toString.apply(this,arguments);
43383             var comm = this.doc.createComment(chars);
43384             this.locator && position(this.locator,comm);
43385             appendElement(this, comm);
43386         },
43387         
43388         startCDATA:function() {
43389             //used in characters() methods
43390             this.cdata = true;
43391         },
43392         endCDATA:function() {
43393             this.cdata = false;
43394         },
43395         
43396         startDTD:function(name, publicId, systemId) {
43397                 var impl = this.doc.implementation;
43398             if (impl && impl.createDocumentType) {
43399                 var dt = impl.createDocumentType(name, publicId, systemId);
43400                 this.locator && position(this.locator,dt);
43401                 appendElement(this, dt);
43402             }
43403         },
43404         /**
43405          * @see org.xml.sax.ErrorHandler
43406          * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
43407          */
43408         warning:function(error) {
43409                 console.warn('[xmldom warning]\t'+error,_locator(this.locator));
43410         },
43411         error:function(error) {
43412                 console.error('[xmldom error]\t'+error,_locator(this.locator));
43413         },
43414         fatalError:function(error) {
43415                 console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
43416             throw error;
43417         }
43418 };
43419 function _locator(l){
43420         if(l){
43421                 return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
43422         }
43423 }
43424 function _toString(chars,start,length){
43425         if(typeof chars == 'string'){
43426                 return chars.substr(start,length)
43427         }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
43428                 if(chars.length >= start+length || start){
43429                         return new java.lang.String(chars,start,length)+'';
43430                 }
43431                 return chars;
43432         }
43433 }
43434
43435 /*
43436  * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
43437  * used method of org.xml.sax.ext.LexicalHandler:
43438  *  #comment(chars, start, length)
43439  *  #startCDATA()
43440  *  #endCDATA()
43441  *  #startDTD(name, publicId, systemId)
43442  *
43443  *
43444  * IGNORED method of org.xml.sax.ext.LexicalHandler:
43445  *  #endDTD()
43446  *  #startEntity(name)
43447  *  #endEntity(name)
43448  *
43449  *
43450  * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
43451  * IGNORED method of org.xml.sax.ext.DeclHandler
43452  *      #attributeDecl(eName, aName, type, mode, value)
43453  *  #elementDecl(name, model)
43454  *  #externalEntityDecl(name, publicId, systemId)
43455  *  #internalEntityDecl(name, value)
43456  * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
43457  * IGNORED method of org.xml.sax.EntityResolver2
43458  *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
43459  *  #resolveEntity(publicId, systemId)
43460  *  #getExternalSubset(name, baseURI)
43461  * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
43462  * IGNORED method of org.xml.sax.DTDHandler
43463  *  #notationDecl(name, publicId, systemId) {};
43464  *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
43465  */
43466 "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
43467         DOMHandler.prototype[key] = function(){return null};
43468 });
43469
43470 /* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
43471 function appendElement (hander,node) {
43472     if (!hander.currentElement) {
43473         hander.doc.appendChild(node);
43474     } else {
43475         hander.currentElement.appendChild(node);
43476     }
43477 }//appendChild and setAttributeNS are preformance key
43478
43479 //if(typeof require == 'function'){
43480         var XMLReader = sax.XMLReader;
43481         var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation;
43482         exports.XMLSerializer = dom.XMLSerializer ;
43483         exports.DOMParser = DOMParser;
43484 //}
43485 });
43486 var domParser_1 = domParser.DOMImplementation;
43487 var domParser_2 = domParser.XMLSerializer;
43488 var domParser_3 = domParser.DOMParser;
43489
43490 var togeojson = createCommonjsModule(function (module, exports) {
43491 var toGeoJSON = (function() {
43492
43493     var removeSpace = /\s*/g,
43494         trimSpace = /^\s*|\s*$/g,
43495         splitSpace = /\s+/;
43496     // generate a short, numeric hash of a string
43497     function okhash(x) {
43498         if (!x || !x.length) return 0;
43499         for (var i = 0, h = 0; i < x.length; i++) {
43500             h = ((h << 5) - h) + x.charCodeAt(i) | 0;
43501         } return h;
43502     }
43503     // all Y children of X
43504     function get(x, y) { return x.getElementsByTagName(y); }
43505     function attr(x, y) { return x.getAttribute(y); }
43506     function attrf(x, y) { return parseFloat(attr(x, y)); }
43507     // one Y child of X, if any, otherwise null
43508     function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
43509     // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
43510     function norm(el) { if (el.normalize) { el.normalize(); } return el; }
43511     // cast array x into numbers
43512     function numarray(x) {
43513         for (var j = 0, o = []; j < x.length; j++) { o[j] = parseFloat(x[j]); }
43514         return o;
43515     }
43516     // get the content of a text node, if any
43517     function nodeVal(x) {
43518         if (x) { norm(x); }
43519         return (x && x.textContent) || '';
43520     }
43521     // get the contents of multiple text nodes, if present
43522     function getMulti(x, ys) {
43523         var o = {}, n, k;
43524         for (k = 0; k < ys.length; k++) {
43525             n = get1(x, ys[k]);
43526             if (n) o[ys[k]] = nodeVal(n);
43527         }
43528         return o;
43529     }
43530     // add properties of Y to X, overwriting if present in both
43531     function extend(x, y) { for (var k in y) x[k] = y[k]; }
43532     // get one coordinate from a coordinate array, if any
43533     function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
43534     // get all coordinates from a coordinate array as [[],[]]
43535     function coord(v) {
43536         var coords = v.replace(trimSpace, '').split(splitSpace),
43537             o = [];
43538         for (var i = 0; i < coords.length; i++) {
43539             o.push(coord1(coords[i]));
43540         }
43541         return o;
43542     }
43543     function coordPair(x) {
43544         var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
43545             ele = get1(x, 'ele'),
43546             // handle namespaced attribute in browser
43547             heartRate = get1(x, 'gpxtpx:hr') || get1(x, 'hr'),
43548             time = get1(x, 'time'),
43549             e;
43550         if (ele) {
43551             e = parseFloat(nodeVal(ele));
43552             if (!isNaN(e)) {
43553                 ll.push(e);
43554             }
43555         }
43556         return {
43557             coordinates: ll,
43558             time: time ? nodeVal(time) : null,
43559             heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
43560         };
43561     }
43562
43563     // create a new feature collection parent object
43564     function fc() {
43565         return {
43566             type: 'FeatureCollection',
43567             features: []
43568         };
43569     }
43570
43571     var serializer;
43572     if (typeof XMLSerializer !== 'undefined') {
43573         /* istanbul ignore next */
43574         serializer = new XMLSerializer();
43575     // only require xmldom in a node environment
43576     } else if ('object' === 'object' && typeof process === 'object' && !process.browser) {
43577         serializer = new (domParser.XMLSerializer)();
43578     }
43579     function xml2str(str) {
43580         // IE9 will create a new XMLSerializer but it'll crash immediately.
43581         // This line is ignored because we don't run coverage tests in IE9
43582         /* istanbul ignore next */
43583         if (str.xml !== undefined) return str.xml;
43584         return serializer.serializeToString(str);
43585     }
43586
43587     var t = {
43588         kml: function(doc) {
43589
43590             var gj = fc(),
43591                 // styleindex keeps track of hashed styles in order to match features
43592                 styleIndex = {}, styleByHash = {},
43593                 // stylemapindex keeps track of style maps to expose in properties
43594                 styleMapIndex = {},
43595                 // atomic geospatial types supported by KML - MultiGeometry is
43596                 // handled separately
43597                 geotypes = ['Polygon', 'LineString', 'Point', 'Track', 'gx:Track'],
43598                 // all root placemarks in the file
43599                 placemarks = get(doc, 'Placemark'),
43600                 styles = get(doc, 'Style'),
43601                 styleMaps = get(doc, 'StyleMap');
43602
43603             for (var k = 0; k < styles.length; k++) {
43604                 var hash = okhash(xml2str(styles[k])).toString(16);
43605                 styleIndex['#' + attr(styles[k], 'id')] = hash;
43606                 styleByHash[hash] = styles[k];
43607             }
43608             for (var l = 0; l < styleMaps.length; l++) {
43609                 styleIndex['#' + attr(styleMaps[l], 'id')] = okhash(xml2str(styleMaps[l])).toString(16);
43610                 var pairs = get(styleMaps[l], 'Pair');
43611                 var pairsMap = {};
43612                 for (var m = 0; m < pairs.length; m++) {
43613                     pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
43614                 }
43615                 styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
43616
43617             }
43618             for (var j = 0; j < placemarks.length; j++) {
43619                 gj.features = gj.features.concat(getPlacemark(placemarks[j]));
43620             }
43621             function kmlColor(v) {
43622                 var color, opacity;
43623                 v = v || '';
43624                 if (v.substr(0, 1) === '#') { v = v.substr(1); }
43625                 if (v.length === 6 || v.length === 3) { color = v; }
43626                 if (v.length === 8) {
43627                     opacity = parseInt(v.substr(0, 2), 16) / 255;
43628                     color = '#' + v.substr(6, 2) +
43629                         v.substr(4, 2) +
43630                         v.substr(2, 2);
43631                 }
43632                 return [color, isNaN(opacity) ? undefined : opacity];
43633             }
43634             function gxCoord(v) { return numarray(v.split(' ')); }
43635             function gxCoords(root) {
43636                 var elems = get(root, 'coord', 'gx'), coords = [], times = [];
43637                 if (elems.length === 0) elems = get(root, 'gx:coord');
43638                 for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
43639                 var timeElems = get(root, 'when');
43640                 for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
43641                 return {
43642                     coords: coords,
43643                     times: times
43644                 };
43645             }
43646             function getGeometry(root) {
43647                 var geomNode, geomNodes, i, j, k, geoms = [], coordTimes = [];
43648                 if (get1(root, 'MultiGeometry')) { return getGeometry(get1(root, 'MultiGeometry')); }
43649                 if (get1(root, 'MultiTrack')) { return getGeometry(get1(root, 'MultiTrack')); }
43650                 if (get1(root, 'gx:MultiTrack')) { return getGeometry(get1(root, 'gx:MultiTrack')); }
43651                 for (i = 0; i < geotypes.length; i++) {
43652                     geomNodes = get(root, geotypes[i]);
43653                     if (geomNodes) {
43654                         for (j = 0; j < geomNodes.length; j++) {
43655                             geomNode = geomNodes[j];
43656                             if (geotypes[i] === 'Point') {
43657                                 geoms.push({
43658                                     type: 'Point',
43659                                     coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
43660                                 });
43661                             } else if (geotypes[i] === 'LineString') {
43662                                 geoms.push({
43663                                     type: 'LineString',
43664                                     coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
43665                                 });
43666                             } else if (geotypes[i] === 'Polygon') {
43667                                 var rings = get(geomNode, 'LinearRing'),
43668                                     coords = [];
43669                                 for (k = 0; k < rings.length; k++) {
43670                                     coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
43671                                 }
43672                                 geoms.push({
43673                                     type: 'Polygon',
43674                                     coordinates: coords
43675                                 });
43676                             } else if (geotypes[i] === 'Track' ||
43677                                 geotypes[i] === 'gx:Track') {
43678                                 var track = gxCoords(geomNode);
43679                                 geoms.push({
43680                                     type: 'LineString',
43681                                     coordinates: track.coords
43682                                 });
43683                                 if (track.times.length) coordTimes.push(track.times);
43684                             }
43685                         }
43686                     }
43687                 }
43688                 return {
43689                     geoms: geoms,
43690                     coordTimes: coordTimes
43691                 };
43692             }
43693             function getPlacemark(root) {
43694                 var geomsAndTimes = getGeometry(root), i, properties = {},
43695                     name = nodeVal(get1(root, 'name')),
43696                     address = nodeVal(get1(root, 'address')),
43697                     styleUrl = nodeVal(get1(root, 'styleUrl')),
43698                     description = nodeVal(get1(root, 'description')),
43699                     timeSpan = get1(root, 'TimeSpan'),
43700                     timeStamp = get1(root, 'TimeStamp'),
43701                     extendedData = get1(root, 'ExtendedData'),
43702                     lineStyle = get1(root, 'LineStyle'),
43703                     polyStyle = get1(root, 'PolyStyle'),
43704                     visibility = get1(root, 'visibility');
43705
43706                 if (!geomsAndTimes.geoms.length) return [];
43707                 if (name) properties.name = name;
43708                 if (address) properties.address = address;
43709                 if (styleUrl) {
43710                     if (styleUrl[0] !== '#') {
43711                         styleUrl = '#' + styleUrl;
43712                     }
43713
43714                     properties.styleUrl = styleUrl;
43715                     if (styleIndex[styleUrl]) {
43716                         properties.styleHash = styleIndex[styleUrl];
43717                     }
43718                     if (styleMapIndex[styleUrl]) {
43719                         properties.styleMapHash = styleMapIndex[styleUrl];
43720                         properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
43721                     }
43722                     // Try to populate the lineStyle or polyStyle since we got the style hash
43723                     var style = styleByHash[properties.styleHash];
43724                     if (style) {
43725                         if (!lineStyle) lineStyle = get1(style, 'LineStyle');
43726                         if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
43727                     }
43728                 }
43729                 if (description) properties.description = description;
43730                 if (timeSpan) {
43731                     var begin = nodeVal(get1(timeSpan, 'begin'));
43732                     var end = nodeVal(get1(timeSpan, 'end'));
43733                     properties.timespan = { begin: begin, end: end };
43734                 }
43735                 if (timeStamp) {
43736                     properties.timestamp = nodeVal(get1(timeStamp, 'when'));
43737                 }
43738                 if (lineStyle) {
43739                     var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
43740                         color = linestyles[0],
43741                         opacity = linestyles[1],
43742                         width = parseFloat(nodeVal(get1(lineStyle, 'width')));
43743                     if (color) properties.stroke = color;
43744                     if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
43745                     if (!isNaN(width)) properties['stroke-width'] = width;
43746                 }
43747                 if (polyStyle) {
43748                     var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
43749                         pcolor = polystyles[0],
43750                         popacity = polystyles[1],
43751                         fill = nodeVal(get1(polyStyle, 'fill')),
43752                         outline = nodeVal(get1(polyStyle, 'outline'));
43753                     if (pcolor) properties.fill = pcolor;
43754                     if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
43755                     if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
43756                     if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
43757                 }
43758                 if (extendedData) {
43759                     var datas = get(extendedData, 'Data'),
43760                         simpleDatas = get(extendedData, 'SimpleData');
43761
43762                     for (i = 0; i < datas.length; i++) {
43763                         properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
43764                     }
43765                     for (i = 0; i < simpleDatas.length; i++) {
43766                         properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
43767                     }
43768                 }
43769                 if (visibility) {
43770                     properties.visibility = nodeVal(visibility);
43771                 }
43772                 if (geomsAndTimes.coordTimes.length) {
43773                     properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
43774                         geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
43775                 }
43776                 var feature = {
43777                     type: 'Feature',
43778                     geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
43779                         type: 'GeometryCollection',
43780                         geometries: geomsAndTimes.geoms
43781                     },
43782                     properties: properties
43783                 };
43784                 if (attr(root, 'id')) feature.id = attr(root, 'id');
43785                 return [feature];
43786             }
43787             return gj;
43788         },
43789         gpx: function(doc) {
43790             var i,
43791                 tracks = get(doc, 'trk'),
43792                 routes = get(doc, 'rte'),
43793                 waypoints = get(doc, 'wpt'),
43794                 // a feature collection
43795                 gj = fc(),
43796                 feature;
43797             for (i = 0; i < tracks.length; i++) {
43798                 feature = getTrack(tracks[i]);
43799                 if (feature) gj.features.push(feature);
43800             }
43801             for (i = 0; i < routes.length; i++) {
43802                 feature = getRoute(routes[i]);
43803                 if (feature) gj.features.push(feature);
43804             }
43805             for (i = 0; i < waypoints.length; i++) {
43806                 gj.features.push(getPoint(waypoints[i]));
43807             }
43808             function getPoints(node, pointname) {
43809                 var pts = get(node, pointname),
43810                     line = [],
43811                     times = [],
43812                     heartRates = [],
43813                     l = pts.length;
43814                 if (l < 2) return {};  // Invalid line in GeoJSON
43815                 for (var i = 0; i < l; i++) {
43816                     var c = coordPair(pts[i]);
43817                     line.push(c.coordinates);
43818                     if (c.time) times.push(c.time);
43819                     if (c.heartRate) heartRates.push(c.heartRate);
43820                 }
43821                 return {
43822                     line: line,
43823                     times: times,
43824                     heartRates: heartRates
43825                 };
43826             }
43827             function getTrack(node) {
43828                 var segments = get(node, 'trkseg'),
43829                     track = [],
43830                     times = [],
43831                     heartRates = [],
43832                     line;
43833                 for (var i = 0; i < segments.length; i++) {
43834                     line = getPoints(segments[i], 'trkpt');
43835                     if (line) {
43836                         if (line.line) track.push(line.line);
43837                         if (line.times && line.times.length) times.push(line.times);
43838                         if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
43839                     }
43840                 }
43841                 if (track.length === 0) return;
43842                 var properties = getProperties(node);
43843                 extend(properties, getLineStyle(get1(node, 'extensions')));
43844                 if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
43845                 if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
43846                 return {
43847                     type: 'Feature',
43848                     properties: properties,
43849                     geometry: {
43850                         type: track.length === 1 ? 'LineString' : 'MultiLineString',
43851                         coordinates: track.length === 1 ? track[0] : track
43852                     }
43853                 };
43854             }
43855             function getRoute(node) {
43856                 var line = getPoints(node, 'rtept');
43857                 if (!line.line) return;
43858                 var prop = getProperties(node);
43859                 extend(prop, getLineStyle(get1(node, 'extensions')));
43860                 var routeObj = {
43861                     type: 'Feature',
43862                     properties: prop,
43863                     geometry: {
43864                         type: 'LineString',
43865                         coordinates: line.line
43866                     }
43867                 };
43868                 return routeObj;
43869             }
43870             function getPoint(node) {
43871                 var prop = getProperties(node);
43872                 extend(prop, getMulti(node, ['sym']));
43873                 return {
43874                     type: 'Feature',
43875                     properties: prop,
43876                     geometry: {
43877                         type: 'Point',
43878                         coordinates: coordPair(node).coordinates
43879                     }
43880                 };
43881             }
43882             function getLineStyle(extensions) {
43883                 var style = {};
43884                 if (extensions) {
43885                     var lineStyle = get1(extensions, 'line');
43886                     if (lineStyle) {
43887                         var color = nodeVal(get1(lineStyle, 'color')),
43888                             opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
43889                             width = parseFloat(nodeVal(get1(lineStyle, 'width')));
43890                         if (color) style.stroke = color;
43891                         if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
43892                         // GPX width is in mm, convert to px with 96 px per inch
43893                         if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
43894                     }
43895                 }
43896                 return style;
43897             }
43898             function getProperties(node) {
43899                 var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
43900                     links = get(node, 'link');
43901                 if (links.length) prop.links = [];
43902                 for (var i = 0, link; i < links.length; i++) {
43903                     link = { href: attr(links[i], 'href') };
43904                     extend(link, getMulti(links[i], ['text', 'type']));
43905                     prop.links.push(link);
43906                 }
43907                 return prop;
43908             }
43909             return gj;
43910         }
43911     };
43912     return t;
43913 })();
43914
43915 module.exports = toGeoJSON;
43916 });
43917
43918 var _initialized = false;
43919 var _enabled = false;
43920 var _geojson;
43921
43922
43923 function svgGpx$$1(projection$$1, context, dispatch) {
43924     var _showLabels = true;
43925     var detected = utilDetect();
43926     var layer;
43927     var _src;
43928
43929
43930     function init() {
43931         if (_initialized) return;  // run once
43932
43933         _geojson = {};
43934         _enabled = true;
43935
43936         function over() {
43937             event.stopPropagation();
43938             event.preventDefault();
43939             event.dataTransfer.dropEffect = 'copy';
43940         }
43941
43942         d3_select('body')
43943             .attr('dropzone', 'copy')
43944             .on('drop.localgpx', function() {
43945                 event.stopPropagation();
43946                 event.preventDefault();
43947                 if (!detected.filedrop) return;
43948                 drawGpx.files(event.dataTransfer.files);
43949             })
43950             .on('dragenter.localgpx', over)
43951             .on('dragexit.localgpx', over)
43952             .on('dragover.localgpx', over);
43953
43954         _initialized = true;
43955     }
43956
43957
43958     function drawGpx(selection$$1) {
43959         var getPath = svgPath(projection$$1).geojson;
43960
43961         layer = selection$$1.selectAll('.layer-gpx')
43962             .data(_enabled ? [0] : []);
43963
43964         layer.exit()
43965             .remove();
43966
43967         layer = layer.enter()
43968             .append('g')
43969             .attr('class', 'layer-gpx')
43970             .merge(layer);
43971
43972
43973         var paths = layer
43974             .selectAll('path')
43975             .data([_geojson]);
43976
43977         paths.exit()
43978             .remove();
43979
43980         paths = paths.enter()
43981             .append('path')
43982             .attr('class', 'gpx')
43983             .merge(paths);
43984
43985         paths
43986             .attr('d', getPath);
43987
43988
43989         var labelData = _showLabels && _geojson.features ? _geojson.features : [];
43990         labelData = labelData.filter(getPath);
43991
43992         layer
43993             .call(drawLabels, 'gpxlabel-halo', labelData)
43994             .call(drawLabels, 'gpxlabel', labelData);
43995
43996
43997         function drawLabels(selection$$1, textClass, data) {
43998             var labels = selection$$1.selectAll('text.' + textClass)
43999                 .data(data);
44000
44001             // exit
44002             labels.exit()
44003                 .remove();
44004
44005             // enter/update
44006             labels = labels.enter()
44007                 .append('text')
44008                 .attr('class', textClass)
44009                 .merge(labels)
44010                 .text(function(d) {
44011                     if (d.properties) {
44012                         return d.properties.desc || d.properties.name;
44013                     }
44014                     return null;
44015                 })
44016                 .attr('x', function(d) {
44017                     var centroid = getPath.centroid(d);
44018                     return centroid[0] + 11;
44019                 })
44020                 .attr('y', function(d) {
44021                     var centroid = getPath.centroid(d);
44022                     return centroid[1];
44023                 });
44024         }
44025     }
44026
44027
44028     function toDom(x) {
44029         return (new DOMParser()).parseFromString(x, 'text/xml');
44030     }
44031
44032
44033     function getExtension(fileName) {
44034         if (isUndefined(fileName)) {
44035             return '';
44036         }
44037
44038         var lastDotIndex = fileName.lastIndexOf('.');
44039         if (lastDotIndex < 0) {
44040             return '';
44041         }
44042
44043         return fileName.substr(lastDotIndex);
44044     }
44045
44046
44047     function parseSaveAndZoom(extension, data) {
44048         switch (extension) {
44049             default:
44050                 drawGpx.geojson(togeojson.gpx(toDom(data))).fitZoom();
44051                 break;
44052             case '.kml':
44053                 drawGpx.geojson(togeojson.kml(toDom(data))).fitZoom();
44054                 break;
44055             case '.geojson':
44056             case '.json':
44057                 drawGpx.geojson(JSON.parse(data)).fitZoom();
44058                 break;
44059         }
44060     }
44061
44062
44063     drawGpx.showLabels = function(_) {
44064         if (!arguments.length) return _showLabels;
44065         _showLabels = _;
44066         return this;
44067     };
44068
44069
44070     drawGpx.enabled = function(_) {
44071         if (!arguments.length) return _enabled;
44072         _enabled = _;
44073         dispatch.call('change');
44074         return this;
44075     };
44076
44077
44078     drawGpx.hasGpx = function() {
44079         return (!(isEmpty(_geojson) || isEmpty(_geojson.features)));
44080     };
44081
44082
44083     drawGpx.geojson = function(gj) {
44084         if (!arguments.length) return _geojson;
44085         if (isEmpty(gj) || isEmpty(gj.features)) return this;
44086         _geojson = gj;
44087         dispatch.call('change');
44088         return this;
44089     };
44090
44091
44092     drawGpx.url = function(url) {
44093         d3_text(url, function(err, data) {
44094             if (!err) {
44095                 _src = url;
44096                 var extension = getExtension(url);
44097                 parseSaveAndZoom(extension, data);
44098             }
44099         });
44100         return this;
44101     };
44102
44103
44104     drawGpx.files = function(fileList) {
44105         if (!fileList.length) return this;
44106         var f = fileList[0],
44107             reader = new FileReader();
44108
44109         reader.onload = (function(file) {
44110             _src = file.name;
44111             var extension = getExtension(file.name);
44112             return function (e) {
44113                 parseSaveAndZoom(extension, e.target.result);
44114             };
44115         })(f);
44116
44117         reader.readAsText(f);
44118         return this;
44119     };
44120
44121
44122     drawGpx.getSrc = function () {
44123         return _src;
44124     };
44125
44126
44127     drawGpx.fitZoom = function() {
44128         if (!this.hasGpx()) return this;
44129
44130         var map = context.map();
44131         var viewport = map.trimmedExtent().polygon();
44132         var coords = reduce(_geojson.features, function(coords, feature) {
44133             var c = feature.geometry.coordinates;
44134
44135             /* eslint-disable no-fallthrough */
44136             switch (feature.geometry.type) {
44137                 case 'Point':
44138                     c = [c];
44139                 case 'MultiPoint':
44140                 case 'LineString':
44141                     break;
44142
44143                 case 'MultiPolygon':
44144                     c = flatten(c);
44145                 case 'Polygon':
44146                 case 'MultiLineString':
44147                     c = flatten(c);
44148                     break;
44149             }
44150             /* eslint-enable no-fallthrough */
44151
44152             return union(coords, c);
44153         }, []);
44154
44155         if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
44156             var extent = geoExtent$$1(d3_geoBounds({ type: 'LineString', coordinates: coords }));
44157             map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
44158         }
44159
44160         return this;
44161     };
44162
44163
44164     init();
44165     return drawGpx;
44166 }
44167
44168 function svgIcon(name, svgklass, useklass) {
44169     return function drawIcon(selection) {
44170         selection.selectAll('svg')
44171             .data([0])
44172             .enter()
44173             .append('svg')
44174             .attr('class', 'icon ' + (svgklass || ''))
44175             .append('use')
44176             .attr('xlink:href', name)
44177             .attr('class', useklass);
44178     };
44179 }
44180
44181 function svgLabels(projection$$1, context) {
44182     var path = d3_geoPath(projection$$1);
44183     var detected = utilDetect();
44184     var baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge');
44185     var _rdrawn = rbush_1();
44186     var _rskipped = rbush_1();
44187     var _textWidthCache = {};
44188     var _entitybboxes = {};
44189
44190     // Listed from highest to lowest priority
44191     var labelStack = [
44192         ['line', 'aeroway', '*', 12],
44193         ['line', 'highway', 'motorway', 12],
44194         ['line', 'highway', 'trunk', 12],
44195         ['line', 'highway', 'primary', 12],
44196         ['line', 'highway', 'secondary', 12],
44197         ['line', 'highway', 'tertiary', 12],
44198         ['line', 'highway', '*', 12],
44199         ['line', 'railway', '*', 12],
44200         ['line', 'waterway', '*', 12],
44201         ['area', 'aeroway', '*', 12],
44202         ['area', 'amenity', '*', 12],
44203         ['area', 'building', '*', 12],
44204         ['area', 'historic', '*', 12],
44205         ['area', 'leisure', '*', 12],
44206         ['area', 'man_made', '*', 12],
44207         ['area', 'natural', '*', 12],
44208         ['area', 'shop', '*', 12],
44209         ['area', 'tourism', '*', 12],
44210         ['area', 'camp_site', '*', 12],
44211         ['point', 'aeroway', '*', 10],
44212         ['point', 'amenity', '*', 10],
44213         ['point', 'building', '*', 10],
44214         ['point', 'historic', '*', 10],
44215         ['point', 'leisure', '*', 10],
44216         ['point', 'man_made', '*', 10],
44217         ['point', 'natural', '*', 10],
44218         ['point', 'shop', '*', 10],
44219         ['point', 'tourism', '*', 10],
44220         ['point', 'camp_site', '*', 10],
44221         ['line', 'name', '*', 12],
44222         ['area', 'name', '*', 12],
44223         ['point', 'name', '*', 10]
44224     ];
44225
44226
44227     function blacklisted(preset) {
44228         var noIcons = ['building', 'landuse', 'natural'];
44229         return some(noIcons, function(s) {
44230             return preset.id.indexOf(s) >= 0;
44231         });
44232     }
44233
44234
44235     function get(array, prop) {
44236         return function(d, i) { return array[i][prop]; };
44237     }
44238
44239
44240     function textWidth(text, size, elem) {
44241         var c = _textWidthCache[size];
44242         if (!c) c = _textWidthCache[size] = {};
44243
44244         if (c[text]) {
44245             return c[text];
44246
44247         } else if (elem) {
44248             c[text] = elem.getComputedTextLength();
44249             return c[text];
44250
44251         } else {
44252             var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
44253             if (str === null) {
44254                 return size / 3 * 2 * text.length;
44255             } else {
44256                 return size / 3 * (2 * text.length + str.length);
44257             }
44258         }
44259     }
44260
44261
44262     function drawLinePaths(selection, entities, filter, classes, labels) {
44263         var paths = selection.selectAll('path')
44264             .filter(filter)
44265             .data(entities, osmEntity$$1.key);
44266
44267         // exit
44268         paths.exit()
44269             .remove();
44270
44271         // enter/update
44272         paths.enter()
44273             .append('path')
44274             .style('stroke-width', get(labels, 'font-size'))
44275             .attr('id', function(d) { return 'labelpath-' + d.id; })
44276             .attr('class', classes)
44277             .merge(paths)
44278             .attr('d', get(labels, 'lineString'));
44279     }
44280
44281
44282     function drawLineLabels(selection, entities, filter, classes, labels) {
44283         var texts = selection.selectAll('text.' + classes)
44284             .filter(filter)
44285             .data(entities, osmEntity$$1.key);
44286
44287         // exit
44288         texts.exit()
44289             .remove();
44290
44291         // enter
44292         texts.enter()
44293             .append('text')
44294             .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
44295             .attr('dy', baselineHack ? '0.35em' : null)
44296             .append('textPath')
44297             .attr('class', 'textpath');
44298
44299         // update
44300         selection.selectAll('text.' + classes).selectAll('.textpath')
44301             .filter(filter)
44302             .data(entities, osmEntity$$1.key)
44303             .attr('startOffset', '50%')
44304             .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
44305             .text(utilDisplayNameForPath);
44306     }
44307
44308
44309     function drawPointLabels(selection, entities, filter, classes, labels) {
44310         var texts = selection.selectAll('text.' + classes)
44311             .filter(filter)
44312             .data(entities, osmEntity$$1.key);
44313
44314         // exit
44315         texts.exit()
44316             .remove();
44317
44318         // enter/update
44319         texts.enter()
44320             .append('text')
44321             .attr('class', function(d, i) {
44322                 return classes + ' ' + labels[i].classes + ' ' + d.id;
44323             })
44324             .merge(texts)
44325             .attr('x', get(labels, 'x'))
44326             .attr('y', get(labels, 'y'))
44327             .style('text-anchor', get(labels, 'textAnchor'))
44328             .text(utilDisplayName)
44329             .each(function(d, i) {
44330                 textWidth(utilDisplayName(d), labels[i].height, this);
44331             });
44332     }
44333
44334
44335     function drawAreaLabels(selection, entities, filter, classes, labels) {
44336         entities = entities.filter(hasText);
44337         labels = labels.filter(hasText);
44338         drawPointLabels(selection, entities, filter, classes, labels);
44339
44340         function hasText(d, i) {
44341             return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
44342         }
44343     }
44344
44345
44346     function drawAreaIcons(selection, entities, filter, classes, labels) {
44347         var icons = selection.selectAll('use.' + classes)
44348             .filter(filter)
44349             .data(entities, osmEntity$$1.key);
44350
44351         // exit
44352         icons.exit()
44353             .remove();
44354
44355         // enter/update
44356         icons.enter()
44357             .append('use')
44358             .attr('class', 'icon ' + classes)
44359             .attr('width', '17px')
44360             .attr('height', '17px')
44361             .merge(icons)
44362             .attr('transform', get(labels, 'transform'))
44363             .attr('xlink:href', function(d) {
44364                 var preset = context.presets().match(d, context.graph());
44365                 var picon = preset && preset.icon;
44366
44367                 if (!picon) {
44368                     return '';
44369                 } else {
44370                     var isMaki = dataFeatureIcons.indexOf(picon) !== -1;
44371                     return '#' + picon + (isMaki ? '-15' : '');
44372                 }
44373             });
44374     }
44375
44376
44377     function drawCollisionBoxes(selection, rtree, which) {
44378         var classes = 'debug ' + which + ' ' + (which === 'debug-skipped' ? 'orange' : 'yellow');
44379
44380         var gj = [];
44381         if (context.getDebug('collision')) {
44382             gj = rtree.all().map(function(d) {
44383                 return { type: 'Polygon', coordinates: [[
44384                     [d.minX, d.minY],
44385                     [d.maxX, d.minY],
44386                     [d.maxX, d.maxY],
44387                     [d.minX, d.maxY],
44388                     [d.minX, d.minY]
44389                 ]]};
44390             });
44391         }
44392
44393         var boxes = selection.selectAll('.' + which)
44394             .data(gj);
44395
44396         // exit
44397         boxes.exit()
44398             .remove();
44399
44400         // enter/update
44401         boxes.enter()
44402             .append('path')
44403             .attr('class', classes)
44404             .merge(boxes)
44405             .attr('d', d3_geoPath());
44406     }
44407
44408
44409     function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
44410         var wireframe = context.surface().classed('fill-wireframe');
44411         var zoom = geoScaleToZoom(projection$$1.scale());
44412
44413         var labelable = [];
44414         var renderNodeAs = {};
44415         var i, j, k, entity, geometry;
44416
44417         for (i = 0; i < labelStack.length; i++) {
44418             labelable.push([]);
44419         }
44420
44421         if (fullRedraw) {
44422             _rdrawn.clear();
44423             _rskipped.clear();
44424             _entitybboxes = {};
44425
44426         } else {
44427             for (i = 0; i < entities.length; i++) {
44428                 entity = entities[i];
44429                 var toRemove = []
44430                     .concat(_entitybboxes[entity.id] || [])
44431                     .concat(_entitybboxes[entity.id + 'I'] || []);
44432
44433                 for (j = 0; j < toRemove.length; j++) {
44434                     _rdrawn.remove(toRemove[j]);
44435                     _rskipped.remove(toRemove[j]);
44436                 }
44437             }
44438         }
44439
44440         // Loop through all the entities to do some preprocessing
44441         for (i = 0; i < entities.length; i++) {
44442             entity = entities[i];
44443             geometry = entity.geometry(graph);
44444
44445             // Insert collision boxes around interesting points/vertices
44446             if (geometry === 'point' || (geometry === 'vertex' && isInterestingVertex(entity))) {
44447                 var hasDirections = entity.directions(graph, projection$$1).length;
44448                 var markerPadding;
44449
44450                 if (!wireframe && geometry === 'point' && !(zoom >= 18 && hasDirections)) {
44451                     renderNodeAs[entity.id] = 'point';
44452                     markerPadding = 20;   // extra y for marker height
44453                 } else {
44454                     renderNodeAs[entity.id] = 'vertex';
44455                     markerPadding = 0;
44456                 }
44457
44458                 var coord = projection$$1(entity.loc);
44459                 var nodePadding = 10;
44460                 var bbox = {
44461                     minX: coord[0] - nodePadding,
44462                     minY: coord[1] - nodePadding - markerPadding,
44463                     maxX: coord[0] + nodePadding,
44464                     maxY: coord[1] + nodePadding
44465                 };
44466
44467                 doInsert(bbox, entity.id + 'P');
44468             }
44469
44470             // From here on, treat vertices like points
44471             if (geometry === 'vertex') {
44472                 geometry = 'point';
44473             }
44474
44475             // Determine which entities are label-able
44476             var preset = geometry === 'area' && context.presets().match(entity, graph);
44477             var icon = preset && !blacklisted(preset) && preset.icon;
44478
44479             if (!icon && !utilDisplayName(entity))
44480                 continue;
44481
44482             for (k = 0; k < labelStack.length; k++) {
44483                 var matchGeom = labelStack[k][0];
44484                 var matchKey = labelStack[k][1];
44485                 var matchVal = labelStack[k][2];
44486                 var hasVal = entity.tags[matchKey];
44487
44488                 if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
44489                     labelable[k].push(entity);
44490                     break;
44491                 }
44492             }
44493         }
44494
44495         var positions = {
44496             point: [],
44497             line: [],
44498             area: []
44499         };
44500
44501         var labelled = {
44502             point: [],
44503             line: [],
44504             area: []
44505         };
44506
44507         // Try and find a valid label for labellable entities
44508         for (k = 0; k < labelable.length; k++) {
44509             var fontSize = labelStack[k][3];
44510
44511             for (i = 0; i < labelable[k].length; i++) {
44512                 entity = labelable[k][i];
44513                 geometry = entity.geometry(graph);
44514
44515                 var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName;
44516                 var name = getName(entity);
44517                 var width = name && textWidth(name, fontSize);
44518                 var p = null;
44519
44520                 if (geometry === 'point' || geometry === 'vertex') {
44521                     // no point or vertex labels in wireframe mode
44522                     // no vertex labels at low zooms (vertices have no icons)
44523                     if (wireframe) continue;
44524                     var renderAs = renderNodeAs[entity.id];
44525                     if (renderAs === 'vertex' && zoom < 17) continue;
44526
44527                     p = getPointLabel(entity, width, fontSize, renderAs);
44528
44529                 } else if (geometry === 'line') {
44530                     p = getLineLabel(entity, width, fontSize);
44531
44532                 } else if (geometry === 'area') {
44533                     p = getAreaLabel(entity, width, fontSize);
44534                 }
44535
44536                 if (p) {
44537                     if (geometry === 'vertex') { geometry = 'point'; }  // treat vertex like point
44538                     p.classes = geometry + ' tag-' + labelStack[k][1];
44539                     positions[geometry].push(p);
44540                     labelled[geometry].push(entity);
44541                 }
44542             }
44543         }
44544
44545
44546         function isInterestingVertex(entity) {
44547             var selectedIDs = context.selectedIDs();
44548
44549             return entity.hasInterestingTags() ||
44550                 entity.isEndpoint(graph) ||
44551                 entity.isConnected(graph) ||
44552                 selectedIDs.indexOf(entity.id) !== -1 ||
44553                 some(graph.parentWays(entity), function(parent) {
44554                     return selectedIDs.indexOf(parent.id) !== -1;
44555                 });
44556         }
44557
44558
44559         function getPointLabel(entity, width, height, geometry) {
44560             var y = (geometry === 'point' ? -12 : 0);
44561             var pointOffsets = {
44562                 ltr: [15, y, 'start'],
44563                 rtl: [-15, y, 'end']
44564             };
44565
44566             var coord = projection$$1(entity.loc);
44567             var textPadding = 2;
44568             var offset = pointOffsets[textDirection];
44569             var p = {
44570                 height: height,
44571                 width: width,
44572                 x: coord[0] + offset[0],
44573                 y: coord[1] + offset[1],
44574                 textAnchor: offset[2]
44575             };
44576
44577             // insert a collision box for the text label..
44578             var bbox;
44579             if (textDirection === 'rtl') {
44580                 bbox = {
44581                     minX: p.x - width - textPadding,
44582                     minY: p.y - (height / 2) - textPadding,
44583                     maxX: p.x + textPadding,
44584                     maxY: p.y + (height / 2) + textPadding
44585                 };
44586             } else {
44587                 bbox = {
44588                     minX: p.x - textPadding,
44589                     minY: p.y - (height / 2) - textPadding,
44590                     maxX: p.x + width + textPadding,
44591                     maxY: p.y + (height / 2) + textPadding
44592                 };
44593             }
44594
44595             if (tryInsert([bbox], entity.id, true)) {
44596                 return p;
44597             }
44598         }
44599
44600
44601         function getLineLabel(entity, width, height) {
44602             var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
44603             var points = map$3(graph.childNodes(entity), 'loc').map(projection$$1);
44604             var length = geoPathLength(points);
44605
44606             if (length < width + 20) return;
44607
44608             // todo: properly clip points to viewport
44609
44610             // % along the line to attempt to place the label
44611             var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
44612                                25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
44613             var padding = 3;
44614
44615             for (var i = 0; i < lineOffsets.length; i++) {
44616                 var offset = lineOffsets[i];
44617                 var middle = offset / 100 * length;
44618                 var start = middle - width / 2;
44619
44620                 if (start < 0 || start + width > length) continue;
44621
44622                 // generate subpath and ignore paths that are invalid or don't cross viewport.
44623                 var sub = subpath(points, start, start + width);
44624                 if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
44625                     continue;
44626                 }
44627
44628                 var isReverse = reverse(sub);
44629                 if (isReverse) {
44630                     sub = sub.reverse();
44631                 }
44632
44633                 var bboxes = [];
44634                 var boxsize = (height + 2) / 2;
44635
44636                 for (var j = 0; j < sub.length - 1; j++) {
44637                     var a = sub[j];
44638                     var b = sub[j + 1];
44639
44640                     // split up the text into small collision boxes
44641                     var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
44642
44643                     for (var box = 0; box < num; box++) {
44644                         var p = geoVecInterp(a, b, box / num);
44645                         var x0 = p[0] - boxsize - padding;
44646                         var y0 = p[1] - boxsize - padding;
44647                         var x1 = p[0] + boxsize + padding;
44648                         var y1 = p[1] + boxsize + padding;
44649
44650                         bboxes.push({
44651                             minX: Math.min(x0, x1),
44652                             minY: Math.min(y0, y1),
44653                             maxX: Math.max(x0, x1),
44654                             maxY: Math.max(y0, y1)
44655                         });
44656                     }
44657                 }
44658
44659                 if (tryInsert(bboxes, entity.id, false)) {   // accept this one
44660                     return {
44661                         'font-size': height + 2,
44662                         lineString: lineString(sub),
44663                         startOffset: offset + '%'
44664                     };
44665                 }
44666             }
44667
44668             function reverse(p) {
44669                 var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
44670                 return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
44671             }
44672
44673             function lineString(points) {
44674                 return 'M' + points.join('L');
44675             }
44676
44677             function subpath(points, from, to) {
44678                 var sofar = 0;
44679                 var start, end, i0, i1;
44680
44681                 for (var i = 0; i < points.length - 1; i++) {
44682                     var a = points[i];
44683                     var b = points[i + 1];
44684                     var current = geoVecLength(a, b);
44685                     var portion;
44686                     if (!start && sofar + current >= from) {
44687                         portion = (from - sofar) / current;
44688                         start = [
44689                             a[0] + portion * (b[0] - a[0]),
44690                             a[1] + portion * (b[1] - a[1])
44691                         ];
44692                         i0 = i + 1;
44693                     }
44694                     if (!end && sofar + current >= to) {
44695                         portion = (to - sofar) / current;
44696                         end = [
44697                             a[0] + portion * (b[0] - a[0]),
44698                             a[1] + portion * (b[1] - a[1])
44699                         ];
44700                         i1 = i + 1;
44701                     }
44702                     sofar += current;
44703                 }
44704
44705                 var result = points.slice(i0, i1);
44706                 result.unshift(start);
44707                 result.push(end);
44708                 return result;
44709             }
44710         }
44711
44712
44713         function getAreaLabel(entity, width, height) {
44714             var centroid = path.centroid(entity.asGeoJSON(graph, true));
44715             var extent = entity.extent(graph);
44716             var areaWidth = projection$$1(extent[1])[0] - projection$$1(extent[0])[0];
44717
44718             if (isNaN(centroid[0]) || areaWidth < 20) return;
44719
44720             var preset = context.presets().match(entity, context.graph());
44721             var picon = preset && preset.icon;
44722             var iconSize = 17;
44723             var padding = 2;
44724             var p = {};
44725
44726             if (picon) {  // icon and label..
44727                 if (addIcon()) {
44728                     addLabel(iconSize + padding);
44729                     return p;
44730                 }
44731             } else {   // label only..
44732                 if (addLabel(0)) {
44733                     return p;
44734                 }
44735             }
44736
44737
44738             function addIcon() {
44739                 var iconX = centroid[0] - (iconSize / 2);
44740                 var iconY = centroid[1] - (iconSize / 2);
44741                 var bbox = {
44742                     minX: iconX,
44743                     minY: iconY,
44744                     maxX: iconX + iconSize,
44745                     maxY: iconY + iconSize
44746                 };
44747
44748                 if (tryInsert([bbox], entity.id + 'I', true)) {
44749                     p.transform = 'translate(' + iconX + ',' + iconY + ')';
44750                     return true;
44751                 }
44752                 return false;
44753             }
44754
44755             function addLabel(yOffset) {
44756                 if (width && areaWidth >= width + 20) {
44757                     var labelX = centroid[0];
44758                     var labelY = centroid[1] + yOffset;
44759                     var bbox = {
44760                         minX: labelX - (width / 2) - padding,
44761                         minY: labelY - (height / 2) - padding,
44762                         maxX: labelX + (width / 2) + padding,
44763                         maxY: labelY + (height / 2) + padding
44764                     };
44765
44766                     if (tryInsert([bbox], entity.id, true)) {
44767                         p.x = labelX;
44768                         p.y = labelY;
44769                         p.textAnchor = 'middle';
44770                         p.height = height;
44771                         return true;
44772                     }
44773                 }
44774                 return false;
44775             }
44776         }
44777
44778
44779         // force insert a singular bounding box
44780         // singular box only, no array, id better be unique
44781         function doInsert(bbox, id) {
44782             bbox.id = id;
44783
44784             var oldbox = _entitybboxes[id];
44785             if (oldbox) {
44786                 _rdrawn.remove(oldbox);
44787             }
44788             _entitybboxes[id] = bbox;
44789             _rdrawn.insert(bbox);
44790         }
44791
44792
44793         function tryInsert(bboxes, id, saveSkipped) {
44794             var skipped = false;
44795
44796             for (var i = 0; i < bboxes.length; i++) {
44797                 var bbox = bboxes[i];
44798                 bbox.id = id;
44799
44800                 // Check that label is visible
44801                 if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
44802                     skipped = true;
44803                     break;
44804                 }
44805                 if (_rdrawn.collides(bbox)) {
44806                     skipped = true;
44807                     break;
44808                 }
44809             }
44810
44811             _entitybboxes[id] = bboxes;
44812
44813             if (skipped) {
44814                 if (saveSkipped) {
44815                     _rskipped.load(bboxes);
44816                 }
44817             } else {
44818                 _rdrawn.load(bboxes);
44819             }
44820
44821             return !skipped;
44822         }
44823
44824
44825         var layer = selection.selectAll('.layer-labels');
44826         var halo = layer.selectAll('.layer-labels-halo');
44827         var label = layer.selectAll('.layer-labels-label');
44828         var debug = layer.selectAll('.layer-labels-debug');
44829
44830         // points
44831         drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
44832         drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
44833
44834         // lines
44835         drawLinePaths(halo, labelled.line, filter, '', positions.line);
44836         drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
44837         drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
44838
44839         // areas
44840         drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
44841         drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
44842         drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
44843         drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
44844
44845         // debug
44846         drawCollisionBoxes(debug, _rskipped, 'debug-skipped');
44847         drawCollisionBoxes(debug, _rdrawn, 'debug-drawn');
44848
44849         layer.call(filterLabels);
44850     }
44851
44852
44853     function filterLabels(selection) {
44854         var layers = selection
44855             .selectAll('.layer-labels-label, .layer-labels-halo');
44856
44857         layers.selectAll('.nolabel')
44858             .classed('nolabel', false);
44859
44860         var mouse = context.mouse();
44861         var graph = context.graph();
44862         var selectedIDs = context.selectedIDs();
44863         var ids = [];
44864         var pad, bbox;
44865
44866         // hide labels near the mouse
44867         if (mouse) {
44868             pad = 20;
44869             bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
44870             ids.push.apply(ids, map$3(_rdrawn.search(bbox), 'id'));
44871         }
44872
44873         // hide labels on selected nodes (they look weird when dragging / haloed)
44874         for (var i = 0; i < selectedIDs.length; i++) {
44875             var entity = graph.hasEntity(selectedIDs[i]);
44876             if (entity && entity.type === 'node') {
44877                 ids.push(selectedIDs[i]);
44878             }
44879         }
44880
44881         layers.selectAll(utilEntitySelector(ids))
44882             .classed('nolabel', true);
44883
44884
44885         // draw the mouse bbox if debugging is on..
44886         var debug = selection.selectAll('.layer-labels-debug');
44887         var gj = [];
44888         if (context.getDebug('collision')) {
44889             gj = bbox ? [{
44890                 type: 'Polygon',
44891                 coordinates: [[
44892                     [bbox.minX, bbox.minY],
44893                     [bbox.maxX, bbox.minY],
44894                     [bbox.maxX, bbox.maxY],
44895                     [bbox.minX, bbox.maxY],
44896                     [bbox.minX, bbox.minY]
44897                 ]]
44898             }] : [];
44899         }
44900
44901         var box = debug.selectAll('.debug-mouse')
44902             .data(gj);
44903
44904         // exit
44905         box.exit()
44906             .remove();
44907
44908         // enter/update
44909         box.enter()
44910             .append('path')
44911             .attr('class', 'debug debug-mouse yellow')
44912             .merge(box)
44913             .attr('d', d3_geoPath());
44914     }
44915
44916
44917     var throttleFilterLabels = throttle(utilCallWhenIdle(filterLabels), 100);
44918
44919
44920     drawLabels.observe = function(selection) {
44921         var listener = function() { throttleFilterLabels(selection); };
44922         selection.on('mousemove.hidelabels', listener);
44923         context.on('enter.hidelabels', listener);
44924     };
44925
44926
44927     drawLabels.off = function(selection) {
44928         throttleFilterLabels.cancel();
44929         selection.on('mousemove.hidelabels', null);
44930         context.on('enter.hidelabels', null);
44931     };
44932
44933
44934     return drawLabels;
44935 }
44936
44937 function svgMapillaryImages$$1(projection, context, dispatch) {
44938     var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
44939     var minZoom = 12;
44940     var minMarkerZoom = 16;
44941     var minViewfieldZoom = 18;
44942     var layer = d3_select(null);
44943     var _mapillary;
44944
44945
44946     function init() {
44947         if (svgMapillaryImages$$1.initialized) return;  // run once
44948         svgMapillaryImages$$1.enabled = false;
44949         svgMapillaryImages$$1.initialized = true;
44950     }
44951
44952
44953     function getService() {
44954         if (services.mapillary && !_mapillary) {
44955             _mapillary = services.mapillary;
44956             _mapillary.event.on('loadedImages', throttledRedraw);
44957         } else if (!services.mapillary && _mapillary) {
44958             _mapillary = null;
44959         }
44960
44961         return _mapillary;
44962     }
44963
44964
44965     function showLayer() {
44966         var service = getService();
44967         if (!service) return;
44968
44969         service.loadViewer(context);
44970         editOn();
44971
44972         layer
44973             .style('opacity', 0)
44974             .transition()
44975             .duration(250)
44976             .style('opacity', 1)
44977             .on('end', function () { dispatch.call('change'); });
44978     }
44979
44980
44981     function hideLayer() {
44982         var service = getService();
44983         if (service) {
44984             service.hideViewer();
44985         }
44986
44987         throttledRedraw.cancel();
44988
44989         layer
44990             .transition()
44991             .duration(250)
44992             .style('opacity', 0)
44993             .on('end', editOff);
44994     }
44995
44996
44997     function editOn() {
44998         layer.style('display', 'block');
44999     }
45000
45001
45002     function editOff() {
45003         layer.selectAll('.viewfield-group').remove();
45004         layer.style('display', 'none');
45005     }
45006
45007
45008     function click(d) {
45009         var service = getService();
45010         if (!service) return;
45011
45012         service
45013             .selectImage(d)
45014             .updateViewer(d.key, context)
45015             .showViewer();
45016
45017         context.map().centerEase(d.loc);
45018     }
45019
45020
45021     function mouseover(d) {
45022         var service = getService();
45023         if (service) service.setStyles(d);
45024     }
45025
45026
45027     function mouseout() {
45028         var service = getService();
45029         if (service) service.setStyles(null);
45030     }
45031
45032
45033     function transform(d) {
45034         var t = svgPointTransform(projection)(d);
45035         if (d.ca) {
45036             t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
45037         }
45038         return t;
45039     }
45040
45041
45042     function update() {
45043         var viewer = d3_select('#photoviewer');
45044         var selected = viewer.empty() ? undefined : viewer.datum();
45045
45046         var z = ~~context.map().zoom();
45047         var showMarkers = (z >= minMarkerZoom);
45048         var showViewfields = (z >= minViewfieldZoom);
45049
45050         var service = getService();
45051         var sequences = (service ? service.sequences(projection) : []);
45052         var images = (service && showMarkers ? service.images(projection) : []);
45053
45054         var traces = layer.selectAll('.sequences').selectAll('.sequence')
45055             .data(sequences, function(d) { return d.properties.key; });
45056
45057         // exit
45058         traces.exit()
45059             .remove();
45060
45061         // enter/update
45062         traces = traces.enter()
45063             .append('path')
45064             .attr('class', 'sequence')
45065             .merge(traces)
45066             .attr('d', svgPath(projection).geojson);
45067
45068
45069         var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
45070             .data(images, function(d) { return d.key; });
45071
45072         // exit
45073         groups.exit()
45074             .remove();
45075
45076         // enter
45077         var groupsEnter = groups.enter()
45078             .append('g')
45079             .attr('class', 'viewfield-group')
45080             .on('mouseover', mouseover)
45081             .on('mouseout', mouseout)
45082             .on('click', click);
45083
45084         groupsEnter
45085             .append('g')
45086             .attr('class', 'viewfield-scale');
45087
45088         // update
45089         var markers = groups
45090             .merge(groupsEnter)
45091             .sort(function(a, b) {
45092                 return (a === selected) ? 1
45093                     : (b === selected) ? -1
45094                     : b.loc[1] - a.loc[1];  // sort Y
45095             })
45096             .attr('transform', transform)
45097             .select('.viewfield-scale');
45098
45099
45100         markers.selectAll('circle')
45101             .data([0])
45102             .enter()
45103             .append('circle')
45104             .attr('dx', '0')
45105             .attr('dy', '0')
45106             .attr('r', '6');
45107
45108         var viewfields = markers.selectAll('.viewfield')
45109             .data(showViewfields ? [0] : []);
45110
45111         viewfields.exit()
45112             .remove();
45113
45114         viewfields.enter()               // viewfields may or may not be drawn...
45115             .insert('path', 'circle')    // but if they are, draw below the circles
45116             .attr('class', 'viewfield')
45117             .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
45118             .attr('d', viewfieldPath);
45119
45120         function viewfieldPath() {
45121             var d = this.parentNode.__data__;
45122             if (d.pano) {
45123                 return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
45124             } else {
45125                 return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
45126             }
45127         }
45128     }
45129
45130
45131     function drawImages(selection$$1) {
45132         var enabled = svgMapillaryImages$$1.enabled,
45133             service = getService();
45134
45135         layer = selection$$1.selectAll('.layer-mapillary-images')
45136             .data(service ? [0] : []);
45137
45138         layer.exit()
45139             .remove();
45140
45141         var layerEnter = layer.enter()
45142             .append('g')
45143             .attr('class', 'layer-mapillary-images')
45144             .style('display', enabled ? 'block' : 'none');
45145
45146         layerEnter
45147             .append('g')
45148             .attr('class', 'sequences');
45149
45150         layerEnter
45151             .append('g')
45152             .attr('class', 'markers');
45153
45154         layer = layerEnter
45155             .merge(layer);
45156
45157         if (enabled) {
45158             if (service && ~~context.map().zoom() >= minZoom) {
45159                 editOn();
45160                 update();
45161                 service.loadImages(projection);
45162             } else {
45163                 editOff();
45164             }
45165         }
45166     }
45167
45168
45169     drawImages.enabled = function(_) {
45170         if (!arguments.length) return svgMapillaryImages$$1.enabled;
45171         svgMapillaryImages$$1.enabled = _;
45172         if (svgMapillaryImages$$1.enabled) {
45173             showLayer();
45174         } else {
45175             hideLayer();
45176         }
45177         dispatch.call('change');
45178         return this;
45179     };
45180
45181
45182     drawImages.supported = function() {
45183         return !!getService();
45184     };
45185
45186
45187     init();
45188     return drawImages;
45189 }
45190
45191 function svgMapillarySigns(projection, context, dispatch) {
45192     var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
45193     var minZoom = 12;
45194     var layer = d3_select(null);
45195     var _mapillary;
45196
45197
45198     function init() {
45199         if (svgMapillarySigns.initialized) return;  // run once
45200         svgMapillarySigns.enabled = false;
45201         svgMapillarySigns.initialized = true;
45202     }
45203
45204
45205     function getService() {
45206         if (services.mapillary && !_mapillary) {
45207             _mapillary = services.mapillary;
45208             _mapillary.event.on('loadedSigns', throttledRedraw);
45209         } else if (!services.mapillary && _mapillary) {
45210             _mapillary = null;
45211         }
45212         return _mapillary;
45213     }
45214
45215
45216     function showLayer() {
45217         var service = getService();
45218         if (!service) return;
45219
45220         service.loadViewer(context);
45221         editOn();
45222     }
45223
45224
45225     function hideLayer() {
45226         throttledRedraw.cancel();
45227         editOff();
45228     }
45229
45230
45231     function editOn() {
45232         layer.style('display', 'block');
45233     }
45234
45235
45236     function editOff() {
45237         layer.selectAll('.icon-sign').remove();
45238         layer.style('display', 'none');
45239     }
45240
45241
45242     function click(d) {
45243         var service = getService();
45244         if (!service) return;
45245
45246         context.map().centerEase(d.loc);
45247
45248         var selected = service.getSelectedImage();
45249         var selectedImageKey = selected && selected.key;
45250         var imageKey;
45251
45252         // Pick one of the images the sign was detected in,
45253         // preference given to an image already selected.
45254         d.detections.forEach(function(detection) {
45255             if (!imageKey || selectedImageKey === detection.image_key) {
45256                 imageKey = detection.image_key;
45257             }
45258         });
45259
45260         service
45261             .selectImage(null, imageKey)
45262             .updateViewer(imageKey, context)
45263             .showViewer();
45264     }
45265
45266
45267     function update() {
45268         var service = getService();
45269         var data = (service ? service.signs(projection) : []);
45270         var viewer = d3_select('#photoviewer');
45271         var selected = viewer.empty() ? undefined : viewer.datum();
45272         var selectedImageKey = selected && selected.key;
45273
45274         var signs = layer.selectAll('.icon-sign')
45275             .data(data, function(d) { return d.key; });
45276
45277         signs.exit()
45278             .remove();
45279
45280         var enter = signs.enter()
45281             .append('foreignObject')
45282             .attr('class', 'icon-sign')
45283             .attr('width', '24px')      // for Firefox
45284             .attr('height', '24px')     // for Firefox
45285             .classed('selected', function(d) {
45286                 return some(d.detections, function(detection) {
45287                     return detection.image_key === selectedImageKey;
45288                 });
45289             })
45290             .on('click', click);
45291
45292         enter
45293             .append('xhtml:body')
45294             .attr('class', 'icon-sign-body')
45295             .html(service.signHTML);
45296
45297         signs
45298             .merge(enter)
45299             .attr('x', function(d) { return projection(d.loc)[0] - 12; })   // offset by -12px to
45300             .attr('y', function(d) { return projection(d.loc)[1] - 12; });  // center signs on loc
45301     }
45302
45303
45304     function drawSigns(selection$$1) {
45305         var enabled = svgMapillarySigns.enabled,
45306             service = getService();
45307
45308         layer = selection$$1.selectAll('.layer-mapillary-signs')
45309             .data(service ? [0] : []);
45310
45311         layer.exit()
45312             .remove();
45313
45314         layer = layer.enter()
45315             .append('g')
45316             .attr('class', 'layer-mapillary-signs')
45317             .style('display', enabled ? 'block' : 'none')
45318             .merge(layer);
45319
45320         if (enabled) {
45321             if (service && ~~context.map().zoom() >= minZoom) {
45322                 editOn();
45323                 update();
45324                 service.loadSigns(context, projection);
45325             } else {
45326                 editOff();
45327             }
45328         }
45329     }
45330
45331
45332     drawSigns.enabled = function(_) {
45333         if (!arguments.length) return svgMapillarySigns.enabled;
45334         svgMapillarySigns.enabled = _;
45335         if (svgMapillarySigns.enabled) {
45336             showLayer();
45337         } else {
45338             hideLayer();
45339         }
45340         dispatch.call('change');
45341         return this;
45342     };
45343
45344
45345     drawSigns.supported = function() {
45346         var service = getService();
45347         return (service && service.signsSupported());
45348     };
45349
45350
45351     init();
45352     return drawSigns;
45353 }
45354
45355 function svgOpenstreetcamImages$$1(projection, context, dispatch) {
45356     var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
45357     var minZoom = 12;
45358     var minMarkerZoom = 16;
45359     var minViewfieldZoom = 18;
45360     var layer = d3_select(null);
45361     var _openstreetcam;
45362
45363
45364     function init() {
45365         if (svgOpenstreetcamImages$$1.initialized) return;  // run once
45366         svgOpenstreetcamImages$$1.enabled = false;
45367         svgOpenstreetcamImages$$1.initialized = true;
45368     }
45369
45370
45371     function getService() {
45372         if (services.openstreetcam && !_openstreetcam) {
45373             _openstreetcam = services.openstreetcam;
45374             _openstreetcam.event.on('loadedImages', throttledRedraw);
45375         } else if (!services.openstreetcam && _openstreetcam) {
45376             _openstreetcam = null;
45377         }
45378
45379         return _openstreetcam;
45380     }
45381
45382
45383     function showLayer() {
45384         var service = getService();
45385         if (!service) return;
45386
45387         service.loadViewer(context);
45388         editOn();
45389
45390         layer
45391             .style('opacity', 0)
45392             .transition()
45393             .duration(250)
45394             .style('opacity', 1)
45395             .on('end', function () { dispatch.call('change'); });
45396     }
45397
45398
45399     function hideLayer() {
45400         var service = getService();
45401         if (service) {
45402             service.hideViewer();
45403         }
45404
45405         throttledRedraw.cancel();
45406
45407         layer
45408             .transition()
45409             .duration(250)
45410             .style('opacity', 0)
45411             .on('end', editOff);
45412     }
45413
45414
45415     function editOn() {
45416         layer.style('display', 'block');
45417     }
45418
45419
45420     function editOff() {
45421         layer.selectAll('.viewfield-group').remove();
45422         layer.style('display', 'none');
45423     }
45424
45425
45426     function click(d) {
45427         var service = getService();
45428         if (!service) return;
45429
45430         service
45431             .selectImage(d)
45432             .updateViewer(d)
45433             .showViewer();
45434
45435         context.map().centerEase(d.loc);
45436     }
45437
45438
45439     function mouseover(d) {
45440         var service = getService();
45441         if (service) service.setStyles(d);
45442     }
45443
45444
45445     function mouseout() {
45446         var service = getService();
45447         if (service) service.setStyles(null);
45448     }
45449
45450
45451     function transform(d) {
45452         var t = svgPointTransform(projection)(d);
45453         if (d.ca) {
45454             t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
45455         }
45456         return t;
45457     }
45458
45459
45460     function update() {
45461         var viewer = d3_select('#photoviewer');
45462         var selected = viewer.empty() ? undefined : viewer.datum();
45463
45464         var z = ~~context.map().zoom();
45465         var showMarkers = (z >= minMarkerZoom);
45466         var showViewfields = (z >= minViewfieldZoom);
45467
45468         var service = getService();
45469         var sequences = (service ? service.sequences(projection) : []);
45470         var images = (service && showMarkers ? service.images(projection) : []);
45471
45472         var traces = layer.selectAll('.sequences').selectAll('.sequence')
45473             .data(sequences, function(d) { return d.properties.key; });
45474
45475         // exit
45476         traces.exit()
45477             .remove();
45478
45479         // enter/update
45480         traces = traces.enter()
45481             .append('path')
45482             .attr('class', 'sequence')
45483             .merge(traces)
45484             .attr('d', svgPath(projection).geojson);
45485
45486
45487         var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
45488             .data(images, function(d) { return d.key; });
45489
45490         // exit
45491         groups.exit()
45492             .remove();
45493
45494         // enter
45495         var groupsEnter = groups.enter()
45496             .append('g')
45497             .attr('class', 'viewfield-group')
45498             .on('mouseover', mouseover)
45499             .on('mouseout', mouseout)
45500             .on('click', click);
45501
45502         groupsEnter
45503             .append('g')
45504             .attr('class', 'viewfield-scale');
45505
45506         // update
45507         var markers = groups
45508             .merge(groupsEnter)
45509             .sort(function(a, b) {
45510                 return (a === selected) ? 1
45511                     : (b === selected) ? -1
45512                     : b.loc[1] - a.loc[1];  // sort Y
45513             })
45514             .attr('transform', transform)
45515             .select('.viewfield-scale');
45516
45517
45518         markers.selectAll('circle')
45519             .data([0])
45520             .enter()
45521             .append('circle')
45522             .attr('dx', '0')
45523             .attr('dy', '0')
45524             .attr('r', '6');
45525
45526         var viewfields = markers.selectAll('.viewfield')
45527             .data(showViewfields ? [0] : []);
45528
45529         viewfields.exit()
45530             .remove();
45531
45532         viewfields.enter()               // viewfields may or may not be drawn...
45533             .insert('path', 'circle')    // but if they are, draw below the circles
45534             .attr('class', 'viewfield')
45535             .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
45536             .attr('d', 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z');
45537     }
45538
45539
45540     function drawImages(selection$$1) {
45541         var enabled = svgOpenstreetcamImages$$1.enabled,
45542             service = getService();
45543
45544         layer = selection$$1.selectAll('.layer-openstreetcam-images')
45545             .data(service ? [0] : []);
45546
45547         layer.exit()
45548             .remove();
45549
45550         var layerEnter = layer.enter()
45551             .append('g')
45552             .attr('class', 'layer-openstreetcam-images')
45553             .style('display', enabled ? 'block' : 'none');
45554
45555         layerEnter
45556             .append('g')
45557             .attr('class', 'sequences');
45558
45559         layerEnter
45560             .append('g')
45561             .attr('class', 'markers');
45562
45563         layer = layerEnter
45564             .merge(layer);
45565
45566         if (enabled) {
45567             if (service && ~~context.map().zoom() >= minZoom) {
45568                 editOn();
45569                 update();
45570                 service.loadImages(projection);
45571             } else {
45572                 editOff();
45573             }
45574         }
45575     }
45576
45577
45578     drawImages.enabled = function(_) {
45579         if (!arguments.length) return svgOpenstreetcamImages$$1.enabled;
45580         svgOpenstreetcamImages$$1.enabled = _;
45581         if (svgOpenstreetcamImages$$1.enabled) {
45582             showLayer();
45583         } else {
45584             hideLayer();
45585         }
45586         dispatch.call('change');
45587         return this;
45588     };
45589
45590
45591     drawImages.supported = function() {
45592         return !!getService();
45593     };
45594
45595
45596     init();
45597     return drawImages;
45598 }
45599
45600 function svgOsm(projection, context, dispatch) {
45601     var enabled = true;
45602
45603
45604     function drawOsm(selection) {
45605         selection.selectAll('.layer-osm')
45606             .data(['covered', 'areas', 'lines', 'points', 'labels'])
45607             .enter()
45608             .append('g')
45609             .attr('class', function(d) { return 'layer-osm layer-' + d; });
45610
45611         selection.selectAll('.layer-areas').selectAll('.layer-areas-group')
45612             .data(['areas', 'targets'])
45613             .enter()
45614             .append('g')
45615             .attr('class', function(d) { return 'layer-areas-group layer-areas-' + d; });
45616
45617         selection.selectAll('.layer-lines').selectAll('.layer-lines-group')
45618             .data(['lines', 'targets'])
45619             .enter()
45620             .append('g')
45621             .attr('class', function(d) { return 'layer-lines-group layer-lines-' + d; });
45622
45623         selection.selectAll('.layer-points').selectAll('.layer-points-group')
45624             .data(['points', 'midpoints', 'vertices', 'turns', 'targets'])
45625             .enter()
45626             .append('g')
45627             .attr('class', function(d) { return 'layer-points-group layer-points-' + d; });
45628
45629         selection.selectAll('.layer-labels').selectAll('.layer-labels-group')
45630             .data(['halo', 'label', 'debug'])
45631             .enter()
45632             .append('g')
45633             .attr('class', function(d) { return 'layer-labels-group layer-labels-' + d; });
45634     }
45635
45636
45637     function showLayer() {
45638         var layer = context.surface().selectAll('.data-layer-osm');
45639         layer.interrupt();
45640
45641         layer
45642             .classed('disabled', false)
45643             .style('opacity', 0)
45644             .transition()
45645             .duration(250)
45646             .style('opacity', 1)
45647             .on('end interrupt', function () {
45648                 dispatch.call('change');
45649             });
45650     }
45651
45652
45653     function hideLayer() {
45654         var layer = context.surface().selectAll('.data-layer-osm');
45655         layer.interrupt();
45656
45657         layer
45658             .transition()
45659             .duration(250)
45660             .style('opacity', 0)
45661             .on('end interrupt', function () {
45662                 layer.classed('disabled', true);
45663                 dispatch.call('change');
45664             });
45665     }
45666
45667
45668     drawOsm.enabled = function(_) {
45669         if (!arguments.length) return enabled;
45670         enabled = _;
45671
45672         if (enabled) {
45673             showLayer();
45674         } else {
45675             hideLayer();
45676         }
45677
45678         dispatch.call('change');
45679         return this;
45680     };
45681
45682
45683     return drawOsm;
45684 }
45685
45686 function svgLayers(projection, context) {
45687     var dispatch$$1 = dispatch('change'),
45688         svg = d3_select(null),
45689         layers = [
45690             { id: 'osm', layer: svgOsm(projection, context, dispatch$$1) },
45691             { id: 'gpx', layer: svgGpx$$1(projection, context, dispatch$$1) },
45692             { id: 'mapillary-images', layer: svgMapillaryImages$$1(projection, context, dispatch$$1) },
45693             { id: 'mapillary-signs',  layer: svgMapillarySigns(projection, context, dispatch$$1) },
45694             { id: 'openstreetcam-images', layer: svgOpenstreetcamImages$$1(projection, context, dispatch$$1) },
45695             { id: 'debug', layer: svgDebug$$1(projection, context, dispatch$$1) }
45696         ];
45697
45698
45699     function drawLayers(selection$$1) {
45700         svg = selection$$1.selectAll('.surface')
45701             .data([0]);
45702
45703         svg = svg.enter()
45704             .append('svg')
45705             .attr('class', 'surface')
45706             .merge(svg);
45707
45708         var defs = svg.selectAll('.surface-defs')
45709             .data([0]);
45710
45711         defs.enter()
45712             .append('defs')
45713             .attr('class', 'surface-defs');
45714
45715         var groups = svg.selectAll('.data-layer')
45716             .data(layers);
45717
45718         groups.exit()
45719             .remove();
45720
45721         groups.enter()
45722             .append('g')
45723             .attr('class', function(d) { return 'data-layer data-layer-' + d.id; })
45724             .merge(groups)
45725             .each(function(d) { d3_select(this).call(d.layer); });
45726     }
45727
45728
45729     drawLayers.all = function() {
45730         return layers;
45731     };
45732
45733
45734     drawLayers.layer = function(id) {
45735         var obj = find$1(layers, function(o) {return o.id === id;});
45736         return obj && obj.layer;
45737     };
45738
45739
45740     drawLayers.only = function(what) {
45741         var arr = [].concat(what);
45742         drawLayers.remove(difference(map$3(layers, 'id'), arr));
45743         return this;
45744     };
45745
45746
45747     drawLayers.remove = function(what) {
45748         var arr = [].concat(what);
45749         arr.forEach(function(id) {
45750             layers = reject(layers, function(o) {return o.id === id;});
45751         });
45752         dispatch$$1.call('change');
45753         return this;
45754     };
45755
45756
45757     drawLayers.add = function(what) {
45758         var arr = [].concat(what);
45759         arr.forEach(function(obj) {
45760             if ('id' in obj && 'layer' in obj) {
45761                 layers.push(obj);
45762             }
45763         });
45764         dispatch$$1.call('change');
45765         return this;
45766     };
45767
45768
45769     drawLayers.dimensions = function(_) {
45770         if (!arguments.length) return utilGetDimensions(svg);
45771         utilSetDimensions(svg, _);
45772         return this;
45773     };
45774
45775
45776     return utilRebind(drawLayers, dispatch$$1, 'on');
45777 }
45778
45779 function svgLines$$1(projection, context) {
45780     var detected = utilDetect();
45781
45782     var highway_stack = {
45783         motorway: 0,
45784         motorway_link: 1,
45785         trunk: 2,
45786         trunk_link: 3,
45787         primary: 4,
45788         primary_link: 5,
45789         secondary: 6,
45790         tertiary: 7,
45791         unclassified: 8,
45792         residential: 9,
45793         service: 10,
45794         footway: 11
45795     };
45796
45797
45798     function drawTargets(selection, graph, entities, filter$$1) {
45799         var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
45800         var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
45801         var getPath = svgPath(projection).geojson;
45802         var activeID = context.activeID();
45803
45804         // The targets and nopes will be MultiLineString sub-segments of the ways
45805         var data = { targets: [], nopes: [] };
45806
45807         entities.forEach(function(way) {
45808             var features = svgSegmentWay(way, graph, activeID);
45809             data.targets.push.apply(data.targets, features.passive);
45810             data.nopes.push.apply(data.nopes, features.active);
45811         });
45812
45813
45814         // Targets allow hover and vertex snapping
45815         var targetData = data.targets.filter(getPath);
45816         var targets = selection.selectAll('.line.target-allowed')
45817             .filter(function(d) { return filter$$1(d.properties.entity); })
45818             .data(targetData, function key(d) { return d.id; });
45819
45820         // exit
45821         targets.exit()
45822             .remove();
45823
45824         // enter/update
45825         targets.enter()
45826             .append('path')
45827             .merge(targets)
45828             .attr('d', getPath)
45829             .attr('class', function(d) { return 'way line target target-allowed ' + targetClass + d.id; });
45830
45831
45832         // NOPE
45833         var nopeData = data.nopes.filter(getPath);
45834         var nopes = selection.selectAll('.line.target-nope')
45835             .filter(function(d) { return filter$$1(d.properties.entity); })
45836             .data(nopeData, function key(d) { return d.id; });
45837
45838         // exit
45839         nopes.exit()
45840             .remove();
45841
45842         // enter/update
45843         nopes.enter()
45844             .append('path')
45845             .merge(nopes)
45846             .attr('d', getPath)
45847             .attr('class', function(d) { return 'way line target target-nope ' + nopeClass + d.id; });
45848     }
45849
45850
45851     function drawLines(selection, graph, entities, filter$$1) {
45852
45853         function waystack(a, b) {
45854             var selected = context.selectedIDs();
45855             var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
45856             var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
45857
45858             if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
45859             if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
45860             return scoreA - scoreB;
45861         }
45862
45863
45864         function drawLineGroup(selection, klass, isSelected) {
45865             // Note: Don't add `.selected` class in draw modes
45866             var mode = context.mode();
45867             var isDrawing = mode && /^draw/.test(mode.id);
45868             var selectedClass = (!isDrawing && isSelected) ? 'selected ' : '';
45869
45870             var lines = selection
45871                 .selectAll('path')
45872                 .filter(filter$$1)
45873                 .data(getPathData(isSelected), osmEntity$$1.key);
45874
45875             lines.exit()
45876                 .remove();
45877
45878             // Optimization: Call expensive TagClasses only on enter selection. This
45879             // works because osmEntity.key is defined to include the entity v attribute.
45880             lines.enter()
45881                 .append('path')
45882                 .attr('class', function(d) {
45883                     var oldMPClass = oldMultiPolygonOuters[d.id] ? 'old-multipolygon ' : '';
45884                     return 'way line ' + klass + ' ' + selectedClass + oldMPClass + d.id;
45885                 })
45886                 .call(svgTagClasses())
45887                 .merge(lines)
45888                 .sort(waystack)
45889                 .attr('d', getPath)
45890                 .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
45891
45892             return selection;
45893         }
45894
45895
45896         function getPathData(isSelected) {
45897             return function() {
45898                 var layer = this.parentNode.__data__;
45899                 var data = pathdata[layer] || [];
45900                 return data.filter(function(d) {
45901                     if (isSelected)
45902                         return context.selectedIDs().indexOf(d.id) !== -1;
45903                     else
45904                         return context.selectedIDs().indexOf(d.id) === -1;
45905                 });
45906             };
45907         }
45908
45909
45910         var getPath = svgPath(projection, graph);
45911         var ways = [];
45912         var pathdata = {};
45913         var onewaydata = {};
45914         var oldMultiPolygonOuters = {};
45915
45916         for (var i = 0; i < entities.length; i++) {
45917             var entity = entities[i];
45918             var outer = osmSimpleMultipolygonOuterMember(entity, graph);
45919             if (outer) {
45920                 ways.push(entity.mergeTags(outer.tags));
45921                 oldMultiPolygonOuters[outer.id] = true;
45922             } else if (entity.geometry(graph) === 'line') {
45923                 ways.push(entity);
45924             }
45925         }
45926
45927         ways = ways.filter(getPath);
45928         pathdata = groupBy(ways, function(way) { return way.layer(); });
45929
45930         forOwn(pathdata, function(v, k) {
45931             var arr = filter(v, function(d) { return d.isOneWay(); });
45932             onewaydata[k] = flatten(map$3(arr, svgOneWaySegments(projection, graph, 35)));
45933         });
45934
45935
45936         var covered = selection.selectAll('.layer-covered');                      // under areas
45937         var uncovered = selection.selectAll('.layer-lines .layer-lines-lines');   // over areas
45938
45939         [covered, uncovered].forEach(function(selection) {
45940             var range$$1 = (selection === covered ? d3_range(-10,0) : d3_range(0,11));
45941             var layergroup = selection
45942                 .selectAll('g.layergroup')
45943                 .data(range$$1);
45944
45945             layergroup = layergroup.enter()
45946                 .append('g')
45947                 .attr('class', function(d) { return 'layergroup layer' + String(d); })
45948                 .merge(layergroup);
45949
45950             layergroup
45951                 .selectAll('g.linegroup')
45952                 .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
45953                 .enter()
45954                 .append('g')
45955                 .attr('class', function(d) { return 'linegroup line-' + d; });
45956
45957             layergroup.selectAll('g.line-shadow')
45958                 .call(drawLineGroup, 'shadow', false);
45959             layergroup.selectAll('g.line-casing')
45960                 .call(drawLineGroup, 'casing', false);
45961             layergroup.selectAll('g.line-stroke')
45962                 .call(drawLineGroup, 'stroke', false);
45963
45964             layergroup.selectAll('g.line-shadow-highlighted')
45965                 .call(drawLineGroup, 'shadow', true);
45966             layergroup.selectAll('g.line-casing-highlighted')
45967                 .call(drawLineGroup, 'casing', true);
45968             layergroup.selectAll('g.line-stroke-highlighted')
45969                 .call(drawLineGroup, 'stroke', true);
45970
45971
45972             var onewaygroup = layergroup
45973                 .selectAll('g.onewaygroup')
45974                 .data(['oneway']);
45975
45976             onewaygroup = onewaygroup.enter()
45977                 .append('g')
45978                 .attr('class', 'onewaygroup')
45979                 .merge(onewaygroup);
45980
45981             var oneways = onewaygroup
45982                 .selectAll('path')
45983                 .filter(filter$$1)
45984                 .data(
45985                     function data() { return onewaydata[this.parentNode.__data__] || []; },
45986                     function key(d) { return [d.id, d.index]; }
45987                 );
45988
45989             oneways.exit()
45990                 .remove();
45991
45992             oneways = oneways.enter()
45993                 .append('path')
45994                 .attr('class', 'oneway')
45995                 .attr('marker-mid', 'url(#oneway-marker)')
45996                 .merge(oneways)
45997                 .attr('d', function(d) { return d.d; });
45998
45999             if (detected.ie) {
46000                 oneways.each(function() { this.parentNode.insertBefore(this, this); });
46001             }
46002         });
46003
46004         // touch targets
46005         selection.selectAll('.layer-lines .layer-lines-targets')
46006             .call(drawTargets, graph, ways, filter$$1);
46007     }
46008
46009
46010     return drawLines;
46011 }
46012
46013 function svgMidpoints$$1(projection, context) {
46014     var targetRadius = 8;
46015
46016     function drawTargets(selection, graph, entities, filter) {
46017         var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
46018         var getTransform = svgPointTransform(projection).geojson;
46019
46020         var data = entities.map(function(midpoint) {
46021             return {
46022                 type: 'Feature',
46023                 id: midpoint.id,
46024                 properties: {
46025                     target: true,
46026                     entity: midpoint
46027                 },
46028                 geometry: {
46029                     type: 'Point',
46030                     coordinates: midpoint.loc
46031                 }
46032             };
46033         });
46034
46035         var targets = selection.selectAll('.midpoint.target')
46036             .filter(function(d) { return filter(d.properties.entity); })
46037             .data(data, function key(d) { return d.id; });
46038
46039         // exit
46040         targets.exit()
46041             .remove();
46042
46043         // enter/update
46044         targets.enter()
46045             .append('circle')
46046             .attr('r', targetRadius)
46047             .merge(targets)
46048             .attr('class', function(d) { return 'node midpoint target ' + fillClass + d.id; })
46049             .attr('transform', getTransform);
46050     }
46051
46052
46053     function drawMidpoints(selection, graph, entities, filter, extent) {
46054         var layer = selection.selectAll('.layer-points .layer-points-midpoints');
46055
46056         var mode = context.mode();
46057         if (mode && mode.id !== 'select') {
46058             layer.selectAll('g.midpoint')
46059                 .remove();
46060
46061             selection.selectAll('.layer-points .layer-points-targets .midpoint.target')
46062                 .remove();
46063
46064             return;
46065         }
46066
46067         var poly = extent.polygon();
46068         var midpoints = {};
46069
46070         for (var i = 0; i < entities.length; i++) {
46071             var entity = entities[i];
46072
46073             if (entity.type !== 'way')
46074                 continue;
46075             if (!filter(entity))
46076                 continue;
46077             if (context.selectedIDs().indexOf(entity.id) < 0)
46078                 continue;
46079
46080             var nodes = graph.childNodes(entity);
46081             for (var j = 0; j < nodes.length - 1; j++) {
46082
46083                 var a = nodes[j];
46084                 var b = nodes[j + 1];
46085                 var id = [a.id, b.id].sort().join('-');
46086
46087                 if (midpoints[id]) {
46088                     midpoints[id].parents.push(entity);
46089                 } else {
46090                     if (geoVecLength(projection(a.loc), projection(b.loc)) > 40) {
46091                         var point = geoVecInterp(a.loc, b.loc, 0.5);
46092                         var loc = null;
46093
46094                         if (extent.intersects(point)) {
46095                             loc = point;
46096                         } else {
46097                             for (var k = 0; k < 4; k++) {
46098                                 point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
46099                                 if (point &&
46100                                     geoVecLength(projection(a.loc), projection(point)) > 20 &&
46101                                     geoVecLength(projection(b.loc), projection(point)) > 20)
46102                                 {
46103                                     loc = point;
46104                                     break;
46105                                 }
46106                             }
46107                         }
46108
46109                         if (loc) {
46110                             midpoints[id] = {
46111                                 type: 'midpoint',
46112                                 id: id,
46113                                 loc: loc,
46114                                 edge: [a.id, b.id],
46115                                 parents: [entity]
46116                             };
46117                         }
46118                     }
46119                 }
46120             }
46121         }
46122
46123
46124         function midpointFilter(d) {
46125             if (midpoints[d.id])
46126                 return true;
46127
46128             for (var i = 0; i < d.parents.length; i++) {
46129                 if (filter(d.parents[i])) {
46130                     return true;
46131                 }
46132             }
46133
46134             return false;
46135         }
46136
46137
46138         var groups = layer
46139             .selectAll('g.midpoint')
46140             .filter(midpointFilter)
46141             .data(values$1(midpoints), function(d) { return d.id; });
46142
46143         groups.exit()
46144             .remove();
46145
46146         var enter = groups.enter()
46147             .insert('g', ':first-child')
46148             .attr('class', 'midpoint');
46149
46150         enter
46151             .append('polygon')
46152             .attr('points', '-6,8 10,0 -6,-8')
46153             .attr('class', 'shadow');
46154
46155         enter
46156             .append('polygon')
46157             .attr('points', '-3,4 5,0 -3,-4')
46158             .attr('class', 'fill');
46159
46160         groups = groups
46161             .merge(enter)
46162             .attr('transform', function(d) {
46163                 var translate = svgPointTransform(projection);
46164                 var a = graph.entity(d.edge[0]);
46165                 var b = graph.entity(d.edge[1]);
46166                 var angle = geoAngle(a, b, projection) * (180 / Math.PI);
46167                 return translate(d) + ' rotate(' + angle + ')';
46168             })
46169             .call(svgTagClasses().tags(
46170                 function(d) { return d.parents[0].tags; }
46171             ));
46172
46173         // Propagate data bindings.
46174         groups.select('polygon.shadow');
46175         groups.select('polygon.fill');
46176
46177
46178         // Draw touch targets..
46179         selection.selectAll('.layer-points .layer-points-targets')
46180             .call(drawTargets, graph, values$1(midpoints), midpointFilter);
46181     }
46182
46183     return drawMidpoints;
46184 }
46185
46186 // Touch targets control which other vertices we can drag a vertex onto.
46187 //
46188 // - the activeID - nope
46189 // - 1 away (adjacent) to the activeID - yes (vertices will be merged)
46190 // - 2 away from the activeID - nope (would create a self intersecting segment)
46191 // - all others on a linear way - yes
46192 // - all others on a closed way - nope (would create a self intersecting polygon)
46193 //
46194 // returns
46195 // 0 = active vertex - no touch/connect
46196 // 1 = passive vertex - yes touch/connect
46197 // 2 = adjacent vertex - yes but pay attention segmenting a line here
46198 //
46199 function svgPassiveVertex(node, graph, activeID) {
46200     if (!activeID) return 1;
46201     if (activeID === node.id) return 0;
46202
46203     var parents = graph.parentWays(node);
46204
46205     for (var i = 0; i < parents.length; i++) {
46206         var nodes = parents[i].nodes;
46207         var isClosed = parents[i].isClosed();
46208         for (var j = 0; j < nodes.length; j++) {   // find this vertex, look nearby
46209             if (nodes[j] === node.id) {
46210                 var ix1 = j - 2;
46211                 var ix2 = j - 1;
46212                 var ix3 = j + 1;
46213                 var ix4 = j + 2;
46214
46215                 if (isClosed) {  // wraparound if needed
46216                     var max = nodes.length - 1;
46217                     if (ix1 < 0)   ix1 = max + ix1;
46218                     if (ix2 < 0)   ix2 = max + ix2;
46219                     if (ix3 > max) ix3 = ix3 - max;
46220                     if (ix4 > max) ix4 = ix4 - max;
46221                 }
46222
46223                 if (nodes[ix1] === activeID) return 0;        // no - prevent self intersect
46224                 else if (nodes[ix2] === activeID) return 2;   // ok - adjacent
46225                 else if (nodes[ix3] === activeID) return 2;   // ok - adjacent
46226                 else if (nodes[ix4] === activeID) return 0;   // no - prevent self intersect
46227                 else if (isClosed && nodes.indexOf(activeID) !== -1) return 0;  // no - prevent self intersect
46228             }
46229         }
46230     }
46231
46232     return 1;   // ok
46233 }
46234
46235
46236 function svgOneWaySegments(projection$$1, graph, dt) {
46237     return function(entity) {
46238         var i = 0;
46239         var offset = dt;
46240         var segments = [];
46241         var clip = d3_geoIdentity().clipExtent(projection$$1.clipExtent()).stream;
46242         var coordinates = graph.childNodes(entity).map(function(n) { return n.loc; });
46243         var a, b;
46244
46245         if (entity.tags.oneway === '-1') {
46246             coordinates.reverse();
46247         }
46248
46249         var isReversible = (entity.tags.oneway === 'reversible' || entity.tags.oneway === 'alternating');
46250
46251         d3_geoStream({
46252             type: 'LineString',
46253             coordinates: coordinates
46254         }, projection$$1.stream(clip({
46255             lineStart: function() {},
46256             lineEnd: function() { a = null; },
46257             point: function(x, y) {
46258                 b = [x, y];
46259
46260                 if (a) {
46261                     var span = geoVecLength(a, b) - offset;
46262
46263                     if (span >= 0) {
46264                         var heading = geoVecAngle(a, b);
46265                         var dx = dt * Math.cos(heading);
46266                         var dy = dt * Math.sin(heading);
46267                         var p = [
46268                             a[0] + offset * Math.cos(heading),
46269                             a[1] + offset * Math.sin(heading)
46270                         ];
46271
46272                         // gather coordinates
46273                         var coord = [a, p];
46274                         for (span -= dt; span >= 0; span -= dt) {
46275                             p = geoVecAdd(p, [dx, dy]);
46276                             coord.push(p);
46277                         }
46278                         coord.push(b);
46279
46280                         // generate svg paths
46281                         var segment = '';
46282                         var j;
46283
46284                         for (j = 0; j < coord.length; j++) {
46285                             segment += (j === 0 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
46286                         }
46287                         segments.push({ id: entity.id, index: i++, d: segment });
46288
46289                         if (isReversible) {
46290                             segment = '';
46291                             for (j = coord.length - 1; j >= 0; j--) {
46292                                 segment += (j === coord.length - 1 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
46293                             }
46294                             segments.push({ id: entity.id, index: i++, d: segment });
46295                         }
46296                     }
46297
46298                     offset = -span;
46299                 }
46300
46301                 a = b;
46302             }
46303         })));
46304
46305         return segments;
46306     };
46307 }
46308
46309
46310 function svgPath(projection$$1, graph, isArea) {
46311
46312     // Explanation of magic numbers:
46313     // "padding" here allows space for strokes to extend beyond the viewport,
46314     // so that the stroke isn't drawn along the edge of the viewport when
46315     // the shape is clipped.
46316     //
46317     // When drawing lines, pad viewport by 5px.
46318     // When drawing areas, pad viewport by 65px in each direction to allow
46319     // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
46320
46321     var cache = {};
46322     var padding = isArea ? 65 : 5;
46323     var viewport = projection$$1.clipExtent();
46324     var paddedExtent = [
46325         [viewport[0][0] - padding, viewport[0][1] - padding],
46326         [viewport[1][0] + padding, viewport[1][1] + padding]
46327     ];
46328     var clip = d3_geoIdentity().clipExtent(paddedExtent).stream;
46329     var project = projection$$1.stream;
46330     var path = d3_geoPath()
46331         .projection({stream: function(output) { return project(clip(output)); }});
46332
46333     var svgpath = function(entity) {
46334         if (entity.id in cache) {
46335             return cache[entity.id];
46336         } else {
46337             return cache[entity.id] = path(entity.asGeoJSON(graph));
46338         }
46339     };
46340
46341     svgpath.geojson = path;
46342
46343     return svgpath;
46344 }
46345
46346
46347 function svgPointTransform(projection$$1) {
46348     var svgpoint = function(entity) {
46349         // http://jsperf.com/short-array-join
46350         var pt = projection$$1(entity.loc);
46351         return 'translate(' + pt[0] + ',' + pt[1] + ')';
46352     };
46353
46354     svgpoint.geojson = function(d) {
46355         return svgpoint(d.properties.entity);
46356     };
46357
46358     return svgpoint;
46359 }
46360
46361
46362 function svgRelationMemberTags(graph) {
46363     return function(entity) {
46364         var tags = entity.tags;
46365         graph.parentRelations(entity).forEach(function(relation) {
46366             var type = relation.tags.type;
46367             if (type === 'multipolygon' || type === 'boundary') {
46368                 tags = assignIn({}, relation.tags, tags);
46369             }
46370         });
46371         return tags;
46372     };
46373 }
46374
46375
46376 function svgSegmentWay(way, graph, activeID) {
46377     var isActiveWay = (way.nodes.indexOf(activeID) !== -1);
46378     var features = { passive: [], active: [] };
46379     var start = {};
46380     var end = {};
46381     var node, type;
46382
46383     for (var i = 0; i < way.nodes.length; i++) {
46384         node = graph.entity(way.nodes[i]);
46385         type = svgPassiveVertex(node, graph, activeID);
46386         end = { node: node, type: type };
46387
46388         if (start.type !== undefined) {
46389             if (start.node.id === activeID || end.node.id === activeID) {
46390                 // push nothing
46391             } else if (isActiveWay && (start.type === 2 || end.type === 2)) {   // one adjacent vertex
46392                 pushActive(start, end, i);
46393             } else if (start.type === 0 && end.type === 0) {   // both active vertices
46394                 pushActive(start, end, i);
46395             } else {
46396                 pushPassive(start, end, i);
46397             }
46398         }
46399
46400         start = end;
46401     }
46402
46403     return features;
46404
46405
46406     function pushActive(start, end, index) {
46407         features.active.push({
46408             type: 'Feature',
46409             id: way.id + '-' + index + '-nope',
46410             properties: {
46411                 nope: true,
46412                 target: true,
46413                 entity: way,
46414                 nodes: [start.node, end.node],
46415                 index: index
46416             },
46417             geometry: {
46418                 type: 'LineString',
46419                 coordinates: [start.node.loc, end.node.loc]
46420             }
46421         });
46422     }
46423
46424     function pushPassive(start, end, index) {
46425         features.passive.push({
46426             type: 'Feature',
46427             id: way.id + '-' + index,
46428             properties: {
46429                 target: true,
46430                 entity: way,
46431                 nodes: [start.node, end.node],
46432                 index: index
46433             },
46434             geometry: {
46435                 type: 'LineString',
46436                 coordinates: [start.node.loc, end.node.loc]
46437             }
46438         });
46439     }
46440 }
46441
46442 function svgPoints$$1(projection, context) {
46443
46444     function markerPath(selection, klass) {
46445         selection
46446             .attr('class', klass)
46447             .attr('transform', 'translate(-8, -23)')
46448             .attr('d', 'M 17,8 C 17,13 11,21 8.5,23.5 C 6,21 0,13 0,8 C 0,4 4,-0.5 8.5,-0.5 C 13,-0.5 17,4 17,8 z');
46449     }
46450
46451     function sortY(a, b) {
46452         return b.loc[1] - a.loc[1];
46453     }
46454
46455
46456     // Avoid exit/enter if we're just moving stuff around.
46457     // The node will get a new version but we only need to run the update selection.
46458     function fastEntityKey(d) {
46459         var mode = context.mode();
46460         var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
46461         return isMoving ? d.id : osmEntity$$1.key(d);
46462     }
46463
46464
46465     function drawTargets(selection, graph, entities, filter) {
46466         var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
46467         var getTransform = svgPointTransform(projection).geojson;
46468         var activeID = context.activeID();
46469         var data$$1 = [];
46470
46471         entities.forEach(function(node) {
46472             if (activeID === node.id) return;   // draw no target on the activeID
46473
46474             data$$1.push({
46475                 type: 'Feature',
46476                 id: node.id,
46477                 properties: {
46478                     target: true,
46479                     entity: node
46480                 },
46481                 geometry: node.asGeoJSON()
46482             });
46483         });
46484
46485         var targets = selection.selectAll('.point.target')
46486             .filter(function(d) { return filter(d.properties.entity); })
46487             .data(data$$1, function key(d) { return d.id; });
46488
46489         // exit
46490         targets.exit()
46491             .remove();
46492
46493         // enter/update
46494         targets.enter()
46495             .append('rect')
46496             .attr('x', -10)
46497             .attr('y', -26)
46498             .attr('width', 20)
46499             .attr('height', 30)
46500             .merge(targets)
46501             .attr('class', function(d) { return 'node point target ' + fillClass + d.id; })
46502             .attr('transform', getTransform);
46503     }
46504
46505
46506     function drawPoints(selection, graph, entities, filter) {
46507         var wireframe = context.surface().classed('fill-wireframe');
46508         var zoom = geoScaleToZoom(projection.scale());
46509
46510         // points with a direction will render as vertices at higher zooms
46511         function renderAsPoint(entity) {
46512             return entity.geometry(graph) === 'point' &&
46513                 !(zoom >= 18 && entity.directions(graph, projection).length);
46514         }
46515
46516         // all points will render as vertices in wireframe mode too
46517         var points = wireframe ? [] : entities.filter(renderAsPoint);
46518
46519         points.sort(sortY);
46520
46521
46522         var layer = selection.selectAll('.layer-points .layer-points-points');
46523
46524         var groups = layer.selectAll('g.point')
46525             .filter(filter)
46526             .data(points, fastEntityKey);
46527
46528         groups.exit()
46529             .remove();
46530
46531         var enter = groups.enter()
46532             .append('g')
46533             .attr('class', function(d) { return 'node point ' + d.id; })
46534             .order();
46535
46536         enter
46537             .append('path')
46538             .call(markerPath, 'shadow');
46539
46540         enter
46541             .append('ellipse')
46542             .attr('cx', 0.5)
46543             .attr('cy', 1)
46544             .attr('rx', 6.5)
46545             .attr('ry', 3)
46546             .attr('class', 'stroke');
46547
46548         enter
46549             .append('path')
46550             .call(markerPath, 'stroke');
46551
46552         enter
46553             .append('use')
46554             .attr('transform', 'translate(-5, -19)')
46555             .attr('class', 'icon')
46556             .attr('width', '11px')
46557             .attr('height', '11px');
46558
46559         groups = groups
46560             .merge(enter)
46561             .attr('transform', svgPointTransform(projection))
46562             .call(svgTagClasses());
46563
46564         // Selecting the following implicitly
46565         // sets the data (point entity) on the element
46566         groups.select('.shadow');
46567         groups.select('.stroke');
46568         groups.select('.icon')
46569             .attr('xlink:href', function(entity) {
46570                 var preset = context.presets().match(entity, graph);
46571                 var picon = preset && preset.icon;
46572
46573                 if (!picon)
46574                     return '';
46575                 else {
46576                     var isMaki = dataFeatureIcons.indexOf(picon) !== -1;
46577                     return '#' + picon + (isMaki ? '-11' : '');
46578                 }
46579             });
46580
46581
46582         // touch targets
46583         selection.selectAll('.layer-points .layer-points-targets')
46584             .call(drawTargets, graph, points, filter);
46585     }
46586
46587
46588     return drawPoints;
46589 }
46590
46591 function svgTagClasses() {
46592     var primaries = [
46593             'building', 'highway', 'railway', 'waterway', 'aeroway',
46594             'motorway', 'boundary', 'power', 'amenity', 'natural', 'landuse',
46595             'leisure', 'military', 'place'
46596         ],
46597         statuses = [
46598             'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
46599             'razed', 'demolished', 'obliterated', 'intermittent'
46600         ],
46601         secondaries = [
46602             'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
46603             'surface', 'tracktype', 'crossing', 'service', 'sport'
46604         ],
46605         tagClassRe = /^tag-/,
46606         tags = function(entity) { return entity.tags; };
46607
46608
46609     var tagClasses = function(selection$$1) {
46610         selection$$1.each(function tagClassesEach(entity) {
46611             var value = this.className,
46612                 classes, primary, status;
46613
46614             if (value.baseVal !== undefined) value = value.baseVal;
46615
46616             classes = value.trim().split(/\s+/).filter(function(name) {
46617                 return name.length && !tagClassRe.test(name);
46618             }).join(' ');
46619
46620             var t = tags(entity), i, k, v;
46621
46622             // pick at most one primary classification tag..
46623             for (i = 0; i < primaries.length; i++) {
46624                 k = primaries[i];
46625                 v = t[k];
46626                 if (!v || v === 'no') continue;
46627
46628                 primary = k;
46629                 if (statuses.indexOf(v) !== -1) {   // e.g. `railway=abandoned`
46630                     status = v;
46631                     classes += ' tag-' + k;
46632                 } else {
46633                     classes += ' tag-' + k + ' tag-' + k + '-' + v;
46634                 }
46635
46636                 break;
46637             }
46638
46639             // add at most one status tag, only if relates to primary tag..
46640             if (!status) {
46641                 for (i = 0; i < statuses.length; i++) {
46642                     k = statuses[i];
46643                     v = t[k];
46644                     if (!v || v === 'no') continue;
46645
46646                     if (v === 'yes') {   // e.g. `railway=rail + abandoned=yes`
46647                         status = k;
46648                     }
46649                     else if (primary && primary === v) {  // e.g. `railway=rail + abandoned=railway`
46650                         status = k;
46651                     } else if (!primary && primaries.indexOf(v) !== -1) {  // e.g. `abandoned=railway`
46652                         status = k;
46653                         primary = v;
46654                         classes += ' tag-' + v;
46655                     }  // else ignore e.g.  `highway=path + abandoned=railway`
46656
46657                     if (status) break;
46658                 }
46659             }
46660
46661             if (status) {
46662                 classes += ' tag-status tag-status-' + status;
46663             }
46664
46665             // add any secondary (structure) tags
46666             for (i = 0; i < secondaries.length; i++) {
46667                 k = secondaries[i];
46668                 v = t[k];
46669                 if (!v || v === 'no') continue;
46670                 classes += ' tag-' + k + ' tag-' + k + '-' + v;
46671             }
46672
46673             // For highways, look for surface tagging..
46674             if (primary === 'highway') {
46675                 var paved = (t.highway !== 'track');
46676                 for (k in t) {
46677                     v = t[k];
46678                     if (k in osmPavedTags) {
46679                         paved = !!osmPavedTags[k][v];
46680                         break;
46681                     }
46682                 }
46683                 if (!paved) {
46684                     classes += ' tag-unpaved';
46685                 }
46686             }
46687
46688             classes = classes.trim();
46689
46690             if (classes !== value) {
46691                 d3_select(this).attr('class', classes);
46692             }
46693         });
46694     };
46695
46696
46697     tagClasses.tags = function(_) {
46698         if (!arguments.length) return tags;
46699         tags = _;
46700         return tagClasses;
46701     };
46702
46703     return tagClasses;
46704 }
46705
46706 function svgTurns(projection) {
46707
46708     return function drawTurns(selection, graph, turns) {
46709
46710         function icon(turn) {
46711             var u = turn.u ? '-u' : '';
46712             if (turn.no) return '#turn-no' + u;
46713             if (turn.only) return '#turn-only' + u;
46714             return '#turn-yes' + u;
46715         }
46716
46717         var layer = selection.selectAll('.data-layer-osm').selectAll('.layer-turns')
46718             .data([0]);
46719
46720         layer = layer.enter()
46721             .append('g')
46722             .attr('class', 'layer-osm layer-turns')
46723             .merge(layer);
46724
46725
46726         var groups = layer.selectAll('g.turn')
46727             .data(turns, function(d) { return d.key; });
46728
46729         groups.exit()
46730             .remove();
46731
46732
46733         var enter = groups.enter()
46734             .append('g')
46735             .attr('class', function(d) { return 'turn ' + d.key; });
46736
46737         var nEnter = enter
46738             .filter(function(d) { return !d.u; });
46739
46740         nEnter.append('rect')
46741             .attr('transform', 'translate(-22, -12)')
46742             .attr('width', '44')
46743             .attr('height', '24');
46744
46745         nEnter.append('use')
46746             .attr('transform', 'translate(-22, -12)')
46747             .attr('width', '44')
46748             .attr('height', '24');
46749
46750
46751         var uEnter = enter
46752             .filter(function(d) { return d.u; });
46753
46754         uEnter.append('circle')
46755             .attr('r', '16');
46756
46757         uEnter.append('use')
46758             .attr('transform', 'translate(-16, -16)')
46759             .attr('width', '32')
46760             .attr('height', '32');
46761
46762
46763         groups = groups
46764             .merge(enter);
46765
46766         groups
46767             .attr('opacity', function(d) {
46768                 return d.direct === false ? '0.7' : null;
46769             })
46770             .attr('transform', function(d) {
46771                 var pxRadius = 50;
46772                 var toWay = graph.entity(d.to.way);
46773                 var toPoints = graph.childNodes(toWay)
46774                     .map(function (n) { return n.loc; })
46775                     .map(projection);
46776                 var toLength = geoPathLength(toPoints);
46777                 var mid = toLength / 2;    // midpoint of destination way
46778
46779                 var toNode = graph.entity(d.to.node);
46780                 var toVertex = graph.entity(d.to.vertex);
46781                 var a = geoAngle(toVertex, toNode, projection);
46782                 var o = projection(toVertex.loc);
46783                 var r = d.u ? 0                  // u-turn: no radius
46784                     : !toWay.__via ? pxRadius    // leaf way: put marker at pxRadius
46785                     : Math.min(mid, pxRadius);   // via way: prefer pxRadius, fallback to mid for very short ways
46786
46787                 return 'translate(' + (r * Math.cos(a) + o[0]) + ',' + (r * Math.sin(a) + o[1]) + ') ' +
46788                     'rotate(' + a * 180 / Math.PI + ')';
46789             });
46790
46791         groups.select('use')
46792             .attr('xlink:href', icon);
46793
46794         groups.select('rect');
46795         groups.select('circle');
46796
46797         return this;
46798     };
46799 }
46800
46801 function svgVertices$$1(projection, context) {
46802     var radiuses = {
46803         //       z16-, z17,   z18+,  w/icon
46804         shadow: [6,    7.5,   7.5,   12],
46805         stroke: [2.5,  3.5,   3.5,   8],
46806         fill:   [1,    1.5,   1.5,   1.5]
46807     };
46808
46809     var _currHoverTarget;
46810     var _currPersistent = {};
46811     var _currHover = {};
46812     var _prevHover = {};
46813     var _currSelected = {};
46814     var _prevSelected = {};
46815     var _radii = {};
46816
46817
46818     function sortY(a, b) {
46819         return b.loc[1] - a.loc[1];
46820     }
46821
46822     // Avoid exit/enter if we're just moving stuff around.
46823     // The node will get a new version but we only need to run the update selection.
46824     function fastEntityKey(d) {
46825         var mode = context.mode();
46826         var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
46827         return isMoving ? d.id : osmEntity$$1.key(d);
46828     }
46829
46830
46831     function draw(selection$$1, graph, vertices, sets, filter) {
46832         sets = sets || { selected: {}, important: {}, hovered: {} };
46833
46834         var icons = {};
46835         var directions = {};
46836         var wireframe = context.surface().classed('fill-wireframe');
46837         var zoom = geoScaleToZoom(projection.scale());
46838         var z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
46839
46840
46841         function getIcon(entity) {
46842             if (entity.id in icons) return icons[entity.id];
46843
46844             icons[entity.id] =
46845                 entity.hasInterestingTags() &&
46846                 context.presets().match(entity, graph).icon;
46847             return icons[entity.id];
46848         }
46849
46850
46851         // memoize directions results, return false for empty arrays (for use in filter)
46852         function getDirections(entity) {
46853             if (entity.id in directions) return directions[entity.id];
46854
46855             var angles = entity.directions(graph, projection);
46856             directions[entity.id] = angles.length ? angles : false;
46857             return angles;
46858         }
46859
46860
46861         function updateAttributes(selection$$1) {
46862             ['shadow', 'stroke', 'fill'].forEach(function(klass) {
46863                 var rads = radiuses[klass];
46864                 selection$$1.selectAll('.' + klass)
46865                     .each(function(entity) {
46866                         var i = z && getIcon(entity);
46867                         var r = rads[i ? 3 : z];
46868
46869                         // slightly increase the size of unconnected endpoints #3775
46870                         if (entity.isEndpoint(graph) && !entity.isConnected(graph)) {
46871                             r += 1.5;
46872                         }
46873
46874                         if (klass === 'shadow') {   // remember this value, so we don't need to
46875                             _radii[entity.id] = r;  // recompute it when we draw the touch targets
46876                         }
46877
46878                         d3_select(this)
46879                             .attr('r', r)
46880                             .attr('visibility', (i && klass === 'fill') ? 'hidden' : null);
46881                     });
46882             });
46883
46884             selection$$1.selectAll('use')
46885                 .attr('visibility', (z === 0 ? 'hidden' : null));
46886         }
46887
46888         vertices.sort(sortY);
46889
46890         var groups = selection$$1.selectAll('g.vertex')
46891             .filter(filter)
46892             .data(vertices, fastEntityKey);
46893
46894         // exit
46895         groups.exit()
46896             .remove();
46897
46898         // enter
46899         var enter = groups.enter()
46900             .append('g')
46901             .attr('class', function(d) { return 'node vertex ' + d.id; })
46902             .order();
46903
46904         enter
46905             .append('circle')
46906             .attr('class', 'shadow');
46907
46908         enter
46909             .append('circle')
46910             .attr('class', 'stroke');
46911
46912         // Vertices with icons get a `use`.
46913         enter.filter(function(d) { return getIcon(d); })
46914             .append('use')
46915             .attr('class', 'icon')
46916             .attr('width', '11px')
46917             .attr('height', '11px')
46918             .attr('transform', 'translate(-5.5, -5.5)')
46919             .attr('xlink:href', function(d) {
46920                 var picon = getIcon(d);
46921                 var isMaki = dataFeatureIcons.indexOf(picon) !== -1;
46922                 return '#' + picon + (isMaki ? '-11' : '');
46923             });
46924
46925         // Vertices with tags get a fill.
46926         enter.filter(function(d) { return d.hasInterestingTags(); })
46927             .append('circle')
46928             .attr('class', 'fill');
46929
46930         // update
46931         groups = groups
46932             .merge(enter)
46933             .attr('transform', svgPointTransform(projection))
46934             .classed('sibling', function(d) { return d.id in sets.selected; })
46935             .classed('shared', function(d) { return graph.isShared(d); })
46936             .classed('endpoint', function(d) { return d.isEndpoint(graph); })
46937             .call(updateAttributes);
46938
46939
46940         // Directional vertices get viewfields
46941         var dgroups = groups.filter(function(d) { return getDirections(d); })
46942             .selectAll('.viewfieldgroup')
46943             .data(function data$$1(d) { return zoom >= 18 ? [d] : []; }, osmEntity$$1.key);
46944
46945         // exit
46946         dgroups.exit()
46947             .remove();
46948
46949         // enter/update
46950         dgroups = dgroups.enter()
46951             .insert('g', '.shadow')
46952             .attr('class', 'viewfieldgroup')
46953             .merge(dgroups);
46954
46955         var viewfields = dgroups.selectAll('.viewfield')
46956             .data(getDirections, function key(d) { return d; });
46957
46958         // exit
46959         viewfields.exit()
46960             .remove();
46961
46962         // enter/update
46963         viewfields.enter()
46964             .append('path')
46965             .attr('class', 'viewfield')
46966             .attr('d', 'M0,0H0')
46967             .merge(viewfields)
46968             .attr('marker-start', 'url(#viewfield-marker' + (wireframe ? '-wireframe' : '') + ')')
46969             .attr('transform', function(d) { return 'rotate(' + d + ')'; });
46970     }
46971
46972
46973     function drawTargets(selection$$1, graph, entities, filter) {
46974         var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
46975         var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
46976         var getTransform = svgPointTransform(projection).geojson;
46977         var activeID = context.activeID();
46978         var data$$1 = { targets: [], nopes: [] };
46979
46980         entities.forEach(function(node) {
46981             if (activeID === node.id) return;   // draw no target on the activeID
46982
46983             var vertexType = svgPassiveVertex(node, graph, activeID);
46984             if (vertexType !== 0) {     // passive or adjacent - allow to connect
46985                 data$$1.targets.push({
46986                     type: 'Feature',
46987                     id: node.id,
46988                     properties: {
46989                         target: true,
46990                         entity: node
46991                     },
46992                     geometry: node.asGeoJSON()
46993                 });
46994             } else {
46995                 data$$1.nopes.push({
46996                     type: 'Feature',
46997                     id: node.id + '-nope',
46998                     properties: {
46999                         nope: true,
47000                         target: true,
47001                         entity: node
47002                     },
47003                     geometry: node.asGeoJSON()
47004                 });
47005             }
47006         });
47007
47008
47009         // Targets allow hover and vertex snapping
47010         var targets = selection$$1.selectAll('.vertex.target-allowed')
47011             .filter(function(d) { return filter(d.properties.entity); })
47012             .data(data$$1.targets, function key(d) { return d.id; });
47013
47014         // exit
47015         targets.exit()
47016             .remove();
47017
47018         // enter/update
47019         targets.enter()
47020             .append('circle')
47021             .attr('r', function(d) { return (_radii[d.id] || radiuses.shadow[3]); })
47022             .merge(targets)
47023             .attr('class', function(d) { return 'node vertex target target-allowed ' + targetClass + d.id; })
47024             .attr('transform', getTransform);
47025
47026
47027         // NOPE
47028         var nopes = selection$$1.selectAll('.vertex.target-nope')
47029             .filter(function(d) { return filter(d.properties.entity); })
47030             .data(data$$1.nopes, function key(d) { return d.id; });
47031
47032         // exit
47033         nopes.exit()
47034             .remove();
47035
47036         // enter/update
47037         nopes.enter()
47038             .append('circle')
47039             .attr('r', function(d) { return (_radii[d.properties.entity.id] || radiuses.shadow[3]); })
47040             .merge(nopes)
47041             .attr('class', function(d) { return 'node vertex target target-nope ' + nopeClass + d.id; })
47042             .attr('transform', getTransform);
47043     }
47044
47045
47046     // Points can also render as vertices:
47047     // 1. in wireframe mode or
47048     // 2. at higher zooms if they have a direction
47049     function renderAsVertex(entity, graph, wireframe, zoom) {
47050         var geometry = entity.geometry(graph);
47051         return geometry === 'vertex' || (geometry === 'point' && (
47052             wireframe || (zoom >= 18 && entity.directions(graph, projection).length)
47053         ));
47054     }
47055
47056
47057     function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
47058         var results = {};
47059
47060         function addChildVertices(entity) {
47061             var geometry = entity.geometry(graph);
47062             if (!context.features().isHiddenFeature(entity, graph, geometry)) {
47063                 var i;
47064                 if (entity.type === 'way') {
47065                     for (i = 0; i < entity.nodes.length; i++) {
47066                         var child = graph.hasEntity(entity.nodes[i]);
47067                         if (child) {
47068                             addChildVertices(child);
47069                         }
47070                     }
47071                 } else if (entity.type === 'relation') {
47072                     for (i = 0; i < entity.members.length; i++) {
47073                         var member = graph.hasEntity(entity.members[i].id);
47074                         if (member) {
47075                             addChildVertices(member);
47076                         }
47077                     }
47078                 } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
47079                     results[entity.id] = entity;
47080                 }
47081             }
47082         }
47083
47084         ids.forEach(function(id) {
47085             var entity = graph.hasEntity(id);
47086             if (!entity) return;
47087
47088             if (entity.type === 'node') {
47089                 if (renderAsVertex(entity, graph, wireframe, zoom)) {
47090                     results[entity.id] = entity;
47091                     graph.parentWays(entity).forEach(function(entity) {
47092                         addChildVertices(entity);
47093                     });
47094                 }
47095             } else {  // way, relation
47096                 addChildVertices(entity);
47097             }
47098         });
47099
47100         return results;
47101     }
47102
47103
47104     function drawVertices(selection$$1, graph, entities, filter, extent, fullRedraw) {
47105         var wireframe = context.surface().classed('fill-wireframe');
47106         var zoom = geoScaleToZoom(projection.scale());
47107         var mode = context.mode();
47108         var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
47109
47110         if (fullRedraw) {
47111             _currPersistent = {};
47112             _radii = {};
47113         }
47114
47115         // Collect important vertices from the `entities` list..
47116         // (during a paritial redraw, it will not contain everything)
47117         for (var i = 0; i < entities.length; i++) {
47118             var entity = entities[i];
47119             var geometry = entity.geometry(graph);
47120             var keep = false;
47121
47122             // a point that looks like a vertex..
47123             if ((geometry === 'point') && renderAsVertex(entity, graph, wireframe, zoom)) {
47124                 _currPersistent[entity.id] = entity;
47125                 keep = true;
47126
47127             // a vertex of some importance..
47128             } else if (geometry === 'vertex' &&
47129                 (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph))) {
47130                 _currPersistent[entity.id] = entity;
47131                 keep = true;
47132             }
47133
47134             // whatever this is, it's not a persistent vertex..
47135             if (!keep && !fullRedraw) {
47136                 delete _currPersistent[entity.id];
47137             }
47138         }
47139
47140         // 3 sets of vertices to consider:
47141         var sets = {
47142             persistent: _currPersistent,  // persistent = important vertices (render always)
47143             selected: _currSelected,      // selected + siblings of selected (render always)
47144             hovered: _currHover           // hovered + siblings of hovered (render only in draw modes)
47145         };
47146
47147         var all = assign({}, (isMoving ? _currHover : {}), _currSelected, _currPersistent);
47148
47149         // Draw the vertices..
47150         // The filter function controls the scope of what objects d3 will touch (exit/enter/update)
47151         // Adjust the filter function to expand the scope beyond whatever entities were passed in.
47152         var filterRendered = function(d) {
47153             return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter(d);
47154         };
47155         selection$$1.selectAll('.layer-points .layer-points-vertices')
47156             .call(draw, graph, currentVisible(all), sets, filterRendered);
47157
47158         // Draw touch targets..
47159         // When drawing, render all targets (not just those affected by a partial redraw)
47160         var filterTouch = function(d) {
47161             return isMoving ? true : filterRendered(d);
47162         };
47163         selection$$1.selectAll('.layer-points .layer-points-targets')
47164             .call(drawTargets, graph, currentVisible(all), filterTouch);
47165
47166
47167         function currentVisible(which) {
47168             return Object.keys(which)
47169                 .map(graph.hasEntity, graph)     // the current version of this entity
47170                 .filter(function (entity) { return entity && entity.intersects(extent, graph); });
47171         }
47172     }
47173
47174
47175     // partial redraw - only update the selected items..
47176     drawVertices.drawSelected = function(selection$$1, graph, extent) {
47177         var wireframe = context.surface().classed('fill-wireframe');
47178         var zoom = geoScaleToZoom(projection.scale());
47179
47180         _prevSelected = _currSelected || {};
47181         _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
47182
47183         // note that drawVertices will add `_currSelected` automatically if needed..
47184         var filter = function(d) { return d.id in _prevSelected; };
47185         drawVertices(selection$$1, graph, values$1(_prevSelected), filter, extent, false);
47186     };
47187
47188
47189     // partial redraw - only update the hovered items..
47190     drawVertices.drawHover = function(selection$$1, graph, target, extent) {
47191         if (target === _currHoverTarget) return;  // continue only if something changed
47192
47193         var wireframe = context.surface().classed('fill-wireframe');
47194         var zoom = geoScaleToZoom(projection.scale());
47195
47196         _prevHover = _currHover || {};
47197         _currHoverTarget = target;
47198         var entity = target && target.properties && target.properties.entity;
47199
47200         if (entity) {
47201             _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
47202         } else {
47203             _currHover = {};
47204         }
47205
47206         // note that drawVertices will add `_currHover` automatically if needed..
47207         var filter = function(d) { return d.id in _prevHover; };
47208         drawVertices(selection$$1, graph, values$1(_prevHover), filter, extent, false);
47209     };
47210
47211     return drawVertices;
47212 }
47213
47214 function uiAccount(context) {
47215     var osm = context.connection();
47216
47217
47218     function update(selection$$1) {
47219         if (!osm) return;
47220
47221         if (!osm.authenticated()) {
47222             selection$$1.selectAll('#userLink, #logoutLink')
47223                 .classed('hide', true);
47224             return;
47225         }
47226
47227         osm.userDetails(function(err, details) {
47228             var userLink = selection$$1.select('#userLink'),
47229                 logoutLink = selection$$1.select('#logoutLink');
47230
47231             userLink.html('');
47232             logoutLink.html('');
47233
47234             if (err) return;
47235
47236             selection$$1.selectAll('#userLink, #logoutLink')
47237                 .classed('hide', false);
47238
47239             // Link
47240             userLink.append('a')
47241                 .attr('href', osm.userURL(details.display_name))
47242                 .attr('target', '_blank');
47243
47244             // Add thumbnail or dont
47245             if (details.image_url) {
47246                 userLink.append('img')
47247                     .attr('class', 'icon pre-text user-icon')
47248                     .attr('src', details.image_url);
47249             } else {
47250                 userLink
47251                     .call(svgIcon('#icon-avatar', 'pre-text light'));
47252             }
47253
47254             // Add user name
47255             userLink.append('span')
47256                 .attr('class', 'label')
47257                 .text(details.display_name);
47258
47259             logoutLink.append('a')
47260                 .attr('class', 'logout')
47261                 .attr('href', '#')
47262                 .text(t('logout'))
47263                 .on('click.logout', function() {
47264                     event.preventDefault();
47265                     osm.logout();
47266                 });
47267         });
47268     }
47269
47270
47271     return function(selection$$1) {
47272         selection$$1.append('li')
47273             .attr('id', 'logoutLink')
47274             .classed('hide', true);
47275
47276         selection$$1.append('li')
47277             .attr('id', 'userLink')
47278             .classed('hide', true);
47279
47280         if (osm) {
47281             osm.on('change.account', function() { update(selection$$1); });
47282             update(selection$$1);
47283         }
47284     };
47285 }
47286
47287 function uiAttribution(context) {
47288     var selection$$1;
47289
47290
47291     function attribution(data, klass) {
47292         var div = selection$$1.selectAll('.' + klass)
47293             .data([0]);
47294
47295         div = div.enter()
47296             .append('div')
47297             .attr('class', klass)
47298             .merge(div);
47299
47300
47301         var background = div.selectAll('.attribution')
47302             .data(data, function(d) { return d.name(); });
47303
47304         background.exit()
47305             .remove();
47306
47307         background = background.enter()
47308             .append('span')
47309             .attr('class', 'attribution')
47310             .each(function(d) {
47311                 if (d.terms_html) {
47312                     d3_select(this)
47313                         .html(d.terms_html);
47314                     return;
47315                 }
47316
47317                 var selection$$1;
47318                 if (d.terms_url) {
47319                     selection$$1 = d3_select(this)
47320                         .append('a')
47321                         .attr('href', d.terms_url)
47322                         .attr('target', '_blank');
47323                 } else {
47324                     selection$$1 = d3_select(this);
47325                 }
47326
47327
47328                 var id_safe = d.id.replace('.', '<TX_DOT>');
47329                 var terms_text = t('imagery.' + id_safe + '.attribution.text',
47330                     { default: d.terms_text || d.id || d.name() }
47331                 );
47332
47333                 if (d.icon && !d.overlay) {
47334                     selection$$1
47335                         .append('img')
47336                         .attr('class', 'source-image')
47337                         .attr('src', d.icon);
47338                 }
47339
47340                 selection$$1
47341                     .append('span')
47342                     .attr('class', 'attribution-text')
47343                     .text(terms_text);
47344             })
47345             .merge(background);
47346
47347
47348         var copyright = background.selectAll('.copyright-notice')
47349             .data(function(d) {
47350                 var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
47351                 return notice ? [notice] : [];
47352             });
47353
47354         copyright.exit()
47355             .remove();
47356
47357         copyright = copyright.enter()
47358             .append('span')
47359             .attr('class', 'copyright-notice')
47360             .merge(copyright);
47361
47362         copyright
47363             .text(String);
47364     }
47365
47366
47367     function update() {
47368         attribution([context.background().baseLayerSource()], 'base-layer-attribution');
47369         attribution(context.background().overlayLayerSources().filter(function (s) {
47370             return s.validZoom(context.map().zoom());
47371         }), 'overlay-layer-attribution');
47372     }
47373
47374
47375     return function(select$$1) {
47376         selection$$1 = select$$1;
47377
47378         context.background()
47379             .on('change.attribution', update);
47380
47381         context.map()
47382             .on('move.attribution', throttle(update, 400, {leading: false}));
47383
47384         update();
47385     };
47386 }
47387
47388 // toggles the visibility of ui elements, using a combination of the
47389 // hide class, which sets display=none, and a d3 transition for opacity.
47390 // this will cause blinking when called repeatedly, so check that the
47391 // value actually changes between calls.
47392 function uiToggle(show, callback) {
47393     return function(selection$$1) {
47394         selection$$1
47395             .style('opacity', show ? 0 : 1)
47396             .classed('hide', false)
47397             .transition()
47398             .style('opacity', show ? 1 : 0)
47399             .on('end', function() {
47400                 d3_select(this)
47401                     .classed('hide', !show)
47402                     .style('opacity', null);
47403                 if (callback) callback.apply(this);
47404             });
47405     };
47406 }
47407
47408 function uiDisclosure(context, key, expandedDefault) {
47409     var dispatch$$1 = dispatch('toggled'),
47410         _preference = (context.storage('disclosure.' + key + '.expanded')),
47411         _expanded = (_preference === null ? !!expandedDefault : (_preference === 'true')),
47412         _title,
47413         _updatePreference = true,
47414         _content = function () {};
47415
47416
47417     var disclosure = function(selection$$1) {
47418         var hideToggle = selection$$1.selectAll('.hide-toggle-' + key)
47419             .data([0]);
47420
47421         // enter
47422         var hideToggleEnter = hideToggle.enter()
47423             .append('a')
47424             .attr('href', '#')
47425             .attr('class', 'hide-toggle hide-toggle-' + key)
47426             .call(svgIcon('', 'pre-text', 'hide-toggle-icon'));
47427
47428         hideToggleEnter
47429             .append('span')
47430             .attr('class', 'hide-toggle-text');
47431
47432         // update
47433         hideToggle = hideToggleEnter
47434             .merge(hideToggle);
47435
47436         hideToggle
47437             .on('click', toggle)
47438             .classed('expanded', _expanded);
47439
47440         hideToggle.selectAll('.hide-toggle-text')
47441             .text(_title);
47442
47443         hideToggle.selectAll('.hide-toggle-icon')
47444             .attr('xlink:href', _expanded ? '#icon-down'
47445                 : (textDirection === 'rtl') ? '#icon-backward' : '#icon-forward'
47446             );
47447
47448
47449         var wrap = selection$$1.selectAll('.disclosure-wrap')
47450             .data([0]);
47451
47452         wrap = wrap.enter()
47453             .append('div')
47454             .attr('class', 'disclosure-wrap disclosure-wrap-' + key)
47455             .merge(wrap);
47456
47457         wrap
47458             .classed('hide', !_expanded)
47459             .call(_content);
47460
47461
47462         function toggle() {
47463             event.preventDefault();
47464
47465             _expanded = !_expanded;
47466
47467             if (_updatePreference) {
47468                 context.storage('disclosure.' + key + '.expanded', _expanded);
47469             }
47470
47471             hideToggle
47472                 .classed('expanded', _expanded);
47473
47474             hideToggle.selectAll('.hide-toggle-icon')
47475                 .attr('xlink:href', _expanded ? '#icon-down'
47476                     : (textDirection === 'rtl') ? '#icon-backward' : '#icon-forward'
47477                 );
47478
47479             wrap
47480                 .call(uiToggle(_expanded));
47481
47482             dispatch$$1.call('toggled', this, _expanded);
47483         }
47484     };
47485
47486
47487     disclosure.title = function(_) {
47488         if (!arguments.length) return _title;
47489         _title = _;
47490         return disclosure;
47491     };
47492
47493
47494     disclosure.expanded = function(_) {
47495         if (!arguments.length) return _expanded;
47496         _expanded = _;
47497         return disclosure;
47498     };
47499
47500
47501     disclosure.updatePreference = function(_) {
47502         if (!arguments.length) return _updatePreference;
47503         _updatePreference = _;
47504         return disclosure;
47505     };
47506
47507
47508     disclosure.content = function(_) {
47509         if (!arguments.length) return _content;
47510         _content = _;
47511         return disclosure;
47512     };
47513
47514
47515     return utilRebind(disclosure, dispatch$$1, 'on');
47516 }
47517
47518 function uiBackgroundDisplayOptions(context) {
47519     var detected = utilDetect();
47520     var storedOpacity = context.storage('background-opacity');
47521     var minVal = 0.25;
47522     var maxVal = detected.cssfilters ? 2 : 1;
47523
47524     var sliders = detected.cssfilters
47525         ? ['brightness', 'contrast', 'saturation', 'sharpness']
47526         : ['brightness'];
47527
47528     var _options = {
47529         brightness: (storedOpacity !== null ? (+storedOpacity) : 1),
47530         contrast: 1,
47531         saturation: 1,
47532         sharpness: 1
47533     };
47534
47535     var _selection = d3_select(null);
47536
47537
47538     function clamp(x, min, max) {
47539         return Math.max(min, Math.min(x, max));
47540     }
47541
47542
47543     function updateValue(d, val) {
47544         if (!val && event && event.target) {
47545             val = event.target.value;
47546         }
47547
47548         val = clamp(val, minVal, maxVal);
47549
47550         _options[d] = val;
47551         context.background()[d](val);
47552
47553         if (d === 'brightness') {
47554             context.storage('background-opacity', val);
47555         }
47556
47557         _selection
47558             .call(render);
47559     }
47560
47561
47562     function render(selection$$1) {
47563         var container = selection$$1.selectAll('.display-options-container')
47564             .data([0]);
47565
47566         var containerEnter = container.enter()
47567             .append('div')
47568             .attr('class', 'display-options-container controls-list');
47569
47570         // add slider controls
47571         var slidersEnter = containerEnter.selectAll('.display-control')
47572             .data(sliders)
47573             .enter()
47574             .append('div')
47575             .attr('class', function(d) { return 'display-control display-control-' + d; });
47576
47577         slidersEnter
47578             .append('h5')
47579             .text(function(d) { return t('background.' + d); })
47580             .append('span')
47581             .attr('class', function(d) { return 'display-option-value display-option-value-' + d; });
47582
47583         slidersEnter
47584             .append('input')
47585             .attr('class', function(d) { return 'display-option-input display-option-input-' + d; })
47586             .attr('type', 'range')
47587             .attr('min', minVal)
47588             .attr('max', maxVal)
47589             .attr('step', '0.05')
47590             .on('input', function(d) {
47591                 var val = d3_select(this).property('value');
47592                 updateValue(d, val);
47593             });
47594
47595         slidersEnter
47596             .append('button')
47597             .attr('title', t('background.reset'))
47598             .attr('class', function(d) { return 'display-option-reset display-option-reset-' + d; })
47599             .on('click', function(d) {
47600                 if (event.button !== 0) return;
47601                 updateValue(d, 1);
47602             })
47603             .call(svgIcon('#icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
47604
47605
47606         // update
47607         container = containerEnter
47608             .merge(container);
47609
47610         container.selectAll('.display-option-input')
47611             .property('value', function(d) { return _options[d]; });
47612
47613         container.selectAll('.display-option-value')
47614             .text(function(d) { return Math.floor(_options[d] * 100) + '%'; });
47615
47616         container.selectAll('.display-option-reset')
47617             .classed('disabled', function(d) { return _options[d] === 1; });
47618
47619         // first time only, set brightness if needed
47620         if (containerEnter.size() && _options.brightness !== 1) {
47621             context.background().brightness(_options.brightness);
47622         }
47623     }
47624
47625
47626     function backgroundDisplayOptions(selection$$1) {
47627         _selection = selection$$1;
47628
47629         selection$$1
47630             .call(uiDisclosure(context, 'background_display_options', true)
47631                 .title(t('background.display_options'))
47632                 .content(render)
47633             );
47634     }
47635
47636
47637     return backgroundDisplayOptions;
47638 }
47639
47640 function uiBackgroundOffset(context) {
47641     var directions = [
47642         ['right', [0.5, 0]],
47643         ['top', [0, -0.5]],
47644         ['left', [-0.5, 0]],
47645         ['bottom', [0, 0.5]]
47646     ];
47647
47648
47649     function d3_eventCancel() {
47650         event.stopPropagation();
47651         event.preventDefault();
47652     }
47653
47654
47655     function updateValue() {
47656         var meters = geoOffsetToMeters(context.background().offset());
47657         var x = +meters[0].toFixed(2);
47658         var y = +meters[1].toFixed(2);
47659
47660         d3_selectAll('.nudge-inner-rect')
47661             .select('input')
47662             .classed('error', false)
47663             .property('value', x + ', ' + y);
47664
47665         d3_selectAll('.nudge-reset')
47666             .classed('disabled', function() {
47667                 return (x === 0 && y === 0);
47668             });
47669     }
47670
47671
47672     function resetOffset() {
47673         context.background().offset([0, 0]);
47674         updateValue();
47675     }
47676
47677
47678     function nudge(d) {
47679         context.background().nudge(d, context.map().zoom());
47680         updateValue();
47681     }
47682
47683
47684     function clickNudgeButton(d) {
47685         var interval;
47686         var timeout = window.setTimeout(function() {
47687                 interval = window.setInterval(nudge.bind(null, d), 100);
47688             }, 500);
47689
47690         function doneNudge() {
47691             window.clearTimeout(timeout);
47692             window.clearInterval(interval);
47693             d3_select(window)
47694                 .on('mouseup.buttonoffset', null, true)
47695                 .on('mousedown.buttonoffset', null, true);
47696         }
47697
47698         d3_select(window)
47699             .on('mouseup.buttonoffset', doneNudge, true)
47700             .on('mousedown.buttonoffset', doneNudge, true);
47701
47702         nudge(d);
47703     }
47704
47705
47706     function inputOffset() {
47707         var input = d3_select(this);
47708         var d = input.node().value;
47709
47710         if (d === '') return resetOffset();
47711
47712         d = d.replace(/;/g, ',').split(',').map(function(n) {
47713             // if n is NaN, it will always get mapped to false.
47714             return !isNaN(n) && n;
47715         });
47716
47717         if (d.length !== 2 || !d[0] || !d[1]) {
47718             input.classed('error', true);
47719             return;
47720         }
47721
47722         context.background().offset(geoMetersToOffset(d));
47723         updateValue();
47724     }
47725
47726
47727     function dragOffset() {
47728         event.preventDefault();
47729         if (event.button !== 0) return;
47730
47731         var origin = [event.clientX, event.clientY];
47732
47733         context.container()
47734             .append('div')
47735             .attr('class', 'nudge-surface');
47736
47737         d3_select(window)
47738             .on('mousemove.offset', function() {
47739                 var latest = [event.clientX, event.clientY];
47740                 var d = [
47741                     -(origin[0] - latest[0]) / 4,
47742                     -(origin[1] - latest[1]) / 4
47743                 ];
47744
47745                 origin = latest;
47746                 nudge(d);
47747             })
47748             .on('mouseup.offset', function() {
47749                 if (event.button !== 0) return;
47750                 d3_selectAll('.nudge-surface')
47751                     .remove();
47752
47753                 d3_select(window)
47754                     .on('mousemove.offset', null)
47755                     .on('mouseup.offset', null);
47756             });
47757     }
47758
47759
47760     function render(selection$$1) {
47761         var container = selection$$1.selectAll('.nudge-container')
47762             .data([0]);
47763
47764         var containerEnter = container.enter()
47765             .append('div')
47766             .attr('class', 'nudge-container cf');
47767
47768         containerEnter
47769             .append('div')
47770             .attr('class', 'nudge-instructions')
47771             .text(t('background.offset'));
47772
47773         var nudgeEnter = containerEnter
47774             .append('div')
47775             .attr('class', 'nudge-outer-rect')
47776             .on('mousedown', dragOffset);
47777
47778         nudgeEnter
47779             .append('div')
47780             .attr('class', 'nudge-inner-rect')
47781             .append('input')
47782             .on('change', inputOffset);
47783
47784         containerEnter
47785             .append('div')
47786             .selectAll('button')
47787             .data(directions).enter()
47788             .append('button')
47789             .attr('class', function(d) { return d[0] + ' nudge'; })
47790             .on('contextmenu', d3_eventCancel)
47791             .on('mousedown', function(d) {
47792                 if (event.button !== 0) return;
47793                 clickNudgeButton(d[1]);
47794             });
47795
47796         containerEnter
47797             .append('button')
47798             .attr('title', t('background.reset'))
47799             .attr('class', 'nudge-reset disabled')
47800             .on('contextmenu', d3_eventCancel)
47801             .on('click', function() {
47802                 if (event.button !== 0) return;
47803                 resetOffset();
47804             })
47805             .call(svgIcon('#icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
47806
47807         updateValue();
47808     }
47809
47810
47811     function backgroundOffset(selection$$1) {
47812         selection$$1
47813             .call(uiDisclosure(context, 'background_offset', false)
47814                 .title(t('background.fix_misalignment'))
47815                 .content(render)
47816             );
47817     }
47818
47819
47820     context.background()
47821         .on('change.backgroundOffset-update', updateValue);
47822
47823     return backgroundOffset;
47824 }
47825
47826 var marked = createCommonjsModule(function (module, exports) {
47827 (function(root) {
47828
47829 /**
47830  * Block-Level Grammar
47831  */
47832
47833 var block = {
47834   newline: /^\n+/,
47835   code: /^( {4}[^\n]+\n*)+/,
47836   fences: noop,
47837   hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
47838   heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,
47839   nptable: noop,
47840   blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
47841   list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
47842   html: /^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,
47843   def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
47844   table: noop,
47845   lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
47846   paragraph: /^([^\n]+(?:\n?(?!hr|heading|lheading| {0,3}>|tag)[^\n]+)+)/,
47847   text: /^[^\n]+/
47848 };
47849
47850 block._label = /(?:\\[\[\]]|[^\[\]])+/;
47851 block._title = /(?:"(?:\\"|[^"]|"[^"\n]*")*"|'\n?(?:[^'\n]+\n?)*'|\([^()]*\))/;
47852 block.def = edit(block.def)
47853   .replace('label', block._label)
47854   .replace('title', block._title)
47855   .getRegex();
47856
47857 block.bullet = /(?:[*+-]|\d+\.)/;
47858 block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
47859 block.item = edit(block.item, 'gm')
47860   .replace(/bull/g, block.bullet)
47861   .getRegex();
47862
47863 block.list = edit(block.list)
47864   .replace(/bull/g, block.bullet)
47865   .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
47866   .replace('def', '\\n+(?=' + block.def.source + ')')
47867   .getRegex();
47868
47869 block._tag = '(?!(?:'
47870   + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code'
47871   + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo'
47872   + '|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b';
47873
47874 block.html = edit(block.html)
47875   .replace('comment', /<!--[\s\S]*?-->/)
47876   .replace('closed', /<(tag)[\s\S]+?<\/\1>/)
47877   .replace('closing', /<tag(?:"[^"]*"|'[^']*'|\s[^'"\/>\s]*)*?\/?>/)
47878   .replace(/tag/g, block._tag)
47879   .getRegex();
47880
47881 block.paragraph = edit(block.paragraph)
47882   .replace('hr', block.hr)
47883   .replace('heading', block.heading)
47884   .replace('lheading', block.lheading)
47885   .replace('tag', '<' + block._tag)
47886   .getRegex();
47887
47888 block.blockquote = edit(block.blockquote)
47889   .replace('paragraph', block.paragraph)
47890   .getRegex();
47891
47892 /**
47893  * Normal Block Grammar
47894  */
47895
47896 block.normal = merge({}, block);
47897
47898 /**
47899  * GFM Block Grammar
47900  */
47901
47902 block.gfm = merge({}, block.normal, {
47903   fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\n? *\1 *(?:\n+|$)/,
47904   paragraph: /^/,
47905   heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
47906 });
47907
47908 block.gfm.paragraph = edit(block.paragraph)
47909   .replace('(?!', '(?!'
47910     + block.gfm.fences.source.replace('\\1', '\\2') + '|'
47911     + block.list.source.replace('\\1', '\\3') + '|')
47912   .getRegex();
47913
47914 /**
47915  * GFM + Tables Block Grammar
47916  */
47917
47918 block.tables = merge({}, block.gfm, {
47919   nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,
47920   table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/
47921 });
47922
47923 /**
47924  * Block Lexer
47925  */
47926
47927 function Lexer(options) {
47928   this.tokens = [];
47929   this.tokens.links = {};
47930   this.options = options || marked.defaults;
47931   this.rules = block.normal;
47932
47933   if (this.options.gfm) {
47934     if (this.options.tables) {
47935       this.rules = block.tables;
47936     } else {
47937       this.rules = block.gfm;
47938     }
47939   }
47940 }
47941
47942 /**
47943  * Expose Block Rules
47944  */
47945
47946 Lexer.rules = block;
47947
47948 /**
47949  * Static Lex Method
47950  */
47951
47952 Lexer.lex = function(src, options) {
47953   var lexer = new Lexer(options);
47954   return lexer.lex(src);
47955 };
47956
47957 /**
47958  * Preprocessing
47959  */
47960
47961 Lexer.prototype.lex = function(src) {
47962   src = src
47963     .replace(/\r\n|\r/g, '\n')
47964     .replace(/\t/g, '    ')
47965     .replace(/\u00a0/g, ' ')
47966     .replace(/\u2424/g, '\n');
47967
47968   return this.token(src, true);
47969 };
47970
47971 /**
47972  * Lexing
47973  */
47974
47975 Lexer.prototype.token = function(src, top) {
47976   src = src.replace(/^ +$/gm, '');
47977   var next,
47978       loose,
47979       cap,
47980       bull,
47981       b,
47982       item,
47983       space,
47984       i,
47985       tag,
47986       l;
47987
47988   while (src) {
47989     // newline
47990     if (cap = this.rules.newline.exec(src)) {
47991       src = src.substring(cap[0].length);
47992       if (cap[0].length > 1) {
47993         this.tokens.push({
47994           type: 'space'
47995         });
47996       }
47997     }
47998
47999     // code
48000     if (cap = this.rules.code.exec(src)) {
48001       src = src.substring(cap[0].length);
48002       cap = cap[0].replace(/^ {4}/gm, '');
48003       this.tokens.push({
48004         type: 'code',
48005         text: !this.options.pedantic
48006           ? cap.replace(/\n+$/, '')
48007           : cap
48008       });
48009       continue;
48010     }
48011
48012     // fences (gfm)
48013     if (cap = this.rules.fences.exec(src)) {
48014       src = src.substring(cap[0].length);
48015       this.tokens.push({
48016         type: 'code',
48017         lang: cap[2],
48018         text: cap[3] || ''
48019       });
48020       continue;
48021     }
48022
48023     // heading
48024     if (cap = this.rules.heading.exec(src)) {
48025       src = src.substring(cap[0].length);
48026       this.tokens.push({
48027         type: 'heading',
48028         depth: cap[1].length,
48029         text: cap[2]
48030       });
48031       continue;
48032     }
48033
48034     // table no leading pipe (gfm)
48035     if (top && (cap = this.rules.nptable.exec(src))) {
48036       src = src.substring(cap[0].length);
48037
48038       item = {
48039         type: 'table',
48040         header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
48041         align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
48042         cells: cap[3].replace(/\n$/, '').split('\n')
48043       };
48044
48045       for (i = 0; i < item.align.length; i++) {
48046         if (/^ *-+: *$/.test(item.align[i])) {
48047           item.align[i] = 'right';
48048         } else if (/^ *:-+: *$/.test(item.align[i])) {
48049           item.align[i] = 'center';
48050         } else if (/^ *:-+ *$/.test(item.align[i])) {
48051           item.align[i] = 'left';
48052         } else {
48053           item.align[i] = null;
48054         }
48055       }
48056
48057       for (i = 0; i < item.cells.length; i++) {
48058         item.cells[i] = item.cells[i].split(/ *\| */);
48059       }
48060
48061       this.tokens.push(item);
48062
48063       continue;
48064     }
48065
48066     // hr
48067     if (cap = this.rules.hr.exec(src)) {
48068       src = src.substring(cap[0].length);
48069       this.tokens.push({
48070         type: 'hr'
48071       });
48072       continue;
48073     }
48074
48075     // blockquote
48076     if (cap = this.rules.blockquote.exec(src)) {
48077       src = src.substring(cap[0].length);
48078
48079       this.tokens.push({
48080         type: 'blockquote_start'
48081       });
48082
48083       cap = cap[0].replace(/^ *> ?/gm, '');
48084
48085       // Pass `top` to keep the current
48086       // "toplevel" state. This is exactly
48087       // how markdown.pl works.
48088       this.token(cap, top);
48089
48090       this.tokens.push({
48091         type: 'blockquote_end'
48092       });
48093
48094       continue;
48095     }
48096
48097     // list
48098     if (cap = this.rules.list.exec(src)) {
48099       src = src.substring(cap[0].length);
48100       bull = cap[2];
48101
48102       this.tokens.push({
48103         type: 'list_start',
48104         ordered: bull.length > 1
48105       });
48106
48107       // Get each top-level item.
48108       cap = cap[0].match(this.rules.item);
48109
48110       next = false;
48111       l = cap.length;
48112       i = 0;
48113
48114       for (; i < l; i++) {
48115         item = cap[i];
48116
48117         // Remove the list item's bullet
48118         // so it is seen as the next token.
48119         space = item.length;
48120         item = item.replace(/^ *([*+-]|\d+\.) +/, '');
48121
48122         // Outdent whatever the
48123         // list item contains. Hacky.
48124         if (~item.indexOf('\n ')) {
48125           space -= item.length;
48126           item = !this.options.pedantic
48127             ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
48128             : item.replace(/^ {1,4}/gm, '');
48129         }
48130
48131         // Determine whether the next list item belongs here.
48132         // Backpedal if it does not belong in this list.
48133         if (this.options.smartLists && i !== l - 1) {
48134           b = block.bullet.exec(cap[i + 1])[0];
48135           if (bull !== b && !(bull.length > 1 && b.length > 1)) {
48136             src = cap.slice(i + 1).join('\n') + src;
48137             i = l - 1;
48138           }
48139         }
48140
48141         // Determine whether item is loose or not.
48142         // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
48143         // for discount behavior.
48144         loose = next || /\n\n(?!\s*$)/.test(item);
48145         if (i !== l - 1) {
48146           next = item.charAt(item.length - 1) === '\n';
48147           if (!loose) loose = next;
48148         }
48149
48150         this.tokens.push({
48151           type: loose
48152             ? 'loose_item_start'
48153             : 'list_item_start'
48154         });
48155
48156         // Recurse.
48157         this.token(item, false);
48158
48159         this.tokens.push({
48160           type: 'list_item_end'
48161         });
48162       }
48163
48164       this.tokens.push({
48165         type: 'list_end'
48166       });
48167
48168       continue;
48169     }
48170
48171     // html
48172     if (cap = this.rules.html.exec(src)) {
48173       src = src.substring(cap[0].length);
48174       this.tokens.push({
48175         type: this.options.sanitize
48176           ? 'paragraph'
48177           : 'html',
48178         pre: !this.options.sanitizer
48179           && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
48180         text: cap[0]
48181       });
48182       continue;
48183     }
48184
48185     // def
48186     if (top && (cap = this.rules.def.exec(src))) {
48187       src = src.substring(cap[0].length);
48188       if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
48189       tag = cap[1].toLowerCase();
48190       if (!this.tokens.links[tag]) {
48191         this.tokens.links[tag] = {
48192           href: cap[2],
48193           title: cap[3]
48194         };
48195       }
48196       continue;
48197     }
48198
48199     // table (gfm)
48200     if (top && (cap = this.rules.table.exec(src))) {
48201       src = src.substring(cap[0].length);
48202
48203       item = {
48204         type: 'table',
48205         header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
48206         align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
48207         cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n')
48208       };
48209
48210       for (i = 0; i < item.align.length; i++) {
48211         if (/^ *-+: *$/.test(item.align[i])) {
48212           item.align[i] = 'right';
48213         } else if (/^ *:-+: *$/.test(item.align[i])) {
48214           item.align[i] = 'center';
48215         } else if (/^ *:-+ *$/.test(item.align[i])) {
48216           item.align[i] = 'left';
48217         } else {
48218           item.align[i] = null;
48219         }
48220       }
48221
48222       for (i = 0; i < item.cells.length; i++) {
48223         item.cells[i] = item.cells[i]
48224           .replace(/^ *\| *| *\| *$/g, '')
48225           .split(/ *\| */);
48226       }
48227
48228       this.tokens.push(item);
48229
48230       continue;
48231     }
48232
48233     // lheading
48234     if (cap = this.rules.lheading.exec(src)) {
48235       src = src.substring(cap[0].length);
48236       this.tokens.push({
48237         type: 'heading',
48238         depth: cap[2] === '=' ? 1 : 2,
48239         text: cap[1]
48240       });
48241       continue;
48242     }
48243
48244     // top-level paragraph
48245     if (top && (cap = this.rules.paragraph.exec(src))) {
48246       src = src.substring(cap[0].length);
48247       this.tokens.push({
48248         type: 'paragraph',
48249         text: cap[1].charAt(cap[1].length - 1) === '\n'
48250           ? cap[1].slice(0, -1)
48251           : cap[1]
48252       });
48253       continue;
48254     }
48255
48256     // text
48257     if (cap = this.rules.text.exec(src)) {
48258       // Top-level should never reach here.
48259       src = src.substring(cap[0].length);
48260       this.tokens.push({
48261         type: 'text',
48262         text: cap[0]
48263       });
48264       continue;
48265     }
48266
48267     if (src) {
48268       throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
48269     }
48270   }
48271
48272   return this.tokens;
48273 };
48274
48275 /**
48276  * Inline-Level Grammar
48277  */
48278
48279 var inline = {
48280   escape: /^\\([\\`*{}\[\]()#+\-.!_>])/,
48281   autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
48282   url: noop,
48283   tag: /^<!--[\s\S]*?-->|^<\/?[a-zA-Z0-9\-]+(?:"[^"]*"|'[^']*'|\s[^<'">\/\s]*)*?\/?>/,
48284   link: /^!?\[(inside)\]\(href\)/,
48285   reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/,
48286   nolink: /^!?\[((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\]/,
48287   strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,
48288   em: /^_([^\s_](?:[^_]|__)+?[^\s_])_\b|^\*((?:\*\*|[^*])+?)\*(?!\*)/,
48289   code: /^(`+)\s*([\s\S]*?[^`]?)\s*\1(?!`)/,
48290   br: /^ {2,}\n(?!\s*$)/,
48291   del: noop,
48292   text: /^[\s\S]+?(?=[\\<!\[`*]|\b_| {2,}\n|$)/
48293 };
48294
48295 inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
48296 inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;
48297
48298 inline.autolink = edit(inline.autolink)
48299   .replace('scheme', inline._scheme)
48300   .replace('email', inline._email)
48301   .getRegex();
48302
48303 inline._inside = /(?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]]|\](?=[^\[]*\]))*/;
48304 inline._href = /\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;
48305
48306 inline.link = edit(inline.link)
48307   .replace('inside', inline._inside)
48308   .replace('href', inline._href)
48309   .getRegex();
48310
48311 inline.reflink = edit(inline.reflink)
48312   .replace('inside', inline._inside)
48313   .getRegex();
48314
48315 /**
48316  * Normal Inline Grammar
48317  */
48318
48319 inline.normal = merge({}, inline);
48320
48321 /**
48322  * Pedantic Inline Grammar
48323  */
48324
48325 inline.pedantic = merge({}, inline.normal, {
48326   strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
48327   em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/
48328 });
48329
48330 /**
48331  * GFM Inline Grammar
48332  */
48333
48334 inline.gfm = merge({}, inline.normal, {
48335   escape: edit(inline.escape).replace('])', '~|])').getRegex(),
48336   url: edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/)
48337     .replace('email', inline._email)
48338     .getRegex(),
48339   _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
48340   del: /^~~(?=\S)([\s\S]*?\S)~~/,
48341   text: edit(inline.text)
48342     .replace(']|', '~]|')
48343     .replace('|', '|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&\'*+/=?^_`{\\|}~-]+@|')
48344     .getRegex()
48345 });
48346
48347 /**
48348  * GFM + Line Breaks Inline Grammar
48349  */
48350
48351 inline.breaks = merge({}, inline.gfm, {
48352   br: edit(inline.br).replace('{2,}', '*').getRegex(),
48353   text: edit(inline.gfm.text).replace('{2,}', '*').getRegex()
48354 });
48355
48356 /**
48357  * Inline Lexer & Compiler
48358  */
48359
48360 function InlineLexer(links, options) {
48361   this.options = options || marked.defaults;
48362   this.links = links;
48363   this.rules = inline.normal;
48364   this.renderer = this.options.renderer || new Renderer();
48365   this.renderer.options = this.options;
48366
48367   if (!this.links) {
48368     throw new Error('Tokens array requires a `links` property.');
48369   }
48370
48371   if (this.options.gfm) {
48372     if (this.options.breaks) {
48373       this.rules = inline.breaks;
48374     } else {
48375       this.rules = inline.gfm;
48376     }
48377   } else if (this.options.pedantic) {
48378     this.rules = inline.pedantic;
48379   }
48380 }
48381
48382 /**
48383  * Expose Inline Rules
48384  */
48385
48386 InlineLexer.rules = inline;
48387
48388 /**
48389  * Static Lexing/Compiling Method
48390  */
48391
48392 InlineLexer.output = function(src, links, options) {
48393   var inline = new InlineLexer(links, options);
48394   return inline.output(src);
48395 };
48396
48397 /**
48398  * Lexing/Compiling
48399  */
48400
48401 InlineLexer.prototype.output = function(src) {
48402   var out = '',
48403       link,
48404       text,
48405       href,
48406       cap;
48407
48408   while (src) {
48409     // escape
48410     if (cap = this.rules.escape.exec(src)) {
48411       src = src.substring(cap[0].length);
48412       out += cap[1];
48413       continue;
48414     }
48415
48416     // autolink
48417     if (cap = this.rules.autolink.exec(src)) {
48418       src = src.substring(cap[0].length);
48419       if (cap[2] === '@') {
48420         text = escape(this.mangle(cap[1]));
48421         href = 'mailto:' + text;
48422       } else {
48423         text = escape(cap[1]);
48424         href = text;
48425       }
48426       out += this.renderer.link(href, null, text);
48427       continue;
48428     }
48429
48430     // url (gfm)
48431     if (!this.inLink && (cap = this.rules.url.exec(src))) {
48432       cap[0] = this.rules._backpedal.exec(cap[0])[0];
48433       src = src.substring(cap[0].length);
48434       if (cap[2] === '@') {
48435         text = escape(cap[0]);
48436         href = 'mailto:' + text;
48437       } else {
48438         text = escape(cap[0]);
48439         if (cap[1] === 'www.') {
48440           href = 'http://' + text;
48441         } else {
48442           href = text;
48443         }
48444       }
48445       out += this.renderer.link(href, null, text);
48446       continue;
48447     }
48448
48449     // tag
48450     if (cap = this.rules.tag.exec(src)) {
48451       if (!this.inLink && /^<a /i.test(cap[0])) {
48452         this.inLink = true;
48453       } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
48454         this.inLink = false;
48455       }
48456       src = src.substring(cap[0].length);
48457       out += this.options.sanitize
48458         ? this.options.sanitizer
48459           ? this.options.sanitizer(cap[0])
48460           : escape(cap[0])
48461         : cap[0];
48462       continue;
48463     }
48464
48465     // link
48466     if (cap = this.rules.link.exec(src)) {
48467       src = src.substring(cap[0].length);
48468       this.inLink = true;
48469       out += this.outputLink(cap, {
48470         href: cap[2],
48471         title: cap[3]
48472       });
48473       this.inLink = false;
48474       continue;
48475     }
48476
48477     // reflink, nolink
48478     if ((cap = this.rules.reflink.exec(src))
48479         || (cap = this.rules.nolink.exec(src))) {
48480       src = src.substring(cap[0].length);
48481       link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
48482       link = this.links[link.toLowerCase()];
48483       if (!link || !link.href) {
48484         out += cap[0].charAt(0);
48485         src = cap[0].substring(1) + src;
48486         continue;
48487       }
48488       this.inLink = true;
48489       out += this.outputLink(cap, link);
48490       this.inLink = false;
48491       continue;
48492     }
48493
48494     // strong
48495     if (cap = this.rules.strong.exec(src)) {
48496       src = src.substring(cap[0].length);
48497       out += this.renderer.strong(this.output(cap[2] || cap[1]));
48498       continue;
48499     }
48500
48501     // em
48502     if (cap = this.rules.em.exec(src)) {
48503       src = src.substring(cap[0].length);
48504       out += this.renderer.em(this.output(cap[2] || cap[1]));
48505       continue;
48506     }
48507
48508     // code
48509     if (cap = this.rules.code.exec(src)) {
48510       src = src.substring(cap[0].length);
48511       out += this.renderer.codespan(escape(cap[2].trim(), true));
48512       continue;
48513     }
48514
48515     // br
48516     if (cap = this.rules.br.exec(src)) {
48517       src = src.substring(cap[0].length);
48518       out += this.renderer.br();
48519       continue;
48520     }
48521
48522     // del (gfm)
48523     if (cap = this.rules.del.exec(src)) {
48524       src = src.substring(cap[0].length);
48525       out += this.renderer.del(this.output(cap[1]));
48526       continue;
48527     }
48528
48529     // text
48530     if (cap = this.rules.text.exec(src)) {
48531       src = src.substring(cap[0].length);
48532       out += this.renderer.text(escape(this.smartypants(cap[0])));
48533       continue;
48534     }
48535
48536     if (src) {
48537       throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
48538     }
48539   }
48540
48541   return out;
48542 };
48543
48544 /**
48545  * Compile Link
48546  */
48547
48548 InlineLexer.prototype.outputLink = function(cap, link) {
48549   var href = escape(link.href),
48550       title = link.title ? escape(link.title) : null;
48551
48552   return cap[0].charAt(0) !== '!'
48553     ? this.renderer.link(href, title, this.output(cap[1]))
48554     : this.renderer.image(href, title, escape(cap[1]));
48555 };
48556
48557 /**
48558  * Smartypants Transformations
48559  */
48560
48561 InlineLexer.prototype.smartypants = function(text) {
48562   if (!this.options.smartypants) return text;
48563   return text
48564     // em-dashes
48565     .replace(/---/g, '\u2014')
48566     // en-dashes
48567     .replace(/--/g, '\u2013')
48568     // opening singles
48569     .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
48570     // closing singles & apostrophes
48571     .replace(/'/g, '\u2019')
48572     // opening doubles
48573     .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
48574     // closing doubles
48575     .replace(/"/g, '\u201d')
48576     // ellipses
48577     .replace(/\.{3}/g, '\u2026');
48578 };
48579
48580 /**
48581  * Mangle Links
48582  */
48583
48584 InlineLexer.prototype.mangle = function(text) {
48585   if (!this.options.mangle) return text;
48586   var out = '',
48587       l = text.length,
48588       i = 0,
48589       ch;
48590
48591   for (; i < l; i++) {
48592     ch = text.charCodeAt(i);
48593     if (Math.random() > 0.5) {
48594       ch = 'x' + ch.toString(16);
48595     }
48596     out += '&#' + ch + ';';
48597   }
48598
48599   return out;
48600 };
48601
48602 /**
48603  * Renderer
48604  */
48605
48606 function Renderer(options) {
48607   this.options = options || {};
48608 }
48609
48610 Renderer.prototype.code = function(code, lang, escaped) {
48611   if (this.options.highlight) {
48612     var out = this.options.highlight(code, lang);
48613     if (out != null && out !== code) {
48614       escaped = true;
48615       code = out;
48616     }
48617   }
48618
48619   if (!lang) {
48620     return '<pre><code>'
48621       + (escaped ? code : escape(code, true))
48622       + '\n</code></pre>';
48623   }
48624
48625   return '<pre><code class="'
48626     + this.options.langPrefix
48627     + escape(lang, true)
48628     + '">'
48629     + (escaped ? code : escape(code, true))
48630     + '\n</code></pre>\n';
48631 };
48632
48633 Renderer.prototype.blockquote = function(quote) {
48634   return '<blockquote>\n' + quote + '</blockquote>\n';
48635 };
48636
48637 Renderer.prototype.html = function(html) {
48638   return html;
48639 };
48640
48641 Renderer.prototype.heading = function(text, level, raw) {
48642   return '<h'
48643     + level
48644     + ' id="'
48645     + this.options.headerPrefix
48646     + raw.toLowerCase().replace(/[^\w]+/g, '-')
48647     + '">'
48648     + text
48649     + '</h'
48650     + level
48651     + '>\n';
48652 };
48653
48654 Renderer.prototype.hr = function() {
48655   return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
48656 };
48657
48658 Renderer.prototype.list = function(body, ordered) {
48659   var type = ordered ? 'ol' : 'ul';
48660   return '<' + type + '>\n' + body + '</' + type + '>\n';
48661 };
48662
48663 Renderer.prototype.listitem = function(text) {
48664   return '<li>' + text + '</li>\n';
48665 };
48666
48667 Renderer.prototype.paragraph = function(text) {
48668   return '<p>' + text + '</p>\n';
48669 };
48670
48671 Renderer.prototype.table = function(header, body) {
48672   return '<table>\n'
48673     + '<thead>\n'
48674     + header
48675     + '</thead>\n'
48676     + '<tbody>\n'
48677     + body
48678     + '</tbody>\n'
48679     + '</table>\n';
48680 };
48681
48682 Renderer.prototype.tablerow = function(content) {
48683   return '<tr>\n' + content + '</tr>\n';
48684 };
48685
48686 Renderer.prototype.tablecell = function(content, flags) {
48687   var type = flags.header ? 'th' : 'td';
48688   var tag = flags.align
48689     ? '<' + type + ' style="text-align:' + flags.align + '">'
48690     : '<' + type + '>';
48691   return tag + content + '</' + type + '>\n';
48692 };
48693
48694 // span level renderer
48695 Renderer.prototype.strong = function(text) {
48696   return '<strong>' + text + '</strong>';
48697 };
48698
48699 Renderer.prototype.em = function(text) {
48700   return '<em>' + text + '</em>';
48701 };
48702
48703 Renderer.prototype.codespan = function(text) {
48704   return '<code>' + text + '</code>';
48705 };
48706
48707 Renderer.prototype.br = function() {
48708   return this.options.xhtml ? '<br/>' : '<br>';
48709 };
48710
48711 Renderer.prototype.del = function(text) {
48712   return '<del>' + text + '</del>';
48713 };
48714
48715 Renderer.prototype.link = function(href, title, text) {
48716   if (this.options.sanitize) {
48717     try {
48718       var prot = decodeURIComponent(unescape(href))
48719         .replace(/[^\w:]/g, '')
48720         .toLowerCase();
48721     } catch (e) {
48722       return text;
48723     }
48724     if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
48725       return text;
48726     }
48727   }
48728   if (this.options.baseUrl && !originIndependentUrl.test(href)) {
48729     href = resolveUrl(this.options.baseUrl, href);
48730   }
48731   var out = '<a href="' + href + '"';
48732   if (title) {
48733     out += ' title="' + title + '"';
48734   }
48735   out += '>' + text + '</a>';
48736   return out;
48737 };
48738
48739 Renderer.prototype.image = function(href, title, text) {
48740   if (this.options.baseUrl && !originIndependentUrl.test(href)) {
48741     href = resolveUrl(this.options.baseUrl, href);
48742   }
48743   var out = '<img src="' + href + '" alt="' + text + '"';
48744   if (title) {
48745     out += ' title="' + title + '"';
48746   }
48747   out += this.options.xhtml ? '/>' : '>';
48748   return out;
48749 };
48750
48751 Renderer.prototype.text = function(text) {
48752   return text;
48753 };
48754
48755 /**
48756  * TextRenderer
48757  * returns only the textual part of the token
48758  */
48759
48760 function TextRenderer() {}
48761
48762 // no need for block level renderers
48763
48764 TextRenderer.prototype.strong =
48765 TextRenderer.prototype.em =
48766 TextRenderer.prototype.codespan =
48767 TextRenderer.prototype.del =
48768 TextRenderer.prototype.text = function (text) {
48769   return text;
48770 };
48771
48772 TextRenderer.prototype.link =
48773 TextRenderer.prototype.image = function(href, title, text) {
48774   return '' + text;
48775 };
48776
48777 TextRenderer.prototype.br = function() {
48778   return '';
48779 };
48780
48781 /**
48782  * Parsing & Compiling
48783  */
48784
48785 function Parser(options) {
48786   this.tokens = [];
48787   this.token = null;
48788   this.options = options || marked.defaults;
48789   this.options.renderer = this.options.renderer || new Renderer();
48790   this.renderer = this.options.renderer;
48791   this.renderer.options = this.options;
48792 }
48793
48794 /**
48795  * Static Parse Method
48796  */
48797
48798 Parser.parse = function(src, options) {
48799   var parser = new Parser(options);
48800   return parser.parse(src);
48801 };
48802
48803 /**
48804  * Parse Loop
48805  */
48806
48807 Parser.prototype.parse = function(src) {
48808   this.inline = new InlineLexer(src.links, this.options);
48809   // use an InlineLexer with a TextRenderer to extract pure text
48810   this.inlineText = new InlineLexer(
48811     src.links,
48812     merge({}, this.options, {renderer: new TextRenderer()})
48813   );
48814   this.tokens = src.reverse();
48815
48816   var out = '';
48817   while (this.next()) {
48818     out += this.tok();
48819   }
48820
48821   return out;
48822 };
48823
48824 /**
48825  * Next Token
48826  */
48827
48828 Parser.prototype.next = function() {
48829   return this.token = this.tokens.pop();
48830 };
48831
48832 /**
48833  * Preview Next Token
48834  */
48835
48836 Parser.prototype.peek = function() {
48837   return this.tokens[this.tokens.length - 1] || 0;
48838 };
48839
48840 /**
48841  * Parse Text Tokens
48842  */
48843
48844 Parser.prototype.parseText = function() {
48845   var body = this.token.text;
48846
48847   while (this.peek().type === 'text') {
48848     body += '\n' + this.next().text;
48849   }
48850
48851   return this.inline.output(body);
48852 };
48853
48854 /**
48855  * Parse Current Token
48856  */
48857
48858 Parser.prototype.tok = function() {
48859   switch (this.token.type) {
48860     case 'space': {
48861       return '';
48862     }
48863     case 'hr': {
48864       return this.renderer.hr();
48865     }
48866     case 'heading': {
48867       return this.renderer.heading(
48868         this.inline.output(this.token.text),
48869         this.token.depth,
48870         unescape(this.inlineText.output(this.token.text)));
48871     }
48872     case 'code': {
48873       return this.renderer.code(this.token.text,
48874         this.token.lang,
48875         this.token.escaped);
48876     }
48877     case 'table': {
48878       var header = '',
48879           body = '',
48880           i,
48881           row,
48882           cell,
48883           j;
48884
48885       // header
48886       cell = '';
48887       for (i = 0; i < this.token.header.length; i++) {
48888         cell += this.renderer.tablecell(
48889           this.inline.output(this.token.header[i]),
48890           { header: true, align: this.token.align[i] }
48891         );
48892       }
48893       header += this.renderer.tablerow(cell);
48894
48895       for (i = 0; i < this.token.cells.length; i++) {
48896         row = this.token.cells[i];
48897
48898         cell = '';
48899         for (j = 0; j < row.length; j++) {
48900           cell += this.renderer.tablecell(
48901             this.inline.output(row[j]),
48902             { header: false, align: this.token.align[j] }
48903           );
48904         }
48905
48906         body += this.renderer.tablerow(cell);
48907       }
48908       return this.renderer.table(header, body);
48909     }
48910     case 'blockquote_start': {
48911       body = '';
48912
48913       while (this.next().type !== 'blockquote_end') {
48914         body += this.tok();
48915       }
48916
48917       return this.renderer.blockquote(body);
48918     }
48919     case 'list_start': {
48920       body = '';
48921       var ordered = this.token.ordered;
48922
48923       while (this.next().type !== 'list_end') {
48924         body += this.tok();
48925       }
48926
48927       return this.renderer.list(body, ordered);
48928     }
48929     case 'list_item_start': {
48930       body = '';
48931
48932       while (this.next().type !== 'list_item_end') {
48933         body += this.token.type === 'text'
48934           ? this.parseText()
48935           : this.tok();
48936       }
48937
48938       return this.renderer.listitem(body);
48939     }
48940     case 'loose_item_start': {
48941       body = '';
48942
48943       while (this.next().type !== 'list_item_end') {
48944         body += this.tok();
48945       }
48946
48947       return this.renderer.listitem(body);
48948     }
48949     case 'html': {
48950       var html = !this.token.pre && !this.options.pedantic
48951         ? this.inline.output(this.token.text)
48952         : this.token.text;
48953       return this.renderer.html(html);
48954     }
48955     case 'paragraph': {
48956       return this.renderer.paragraph(this.inline.output(this.token.text));
48957     }
48958     case 'text': {
48959       return this.renderer.paragraph(this.parseText());
48960     }
48961   }
48962 };
48963
48964 /**
48965  * Helpers
48966  */
48967
48968 function escape(html, encode) {
48969   return html
48970     .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&amp;')
48971     .replace(/</g, '&lt;')
48972     .replace(/>/g, '&gt;')
48973     .replace(/"/g, '&quot;')
48974     .replace(/'/g, '&#39;');
48975 }
48976
48977 function unescape(html) {
48978   // explicitly match decimal, hex, and named HTML entities
48979   return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
48980     n = n.toLowerCase();
48981     if (n === 'colon') return ':';
48982     if (n.charAt(0) === '#') {
48983       return n.charAt(1) === 'x'
48984         ? String.fromCharCode(parseInt(n.substring(2), 16))
48985         : String.fromCharCode(+n.substring(1));
48986     }
48987     return '';
48988   });
48989 }
48990
48991 function edit(regex, opt) {
48992   regex = regex.source;
48993   opt = opt || '';
48994   return {
48995     replace: function(name, val) {
48996       val = val.source || val;
48997       val = val.replace(/(^|[^\[])\^/g, '$1');
48998       regex = regex.replace(name, val);
48999       return this;
49000     },
49001     getRegex: function() {
49002       return new RegExp(regex, opt);
49003     }
49004   };
49005 }
49006
49007 function resolveUrl(base, href) {
49008   if (!baseUrls[' ' + base]) {
49009     // we can ignore everything in base after the last slash of its path component,
49010     // but we might need to add _that_
49011     // https://tools.ietf.org/html/rfc3986#section-3
49012     if (/^[^:]+:\/*[^/]*$/.test(base)) {
49013       baseUrls[' ' + base] = base + '/';
49014     } else {
49015       baseUrls[' ' + base] = base.replace(/[^/]*$/, '');
49016     }
49017   }
49018   base = baseUrls[' ' + base];
49019
49020   if (href.slice(0, 2) === '//') {
49021     return base.replace(/:[\s\S]*/, ':') + href;
49022   } else if (href.charAt(0) === '/') {
49023     return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
49024   } else {
49025     return base + href;
49026   }
49027 }
49028 var baseUrls = {};
49029 var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
49030
49031 function noop() {}
49032 noop.exec = noop;
49033
49034 function merge(obj) {
49035   var i = 1,
49036       target,
49037       key;
49038
49039   for (; i < arguments.length; i++) {
49040     target = arguments[i];
49041     for (key in target) {
49042       if (Object.prototype.hasOwnProperty.call(target, key)) {
49043         obj[key] = target[key];
49044       }
49045     }
49046   }
49047
49048   return obj;
49049 }
49050
49051 /**
49052  * Marked
49053  */
49054
49055 function marked(src, opt, callback) {
49056   // throw error in case of non string input
49057   if (typeof src === 'undefined' || src === null) {
49058     throw new Error('marked(): input parameter is undefined or null');
49059   }
49060   if (typeof src !== 'string') {
49061     throw new Error('marked(): input parameter is of type '
49062       + Object.prototype.toString.call(src) + ', string expected');
49063   }
49064
49065   if (callback || typeof opt === 'function') {
49066     if (!callback) {
49067       callback = opt;
49068       opt = null;
49069     }
49070
49071     opt = merge({}, marked.defaults, opt || {});
49072
49073     var highlight = opt.highlight,
49074         tokens,
49075         pending,
49076         i = 0;
49077
49078     try {
49079       tokens = Lexer.lex(src, opt);
49080     } catch (e) {
49081       return callback(e);
49082     }
49083
49084     pending = tokens.length;
49085
49086     var done = function(err) {
49087       if (err) {
49088         opt.highlight = highlight;
49089         return callback(err);
49090       }
49091
49092       var out;
49093
49094       try {
49095         out = Parser.parse(tokens, opt);
49096       } catch (e) {
49097         err = e;
49098       }
49099
49100       opt.highlight = highlight;
49101
49102       return err
49103         ? callback(err)
49104         : callback(null, out);
49105     };
49106
49107     if (!highlight || highlight.length < 3) {
49108       return done();
49109     }
49110
49111     delete opt.highlight;
49112
49113     if (!pending) return done();
49114
49115     for (; i < tokens.length; i++) {
49116       (function(token) {
49117         if (token.type !== 'code') {
49118           return --pending || done();
49119         }
49120         return highlight(token.text, token.lang, function(err, code) {
49121           if (err) return done(err);
49122           if (code == null || code === token.text) {
49123             return --pending || done();
49124           }
49125           token.text = code;
49126           token.escaped = true;
49127           --pending || done();
49128         });
49129       })(tokens[i]);
49130     }
49131
49132     return;
49133   }
49134   try {
49135     if (opt) opt = merge({}, marked.defaults, opt);
49136     return Parser.parse(Lexer.lex(src, opt), opt);
49137   } catch (e) {
49138     e.message += '\nPlease report this to https://github.com/chjj/marked.';
49139     if ((opt || marked.defaults).silent) {
49140       return '<p>An error occurred:</p><pre>'
49141         + escape(e.message + '', true)
49142         + '</pre>';
49143     }
49144     throw e;
49145   }
49146 }
49147
49148 /**
49149  * Options
49150  */
49151
49152 marked.options =
49153 marked.setOptions = function(opt) {
49154   merge(marked.defaults, opt);
49155   return marked;
49156 };
49157
49158 marked.defaults = {
49159   gfm: true,
49160   tables: true,
49161   breaks: false,
49162   pedantic: false,
49163   sanitize: false,
49164   sanitizer: null,
49165   mangle: true,
49166   smartLists: false,
49167   silent: false,
49168   highlight: null,
49169   langPrefix: 'lang-',
49170   smartypants: false,
49171   headerPrefix: '',
49172   renderer: new Renderer(),
49173   xhtml: false,
49174   baseUrl: null
49175 };
49176
49177 /**
49178  * Expose
49179  */
49180
49181 marked.Parser = Parser;
49182 marked.parser = Parser.parse;
49183
49184 marked.Renderer = Renderer;
49185 marked.TextRenderer = TextRenderer;
49186
49187 marked.Lexer = Lexer;
49188 marked.lexer = Lexer.lex;
49189
49190 marked.InlineLexer = InlineLexer;
49191 marked.inlineLexer = InlineLexer.output;
49192
49193 marked.parse = marked;
49194
49195 {
49196   module.exports = marked;
49197 }
49198 })(commonjsGlobal || (typeof window !== 'undefined' ? window : commonjsGlobal));
49199 });
49200
49201 function pointBox(loc, context) {
49202     var rect = context.surfaceRect();
49203     var point$$1 = context.curtainProjection(loc);
49204     return {
49205         left: point$$1[0] + rect.left - 40,
49206         top: point$$1[1] + rect.top - 60,
49207         width: 80,
49208         height: 90
49209     };
49210 }
49211
49212
49213 function pad$1(locOrBox, padding, context) {
49214     var box;
49215     if (locOrBox instanceof Array) {
49216         var rect = context.surfaceRect();
49217         var point$$1 = context.curtainProjection(locOrBox);
49218         box = {
49219             left: point$$1[0] + rect.left,
49220             top: point$$1[1] + rect.top
49221         };
49222     } else {
49223         box = locOrBox;
49224     }
49225
49226     return {
49227         left: box.left - padding,
49228         top: box.top - padding,
49229         width: (box.width || 0) + 2 * padding,
49230         height: (box.width || 0) + 2 * padding
49231     };
49232 }
49233
49234
49235 function icon(name, svgklass, useklass) {
49236     return '<svg class="icon ' + (svgklass || '') + '">' +
49237          '<use xlink:href="' + name + '"' +
49238          (useklass ? ' class="' + useklass + '"' : '') + '></use></svg>';
49239 }
49240
49241
49242 function slugify(text) {
49243     return text.toString().toLowerCase()
49244         .replace(/\s+/g, '-')           // Replace spaces with -
49245         .replace(/[^\w\-]+/g, '')       // Remove all non-word chars
49246         .replace(/\-\-+/g, '-')         // Replace multiple - with single -
49247         .replace(/^-+/, '')             // Trim - from start of text
49248         .replace(/-+$/, '');            // Trim - from end of text
49249 }
49250
49251
49252 // console warning for missing walkthrough names
49253 var missingStrings = {};
49254 function checkKey(key, text) {
49255     if (t(key, { default: undefined}) === undefined) {
49256         if (missingStrings.hasOwnProperty(key)) return;  // warn once
49257         missingStrings[key] = text;
49258         var missing = key + ': ' + text;
49259         if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
49260     }
49261 }
49262
49263
49264 function localize(obj) {
49265     var key;
49266
49267     // Assign name if entity has one..
49268     var name = obj.tags && obj.tags.name;
49269     if (name) {
49270         key = 'intro.graph.name.' + slugify(name);
49271         obj.tags.name = t(key, { default: name });
49272         checkKey(key, name);
49273     }
49274
49275     // Assign street name if entity has one..
49276     var street = obj.tags && obj.tags['addr:street'];
49277     if (street) {
49278         key = 'intro.graph.name.' + slugify(street);
49279         obj.tags['addr:street'] = t(key, { default: street });
49280         checkKey(key, street);
49281
49282         // Add address details common across walkthrough..
49283         var addrTags = [
49284             'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
49285             'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
49286         ];
49287         addrTags.forEach(function(k) {
49288             var key = 'intro.graph.' + k,
49289                 tag = 'addr:' + k,
49290                 val = obj.tags && obj.tags[tag],
49291                 str = t(key, { default: val });
49292
49293             if (str) {
49294                 if (str.match(/^<.*>$/) !== null) {
49295                     delete obj.tags[tag];
49296                 } else {
49297                     obj.tags[tag] = str;
49298                 }
49299             }
49300         });
49301     }
49302
49303     return obj;
49304 }
49305
49306
49307 // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
49308 function isMostlySquare(points) {
49309     // note: uses 15 here instead of the 12 from actionOrthogonalize because
49310     // actionOrthogonalize can actually straighten some larger angles as it iterates
49311     var threshold = 15, // degrees within right or straight
49312         lowerBound = Math.cos((90 - threshold) * Math.PI / 180),  // near right
49313         upperBound = Math.cos(threshold * Math.PI / 180),         // near straight
49314         mag;
49315
49316     for (var i = 0; i < points.length; i++) {
49317         mag = Math.abs(normalizedDotProduct(i, points));
49318         if (mag > lowerBound && mag < upperBound) {
49319             return false;
49320         }
49321     }
49322
49323     return true;
49324
49325
49326     function normalizedDotProduct(i, points) {
49327         var a = points[(i - 1 + points.length) % points.length],
49328             b = points[i],
49329             c = points[(i + 1) % points.length],
49330             p = subtractPoints(a, b),
49331             q = subtractPoints(c, b);
49332
49333         p = normalizePoint(p);
49334         q = normalizePoint(q);
49335
49336         return p[0] * q[0] + p[1] * q[1];
49337
49338
49339         function subtractPoints(a, b) {
49340             return [a[0] - b[0], a[1] - b[1]];
49341         }
49342
49343         function normalizePoint(point$$1) {
49344             var vector = [0, 0];
49345             var length = Math.sqrt(point$$1[0] * point$$1[0] + point$$1[1] * point$$1[1]);
49346             if (length !== 0) {
49347                 vector[0] = point$$1[0] / length;
49348                 vector[1] = point$$1[1] / length;
49349             }
49350             return vector;
49351         }
49352     }
49353 }
49354
49355
49356 function selectMenuItem(operation) {
49357     var selector$$1 = '.edit-menu .edit-menu-item-' + operation +
49358         ', .radial-menu .radial-menu-item-' + operation;
49359     return d3_select(selector$$1);
49360 }
49361
49362
49363 function transitionTime(point1, point2) {
49364     var distance = geoSphericalDistance(point1, point2);
49365     if (distance === 0)
49366         return 0;
49367     else if (distance < 80)
49368         return 500;
49369     else
49370         return 1000;
49371 }
49372
49373 var dataIntroGraph = {"n1":{"id":"n1","loc":[-85.631039,41.948829]},"n10":{"id":"n10","loc":[-85.634733,41.941588]},"n100":{"id":"n100","loc":[-85.637395,41.942252]},"n1000":{"id":"n1000","loc":[-85.632699,41.944763]},"n1001":{"id":"n1001","loc":[-85.632685,41.944763]},"n1002":{"id":"n1002","loc":[-85.632673,41.944755]},"n1003":{"id":"n1003","loc":[-85.632595,41.944682]},"n1004":{"id":"n1004","loc":[-85.632576,41.944673]},"n1005":{"id":"n1005","loc":[-85.632551,41.944667]},"n1006":{"id":"n1006","loc":[-85.63253,41.944667]},"n1007":{"id":"n1007","loc":[-85.632502,41.944669]},"n1008":{"id":"n1008","loc":[-85.632483,41.944677]},"n1009":{"id":"n1009","loc":[-85.632383,41.944731]},"n101":{"id":"n101","loc":[-85.637357,41.942252]},"n1010":{"id":"n1010","loc":[-85.63349,41.944976],"tags":{"addr:city":"Three Rivers","addr:housenumber":"31","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Sherwin-Williams","shop":"paint"}},"n1011":{"id":"n1011","loc":[-85.633548,41.945034],"tags":{"addr:city":"Three Rivers","addr:housenumber":"33","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Unique Jewelry","shop":"jewelry"}},"n1012":{"id":"n1012","loc":[-85.633683,41.945129],"tags":{"addr:city":"Three Rivers","addr:housenumber":"37","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"World Fare","shop":"gift"}},"n1013":{"id":"n1013","loc":[-85.634563,41.945469],"tags":{"addr:city":"Three Rivers","addr:housenumber":"62","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Golden Finch Framing","shop":"frame"}},"n1014":{"id":"n1014","loc":[-85.634469,41.945379],"tags":{"addr:city":"Three Rivers","addr:housenumber":"58","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Dollar Tree","shop":"second_hand"}},"n1015":{"id":"n1015","loc":[-85.634227,41.945159],"tags":{"addr:city":"Three Rivers","addr:housenumber":"48","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","amenity":"theatre","name":"Riviera Theatre"}},"n1016":{"id":"n1016","loc":[-85.634057,41.945012],"tags":{"addr:city":"Three Rivers","addr:housenumber":"42","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"River City Appliance","shop":"appliance"}},"n1017":{"id":"n1017","loc":[-85.633879,41.945325],"tags":{"addr:city":"Three Rivers","addr:housenumber":"45","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Paparazzi Tattoo","shop":"tattoo"}},"n1018":{"id":"n1018","loc":[-85.634914,41.945839],"tags":{"addr:city":"Three Rivers","addr:housenumber":"88","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","amenity":"bank","name":"Southern Michigan Bank"}},"n1019":{"id":"n1019","loc":[-85.634514,41.946176]},"n102":{"id":"n102","loc":[-85.637357,41.942216]},"n1020":{"id":"n1020","loc":[-85.634087,41.946178]},"n1021":{"id":"n1021","loc":[-85.634357,41.945805]},"n1022":{"id":"n1022","loc":[-85.634389,41.945788]},"n1023":{"id":"n1023","loc":[-85.634491,41.94581]},"n1024":{"id":"n1024","loc":[-85.634513,41.945853]},"n1025":{"id":"n1025","loc":[-85.634506,41.94583]},"n1026":{"id":"n1026","loc":[-85.634762,41.946056],"tags":{"crossing":"zebra","highway":"crossing"}},"n1027":{"id":"n1027","loc":[-85.634767,41.946172]},"n1028":{"id":"n1028","loc":[-85.634622,41.946175],"tags":{"crossing":"zebra","highway":"crossing"}},"n1029":{"id":"n1029","loc":[-85.640655,41.942057]},"n103":{"id":"n103","loc":[-85.637386,41.942054]},"n1030":{"id":"n1030","loc":[-85.640947,41.942057]},"n1031":{"id":"n1031","loc":[-85.640957,41.942593]},"n1032":{"id":"n1032","loc":[-85.630953,41.960873]},"n1033":{"id":"n1033","loc":[-85.632174,41.960679]},"n1034":{"id":"n1034","loc":[-85.638785,41.943066]},"n1035":{"id":"n1035","loc":[-85.638853,41.943065]},"n1036":{"id":"n1036","loc":[-85.638855,41.943183]},"n1037":{"id":"n1037","loc":[-85.638552,41.943189]},"n1038":{"id":"n1038","loc":[-85.63855,41.943149]},"n1039":{"id":"n1039","loc":[-85.638638,41.943068]},"n104":{"id":"n104","loc":[-85.637387,41.942125]},"n1040":{"id":"n1040","loc":[-85.638638,41.943078]},"n1041":{"id":"n1041","loc":[-85.638813,41.943163]},"n1042":{"id":"n1042","loc":[-85.638684,41.943165]},"n1043":{"id":"n1043","loc":[-85.638682,41.943105]},"n1044":{"id":"n1044","loc":[-85.638706,41.943105]},"n1045":{"id":"n1045","loc":[-85.638707,41.943117]},"n1046":{"id":"n1046","loc":[-85.638812,41.943115]},"n1047":{"id":"n1047","loc":[-85.638769,41.943407]},"n1048":{"id":"n1048","loc":[-85.638549,41.943407]},"n1049":{"id":"n1049","loc":[-85.638567,41.943555]},"n105":{"id":"n105","loc":[-85.637319,41.942125]},"n1050":{"id":"n1050","loc":[-85.638426,41.943554]},"n1051":{"id":"n1051","loc":[-85.638427,41.94346]},"n1052":{"id":"n1052","loc":[-85.638568,41.943461]},"n1053":{"id":"n1053","loc":[-85.639264,41.943415]},"n1054":{"id":"n1054","loc":[-85.639082,41.943417]},"n1055":{"id":"n1055","loc":[-85.63908,41.943331]},"n1056":{"id":"n1056","loc":[-85.639136,41.94333]},"n1057":{"id":"n1057","loc":[-85.639158,41.943312]},"n1058":{"id":"n1058","loc":[-85.639188,41.943313]},"n1059":{"id":"n1059","loc":[-85.639211,41.943331]},"n106":{"id":"n106","loc":[-85.637319,41.942137]},"n1060":{"id":"n1060","loc":[-85.639262,41.943331]},"n1061":{"id":"n1061","loc":[-85.638986,41.943515]},"n1062":{"id":"n1062","loc":[-85.63888,41.943521]},"n1063":{"id":"n1063","loc":[-85.638871,41.943436]},"n1064":{"id":"n1064","loc":[-85.638958,41.943431]},"n1065":{"id":"n1065","loc":[-85.638979,41.943443]},"n1066":{"id":"n1066","loc":[-85.63926,41.943703]},"n1067":{"id":"n1067","loc":[-85.639152,41.943704]},"n1068":{"id":"n1068","loc":[-85.639152,41.943691]},"n1069":{"id":"n1069","loc":[-85.639063,41.943691]},"n107":{"id":"n107","loc":[-85.637259,41.942137]},"n1070":{"id":"n1070","loc":[-85.639062,41.943613]},"n1071":{"id":"n1071","loc":[-85.639259,41.943611]},"n1072":{"id":"n1072","loc":[-85.639117,41.943726]},"n1073":{"id":"n1073","loc":[-85.639118,41.943767]},"n1074":{"id":"n1074","loc":[-85.639051,41.943768]},"n1075":{"id":"n1075","loc":[-85.63905,41.943727]},"n1076":{"id":"n1076","loc":[-85.638627,41.943716]},"n1077":{"id":"n1077","loc":[-85.63863,41.943634]},"n1078":{"id":"n1078","loc":[-85.63844,41.943631]},"n1079":{"id":"n1079","loc":[-85.638437,41.943729]},"n108":{"id":"n108","loc":[-85.637259,41.942126]},"n1080":{"id":"n1080","loc":[-85.638533,41.94373]},"n1081":{"id":"n1081","loc":[-85.638534,41.943715]},"n1082":{"id":"n1082","loc":[-85.638678,41.943941]},"n1083":{"id":"n1083","loc":[-85.638522,41.943944]},"n1084":{"id":"n1084","loc":[-85.63852,41.943864]},"n1085":{"id":"n1085","loc":[-85.638676,41.943861]},"n1086":{"id":"n1086","loc":[-85.638663,41.944059]},"n1087":{"id":"n1087","loc":[-85.638513,41.944061]},"n1088":{"id":"n1088","loc":[-85.638511,41.943991]},"n1089":{"id":"n1089","loc":[-85.638661,41.943989]},"n109":{"id":"n109","loc":[-85.637193,41.942126]},"n1090":{"id":"n1090","loc":[-85.63865,41.944134]},"n1091":{"id":"n1091","loc":[-85.638429,41.944144]},"n1092":{"id":"n1092","loc":[-85.638426,41.944106]},"n1093":{"id":"n1093","loc":[-85.638476,41.944104]},"n1094":{"id":"n1094","loc":[-85.638475,41.94409]},"n1095":{"id":"n1095","loc":[-85.638594,41.944084]},"n1096":{"id":"n1096","loc":[-85.638595,41.944101]},"n1097":{"id":"n1097","loc":[-85.638647,41.944099]},"n1098":{"id":"n1098","loc":[-85.63829,41.944154]},"n1099":{"id":"n1099","loc":[-85.638558,41.944155]},"n11":{"id":"n11","loc":[-85.634602,41.941523]},"n110":{"id":"n110","loc":[-85.637192,41.942053]},"n1100":{"id":"n1100","loc":[-85.638558,41.944338]},"n1101":{"id":"n1101","loc":[-85.638851,41.944408]},"n1102":{"id":"n1102","loc":[-85.637771,41.943989]},"n1103":{"id":"n1103","loc":[-85.639345,41.943964]},"n1104":{"id":"n1104","loc":[-85.638515,41.94397]},"n1105":{"id":"n1105","loc":[-85.639256,41.943928]},"n1106":{"id":"n1106","loc":[-85.639157,41.943929]},"n1107":{"id":"n1107","loc":[-85.639156,41.9439]},"n1108":{"id":"n1108","loc":[-85.639118,41.9439]},"n1109":{"id":"n1109","loc":[-85.639116,41.94382]},"n111":{"id":"n111","loc":[-85.637248,41.942053]},"n1110":{"id":"n1110","loc":[-85.639202,41.943819]},"n1111":{"id":"n1111","loc":[-85.639202,41.943837]},"n1112":{"id":"n1112","loc":[-85.639293,41.943836]},"n1113":{"id":"n1113","loc":[-85.639295,41.943898]},"n1114":{"id":"n1114","loc":[-85.639255,41.943898]},"n1115":{"id":"n1115","loc":[-85.639296,41.944083]},"n1116":{"id":"n1116","loc":[-85.639144,41.944084]},"n1117":{"id":"n1117","loc":[-85.639143,41.944026]},"n1118":{"id":"n1118","loc":[-85.639162,41.944026]},"n1119":{"id":"n1119","loc":[-85.639162,41.944]},"n112":{"id":"n112","loc":[-85.637248,41.942042]},"n1120":{"id":"n1120","loc":[-85.639295,41.943999]},"n1121":{"id":"n1121","loc":[-85.639131,41.944139]},"n1122":{"id":"n1122","loc":[-85.63901,41.94414]},"n1123":{"id":"n1123","loc":[-85.63901,41.944076]},"n1124":{"id":"n1124","loc":[-85.63913,41.944075]},"n1125":{"id":"n1125","loc":[-85.639092,41.944155]},"n1126":{"id":"n1126","loc":[-85.639093,41.944308]},"n1127":{"id":"n1127","loc":[-85.639225,41.944308]},"n1128":{"id":"n1128","loc":[-85.639225,41.94429]},"n1129":{"id":"n1129","loc":[-85.639253,41.944289]},"n113":{"id":"n113","loc":[-85.637338,41.942041]},"n1130":{"id":"n1130","loc":[-85.639253,41.944269]},"n1131":{"id":"n1131","loc":[-85.639243,41.944269]},"n1132":{"id":"n1132","loc":[-85.639243,41.944229]},"n1133":{"id":"n1133","loc":[-85.639224,41.944229]},"n1134":{"id":"n1134","loc":[-85.639224,41.944196]},"n1135":{"id":"n1135","loc":[-85.639195,41.944196]},"n1136":{"id":"n1136","loc":[-85.639195,41.944155]},"n1137":{"id":"n1137","loc":[-85.639072,41.944154]},"n1138":{"id":"n1138","loc":[-85.638865,41.944154]},"n1139":{"id":"n1139","loc":[-85.638863,41.943967]},"n114":{"id":"n114","loc":[-85.637338,41.942055]},"n1140":{"id":"n1140","loc":[-85.6386,41.942698]},"n1141":{"id":"n1141","loc":[-85.639348,41.942698]},"n1142":{"id":"n1142","loc":[-85.639377,41.944984]},"n1143":{"id":"n1143","loc":[-85.63937,41.945013]},"n1144":{"id":"n1144","loc":[-85.639357,41.945033]},"n1145":{"id":"n1145","loc":[-85.639353,41.945053]},"n1146":{"id":"n1146","loc":[-85.639352,41.945084]},"n1147":{"id":"n1147","loc":[-85.638278,41.945516]},"n1148":{"id":"n1148","loc":[-85.637505,41.945801]},"n1149":{"id":"n1149","loc":[-85.637327,41.945857]},"n115":{"id":"n115","loc":[-85.637583,41.941943]},"n1150":{"id":"n1150","loc":[-85.637168,41.945899]},"n1151":{"id":"n1151","loc":[-85.637017,41.94593]},"n1152":{"id":"n1152","loc":[-85.637185,41.945938]},"n1153":{"id":"n1153","loc":[-85.63682,41.945963]},"n1154":{"id":"n1154","loc":[-85.636639,41.945984]},"n1155":{"id":"n1155","loc":[-85.636439,41.945999]},"n1156":{"id":"n1156","loc":[-85.635801,41.945999]},"n1157":{"id":"n1157","loc":[-85.635769,41.945908]},"n1158":{"id":"n1158","loc":[-85.635953,41.946154]},"n1159":{"id":"n1159","loc":[-85.635472,41.94598]},"n116":{"id":"n116","loc":[-85.637584,41.941983]},"n1160":{"id":"n1160","loc":[-85.635409,41.945981]},"n1161":{"id":"n1161","loc":[-85.635583,41.945987]},"n1162":{"id":"n1162","loc":[-85.636452,41.945805]},"n1163":{"id":"n1163","loc":[-85.636425,41.94582]},"n1164":{"id":"n1164","loc":[-85.636396,41.945817]},"n1165":{"id":"n1165","loc":[-85.636368,41.945797]},"n1166":{"id":"n1166","loc":[-85.636346,41.945767]},"n1167":{"id":"n1167","loc":[-85.636307,41.945745]},"n1168":{"id":"n1168","loc":[-85.636194,41.94565]},"n1169":{"id":"n1169","loc":[-85.636121,41.945579]},"n117":{"id":"n117","loc":[-85.63751,41.941983]},"n1170":{"id":"n1170","loc":[-85.635995,41.945432]},"n1171":{"id":"n1171","loc":[-85.637564,41.943538]},"n1172":{"id":"n1172","loc":[-85.63756,41.943505]},"n1173":{"id":"n1173","loc":[-85.637435,41.943489]},"n1174":{"id":"n1174","loc":[-85.637093,41.943556]},"n1175":{"id":"n1175","loc":[-85.634836,41.941574]},"n1176":{"id":"n1176","loc":[-85.634692,41.9415]},"n1177":{"id":"n1177","loc":[-85.634261,41.941337]},"n1178":{"id":"n1178","loc":[-85.634208,41.940962]},"n1179":{"id":"n1179","loc":[-85.635247,41.940968]},"n118":{"id":"n118","loc":[-85.637509,41.941944]},"n1180":{"id":"n1180","loc":[-85.63514,41.941205]},"n1181":{"id":"n1181","loc":[-85.634858,41.941511]},"n1182":{"id":"n1182","loc":[-85.630725,41.943465]},"n1183":{"id":"n1183","loc":[-85.632591,41.942826]},"n1184":{"id":"n1184","loc":[-85.634487,41.941928]},"n1185":{"id":"n1185","loc":[-85.634499,41.942056]},"n1186":{"id":"n1186","loc":[-85.63433,41.943102]},"n1187":{"id":"n1187","loc":[-85.634158,41.943151]},"n1188":{"id":"n1188","loc":[-85.634107,41.94305]},"n1189":{"id":"n1189","loc":[-85.634279,41.943002]},"n119":{"id":"n119","loc":[-85.637724,41.941973]},"n1190":{"id":"n1190","loc":[-85.634362,41.943762]},"n1191":{"id":"n1191","loc":[-85.634331,41.943731]},"n1192":{"id":"n1192","loc":[-85.634396,41.943695]},"n1193":{"id":"n1193","loc":[-85.634426,41.943726]},"n1194":{"id":"n1194","loc":[-85.621569,41.956021]},"n1195":{"id":"n1195","loc":[-85.621574,41.956164]},"n1196":{"id":"n1196","loc":[-85.621489,41.956165]},"n1197":{"id":"n1197","loc":[-85.621488,41.956136]},"n1198":{"id":"n1198","loc":[-85.621372,41.956139]},"n1199":{"id":"n1199","loc":[-85.621369,41.956049]},"n12":{"id":"n12","loc":[-85.63359,41.941093]},"n120":{"id":"n120","loc":[-85.637633,41.941973]},"n1200":{"id":"n1200","loc":[-85.621493,41.956047]},"n1201":{"id":"n1201","loc":[-85.621492,41.956022]},"n1202":{"id":"n1202","loc":[-85.619744,41.953192]},"n1203":{"id":"n1203","loc":[-85.619059,41.953902]},"n1204":{"id":"n1204","loc":[-85.623984,41.95469]},"n1205":{"id":"n1205","loc":[-85.630159,41.958208]},"n1206":{"id":"n1206","loc":[-85.63002,41.958208]},"n1207":{"id":"n1207","loc":[-85.630021,41.95814]},"n1208":{"id":"n1208","loc":[-85.63,41.95814]},"n1209":{"id":"n1209","loc":[-85.63,41.958043]},"n121":{"id":"n121","loc":[-85.637633,41.941853]},"n1210":{"id":"n1210","loc":[-85.630159,41.958043]},"n1211":{"id":"n1211","loc":[-85.630304,41.957566]},"n1212":{"id":"n1212","loc":[-85.630303,41.957684]},"n1213":{"id":"n1213","loc":[-85.630073,41.957683]},"n1214":{"id":"n1214","loc":[-85.630072,41.957721]},"n1215":{"id":"n1215","loc":[-85.629993,41.95772]},"n1216":{"id":"n1216","loc":[-85.629993,41.95768]},"n1217":{"id":"n1217","loc":[-85.629968,41.95768]},"n1218":{"id":"n1218","loc":[-85.629969,41.957588]},"n1219":{"id":"n1219","loc":[-85.630219,41.95759]},"n122":{"id":"n122","loc":[-85.637724,41.941853]},"n1220":{"id":"n1220","loc":[-85.630219,41.957566]},"n1221":{"id":"n1221","loc":[-85.630717,41.957744]},"n1222":{"id":"n1222","loc":[-85.630596,41.957745]},"n1223":{"id":"n1223","loc":[-85.630598,41.957553]},"n1224":{"id":"n1224","loc":[-85.630717,41.957555]},"n1225":{"id":"n1225","loc":[-85.630609,41.957745]},"n1226":{"id":"n1226","loc":[-85.63061,41.957789]},"n1227":{"id":"n1227","loc":[-85.630327,41.957791]},"n1228":{"id":"n1228","loc":[-85.630324,41.95752]},"n1229":{"id":"n1229","loc":[-85.630325,41.95756]},"n123":{"id":"n123","loc":[-85.637773,41.941988]},"n1230":{"id":"n1230","loc":[-85.63057,41.95756]},"n1231":{"id":"n1231","loc":[-85.63069,41.958016]},"n1232":{"id":"n1232","loc":[-85.630586,41.958017]},"n1233":{"id":"n1233","loc":[-85.630584,41.957956]},"n1234":{"id":"n1234","loc":[-85.630614,41.957956]},"n1235":{"id":"n1235","loc":[-85.630611,41.957835]},"n1236":{"id":"n1236","loc":[-85.630737,41.957833]},"n1237":{"id":"n1237","loc":[-85.630739,41.957921]},"n1238":{"id":"n1238","loc":[-85.630688,41.957922]},"n1239":{"id":"n1239","loc":[-85.630719,41.958291]},"n124":{"id":"n124","loc":[-85.637773,41.942046]},"n1240":{"id":"n1240","loc":[-85.630592,41.958291]},"n1241":{"id":"n1241","loc":[-85.630593,41.958108]},"n1242":{"id":"n1242","loc":[-85.630701,41.958109]},"n1243":{"id":"n1243","loc":[-85.6307,41.958173]},"n1244":{"id":"n1244","loc":[-85.630711,41.958173]},"n1245":{"id":"n1245","loc":[-85.630711,41.958233]},"n1246":{"id":"n1246","loc":[-85.630719,41.958233]},"n1247":{"id":"n1247","loc":[-85.630523,41.958329]},"n1248":{"id":"n1248","loc":[-85.630388,41.958329]},"n1249":{"id":"n1249","loc":[-85.630387,41.958262]},"n125":{"id":"n125","loc":[-85.637693,41.942047]},"n1250":{"id":"n1250","loc":[-85.630523,41.958261]},"n1251":{"id":"n1251","loc":[-85.63072,41.958636]},"n1252":{"id":"n1252","loc":[-85.630721,41.958709]},"n1253":{"id":"n1253","loc":[-85.630503,41.958712]},"n1254":{"id":"n1254","loc":[-85.630498,41.958511]},"n1255":{"id":"n1255","loc":[-85.630635,41.95851]},"n1256":{"id":"n1256","loc":[-85.630638,41.958636]},"n1257":{"id":"n1257","loc":[-85.630437,41.958822]},"n1258":{"id":"n1258","loc":[-85.630437,41.958849]},"n1259":{"id":"n1259","loc":[-85.630393,41.958849]},"n126":{"id":"n126","loc":[-85.637692,41.941988]},"n1260":{"id":"n1260","loc":[-85.630393,41.958822]},"n1261":{"id":"n1261","loc":[-85.630605,41.959102]},"n1262":{"id":"n1262","loc":[-85.63049,41.959104]},"n1263":{"id":"n1263","loc":[-85.630487,41.958996]},"n1264":{"id":"n1264","loc":[-85.630462,41.958996]},"n1265":{"id":"n1265","loc":[-85.63046,41.958922]},"n1266":{"id":"n1266","loc":[-85.630562,41.958921]},"n1267":{"id":"n1267","loc":[-85.630564,41.958992]},"n1268":{"id":"n1268","loc":[-85.630602,41.958992]},"n1269":{"id":"n1269","loc":[-85.630126,41.957096]},"n127":{"id":"n127","loc":[-85.637604,41.941994]},"n1270":{"id":"n1270","loc":[-85.630129,41.957283]},"n1271":{"id":"n1271","loc":[-85.629993,41.957284]},"n1272":{"id":"n1272","loc":[-85.629992,41.957216]},"n1273":{"id":"n1273","loc":[-85.630015,41.957215]},"n1274":{"id":"n1274","loc":[-85.630013,41.957097]},"n1275":{"id":"n1275","loc":[-85.630211,41.956592]},"n1276":{"id":"n1276","loc":[-85.630211,41.956676]},"n1277":{"id":"n1277","loc":[-85.630162,41.956676]},"n1278":{"id":"n1278","loc":[-85.630162,41.95676]},"n1279":{"id":"n1279","loc":[-85.630037,41.956761]},"n128":{"id":"n128","loc":[-85.637604,41.942057]},"n1280":{"id":"n1280","loc":[-85.630037,41.956592]},"n1281":{"id":"n1281","loc":[-85.630309,41.95653]},"n1282":{"id":"n1282","loc":[-85.630326,41.957065]},"n1283":{"id":"n1283","loc":[-85.630118,41.957065]},"n1284":{"id":"n1284","loc":[-85.630119,41.957096]},"n1285":{"id":"n1285","loc":[-85.63067,41.957307]},"n1286":{"id":"n1286","loc":[-85.630536,41.957308]},"n1287":{"id":"n1287","loc":[-85.630533,41.957111]},"n1288":{"id":"n1288","loc":[-85.630667,41.95711]},"n1289":{"id":"n1289","loc":[-85.630676,41.956808]},"n129":{"id":"n129","loc":[-85.63748,41.942057]},"n1290":{"id":"n1290","loc":[-85.630551,41.956808]},"n1291":{"id":"n1291","loc":[-85.630552,41.956982]},"n1292":{"id":"n1292","loc":[-85.63059,41.956982]},"n1293":{"id":"n1293","loc":[-85.63059,41.957001]},"n1294":{"id":"n1294","loc":[-85.630692,41.957001]},"n1295":{"id":"n1295","loc":[-85.630692,41.956936]},"n1296":{"id":"n1296","loc":[-85.630676,41.956936]},"n1297":{"id":"n1297","loc":[-85.630496,41.956889]},"n1298":{"id":"n1298","loc":[-85.630501,41.956947]},"n1299":{"id":"n1299","loc":[-85.630377,41.956953]},"n13":{"id":"n13","loc":[-85.633643,41.941143]},"n130":{"id":"n130","loc":[-85.63748,41.941994]},"n1300":{"id":"n1300","loc":[-85.630359,41.956938]},"n1301":{"id":"n1301","loc":[-85.630359,41.956912]},"n1302":{"id":"n1302","loc":[-85.63038,41.956894]},"n1303":{"id":"n1303","loc":[-85.630679,41.956747]},"n1304":{"id":"n1304","loc":[-85.630572,41.956748]},"n1305":{"id":"n1305","loc":[-85.63057,41.956668]},"n1306":{"id":"n1306","loc":[-85.630501,41.956669]},"n1307":{"id":"n1307","loc":[-85.630499,41.95659]},"n1308":{"id":"n1308","loc":[-85.630565,41.956589]},"n1309":{"id":"n1309","loc":[-85.630564,41.956541]},"n131":{"id":"n131","loc":[-85.637431,41.941832]},"n1310":{"id":"n1310","loc":[-85.630686,41.956539]},"n1311":{"id":"n1311","loc":[-85.630688,41.956631]},"n1312":{"id":"n1312","loc":[-85.630676,41.956631]},"n1313":{"id":"n1313","loc":[-85.630686,41.956487]},"n1314":{"id":"n1314","loc":[-85.63059,41.956487]},"n1315":{"id":"n1315","loc":[-85.63059,41.956396]},"n1316":{"id":"n1316","loc":[-85.630686,41.956396]},"n1317":{"id":"n1317","loc":[-85.630643,41.9563]},"n1318":{"id":"n1318","loc":[-85.630548,41.956301]},"n1319":{"id":"n1319","loc":[-85.630545,41.956217]},"n132":{"id":"n132","loc":[-85.637432,41.94189]},"n1320":{"id":"n1320","loc":[-85.630529,41.956214]},"n1321":{"id":"n1321","loc":[-85.630521,41.956202]},"n1322":{"id":"n1322","loc":[-85.63052,41.95618]},"n1323":{"id":"n1323","loc":[-85.630527,41.956169]},"n1324":{"id":"n1324","loc":[-85.630544,41.956163]},"n1325":{"id":"n1325","loc":[-85.630543,41.956094]},"n1326":{"id":"n1326","loc":[-85.630641,41.956093]},"n1327":{"id":"n1327","loc":[-85.630642,41.956134]},"n1328":{"id":"n1328","loc":[-85.630656,41.956134]},"n1329":{"id":"n1329","loc":[-85.630657,41.956252]},"n133":{"id":"n133","loc":[-85.637412,41.94189]},"n1330":{"id":"n1330","loc":[-85.630643,41.956252]},"n1331":{"id":"n1331","loc":[-85.630409,41.956044]},"n1332":{"id":"n1332","loc":[-85.630409,41.956075]},"n1333":{"id":"n1333","loc":[-85.630195,41.956078]},"n1334":{"id":"n1334","loc":[-85.630195,41.9561]},"n1335":{"id":"n1335","loc":[-85.630088,41.956101]},"n1336":{"id":"n1336","loc":[-85.630087,41.956048]},"n1337":{"id":"n1337","loc":[-85.630345,41.956114]},"n1338":{"id":"n1338","loc":[-85.630328,41.956113]},"n1339":{"id":"n1339","loc":[-85.63034,41.956189]},"n134":{"id":"n134","loc":[-85.637413,41.941938]},"n1340":{"id":"n1340","loc":[-85.630355,41.956185]},"n1341":{"id":"n1341","loc":[-85.630311,41.956117]},"n1342":{"id":"n1342","loc":[-85.630297,41.956125]},"n1343":{"id":"n1343","loc":[-85.630287,41.956136]},"n1344":{"id":"n1344","loc":[-85.630283,41.956149]},"n1345":{"id":"n1345","loc":[-85.630285,41.956162]},"n1346":{"id":"n1346","loc":[-85.630293,41.956174]},"n1347":{"id":"n1347","loc":[-85.630306,41.956183]},"n1348":{"id":"n1348","loc":[-85.630322,41.956188]},"n1349":{"id":"n1349","loc":[-85.630368,41.956179]},"n135":{"id":"n135","loc":[-85.637342,41.941939]},"n1350":{"id":"n1350","loc":[-85.630378,41.95617]},"n1351":{"id":"n1351","loc":[-85.630384,41.956159]},"n1352":{"id":"n1352","loc":[-85.630385,41.956147]},"n1353":{"id":"n1353","loc":[-85.630381,41.956136]},"n1354":{"id":"n1354","loc":[-85.630372,41.956126]},"n1355":{"id":"n1355","loc":[-85.63036,41.956118]},"n1356":{"id":"n1356","loc":[-85.630776,41.956041]},"n1357":{"id":"n1357","loc":[-85.630195,41.956036]},"n1358":{"id":"n1358","loc":[-85.630137,41.956037]},"n1359":{"id":"n1359","loc":[-85.630136,41.956006]},"n136":{"id":"n136","loc":[-85.637342,41.941914]},"n1360":{"id":"n1360","loc":[-85.630194,41.956005]},"n1361":{"id":"n1361","loc":[-85.629864,41.956039]},"n1362":{"id":"n1362","loc":[-85.629864,41.955862]},"n1363":{"id":"n1363","loc":[-85.629541,41.958291]},"n1364":{"id":"n1364","loc":[-85.629419,41.958292]},"n1365":{"id":"n1365","loc":[-85.629417,41.958168]},"n1366":{"id":"n1366","loc":[-85.629445,41.958168]},"n1367":{"id":"n1367","loc":[-85.629444,41.958109]},"n1368":{"id":"n1368","loc":[-85.629537,41.958108]},"n1369":{"id":"n1369","loc":[-85.629351,41.958136]},"n137":{"id":"n137","loc":[-85.637212,41.941916]},"n1370":{"id":"n1370","loc":[-85.629352,41.958202]},"n1371":{"id":"n1371","loc":[-85.629365,41.958202]},"n1372":{"id":"n1372","loc":[-85.629365,41.958223]},"n1373":{"id":"n1373","loc":[-85.629291,41.958224]},"n1374":{"id":"n1374","loc":[-85.62929,41.958137]},"n1375":{"id":"n1375","loc":[-85.629443,41.958073]},"n1376":{"id":"n1376","loc":[-85.629252,41.958075]},"n1377":{"id":"n1377","loc":[-85.629253,41.95827]},"n1378":{"id":"n1378","loc":[-85.629566,41.957585]},"n1379":{"id":"n1379","loc":[-85.629566,41.957692]},"n138":{"id":"n138","loc":[-85.637211,41.941835]},"n1380":{"id":"n1380","loc":[-85.629281,41.957693]},"n1381":{"id":"n1381","loc":[-85.62928,41.957585]},"n1382":{"id":"n1382","loc":[-85.629004,41.957599]},"n1383":{"id":"n1383","loc":[-85.629004,41.957682]},"n1384":{"id":"n1384","loc":[-85.628902,41.957682]},"n1385":{"id":"n1385","loc":[-85.628902,41.957723]},"n1386":{"id":"n1386","loc":[-85.628731,41.957724]},"n1387":{"id":"n1387","loc":[-85.628731,41.9576]},"n1388":{"id":"n1388","loc":[-85.62836,41.957679]},"n1389":{"id":"n1389","loc":[-85.628359,41.957759]},"n139":{"id":"n139","loc":[-85.637293,41.941834]},"n1390":{"id":"n1390","loc":[-85.628062,41.957757]},"n1391":{"id":"n1391","loc":[-85.628063,41.957657]},"n1392":{"id":"n1392","loc":[-85.628198,41.957657]},"n1393":{"id":"n1393","loc":[-85.628198,41.957678]},"n1394":{"id":"n1394","loc":[-85.627775,41.958095]},"n1395":{"id":"n1395","loc":[-85.627608,41.958095]},"n1396":{"id":"n1396","loc":[-85.627606,41.957829]},"n1397":{"id":"n1397","loc":[-85.627774,41.957829]},"n1398":{"id":"n1398","loc":[-85.626816,41.957636]},"n1399":{"id":"n1399","loc":[-85.626787,41.957681]},"n14":{"id":"n14","loc":[-85.633643,41.940122]},"n140":{"id":"n140","loc":[-85.637293,41.941823]},"n1400":{"id":"n1400","loc":[-85.626673,41.95764]},"n1401":{"id":"n1401","loc":[-85.626703,41.957594]},"n1402":{"id":"n1402","loc":[-85.62694,41.95752]},"n1403":{"id":"n1403","loc":[-85.62688,41.957611]},"n1404":{"id":"n1404","loc":[-85.626798,41.957582]},"n1405":{"id":"n1405","loc":[-85.626793,41.95759]},"n1406":{"id":"n1406","loc":[-85.626657,41.95754]},"n1407":{"id":"n1407","loc":[-85.626666,41.957526]},"n1408":{"id":"n1408","loc":[-85.626584,41.957497]},"n1409":{"id":"n1409","loc":[-85.626638,41.957415]},"n141":{"id":"n141","loc":[-85.637363,41.941822]},"n1410":{"id":"n1410","loc":[-85.626731,41.957449]},"n1411":{"id":"n1411","loc":[-85.626725,41.957457]},"n1412":{"id":"n1412","loc":[-85.626843,41.9575]},"n1413":{"id":"n1413","loc":[-85.626851,41.957487]},"n1414":{"id":"n1414","loc":[-85.626579,41.957521]},"n1415":{"id":"n1415","loc":[-85.626537,41.957587]},"n1416":{"id":"n1416","loc":[-85.626427,41.957551]},"n1417":{"id":"n1417","loc":[-85.626468,41.957483]},"n1418":{"id":"n1418","loc":[-85.626592,41.957639]},"n1419":{"id":"n1419","loc":[-85.626807,41.957713]},"n142":{"id":"n142","loc":[-85.637364,41.941833]},"n1420":{"id":"n1420","loc":[-85.627129,41.957401]},"n1421":{"id":"n1421","loc":[-85.627209,41.95742]},"n1422":{"id":"n1422","loc":[-85.627302,41.957435]},"n1423":{"id":"n1423","loc":[-85.629566,41.957048]},"n1424":{"id":"n1424","loc":[-85.629568,41.957215]},"n1425":{"id":"n1425","loc":[-85.629383,41.957216]},"n1426":{"id":"n1426","loc":[-85.629384,41.95727]},"n1427":{"id":"n1427","loc":[-85.629231,41.957271]},"n1428":{"id":"n1428","loc":[-85.62923,41.957198]},"n1429":{"id":"n1429","loc":[-85.629322,41.957198]},"n143":{"id":"n143","loc":[-85.637559,41.942448]},"n1430":{"id":"n1430","loc":[-85.629321,41.957108]},"n1431":{"id":"n1431","loc":[-85.629441,41.957108]},"n1432":{"id":"n1432","loc":[-85.62944,41.957049]},"n1433":{"id":"n1433","loc":[-85.629337,41.957018]},"n1434":{"id":"n1434","loc":[-85.629366,41.957028]},"n1435":{"id":"n1435","loc":[-85.629375,41.957044]},"n1436":{"id":"n1436","loc":[-85.629354,41.957071]},"n1437":{"id":"n1437","loc":[-85.629317,41.957071]},"n1438":{"id":"n1438","loc":[-85.62929,41.957074]},"n1439":{"id":"n1439","loc":[-85.62927,41.957084]},"n144":{"id":"n144","loc":[-85.637036,41.942454]},"n1440":{"id":"n1440","loc":[-85.629232,41.957081]},"n1441":{"id":"n1441","loc":[-85.629222,41.957057]},"n1442":{"id":"n1442","loc":[-85.629259,41.957025]},"n1443":{"id":"n1443","loc":[-85.629293,41.957017]},"n1444":{"id":"n1444","loc":[-85.629251,41.957085]},"n1445":{"id":"n1445","loc":[-85.629235,41.957041]},"n1446":{"id":"n1446","loc":[-85.62937,41.95706]},"n1447":{"id":"n1447","loc":[-85.629531,41.956909]},"n1448":{"id":"n1448","loc":[-85.629408,41.956909]},"n1449":{"id":"n1449","loc":[-85.629402,41.956681]},"n145":{"id":"n145","loc":[-85.636692,41.942828]},"n1450":{"id":"n1450","loc":[-85.62953,41.956681]},"n1451":{"id":"n1451","loc":[-85.629402,41.956728]},"n1452":{"id":"n1452","loc":[-85.629408,41.956845]},"n1453":{"id":"n1453","loc":[-85.629385,41.956845]},"n1454":{"id":"n1454","loc":[-85.629384,41.956728]},"n1455":{"id":"n1455","loc":[-85.629063,41.956973]},"n1456":{"id":"n1456","loc":[-85.629064,41.957009]},"n1457":{"id":"n1457","loc":[-85.62902,41.957009]},"n1458":{"id":"n1458","loc":[-85.629019,41.956973]},"n1459":{"id":"n1459","loc":[-85.629136,41.956633]},"n146":{"id":"n146","loc":[-85.635929,41.942826]},"n1460":{"id":"n1460","loc":[-85.629084,41.956632]},"n1461":{"id":"n1461","loc":[-85.629084,41.956605]},"n1462":{"id":"n1462","loc":[-85.629136,41.956605]},"n1463":{"id":"n1463","loc":[-85.629153,41.956657]},"n1464":{"id":"n1464","loc":[-85.627914,41.956661]},"n1465":{"id":"n1465","loc":[-85.630096,41.956101]},"n1466":{"id":"n1466","loc":[-85.630097,41.95612]},"n1467":{"id":"n1467","loc":[-85.630011,41.956121]},"n1468":{"id":"n1468","loc":[-85.630015,41.956374]},"n1469":{"id":"n1469","loc":[-85.629148,41.95626]},"n147":{"id":"n147","loc":[-85.636433,41.942828]},"n1470":{"id":"n1470","loc":[-85.629527,41.956591]},"n1471":{"id":"n1471","loc":[-85.629405,41.956591]},"n1472":{"id":"n1472","loc":[-85.629405,41.956459]},"n1473":{"id":"n1473","loc":[-85.629369,41.956459]},"n1474":{"id":"n1474","loc":[-85.629369,41.956424]},"n1475":{"id":"n1475","loc":[-85.629413,41.956424]},"n1476":{"id":"n1476","loc":[-85.629414,41.956326]},"n1477":{"id":"n1477","loc":[-85.629522,41.956326]},"n1478":{"id":"n1478","loc":[-85.629522,41.956487]},"n1479":{"id":"n1479","loc":[-85.629527,41.956487]},"n148":{"id":"n148","loc":[-85.636435,41.942864],"tags":{"entrance":"yes"}},"n1480":{"id":"n1480","loc":[-85.629414,41.95634]},"n1481":{"id":"n1481","loc":[-85.629149,41.956338]},"n1482":{"id":"n1482","loc":[-85.62931,41.956531]},"n1483":{"id":"n1483","loc":[-85.629291,41.95655]},"n1484":{"id":"n1484","loc":[-85.629255,41.95655]},"n1485":{"id":"n1485","loc":[-85.629236,41.956533]},"n1486":{"id":"n1486","loc":[-85.629237,41.956461]},"n1487":{"id":"n1487","loc":[-85.629257,41.956445]},"n1488":{"id":"n1488","loc":[-85.629257,41.956428]},"n1489":{"id":"n1489","loc":[-85.629287,41.956428]},"n149":{"id":"n149","loc":[-85.637235,41.942622]},"n1490":{"id":"n1490","loc":[-85.629287,41.956445]},"n1491":{"id":"n1491","loc":[-85.62931,41.95646]},"n1492":{"id":"n1492","loc":[-85.629049,41.956425]},"n1493":{"id":"n1493","loc":[-85.628907,41.956427]},"n1494":{"id":"n1494","loc":[-85.628907,41.956455]},"n1495":{"id":"n1495","loc":[-85.628841,41.956455]},"n1496":{"id":"n1496","loc":[-85.62884,41.956424]},"n1497":{"id":"n1497","loc":[-85.628764,41.956425]},"n1498":{"id":"n1498","loc":[-85.628762,41.956323]},"n1499":{"id":"n1499","loc":[-85.628808,41.956323]},"n15":{"id":"n15","loc":[-85.633477,41.940187]},"n150":{"id":"n150","loc":[-85.637247,41.943116]},"n1500":{"id":"n1500","loc":[-85.628808,41.956314]},"n1501":{"id":"n1501","loc":[-85.628911,41.956313]},"n1502":{"id":"n1502","loc":[-85.628911,41.956322]},"n1503":{"id":"n1503","loc":[-85.62896,41.956322]},"n1504":{"id":"n1504","loc":[-85.62896,41.956348]},"n1505":{"id":"n1505","loc":[-85.629047,41.956347]},"n1506":{"id":"n1506","loc":[-85.628893,41.957263]},"n1507":{"id":"n1507","loc":[-85.628788,41.957264]},"n1508":{"id":"n1508","loc":[-85.628786,41.95711]},"n1509":{"id":"n1509","loc":[-85.628894,41.957109]},"n151":{"id":"n151","loc":[-85.637564,41.943116]},"n1510":{"id":"n1510","loc":[-85.628893,41.957075]},"n1511":{"id":"n1511","loc":[-85.628965,41.957075]},"n1512":{"id":"n1512","loc":[-85.628965,41.957111]},"n1513":{"id":"n1513","loc":[-85.629035,41.95711]},"n1514":{"id":"n1514","loc":[-85.629036,41.957209]},"n1515":{"id":"n1515","loc":[-85.628893,41.95721]},"n1516":{"id":"n1516","loc":[-85.631348,41.95773]},"n1517":{"id":"n1517","loc":[-85.631101,41.957732]},"n1518":{"id":"n1518","loc":[-85.631099,41.957558]},"n1519":{"id":"n1519","loc":[-85.63123,41.957557]},"n152":{"id":"n152","loc":[-85.637552,41.942619]},"n1520":{"id":"n1520","loc":[-85.631231,41.957618]},"n1521":{"id":"n1521","loc":[-85.63129,41.957618]},"n1522":{"id":"n1522","loc":[-85.63129,41.957651]},"n1523":{"id":"n1523","loc":[-85.631346,41.957651]},"n1524":{"id":"n1524","loc":[-85.631366,41.95802]},"n1525":{"id":"n1525","loc":[-85.631141,41.958021]},"n1526":{"id":"n1526","loc":[-85.63114,41.957943]},"n1527":{"id":"n1527","loc":[-85.631167,41.957943]},"n1528":{"id":"n1528","loc":[-85.631166,41.957808]},"n1529":{"id":"n1529","loc":[-85.631301,41.957807]},"n153":{"id":"n153","loc":[-85.63763,41.942528]},"n1530":{"id":"n1530","loc":[-85.631302,41.95789]},"n1531":{"id":"n1531","loc":[-85.631364,41.95789]},"n1532":{"id":"n1532","loc":[-85.631539,41.957754]},"n1533":{"id":"n1533","loc":[-85.631069,41.957756]},"n1534":{"id":"n1534","loc":[-85.631536,41.957518]},"n1535":{"id":"n1535","loc":[-85.631543,41.957995]},"n1536":{"id":"n1536","loc":[-85.631531,41.957748]},"n1537":{"id":"n1537","loc":[-85.631485,41.957748]},"n1538":{"id":"n1538","loc":[-85.631484,41.957698]},"n1539":{"id":"n1539","loc":[-85.631531,41.957698]},"n154":{"id":"n154","loc":[-85.637151,41.94253]},"n1540":{"id":"n1540","loc":[-85.631586,41.957742]},"n1541":{"id":"n1541","loc":[-85.63155,41.957742]},"n1542":{"id":"n1542","loc":[-85.631551,41.957702]},"n1543":{"id":"n1543","loc":[-85.631587,41.957702]},"n1544":{"id":"n1544","loc":[-85.631534,41.95807]},"n1545":{"id":"n1545","loc":[-85.631534,41.958097]},"n1546":{"id":"n1546","loc":[-85.631491,41.958097]},"n1547":{"id":"n1547","loc":[-85.631491,41.95807]},"n1548":{"id":"n1548","loc":[-85.631304,41.958861]},"n1549":{"id":"n1549","loc":[-85.631186,41.958862]},"n155":{"id":"n155","loc":[-85.63715,41.942424]},"n1550":{"id":"n1550","loc":[-85.631182,41.958653]},"n1551":{"id":"n1551","loc":[-85.6313,41.958651]},"n1552":{"id":"n1552","loc":[-85.631293,41.95854]},"n1553":{"id":"n1553","loc":[-85.631176,41.958539]},"n1554":{"id":"n1554","loc":[-85.631176,41.958377]},"n1555":{"id":"n1555","loc":[-85.631297,41.958377]},"n1556":{"id":"n1556","loc":[-85.631297,41.958422]},"n1557":{"id":"n1557","loc":[-85.631333,41.958422]},"n1558":{"id":"n1558","loc":[-85.631333,41.958479]},"n1559":{"id":"n1559","loc":[-85.631293,41.958479]},"n156":{"id":"n156","loc":[-85.637629,41.942422]},"n1560":{"id":"n1560","loc":[-85.631951,41.958908]},"n1561":{"id":"n1561","loc":[-85.631838,41.958909]},"n1562":{"id":"n1562","loc":[-85.631837,41.958847]},"n1563":{"id":"n1563","loc":[-85.631859,41.958847]},"n1564":{"id":"n1564","loc":[-85.631858,41.958746]},"n1565":{"id":"n1565","loc":[-85.631961,41.958745]},"n1566":{"id":"n1566","loc":[-85.631962,41.958812]},"n1567":{"id":"n1567","loc":[-85.631949,41.958813]},"n1568":{"id":"n1568","loc":[-85.631579,41.958913]},"n1569":{"id":"n1569","loc":[-85.631567,41.95864]},"n157":{"id":"n157","loc":[-85.638232,41.942477]},"n1570":{"id":"n1570","loc":[-85.631942,41.958639]},"n1571":{"id":"n1571","loc":[-85.631543,41.958594]},"n1572":{"id":"n1572","loc":[-85.631543,41.958065]},"n1573":{"id":"n1573","loc":[-85.631888,41.958546]},"n1574":{"id":"n1574","loc":[-85.631804,41.958546]},"n1575":{"id":"n1575","loc":[-85.631803,41.95841]},"n1576":{"id":"n1576","loc":[-85.631886,41.958409]},"n1577":{"id":"n1577","loc":[-85.631897,41.958125]},"n1578":{"id":"n1578","loc":[-85.631755,41.958126]},"n1579":{"id":"n1579","loc":[-85.631756,41.958174]},"n158":{"id":"n158","loc":[-85.637775,41.942483]},"n1580":{"id":"n1580","loc":[-85.63178,41.958174]},"n1581":{"id":"n1581","loc":[-85.631782,41.958272]},"n1582":{"id":"n1582","loc":[-85.631922,41.958271]},"n1583":{"id":"n1583","loc":[-85.631922,41.958244]},"n1584":{"id":"n1584","loc":[-85.631883,41.958245]},"n1585":{"id":"n1585","loc":[-85.631882,41.958175]},"n1586":{"id":"n1586","loc":[-85.631898,41.958175]},"n1587":{"id":"n1587","loc":[-85.631924,41.958032]},"n1588":{"id":"n1588","loc":[-85.631762,41.958032]},"n1589":{"id":"n1589","loc":[-85.63176,41.957827]},"n159":{"id":"n159","loc":[-85.638107,41.942512]},"n1590":{"id":"n1590","loc":[-85.631888,41.957826]},"n1591":{"id":"n1591","loc":[-85.631888,41.957892]},"n1592":{"id":"n1592","loc":[-85.631871,41.957892]},"n1593":{"id":"n1593","loc":[-85.631872,41.957949]},"n1594":{"id":"n1594","loc":[-85.631923,41.957949]},"n1595":{"id":"n1595","loc":[-85.631695,41.95795]},"n1596":{"id":"n1596","loc":[-85.631666,41.957975]},"n1597":{"id":"n1597","loc":[-85.63163,41.957975]},"n1598":{"id":"n1598","loc":[-85.6316,41.957951]},"n1599":{"id":"n1599","loc":[-85.6316,41.95785]},"n16":{"id":"n16","loc":[-85.63341,41.94032]},"n160":{"id":"n160","loc":[-85.637763,41.942514]},"n1600":{"id":"n1600","loc":[-85.63166,41.95785]},"n1601":{"id":"n1601","loc":[-85.631696,41.957873]},"n1602":{"id":"n1602","loc":[-85.631924,41.957762]},"n1603":{"id":"n1603","loc":[-85.631762,41.957762]},"n1604":{"id":"n1604","loc":[-85.631762,41.957708]},"n1605":{"id":"n1605","loc":[-85.631785,41.957708]},"n1606":{"id":"n1606","loc":[-85.631785,41.957606]},"n1607":{"id":"n1607","loc":[-85.631734,41.957606]},"n1608":{"id":"n1608","loc":[-85.631734,41.957538]},"n1609":{"id":"n1609","loc":[-85.631821,41.957538]},"n161":{"id":"n161","loc":[-85.637763,41.942445]},"n1610":{"id":"n1610","loc":[-85.631935,41.957545]},"n1611":{"id":"n1611","loc":[-85.631821,41.957544]},"n1612":{"id":"n1612","loc":[-85.631935,41.957645]},"n1613":{"id":"n1613","loc":[-85.631924,41.957645]},"n1614":{"id":"n1614","loc":[-85.627135,41.953828]},"n1615":{"id":"n1615","loc":[-85.633517,41.941353],"tags":{"man_made":"lighthouse"}},"n1616":{"id":"n1616","loc":[-85.633659,41.942041],"tags":{"amenity":"bbq"}},"n1617":{"id":"n1617","loc":[-85.63662,41.942911],"tags":{"amenity":"toilets"}},"n1618":{"id":"n1618","loc":[-85.637487,41.943876],"tags":{"amenity":"toilets"}},"n1619":{"id":"n1619","loc":[-85.634938,41.941917],"tags":{"amenity":"toilets"}},"n162":{"id":"n162","loc":[-85.638107,41.942443]},"n1620":{"id":"n1620","loc":[-85.632427,41.941678],"tags":{"amenity":"bbq"}},"n1621":{"id":"n1621","loc":[-85.638033,41.944568],"tags":{"amenity":"bbq"}},"n1622":{"id":"n1622","loc":[-85.638052,41.944522],"tags":{"amenity":"bbq"}},"n1623":{"id":"n1623","loc":[-85.635001,41.941965]},"n1624":{"id":"n1624","loc":[-85.634635,41.941884]},"n1625":{"id":"n1625","loc":[-85.634667,41.941894]},"n1626":{"id":"n1626","loc":[-85.634791,41.942011]},"n1627":{"id":"n1627","loc":[-85.634749,41.941938]},"n1628":{"id":"n1628","loc":[-85.627295,41.953946],"tags":{"barrier":"gate"}},"n1629":{"id":"n1629","loc":[-85.629076,41.954689]},"n163":{"id":"n163","loc":[-85.638813,41.942475]},"n1630":{"id":"n1630","loc":[-85.640667,41.942595]},"n1631":{"id":"n1631","loc":[-85.639455,41.94261]},"n1632":{"id":"n1632","loc":[-85.643407,41.942336]},"n1633":{"id":"n1633","loc":[-85.641845,41.941316]},"n1634":{"id":"n1634","loc":[-85.643322,41.942224]},"n1635":{"id":"n1635","loc":[-85.643301,41.942124]},"n1636":{"id":"n1636","loc":[-85.640639,41.941326]},"n1637":{"id":"n1637","loc":[-85.640614,41.940058]},"n1638":{"id":"n1638","loc":[-85.639428,41.941335]},"n1639":{"id":"n1639","loc":[-85.643078,41.941293]},"n164":{"id":"n164","loc":[-85.63883,41.942422]},"n1640":{"id":"n1640","loc":[-85.64371,41.942302]},"n1641":{"id":"n1641","loc":[-85.643056,41.94001]},"n1642":{"id":"n1642","loc":[-85.643097,41.942575],"tags":{"highway":"traffic_signals","traffic_signals":"signal","traffic_signals:direction":"both"}},"n1643":{"id":"n1643","loc":[-85.641855,41.942586]},"n1644":{"id":"n1644","loc":[-85.643549,41.942209]},"n1645":{"id":"n1645","loc":[-85.639359,41.94007]},"n1646":{"id":"n1646","loc":[-85.642797,41.940522]},"n1647":{"id":"n1647","loc":[-85.642589,41.940523]},"n1648":{"id":"n1648","loc":[-85.642587,41.940287]},"n1649":{"id":"n1649","loc":[-85.642797,41.940286]},"n165":{"id":"n165","loc":[-85.63883,41.942508]},"n1650":{"id":"n1650","loc":[-85.642571,41.940523]},"n1651":{"id":"n1651","loc":[-85.642568,41.940286]},"n1652":{"id":"n1652","loc":[-85.642316,41.940289]},"n1653":{"id":"n1653","loc":[-85.642321,41.940436]},"n1654":{"id":"n1654","loc":[-85.642292,41.940458]},"n1655":{"id":"n1655","loc":[-85.642287,41.940483]},"n1656":{"id":"n1656","loc":[-85.642323,41.940509]},"n1657":{"id":"n1657","loc":[-85.642385,41.940511]},"n1658":{"id":"n1658","loc":[-85.642408,41.940526]},"n1659":{"id":"n1659","loc":[-85.641962,41.94109]},"n166":{"id":"n166","loc":[-85.638364,41.942508]},"n1660":{"id":"n1660","loc":[-85.642753,41.941084]},"n1661":{"id":"n1661","loc":[-85.642752,41.941004]},"n1662":{"id":"n1662","loc":[-85.642806,41.941003]},"n1663":{"id":"n1663","loc":[-85.642803,41.940731]},"n1664":{"id":"n1664","loc":[-85.642741,41.940732]},"n1665":{"id":"n1665","loc":[-85.64274,41.940645]},"n1666":{"id":"n1666","loc":[-85.641957,41.940651]},"n1667":{"id":"n1667","loc":[-85.642937,41.941241]},"n1668":{"id":"n1668","loc":[-85.641776,41.941253]},"n1669":{"id":"n1669","loc":[-85.641766,41.940598]},"n167":{"id":"n167","loc":[-85.638836,41.942167]},"n1670":{"id":"n1670","loc":[-85.64198,41.940598]},"n1671":{"id":"n1671","loc":[-85.641961,41.940137]},"n1672":{"id":"n1672","loc":[-85.642934,41.94012]},"n1673":{"id":"n1673","loc":[-85.643074,41.941173]},"n1674":{"id":"n1674","loc":[-85.642841,41.940997]},"n1675":{"id":"n1675","loc":[-85.642839,41.940721]},"n1676":{"id":"n1676","loc":[-85.643065,41.940552]},"n1677":{"id":"n1677","loc":[-85.642732,41.94124]},"n1678":{"id":"n1678","loc":[-85.641815,41.941246]},"n1679":{"id":"n1679","loc":[-85.641813,41.941132]},"n168":{"id":"n168","loc":[-85.638836,41.94229]},"n1680":{"id":"n1680","loc":[-85.641839,41.941111]},"n1681":{"id":"n1681","loc":[-85.641884,41.941098]},"n1682":{"id":"n1682","loc":[-85.642732,41.941092]},"n1683":{"id":"n1683","loc":[-85.642776,41.941302]},"n1684":{"id":"n1684","loc":[-85.632788,41.946236]},"n1685":{"id":"n1685","loc":[-85.622342,41.953127]},"n1686":{"id":"n1686","loc":[-85.641848,41.941167]},"n1687":{"id":"n1687","loc":[-85.643753,41.941503]},"n1688":{"id":"n1688","loc":[-85.643762,41.942119]},"n1689":{"id":"n1689","loc":[-85.64238,41.942262]},"n169":{"id":"n169","loc":[-85.638594,41.94229]},"n1690":{"id":"n1690","loc":[-85.642374,41.941944]},"n1691":{"id":"n1691","loc":[-85.642518,41.941943]},"n1692":{"id":"n1692","loc":[-85.642519,41.94198]},"n1693":{"id":"n1693","loc":[-85.642831,41.941977]},"n1694":{"id":"n1694","loc":[-85.642837,41.942312]},"n1695":{"id":"n1695","loc":[-85.642495,41.942315]},"n1696":{"id":"n1696","loc":[-85.642494,41.942261]},"n1697":{"id":"n1697","loc":[-85.641087,41.942433]},"n1698":{"id":"n1698","loc":[-85.641081,41.942006]},"n1699":{"id":"n1699","loc":[-85.641244,41.942005]},"n17":{"id":"n17","loc":[-85.633478,41.94081]},"n170":{"id":"n170","loc":[-85.638594,41.942422]},"n1700":{"id":"n1700","loc":[-85.64125,41.942431]},"n1701":{"id":"n1701","loc":[-85.641331,41.942968]},"n1702":{"id":"n1702","loc":[-85.641328,41.942713]},"n1703":{"id":"n1703","loc":[-85.641521,41.942712]},"n1704":{"id":"n1704","loc":[-85.641523,41.942924]},"n1705":{"id":"n1705","loc":[-85.641504,41.942924]},"n1706":{"id":"n1706","loc":[-85.641505,41.942967]},"n1707":{"id":"n1707","loc":[-85.638612,41.942408]},"n1708":{"id":"n1708","loc":[-85.638612,41.942327]},"n1709":{"id":"n1709","loc":[-85.638775,41.942327]},"n171":{"id":"n171","loc":[-85.638364,41.942356]},"n1710":{"id":"n1710","loc":[-85.638775,41.942299]},"n1711":{"id":"n1711","loc":[-85.638835,41.942298]},"n1712":{"id":"n1712","loc":[-85.638835,41.942407]},"n1713":{"id":"n1713","loc":[-85.639116,41.942444]},"n1714":{"id":"n1714","loc":[-85.639114,41.942362]},"n1715":{"id":"n1715","loc":[-85.639294,41.94236]},"n1716":{"id":"n1716","loc":[-85.639296,41.942442]},"n1717":{"id":"n1717","loc":[-85.639808,41.942385]},"n1718":{"id":"n1718","loc":[-85.639805,41.942285]},"n1719":{"id":"n1719","loc":[-85.639988,41.942283]},"n172":{"id":"n172","loc":[-85.638364,41.942167]},"n1720":{"id":"n1720","loc":[-85.63999,41.942383]},"n1721":{"id":"n1721","loc":[-85.639633,41.943023]},"n1722":{"id":"n1722","loc":[-85.639867,41.943019]},"n1723":{"id":"n1723","loc":[-85.639866,41.942964]},"n1724":{"id":"n1724","loc":[-85.639888,41.942963]},"n1725":{"id":"n1725","loc":[-85.639883,41.942779]},"n1726":{"id":"n1726","loc":[-85.639851,41.94278]},"n1727":{"id":"n1727","loc":[-85.63985,41.94274]},"n1728":{"id":"n1728","loc":[-85.639789,41.942741]},"n1729":{"id":"n1729","loc":[-85.639789,41.942753]},"n173":{"id":"n173","loc":[-85.639038,41.942463]},"n1730":{"id":"n1730","loc":[-85.639698,41.942754]},"n1731":{"id":"n1731","loc":[-85.639699,41.942788]},"n1732":{"id":"n1732","loc":[-85.639675,41.942789]},"n1733":{"id":"n1733","loc":[-85.639676,41.94283]},"n1734":{"id":"n1734","loc":[-85.639701,41.942829]},"n1735":{"id":"n1735","loc":[-85.639702,41.942869]},"n1736":{"id":"n1736","loc":[-85.639629,41.94287]},"n1737":{"id":"n1737","loc":[-85.643568,41.942946]},"n1738":{"id":"n1738","loc":[-85.643568,41.942777]},"n1739":{"id":"n1739","loc":[-85.643401,41.942777]},"n174":{"id":"n174","loc":[-85.638897,41.942464]},"n1740":{"id":"n1740","loc":[-85.643401,41.942863]},"n1741":{"id":"n1741","loc":[-85.643448,41.942863]},"n1742":{"id":"n1742","loc":[-85.643448,41.942946]},"n1743":{"id":"n1743","loc":[-85.642836,41.942981]},"n1744":{"id":"n1744","loc":[-85.642917,41.942979]},"n1745":{"id":"n1745","loc":[-85.642914,41.942904]},"n1746":{"id":"n1746","loc":[-85.642938,41.942903]},"n1747":{"id":"n1747","loc":[-85.642935,41.942813]},"n1748":{"id":"n1748","loc":[-85.642775,41.942816]},"n1749":{"id":"n1749","loc":[-85.642778,41.942906]},"n175":{"id":"n175","loc":[-85.638897,41.942423]},"n1750":{"id":"n1750","loc":[-85.642833,41.942905]},"n1751":{"id":"n1751","loc":[-85.642302,41.942886]},"n1752":{"id":"n1752","loc":[-85.642299,41.942721]},"n1753":{"id":"n1753","loc":[-85.642422,41.94272]},"n1754":{"id":"n1754","loc":[-85.642425,41.942868]},"n1755":{"id":"n1755","loc":[-85.642385,41.942869]},"n1756":{"id":"n1756","loc":[-85.642385,41.942885]},"n1757":{"id":"n1757","loc":[-85.641533,41.942939]},"n1758":{"id":"n1758","loc":[-85.64161,41.942877]},"n1759":{"id":"n1759","loc":[-85.641676,41.942922]},"n176":{"id":"n176","loc":[-85.638853,41.942423]},"n1760":{"id":"n1760","loc":[-85.6416,41.942985]},"n1761":{"id":"n1761","loc":[-85.64206,41.942802]},"n1762":{"id":"n1762","loc":[-85.642059,41.942741]},"n1763":{"id":"n1763","loc":[-85.642196,41.942741]},"n1764":{"id":"n1764","loc":[-85.642196,41.942818]},"n1765":{"id":"n1765","loc":[-85.642128,41.942819]},"n1766":{"id":"n1766","loc":[-85.642128,41.942801]},"n1767":{"id":"n1767","loc":[-85.640943,41.942934]},"n1768":{"id":"n1768","loc":[-85.641035,41.942933]},"n1769":{"id":"n1769","loc":[-85.641032,41.942797]},"n177":{"id":"n177","loc":[-85.638852,41.94237]},"n1770":{"id":"n1770","loc":[-85.640997,41.942798]},"n1771":{"id":"n1771","loc":[-85.640996,41.942764]},"n1772":{"id":"n1772","loc":[-85.640861,41.942766]},"n1773":{"id":"n1773","loc":[-85.640862,41.942848]},"n1774":{"id":"n1774","loc":[-85.640941,41.942847]},"n1775":{"id":"n1775","loc":[-85.643766,41.942226]},"n1776":{"id":"n1776","loc":[-85.643768,41.942407]},"n1777":{"id":"n1777","loc":[-85.643218,41.94177]},"n1778":{"id":"n1778","loc":[-85.64321,41.941327]},"n1779":{"id":"n1779","loc":[-85.643649,41.941323]},"n178":{"id":"n178","loc":[-85.638892,41.94237]},"n1780":{"id":"n1780","loc":[-85.643656,41.941716]},"n1781":{"id":"n1781","loc":[-85.64358,41.941717]},"n1782":{"id":"n1782","loc":[-85.64358,41.941767]},"n1783":{"id":"n1783","loc":[-85.64382,41.941495]},"n1784":{"id":"n1784","loc":[-85.643817,41.941317]},"n1785":{"id":"n1785","loc":[-85.643235,41.941833]},"n1786":{"id":"n1786","loc":[-85.64335,41.941842]},"n1787":{"id":"n1787","loc":[-85.643504,41.941903]},"n1788":{"id":"n1788","loc":[-85.643554,41.941946]},"n1789":{"id":"n1789","loc":[-85.643618,41.942015]},"n179":{"id":"n179","loc":[-85.638891,41.942334]},"n1790":{"id":"n1790","loc":[-85.64346,41.941971]},"n1791":{"id":"n1791","loc":[-85.643528,41.942468]},"n1792":{"id":"n1792","loc":[-85.643621,41.942363]},"n1793":{"id":"n1793","loc":[-85.643496,41.942297]},"n1794":{"id":"n1794","loc":[-85.643446,41.942246]},"n1795":{"id":"n1795","loc":[-85.643398,41.942177]},"n1796":{"id":"n1796","loc":[-85.643398,41.942031]},"n1797":{"id":"n1797","loc":[-85.621531,41.952693]},"n1798":{"id":"n1798","loc":[-85.643221,41.942028]},"n1799":{"id":"n1799","loc":[-85.643225,41.942276]},"n18":{"id":"n18","loc":[-85.63345,41.94071]},"n180":{"id":"n180","loc":[-85.639037,41.942334]},"n1800":{"id":"n1800","loc":[-85.643265,41.942347]},"n1801":{"id":"n1801","loc":[-85.643323,41.942413]},"n1802":{"id":"n1802","loc":[-85.643411,41.94247]},"n1803":{"id":"n1803","loc":[-85.643459,41.942435]},"n1804":{"id":"n1804","loc":[-85.643767,41.942307]},"n1805":{"id":"n1805","loc":[-85.643661,41.942293]},"n1806":{"id":"n1806","loc":[-85.643578,41.942247]},"n1807":{"id":"n1807","loc":[-85.643522,41.942125]},"n1808":{"id":"n1808","loc":[-85.643515,41.942061]},"n1809":{"id":"n1809","loc":[-85.643346,41.941924]},"n181":{"id":"n181","loc":[-85.638074,41.941839]},"n1810":{"id":"n1810","loc":[-85.643086,41.94192]},"n1811":{"id":"n1811","loc":[-85.643529,41.94217]},"n1812":{"id":"n1812","loc":[-85.643489,41.942003]},"n1813":{"id":"n1813","loc":[-85.643295,41.941919]},"n1814":{"id":"n1814","loc":[-85.643305,41.942163]},"n1815":{"id":"n1815","loc":[-85.643354,41.942285]},"n1816":{"id":"n1816","loc":[-85.643472,41.942389]},"n1817":{"id":"n1817","loc":[-85.643608,41.942271]},"n1818":{"id":"n1818","loc":[-85.643876,41.941402]},"n1819":{"id":"n1819","loc":[-85.643818,41.941369]},"n182":{"id":"n182","loc":[-85.638076,41.941942]},"n1820":{"id":"n1820","loc":[-85.643682,41.941304]},"n1821":{"id":"n1821","loc":[-85.64359,41.941286]},"n1822":{"id":"n1822","loc":[-85.643317,41.941727]},"n1823":{"id":"n1823","loc":[-85.643301,41.941286]},"n1824":{"id":"n1824","loc":[-85.643553,41.941698]},"n1825":{"id":"n1825","loc":[-85.643543,41.941286]},"n1826":{"id":"n1826","loc":[-85.636967,41.940118]},"n1827":{"id":"n1827","loc":[-85.63378,41.940114]},"n1828":{"id":"n1828","loc":[-85.637254,41.940075]},"n1829":{"id":"n1829","loc":[-85.637002,41.941355]},"n183":{"id":"n183","loc":[-85.637955,41.941944]},"n1830":{"id":"n1830","loc":[-85.643532,41.94204]},"n1831":{"id":"n1831","loc":[-85.638235,41.942615]},"n1832":{"id":"n1832","loc":[-85.637039,41.942624]},"n1833":{"id":"n1833","loc":[-85.636369,41.94266]},"n1834":{"id":"n1834","loc":[-85.63582,41.942771],"tags":{"highway":"traffic_signals","traffic_signals":"emergency","traffic_signals:direction":"both"}},"n1835":{"id":"n1835","loc":[-85.634873,41.943044]},"n1836":{"id":"n1836","loc":[-85.643482,41.941976]},"n1837":{"id":"n1837","loc":[-85.64345,41.941945]},"n1838":{"id":"n1838","loc":[-85.641885,41.943851]},"n1839":{"id":"n1839","loc":[-85.641915,41.945121]},"n184":{"id":"n184","loc":[-85.637953,41.94184]},"n1840":{"id":"n1840","loc":[-85.639454,41.943871]},"n1841":{"id":"n1841","loc":[-85.639491,41.945191]},"n1842":{"id":"n1842","loc":[-85.635768,41.940113]},"n1843":{"id":"n1843","loc":[-85.638206,41.941345]},"n1844":{"id":"n1844","loc":[-85.640721,41.94513]},"n1845":{"id":"n1845","loc":[-85.643137,41.945103]},"n1846":{"id":"n1846","loc":[-85.638199,41.940079]},"n1847":{"id":"n1847","loc":[-85.640688,41.943861]},"n1848":{"id":"n1848","loc":[-85.643397,41.941924]},"n1849":{"id":"n1849","loc":[-85.643117,41.943841]},"n185":{"id":"n185","loc":[-85.637953,41.941866]},"n1850":{"id":"n1850","loc":[-85.636731,41.94263]},"n1851":{"id":"n1851","loc":[-85.63518,41.942955],"tags":{"highway":"crossing"}},"n1852":{"id":"n1852","loc":[-85.636152,41.942695]},"n1853":{"id":"n1853","loc":[-85.644202,41.941499]},"n1854":{"id":"n1854","loc":[-85.644211,41.942116]},"n1855":{"id":"n1855","loc":[-85.644233,41.942404]},"n1856":{"id":"n1856","loc":[-85.644231,41.942223]},"n1857":{"id":"n1857","loc":[-85.644133,41.941315]},"n1858":{"id":"n1858","loc":[-85.644136,41.941493]},"n1859":{"id":"n1859","loc":[-85.644345,41.942307]},"n186":{"id":"n186","loc":[-85.637873,41.941867]},"n1860":{"id":"n1860","loc":[-85.644232,41.942304]},"n1861":{"id":"n1861","loc":[-85.644134,41.941403]},"n1862":{"id":"n1862","loc":[-85.63607,41.943005],"tags":{"addr:city":"Three Rivers","addr:housenumber":"333","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","amenity":"fire_station","name":"Three Rivers Fire Department"}},"n1863":{"id":"n1863","loc":[-85.637,41.941236]},"n1864":{"id":"n1864","loc":[-85.634476,41.941475]},"n1865":{"id":"n1865","loc":[-85.635036,41.941858]},"n1866":{"id":"n1866","loc":[-85.635362,41.941962]},"n1867":{"id":"n1867","loc":[-85.635796,41.941962]},"n1868":{"id":"n1868","loc":[-85.63295,41.943006]},"n1869":{"id":"n1869","loc":[-85.634692,41.943098]},"n187":{"id":"n187","loc":[-85.637877,41.941975]},"n1870":{"id":"n1870","loc":[-85.633128,41.940484]},"n1871":{"id":"n1871","loc":[-85.633117,41.942798]},"n1872":{"id":"n1872","loc":[-85.633303,41.942412]},"n1873":{"id":"n1873","loc":[-85.633482,41.941912]},"n1874":{"id":"n1874","loc":[-85.633455,41.941359]},"n1875":{"id":"n1875","loc":[-85.633162,41.942679]},"n1876":{"id":"n1876","loc":[-85.634274,41.943479]},"n1877":{"id":"n1877","loc":[-85.634678,41.942909]},"n1878":{"id":"n1878","loc":[-85.6339,41.941453]},"n1879":{"id":"n1879","loc":[-85.634571,41.942774]},"n188":{"id":"n188","loc":[-85.636855,41.942488]},"n1880":{"id":"n1880","loc":[-85.63419,41.941732]},"n1881":{"id":"n1881","loc":[-85.634067,41.941565]},"n1882":{"id":"n1882","loc":[-85.63436,41.942358]},"n1883":{"id":"n1883","loc":[-85.634327,41.942247]},"n1884":{"id":"n1884","loc":[-85.633391,41.941231]},"n1885":{"id":"n1885","loc":[-85.634303,41.941972]},"n1886":{"id":"n1886","loc":[-85.633541,41.940147]},"n1887":{"id":"n1887","loc":[-85.633433,41.940252]},"n1888":{"id":"n1888","loc":[-85.633402,41.940411]},"n1889":{"id":"n1889","loc":[-85.633551,41.941023]},"n189":{"id":"n189","loc":[-85.636702,41.942488]},"n1890":{"id":"n1890","loc":[-85.633719,41.941186]},"n1891":{"id":"n1891","loc":[-85.633067,41.941845]},"n1892":{"id":"n1892","loc":[-85.634902,41.942766]},"n1893":{"id":"n1893","loc":[-85.634603,41.942202]},"n1894":{"id":"n1894","loc":[-85.634858,41.942152]},"n1895":{"id":"n1895","loc":[-85.634842,41.942269]},"n1896":{"id":"n1896","loc":[-85.634907,41.942313]},"n1897":{"id":"n1897","loc":[-85.635049,41.942331]},"n1898":{"id":"n1898","loc":[-85.635101,41.942281]},"n1899":{"id":"n1899","loc":[-85.635129,41.942144]},"n19":{"id":"n19","loc":[-85.633009,41.942229]},"n190":{"id":"n190","loc":[-85.636702,41.942434]},"n1900":{"id":"n1900","loc":[-85.635531,41.942143]},"n1901":{"id":"n1901","loc":[-85.635534,41.942577]},"n1902":{"id":"n1902","loc":[-85.635158,41.942656]},"n1903":{"id":"n1903","loc":[-85.635121,41.942703]},"n1904":{"id":"n1904","loc":[-85.635087,41.941508]},"n1905":{"id":"n1905","loc":[-85.63536,41.941106]},"n1906":{"id":"n1906","loc":[-85.635442,41.941094]},"n1907":{"id":"n1907","loc":[-85.635508,41.941104]},"n1908":{"id":"n1908","loc":[-85.635569,41.941125]},"n1909":{"id":"n1909","loc":[-85.635583,41.941106]},"n191":{"id":"n191","loc":[-85.636761,41.942434]},"n1910":{"id":"n1910","loc":[-85.635555,41.940976]},"n1911":{"id":"n1911","loc":[-85.635501,41.940915]},"n1912":{"id":"n1912","loc":[-85.635392,41.940922]},"n1913":{"id":"n1913","loc":[-85.635276,41.940974]},"n1914":{"id":"n1914","loc":[-85.63517,41.941204]},"n1915":{"id":"n1915","loc":[-85.634888,41.941517]},"n1916":{"id":"n1916","loc":[-85.634897,41.941576]},"n1917":{"id":"n1917","loc":[-85.634961,41.94164]},"n1918":{"id":"n1918","loc":[-85.635028,41.941659]},"n1919":{"id":"n1919","loc":[-85.635118,41.941621]},"n192":{"id":"n192","loc":[-85.636761,41.942369]},"n1920":{"id":"n1920","loc":[-85.635085,41.941558]},"n1921":{"id":"n1921","loc":[-85.63504,41.94136]},"n1922":{"id":"n1922","loc":[-85.635221,41.941077]},"n1923":{"id":"n1923","loc":[-85.634387,41.941559]},"n1924":{"id":"n1924","loc":[-85.634351,41.941587]},"n1925":{"id":"n1925","loc":[-85.634416,41.941756]},"n1926":{"id":"n1926","loc":[-85.634461,41.941797]},"n1927":{"id":"n1927","loc":[-85.634501,41.941819]},"n1928":{"id":"n1928","loc":[-85.634597,41.941816]},"n1929":{"id":"n1929","loc":[-85.634732,41.941724]},"n193":{"id":"n193","loc":[-85.636855,41.942369]},"n1930":{"id":"n1930","loc":[-85.634672,41.941775]},"n1931":{"id":"n1931","loc":[-85.633403,41.939101]},"n1932":{"id":"n1932","loc":[-85.633297,41.939397]},"n1933":{"id":"n1933","loc":[-85.633205,41.939674]},"n1934":{"id":"n1934","loc":[-85.63322,41.939777]},"n1935":{"id":"n1935","loc":[-85.633345,41.939936]},"n1936":{"id":"n1936","loc":[-85.633376,41.940002]},"n1937":{"id":"n1937","loc":[-85.633266,41.940228]},"n1938":{"id":"n1938","loc":[-85.633236,41.940352]},"n1939":{"id":"n1939","loc":[-85.633282,41.94063]},"n194":{"id":"n194","loc":[-85.636645,41.94249]},"n1940":{"id":"n1940","loc":[-85.633364,41.940874]},"n1941":{"id":"n1941","loc":[-85.633439,41.941052]},"n1942":{"id":"n1942","loc":[-85.633582,41.941172]},"n1943":{"id":"n1943","loc":[-85.633748,41.941273]},"n1944":{"id":"n1944","loc":[-85.634317,41.941527]},"n1945":{"id":"n1945","loc":[-85.634389,41.94174]},"n1946":{"id":"n1946","loc":[-85.634441,41.941801]},"n1947":{"id":"n1947","loc":[-85.634514,41.941837]},"n1948":{"id":"n1948","loc":[-85.634485,41.942005]},"n1949":{"id":"n1949","loc":[-85.63457,41.942202]},"n195":{"id":"n195","loc":[-85.636565,41.94249]},"n1950":{"id":"n1950","loc":[-85.634869,41.942769]},"n1951":{"id":"n1951","loc":[-85.634943,41.942792]},"n1952":{"id":"n1952","loc":[-85.635139,41.942882]},"n1953":{"id":"n1953","loc":[-85.634962,41.943161]},"n1954":{"id":"n1954","loc":[-85.635002,41.943131]},"n1955":{"id":"n1955","loc":[-85.635005,41.943091]},"n1956":{"id":"n1956","loc":[-85.635216,41.943033]},"n1957":{"id":"n1957","loc":[-85.634817,41.94267]},"n1958":{"id":"n1958","loc":[-85.634614,41.942599]},"n1959":{"id":"n1959","loc":[-85.634494,41.942381]},"n196":{"id":"n196","loc":[-85.636565,41.942474]},"n1960":{"id":"n1960","loc":[-85.634486,41.9423]},"n1961":{"id":"n1961","loc":[-85.634671,41.941795]},"n1962":{"id":"n1962","loc":[-85.634595,41.941831]},"n1963":{"id":"n1963","loc":[-85.634332,41.941866]},"n1964":{"id":"n1964","loc":[-85.634207,41.941885]},"n1965":{"id":"n1965","loc":[-85.634133,41.941892]},"n1966":{"id":"n1966","loc":[-85.634131,41.942203]},"n1967":{"id":"n1967","loc":[-85.634047,41.942327]},"n1968":{"id":"n1968","loc":[-85.634219,41.942793]},"n1969":{"id":"n1969","loc":[-85.634061,41.942392]},"n197":{"id":"n197","loc":[-85.636514,41.942474]},"n1970":{"id":"n1970","loc":[-85.633989,41.942407]},"n1971":{"id":"n1971","loc":[-85.633971,41.942356]},"n1972":{"id":"n1972","loc":[-85.63361,41.942423]},"n1973":{"id":"n1973","loc":[-85.633714,41.942682]},"n1974":{"id":"n1974","loc":[-85.633698,41.942863]},"n1975":{"id":"n1975","loc":[-85.633882,41.942865]},"n1976":{"id":"n1976","loc":[-85.633941,41.943007]},"n1977":{"id":"n1977","loc":[-85.633887,41.943035]},"n1978":{"id":"n1978","loc":[-85.633768,41.942815]},"n1979":{"id":"n1979","loc":[-85.633682,41.942351]},"n198":{"id":"n198","loc":[-85.636514,41.942326]},"n1980":{"id":"n1980","loc":[-85.634037,41.942273]},"n1981":{"id":"n1981","loc":[-85.634029,41.942252]},"n1982":{"id":"n1982","loc":[-85.633673,41.942331]},"n1983":{"id":"n1983","loc":[-85.634219,41.942571]},"n1984":{"id":"n1984","loc":[-85.634252,41.942565]},"n1985":{"id":"n1985","loc":[-85.634144,41.942299]},"n1986":{"id":"n1986","loc":[-85.634115,41.942306]},"n1987":{"id":"n1987","loc":[-85.634059,41.943094]},"n1988":{"id":"n1988","loc":[-85.633944,41.942903]},"n1989":{"id":"n1989","loc":[-85.634311,41.942821]},"n199":{"id":"n199","loc":[-85.636561,41.942326]},"n1990":{"id":"n1990","loc":[-85.634351,41.94277]},"n1991":{"id":"n1991","loc":[-85.634153,41.942254]},"n1992":{"id":"n1992","loc":[-85.634092,41.94222]},"n1993":{"id":"n1993","loc":[-85.633571,41.942336]},"n1994":{"id":"n1994","loc":[-85.633513,41.942387]},"n1995":{"id":"n1995","loc":[-85.633509,41.942455]},"n1996":{"id":"n1996","loc":[-85.63363,41.942665]},"n1997":{"id":"n1997","loc":[-85.63414,41.94286]},"n1998":{"id":"n1998","loc":[-85.63397,41.942449]},"n1999":{"id":"n1999","loc":[-85.633551,41.942529]},"n2":{"id":"n2","loc":[-85.627421,41.953877]},"n20":{"id":"n20","loc":[-85.633013,41.941438]},"n200":{"id":"n200","loc":[-85.636561,41.942311]},"n2000":{"id":"n2000","loc":[-85.633741,41.942493]},"n2001":{"id":"n2001","loc":[-85.633894,41.942869]},"n2002":{"id":"n2002","loc":[-85.634132,41.941954]},"n2003":{"id":"n2003","loc":[-85.634032,41.942038]},"n2004":{"id":"n2004","loc":[-85.633765,41.942238]},"n2005":{"id":"n2005","loc":[-85.63376,41.942268]},"n2006":{"id":"n2006","loc":[-85.633768,41.942293]},"n2007":{"id":"n2007","loc":[-85.633808,41.942386]},"n2008":{"id":"n2008","loc":[-85.634946,41.941663]},"n2009":{"id":"n2009","loc":[-85.63511,41.941697]},"n201":{"id":"n201","loc":[-85.636621,41.942311]},"n2010":{"id":"n2010","loc":[-85.635337,41.94168]},"n2011":{"id":"n2011","loc":[-85.634997,41.942251]},"n2012":{"id":"n2012","loc":[-85.635013,41.942173]},"n2013":{"id":"n2013","loc":[-85.634876,41.942157]},"n2014":{"id":"n2014","loc":[-85.634859,41.942235]},"n2015":{"id":"n2015","loc":[-85.634992,41.941951]},"n2016":{"id":"n2016","loc":[-85.634952,41.941877]},"n2017":{"id":"n2017","loc":[-85.634844,41.94191]},"n2018":{"id":"n2018","loc":[-85.634884,41.941983]},"n2019":{"id":"n2019","loc":[-85.635189,41.941691]},"n202":{"id":"n202","loc":[-85.636621,41.942351]},"n2020":{"id":"n2020","loc":[-85.635089,41.941896]},"n2021":{"id":"n2021","loc":[-85.635077,41.941964]},"n2022":{"id":"n2022","loc":[-85.635058,41.942147]},"n2023":{"id":"n2023","loc":[-85.635099,41.942161]},"n2024":{"id":"n2024","loc":[-85.635099,41.942213]},"n2025":{"id":"n2025","loc":[-85.635079,41.942285]},"n2026":{"id":"n2026","loc":[-85.635047,41.942316]},"n2027":{"id":"n2027","loc":[-85.634925,41.9423]},"n2028":{"id":"n2028","loc":[-85.634911,41.942276]},"n2029":{"id":"n2029","loc":[-85.634917,41.942242]},"n203":{"id":"n203","loc":[-85.63666,41.942351]},"n2030":{"id":"n2030","loc":[-85.634698,41.941898]},"n2031":{"id":"n2031","loc":[-85.634964,41.941878]},"n2032":{"id":"n2032","loc":[-85.635025,41.941929]},"n2033":{"id":"n2033","loc":[-85.634862,41.941887]},"n2034":{"id":"n2034","loc":[-85.634811,41.94181]},"n2035":{"id":"n2035","loc":[-85.634731,41.941745]},"n2036":{"id":"n2036","loc":[-85.634933,41.94176]},"n2037":{"id":"n2037","loc":[-85.634942,41.942145]},"n2038":{"id":"n2038","loc":[-85.634944,41.942065]},"n2039":{"id":"n2039","loc":[-85.634914,41.941996]},"n204":{"id":"n204","loc":[-85.63666,41.942453]},"n2040":{"id":"n2040","loc":[-85.634981,41.941979]},"n2041":{"id":"n2041","loc":[-85.633419,41.942172]},"n2042":{"id":"n2042","loc":[-85.633509,41.941631]},"n2043":{"id":"n2043","loc":[-85.633686,41.942937]},"n2044":{"id":"n2044","loc":[-85.633371,41.942722]},"n2045":{"id":"n2045","loc":[-85.633291,41.942538]},"n2046":{"id":"n2046","loc":[-85.633902,41.940941]},"n2047":{"id":"n2047","loc":[-85.635254,41.940939]},"n2048":{"id":"n2048","loc":[-85.635686,41.940829]},"n2049":{"id":"n2049","loc":[-85.635712,41.942681]},"n205":{"id":"n205","loc":[-85.636645,41.942453]},"n2050":{"id":"n2050","loc":[-85.633721,41.942118]},"n2051":{"id":"n2051","loc":[-85.633698,41.942057]},"n2052":{"id":"n2052","loc":[-85.633591,41.942079]},"n2053":{"id":"n2053","loc":[-85.633614,41.94214]},"n2054":{"id":"n2054","loc":[-85.633968,41.941099]},"n2055":{"id":"n2055","loc":[-85.633907,41.941138]},"n2056":{"id":"n2056","loc":[-85.633968,41.941197]},"n2057":{"id":"n2057","loc":[-85.63404,41.941162]},"n2058":{"id":"n2058","loc":[-85.634839,41.941665]},"n2059":{"id":"n2059","loc":[-85.635314,41.943035]},"n206":{"id":"n206","loc":[-85.636394,41.942471]},"n2060":{"id":"n2060","loc":[-85.634919,41.943142]},"n2061":{"id":"n2061","loc":[-85.636433,41.942959],"tags":{"addr:city":"Three Rivers","addr:housenumber":"333","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","amenity":"townhall","name":"Three Rivers City Hall"}},"n2062":{"id":"n2062","loc":[-85.637039,41.942789]},"n2063":{"id":"n2063","loc":[-85.636333,41.94279]},"n2064":{"id":"n2064","loc":[-85.634484,41.940726]},"n2065":{"id":"n2065","loc":[-85.634483,41.940603]},"n2066":{"id":"n2066","loc":[-85.634908,41.940601]},"n2067":{"id":"n2067","loc":[-85.634908,41.94053]},"n2068":{"id":"n2068","loc":[-85.634934,41.94053]},"n2069":{"id":"n2069","loc":[-85.634934,41.940496]},"n207":{"id":"n207","loc":[-85.636262,41.942472]},"n2070":{"id":"n2070","loc":[-85.63504,41.940495]},"n2071":{"id":"n2071","loc":[-85.63504,41.940531]},"n2072":{"id":"n2072","loc":[-85.635068,41.940531]},"n2073":{"id":"n2073","loc":[-85.635071,41.940794]},"n2074":{"id":"n2074","loc":[-85.635183,41.940793]},"n2075":{"id":"n2075","loc":[-85.635185,41.940916]},"n2076":{"id":"n2076","loc":[-85.634799,41.940919]},"n2077":{"id":"n2077","loc":[-85.634798,41.940798]},"n2078":{"id":"n2078","loc":[-85.634925,41.940797]},"n2079":{"id":"n2079","loc":[-85.634924,41.940724]},"n208":{"id":"n208","loc":[-85.636261,41.94233]},"n2080":{"id":"n2080","loc":[-85.637448,41.938233]},"n2081":{"id":"n2081","loc":[-85.634168,41.943279]},"n2082":{"id":"n2082","loc":[-85.635744,41.938248]},"n2083":{"id":"n2083","loc":[-85.638744,41.951211]},"n2084":{"id":"n2084","loc":[-85.636421,41.946392]},"n2085":{"id":"n2085","loc":[-85.635965,41.945809]},"n2086":{"id":"n2086","loc":[-85.635683,41.945449]},"n2087":{"id":"n2087","loc":[-85.635281,41.945025]},"n2088":{"id":"n2088","loc":[-85.632443,41.942574]},"n2089":{"id":"n2089","loc":[-85.638243,41.943674]},"n209":{"id":"n209","loc":[-85.636353,41.942329]},"n2090":{"id":"n2090","loc":[-85.638228,41.943747]},"n2091":{"id":"n2091","loc":[-85.638163,41.943797]},"n2092":{"id":"n2092","loc":[-85.638089,41.943832]},"n2093":{"id":"n2093","loc":[-85.637969,41.943841]},"n2094":{"id":"n2094","loc":[-85.637841,41.943833]},"n2095":{"id":"n2095","loc":[-85.637342,41.943734]},"n2096":{"id":"n2096","loc":[-85.637232,41.943707]},"n2097":{"id":"n2097","loc":[-85.637163,41.943668]},"n2098":{"id":"n2098","loc":[-85.637118,41.943615]},"n2099":{"id":"n2099","loc":[-85.637078,41.943494]},"n21":{"id":"n21","loc":[-85.634126,41.942228]},"n210":{"id":"n210","loc":[-85.636354,41.94239]},"n2100":{"id":"n2100","loc":[-85.632903,41.998429],"tags":{"railway":"level_crossing"}},"n2101":{"id":"n2101","loc":[-85.633616,41.943581],"tags":{"railway":"level_crossing"}},"n2102":{"id":"n2102","loc":[-85.636943,41.947311]},"n2103":{"id":"n2103","loc":[-85.6376,41.94854]},"n2104":{"id":"n2104","loc":[-85.634565,41.93631]},"n2105":{"id":"n2105","loc":[-85.629597,41.942562]},"n2106":{"id":"n2106","loc":[-85.630821,41.943077]},"n2107":{"id":"n2107","loc":[-85.627473,41.940659]},"n2108":{"id":"n2108","loc":[-85.629708,41.942872]},"n2109":{"id":"n2109","loc":[-85.634093,41.935448]},"n211":{"id":"n211","loc":[-85.636393,41.94239]},"n2110":{"id":"n2110","loc":[-85.630413,41.94366]},"n2111":{"id":"n2111","loc":[-85.630488,41.942662]},"n2112":{"id":"n2112","loc":[-85.63361,41.936749]},"n2113":{"id":"n2113","loc":[-85.630038,41.941808]},"n2114":{"id":"n2114","loc":[-85.632016,41.942922]},"n2115":{"id":"n2115","loc":[-85.631525,41.944303]},"n2116":{"id":"n2116","loc":[-85.626862,41.94022]},"n2117":{"id":"n2117","loc":[-85.629673,41.94121]},"n2118":{"id":"n2118","loc":[-85.632752,41.943101]},"n2119":{"id":"n2119","loc":[-85.631147,41.943201]},"n212":{"id":"n212","loc":[-85.63444,41.943176]},"n2120":{"id":"n2120","loc":[-85.624974,41.940579]},"n2121":{"id":"n2121","loc":[-85.629518,41.941783]},"n2122":{"id":"n2122","loc":[-85.632349,41.942699]},"n2123":{"id":"n2123","loc":[-85.628418,41.940356]},"n2124":{"id":"n2124","loc":[-85.629147,41.94129]},"n2125":{"id":"n2125","loc":[-85.631111,41.943979]},"n2126":{"id":"n2126","loc":[-85.632087,41.940013]},"n2127":{"id":"n2127","loc":[-85.634469,41.935057]},"n2128":{"id":"n2128","loc":[-85.630097,41.943449]},"n2129":{"id":"n2129","loc":[-85.6331,41.937878]},"n213":{"id":"n213","loc":[-85.63375,41.942814]},"n2130":{"id":"n2130","loc":[-85.625274,41.941114]},"n2131":{"id":"n2131","loc":[-85.632632,41.941217]},"n2132":{"id":"n2132","loc":[-85.632739,41.941926]},"n2133":{"id":"n2133","loc":[-85.631647,41.94366]},"n2134":{"id":"n2134","loc":[-85.635059,41.935456]},"n2135":{"id":"n2135","loc":[-85.631259,41.944349]},"n2136":{"id":"n2136","loc":[-85.626336,41.940811]},"n2137":{"id":"n2137","loc":[-85.631507,41.943875]},"n2138":{"id":"n2138","loc":[-85.625081,41.940859]},"n2139":{"id":"n2139","loc":[-85.625778,41.940093]},"n214":{"id":"n214","loc":[-85.633674,41.942869]},"n2140":{"id":"n2140","loc":[-85.632641,41.942436]},"n2141":{"id":"n2141","loc":[-85.628825,41.941034]},"n2142":{"id":"n2142","loc":[-85.627913,41.940292]},"n2143":{"id":"n2143","loc":[-85.628943,41.940516]},"n2144":{"id":"n2144","loc":[-85.63139,41.943941]},"n2145":{"id":"n2145","loc":[-85.630081,41.94204]},"n2146":{"id":"n2146","loc":[-85.632194,41.93963]},"n2147":{"id":"n2147","loc":[-85.632913,41.93939]},"n2148":{"id":"n2148","loc":[-85.632001,41.943492]},"n2149":{"id":"n2149","loc":[-85.63149,41.943154]},"n215":{"id":"n215","loc":[-85.633542,41.942768]},"n2150":{"id":"n2150","loc":[-85.625167,41.940117]},"n2151":{"id":"n2151","loc":[-85.63287,41.939941]},"n2152":{"id":"n2152","loc":[-85.630789,41.943732]},"n2153":{"id":"n2153","loc":[-85.632173,41.940348]},"n2154":{"id":"n2154","loc":[-85.626587,41.940113]},"n2155":{"id":"n2155","loc":[-85.62684,41.940667]},"n2156":{"id":"n2156","loc":[-85.632527,41.938904]},"n2157":{"id":"n2157","loc":[-85.624866,41.94018]},"n2158":{"id":"n2158","loc":[-85.633267,41.93872]},"n2159":{"id":"n2159","loc":[-85.62934,41.940843]},"n216":{"id":"n216","loc":[-85.633618,41.942714]},"n2160":{"id":"n2160","loc":[-85.62272,41.953817]},"n2161":{"id":"n2161","loc":[-85.622555,41.954453]},"n2162":{"id":"n2162","loc":[-85.637225,41.944128]},"n2163":{"id":"n2163","loc":[-85.622628,41.953683]},"n2164":{"id":"n2164","loc":[-85.635441,41.943989]},"n2165":{"id":"n2165","loc":[-85.622629,41.953807]},"n2166":{"id":"n2166","loc":[-85.62262,41.953807]},"n2167":{"id":"n2167","loc":[-85.62262,41.953837]},"n2168":{"id":"n2168","loc":[-85.622532,41.953838]},"n2169":{"id":"n2169","loc":[-85.637469,41.944579]},"n217":{"id":"n217","loc":[-85.634001,41.942336]},"n2170":{"id":"n2170","loc":[-85.63688,41.943935]},"n2171":{"id":"n2171","loc":[-85.638263,41.946367]},"n2172":{"id":"n2172","loc":[-85.622532,41.953807]},"n2173":{"id":"n2173","loc":[-85.622353,41.953808]},"n2174":{"id":"n2174","loc":[-85.622352,41.953685]},"n2175":{"id":"n2175","loc":[-85.622464,41.953684]},"n2176":{"id":"n2176","loc":[-85.622464,41.953648]},"n2177":{"id":"n2177","loc":[-85.637136,41.94576]},"n2178":{"id":"n2178","loc":[-85.622521,41.953648]},"n2179":{"id":"n2179","loc":[-85.637129,41.945415]},"n218":{"id":"n218","loc":[-85.633825,41.942376]},"n2180":{"id":"n2180","loc":[-85.637473,41.94607]},"n2181":{"id":"n2181","loc":[-85.622521,41.953683]},"n2182":{"id":"n2182","loc":[-85.622717,41.954104]},"n2183":{"id":"n2183","loc":[-85.637769,41.946095]},"n2184":{"id":"n2184","loc":[-85.623872,41.953515]},"n2185":{"id":"n2185","loc":[-85.623851,41.953588]},"n2186":{"id":"n2186","loc":[-85.631385,41.94433]},"n2187":{"id":"n2187","loc":[-85.623608,41.953543]},"n2188":{"id":"n2188","loc":[-85.637308,41.944882]},"n2189":{"id":"n2189","loc":[-85.634898,41.944041]},"n219":{"id":"n219","loc":[-85.633807,41.942334]},"n2190":{"id":"n2190","loc":[-85.623604,41.953442]},"n2191":{"id":"n2191","loc":[-85.623705,41.953442]},"n2192":{"id":"n2192","loc":[-85.623708,41.953493]},"n2193":{"id":"n2193","loc":[-85.624064,41.952655]},"n2194":{"id":"n2194","loc":[-85.62395,41.952654]},"n2195":{"id":"n2195","loc":[-85.623951,41.952579]},"n2196":{"id":"n2196","loc":[-85.637435,41.944342]},"n2197":{"id":"n2197","loc":[-85.624064,41.952579]},"n2198":{"id":"n2198","loc":[-85.623812,41.952648]},"n2199":{"id":"n2199","loc":[-85.623813,41.952705]},"n22":{"id":"n22","loc":[-85.633531,41.942357]},"n220":{"id":"n220","loc":[-85.633983,41.942294]},"n2200":{"id":"n2200","loc":[-85.637169,41.945098]},"n2201":{"id":"n2201","loc":[-85.623552,41.952707]},"n2202":{"id":"n2202","loc":[-85.623551,41.95263]},"n2203":{"id":"n2203","loc":[-85.623701,41.952629]},"n2204":{"id":"n2204","loc":[-85.635894,41.943719]},"n2205":{"id":"n2205","loc":[-85.637297,41.945992]},"n2206":{"id":"n2206","loc":[-85.623724,41.952648]},"n2207":{"id":"n2207","loc":[-85.623812,41.952438]},"n2208":{"id":"n2208","loc":[-85.625239,41.952197]},"n2209":{"id":"n2209","loc":[-85.625232,41.952257]},"n221":{"id":"n221","loc":[-85.634182,41.942495]},"n2210":{"id":"n2210","loc":[-85.635175,41.94408]},"n2211":{"id":"n2211","loc":[-85.636381,41.943761]},"n2212":{"id":"n2212","loc":[-85.625115,41.952249]},"n2213":{"id":"n2213","loc":[-85.638578,41.946644]},"n2214":{"id":"n2214","loc":[-85.625122,41.952189]},"n2215":{"id":"n2215","loc":[-85.625085,41.952031]},"n2216":{"id":"n2216","loc":[-85.636126,41.943713]},"n2217":{"id":"n2217","loc":[-85.635005,41.944041]},"n2218":{"id":"n2218","loc":[-85.63714,41.945328]},"n2219":{"id":"n2219","loc":[-85.634871,41.943292]},"n222":{"id":"n222","loc":[-85.634149,41.942503]},"n2220":{"id":"n2220","loc":[-85.635705,41.943799]},"n2221":{"id":"n2221","loc":[-85.634995,41.943576]},"n2222":{"id":"n2222","loc":[-85.635026,41.943829]},"n2223":{"id":"n2223","loc":[-85.632874,41.941031]},"n2224":{"id":"n2224","loc":[-85.632531,41.940233]},"n2225":{"id":"n2225","loc":[-85.634247,41.936003]},"n2226":{"id":"n2226","loc":[-85.62929,41.941127]},"n2227":{"id":"n2227","loc":[-85.630428,41.943266]},"n2228":{"id":"n2228","loc":[-85.631608,41.943425]},"n2229":{"id":"n2229","loc":[-85.632316,41.943042]},"n223":{"id":"n223","loc":[-85.634098,41.942373]},"n2230":{"id":"n2230","loc":[-85.628711,41.940744]},"n2231":{"id":"n2231","loc":[-85.627831,41.940536]},"n2232":{"id":"n2232","loc":[-85.625514,41.94052]},"n2233":{"id":"n2233","loc":[-85.631127,41.943545]},"n2234":{"id":"n2234","loc":[-85.632909,41.942531]},"n2235":{"id":"n2235","loc":[-85.632917,41.938796]},"n2236":{"id":"n2236","loc":[-85.626716,41.94044]},"n2237":{"id":"n2237","loc":[-85.630122,41.942852]},"n2238":{"id":"n2238","loc":[-85.632509,41.939674]},"n2239":{"id":"n2239","loc":[-85.634762,41.935237]},"n224":{"id":"n224","loc":[-85.634131,41.942366]},"n2240":{"id":"n2240","loc":[-85.63384,41.937025]},"n2241":{"id":"n2241","loc":[-85.629741,41.941909]},"n2242":{"id":"n2242","loc":[-85.635254,41.945001],"tags":{"railway":"level_crossing"}},"n2243":{"id":"n2243","loc":[-85.634005,41.938168]},"n2244":{"id":"n2244","loc":[-85.63393,41.938335]},"n2245":{"id":"n2245","loc":[-85.633859,41.93846]},"n2246":{"id":"n2246","loc":[-85.633663,41.938776]},"n2247":{"id":"n2247","loc":[-85.633513,41.938936]},"n2248":{"id":"n2248","loc":[-85.635295,41.943225]},"n2249":{"id":"n2249","loc":[-85.635393,41.943293]},"n225":{"id":"n225","loc":[-85.635986,41.94177]},"n2250":{"id":"n2250","loc":[-85.635645,41.94332]},"n2251":{"id":"n2251","loc":[-85.63629,41.943328]},"n2252":{"id":"n2252","loc":[-85.636554,41.943372]},"n2253":{"id":"n2253","loc":[-85.636869,41.943526]},"n2254":{"id":"n2254","loc":[-85.637099,41.943704]},"n2255":{"id":"n2255","loc":[-85.637268,41.943773]},"n2256":{"id":"n2256","loc":[-85.637483,41.943821]},"n2257":{"id":"n2257","loc":[-85.637616,41.943929]},"n2258":{"id":"n2258","loc":[-85.637752,41.944114]},"n2259":{"id":"n2259","loc":[-85.638399,41.944308]},"n226":{"id":"n226","loc":[-85.635982,41.941523]},"n2260":{"id":"n2260","loc":[-85.638573,41.944451]},"n2261":{"id":"n2261","loc":[-85.638702,41.944574]},"n2262":{"id":"n2262","loc":[-85.638718,41.944652]},"n2263":{"id":"n2263","loc":[-85.638715,41.944809]},"n2264":{"id":"n2264","loc":[-85.638766,41.944988]},"n2265":{"id":"n2265","loc":[-85.638773,41.945136]},"n2266":{"id":"n2266","loc":[-85.638705,41.945251]},"n2267":{"id":"n2267","loc":[-85.638335,41.944291]},"n2268":{"id":"n2268","loc":[-85.638474,41.944352]},"n2269":{"id":"n2269","loc":[-85.635408,41.943429]},"n227":{"id":"n227","loc":[-85.636108,41.941521]},"n2270":{"id":"n2270","loc":[-85.635271,41.943654]},"n2271":{"id":"n2271","loc":[-85.635266,41.943744]},"n2272":{"id":"n2272","loc":[-85.635271,41.943819]},"n2273":{"id":"n2273","loc":[-85.635192,41.943876]},"n2274":{"id":"n2274","loc":[-85.635129,41.943857]},"n2275":{"id":"n2275","loc":[-85.635122,41.943764]},"n2276":{"id":"n2276","loc":[-85.635124,41.943664]},"n2277":{"id":"n2277","loc":[-85.63515,41.943611]},"n2278":{"id":"n2278","loc":[-85.635106,41.943534]},"n2279":{"id":"n2279","loc":[-85.634972,41.943197]},"n228":{"id":"n228","loc":[-85.636109,41.941559]},"n2280":{"id":"n2280","loc":[-85.633978,41.938227]},"n2281":{"id":"n2281","loc":[-85.634216,41.943255]},"n2282":{"id":"n2282","loc":[-85.634434,41.943622]},"n2283":{"id":"n2283","loc":[-85.632406,41.940854]},"n2284":{"id":"n2284","loc":[-85.632488,41.941063],"tags":{"leisure":"slipway"}},"n2285":{"id":"n2285","loc":[-85.632726,41.941537]},"n2286":{"id":"n2286","loc":[-85.632639,41.94136]},"n2287":{"id":"n2287","loc":[-85.632704,41.941439]},"n2288":{"id":"n2288","loc":[-85.632289,41.940601]},"n2289":{"id":"n2289","loc":[-85.632541,41.942526]},"n229":{"id":"n229","loc":[-85.636145,41.941559]},"n2290":{"id":"n2290","loc":[-85.634058,41.943173]},"n2291":{"id":"n2291","loc":[-85.636175,41.945974]},"n2292":{"id":"n2292","loc":[-85.636528,41.945975]},"n2293":{"id":"n2293","loc":[-85.637092,41.945893]},"n2294":{"id":"n2294","loc":[-85.637881,41.945647]},"n2295":{"id":"n2295","loc":[-85.639329,41.945162]},"n2296":{"id":"n2296","loc":[-85.639323,41.945026]},"n2297":{"id":"n2297","loc":[-85.638826,41.945032]},"n2298":{"id":"n2298","loc":[-85.638817,41.944174]},"n2299":{"id":"n2299","loc":[-85.638291,41.94418]},"n23":{"id":"n23","loc":[-85.633504,41.942418]},"n230":{"id":"n230","loc":[-85.636145,41.941551]},"n2300":{"id":"n2300","loc":[-85.63828,41.943811]},"n2301":{"id":"n2301","loc":[-85.638195,41.943601]},"n2302":{"id":"n2302","loc":[-85.63719,41.943592]},"n2303":{"id":"n2303","loc":[-85.636697,41.943273]},"n2304":{"id":"n2304","loc":[-85.635375,41.943274]},"n2305":{"id":"n2305","loc":[-85.635091,41.943547]},"n2306":{"id":"n2306","loc":[-85.63442,41.944117]},"n2307":{"id":"n2307","loc":[-85.635117,41.943717]},"n2308":{"id":"n2308","loc":[-85.635601,41.945177]},"n2309":{"id":"n2309","loc":[-85.635819,41.945494]},"n231":{"id":"n231","loc":[-85.636312,41.941549]},"n2310":{"id":"n2310","loc":[-85.635303,41.944891]},"n2311":{"id":"n2311","loc":[-85.637674,41.943802]},"n2312":{"id":"n2312","loc":[-85.638263,41.944272]},"n2313":{"id":"n2313","loc":[-85.634267,41.935266]},"n2314":{"id":"n2314","loc":[-85.639788,41.945152]},"n2315":{"id":"n2315","loc":[-85.639645,41.945167]},"n2316":{"id":"n2316","loc":[-85.639362,41.945233]},"n2317":{"id":"n2317","loc":[-85.638616,41.945163]},"n2318":{"id":"n2318","loc":[-85.638514,41.944936]},"n2319":{"id":"n2319","loc":[-85.638578,41.94503]},"n232":{"id":"n232","loc":[-85.636314,41.941649]},"n2320":{"id":"n2320","loc":[-85.638578,41.945215]},"n2321":{"id":"n2321","loc":[-85.640495,41.947015]},"n2322":{"id":"n2322","loc":[-85.639577,41.946495]},"n2323":{"id":"n2323","loc":[-85.638935,41.946087]},"n2324":{"id":"n2324","loc":[-85.637535,41.94584]},"n2325":{"id":"n2325","loc":[-85.638357,41.945404]},"n2326":{"id":"n2326","loc":[-85.638051,41.94553]},"n2327":{"id":"n2327","loc":[-85.637732,41.945555]},"n2328":{"id":"n2328","loc":[-85.637657,41.945524]},"n2329":{"id":"n2329","loc":[-85.637598,41.945467]},"n233":{"id":"n233","loc":[-85.636152,41.94165]},"n2330":{"id":"n2330","loc":[-85.637669,41.945318]},"n2331":{"id":"n2331","loc":[-85.637894,41.945171]},"n2332":{"id":"n2332","loc":[-85.637923,41.945082]},"n2333":{"id":"n2333","loc":[-85.63793,41.944756]},"n2334":{"id":"n2334","loc":[-85.637976,41.944696]},"n2335":{"id":"n2335","loc":[-85.638044,41.944671]},"n2336":{"id":"n2336","loc":[-85.638129,41.944597]},"n2337":{"id":"n2337","loc":[-85.638252,41.944413]},"n2338":{"id":"n2338","loc":[-85.638092,41.945442]},"n2339":{"id":"n2339","loc":[-85.638409,41.945315]},"n234":{"id":"n234","loc":[-85.636152,41.941628]},"n2340":{"id":"n2340","loc":[-85.638325,41.944771]},"n2341":{"id":"n2341","loc":[-85.638103,41.944744]},"n2342":{"id":"n2342","loc":[-85.637976,41.944781]},"n2343":{"id":"n2343","loc":[-85.637983,41.944865]},"n2344":{"id":"n2344","loc":[-85.638063,41.945074]},"n2345":{"id":"n2345","loc":[-85.638041,41.945206]},"n2346":{"id":"n2346","loc":[-85.637907,41.945309]},"n2347":{"id":"n2347","loc":[-85.637925,41.94539]},"n2348":{"id":"n2348","loc":[-85.637998,41.94545]},"n2349":{"id":"n2349","loc":[-85.637135,41.946254]},"n235":{"id":"n235","loc":[-85.63611,41.941628]},"n2350":{"id":"n2350","loc":[-85.636837,41.946615]},"n2351":{"id":"n2351","loc":[-85.637954,41.948909]},"n2352":{"id":"n2352","loc":[-85.638382,41.949786]},"n2353":{"id":"n2353","loc":[-85.639367,41.951242]},"n2354":{"id":"n2354","loc":[-85.640554,41.951777]},"n2355":{"id":"n2355","loc":[-85.6411,41.952234]},"n2356":{"id":"n2356","loc":[-85.641742,41.952657]},"n2357":{"id":"n2357","loc":[-85.642321,41.952941]},"n2358":{"id":"n2358","loc":[-85.64277,41.953228]},"n2359":{"id":"n2359","loc":[-85.643333,41.953825]},"n236":{"id":"n236","loc":[-85.636113,41.941768]},"n2360":{"id":"n2360","loc":[-85.643579,41.954365]},"n2361":{"id":"n2361","loc":[-85.644439,41.954105]},"n2362":{"id":"n2362","loc":[-85.64506,41.954]},"n2363":{"id":"n2363","loc":[-85.645483,41.953911]},"n2364":{"id":"n2364","loc":[-85.646046,41.953853]},"n2365":{"id":"n2365","loc":[-85.646318,41.953717]},"n2366":{"id":"n2366","loc":[-85.646276,41.953414]},"n2367":{"id":"n2367","loc":[-85.631063,41.957478],"tags":{"emergency":"fire_hydrant"}},"n2368":{"id":"n2368","loc":[-85.630996,41.955857],"tags":{"emergency":"fire_hydrant"}},"n2369":{"id":"n2369","loc":[-85.630976,41.954608],"tags":{"emergency":"fire_hydrant"}},"n237":{"id":"n237","loc":[-85.635983,41.941589],"tags":{"entrance":"yes"}},"n2370":{"id":"n2370","loc":[-85.646,41.953154]},"n2371":{"id":"n2371","loc":[-85.645222,41.953193]},"n2372":{"id":"n2372","loc":[-85.644732,41.953181]},"n2373":{"id":"n2373","loc":[-85.644064,41.953298]},"n2374":{"id":"n2374","loc":[-85.643818,41.953177]},"n2375":{"id":"n2375","loc":[-85.644001,41.95284]},"n2376":{"id":"n2376","loc":[-85.628174,41.95456],"tags":{"emergency":"fire_hydrant"}},"n2377":{"id":"n2377","loc":[-85.644267,41.952591]},"n2378":{"id":"n2378","loc":[-85.644288,41.952328]},"n2379":{"id":"n2379","loc":[-85.627276,41.953987],"tags":{"emergency":"fire_hydrant"}},"n238":{"id":"n238","loc":[-85.635906,41.94159]},"n2380":{"id":"n2380","loc":[-85.644262,41.952153]},"n2381":{"id":"n2381","loc":[-85.644168,41.95204]},"n2382":{"id":"n2382","loc":[-85.64421,41.951749]},"n2383":{"id":"n2383","loc":[-85.64385,41.951586]},"n2384":{"id":"n2384","loc":[-85.62736,41.955964],"tags":{"emergency":"fire_hydrant"}},"n2385":{"id":"n2385","loc":[-85.626307,41.957198],"tags":{"emergency":"fire_hydrant"}},"n2386":{"id":"n2386","loc":[-85.643589,41.951323]},"n2387":{"id":"n2387","loc":[-85.62747,41.957509],"tags":{"emergency":"fire_hydrant"}},"n2388":{"id":"n2388","loc":[-85.628665,41.957492],"tags":{"emergency":"fire_hydrant"}},"n2389":{"id":"n2389","loc":[-85.642535,41.951031]},"n239":{"id":"n239","loc":[-85.635883,41.940182]},"n2390":{"id":"n2390","loc":[-85.642269,41.95088]},"n2391":{"id":"n2391","loc":[-85.641878,41.950814]},"n2392":{"id":"n2392","loc":[-85.641549,41.950806]},"n2393":{"id":"n2393","loc":[-85.641103,41.950549]},"n2394":{"id":"n2394","loc":[-85.630864,41.959046],"tags":{"emergency":"fire_hydrant"}},"n2395":{"id":"n2395","loc":[-85.632249,41.958969],"tags":{"emergency":"fire_hydrant"}},"n2396":{"id":"n2396","loc":[-85.641037,41.949821]},"n2397":{"id":"n2397","loc":[-85.641006,41.949433]},"n2398":{"id":"n2398","loc":[-85.632232,41.95859],"tags":{"emergency":"fire_hydrant"}},"n2399":{"id":"n2399","loc":[-85.632071,41.958345],"tags":{"emergency":"fire_hydrant"}},"n24":{"id":"n24","loc":[-85.634346,41.942792]},"n240":{"id":"n240","loc":[-85.635916,41.94264]},"n2400":{"id":"n2400","loc":[-85.632228,41.9573],"tags":{"emergency":"fire_hydrant"}},"n2401":{"id":"n2401","loc":[-85.641152,41.948257]},"n2402":{"id":"n2402","loc":[-85.641055,41.947304]},"n2403":{"id":"n2403","loc":[-85.638022,41.945897]},"n2404":{"id":"n2404","loc":[-85.638672,41.950778]},"n2405":{"id":"n2405","loc":[-85.63666,41.944492],"tags":{"name":"Memory Isle","place":"island"}},"n2406":{"id":"n2406","loc":[-85.635,41.946389],"tags":{"amenity":"post_office","name":"Three Rivers Post Office"}},"n2407":{"id":"n2407","loc":[-85.633676,41.946036]},"n2408":{"id":"n2408","loc":[-85.633736,41.946078]},"n2409":{"id":"n2409","loc":[-85.633997,41.946185]},"n241":{"id":"n241","loc":[-85.635795,41.941906]},"n2410":{"id":"n2410","loc":[-85.634448,41.945626],"tags":{"highway":"traffic_signals","traffic_signals":"signal"}},"n2411":{"id":"n2411","loc":[-85.63456,41.945731],"tags":{"crossing":"zebra","highway":"crossing"}},"n2412":{"id":"n2412","loc":[-85.634592,41.94578]},"n2413":{"id":"n2413","loc":[-85.634607,41.945815]},"n2414":{"id":"n2414","loc":[-85.634614,41.945864]},"n2415":{"id":"n2415","loc":[-85.636066,41.946185]},"n2416":{"id":"n2416","loc":[-85.636128,41.946352]},"n2417":{"id":"n2417","loc":[-85.636142,41.946452]},"n2418":{"id":"n2418","loc":[-85.635327,41.945292]},"n2419":{"id":"n2419","loc":[-85.635648,41.94558]},"n242":{"id":"n242","loc":[-85.635909,41.941906]},"n2420":{"id":"n2420","loc":[-85.635769,41.945729]},"n2421":{"id":"n2421","loc":[-85.637349,41.945897]},"n2422":{"id":"n2422","loc":[-85.632211,41.95596],"tags":{"emergency":"fire_hydrant"}},"n2423":{"id":"n2423","loc":[-85.635942,41.94598]},"n2424":{"id":"n2424","loc":[-85.636443,41.946042]},"n2425":{"id":"n2425","loc":[-85.635819,41.946052]},"n2426":{"id":"n2426","loc":[-85.636669,41.946025]},"n2427":{"id":"n2427","loc":[-85.636832,41.946005]},"n2428":{"id":"n2428","loc":[-85.637039,41.945968]},"n2429":{"id":"n2429","loc":[-85.636291,41.946046]},"n243":{"id":"n243","loc":[-85.636359,41.941904]},"n2430":{"id":"n2430","loc":[-85.634005,41.943367]},"n2431":{"id":"n2431","loc":[-85.633366,41.943724]},"n2432":{"id":"n2432","loc":[-85.634617,41.946057]},"n2433":{"id":"n2433","loc":[-85.636534,41.944793]},"n2434":{"id":"n2434","loc":[-85.637055,41.945188]},"n2435":{"id":"n2435","loc":[-85.636153,41.944618]},"n2436":{"id":"n2436","loc":[-85.636803,41.944944]},"n2437":{"id":"n2437","loc":[-85.633389,41.945735]},"n2438":{"id":"n2438","loc":[-85.633536,41.94585]},"n2439":{"id":"n2439","loc":[-85.63363,41.945993]},"n244":{"id":"n244","loc":[-85.636351,41.941438]},"n2440":{"id":"n2440","loc":[-85.633268,41.94568]},"n2441":{"id":"n2441","loc":[-85.635947,41.94546]},"n2442":{"id":"n2442","loc":[-85.636277,41.945268]},"n2443":{"id":"n2443","loc":[-85.635203,41.944287]},"n2444":{"id":"n2444","loc":[-85.634876,41.944477]},"n2445":{"id":"n2445","loc":[-85.634975,41.944419]},"n2446":{"id":"n2446","loc":[-85.633877,41.943438]},"n2447":{"id":"n2447","loc":[-85.63508,41.945113]},"n2448":{"id":"n2448","loc":[-85.635372,41.944932]},"n2449":{"id":"n2449","loc":[-85.636594,41.945935]},"n245":{"id":"n245","loc":[-85.635903,41.941436]},"n2450":{"id":"n2450","loc":[-85.636901,41.945747]},"n2451":{"id":"n2451","loc":[-85.636329,41.945228]},"n2452":{"id":"n2452","loc":[-85.636025,41.945417]},"n2453":{"id":"n2453","loc":[-85.634002,41.944644]},"n2454":{"id":"n2454","loc":[-85.63407,41.944692]},"n2455":{"id":"n2455","loc":[-85.634114,41.944756]},"n2456":{"id":"n2456","loc":[-85.633762,41.944809]},"n2457":{"id":"n2457","loc":[-85.634184,41.944807]},"n2458":{"id":"n2458","loc":[-85.634291,41.944819]},"n2459":{"id":"n2459","loc":[-85.634639,41.944845]},"n246":{"id":"n246","loc":[-85.635788,41.941436]},"n2460":{"id":"n2460","loc":[-85.633822,41.944861]},"n2461":{"id":"n2461","loc":[-85.63411,41.944855]},"n2462":{"id":"n2462","loc":[-85.63435,41.944872]},"n2463":{"id":"n2463","loc":[-85.63441,41.944903]},"n2464":{"id":"n2464","loc":[-85.633883,41.944913]},"n2465":{"id":"n2465","loc":[-85.634164,41.944896]},"n2466":{"id":"n2466","loc":[-85.633487,41.944926]},"n2467":{"id":"n2467","loc":[-85.634736,41.944929]},"n2468":{"id":"n2468","loc":[-85.633944,41.944965]},"n2469":{"id":"n2469","loc":[-85.633555,41.944983]},"n247":{"id":"n247","loc":[-85.635929,41.941511]},"n2470":{"id":"n2470","loc":[-85.633995,41.945013]},"n2471":{"id":"n2471","loc":[-85.633614,41.945037]},"n2472":{"id":"n2472","loc":[-85.634848,41.945031]},"n2473":{"id":"n2473","loc":[-85.634049,41.945061]},"n2474":{"id":"n2474","loc":[-85.633678,41.945094]},"n2475":{"id":"n2475","loc":[-85.63317,41.945111]},"n2476":{"id":"n2476","loc":[-85.633357,41.945103]},"n2477":{"id":"n2477","loc":[-85.633728,41.945136]},"n2478":{"id":"n2478","loc":[-85.634146,41.945148]},"n2479":{"id":"n2479","loc":[-85.633416,41.945157]},"n248":{"id":"n248","loc":[-85.635929,41.941317]},"n2480":{"id":"n2480","loc":[-85.634625,41.945172]},"n2481":{"id":"n2481","loc":[-85.633239,41.945174]},"n2482":{"id":"n2482","loc":[-85.63469,41.945185]},"n2483":{"id":"n2483","loc":[-85.634661,41.945203]},"n2484":{"id":"n2484","loc":[-85.63348,41.945214]},"n2485":{"id":"n2485","loc":[-85.633578,41.945221]},"n2486":{"id":"n2486","loc":[-85.634742,41.945231]},"n2487":{"id":"n2487","loc":[-85.634251,41.94525]},"n2488":{"id":"n2488","loc":[-85.633524,41.945254]},"n2489":{"id":"n2489","loc":[-85.63468,41.945271]},"n249":{"id":"n249","loc":[-85.636414,41.941316]},"n2490":{"id":"n2490","loc":[-85.633885,41.945272]},"n2491":{"id":"n2491","loc":[-85.634795,41.945288]},"n2492":{"id":"n2492","loc":[-85.634742,41.94532]},"n2493":{"id":"n2493","loc":[-85.633946,41.945327]},"n2494":{"id":"n2494","loc":[-85.634844,41.945331]},"n2495":{"id":"n2495","loc":[-85.63435,41.945349]},"n2496":{"id":"n2496","loc":[-85.633733,41.945357]},"n2497":{"id":"n2497","loc":[-85.633987,41.945375]},"n2498":{"id":"n2498","loc":[-85.634911,41.945419]},"n2499":{"id":"n2499","loc":[-85.634049,41.945431]},"n25":{"id":"n25","loc":[-85.634333,41.942809]},"n250":{"id":"n250","loc":[-85.636414,41.941511]},"n2500":{"id":"n2500","loc":[-85.633705,41.945461]},"n2501":{"id":"n2501","loc":[-85.633642,41.945408]},"n2502":{"id":"n2502","loc":[-85.634493,41.945475]},"n2503":{"id":"n2503","loc":[-85.634106,41.945484]},"n2504":{"id":"n2504","loc":[-85.635008,41.945505]},"n2505":{"id":"n2505","loc":[-85.633757,41.945506]},"n2506":{"id":"n2506","loc":[-85.634542,41.945519]},"n2507":{"id":"n2507","loc":[-85.634162,41.945536]},"n2508":{"id":"n2508","loc":[-85.633843,41.945547]},"n2509":{"id":"n2509","loc":[-85.634919,41.94556]},"n251":{"id":"n251","loc":[-85.636819,41.941617]},"n2510":{"id":"n2510","loc":[-85.633818,41.945561]},"n2511":{"id":"n2511","loc":[-85.634638,41.94559]},"n2512":{"id":"n2512","loc":[-85.633901,41.945598]},"n2513":{"id":"n2513","loc":[-85.634257,41.945626]},"n2514":{"id":"n2514","loc":[-85.633967,41.945652]},"n2515":{"id":"n2515","loc":[-85.634735,41.945676]},"n2516":{"id":"n2516","loc":[-85.635057,41.945683]},"n2517":{"id":"n2517","loc":[-85.635296,41.945703]},"n2518":{"id":"n2518","loc":[-85.635112,41.945703]},"n2519":{"id":"n2519","loc":[-85.634782,41.945729]},"n252":{"id":"n252","loc":[-85.636718,41.941619]},"n2520":{"id":"n2520","loc":[-85.634052,41.945747]},"n2521":{"id":"n2521","loc":[-85.635296,41.945757]},"n2522":{"id":"n2522","loc":[-85.635314,41.945757]},"n2523":{"id":"n2523","loc":[-85.635112,41.945761]},"n2524":{"id":"n2524","loc":[-85.63484,41.945778]},"n2525":{"id":"n2525","loc":[-85.635314,41.945938]},"n2526":{"id":"n2526","loc":[-85.63484,41.945922]},"n2527":{"id":"n2527","loc":[-85.635461,41.944879]},"n2528":{"id":"n2528","loc":[-85.636024,41.945384]},"n2529":{"id":"n2529","loc":[-85.636145,41.945312]},"n253":{"id":"n253","loc":[-85.636716,41.941509]},"n2530":{"id":"n2530","loc":[-85.6356,41.944797]},"n2531":{"id":"n2531","loc":[-85.635135,41.944354]},"n2532":{"id":"n2532","loc":[-85.632988,41.945369]},"n2533":{"id":"n2533","loc":[-85.633376,41.94563]},"n2534":{"id":"n2534","loc":[-85.633539,41.945534]},"n2535":{"id":"n2535","loc":[-85.633238,41.945248]},"n2536":{"id":"n2536","loc":[-85.633166,41.945216]},"n2537":{"id":"n2537","loc":[-85.633114,41.945188]},"n2538":{"id":"n2538","loc":[-85.633078,41.945127]},"n2539":{"id":"n2539","loc":[-85.633066,41.94508]},"n254":{"id":"n254","loc":[-85.636732,41.941509]},"n2540":{"id":"n2540","loc":[-85.633222,41.945358]},"n2541":{"id":"n2541","loc":[-85.633425,41.945541]},"n2542":{"id":"n2542","loc":[-85.63299,41.9455]},"n2543":{"id":"n2543","loc":[-85.634374,41.944327]},"n2544":{"id":"n2544","loc":[-85.633648,41.943697]},"n2545":{"id":"n2545","loc":[-85.633533,41.943764]},"n2546":{"id":"n2546","loc":[-85.634239,41.944417]},"n2547":{"id":"n2547","loc":[-85.634122,41.944395]},"n2548":{"id":"n2548","loc":[-85.634235,41.944326]},"n2549":{"id":"n2549","loc":[-85.633613,41.943787]},"n255":{"id":"n255","loc":[-85.636731,41.941461]},"n2550":{"id":"n2550","loc":[-85.633915,41.943613]},"n2551":{"id":"n2551","loc":[-85.634015,41.943555]},"n2552":{"id":"n2552","loc":[-85.63433,41.943839]},"n2553":{"id":"n2553","loc":[-85.634236,41.943894]},"n2554":{"id":"n2554","loc":[-85.635413,41.946052]},"n2555":{"id":"n2555","loc":[-85.635405,41.94569]},"n2556":{"id":"n2556","loc":[-85.635684,41.945925]},"n2557":{"id":"n2557","loc":[-85.635614,41.945742]},"n2558":{"id":"n2558","loc":[-85.635401,41.945745]},"n2559":{"id":"n2559","loc":[-85.635406,41.945928]},"n256":{"id":"n256","loc":[-85.636799,41.941461]},"n2560":{"id":"n2560","loc":[-85.633478,41.943663]},"n2561":{"id":"n2561","loc":[-85.633291,41.943526]},"n2562":{"id":"n2562","loc":[-85.633094,41.943541]},"n2563":{"id":"n2563","loc":[-85.633302,41.943492]},"n2564":{"id":"n2564","loc":[-85.633047,41.943623]},"n2565":{"id":"n2565","loc":[-85.633275,41.943562]},"n2566":{"id":"n2566","loc":[-85.633351,41.943518]},"n2567":{"id":"n2567","loc":[-85.633224,41.9434]},"n2568":{"id":"n2568","loc":[-85.633235,41.943369]},"n2569":{"id":"n2569","loc":[-85.635179,41.943911]},"n257":{"id":"n257","loc":[-85.6368,41.9415]},"n2570":{"id":"n2570","loc":[-85.635146,41.943918]},"n2571":{"id":"n2571","loc":[-85.634888,41.943905]},"n2572":{"id":"n2572","loc":[-85.634832,41.943911]},"n2573":{"id":"n2573","loc":[-85.634638,41.944007]},"n2574":{"id":"n2574","loc":[-85.634568,41.94405]},"n2575":{"id":"n2575","loc":[-85.635994,41.94501]},"n2576":{"id":"n2576","loc":[-85.636388,41.944608]},"n2577":{"id":"n2577","loc":[-85.636215,41.944787]},"n2578":{"id":"n2578","loc":[-85.637948,41.944587]},"n2579":{"id":"n2579","loc":[-85.637849,41.944567]},"n258":{"id":"n258","loc":[-85.636814,41.9415]},"n2580":{"id":"n2580","loc":[-85.637895,41.944455]},"n2581":{"id":"n2581","loc":[-85.637996,41.944477]},"n2582":{"id":"n2582","loc":[-85.635525,41.94337]},"n2583":{"id":"n2583","loc":[-85.637847,41.943923]},"n2584":{"id":"n2584","loc":[-85.637891,41.944124]},"n2585":{"id":"n2585","loc":[-85.638167,41.944229]},"n2586":{"id":"n2586","loc":[-85.638236,41.944097]},"n2587":{"id":"n2587","loc":[-85.638207,41.944025]},"n2588":{"id":"n2588","loc":[-85.638141,41.943997]},"n2589":{"id":"n2589","loc":[-85.638057,41.944015]},"n259":{"id":"n259","loc":[-85.636815,41.941538]},"n2590":{"id":"n2590","loc":[-85.637902,41.944231]},"n2591":{"id":"n2591","loc":[-85.638134,41.944307]},"n2592":{"id":"n2592","loc":[-85.638242,41.944294]},"n2593":{"id":"n2593","loc":[-85.638274,41.944222]},"n2594":{"id":"n2594","loc":[-85.638236,41.944174]},"n2595":{"id":"n2595","loc":[-85.638207,41.944157]},"n2596":{"id":"n2596","loc":[-85.637818,41.943984]},"n2597":{"id":"n2597","loc":[-85.634996,41.944439]},"n2598":{"id":"n2598","loc":[-85.633946,41.945804]},"n2599":{"id":"n2599","loc":[-85.634102,41.945864]},"n26":{"id":"n26","loc":[-85.634346,41.942744]},"n260":{"id":"n260","loc":[-85.636827,41.941538]},"n2600":{"id":"n2600","loc":[-85.633819,41.945756]},"n2601":{"id":"n2601","loc":[-85.634025,41.945975]},"n2602":{"id":"n2602","loc":[-85.633742,41.945867]},"n2603":{"id":"n2603","loc":[-85.63373,41.946004]},"n2604":{"id":"n2604","loc":[-85.633947,41.946081]},"n2605":{"id":"n2605","loc":[-85.633872,41.945917]},"n2606":{"id":"n2606","loc":[-85.633825,41.945985]},"n2607":{"id":"n2607","loc":[-85.633762,41.94596]},"n2608":{"id":"n2608","loc":[-85.634224,41.946037]},"n2609":{"id":"n2609","loc":[-85.634357,41.945851]},"n261":{"id":"n261","loc":[-85.636828,41.941584]},"n2610":{"id":"n2610","loc":[-85.634398,41.945813]},"n2611":{"id":"n2611","loc":[-85.634461,41.945812]},"n2612":{"id":"n2612","loc":[-85.634501,41.945852]},"n2613":{"id":"n2613","loc":[-85.634503,41.94597]},"n2614":{"id":"n2614","loc":[-85.634462,41.945971]},"n2615":{"id":"n2615","loc":[-85.634465,41.946036]},"n2616":{"id":"n2616","loc":[-85.634235,41.946072]},"n2617":{"id":"n2617","loc":[-85.634447,41.946036]},"n2618":{"id":"n2618","loc":[-85.634448,41.946052]},"n2619":{"id":"n2619","loc":[-85.634494,41.946051]},"n262":{"id":"n262","loc":[-85.636819,41.941585]},"n2620":{"id":"n2620","loc":[-85.634497,41.946144]},"n2621":{"id":"n2621","loc":[-85.634453,41.946144]},"n2622":{"id":"n2622","loc":[-85.634454,41.94616]},"n2623":{"id":"n2623","loc":[-85.634393,41.946161]},"n2624":{"id":"n2624","loc":[-85.634394,41.94618]},"n2625":{"id":"n2625","loc":[-85.634345,41.94618]},"n2626":{"id":"n2626","loc":[-85.634344,41.946162]},"n2627":{"id":"n2627","loc":[-85.63427,41.946163]},"n2628":{"id":"n2628","loc":[-85.634266,41.946071]},"n2629":{"id":"n2629","loc":[-85.634148,41.946163]},"n263":{"id":"n263","loc":[-85.636854,41.941714]},"n2630":{"id":"n2630","loc":[-85.634213,41.946072]},"n2631":{"id":"n2631","loc":[-85.633293,41.946309]},"n2632":{"id":"n2632","loc":[-85.633122,41.946239]},"n2633":{"id":"n2633","loc":[-85.633295,41.946005]},"n2634":{"id":"n2634","loc":[-85.633395,41.946047]},"n2635":{"id":"n2635","loc":[-85.633404,41.946035]},"n2636":{"id":"n2636","loc":[-85.633459,41.946057]},"n2637":{"id":"n2637","loc":[-85.633387,41.946154]},"n2638":{"id":"n2638","loc":[-85.633403,41.946161]},"n2639":{"id":"n2639","loc":[-85.634176,41.946415]},"n264":{"id":"n264","loc":[-85.636855,41.941774]},"n2640":{"id":"n2640","loc":[-85.634179,41.946339]},"n2641":{"id":"n2641","loc":[-85.634455,41.946345]},"n2642":{"id":"n2642","loc":[-85.634452,41.946422]},"n2643":{"id":"n2643","loc":[-85.63437,41.946421]},"n2644":{"id":"n2644","loc":[-85.634367,41.946497]},"n2645":{"id":"n2645","loc":[-85.634289,41.946495]},"n2646":{"id":"n2646","loc":[-85.634291,41.946448]},"n2647":{"id":"n2647","loc":[-85.634269,41.946448]},"n2648":{"id":"n2648","loc":[-85.63427,41.946417]},"n2649":{"id":"n2649","loc":[-85.63484,41.946328]},"n265":{"id":"n265","loc":[-85.636822,41.941774]},"n2650":{"id":"n2650","loc":[-85.634839,41.946187]},"n2651":{"id":"n2651","loc":[-85.635148,41.946186]},"n2652":{"id":"n2652","loc":[-85.635148,41.946216]},"n2653":{"id":"n2653","loc":[-85.63521,41.946216]},"n2654":{"id":"n2654","loc":[-85.63521,41.946348]},"n2655":{"id":"n2655","loc":[-85.635154,41.946348]},"n2656":{"id":"n2656","loc":[-85.635153,41.946327]},"n2657":{"id":"n2657","loc":[-85.634037,41.946957]},"n2658":{"id":"n2658","loc":[-85.634253,41.946953]},"n2659":{"id":"n2659","loc":[-85.63481,41.946543]},"n266":{"id":"n266","loc":[-85.636822,41.941778]},"n2660":{"id":"n2660","loc":[-85.634809,41.946459]},"n2661":{"id":"n2661","loc":[-85.635154,41.946458]},"n2662":{"id":"n2662","loc":[-85.635155,41.946554]},"n2663":{"id":"n2663","loc":[-85.635022,41.946547]},"n2664":{"id":"n2664","loc":[-85.635022,41.946573]},"n2665":{"id":"n2665","loc":[-85.634909,41.946574]},"n2666":{"id":"n2666","loc":[-85.634909,41.946561]},"n2667":{"id":"n2667","loc":[-85.634896,41.947159]},"n2668":{"id":"n2668","loc":[-85.634894,41.947032]},"n2669":{"id":"n2669","loc":[-85.635024,41.947031]},"n267":{"id":"n267","loc":[-85.636756,41.941779]},"n2670":{"id":"n2670","loc":[-85.635026,41.947158]},"n2671":{"id":"n2671","loc":[-85.635233,41.947105]},"n2672":{"id":"n2672","loc":[-85.635236,41.946991]},"n2673":{"id":"n2673","loc":[-85.635369,41.946993]},"n2674":{"id":"n2674","loc":[-85.635366,41.947107]},"n2675":{"id":"n2675","loc":[-85.634824,41.946929]},"n2676":{"id":"n2676","loc":[-85.634825,41.946818]},"n2677":{"id":"n2677","loc":[-85.63512,41.946819]},"n2678":{"id":"n2678","loc":[-85.635119,41.94693]},"n2679":{"id":"n2679","loc":[-85.634796,41.946806]},"n268":{"id":"n268","loc":[-85.636756,41.941774]},"n2680":{"id":"n2680","loc":[-85.634792,41.946604]},"n2681":{"id":"n2681","loc":[-85.634948,41.946602]},"n2682":{"id":"n2682","loc":[-85.634949,41.946645]},"n2683":{"id":"n2683","loc":[-85.634975,41.946644]},"n2684":{"id":"n2684","loc":[-85.634974,41.946599]},"n2685":{"id":"n2685","loc":[-85.635117,41.946598]},"n2686":{"id":"n2686","loc":[-85.635122,41.946801]},"n2687":{"id":"n2687","loc":[-85.634981,41.946803]},"n2688":{"id":"n2688","loc":[-85.634979,41.946752]},"n2689":{"id":"n2689","loc":[-85.634952,41.946752]},"n269":{"id":"n269","loc":[-85.636721,41.941774]},"n2690":{"id":"n2690","loc":[-85.634953,41.946804]},"n2691":{"id":"n2691","loc":[-85.634649,41.946841]},"n2692":{"id":"n2692","loc":[-85.634331,41.94684]},"n2693":{"id":"n2693","loc":[-85.634183,41.946809]},"n2694":{"id":"n2694","loc":[-85.633699,41.946607]},"n2695":{"id":"n2695","loc":[-85.634487,41.946664]},"n2696":{"id":"n2696","loc":[-85.634486,41.946598]},"n2697":{"id":"n2697","loc":[-85.63423,41.946599]},"n2698":{"id":"n2698","loc":[-85.634231,41.946662]},"n2699":{"id":"n2699","loc":[-85.634284,41.946662]},"n27":{"id":"n27","loc":[-85.634136,41.943183]},"n270":{"id":"n270","loc":[-85.63672,41.941714]},"n2700":{"id":"n2700","loc":[-85.634284,41.946679]},"n2701":{"id":"n2701","loc":[-85.634365,41.946679]},"n2702":{"id":"n2702","loc":[-85.634365,41.946664]},"n2703":{"id":"n2703","loc":[-85.635443,41.947015]},"n2704":{"id":"n2704","loc":[-85.635442,41.946801]},"n2705":{"id":"n2705","loc":[-85.63603,41.9468]},"n2706":{"id":"n2706","loc":[-85.636028,41.947016]},"n2707":{"id":"n2707","loc":[-85.635457,41.946582]},"n2708":{"id":"n2708","loc":[-85.635455,41.946211]},"n2709":{"id":"n2709","loc":[-85.635636,41.946579]},"n271":{"id":"n271","loc":[-85.636767,41.941713]},"n2710":{"id":"n2710","loc":[-85.635716,41.9468]},"n2711":{"id":"n2711","loc":[-85.635969,41.9468]},"n2712":{"id":"n2712","loc":[-85.635973,41.946295]},"n2713":{"id":"n2713","loc":[-85.636019,41.946484]},"n2714":{"id":"n2714","loc":[-85.636022,41.946388]},"n2715":{"id":"n2715","loc":[-85.635961,41.946493]},"n2716":{"id":"n2716","loc":[-85.635713,41.94621]},"n2717":{"id":"n2717","loc":[-85.635416,41.946142]},"n2718":{"id":"n2718","loc":[-85.635759,41.946203]},"n2719":{"id":"n2719","loc":[-85.636153,41.946747]},"n272":{"id":"n272","loc":[-85.636767,41.941706]},"n2720":{"id":"n2720","loc":[-85.635417,41.946915]},"n2721":{"id":"n2721","loc":[-85.636154,41.946915]},"n2722":{"id":"n2722","loc":[-85.635866,41.946473]},"n2723":{"id":"n2723","loc":[-85.635717,41.946633]},"n2724":{"id":"n2724","loc":[-85.635556,41.946166]},"n2725":{"id":"n2725","loc":[-85.63556,41.946556]},"n2726":{"id":"n2726","loc":[-85.635731,41.946594]},"n2727":{"id":"n2727","loc":[-85.635866,41.946595]},"n2728":{"id":"n2728","loc":[-85.635456,41.947028]},"n2729":{"id":"n2729","loc":[-85.635796,41.947023]},"n273":{"id":"n273","loc":[-85.636779,41.941698]},"n2730":{"id":"n2730","loc":[-85.635798,41.947091]},"n2731":{"id":"n2731","loc":[-85.63573,41.947092]},"n2732":{"id":"n2732","loc":[-85.635733,41.947233]},"n2733":{"id":"n2733","loc":[-85.636283,41.946863]},"n2734":{"id":"n2734","loc":[-85.63628,41.946706]},"n2735":{"id":"n2735","loc":[-85.636341,41.946705]},"n2736":{"id":"n2736","loc":[-85.636273,41.946584]},"n2737":{"id":"n2737","loc":[-85.636396,41.946545]},"n2738":{"id":"n2738","loc":[-85.636474,41.946684]},"n2739":{"id":"n2739","loc":[-85.636511,41.946861]},"n274":{"id":"n274","loc":[-85.636798,41.941697]},"n2740":{"id":"n2740","loc":[-85.633713,41.947184]},"n2741":{"id":"n2741","loc":[-85.633651,41.94716]},"n2742":{"id":"n2742","loc":[-85.633704,41.947085]},"n2743":{"id":"n2743","loc":[-85.6336,41.947044]},"n2744":{"id":"n2744","loc":[-85.633506,41.947177]},"n2745":{"id":"n2745","loc":[-85.629586,41.952469]},"n2746":{"id":"n2746","loc":[-85.634723,41.953681]},"n2747":{"id":"n2747","loc":[-85.63478,41.959007]},"n2748":{"id":"n2748","loc":[-85.632793,41.94405],"tags":{"highway":"traffic_signals","traffic_signals":"signal","traffic_signals:direction":"both"}},"n2749":{"id":"n2749","loc":[-85.634648,41.947325]},"n275":{"id":"n275","loc":[-85.63681,41.941705]},"n2750":{"id":"n2750","loc":[-85.625078,41.952097]},"n2751":{"id":"n2751","loc":[-85.633195,41.94734]},"n2752":{"id":"n2752","loc":[-85.626447,41.957168]},"n2753":{"id":"n2753","loc":[-85.632023,41.949012]},"n2754":{"id":"n2754","loc":[-85.630835,41.950656]},"n2755":{"id":"n2755","loc":[-85.634655,41.948612]},"n2756":{"id":"n2756","loc":[-85.636182,41.948605]},"n2757":{"id":"n2757","loc":[-85.634729,41.954667]},"n2758":{"id":"n2758","loc":[-85.634686,41.951159]},"n2759":{"id":"n2759","loc":[-85.636206,41.951146]},"n276":{"id":"n276","loc":[-85.63681,41.941714]},"n2760":{"id":"n2760","loc":[-85.634668,41.949891]},"n2761":{"id":"n2761","loc":[-85.634701,41.952422]},"n2762":{"id":"n2762","loc":[-85.634747,41.955907]},"n2763":{"id":"n2763","loc":[-85.627975,41.954695]},"n2764":{"id":"n2764","loc":[-85.626832,41.954698]},"n2765":{"id":"n2765","loc":[-85.632278,41.948624]},"n2766":{"id":"n2766","loc":[-85.628639,41.953725]},"n2767":{"id":"n2767","loc":[-85.636233,41.95241]},"n2768":{"id":"n2768","loc":[-85.631385,41.949913]},"n2769":{"id":"n2769","loc":[-85.630486,41.951194]},"n277":{"id":"n277","loc":[-85.636861,41.942041]},"n2770":{"id":"n2770","loc":[-85.624937,41.952088]},"n2771":{"id":"n2771","loc":[-85.624945,41.952022]},"n2772":{"id":"n2772","loc":[-85.636162,41.94731]},"n2773":{"id":"n2773","loc":[-85.636188,41.949881]},"n2774":{"id":"n2774","loc":[-85.631422,41.948294]},"n2775":{"id":"n2775","loc":[-85.632844,41.945547]},"n2776":{"id":"n2776","loc":[-85.632484,41.945344]},"n2777":{"id":"n2777","loc":[-85.631775,41.944636]},"n2778":{"id":"n2778","loc":[-85.632656,41.945471]},"n2779":{"id":"n2779","loc":[-85.631959,41.944827]},"n278":{"id":"n278","loc":[-85.636862,41.942099]},"n2780":{"id":"n2780","loc":[-85.631679,41.94438]},"n2781":{"id":"n2781","loc":[-85.625129,41.959272]},"n2782":{"id":"n2782","loc":[-85.632446,41.944861]},"n2783":{"id":"n2783","loc":[-85.632804,41.945477]},"n2784":{"id":"n2784","loc":[-85.632255,41.944962]},"n2785":{"id":"n2785","loc":[-85.632736,41.944757]},"n2786":{"id":"n2786","loc":[-85.632543,41.94486]},"n2787":{"id":"n2787","loc":[-85.632889,41.945561]},"n2788":{"id":"n2788","loc":[-85.632091,41.944949]},"n2789":{"id":"n2789","loc":[-85.632537,41.944713]},"n279":{"id":"n279","loc":[-85.636807,41.942099]},"n2790":{"id":"n2790","loc":[-85.632279,41.94485]},"n2791":{"id":"n2791","loc":[-85.632749,41.943247]},"n2792":{"id":"n2792","loc":[-85.632824,41.943152]},"n2793":{"id":"n2793","loc":[-85.632929,41.94317]},"n2794":{"id":"n2794","loc":[-85.632897,41.943078]},"n2795":{"id":"n2795","loc":[-85.632626,41.943231]},"n2796":{"id":"n2796","loc":[-85.634048,41.947257]},"n2797":{"id":"n2797","loc":[-85.634264,41.947252]},"n2798":{"id":"n2798","loc":[-85.635418,41.947317]},"n2799":{"id":"n2799","loc":[-85.635461,41.947237]},"n28":{"id":"n28","loc":[-85.63821,41.944308]},"n280":{"id":"n280","loc":[-85.636807,41.942126]},"n2800":{"id":"n2800","loc":[-85.632868,41.946229]},"n2801":{"id":"n2801","loc":[-85.633673,41.947242]},"n2802":{"id":"n2802","loc":[-85.623604,41.945881],"tags":{"amenity":"school","name":"Barrows School"}},"n2803":{"id":"n2803","loc":[-85.627401,41.943496]},"n2804":{"id":"n2804","loc":[-85.627403,41.943625]},"n2805":{"id":"n2805","loc":[-85.626409,41.943215]},"n2806":{"id":"n2806","loc":[-85.624884,41.943508]},"n2807":{"id":"n2807","loc":[-85.625191,41.943509]},"n2808":{"id":"n2808","loc":[-85.624882,41.94382]},"n2809":{"id":"n2809","loc":[-85.624893,41.945618]},"n281":{"id":"n281","loc":[-85.636726,41.942126]},"n2810":{"id":"n2810","loc":[-85.624912,41.946524]},"n2811":{"id":"n2811","loc":[-85.622721,41.946535]},"n2812":{"id":"n2812","loc":[-85.627399,41.94469]},"n2813":{"id":"n2813","loc":[-85.622716,41.945622]},"n2814":{"id":"n2814","loc":[-85.624886,41.944724]},"n2815":{"id":"n2815","loc":[-85.622674,41.944737]},"n2816":{"id":"n2816","loc":[-85.625092,41.945063]},"n2817":{"id":"n2817","loc":[-85.625233,41.945064]},"n2818":{"id":"n2818","loc":[-85.625229,41.944871]},"n2819":{"id":"n2819","loc":[-85.625066,41.944871]},"n282":{"id":"n282","loc":[-85.636726,41.942098]},"n2820":{"id":"n2820","loc":[-85.625024,41.944901]},"n2821":{"id":"n2821","loc":[-85.625025,41.944924]},"n2822":{"id":"n2822","loc":[-85.625087,41.944926]},"n2823":{"id":"n2823","loc":[-85.625349,41.944506]},"n2824":{"id":"n2824","loc":[-85.625347,41.944388]},"n2825":{"id":"n2825","loc":[-85.625152,41.94439]},"n2826":{"id":"n2826","loc":[-85.625152,41.944431]},"n2827":{"id":"n2827","loc":[-85.625134,41.944431]},"n2828":{"id":"n2828","loc":[-85.625136,41.944508]},"n2829":{"id":"n2829","loc":[-85.623236,41.946341]},"n283":{"id":"n283","loc":[-85.636708,41.942098]},"n2830":{"id":"n2830","loc":[-85.623241,41.946067]},"n2831":{"id":"n2831","loc":[-85.623207,41.946067]},"n2832":{"id":"n2832","loc":[-85.623212,41.945827]},"n2833":{"id":"n2833","loc":[-85.622981,41.945825]},"n2834":{"id":"n2834","loc":[-85.622976,41.946063]},"n2835":{"id":"n2835","loc":[-85.623006,41.946063]},"n2836":{"id":"n2836","loc":[-85.623002,41.946256]},"n2837":{"id":"n2837","loc":[-85.623075,41.946256]},"n2838":{"id":"n2838","loc":[-85.623074,41.946339]},"n2839":{"id":"n2839","loc":[-85.624574,41.951755]},"n284":{"id":"n284","loc":[-85.636708,41.942041]},"n2840":{"id":"n2840","loc":[-85.62498,41.951844]},"n2841":{"id":"n2841","loc":[-85.625086,41.95188]},"n2842":{"id":"n2842","loc":[-85.625135,41.951922]},"n2843":{"id":"n2843","loc":[-85.615273,41.945637]},"n2844":{"id":"n2844","loc":[-85.620172,41.945627]},"n2845":{"id":"n2845","loc":[-85.625167,41.951985]},"n2846":{"id":"n2846","loc":[-85.622741,41.947437]},"n2847":{"id":"n2847","loc":[-85.624907,41.947428]},"n2848":{"id":"n2848","loc":[-85.627046,41.940995]},"n2849":{"id":"n2849","loc":[-85.627295,41.941304]},"n285":{"id":"n285","loc":[-85.635618,41.941852]},"n2850":{"id":"n2850","loc":[-85.627352,41.94148]},"n2851":{"id":"n2851","loc":[-85.62737,41.942261]},"n2852":{"id":"n2852","loc":[-85.6264,41.942263]},"n2853":{"id":"n2853","loc":[-85.622769,41.949228]},"n2854":{"id":"n2854","loc":[-85.624937,41.949218]},"n2855":{"id":"n2855","loc":[-85.630001,41.944664]},"n2856":{"id":"n2856","loc":[-85.624873,41.942022]},"n2857":{"id":"n2857","loc":[-85.622761,41.948333]},"n2858":{"id":"n2858","loc":[-85.624924,41.948334]},"n2859":{"id":"n2859","loc":[-85.620051,41.94383]},"n286":{"id":"n286","loc":[-85.635621,41.94202]},"n2860":{"id":"n2860","loc":[-85.627629,41.946498]},"n2861":{"id":"n2861","loc":[-85.622757,41.950111]},"n2862":{"id":"n2862","loc":[-85.623685,41.954624]},"n2863":{"id":"n2863","loc":[-85.621459,41.944756]},"n2864":{"id":"n2864","loc":[-85.628637,41.944676]},"n2865":{"id":"n2865","loc":[-85.630125,41.944654]},"n2866":{"id":"n2866","loc":[-85.625196,41.952097]},"n2867":{"id":"n2867","loc":[-85.630257,41.944637]},"n2868":{"id":"n2868","loc":[-85.631247,41.944459]},"n2869":{"id":"n2869","loc":[-85.624867,41.94159]},"n287":{"id":"n287","loc":[-85.63524,41.942023]},"n2870":{"id":"n2870","loc":[-85.624958,41.950343]},"n2871":{"id":"n2871","loc":[-85.624948,41.950484]},"n2872":{"id":"n2872","loc":[-85.624813,41.950983]},"n2873":{"id":"n2873","loc":[-85.624723,41.951789]},"n2874":{"id":"n2874","loc":[-85.624262,41.9512]},"n2875":{"id":"n2875","loc":[-85.62414,41.951201]},"n2876":{"id":"n2876","loc":[-85.624139,41.95112]},"n2877":{"id":"n2877","loc":[-85.628481,41.945611]},"n2878":{"id":"n2878","loc":[-85.620072,41.946538]},"n2879":{"id":"n2879","loc":[-85.622763,41.95099]},"n288":{"id":"n288","loc":[-85.635237,41.941855]},"n2880":{"id":"n2880","loc":[-85.62814,41.946963]},"n2881":{"id":"n2881","loc":[-85.628245,41.947031]},"n2882":{"id":"n2882","loc":[-85.628331,41.947066]},"n2883":{"id":"n2883","loc":[-85.629722,41.944444],"tags":{"leisure":"park","name":"Scouter Park"}},"n2884":{"id":"n2884","loc":[-85.629977,41.943907]},"n2885":{"id":"n2885","loc":[-85.629947,41.943775]},"n2886":{"id":"n2886","loc":[-85.629899,41.943625]},"n2887":{"id":"n2887","loc":[-85.632286,41.944257]},"n2888":{"id":"n2888","loc":[-85.632523,41.944179]},"n2889":{"id":"n2889","loc":[-85.632141,41.944293]},"n289":{"id":"n289","loc":[-85.635568,41.940475]},"n2890":{"id":"n2890","loc":[-85.631571,41.9444]},"n2891":{"id":"n2891","loc":[-85.643236,41.941895]},"n2892":{"id":"n2892","loc":[-85.62865,41.945353]},"n2893":{"id":"n2893","loc":[-85.628594,41.945481]},"n2894":{"id":"n2894","loc":[-85.628581,41.947169]},"n2895":{"id":"n2895","loc":[-85.631843,41.943793]},"n2896":{"id":"n2896","loc":[-85.632299,41.943472]},"n2897":{"id":"n2897","loc":[-85.631519,41.944881]},"n2898":{"id":"n2898","loc":[-85.628429,41.947219]},"n2899":{"id":"n2899","loc":[-85.63145,41.945162]},"n29":{"id":"n29","loc":[-85.637963,41.944263]},"n290":{"id":"n290","loc":[-85.634584,41.940477]},"n2900":{"id":"n2900","loc":[-85.630939,41.945519]},"n2901":{"id":"n2901","loc":[-85.62903,41.945719]},"n2902":{"id":"n2902","loc":[-85.630521,41.945559]},"n2903":{"id":"n2903","loc":[-85.629294,41.945585]},"n2904":{"id":"n2904","loc":[-85.629845,41.945543]},"n2905":{"id":"n2905","loc":[-85.631497,41.944625]},"n2906":{"id":"n2906","loc":[-85.630281,41.945553]},"n2907":{"id":"n2907","loc":[-85.628553,41.946973]},"n2908":{"id":"n2908","loc":[-85.631383,41.945338]},"n2909":{"id":"n2909","loc":[-85.628843,41.946103]},"n291":{"id":"n291","loc":[-85.634583,41.940203]},"n2910":{"id":"n2910","loc":[-85.631193,41.945473]},"n2911":{"id":"n2911","loc":[-85.628897,41.945944]},"n2912":{"id":"n2912","loc":[-85.628789,41.946454]},"n2913":{"id":"n2913","loc":[-85.632548,41.944563]},"n2914":{"id":"n2914","loc":[-85.627527,41.944555]},"n2915":{"id":"n2915","loc":[-85.62752,41.943726]},"n2916":{"id":"n2916","loc":[-85.627894,41.943723]},"n2917":{"id":"n2917","loc":[-85.627897,41.943919]},"n2918":{"id":"n2918","loc":[-85.627991,41.943934]},"n2919":{"id":"n2919","loc":[-85.628082,41.943966]},"n292":{"id":"n292","loc":[-85.635567,41.940201]},"n2920":{"id":"n2920","loc":[-85.628177,41.944015]},"n2921":{"id":"n2921","loc":[-85.628193,41.944048]},"n2922":{"id":"n2922","loc":[-85.628167,41.944054]},"n2923":{"id":"n2923","loc":[-85.628193,41.944094]},"n2924":{"id":"n2924","loc":[-85.628213,41.944144]},"n2925":{"id":"n2925","loc":[-85.628214,41.944199]},"n2926":{"id":"n2926","loc":[-85.62833,41.944196]},"n2927":{"id":"n2927","loc":[-85.628328,41.944262]},"n2928":{"id":"n2928","loc":[-85.628173,41.944262]},"n2929":{"id":"n2929","loc":[-85.628171,41.944293]},"n293":{"id":"n293","loc":[-85.635816,41.942673],"tags":{"crossing":"zebra","highway":"crossing"}},"n2930":{"id":"n2930","loc":[-85.628039,41.944296]},"n2931":{"id":"n2931","loc":[-85.62804,41.944329]},"n2932":{"id":"n2932","loc":[-85.627829,41.944335]},"n2933":{"id":"n2933","loc":[-85.627835,41.94455]},"n2936":{"id":"n2936","loc":[-85.632823,41.945994]},"n294":{"id":"n294","loc":[-85.635696,41.942712]},"n2940":{"id":"n2940","loc":[-85.632192,41.945973]},"n2941":{"id":"n2941","loc":[-85.63226,41.94587]},"n2942":{"id":"n2942","loc":[-85.632721,41.946036]},"n2943":{"id":"n2943","loc":[-85.632641,41.946142]},"n2944":{"id":"n2944","loc":[-85.62937,41.947467]},"n2945":{"id":"n2945","loc":[-85.62959,41.942936]},"n2946":{"id":"n2946","loc":[-85.629551,41.94284]},"n2947":{"id":"n2947","loc":[-85.629501,41.942704]},"n2948":{"id":"n2948","loc":[-85.629472,41.942578]},"n2949":{"id":"n2949","loc":[-85.629361,41.941801]},"n295":{"id":"n295","loc":[-85.635679,41.941962]},"n2950":{"id":"n2950","loc":[-85.629339,41.941716]},"n2951":{"id":"n2951","loc":[-85.629315,41.94166]},"n2952":{"id":"n2952","loc":[-85.629279,41.941602]},"n2953":{"id":"n2953","loc":[-85.629227,41.941556]},"n2954":{"id":"n2954","loc":[-85.624261,41.95112]},"n2955":{"id":"n2955","loc":[-85.629153,41.941524]},"n2956":{"id":"n2956","loc":[-85.626904,41.941098]},"n2957":{"id":"n2957","loc":[-85.624588,41.951294]},"n2958":{"id":"n2958","loc":[-85.631844,41.942945]},"n2959":{"id":"n2959","loc":[-85.625854,41.949222]},"n296":{"id":"n296","loc":[-85.635672,41.941337]},"n2960":{"id":"n2960","loc":[-85.625146,41.955238]},"n2961":{"id":"n2961","loc":[-85.626745,41.948296]},"n2962":{"id":"n2962","loc":[-85.625721,41.95524]},"n2963":{"id":"n2963","loc":[-85.624706,41.952317]},"n2964":{"id":"n2964","loc":[-85.62609,41.956147]},"n2965":{"id":"n2965","loc":[-85.624401,41.954928]},"n2966":{"id":"n2966","loc":[-85.626558,41.955367]},"n2967":{"id":"n2967","loc":[-85.62468,41.955096]},"n2968":{"id":"n2968","loc":[-85.624159,41.953929]},"n2969":{"id":"n2969","loc":[-85.62506,41.951113]},"n297":{"id":"n297","loc":[-85.635658,41.941284]},"n2970":{"id":"n2970","loc":[-85.624942,41.951591]},"n2971":{"id":"n2971","loc":[-85.627399,41.947546]},"n2972":{"id":"n2972","loc":[-85.627695,41.947404]},"n2973":{"id":"n2973","loc":[-85.625925,41.94896]},"n2974":{"id":"n2974","loc":[-85.625725,41.950211]},"n2975":{"id":"n2975","loc":[-85.627008,41.947963]},"n2976":{"id":"n2976","loc":[-85.624373,41.953458]},"n2977":{"id":"n2977","loc":[-85.624137,41.954392]},"n2978":{"id":"n2978","loc":[-85.628257,41.947307]},"n2979":{"id":"n2979","loc":[-85.625281,41.95066]},"n298":{"id":"n298","loc":[-85.635602,41.941166]},"n2980":{"id":"n2980","loc":[-85.625865,41.949804]},"n2981":{"id":"n2981","loc":[-85.626508,41.955932]},"n2982":{"id":"n2982","loc":[-85.626333,41.955216]},"n2983":{"id":"n2983","loc":[-85.626637,41.955676]},"n2984":{"id":"n2984","loc":[-85.624223,41.954599]},"n2985":{"id":"n2985","loc":[-85.626219,41.948671]},"n2986":{"id":"n2986","loc":[-85.624556,41.953043]},"n2987":{"id":"n2987","loc":[-85.625598,41.956302]},"n2988":{"id":"n2988","loc":[-85.624571,41.952971]},"n2989":{"id":"n2989","loc":[-85.627141,41.940727]},"n299":{"id":"n299","loc":[-85.635598,41.941138]},"n2990":{"id":"n2990","loc":[-85.627102,41.939144]},"n2991":{"id":"n2991","loc":[-85.627127,41.940086]},"n2992":{"id":"n2992","loc":[-85.627116,41.940843]},"n2993":{"id":"n2993","loc":[-85.627132,41.9402]},"n2994":{"id":"n2994","loc":[-85.629734,41.940078]},"n2995":{"id":"n2995","loc":[-85.6276,41.937412]},"n2996":{"id":"n2996","loc":[-85.627451,41.937549]},"n2997":{"id":"n2997","loc":[-85.627375,41.937618]},"n2998":{"id":"n2998","loc":[-85.627278,41.937728]},"n2999":{"id":"n2999","loc":[-85.627199,41.937842]},"n3":{"id":"n3","loc":[-85.627345,41.953983]},"n30":{"id":"n30","loc":[-85.637882,41.944205]},"n300":{"id":"n300","loc":[-85.635614,41.941076]},"n3000":{"id":"n3000","loc":[-85.627141,41.937981]},"n3001":{"id":"n3001","loc":[-85.627109,41.938153]},"n3002":{"id":"n3002","loc":[-85.627101,41.938699]},"n3003":{"id":"n3003","loc":[-85.628311,41.942261]},"n3004":{"id":"n3004","loc":[-85.628439,41.940082]},"n3005":{"id":"n3005","loc":[-85.619538,41.942622],"tags":{"leisure":"slipway"}},"n3006":{"id":"n3006","loc":[-85.619872,41.942618]},"n3007":{"id":"n3007","loc":[-85.619755,41.942612]},"n3008":{"id":"n3008","loc":[-85.619647,41.942628]},"n3009":{"id":"n3009","loc":[-85.619415,41.942626]},"n301":{"id":"n301","loc":[-85.635659,41.940956]},"n3010":{"id":"n3010","loc":[-85.619212,41.942623]},"n3011":{"id":"n3011","loc":[-85.631485,41.942472]},"n3012":{"id":"n3012","loc":[-85.630986,41.941786]},"n3013":{"id":"n3013","loc":[-85.631797,41.942006]},"n3014":{"id":"n3014","loc":[-85.630972,41.941162]},"n3015":{"id":"n3015","loc":[-85.631396,41.941611],"tags":{"railway":"level_crossing"}},"n3016":{"id":"n3016","loc":[-85.631878,41.941545]},"n3017":{"id":"n3017","loc":[-85.630461,41.94055]},"n3018":{"id":"n3018","loc":[-85.629751,41.939539],"tags":{"railway":"level_crossing"}},"n3019":{"id":"n3019","loc":[-85.631663,41.941513]},"n302":{"id":"n302","loc":[-85.635666,41.940922]},"n3020":{"id":"n3020","loc":[-85.631328,41.941375]},"n3021":{"id":"n3021","loc":[-85.632554,41.941779]},"n3022":{"id":"n3022","loc":[-85.63245,41.941769]},"n3023":{"id":"n3023","loc":[-85.632475,41.941644]},"n3024":{"id":"n3024","loc":[-85.632581,41.941654]},"n3025":{"id":"n3025","loc":[-85.631957,41.941352]},"n3026":{"id":"n3026","loc":[-85.632293,41.941139]},"n3027":{"id":"n3027","loc":[-85.632315,41.941153]},"n3028":{"id":"n3028","loc":[-85.632302,41.941262]},"n3029":{"id":"n3029","loc":[-85.63237,41.941267]},"n303":{"id":"n303","loc":[-85.635667,41.940877]},"n3030":{"id":"n3030","loc":[-85.632356,41.941538]},"n3031":{"id":"n3031","loc":[-85.632134,41.941678]},"n3032":{"id":"n3032","loc":[-85.631942,41.941687]},"n3033":{"id":"n3033","loc":[-85.63203,41.941694]},"n3034":{"id":"n3034","loc":[-85.632166,41.941555]},"n3035":{"id":"n3035","loc":[-85.632412,41.941416]},"n3036":{"id":"n3036","loc":[-85.63248,41.941342]},"n3037":{"id":"n3037","loc":[-85.632502,41.941259]},"n3038":{"id":"n3038","loc":[-85.632453,41.941161]},"n3039":{"id":"n3039","loc":[-85.63235,41.941103]},"n304":{"id":"n304","loc":[-85.635668,41.940655]},"n3040":{"id":"n3040","loc":[-85.632236,41.941118]},"n3041":{"id":"n3041","loc":[-85.631894,41.941355]},"n3042":{"id":"n3042","loc":[-85.631859,41.941411]},"n3043":{"id":"n3043","loc":[-85.632011,41.941587]},"n3044":{"id":"n3044","loc":[-85.632446,41.941379]},"n3045":{"id":"n3045","loc":[-85.632511,41.941416]},"n3046":{"id":"n3046","loc":[-85.632545,41.941634]},"n3047":{"id":"n3047","loc":[-85.632612,41.94164]},"n3048":{"id":"n3048","loc":[-85.632595,41.942197]},"n3049":{"id":"n3049","loc":[-85.632565,41.942241]},"n305":{"id":"n305","loc":[-85.635628,41.940617]},"n3050":{"id":"n3050","loc":[-85.632515,41.942256]},"n3051":{"id":"n3051","loc":[-85.63245,41.94223]},"n3052":{"id":"n3052","loc":[-85.632401,41.942174]},"n3053":{"id":"n3053","loc":[-85.632391,41.942115]},"n3054":{"id":"n3054","loc":[-85.632029,41.941859]},"n3055":{"id":"n3055","loc":[-85.631828,41.941639]},"n3056":{"id":"n3056","loc":[-85.631829,41.941508]},"n3057":{"id":"n3057","loc":[-85.631281,41.94312]},"n3058":{"id":"n3058","loc":[-85.631421,41.943065]},"n3059":{"id":"n3059","loc":[-85.631339,41.942949]},"n306":{"id":"n306","loc":[-85.635623,41.940272]},"n3060":{"id":"n3060","loc":[-85.631199,41.943004]},"n3061":{"id":"n3061","loc":[-85.631102,41.942931]},"n3062":{"id":"n3062","loc":[-85.631009,41.942809]},"n3063":{"id":"n3063","loc":[-85.631383,41.94265]},"n3064":{"id":"n3064","loc":[-85.631477,41.942773]},"n3065":{"id":"n3065","loc":[-85.630638,41.942809]},"n3066":{"id":"n3066","loc":[-85.630738,41.942943]},"n3067":{"id":"n3067","loc":[-85.630841,41.9429]},"n3068":{"id":"n3068","loc":[-85.630741,41.942766]},"n3069":{"id":"n3069","loc":[-85.63054,41.942603]},"n307":{"id":"n307","loc":[-85.635651,41.940183]},"n3070":{"id":"n3070","loc":[-85.630498,41.942619]},"n3071":{"id":"n3071","loc":[-85.630567,41.942718]},"n3072":{"id":"n3072","loc":[-85.630616,41.942698]},"n3073":{"id":"n3073","loc":[-85.630642,41.94273]},"n3074":{"id":"n3074","loc":[-85.630686,41.942714]},"n3075":{"id":"n3075","loc":[-85.630715,41.942754]},"n3076":{"id":"n3076","loc":[-85.6309,41.942681]},"n3077":{"id":"n3077","loc":[-85.630843,41.942605]},"n3078":{"id":"n3078","loc":[-85.6309,41.942581]},"n3079":{"id":"n3079","loc":[-85.630832,41.942487]},"n308":{"id":"n308","loc":[-85.63577,41.940183],"tags":{"crossing":"zebra","highway":"crossing"}},"n3080":{"id":"n3080","loc":[-85.630773,41.942509]},"n3081":{"id":"n3081","loc":[-85.630718,41.942436]},"n3082":{"id":"n3082","loc":[-85.630485,41.942524]},"n3083":{"id":"n3083","loc":[-85.631468,41.941233]},"n3084":{"id":"n3084","loc":[-85.631334,41.94114]},"n3085":{"id":"n3085","loc":[-85.632052,41.940568]},"n3086":{"id":"n3086","loc":[-85.63219,41.940663]},"n3087":{"id":"n3087","loc":[-85.631323,41.940834]},"n3088":{"id":"n3088","loc":[-85.631122,41.941002]},"n3089":{"id":"n3089","loc":[-85.631321,41.941133]},"n309":{"id":"n309","loc":[-85.636939,41.942544]},"n3090":{"id":"n3090","loc":[-85.631521,41.940966]},"n3091":{"id":"n3091","loc":[-85.631103,41.940253]},"n3092":{"id":"n3092","loc":[-85.631226,41.940211]},"n3093":{"id":"n3093","loc":[-85.631597,41.940805]},"n3094":{"id":"n3094","loc":[-85.631474,41.940847]},"n3095":{"id":"n3095","loc":[-85.631811,41.940534]},"n3096":{"id":"n3096","loc":[-85.631588,41.94061]},"n3097":{"id":"n3097","loc":[-85.631438,41.940366]},"n3098":{"id":"n3098","loc":[-85.631661,41.94029]},"n3099":{"id":"n3099","loc":[-85.630621,41.940041]},"n31":{"id":"n31","loc":[-85.63827,41.944203]},"n310":{"id":"n310","loc":[-85.636323,41.942552]},"n3100":{"id":"n3100","loc":[-85.630436,41.939773]},"n3101":{"id":"n3101","loc":[-85.63059,41.939714]},"n3102":{"id":"n3102","loc":[-85.630775,41.939983]},"n3103":{"id":"n3103","loc":[-85.63047,41.940167]},"n3104":{"id":"n3104","loc":[-85.63013,41.939686]},"n3105":{"id":"n3105","loc":[-85.630302,41.939618]},"n3106":{"id":"n3106","loc":[-85.630641,41.9401]},"n3107":{"id":"n3107","loc":[-85.630966,41.940619]},"n3108":{"id":"n3108","loc":[-85.630874,41.940493]},"n3109":{"id":"n3109","loc":[-85.630933,41.940469]},"n311":{"id":"n311","loc":[-85.636257,41.942555]},"n3110":{"id":"n3110","loc":[-85.630763,41.940236]},"n3111":{"id":"n3111","loc":[-85.63088,41.940189]},"n3112":{"id":"n3112","loc":[-85.631142,41.940548]},"n3113":{"id":"n3113","loc":[-85.630958,41.940871]},"n3114":{"id":"n3114","loc":[-85.630874,41.940778]},"n3115":{"id":"n3115","loc":[-85.631062,41.940684]},"n3116":{"id":"n3116","loc":[-85.631146,41.940777]},"n3117":{"id":"n3117","loc":[-85.632031,41.940575]},"n3118":{"id":"n3118","loc":[-85.631777,41.940186]},"n3119":{"id":"n3119","loc":[-85.631346,41.940179]},"n312":{"id":"n312","loc":[-85.636208,41.942561]},"n3120":{"id":"n3120","loc":[-85.631342,41.94012]},"n3121":{"id":"n3121","loc":[-85.631831,41.940118]},"n3122":{"id":"n3122","loc":[-85.632115,41.940543]},"n3123":{"id":"n3123","loc":[-85.631031,41.941683]},"n3124":{"id":"n3124","loc":[-85.630981,41.941608]},"n3125":{"id":"n3125","loc":[-85.631209,41.941516]},"n3126":{"id":"n3126","loc":[-85.631264,41.941586]},"n3127":{"id":"n3127","loc":[-85.630938,41.94155]},"n3128":{"id":"n3128","loc":[-85.631156,41.941462]},"n3129":{"id":"n3129","loc":[-85.631197,41.94152]},"n313":{"id":"n313","loc":[-85.636159,41.942573]},"n3130":{"id":"n3130","loc":[-85.630895,41.941485]},"n3131":{"id":"n3131","loc":[-85.630824,41.941389]},"n3132":{"id":"n3132","loc":[-85.630986,41.941323]},"n3133":{"id":"n3133","loc":[-85.631057,41.941419]},"n3134":{"id":"n3134","loc":[-85.630777,41.941328]},"n3135":{"id":"n3135","loc":[-85.630907,41.941274]},"n3136":{"id":"n3136","loc":[-85.630953,41.941335]},"n3137":{"id":"n3137","loc":[-85.630797,41.941247]},"n3138":{"id":"n3138","loc":[-85.630701,41.94117]},"n3139":{"id":"n3139","loc":[-85.630829,41.941113]},"n314":{"id":"n314","loc":[-85.635743,41.942881]},"n3140":{"id":"n3140","loc":[-85.6309,41.941201]},"n3141":{"id":"n3141","loc":[-85.630765,41.941206]},"n3142":{"id":"n3142","loc":[-85.630739,41.941218]},"n3143":{"id":"n3143","loc":[-85.630582,41.941039]},"n3144":{"id":"n3144","loc":[-85.630412,41.940818]},"n3145":{"id":"n3145","loc":[-85.630509,41.940777]},"n3146":{"id":"n3146","loc":[-85.630678,41.941004]},"n3147":{"id":"n3147","loc":[-85.630773,41.942166]},"n3148":{"id":"n3148","loc":[-85.630708,41.942074]},"n3149":{"id":"n3149","loc":[-85.630863,41.942013]},"n315":{"id":"n315","loc":[-85.635452,41.942966]},"n3150":{"id":"n3150","loc":[-85.630928,41.942105]},"n3151":{"id":"n3151","loc":[-85.630701,41.942026]},"n3152":{"id":"n3152","loc":[-85.630665,41.941971]},"n3153":{"id":"n3153","loc":[-85.630793,41.941918]},"n3154":{"id":"n3154","loc":[-85.630837,41.94197]},"n3155":{"id":"n3155","loc":[-85.630757,41.941871]},"n3156":{"id":"n3156","loc":[-85.630629,41.941923]},"n3157":{"id":"n3157","loc":[-85.630694,41.941783]},"n3158":{"id":"n3158","loc":[-85.630534,41.941847]},"n3159":{"id":"n3159","loc":[-85.630598,41.941935]},"n316":{"id":"n316","loc":[-85.634911,41.943118]},"n3160":{"id":"n3160","loc":[-85.631548,41.93938]},"n3161":{"id":"n3161","loc":[-85.631525,41.939919]},"n3162":{"id":"n3162","loc":[-85.631648,41.940043]},"n3163":{"id":"n3163","loc":[-85.624586,41.951121]},"n3164":{"id":"n3164","loc":[-85.622139,41.952064]},"n3165":{"id":"n3165","loc":[-85.622141,41.952144]},"n3166":{"id":"n3166","loc":[-85.621977,41.952146]},"n3167":{"id":"n3167","loc":[-85.621978,41.952211]},"n3168":{"id":"n3168","loc":[-85.62191,41.952212]},"n3169":{"id":"n3169","loc":[-85.633628,41.935437]},"n317":{"id":"n317","loc":[-85.634743,41.943167]},"n3170":{"id":"n3170","loc":[-85.632849,41.935518]},"n3171":{"id":"n3171","loc":[-85.632376,41.93574]},"n3172":{"id":"n3172","loc":[-85.631517,41.935897]},"n3173":{"id":"n3173","loc":[-85.630433,41.936124]},"n3174":{"id":"n3174","loc":[-85.630207,41.936427]},"n3175":{"id":"n3175","loc":[-85.630346,41.936795]},"n3176":{"id":"n3176","loc":[-85.62996,41.936974]},"n3177":{"id":"n3177","loc":[-85.629916,41.937488]},"n3178":{"id":"n3178","loc":[-85.629946,41.937802]},"n3179":{"id":"n3179","loc":[-85.629977,41.937905]},"n318":{"id":"n318","loc":[-85.634401,41.94328]},"n3180":{"id":"n3180","loc":[-85.63016,41.937909]},"n3181":{"id":"n3181","loc":[-85.630804,41.937791]},"n3182":{"id":"n3182","loc":[-85.631688,41.937808]},"n3183":{"id":"n3183","loc":[-85.631685,41.938008]},"n3184":{"id":"n3184","loc":[-85.631845,41.938116]},"n3185":{"id":"n3185","loc":[-85.63207,41.938181]},"n3186":{"id":"n3186","loc":[-85.632143,41.938371]},"n3187":{"id":"n3187","loc":[-85.632056,41.938435]},"n3188":{"id":"n3188","loc":[-85.631787,41.938457]},"n3189":{"id":"n3189","loc":[-85.631657,41.938728]},"n319":{"id":"n319","loc":[-85.634345,41.943299]},"n3190":{"id":"n3190","loc":[-85.631595,41.93775]},"n3191":{"id":"n3191","loc":[-85.630264,41.937839]},"n3192":{"id":"n3192","loc":[-85.628591,41.948536]},"n3193":{"id":"n3193","loc":[-85.63205,41.951181]},"n3194":{"id":"n3194","loc":[-85.632034,41.949909]},"n3195":{"id":"n3195","loc":[-85.630841,41.951191]},"n3196":{"id":"n3196","loc":[-85.632083,41.9537]},"n3197":{"id":"n3197","loc":[-85.630929,41.959037]},"n3198":{"id":"n3198","loc":[-85.632151,41.959028]},"n3199":{"id":"n3199","loc":[-85.630911,41.957428]},"n32":{"id":"n32","loc":[-85.638273,41.944246]},"n320":{"id":"n320","loc":[-85.634287,41.943326]},"n3200":{"id":"n3200","loc":[-85.63213,41.957427]},"n3201":{"id":"n3201","loc":[-85.632072,41.952447]},"n3202":{"id":"n3202","loc":[-85.632095,41.954677]},"n3203":{"id":"n3203","loc":[-85.632111,41.955911]},"n3204":{"id":"n3204","loc":[-85.630855,41.952457]},"n3205":{"id":"n3205","loc":[-85.630869,41.953709]},"n3206":{"id":"n3206","loc":[-85.63088,41.954682]},"n3207":{"id":"n3207","loc":[-85.630894,41.955913]},"n3208":{"id":"n3208","loc":[-85.633214,41.948619]},"n3209":{"id":"n3209","loc":[-85.633253,41.951171]},"n321":{"id":"n321","loc":[-85.634233,41.943354]},"n3210":{"id":"n3210","loc":[-85.633234,41.949901]},"n3211":{"id":"n3211","loc":[-85.633922,41.948616]},"n3212":{"id":"n3212","loc":[-85.625188,41.947832]},"n3213":{"id":"n3213","loc":[-85.625208,41.947775]},"n3214":{"id":"n3214","loc":[-85.625229,41.94776]},"n3215":{"id":"n3215","loc":[-85.625201,41.947749]},"n3216":{"id":"n3216","loc":[-85.625168,41.947707]},"n3217":{"id":"n3217","loc":[-85.625171,41.947609]},"n3218":{"id":"n3218","loc":[-85.625213,41.947564]},"n3219":{"id":"n3219","loc":[-85.62529,41.94756]},"n322":{"id":"n322","loc":[-85.634099,41.943429]},"n3220":{"id":"n3220","loc":[-85.625303,41.947533]},"n3221":{"id":"n3221","loc":[-85.625344,41.947482]},"n3222":{"id":"n3222","loc":[-85.625442,41.947468]},"n3223":{"id":"n3223","loc":[-85.62565,41.947494]},"n3224":{"id":"n3224","loc":[-85.625726,41.947613]},"n3225":{"id":"n3225","loc":[-85.625703,41.947728]},"n3226":{"id":"n3226","loc":[-85.625534,41.94781]},"n3227":{"id":"n3227","loc":[-85.625391,41.947822]},"n3228":{"id":"n3228","loc":[-85.625304,41.947859]},"n3229":{"id":"n3229","loc":[-85.625203,41.947885]},"n323":{"id":"n323","loc":[-85.633958,41.943507],"tags":{"highway":"crossing"}},"n3230":{"id":"n3230","loc":[-85.624691,41.948659]},"n3231":{"id":"n3231","loc":[-85.624328,41.948661]},"n3232":{"id":"n3232","loc":[-85.624331,41.949046]},"n3233":{"id":"n3233","loc":[-85.624694,41.949045]},"n3234":{"id":"n3234","loc":[-85.623623,41.949606]},"n3235":{"id":"n3235","loc":[-85.623623,41.9497]},"n3236":{"id":"n3236","loc":[-85.623357,41.9497]},"n3237":{"id":"n3237","loc":[-85.623357,41.949614]},"n3238":{"id":"n3238","loc":[-85.623974,41.949429]},"n3239":{"id":"n3239","loc":[-85.623974,41.949605]},"n324":{"id":"n324","loc":[-85.633698,41.943651],"tags":{"railway":"crossing"}},"n3240":{"id":"n3240","loc":[-85.624501,41.951226]},"n3241":{"id":"n3241","loc":[-85.624501,41.951123]},"n3242":{"id":"n3242","loc":[-85.624319,41.951123]},"n3243":{"id":"n3243","loc":[-85.624319,41.951226]},"n3244":{"id":"n3244","loc":[-85.624121,41.950866]},"n3245":{"id":"n3245","loc":[-85.624115,41.950525]},"n3246":{"id":"n3246","loc":[-85.624315,41.950523]},"n3247":{"id":"n3247","loc":[-85.62432,41.950865]},"n3248":{"id":"n3248","loc":[-85.624393,41.950867]},"n3249":{"id":"n3249","loc":[-85.62439,41.950596]},"n325":{"id":"n325","loc":[-85.633508,41.943757]},"n3250":{"id":"n3250","loc":[-85.624673,41.950594]},"n3251":{"id":"n3251","loc":[-85.624675,41.95082]},"n3252":{"id":"n3252","loc":[-85.62451,41.950821]},"n3253":{"id":"n3253","loc":[-85.62451,41.950866]},"n3254":{"id":"n3254","loc":[-85.624101,41.949346]},"n3255":{"id":"n3255","loc":[-85.624244,41.949346]},"n3256":{"id":"n3256","loc":[-85.624244,41.949368]},"n3257":{"id":"n3257","loc":[-85.62434,41.949368]},"n3258":{"id":"n3258","loc":[-85.624342,41.949351]},"n3259":{"id":"n3259","loc":[-85.624725,41.949348]},"n326":{"id":"n326","loc":[-85.634839,41.942974]},"n3260":{"id":"n3260","loc":[-85.624755,41.950495]},"n3261":{"id":"n3261","loc":[-85.624121,41.950502]},"n3262":{"id":"n3262","loc":[-85.625453,41.950163]},"n3263":{"id":"n3263","loc":[-85.625454,41.949976]},"n3264":{"id":"n3264","loc":[-85.625549,41.949977]},"n3265":{"id":"n3265","loc":[-85.62555,41.949833]},"n3266":{"id":"n3266","loc":[-85.625577,41.949833]},"n3267":{"id":"n3267","loc":[-85.625578,41.949656]},"n3268":{"id":"n3268","loc":[-85.625195,41.949655]},"n3269":{"id":"n3269","loc":[-85.625192,41.950162]},"n327":{"id":"n327","loc":[-85.634657,41.943028]},"n3270":{"id":"n3270","loc":[-85.622992,41.949614]},"n3271":{"id":"n3271","loc":[-85.622991,41.949431]},"n3272":{"id":"n3272","loc":[-85.620103,41.951]},"n3273":{"id":"n3273","loc":[-85.605644,41.947468]},"n3274":{"id":"n3274","loc":[-85.617421,41.947457]},"n3275":{"id":"n3275","loc":[-85.620078,41.947444]},"n3276":{"id":"n3276","loc":[-85.620087,41.94924]},"n3277":{"id":"n3277","loc":[-85.62156,41.948333]},"n3278":{"id":"n3278","loc":[-85.620106,41.950132]},"n3279":{"id":"n3279","loc":[-85.637412,41.951136]},"n328":{"id":"n328","loc":[-85.634222,41.943152]},"n3280":{"id":"n3280","loc":[-85.635429,41.948608]},"n3281":{"id":"n3281","loc":[-85.635047,41.947788]},"n3282":{"id":"n3282","loc":[-85.635048,41.947796]},"n3283":{"id":"n3283","loc":[-85.635002,41.947797]},"n3284":{"id":"n3284","loc":[-85.635002,41.947788]},"n3285":{"id":"n3285","loc":[-85.634914,41.94779]},"n3286":{"id":"n3286","loc":[-85.634913,41.947753]},"n3287":{"id":"n3287","loc":[-85.63494,41.947753]},"n3288":{"id":"n3288","loc":[-85.634938,41.947708]},"n3289":{"id":"n3289","loc":[-85.635124,41.947705]},"n329":{"id":"n329","loc":[-85.634099,41.943202]},"n3290":{"id":"n3290","loc":[-85.635126,41.947787]},"n3291":{"id":"n3291","loc":[-85.634972,41.947599]},"n3292":{"id":"n3292","loc":[-85.634921,41.9476]},"n3293":{"id":"n3293","loc":[-85.63485,41.947546]},"n3294":{"id":"n3294","loc":[-85.63485,41.947508]},"n3295":{"id":"n3295","loc":[-85.634924,41.947457]},"n3296":{"id":"n3296","loc":[-85.634967,41.947456]},"n3297":{"id":"n3297","loc":[-85.635041,41.947512]},"n3298":{"id":"n3298","loc":[-85.635041,41.947542]},"n3299":{"id":"n3299","loc":[-85.634244,41.947839]},"n33":{"id":"n33","loc":[-85.638257,41.944188]},"n330":{"id":"n330","loc":[-85.634093,41.943138]},"n3300":{"id":"n3300","loc":[-85.634243,41.947793]},"n3301":{"id":"n3301","loc":[-85.634244,41.947686]},"n3302":{"id":"n3302","loc":[-85.634243,41.947657]},"n3303":{"id":"n3303","loc":[-85.634462,41.947653]},"n3304":{"id":"n3304","loc":[-85.634468,41.947835]},"n3305":{"id":"n3305","loc":[-85.634416,41.948006]},"n3306":{"id":"n3306","loc":[-85.634415,41.947898]},"n3307":{"id":"n3307","loc":[-85.634275,41.947899]},"n3308":{"id":"n3308","loc":[-85.634275,41.947927]},"n3309":{"id":"n3309","loc":[-85.63425,41.947927]},"n331":{"id":"n331","loc":[-85.633938,41.943291]},"n3310":{"id":"n3310","loc":[-85.63425,41.947976]},"n3311":{"id":"n3311","loc":[-85.634274,41.947976]},"n3312":{"id":"n3312","loc":[-85.634275,41.948007]},"n3313":{"id":"n3313","loc":[-85.634342,41.947635]},"n3314":{"id":"n3314","loc":[-85.634339,41.947497]},"n3315":{"id":"n3315","loc":[-85.634313,41.94748]},"n3316":{"id":"n3316","loc":[-85.634287,41.947474]},"n3317":{"id":"n3317","loc":[-85.63498,41.94815]},"n3318":{"id":"n3318","loc":[-85.634891,41.94815]},"n3319":{"id":"n3319","loc":[-85.634892,41.948169]},"n332":{"id":"n332","loc":[-85.633535,41.943511],"tags":{"railway":"crossing"}},"n3320":{"id":"n3320","loc":[-85.634852,41.948169]},"n3321":{"id":"n3321","loc":[-85.634853,41.948268]},"n3322":{"id":"n3322","loc":[-85.634832,41.948268]},"n3323":{"id":"n3323","loc":[-85.634832,41.948296]},"n3324":{"id":"n3324","loc":[-85.634965,41.948295]},"n3325":{"id":"n3325","loc":[-85.634966,41.948321]},"n3326":{"id":"n3326","loc":[-85.634999,41.948321]},"n3327":{"id":"n3327","loc":[-85.634999,41.948295]},"n3328":{"id":"n3328","loc":[-85.635175,41.948293]},"n3329":{"id":"n3329","loc":[-85.635175,41.948262]},"n333":{"id":"n333","loc":[-85.63339,41.943596]},"n3330":{"id":"n3330","loc":[-85.635159,41.948262]},"n3331":{"id":"n3331","loc":[-85.635158,41.948152]},"n3332":{"id":"n3332","loc":[-85.635067,41.948152]},"n3333":{"id":"n3333","loc":[-85.635065,41.947966]},"n3334":{"id":"n3334","loc":[-85.634979,41.947966]},"n3335":{"id":"n3335","loc":[-85.634307,41.948326]},"n3336":{"id":"n3336","loc":[-85.634305,41.948298]},"n3337":{"id":"n3337","loc":[-85.634331,41.948055]},"n3338":{"id":"n3338","loc":[-85.634331,41.948046]},"n3339":{"id":"n3339","loc":[-85.634435,41.948047]},"n334":{"id":"n334","loc":[-85.632842,41.943895]},"n3340":{"id":"n3340","loc":[-85.634434,41.948375]},"n3341":{"id":"n3341","loc":[-85.634463,41.948373]},"n3342":{"id":"n3342","loc":[-85.634464,41.948456]},"n3343":{"id":"n3343","loc":[-85.63443,41.948457]},"n3344":{"id":"n3344","loc":[-85.634432,41.948505]},"n3345":{"id":"n3345","loc":[-85.637386,41.94906]},"n3346":{"id":"n3346","loc":[-85.637113,41.9486]},"n3347":{"id":"n3347","loc":[-85.635448,41.949424]},"n335":{"id":"n335","loc":[-85.633856,41.943315]},"n3352":{"id":"n3352","loc":[-85.635457,41.949787]},"n3353":{"id":"n3353","loc":[-85.635459,41.949886]},"n336":{"id":"n336","loc":[-85.633697,41.943405]},"n337":{"id":"n337","loc":[-85.63347,41.943181]},"n3372":{"id":"n3372","loc":[-85.634423,41.950964]},"n3373":{"id":"n3373","loc":[-85.634424,41.95074]},"n3374":{"id":"n3374","loc":[-85.634394,41.950284]},"n3375":{"id":"n3375","loc":[-85.634398,41.950626]},"n3376":{"id":"n3376","loc":[-85.63452,41.951063]},"n3377":{"id":"n3377","loc":[-85.634511,41.949977]},"n3378":{"id":"n3378","loc":[-85.637409,41.949873]},"n3379":{"id":"n3379","loc":[-85.634824,41.94996]},"n338":{"id":"n338","loc":[-85.633597,41.943109]},"n3380":{"id":"n3380","loc":[-85.635437,41.949954]},"n3381":{"id":"n3381","loc":[-85.634844,41.951064]},"n3382":{"id":"n3382","loc":[-85.635458,41.951058]},"n3383":{"id":"n3383","loc":[-85.633921,41.947333]},"n3384":{"id":"n3384","loc":[-85.634208,41.947793]},"n3385":{"id":"n3385","loc":[-85.634204,41.947687]},"n3386":{"id":"n3386","loc":[-85.63424,41.947475]},"n3387":{"id":"n3387","loc":[-85.63424,41.947635]},"n3388":{"id":"n3388","loc":[-85.634089,41.948328]},"n3389":{"id":"n3389","loc":[-85.63424,41.948299]},"n339":{"id":"n339","loc":[-85.633673,41.943184]},"n3390":{"id":"n3390","loc":[-85.634239,41.948212]},"n3391":{"id":"n3391","loc":[-85.634086,41.948214]},"n3392":{"id":"n3392","loc":[-85.63408,41.948056]},"n3393":{"id":"n3393","loc":[-85.634093,41.948506]},"n3394":{"id":"n3394","loc":[-85.64344,41.941866]},"n3395":{"id":"n3395","loc":[-85.63378,41.95099]},"n3396":{"id":"n3396","loc":[-85.633779,41.950967]},"n3397":{"id":"n3397","loc":[-85.63375,41.950746]},"n3398":{"id":"n3398","loc":[-85.63375,41.950697]},"n3399":{"id":"n3399","loc":[-85.633903,41.950696]},"n34":{"id":"n34","loc":[-85.638176,41.944312]},"n340":{"id":"n340","loc":[-85.633714,41.94316]},"n3400":{"id":"n3400","loc":[-85.633901,41.950436]},"n3401":{"id":"n3401","loc":[-85.633492,41.950438]},"n3402":{"id":"n3402","loc":[-85.633494,41.950756]},"n3403":{"id":"n3403","loc":[-85.633454,41.950756]},"n3404":{"id":"n3404","loc":[-85.633456,41.950992]},"n3405":{"id":"n3405","loc":[-85.633994,41.950284]},"n3406":{"id":"n3406","loc":[-85.633998,41.950628]},"n3407":{"id":"n3407","loc":[-85.633364,41.951068]},"n3408":{"id":"n3408","loc":[-85.633356,41.949982]},"n3409":{"id":"n3409","loc":[-85.643327,41.941903]},"n341":{"id":"n341","loc":[-85.633811,41.943256]},"n3410":{"id":"n3410","loc":[-85.633292,41.953691]},"n3411":{"id":"n3411","loc":[-85.637432,41.952399]},"n3412":{"id":"n3412","loc":[-85.633349,41.957422]},"n3413":{"id":"n3413","loc":[-85.633326,41.955909]},"n3414":{"id":"n3414","loc":[-85.633307,41.954673]},"n3415":{"id":"n3415","loc":[-85.633273,41.952436]},"n3416":{"id":"n3416","loc":[-85.633361,41.95823],"tags":{"highway":"turning_circle"}},"n3417":{"id":"n3417","loc":[-85.619899,41.945527]},"n3418":{"id":"n3418","loc":[-85.643422,41.941946]},"n3419":{"id":"n3419","loc":[-85.643505,41.942033]},"n342":{"id":"n342","loc":[-85.633801,41.943261]},"n3420":{"id":"n3420","loc":[-85.620088,41.945571]},"n3421":{"id":"n3421","loc":[-85.620051,41.945505]},"n3422":{"id":"n3422","loc":[-85.62001,41.94541]},"n3423":{"id":"n3423","loc":[-85.620982,41.944742]},"n3424":{"id":"n3424","loc":[-85.621305,41.944782]},"n3425":{"id":"n3425","loc":[-85.621174,41.944819]},"n3426":{"id":"n3426","loc":[-85.621029,41.944871]},"n3427":{"id":"n3427","loc":[-85.620741,41.945011]},"n3428":{"id":"n3428","loc":[-85.620616,41.945085]},"n3429":{"id":"n3429","loc":[-85.620506,41.945172]},"n343":{"id":"n343","loc":[-85.63374,41.943514]},"n3430":{"id":"n3430","loc":[-85.620394,41.945273]},"n3431":{"id":"n3431","loc":[-85.620316,41.94536]},"n3432":{"id":"n3432","loc":[-85.620257,41.945452]},"n3433":{"id":"n3433","loc":[-85.620212,41.945535]},"n3434":{"id":"n3434","loc":[-85.620101,41.945811]},"n3435":{"id":"n3435","loc":[-85.620081,41.945937]},"n3436":{"id":"n3436","loc":[-85.619899,41.943718]},"n3437":{"id":"n3437","loc":[-85.619969,41.943211]},"n3438":{"id":"n3438","loc":[-85.619894,41.943292]},"n3439":{"id":"n3439","loc":[-85.620047,41.944738]},"n344":{"id":"n344","loc":[-85.633665,41.943441]},"n3440":{"id":"n3440","loc":[-85.620226,41.946088]},"n3441":{"id":"n3441","loc":[-85.620225,41.945864]},"n3442":{"id":"n3442","loc":[-85.620518,41.945863]},"n3443":{"id":"n3443","loc":[-85.620519,41.945944]},"n3444":{"id":"n3444","loc":[-85.620388,41.945944]},"n3445":{"id":"n3445","loc":[-85.620389,41.946088]},"n3446":{"id":"n3446","loc":[-85.618405,41.946566]},"n3447":{"id":"n3447","loc":[-85.619156,41.946562]},"n3448":{"id":"n3448","loc":[-85.619154,41.946319]},"n3449":{"id":"n3449","loc":[-85.618736,41.946322]},"n345":{"id":"n345","loc":[-85.633162,41.942947]},"n3450":{"id":"n3450","loc":[-85.618733,41.94612]},"n3451":{"id":"n3451","loc":[-85.619317,41.946116]},"n3452":{"id":"n3452","loc":[-85.619316,41.946023]},"n3453":{"id":"n3453","loc":[-85.619622,41.946021]},"n3454":{"id":"n3454","loc":[-85.619624,41.946171]},"n3455":{"id":"n3455","loc":[-85.61977,41.94617]},"n3456":{"id":"n3456","loc":[-85.619769,41.94602]},"n3457":{"id":"n3457","loc":[-85.619732,41.94602]},"n3458":{"id":"n3458","loc":[-85.619731,41.945856]},"n3459":{"id":"n3459","loc":[-85.619617,41.945857]},"n346":{"id":"n346","loc":[-85.633598,41.943083]},"n3460":{"id":"n3460","loc":[-85.619616,41.945776]},"n3461":{"id":"n3461","loc":[-85.619447,41.945777]},"n3462":{"id":"n3462","loc":[-85.619415,41.945778]},"n3463":{"id":"n3463","loc":[-85.618378,41.945788]},"n3464":{"id":"n3464","loc":[-85.618384,41.946132]},"n3465":{"id":"n3465","loc":[-85.618503,41.94613]},"n3466":{"id":"n3466","loc":[-85.618506,41.946319]},"n3467":{"id":"n3467","loc":[-85.6184,41.94632]},"n3468":{"id":"n3468","loc":[-85.618248,41.946416]},"n3469":{"id":"n3469","loc":[-85.618247,41.946319]},"n347":{"id":"n347","loc":[-85.63343,41.943179]},"n3470":{"id":"n3470","loc":[-85.618039,41.946321]},"n3471":{"id":"n3471","loc":[-85.61804,41.946418]},"n3472":{"id":"n3472","loc":[-85.620118,41.951895]},"n3473":{"id":"n3473","loc":[-85.617075,41.95469]},"n3474":{"id":"n3474","loc":[-85.620107,41.952113]},"n3475":{"id":"n3475","loc":[-85.620091,41.95232]},"n3476":{"id":"n3476","loc":[-85.620047,41.952505]},"n3477":{"id":"n3477","loc":[-85.61998,41.952715]},"n3478":{"id":"n3478","loc":[-85.619861,41.952986]},"n3479":{"id":"n3479","loc":[-85.619622,41.953365]},"n348":{"id":"n348","loc":[-85.633669,41.94341]},"n3480":{"id":"n3480","loc":[-85.619441,41.953567]},"n3481":{"id":"n3481","loc":[-85.619259,41.953741]},"n3482":{"id":"n3482","loc":[-85.618835,41.954056]},"n3483":{"id":"n3483","loc":[-85.618602,41.954194]},"n3484":{"id":"n3484","loc":[-85.618305,41.954347]},"n3485":{"id":"n3485","loc":[-85.618006,41.954466]},"n3486":{"id":"n3486","loc":[-85.617611,41.954587]},"n3487":{"id":"n3487","loc":[-85.615094,41.943412]},"n3488":{"id":"n3488","loc":[-85.619337,41.943025]},"n3489":{"id":"n3489","loc":[-85.610477,41.945527]},"n349":{"id":"n349","loc":[-85.633566,41.943466]},"n3490":{"id":"n3490","loc":[-85.610477,41.943718]},"n3491":{"id":"n3491","loc":[-85.619804,41.942976]},"n3492":{"id":"n3492","loc":[-85.61921,41.942672]},"n3493":{"id":"n3493","loc":[-85.619862,41.942836]},"n3494":{"id":"n3494","loc":[-85.616326,41.942769]},"n3495":{"id":"n3495","loc":[-85.617953,41.942917]},"n3496":{"id":"n3496","loc":[-85.61972,41.942728]},"n3497":{"id":"n3497","loc":[-85.61944,41.942784]},"n3498":{"id":"n3498","loc":[-85.615323,41.942841]},"n3499":{"id":"n3499","loc":[-85.612923,41.943718]},"n35":{"id":"n35","loc":[-85.637928,41.944249]},"n350":{"id":"n350","loc":[-85.633031,41.942986]},"n3500":{"id":"n3500","loc":[-85.61958,41.942756]},"n3501":{"id":"n3501","loc":[-85.619643,41.942647],"tags":{"leisure":"fishing"}},"n3502":{"id":"n3502","loc":[-85.619935,41.942962]},"n3503":{"id":"n3503","loc":[-85.629677,41.954687]},"n3504":{"id":"n3504","loc":[-85.629083,41.953722]},"n3505":{"id":"n3505","loc":[-85.621907,41.952067]},"n3506":{"id":"n3506","loc":[-85.621788,41.952058]},"n3507":{"id":"n3507","loc":[-85.629665,41.953718]},"n3508":{"id":"n3508","loc":[-85.624454,41.954707]},"n3509":{"id":"n3509","loc":[-85.634609,41.954585]},"n351":{"id":"n351","loc":[-85.633238,41.94283]},"n3510":{"id":"n3510","loc":[-85.634595,41.953772]},"n3511":{"id":"n3511","loc":[-85.633425,41.953783]},"n3512":{"id":"n3512","loc":[-85.633439,41.954596]},"n3517":{"id":"n3517","loc":[-85.621789,41.952179]},"n3518":{"id":"n3518","loc":[-85.624105,41.954704]},"n3519":{"id":"n3519","loc":[-85.623306,41.954542]},"n352":{"id":"n352","loc":[-85.633173,41.943556]},"n3520":{"id":"n3520","loc":[-85.623123,41.954502]},"n3521":{"id":"n3521","loc":[-85.622965,41.954473]},"n3522":{"id":"n3522","loc":[-85.622822,41.954455]},"n3523":{"id":"n3523","loc":[-85.62269,41.954448]},"n3524":{"id":"n3524","loc":[-85.622388,41.954467]},"n3525":{"id":"n3525","loc":[-85.62403,41.954895]},"n3526":{"id":"n3526","loc":[-85.623579,41.954855]},"n3527":{"id":"n3527","loc":[-85.623836,41.954951]},"n3528":{"id":"n3528","loc":[-85.622473,41.954592]},"n3529":{"id":"n3529","loc":[-85.622753,41.95458]},"n353":{"id":"n353","loc":[-85.633127,41.943552]},"n3530":{"id":"n3530","loc":[-85.62404,41.955078]},"n3531":{"id":"n3531","loc":[-85.624126,41.954999]},"n3532":{"id":"n3532","loc":[-85.623171,41.954687]},"n3533":{"id":"n3533","loc":[-85.624276,41.955206]},"n3534":{"id":"n3534","loc":[-85.62491,41.952801]},"n3535":{"id":"n3535","loc":[-85.625186,41.952756]},"n3536":{"id":"n3536","loc":[-85.625552,41.952792]},"n3537":{"id":"n3537","loc":[-85.626001,41.952948]},"n3538":{"id":"n3538","loc":[-85.626528,41.952984]},"n3539":{"id":"n3539","loc":[-85.626942,41.952886]},"n354":{"id":"n354","loc":[-85.632745,41.943222]},"n3540":{"id":"n3540","loc":[-85.627092,41.952685]},"n3541":{"id":"n3541","loc":[-85.627212,41.95244]},"n3542":{"id":"n3542","loc":[-85.627158,41.952226]},"n3543":{"id":"n3543","loc":[-85.627002,41.951972]},"n3544":{"id":"n3544","loc":[-85.626822,41.951838]},"n3545":{"id":"n3545","loc":[-85.626528,41.951807]},"n3546":{"id":"n3546","loc":[-85.625653,41.951852]},"n3547":{"id":"n3547","loc":[-85.625348,41.951834]},"n3548":{"id":"n3548","loc":[-85.625114,41.951767]},"n3549":{"id":"n3549","loc":[-85.620627,41.954682]},"n355":{"id":"n355","loc":[-85.632756,41.943199]},"n3550":{"id":"n3550","loc":[-85.622758,41.951884]},"n3551":{"id":"n3551","loc":[-85.618135,41.954734]},"n3552":{"id":"n3552","loc":[-85.620229,41.95472]},"n3553":{"id":"n3553","loc":[-85.624491,41.955573]},"n3554":{"id":"n3554","loc":[-85.621792,41.958314]},"n3555":{"id":"n3555","loc":[-85.623395,41.960001]},"n3556":{"id":"n3556","loc":[-85.620461,41.956212]},"n3557":{"id":"n3557","loc":[-85.62109,41.956766]},"n3558":{"id":"n3558","loc":[-85.620246,41.956224]},"n3559":{"id":"n3559","loc":[-85.625017,41.956068]},"n356":{"id":"n356","loc":[-85.632855,41.943147]},"n3560":{"id":"n3560","loc":[-85.622795,41.959702]},"n3561":{"id":"n3561","loc":[-85.621573,41.958457]},"n3562":{"id":"n3562","loc":[-85.619631,41.9573]},"n3563":{"id":"n3563","loc":[-85.62095,41.956311]},"n3564":{"id":"n3564","loc":[-85.619694,41.957408]},"n3565":{"id":"n3565","loc":[-85.621079,41.957751]},"n3566":{"id":"n3566","loc":[-85.622426,41.961142]},"n3567":{"id":"n3567","loc":[-85.623251,41.960484]},"n3568":{"id":"n3568","loc":[-85.619084,41.956291]},"n3569":{"id":"n3569","loc":[-85.622227,41.959303]},"n357":{"id":"n357","loc":[-85.632888,41.94315]},"n3570":{"id":"n3570","loc":[-85.620976,41.959104]},"n3571":{"id":"n3571","loc":[-85.621208,41.95653]},"n3572":{"id":"n3572","loc":[-85.623531,41.95951]},"n3573":{"id":"n3573","loc":[-85.623556,41.957935]},"n3574":{"id":"n3574","loc":[-85.623037,41.95746]},"n3575":{"id":"n3575","loc":[-85.621175,41.956427]},"n3576":{"id":"n3576","loc":[-85.622651,41.960109]},"n3577":{"id":"n3577","loc":[-85.621803,41.960747]},"n3578":{"id":"n3578","loc":[-85.620791,41.961874]},"n3579":{"id":"n3579","loc":[-85.625295,41.956786]},"n358":{"id":"n358","loc":[-85.633232,41.943547]},"n3580":{"id":"n3580","loc":[-85.619662,41.956894]},"n3581":{"id":"n3581","loc":[-85.622442,41.958708]},"n3582":{"id":"n3582","loc":[-85.621744,41.955864]},"n3583":{"id":"n3583","loc":[-85.621336,41.959212]},"n3584":{"id":"n3584","loc":[-85.622801,41.957304]},"n3585":{"id":"n3585","loc":[-85.619973,41.957433]},"n3586":{"id":"n3586","loc":[-85.619556,41.955717]},"n3587":{"id":"n3587","loc":[-85.622978,41.958601]},"n3588":{"id":"n3588","loc":[-85.625396,41.956264]},"n3589":{"id":"n3589","loc":[-85.623525,41.958034]},"n359":{"id":"n359","loc":[-85.633302,41.94351]},"n3590":{"id":"n3590","loc":[-85.623299,41.959631]},"n3591":{"id":"n3591","loc":[-85.622678,41.959873]},"n3592":{"id":"n3592","loc":[-85.625553,41.956179]},"n3593":{"id":"n3593","loc":[-85.623557,41.959231]},"n3594":{"id":"n3594","loc":[-85.622843,41.957373]},"n3595":{"id":"n3595","loc":[-85.619378,41.955677]},"n3596":{"id":"n3596","loc":[-85.620092,41.955425]},"n3597":{"id":"n3597","loc":[-85.622666,41.96044]},"n3598":{"id":"n3598","loc":[-85.621996,41.960256]},"n3599":{"id":"n3599","loc":[-85.623273,41.959997]},"n36":{"id":"n36","loc":[-85.637894,41.945551]},"n360":{"id":"n360","loc":[-85.633442,41.943794],"tags":{"highway":"crossing"}},"n3600":{"id":"n3600","loc":[-85.62477,41.95689]},"n3601":{"id":"n3601","loc":[-85.621641,41.955015]},"n3602":{"id":"n3602","loc":[-85.622495,41.960392]},"n3603":{"id":"n3603","loc":[-85.61918,41.955565]},"n3604":{"id":"n3604","loc":[-85.620017,41.955505]},"n3605":{"id":"n3605","loc":[-85.621739,41.956315]},"n3606":{"id":"n3606","loc":[-85.622957,41.959837]},"n3607":{"id":"n3607","loc":[-85.620912,41.960919]},"n3608":{"id":"n3608","loc":[-85.625231,41.956235]},"n3609":{"id":"n3609","loc":[-85.620976,41.961868]},"n361":{"id":"n361","loc":[-85.633381,41.94383]},"n3610":{"id":"n3610","loc":[-85.620956,41.958908]},"n3611":{"id":"n3611","loc":[-85.619035,41.956139]},"n3612":{"id":"n3612","loc":[-85.623643,41.958669]},"n3613":{"id":"n3613","loc":[-85.61949,41.956539]},"n3614":{"id":"n3614","loc":[-85.621927,41.958242]},"n3615":{"id":"n3615","loc":[-85.620826,41.955721]},"n3616":{"id":"n3616","loc":[-85.621202,41.961321]},"n3617":{"id":"n3617","loc":[-85.624877,41.95594]},"n3618":{"id":"n3618","loc":[-85.62065,41.958369]},"n3619":{"id":"n3619","loc":[-85.621524,41.956279]},"n362":{"id":"n362","loc":[-85.632977,41.944053]},"n3620":{"id":"n3620","loc":[-85.624662,41.955932]},"n3621":{"id":"n3621","loc":[-85.623048,41.958509]},"n3622":{"id":"n3622","loc":[-85.62111,41.95754]},"n3623":{"id":"n3623","loc":[-85.621508,41.954847]},"n3624":{"id":"n3624","loc":[-85.620655,41.958601]},"n3625":{"id":"n3625","loc":[-85.62154,41.954971]},"n3626":{"id":"n3626","loc":[-85.621691,41.955521]},"n3627":{"id":"n3627","loc":[-85.62154,41.954739]},"n3628":{"id":"n3628","loc":[-85.621996,41.959913]},"n3629":{"id":"n3629","loc":[-85.622286,41.960699]},"n363":{"id":"n363","loc":[-85.632915,41.943981],"tags":{"crossing":"zebra","highway":"crossing"}},"n3630":{"id":"n3630","loc":[-85.622844,41.9572]},"n3631":{"id":"n3631","loc":[-85.620252,41.955446]},"n3632":{"id":"n3632","loc":[-85.623434,41.957528]},"n3633":{"id":"n3633","loc":[-85.623429,41.956858]},"n3634":{"id":"n3634","loc":[-85.622957,41.957137]},"n3635":{"id":"n3635","loc":[-85.622554,41.959027]},"n3636":{"id":"n3636","loc":[-85.623289,41.958314]},"n3637":{"id":"n3637","loc":[-85.622977,41.960855]},"n3638":{"id":"n3638","loc":[-85.624008,41.956953]},"n3639":{"id":"n3639","loc":[-85.621278,41.960855]},"n364":{"id":"n364","loc":[-85.632724,41.943969],"tags":{"crossing":"zebra","highway":"crossing"}},"n3640":{"id":"n3640","loc":[-85.623128,41.956993]},"n3641":{"id":"n3641","loc":[-85.622452,41.959183]},"n3642":{"id":"n3642","loc":[-85.621095,41.961082]},"n3643":{"id":"n3643","loc":[-85.622011,41.960544]},"n3644":{"id":"n3644","loc":[-85.621637,41.955385]},"n3645":{"id":"n3645","loc":[-85.620999,41.959271]},"n3646":{"id":"n3646","loc":[-85.620044,41.956347]},"n3647":{"id":"n3647","loc":[-85.621936,41.959682]},"n3648":{"id":"n3648","loc":[-85.623761,41.95685]},"n3649":{"id":"n3649","loc":[-85.621239,41.959343]},"n365":{"id":"n365","loc":[-85.632621,41.944034]},"n3650":{"id":"n3650","loc":[-85.621073,41.956012]},"n3651":{"id":"n3651","loc":[-85.621271,41.956184]},"n3652":{"id":"n3652","loc":[-85.623444,41.95778]},"n3653":{"id":"n3653","loc":[-85.62125,41.96186]},"n3654":{"id":"n3654","loc":[-85.62169,41.961059]},"n3655":{"id":"n3655","loc":[-85.620012,41.955637]},"n3656":{"id":"n3656","loc":[-85.621058,41.9573]},"n3657":{"id":"n3657","loc":[-85.621138,41.957663]},"n3658":{"id":"n3658","loc":[-85.620773,41.957895]},"n3659":{"id":"n3659","loc":[-85.62007,41.957157]},"n366":{"id":"n366","loc":[-85.632684,41.944109],"tags":{"crossing":"zebra","highway":"crossing"}},"n3660":{"id":"n3660","loc":[-85.624534,41.955844]},"n3661":{"id":"n3661","loc":[-85.621932,41.960807]},"n3662":{"id":"n3662","loc":[-85.623358,41.958138]},"n3663":{"id":"n3663","loc":[-85.620456,41.955514]},"n3664":{"id":"n3664","loc":[-85.623504,41.957607]},"n3665":{"id":"n3665","loc":[-85.621444,41.960751]},"n3666":{"id":"n3666","loc":[-85.623492,41.960213]},"n3667":{"id":"n3667","loc":[-85.621669,41.954655]},"n3668":{"id":"n3668","loc":[-85.623106,41.958685]},"n3669":{"id":"n3669","loc":[-85.620922,41.957867]},"n367":{"id":"n367","loc":[-85.632738,41.944172]},"n3670":{"id":"n3670","loc":[-85.620092,41.957296]},"n3671":{"id":"n3671","loc":[-85.621669,41.955222]},"n3672":{"id":"n3672","loc":[-85.621614,41.960967]},"n3673":{"id":"n3673","loc":[-85.621691,41.955732]},"n3674":{"id":"n3674","loc":[-85.619207,41.956419]},"n3675":{"id":"n3675","loc":[-85.621116,41.956603]},"n3676":{"id":"n3676","loc":[-85.623311,41.956929]},"n3677":{"id":"n3677","loc":[-85.625671,41.956499]},"n3678":{"id":"n3678","loc":[-85.623525,41.956738]},"n3679":{"id":"n3679","loc":[-85.625381,41.956634]},"n368":{"id":"n368","loc":[-85.63287,41.944135],"tags":{"crossing":"zebra","highway":"crossing"}},"n3680":{"id":"n3680","loc":[-85.620096,41.95677]},"n3681":{"id":"n3681","loc":[-85.623803,41.958745]},"n3682":{"id":"n3682","loc":[-85.623498,41.958457]},"n3683":{"id":"n3683","loc":[-85.624223,41.957009]},"n3684":{"id":"n3684","loc":[-85.620026,41.956946]},"n3685":{"id":"n3685","loc":[-85.623005,41.960124]},"n3686":{"id":"n3686","loc":[-85.619073,41.955832]},"n3687":{"id":"n3687","loc":[-85.621744,41.95501]},"n3688":{"id":"n3688","loc":[-85.620804,41.958781]},"n3689":{"id":"n3689","loc":[-85.619844,41.957448]},"n369":{"id":"n369","loc":[-85.63298,41.944076]},"n3690":{"id":"n3690","loc":[-85.623713,41.958872]},"n3691":{"id":"n3691","loc":[-85.622329,41.960507]},"n3692":{"id":"n3692","loc":[-85.620804,41.956244]},"n3693":{"id":"n3693","loc":[-85.621818,41.955968]},"n3694":{"id":"n3694","loc":[-85.621405,41.958697]},"n3695":{"id":"n3695","loc":[-85.620998,41.960996]},"n3696":{"id":"n3696","loc":[-85.621621,41.960444]},"n3697":{"id":"n3697","loc":[-85.620941,41.961637]},"n3698":{"id":"n3698","loc":[-85.622195,41.958333]},"n3699":{"id":"n3699","loc":[-85.621668,41.961529]},"n37":{"id":"n37","loc":[-85.637611,41.945383]},"n370":{"id":"n370","loc":[-85.633191,41.944471]},"n3700":{"id":"n3700","loc":[-85.621015,41.957049]},"n3701":{"id":"n3701","loc":[-85.619368,41.955521]},"n3702":{"id":"n3702","loc":[-85.651578,41.942534]},"n3703":{"id":"n3703","loc":[-85.651541,41.943847]},"n3704":{"id":"n3704","loc":[-85.651365,41.944817]},"n3705":{"id":"n3705","loc":[-85.651076,41.945985]},"n3706":{"id":"n3706","loc":[-85.650626,41.947213]},"n3707":{"id":"n3707","loc":[-85.649669,41.949161]},"n3708":{"id":"n3708","loc":[-85.641802,41.961801]},"n3709":{"id":"n3709","loc":[-85.623333,41.961987]},"n371":{"id":"n371","loc":[-85.633132,41.94372]},"n3710":{"id":"n3710","loc":[-85.620621,41.965658]},"n3711":{"id":"n3711","loc":[-85.605673,41.965764]},"n3712":{"id":"n3712","loc":[-85.605664,41.962094]},"n3713":{"id":"n3713","loc":[-85.583774,41.962178]},"n3714":{"id":"n3714","loc":[-85.583774,41.961789]},"n3715":{"id":"n3715","loc":[-85.581303,41.961783]},"n3716":{"id":"n3716","loc":[-85.581245,41.958394]},"n3717":{"id":"n3717","loc":[-85.585299,41.955483]},"n3718":{"id":"n3718","loc":[-85.585588,41.955331]},"n3719":{"id":"n3719","loc":[-85.586053,41.955163]},"n372":{"id":"n372","loc":[-85.633011,41.943788]},"n3720":{"id":"n3720","loc":[-85.58632,41.955076]},"n3721":{"id":"n3721","loc":[-85.586478,41.955025]},"n3722":{"id":"n3722","loc":[-85.58692,41.954947]},"n3723":{"id":"n3723","loc":[-85.587345,41.954913]},"n3724":{"id":"n3724","loc":[-85.605592,41.954766]},"n3725":{"id":"n3725","loc":[-85.605303,41.936236]},"n3726":{"id":"n3726","loc":[-85.606941,41.936117]},"n3727":{"id":"n3727","loc":[-85.60876,41.935856]},"n3728":{"id":"n3728","loc":[-85.610092,41.935451]},"n3729":{"id":"n3729","loc":[-85.610681,41.935247]},"n373":{"id":"n373","loc":[-85.632854,41.943632]},"n3730":{"id":"n3730","loc":[-85.611446,41.934955]},"n3731":{"id":"n3731","loc":[-85.612057,41.934696]},"n3732":{"id":"n3732","loc":[-85.613256,41.934084]},"n3733":{"id":"n3733","loc":[-85.613948,41.933682]},"n3734":{"id":"n3734","loc":[-85.614638,41.933212]},"n3735":{"id":"n3735","loc":[-85.619801,41.929305]},"n3736":{"id":"n3736","loc":[-85.619768,41.925548]},"n3737":{"id":"n3737","loc":[-85.625761,41.925597]},"n3738":{"id":"n3738","loc":[-85.6263,41.927323]},"n3739":{"id":"n3739","loc":[-85.633708,41.927402]},"n374":{"id":"n374","loc":[-85.632974,41.943565]},"n3740":{"id":"n3740","loc":[-85.633927,41.929109]},"n3741":{"id":"n3741","loc":[-85.639213,41.929088]},"n3742":{"id":"n3742","loc":[-85.639204,41.925488]},"n3743":{"id":"n3743","loc":[-85.651425,41.925406]},"n3744":{"id":"n3744","loc":[-85.643386,41.941933]},"n3745":{"id":"n3745","loc":[-85.642776,41.941161]},"n3746":{"id":"n3746","loc":[-85.637277,41.948812]},"n3747":{"id":"n3747","loc":[-85.637366,41.94897]},"n3748":{"id":"n3748","loc":[-85.637329,41.94889]},"n3749":{"id":"n3749","loc":[-85.629649,41.952596]},"n375":{"id":"n375","loc":[-85.632741,41.943351]},"n3750":{"id":"n3750","loc":[-85.630291,41.954684]},"n3751":{"id":"n3751","loc":[-85.630284,41.953713]},"n3752":{"id":"n3752","loc":[-85.630269,41.952463]},"n3753":{"id":"n3753","loc":[-85.633933,41.949896]},"n3754":{"id":"n3754","loc":[-85.629339,41.941467]},"n3755":{"id":"n3755","loc":[-85.629857,41.94316]},"n3756":{"id":"n3756","loc":[-85.629987,41.944025]},"n3757":{"id":"n3757","loc":[-85.628538,41.948604]},"n3758":{"id":"n3758","loc":[-85.627415,41.957442]},"n3759":{"id":"n3759","loc":[-85.627019,41.957369]},"n376":{"id":"n376","loc":[-85.63251,41.943481]},"n3760":{"id":"n3760","loc":[-85.62167,41.952179]},"n3761":{"id":"n3761","loc":[-85.62167,41.952138]},"n3762":{"id":"n3762","loc":[-85.621562,41.952139]},"n3763":{"id":"n3763","loc":[-85.621562,41.952058]},"n3764":{"id":"n3764","loc":[-85.621476,41.952043]},"n3765":{"id":"n3765","loc":[-85.621477,41.952132]},"n3766":{"id":"n3766","loc":[-85.621386,41.952132]},"n3767":{"id":"n3767","loc":[-85.621387,41.95214]},"n3768":{"id":"n3768","loc":[-85.621262,41.95214]},"n3769":{"id":"n3769","loc":[-85.621261,41.952038]},"n377":{"id":"n377","loc":[-85.632706,41.943715]},"n3770":{"id":"n3770","loc":[-85.621389,41.952038]},"n3771":{"id":"n3771","loc":[-85.621389,41.952043]},"n3772":{"id":"n3772","loc":[-85.620898,41.952024]},"n3773":{"id":"n3773","loc":[-85.620898,41.952085]},"n3774":{"id":"n3774","loc":[-85.620774,41.952084]},"n3775":{"id":"n3775","loc":[-85.620774,41.952023]},"n3776":{"id":"n3776","loc":[-85.620749,41.952036]},"n3777":{"id":"n3777","loc":[-85.620723,41.952097]},"n3778":{"id":"n3778","loc":[-85.626158,41.958996]},"n3779":{"id":"n3779","loc":[-85.626319,41.958686]},"n378":{"id":"n378","loc":[-85.638683,41.943295]},"n3780":{"id":"n3780","loc":[-85.626119,41.958629]},"n3781":{"id":"n3781","loc":[-85.626064,41.958733]},"n3782":{"id":"n3782","loc":[-85.626155,41.958759]},"n3783":{"id":"n3783","loc":[-85.626048,41.958965]},"n3784":{"id":"n3784","loc":[-85.620648,41.952079]},"n3785":{"id":"n3785","loc":[-85.63826,41.961213]},"n3786":{"id":"n3786","loc":[-85.638003,41.961614]},"n3787":{"id":"n3787","loc":[-85.638817,41.961902]},"n3788":{"id":"n3788","loc":[-85.639073,41.961501]},"n3789":{"id":"n3789","loc":[-85.620674,41.952018]},"n379":{"id":"n379","loc":[-85.638684,41.94323]},"n3790":{"id":"n3790","loc":[-85.62082,41.952106]},"n3791":{"id":"n3791","loc":[-85.620819,41.952143]},"n3792":{"id":"n3792","loc":[-85.620778,41.952143]},"n3793":{"id":"n3793","loc":[-85.620778,41.952106]},"n3794":{"id":"n3794","loc":[-85.620563,41.952276]},"n3795":{"id":"n3795","loc":[-85.620543,41.95238]},"n3796":{"id":"n3796","loc":[-85.620422,41.952367]},"n3797":{"id":"n3797","loc":[-85.620441,41.952263]},"n3798":{"id":"n3798","loc":[-85.620561,41.952266]},"n3799":{"id":"n3799","loc":[-85.620444,41.952254]},"n38":{"id":"n38","loc":[-85.63879,41.943295]},"n380":{"id":"n380","loc":[-85.638627,41.94322]},"n3800":{"id":"n3800","loc":[-85.620773,41.955585]},"n3801":{"id":"n3801","loc":[-85.621265,41.955989]},"n3802":{"id":"n3802","loc":[-85.620692,41.954969]},"n3803":{"id":"n3803","loc":[-85.620691,41.955367]},"n3804":{"id":"n3804","loc":[-85.620458,41.952178]},"n3805":{"id":"n3805","loc":[-85.620575,41.95219]},"n3806":{"id":"n3806","loc":[-85.617609,41.952712]},"n3807":{"id":"n3807","loc":[-85.617533,41.952801],"tags":{"entrance":"yes"}},"n3808":{"id":"n3808","loc":[-85.616816,41.952911]},"n3809":{"id":"n3809","loc":[-85.616797,41.952901]},"n381":{"id":"n381","loc":[-85.638624,41.943294]},"n3810":{"id":"n3810","loc":[-85.616343,41.952694]},"n3811":{"id":"n3811","loc":[-85.616336,41.952729]},"n3812":{"id":"n3812","loc":[-85.616343,41.952772]},"n3813":{"id":"n3813","loc":[-85.628479,41.948649]},"n3814":{"id":"n3814","loc":[-85.628413,41.948679]},"n3815":{"id":"n3815","loc":[-85.628336,41.948694]},"n3816":{"id":"n3816","loc":[-85.62826,41.948694]},"n3817":{"id":"n3817","loc":[-85.628185,41.948679]},"n3818":{"id":"n3818","loc":[-85.628103,41.948649]},"n3819":{"id":"n3819","loc":[-85.627482,41.948395]},"n382":{"id":"n382","loc":[-85.638437,41.943291]},"n3820":{"id":"n3820","loc":[-85.619957,41.951168]},"n3821":{"id":"n3821","loc":[-85.619955,41.952077]},"n3822":{"id":"n3822","loc":[-85.619843,41.952666]},"n3823":{"id":"n3823","loc":[-85.619513,41.95324]},"n3824":{"id":"n3824","loc":[-85.619163,41.953668]},"n3825":{"id":"n3825","loc":[-85.618813,41.953947]},"n3826":{"id":"n3826","loc":[-85.618265,41.954252]},"n3827":{"id":"n3827","loc":[-85.617691,41.954458]},"n3828":{"id":"n3828","loc":[-85.616978,41.95459]},"n3829":{"id":"n3829","loc":[-85.615408,41.954628]},"n383":{"id":"n383","loc":[-85.63844,41.943209]},"n3830":{"id":"n3830","loc":[-85.615374,41.951076]},"n3831":{"id":"n3831","loc":[-85.61932,41.947564]},"n3832":{"id":"n3832","loc":[-85.610553,41.94755]},"n3833":{"id":"n3833","loc":[-85.610572,41.951065]},"n3834":{"id":"n3834","loc":[-85.617548,41.94757]},"n3835":{"id":"n3835","loc":[-85.619842,41.947939]},"n3836":{"id":"n3836","loc":[-85.619874,41.950905]},"n3837":{"id":"n3837","loc":[-85.619695,41.950911]},"n3838":{"id":"n3838","loc":[-85.617591,41.951078]},"n3839":{"id":"n3839","loc":[-85.619551,41.951065]},"n384":{"id":"n384","loc":[-85.632616,41.944021]},"n3840":{"id":"n3840","loc":[-85.626813,41.947337]},"n3841":{"id":"n3841","loc":[-85.616371,41.952814]},"n3842":{"id":"n3842","loc":[-85.617205,41.951308]},"n3843":{"id":"n3843","loc":[-85.616795,41.950953]},"n3844":{"id":"n3844","loc":[-85.617441,41.950889]},"n3845":{"id":"n3845","loc":[-85.619155,41.949377]},"n3846":{"id":"n3846","loc":[-85.618556,41.949377]},"n3847":{"id":"n3847","loc":[-85.618557,41.948372]},"n3848":{"id":"n3848","loc":[-85.619156,41.948372]},"n3849":{"id":"n3849","loc":[-85.61927,41.949796]},"n385":{"id":"n385","loc":[-85.632319,41.944172]},"n3850":{"id":"n3850","loc":[-85.61926,41.948344]},"n3851":{"id":"n3851","loc":[-85.619219,41.948264]},"n3852":{"id":"n3852","loc":[-85.619147,41.948196]},"n3853":{"id":"n3853","loc":[-85.619049,41.948144]},"n3854":{"id":"n3854","loc":[-85.618942,41.948116]},"n3855":{"id":"n3855","loc":[-85.618822,41.948109]},"n3856":{"id":"n3856","loc":[-85.618699,41.94813]},"n3857":{"id":"n3857","loc":[-85.618937,41.951943]},"n3858":{"id":"n3858","loc":[-85.616762,41.952222]},"n3859":{"id":"n3859","loc":[-85.616799,41.95472]},"n386":{"id":"n386","loc":[-85.63221,41.944066]},"n3860":{"id":"n3860","loc":[-85.616458,41.954735]},"n3861":{"id":"n3861","loc":[-85.61763,41.951515]},"n3862":{"id":"n3862","loc":[-85.617735,41.951572]},"n3863":{"id":"n3863","loc":[-85.61929,41.951573]},"n3864":{"id":"n3864","loc":[-85.617134,41.951348]},"n3865":{"id":"n3865","loc":[-85.616598,41.95192]},"n3866":{"id":"n3866","loc":[-85.616557,41.951997]},"n3867":{"id":"n3867","loc":[-85.61658,41.952093]},"n3868":{"id":"n3868","loc":[-85.616636,41.952145]},"n3869":{"id":"n3869","loc":[-85.616918,41.952276]},"n387":{"id":"n387","loc":[-85.632524,41.943912]},"n3870":{"id":"n3870","loc":[-85.617098,41.952235]},"n3871":{"id":"n3871","loc":[-85.61892,41.951467]},"n3872":{"id":"n3872","loc":[-85.618035,41.951473]},"n3873":{"id":"n3873","loc":[-85.618036,41.951572]},"n3874":{"id":"n3874","loc":[-85.61892,41.951573]},"n3875":{"id":"n3875","loc":[-85.618919,41.951957]},"n3876":{"id":"n3876","loc":[-85.619457,41.952237]},"n3877":{"id":"n3877","loc":[-85.618178,41.953618]},"n3878":{"id":"n3878","loc":[-85.617658,41.953366]},"n3879":{"id":"n3879","loc":[-85.617987,41.953024]},"n388":{"id":"n388","loc":[-85.632268,41.943621]},"n3880":{"id":"n3880","loc":[-85.618429,41.953248]},"n3881":{"id":"n3881","loc":[-85.618554,41.953119]},"n3882":{"id":"n3882","loc":[-85.618077,41.952868]},"n3883":{"id":"n3883","loc":[-85.618039,41.952886]},"n3884":{"id":"n3884","loc":[-85.619375,41.952169]},"n3885":{"id":"n3885","loc":[-85.618137,41.953538]},"n3886":{"id":"n3886","loc":[-85.61799,41.953555]},"n3887":{"id":"n3887","loc":[-85.617729,41.953423]},"n3888":{"id":"n3888","loc":[-85.618101,41.953029]},"n3889":{"id":"n3889","loc":[-85.618516,41.953119]},"n389":{"id":"n389","loc":[-85.631951,41.943773]},"n3890":{"id":"n3890","loc":[-85.619132,41.952042]},"n3891":{"id":"n3891","loc":[-85.618235,41.952981]},"n3892":{"id":"n3892","loc":[-85.618485,41.952425]},"n3893":{"id":"n3893","loc":[-85.618676,41.952519]},"n3894":{"id":"n3894","loc":[-85.618942,41.952648]},"n3895":{"id":"n3895","loc":[-85.618287,41.953122]},"n3896":{"id":"n3896","loc":[-85.617914,41.953516]},"n3897":{"id":"n3897","loc":[-85.617836,41.953573]},"n3898":{"id":"n3898","loc":[-85.616477,41.95289]},"n3899":{"id":"n3899","loc":[-85.618441,41.953201]},"n39":{"id":"n39","loc":[-85.619931,41.951013]},"n390":{"id":"n390","loc":[-85.631981,41.943654]},"n3900":{"id":"n3900","loc":[-85.617537,41.953335]},"n3901":{"id":"n3901","loc":[-85.617221,41.953166]},"n3902":{"id":"n3902","loc":[-85.617253,41.953135]},"n3903":{"id":"n3903","loc":[-85.617211,41.953114]},"n3904":{"id":"n3904","loc":[-85.617197,41.95313]},"n3905":{"id":"n3905","loc":[-85.616802,41.952925]},"n3906":{"id":"n3906","loc":[-85.616771,41.952928]},"n3907":{"id":"n3907","loc":[-85.616493,41.952785]},"n3908":{"id":"n3908","loc":[-85.616823,41.952426]},"n3909":{"id":"n3909","loc":[-85.617191,41.952616]},"n391":{"id":"n391","loc":[-85.631886,41.943699]},"n3910":{"id":"n3910","loc":[-85.61724,41.952559]},"n3911":{"id":"n3911","loc":[-85.61721,41.952542]},"n3912":{"id":"n3912","loc":[-85.617395,41.952351]},"n3913":{"id":"n3913","loc":[-85.617426,41.952368]},"n3914":{"id":"n3914","loc":[-85.617483,41.952309]},"n3915":{"id":"n3915","loc":[-85.617332,41.952229]},"n3916":{"id":"n3916","loc":[-85.617451,41.952102]},"n3917":{"id":"n3917","loc":[-85.617477,41.952115]},"n3918":{"id":"n3918","loc":[-85.617658,41.951923]},"n3919":{"id":"n3919","loc":[-85.617634,41.95191]},"n392":{"id":"n392","loc":[-85.631807,41.943606]},"n3920":{"id":"n3920","loc":[-85.617747,41.951786]},"n3921":{"id":"n3921","loc":[-85.618268,41.952056]},"n3922":{"id":"n3922","loc":[-85.618211,41.952122]},"n3923":{"id":"n3923","loc":[-85.618386,41.95222]},"n3924":{"id":"n3924","loc":[-85.618098,41.952527]},"n3925":{"id":"n3925","loc":[-85.617916,41.95243]},"n3926":{"id":"n3926","loc":[-85.617854,41.952498]},"n3927":{"id":"n3927","loc":[-85.617769,41.952453]},"n3928":{"id":"n3928","loc":[-85.617476,41.952773]},"n3929":{"id":"n3929","loc":[-85.617876,41.952973]},"n393":{"id":"n393","loc":[-85.631902,41.943561]},"n3930":{"id":"n3930","loc":[-85.617174,41.953638]},"n3931":{"id":"n3931","loc":[-85.618016,41.953578]},"n3932":{"id":"n3932","loc":[-85.618107,41.953628]},"n3933":{"id":"n3933","loc":[-85.618067,41.954268]},"n3934":{"id":"n3934","loc":[-85.617864,41.954263]},"n3935":{"id":"n3935","loc":[-85.61762,41.954205]},"n3936":{"id":"n3936","loc":[-85.617437,41.954103]},"n3937":{"id":"n3937","loc":[-85.617294,41.953978]},"n3938":{"id":"n3938","loc":[-85.617217,41.95384]},"n3939":{"id":"n3939","loc":[-85.616814,41.954327]},"n394":{"id":"n394","loc":[-85.63236,41.943543]},"n3940":{"id":"n3940","loc":[-85.616778,41.95381]},"n3941":{"id":"n3941","loc":[-85.616585,41.953707]},"n3942":{"id":"n3942","loc":[-85.616458,41.954318]},"n3943":{"id":"n3943","loc":[-85.616643,41.954345]},"n3944":{"id":"n3944","loc":[-85.618133,41.951412]},"n3945":{"id":"n3945","loc":[-85.618326,41.951411]},"n3946":{"id":"n3946","loc":[-85.618503,41.95141]},"n3947":{"id":"n3947","loc":[-85.618681,41.951409]},"n3948":{"id":"n3948","loc":[-85.618868,41.951408]},"n3949":{"id":"n3949","loc":[-85.617047,41.95136]},"n395":{"id":"n395","loc":[-85.633839,41.944082]},"n3950":{"id":"n3950","loc":[-85.616502,41.951946]},"n3951":{"id":"n3951","loc":[-85.616497,41.952072]},"n3952":{"id":"n3952","loc":[-85.616565,41.952165]},"n3953":{"id":"n3953","loc":[-85.616663,41.952218]},"n3954":{"id":"n3954","loc":[-85.616733,41.952255]},"n3955":{"id":"n3955","loc":[-85.617238,41.952512],"tags":{"entrance":"yes"}},"n3956":{"id":"n3956","loc":[-85.617043,41.952406]},"n3957":{"id":"n3957","loc":[-85.617691,41.951711]},"n3958":{"id":"n3958","loc":[-85.617773,41.951679]},"n3959":{"id":"n3959","loc":[-85.619085,41.951681]},"n396":{"id":"n396","loc":[-85.63376,41.944097]},"n3960":{"id":"n3960","loc":[-85.617943,41.952895]},"n3961":{"id":"n3961","loc":[-85.618039,41.952938]},"n3962":{"id":"n3962","loc":[-85.61763,41.95336]},"n3963":{"id":"n3963","loc":[-85.617554,41.95344]},"n3964":{"id":"n3964","loc":[-85.617381,41.952366],"tags":{"entrance":"yes"}},"n3965":{"id":"n3965","loc":[-85.617184,41.952254]},"n3966":{"id":"n3966","loc":[-85.617208,41.952496]},"n3967":{"id":"n3967","loc":[-85.617124,41.952581],"tags":{"entrance":"yes"}},"n3968":{"id":"n3968","loc":[-85.618094,41.952735]},"n3969":{"id":"n3969","loc":[-85.617702,41.952525],"tags":{"entrance":"yes"}},"n397":{"id":"n397","loc":[-85.63361,41.943957]},"n3970":{"id":"n3970","loc":[-85.617554,41.952686],"tags":{"entrance":"yes"}},"n3971":{"id":"n3971","loc":[-85.617959,41.952878]},"n3972":{"id":"n3972","loc":[-85.616367,41.952655]},"n3973":{"id":"n3973","loc":[-85.616416,41.952851]},"n3974":{"id":"n3974","loc":[-85.619777,41.951075]},"n3975":{"id":"n3975","loc":[-85.618611,41.94817]},"n3976":{"id":"n3976","loc":[-85.618538,41.948229]},"n3977":{"id":"n3977","loc":[-85.617421,41.947559]},"n3978":{"id":"n3978","loc":[-85.617395,41.951039]},"n3979":{"id":"n3979","loc":[-85.618488,41.94829]},"n398":{"id":"n398","loc":[-85.633309,41.943886]},"n3980":{"id":"n3980","loc":[-85.610238,41.954774]},"n3981":{"id":"n3981","loc":[-85.617449,41.950756]},"n3982":{"id":"n3982","loc":[-85.617288,41.951286]},"n3983":{"id":"n3983","loc":[-85.61745,41.950197]},"n3984":{"id":"n3984","loc":[-85.617436,41.948908]},"n3985":{"id":"n3985","loc":[-85.615915,41.953804]},"n3986":{"id":"n3986","loc":[-85.615953,41.953968]},"n3987":{"id":"n3987","loc":[-85.616031,41.954085]},"n3988":{"id":"n3988","loc":[-85.616135,41.954181]},"n3989":{"id":"n3989","loc":[-85.616273,41.954263]},"n399":{"id":"n399","loc":[-85.633226,41.943931]},"n3990":{"id":"n3990","loc":[-85.618327,41.951083]},"n3991":{"id":"n3991","loc":[-85.618135,41.951084]},"n3992":{"id":"n3992","loc":[-85.618503,41.951082]},"n3993":{"id":"n3993","loc":[-85.618682,41.951081]},"n3994":{"id":"n3994","loc":[-85.618864,41.951082]},"n3995":{"id":"n3995","loc":[-85.616761,41.950101]},"n3996":{"id":"n3996","loc":[-85.617317,41.947558]},"n3997":{"id":"n3997","loc":[-85.617336,41.948883]},"n3998":{"id":"n3998","loc":[-85.616779,41.949295]},"n3999":{"id":"n3999","loc":[-85.616754,41.949349]},"n4":{"id":"n4","loc":[-85.622764,41.950892],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n40":{"id":"n40","loc":[-85.619841,41.951037]},"n400":{"id":"n400","loc":[-85.63326,41.943966]},"n4000":{"id":"n4000","loc":[-85.616761,41.950865]},"n4001":{"id":"n4001","loc":[-85.616883,41.951041]},"n4002":{"id":"n4002","loc":[-85.617004,41.951142]},"n4003":{"id":"n4003","loc":[-85.617062,41.951248]},"n4004":{"id":"n4004","loc":[-85.616809,41.949273]},"n4005":{"id":"n4005","loc":[-85.616755,41.949489]},"n4006":{"id":"n4006","loc":[-85.616759,41.949971]},"n4007":{"id":"n4007","loc":[-85.616757,41.949702]},"n4008":{"id":"n4008","loc":[-85.618456,41.94836]},"n4009":{"id":"n4009","loc":[-85.618447,41.948428]},"n401":{"id":"n401","loc":[-85.63324,41.943976]},"n4010":{"id":"n4010","loc":[-85.618437,41.949322]},"n4011":{"id":"n4011","loc":[-85.618447,41.949418]},"n4012":{"id":"n4012","loc":[-85.618478,41.949491]},"n4013":{"id":"n4013","loc":[-85.618535,41.949559]},"n4014":{"id":"n4014","loc":[-85.618623,41.94962]},"n4015":{"id":"n4015","loc":[-85.618721,41.94966]},"n4016":{"id":"n4016","loc":[-85.618838,41.949674]},"n4017":{"id":"n4017","loc":[-85.618967,41.949667]},"n4018":{"id":"n4018","loc":[-85.619065,41.949632]},"n4019":{"id":"n4019","loc":[-85.61915,41.949578]},"n402":{"id":"n402","loc":[-85.63327,41.944006]},"n4020":{"id":"n4020","loc":[-85.619216,41.949507]},"n4021":{"id":"n4021","loc":[-85.61927,41.949399]},"n4022":{"id":"n4022","loc":[-85.619074,41.947639]},"n4023":{"id":"n4023","loc":[-85.619073,41.947793]},"n4024":{"id":"n4024","loc":[-85.618912,41.947793]},"n4025":{"id":"n4025","loc":[-85.618911,41.947947]},"n4026":{"id":"n4026","loc":[-85.618752,41.947947]},"n4027":{"id":"n4027","loc":[-85.618754,41.947637]},"n4028":{"id":"n4028","loc":[-85.617896,41.947599]},"n4029":{"id":"n4029","loc":[-85.617898,41.947811]},"n403":{"id":"n403","loc":[-85.633278,41.944002]},"n4030":{"id":"n4030","loc":[-85.617717,41.947812]},"n4031":{"id":"n4031","loc":[-85.617715,41.9476]},"n4032":{"id":"n4032","loc":[-85.619003,41.949828]},"n4033":{"id":"n4033","loc":[-85.619003,41.949882]},"n4034":{"id":"n4034","loc":[-85.618926,41.949882]},"n4035":{"id":"n4035","loc":[-85.618926,41.949828]},"n4036":{"id":"n4036","loc":[-85.618861,41.949809]},"n4037":{"id":"n4037","loc":[-85.618861,41.949898]},"n4038":{"id":"n4038","loc":[-85.618688,41.949898]},"n4039":{"id":"n4039","loc":[-85.618687,41.94981]},"n404":{"id":"n404","loc":[-85.63331,41.944036]},"n4040":{"id":"n4040","loc":[-85.618349,41.949473]},"n4041":{"id":"n4041","loc":[-85.618287,41.949473]},"n4042":{"id":"n4042","loc":[-85.618287,41.94942]},"n4043":{"id":"n4043","loc":[-85.618348,41.949419]},"n4044":{"id":"n4044","loc":[-85.62316,41.951604]},"n4045":{"id":"n4045","loc":[-85.623026,41.951605]},"n4046":{"id":"n4046","loc":[-85.623023,41.951466]},"n4047":{"id":"n4047","loc":[-85.623134,41.951465]},"n4048":{"id":"n4048","loc":[-85.623136,41.951539]},"n4049":{"id":"n4049","loc":[-85.623159,41.951539]},"n405":{"id":"n405","loc":[-85.633348,41.944015]},"n4050":{"id":"n4050","loc":[-85.623025,41.95155]},"n4051":{"id":"n4051","loc":[-85.622955,41.951551]},"n4052":{"id":"n4052","loc":[-85.622953,41.951507]},"n4053":{"id":"n4053","loc":[-85.623024,41.951506]},"n4054":{"id":"n4054","loc":[-85.623318,41.951242]},"n4055":{"id":"n4055","loc":[-85.623175,41.951241]},"n4056":{"id":"n4056","loc":[-85.623176,41.951153]},"n4057":{"id":"n4057","loc":[-85.623319,41.951154]},"n4058":{"id":"n4058","loc":[-85.623077,41.951191]},"n4059":{"id":"n4059","loc":[-85.622973,41.951191]},"n406":{"id":"n406","loc":[-85.63338,41.944048]},"n4060":{"id":"n4060","loc":[-85.622972,41.951349]},"n4061":{"id":"n4061","loc":[-85.623059,41.95135]},"n4062":{"id":"n4062","loc":[-85.62306,41.951301]},"n4063":{"id":"n4063","loc":[-85.623077,41.951301]},"n4064":{"id":"n4064","loc":[-85.623117,41.951405]},"n4065":{"id":"n4065","loc":[-85.62312,41.951087]},"n4066":{"id":"n4066","loc":[-85.623118,41.951274]},"n4067":{"id":"n4067","loc":[-85.62328,41.951275]},"n4068":{"id":"n4068","loc":[-85.62328,41.951242]},"n4069":{"id":"n4069","loc":[-85.623179,41.951392]},"n407":{"id":"n407","loc":[-85.633431,41.94402]},"n4070":{"id":"n4070","loc":[-85.623141,41.951392]},"n4071":{"id":"n4071","loc":[-85.623142,41.95136]},"n4072":{"id":"n4072","loc":[-85.623179,41.951361]},"n4073":{"id":"n4073","loc":[-85.622565,41.951639]},"n4074":{"id":"n4074","loc":[-85.622565,41.951741]},"n4075":{"id":"n4075","loc":[-85.622463,41.95174]},"n4076":{"id":"n4076","loc":[-85.622463,41.95173]},"n4077":{"id":"n4077","loc":[-85.622442,41.95173]},"n4078":{"id":"n4078","loc":[-85.622442,41.951742]},"n4079":{"id":"n4079","loc":[-85.622361,41.951742]},"n408":{"id":"n408","loc":[-85.633425,41.944014]},"n4080":{"id":"n4080","loc":[-85.622362,41.951667]},"n4081":{"id":"n4081","loc":[-85.622441,41.951667]},"n4082":{"id":"n4082","loc":[-85.622441,41.951688]},"n4083":{"id":"n4083","loc":[-85.622461,41.951688]},"n4084":{"id":"n4084","loc":[-85.622461,41.951638]},"n4085":{"id":"n4085","loc":[-85.62255,41.951587]},"n4086":{"id":"n4086","loc":[-85.622449,41.95159]},"n4087":{"id":"n4087","loc":[-85.622441,41.951448]},"n4088":{"id":"n4088","loc":[-85.62253,41.951445]},"n4089":{"id":"n4089","loc":[-85.622532,41.951486]},"n409":{"id":"n409","loc":[-85.633457,41.943997]},"n4090":{"id":"n4090","loc":[-85.622555,41.951485]},"n4091":{"id":"n4091","loc":[-85.622558,41.951531]},"n4092":{"id":"n4092","loc":[-85.622547,41.951531]},"n4093":{"id":"n4093","loc":[-85.622451,41.95159]},"n4094":{"id":"n4094","loc":[-85.622452,41.95161]},"n4095":{"id":"n4095","loc":[-85.622106,41.951617]},"n4096":{"id":"n4096","loc":[-85.622133,41.951443]},"n4097":{"id":"n4097","loc":[-85.622552,41.951379]},"n4098":{"id":"n4098","loc":[-85.622443,41.95138]},"n4099":{"id":"n4099","loc":[-85.622441,41.951281]},"n41":{"id":"n41","loc":[-85.636233,41.942764]},"n410":{"id":"n410","loc":[-85.633429,41.943969]},"n4100":{"id":"n4100","loc":[-85.62255,41.95128]},"n4101":{"id":"n4101","loc":[-85.622541,41.951437]},"n4102":{"id":"n4102","loc":[-85.622441,41.951438]},"n4103":{"id":"n4103","loc":[-85.621561,41.951444]},"n4104":{"id":"n4104","loc":[-85.622302,41.951479]},"n4105":{"id":"n4105","loc":[-85.6223,41.95152]},"n4106":{"id":"n4106","loc":[-85.622169,41.951517]},"n4107":{"id":"n4107","loc":[-85.622171,41.951476]},"n4108":{"id":"n4108","loc":[-85.622543,41.951228]},"n4109":{"id":"n4109","loc":[-85.622433,41.951228]},"n411":{"id":"n411","loc":[-85.633442,41.943962]},"n4110":{"id":"n4110","loc":[-85.622433,41.951133]},"n4111":{"id":"n4111","loc":[-85.622543,41.951133]},"n4112":{"id":"n4112","loc":[-85.622356,41.951256]},"n4113":{"id":"n4113","loc":[-85.622293,41.951256]},"n4114":{"id":"n4114","loc":[-85.622292,41.9512]},"n4115":{"id":"n4115","loc":[-85.622313,41.9512]},"n4116":{"id":"n4116","loc":[-85.622312,41.951173]},"n4117":{"id":"n4117","loc":[-85.622364,41.951173]},"n4118":{"id":"n4118","loc":[-85.622365,41.951231]},"n4119":{"id":"n4119","loc":[-85.622355,41.951231]},"n412":{"id":"n412","loc":[-85.633411,41.943932]},"n4120":{"id":"n4120","loc":[-85.62197,41.951155]},"n4121":{"id":"n4121","loc":[-85.62197,41.951213]},"n4122":{"id":"n4122","loc":[-85.621848,41.951213]},"n4123":{"id":"n4123","loc":[-85.621848,41.951155]},"n4124":{"id":"n4124","loc":[-85.622193,41.951268]},"n4125":{"id":"n4125","loc":[-85.622194,41.951305]},"n4126":{"id":"n4126","loc":[-85.622121,41.951306]},"n4127":{"id":"n4127","loc":[-85.622121,41.951322]},"n4128":{"id":"n4128","loc":[-85.621984,41.951324]},"n4129":{"id":"n4129","loc":[-85.621983,41.951271]},"n413":{"id":"n413","loc":[-85.633421,41.943926]},"n4130":{"id":"n4130","loc":[-85.622171,41.9514]},"n4131":{"id":"n4131","loc":[-85.622148,41.951382]},"n4132":{"id":"n4132","loc":[-85.6221,41.951414]},"n4133":{"id":"n4133","loc":[-85.622122,41.951433]},"n4134":{"id":"n4134","loc":[-85.621782,41.951148]},"n4135":{"id":"n4135","loc":[-85.621783,41.951219]},"n4136":{"id":"n4136","loc":[-85.62164,41.951221]},"n4137":{"id":"n4137","loc":[-85.62164,41.951236]},"n4138":{"id":"n4138","loc":[-85.621556,41.951237]},"n4139":{"id":"n4139","loc":[-85.621555,41.95117]},"n414":{"id":"n414","loc":[-85.633376,41.94388]},"n4140":{"id":"n4140","loc":[-85.621644,41.951169]},"n4141":{"id":"n4141","loc":[-85.621643,41.951139]},"n4142":{"id":"n4142","loc":[-85.621719,41.951138]},"n4143":{"id":"n4143","loc":[-85.621719,41.951148]},"n4144":{"id":"n4144","loc":[-85.621409,41.951322]},"n4145":{"id":"n4145","loc":[-85.621338,41.951322]},"n4146":{"id":"n4146","loc":[-85.621336,41.95115]},"n4147":{"id":"n4147","loc":[-85.621521,41.951149]},"n4148":{"id":"n4148","loc":[-85.621522,41.951228]},"n4149":{"id":"n4149","loc":[-85.621408,41.951228]},"n415":{"id":"n415","loc":[-85.633348,41.943895]},"n4150":{"id":"n4150","loc":[-85.621284,41.951219]},"n4151":{"id":"n4151","loc":[-85.621153,41.951219]},"n4152":{"id":"n4152","loc":[-85.621152,41.951152]},"n4153":{"id":"n4153","loc":[-85.621283,41.951152]},"n4154":{"id":"n4154","loc":[-85.621159,41.951241]},"n4155":{"id":"n4155","loc":[-85.62116,41.951301]},"n4156":{"id":"n4156","loc":[-85.621088,41.951302]},"n4157":{"id":"n4157","loc":[-85.621088,41.951241]},"n4158":{"id":"n4158","loc":[-85.621049,41.951158]},"n4159":{"id":"n4159","loc":[-85.62105,41.951229]},"n416":{"id":"n416","loc":[-85.633341,41.943888]},"n4160":{"id":"n4160","loc":[-85.620976,41.951229]},"n4161":{"id":"n4161","loc":[-85.620977,41.951295]},"n4162":{"id":"n4162","loc":[-85.620887,41.951296]},"n4163":{"id":"n4163","loc":[-85.620886,41.951229]},"n4164":{"id":"n4164","loc":[-85.620862,41.951229]},"n4165":{"id":"n4165","loc":[-85.620861,41.951159]},"n4166":{"id":"n4166","loc":[-85.620626,41.951133]},"n4167":{"id":"n4167","loc":[-85.620626,41.951205]},"n4168":{"id":"n4168","loc":[-85.620412,41.951206]},"n4169":{"id":"n4169","loc":[-85.620411,41.951134]},"n417":{"id":"n417","loc":[-85.633321,41.943898]},"n4170":{"id":"n4170","loc":[-85.621775,41.951443]},"n4171":{"id":"n4171","loc":[-85.621777,41.951264]},"n4172":{"id":"n4172","loc":[-85.621565,41.951654]},"n4173":{"id":"n4173","loc":[-85.621331,41.951439]},"n4174":{"id":"n4174","loc":[-85.621031,41.951443]},"n4175":{"id":"n4175","loc":[-85.621836,41.951724]},"n4176":{"id":"n4176","loc":[-85.621834,41.951621]},"n4177":{"id":"n4177","loc":[-85.62197,41.951619]},"n4178":{"id":"n4178","loc":[-85.621972,41.951722]},"n4179":{"id":"n4179","loc":[-85.621772,41.951638]},"n418":{"id":"n418","loc":[-85.633547,41.943896]},"n4180":{"id":"n4180","loc":[-85.621772,41.951715]},"n4181":{"id":"n4181","loc":[-85.621699,41.951716]},"n4182":{"id":"n4182","loc":[-85.6217,41.951722]},"n4183":{"id":"n4183","loc":[-85.621641,41.951722]},"n4184":{"id":"n4184","loc":[-85.62164,41.951639]},"n4185":{"id":"n4185","loc":[-85.621505,41.951655]},"n4186":{"id":"n4186","loc":[-85.621505,41.951729]},"n4187":{"id":"n4187","loc":[-85.621389,41.951729]},"n4188":{"id":"n4188","loc":[-85.62139,41.951654]},"n4189":{"id":"n4189","loc":[-85.621105,41.951635]},"n419":{"id":"n419","loc":[-85.633467,41.944075]},"n4190":{"id":"n4190","loc":[-85.621104,41.951576]},"n4191":{"id":"n4191","loc":[-85.621168,41.951576]},"n4192":{"id":"n4192","loc":[-85.621168,41.951595]},"n4193":{"id":"n4193","loc":[-85.621261,41.951595]},"n4194":{"id":"n4194","loc":[-85.621261,41.951646]},"n4195":{"id":"n4195","loc":[-85.621294,41.951646]},"n4196":{"id":"n4196","loc":[-85.621294,41.951732]},"n4197":{"id":"n4197","loc":[-85.621251,41.951732]},"n4198":{"id":"n4198","loc":[-85.621251,41.95174]},"n4199":{"id":"n4199","loc":[-85.621175,41.951741]},"n42":{"id":"n42","loc":[-85.635996,41.942727]},"n420":{"id":"n420","loc":[-85.633578,41.944055]},"n4200":{"id":"n4200","loc":[-85.621175,41.951651]},"n4201":{"id":"n4201","loc":[-85.621189,41.951651]},"n4202":{"id":"n4202","loc":[-85.621189,41.951635]},"n4203":{"id":"n4203","loc":[-85.620554,41.951641]},"n4204":{"id":"n4204","loc":[-85.620555,41.951742]},"n4205":{"id":"n4205","loc":[-85.620719,41.951742]},"n4206":{"id":"n4206","loc":[-85.620719,41.951731]},"n4207":{"id":"n4207","loc":[-85.620803,41.95173]},"n4208":{"id":"n4208","loc":[-85.620803,41.951603]},"n4209":{"id":"n4209","loc":[-85.62072,41.951603]},"n421":{"id":"n421","loc":[-85.633462,41.944125]},"n4210":{"id":"n4210","loc":[-85.620721,41.951641]},"n4211":{"id":"n4211","loc":[-85.620269,41.953053]},"n4212":{"id":"n4212","loc":[-85.620229,41.953051]},"n4213":{"id":"n4213","loc":[-85.620231,41.953013]},"n4214":{"id":"n4214","loc":[-85.620271,41.953015]},"n4215":{"id":"n4215","loc":[-85.620215,41.953133]},"n4216":{"id":"n4216","loc":[-85.62013,41.953134]},"n4217":{"id":"n4217","loc":[-85.620129,41.953083]},"n4218":{"id":"n4218","loc":[-85.620214,41.953082]},"n4219":{"id":"n4219","loc":[-85.62016,41.953272]},"n422":{"id":"n422","loc":[-85.633372,41.944061]},"n4220":{"id":"n4220","loc":[-85.620046,41.953273]},"n4221":{"id":"n4221","loc":[-85.620045,41.953171]},"n4222":{"id":"n4222","loc":[-85.620088,41.953171]},"n4223":{"id":"n4223","loc":[-85.620087,41.953162]},"n4224":{"id":"n4224","loc":[-85.620121,41.953162]},"n4225":{"id":"n4225","loc":[-85.620121,41.953173]},"n4226":{"id":"n4226","loc":[-85.620157,41.953173]},"n4227":{"id":"n4227","loc":[-85.620158,41.953196]},"n4228":{"id":"n4228","loc":[-85.620189,41.953196]},"n4229":{"id":"n4229","loc":[-85.620189,41.953246]},"n423":{"id":"n423","loc":[-85.633509,41.943981]},"n4230":{"id":"n4230","loc":[-85.62016,41.953246]},"n4231":{"id":"n4231","loc":[-85.6195,41.954012]},"n4232":{"id":"n4232","loc":[-85.619438,41.954057]},"n4233":{"id":"n4233","loc":[-85.619418,41.954043]},"n4234":{"id":"n4234","loc":[-85.619381,41.954069]},"n4235":{"id":"n4235","loc":[-85.619399,41.954083]},"n4236":{"id":"n4236","loc":[-85.619339,41.954126]},"n4237":{"id":"n4237","loc":[-85.619584,41.954313]},"n4238":{"id":"n4238","loc":[-85.619743,41.954198]},"n4239":{"id":"n4239","loc":[-85.619453,41.954727]},"n424":{"id":"n424","loc":[-85.635421,41.945367]},"n4240":{"id":"n4240","loc":[-85.619503,41.954581]},"n4241":{"id":"n4241","loc":[-85.619597,41.954472]},"n4242":{"id":"n4242","loc":[-85.619862,41.95419]},"n4243":{"id":"n4243","loc":[-85.619506,41.953907]},"n4244":{"id":"n4244","loc":[-85.619261,41.9541]},"n4245":{"id":"n4245","loc":[-85.619246,41.954139]},"n4246":{"id":"n4246","loc":[-85.619244,41.9542]},"n4247":{"id":"n4247","loc":[-85.619259,41.954243]},"n4248":{"id":"n4248","loc":[-85.619285,41.954274]},"n4249":{"id":"n4249","loc":[-85.619123,41.954381]},"n425":{"id":"n425","loc":[-85.634425,41.943552]},"n4250":{"id":"n4250","loc":[-85.619641,41.954607]},"n4251":{"id":"n4251","loc":[-85.619383,41.954615]},"n4252":{"id":"n4252","loc":[-85.61896,41.954391]},"n4253":{"id":"n4253","loc":[-85.619211,41.954178]},"n4254":{"id":"n4254","loc":[-85.619115,41.954102]},"n4255":{"id":"n4255","loc":[-85.619519,41.953821]},"n4256":{"id":"n4256","loc":[-85.619956,41.954156]},"n4257":{"id":"n4257","loc":[-85.619851,41.954266]},"n4258":{"id":"n4258","loc":[-85.619779,41.95436]},"n4259":{"id":"n4259","loc":[-85.620525,41.954364]},"n426":{"id":"n426","loc":[-85.634248,41.943654]},"n4260":{"id":"n4260","loc":[-85.620398,41.954365]},"n4261":{"id":"n4261","loc":[-85.620398,41.954324]},"n4262":{"id":"n4262","loc":[-85.620525,41.954323]},"n4263":{"id":"n4263","loc":[-85.620359,41.954588]},"n4264":{"id":"n4264","loc":[-85.620321,41.954588]},"n4265":{"id":"n4265","loc":[-85.620321,41.954599]},"n4266":{"id":"n4266","loc":[-85.620296,41.954599]},"n4267":{"id":"n4267","loc":[-85.620296,41.954587]},"n4268":{"id":"n4268","loc":[-85.620262,41.954588]},"n4269":{"id":"n4269","loc":[-85.620261,41.954516]},"n427":{"id":"n427","loc":[-85.634177,41.943585]},"n4270":{"id":"n4270","loc":[-85.620282,41.954516]},"n4271":{"id":"n4271","loc":[-85.620282,41.954373]},"n4272":{"id":"n4272","loc":[-85.620378,41.954373]},"n4273":{"id":"n4273","loc":[-85.620379,41.954486]},"n4274":{"id":"n4274","loc":[-85.620348,41.954486]},"n4275":{"id":"n4275","loc":[-85.620348,41.954537]},"n4276":{"id":"n4276","loc":[-85.620359,41.954537]},"n4277":{"id":"n4277","loc":[-85.620463,41.95521]},"n4278":{"id":"n4278","loc":[-85.620409,41.955273]},"n4279":{"id":"n4279","loc":[-85.620205,41.955177]},"n428":{"id":"n428","loc":[-85.634354,41.943484]},"n4280":{"id":"n4280","loc":[-85.620288,41.955079]},"n4281":{"id":"n4281","loc":[-85.620379,41.955121]},"n4282":{"id":"n4282","loc":[-85.620349,41.955157]},"n4283":{"id":"n4283","loc":[-85.620083,41.955101]},"n4284":{"id":"n4284","loc":[-85.620083,41.954986]},"n4285":{"id":"n4285","loc":[-85.620016,41.954986]},"n4286":{"id":"n4286","loc":[-85.620016,41.954999]},"n4287":{"id":"n4287","loc":[-85.619941,41.954999]},"n4288":{"id":"n4288","loc":[-85.619941,41.954988]},"n4289":{"id":"n4289","loc":[-85.619815,41.954988]},"n429":{"id":"n429","loc":[-85.638577,41.943212]},"n4290":{"id":"n4290","loc":[-85.619815,41.955075]},"n4291":{"id":"n4291","loc":[-85.619948,41.955075]},"n4292":{"id":"n4292","loc":[-85.619948,41.955082]},"n4293":{"id":"n4293","loc":[-85.620004,41.955082]},"n4294":{"id":"n4294","loc":[-85.620004,41.955101]},"n4295":{"id":"n4295","loc":[-85.619293,41.955127]},"n4296":{"id":"n4296","loc":[-85.619208,41.955124]},"n4297":{"id":"n4297","loc":[-85.619212,41.955061]},"n4298":{"id":"n4298","loc":[-85.619297,41.955064]},"n4299":{"id":"n4299","loc":[-85.619068,41.954936]},"n43":{"id":"n43","loc":[-85.637047,41.943054]},"n430":{"id":"n430","loc":[-85.638576,41.943219]},"n4300":{"id":"n4300","loc":[-85.619003,41.954936]},"n4301":{"id":"n4301","loc":[-85.619004,41.955003]},"n4302":{"id":"n4302","loc":[-85.618994,41.955003]},"n4303":{"id":"n4303","loc":[-85.618994,41.955016]},"n4304":{"id":"n4304","loc":[-85.618973,41.955016]},"n4305":{"id":"n4305","loc":[-85.618973,41.955071]},"n4306":{"id":"n4306","loc":[-85.619061,41.955071]},"n4307":{"id":"n4307","loc":[-85.61906,41.955024]},"n4308":{"id":"n4308","loc":[-85.619105,41.955024]},"n4309":{"id":"n4309","loc":[-85.619105,41.954956]},"n431":{"id":"n431","loc":[-85.638653,41.943078]},"n4310":{"id":"n4310","loc":[-85.619068,41.954956]},"n4311":{"id":"n4311","loc":[-85.618294,41.954596]},"n4312":{"id":"n4312","loc":[-85.618235,41.954602]},"n4313":{"id":"n4313","loc":[-85.618222,41.954535]},"n4314":{"id":"n4314","loc":[-85.618281,41.954529]},"n4315":{"id":"n4315","loc":[-85.618593,41.954556]},"n4316":{"id":"n4316","loc":[-85.618551,41.954565]},"n4317":{"id":"n4317","loc":[-85.618545,41.954552]},"n4318":{"id":"n4318","loc":[-85.618493,41.954563]},"n4319":{"id":"n4319","loc":[-85.618449,41.954455]},"n432":{"id":"n432","loc":[-85.638654,41.943148]},"n4320":{"id":"n4320","loc":[-85.618544,41.954434]},"n4321":{"id":"n4321","loc":[-85.622545,41.950775]},"n4322":{"id":"n4322","loc":[-85.622546,41.950843]},"n4323":{"id":"n4323","loc":[-85.622503,41.950844]},"n4324":{"id":"n4324","loc":[-85.622503,41.950853]},"n4325":{"id":"n4325","loc":[-85.622479,41.950853]},"n4326":{"id":"n4326","loc":[-85.622478,41.950843]},"n4327":{"id":"n4327","loc":[-85.622425,41.950843]},"n4328":{"id":"n4328","loc":[-85.622425,41.950808]},"n4329":{"id":"n4329","loc":[-85.622366,41.950809]},"n433":{"id":"n433","loc":[-85.638387,41.943151]},"n4330":{"id":"n4330","loc":[-85.622364,41.950673]},"n4331":{"id":"n4331","loc":[-85.622448,41.950673]},"n4332":{"id":"n4332","loc":[-85.622449,41.950732]},"n4333":{"id":"n4333","loc":[-85.622479,41.950731]},"n4334":{"id":"n4334","loc":[-85.622479,41.950775]},"n4335":{"id":"n4335","loc":[-85.621909,41.950641]},"n4336":{"id":"n4336","loc":[-85.621864,41.950641]},"n4337":{"id":"n4337","loc":[-85.621865,41.950567]},"n4338":{"id":"n4338","loc":[-85.62191,41.950567]},"n4339":{"id":"n4339","loc":[-85.621787,41.950829]},"n434":{"id":"n434","loc":[-85.638386,41.94308]},"n4340":{"id":"n4340","loc":[-85.621786,41.950775]},"n4341":{"id":"n4341","loc":[-85.621588,41.950776]},"n4342":{"id":"n4342","loc":[-85.621589,41.950848]},"n4343":{"id":"n4343","loc":[-85.621737,41.950847]},"n4344":{"id":"n4344","loc":[-85.621737,41.950829]},"n4345":{"id":"n4345","loc":[-85.621509,41.950846]},"n4346":{"id":"n4346","loc":[-85.621399,41.950846]},"n4347":{"id":"n4347","loc":[-85.621398,41.95073]},"n4348":{"id":"n4348","loc":[-85.621509,41.95073]},"n4349":{"id":"n4349","loc":[-85.621217,41.950841]},"n435":{"id":"n435","loc":[-85.634427,41.943533]},"n4350":{"id":"n4350","loc":[-85.6211,41.95084]},"n4351":{"id":"n4351","loc":[-85.6211,41.950777]},"n4352":{"id":"n4352","loc":[-85.621218,41.950778]},"n4353":{"id":"n4353","loc":[-85.621055,41.950764]},"n4354":{"id":"n4354","loc":[-85.621054,41.950826]},"n4355":{"id":"n4355","loc":[-85.620988,41.950826]},"n4356":{"id":"n4356","loc":[-85.620988,41.950843]},"n4357":{"id":"n4357","loc":[-85.620842,41.950843]},"n4358":{"id":"n4358","loc":[-85.620842,41.950764]},"n4359":{"id":"n4359","loc":[-85.620825,41.950922]},"n436":{"id":"n436","loc":[-85.63428,41.943229]},"n4360":{"id":"n4360","loc":[-85.620824,41.950553]},"n4361":{"id":"n4361","loc":[-85.620543,41.950771]},"n4362":{"id":"n4362","loc":[-85.620431,41.950772]},"n4363":{"id":"n4363","loc":[-85.62043,41.950585]},"n4364":{"id":"n4364","loc":[-85.620542,41.950585]},"n4365":{"id":"n4365","loc":[-85.62068,41.950505]},"n4366":{"id":"n4366","loc":[-85.620681,41.950552]},"n4367":{"id":"n4367","loc":[-85.620589,41.950553]},"n4368":{"id":"n4368","loc":[-85.620588,41.950506]},"n4369":{"id":"n4369","loc":[-85.620539,41.950407]},"n437":{"id":"n437","loc":[-85.634499,41.943461]},"n4370":{"id":"n4370","loc":[-85.62054,41.950504]},"n4371":{"id":"n4371","loc":[-85.620416,41.950504]},"n4372":{"id":"n4372","loc":[-85.620416,41.950408]},"n4373":{"id":"n4373","loc":[-85.620742,41.95038]},"n4374":{"id":"n4374","loc":[-85.620527,41.95038]},"n4375":{"id":"n4375","loc":[-85.620528,41.950408]},"n4376":{"id":"n4376","loc":[-85.622449,41.950373]},"n4377":{"id":"n4377","loc":[-85.622452,41.950397]},"n4378":{"id":"n4378","loc":[-85.622336,41.950404]},"n4379":{"id":"n4379","loc":[-85.622333,41.950379]},"n438":{"id":"n438","loc":[-85.634514,41.943486]},"n4380":{"id":"n4380","loc":[-85.622263,41.950324]},"n4381":{"id":"n4381","loc":[-85.622261,41.950256]},"n4382":{"id":"n4382","loc":[-85.62236,41.950254]},"n4383":{"id":"n4383","loc":[-85.62236,41.95027]},"n4384":{"id":"n4384","loc":[-85.622402,41.950281]},"n4385":{"id":"n4385","loc":[-85.622403,41.9503]},"n4386":{"id":"n4386","loc":[-85.622439,41.950299]},"n4387":{"id":"n4387","loc":[-85.62244,41.950334]},"n4388":{"id":"n4388","loc":[-85.622414,41.950335]},"n4389":{"id":"n4389","loc":[-85.622414,41.95036]},"n439":{"id":"n439","loc":[-85.63452,41.943511]},"n4390":{"id":"n4390","loc":[-85.62231,41.950362]},"n4391":{"id":"n4391","loc":[-85.622309,41.950323]},"n4392":{"id":"n4392","loc":[-85.622015,41.950539]},"n4393":{"id":"n4393","loc":[-85.621909,41.95054]},"n4394":{"id":"n4394","loc":[-85.621909,41.950472]},"n4395":{"id":"n4395","loc":[-85.622015,41.950471]},"n4396":{"id":"n4396","loc":[-85.62199,41.950439]},"n4397":{"id":"n4397","loc":[-85.621956,41.95044]},"n4398":{"id":"n4398","loc":[-85.621955,41.950405]},"n4399":{"id":"n4399","loc":[-85.621988,41.950404]},"n44":{"id":"n44","loc":[-85.636799,41.943055]},"n440":{"id":"n440","loc":[-85.63451,41.943534]},"n4400":{"id":"n4400","loc":[-85.621668,41.950418]},"n4401":{"id":"n4401","loc":[-85.621667,41.950343]},"n4402":{"id":"n4402","loc":[-85.621745,41.950342]},"n4403":{"id":"n4403","loc":[-85.621744,41.950306]},"n4404":{"id":"n4404","loc":[-85.621764,41.950306]},"n4405":{"id":"n4405","loc":[-85.621763,41.950254]},"n4406":{"id":"n4406","loc":[-85.621861,41.950253]},"n4407":{"id":"n4407","loc":[-85.621861,41.950274]},"n4408":{"id":"n4408","loc":[-85.621896,41.950273]},"n4409":{"id":"n4409","loc":[-85.621898,41.950389]},"n441":{"id":"n441","loc":[-85.634483,41.943556]},"n4410":{"id":"n4410","loc":[-85.621843,41.95039]},"n4411":{"id":"n4411","loc":[-85.621843,41.950425]},"n4412":{"id":"n4412","loc":[-85.621789,41.950425]},"n4413":{"id":"n4413","loc":[-85.621789,41.950386]},"n4414":{"id":"n4414","loc":[-85.621752,41.950387]},"n4415":{"id":"n4415","loc":[-85.621753,41.950417]},"n4416":{"id":"n4416","loc":[-85.621556,41.950562]},"n4417":{"id":"n4417","loc":[-85.621552,41.950217]},"n4418":{"id":"n4418","loc":[-85.621788,41.950562]},"n4419":{"id":"n4419","loc":[-85.621155,41.950562]},"n442":{"id":"n442","loc":[-85.63419,41.943713]},"n4420":{"id":"n4420","loc":[-85.622473,41.950551]},"n4421":{"id":"n4421","loc":[-85.622043,41.950551]},"n4422":{"id":"n4422","loc":[-85.62142,41.950454]},"n4423":{"id":"n4423","loc":[-85.621315,41.950455]},"n4424":{"id":"n4424","loc":[-85.621313,41.950311]},"n4425":{"id":"n4425","loc":[-85.621388,41.950311]},"n4426":{"id":"n4426","loc":[-85.621387,41.950261]},"n4427":{"id":"n4427","loc":[-85.621468,41.95026]},"n4428":{"id":"n4428","loc":[-85.621468,41.950271]},"n4429":{"id":"n4429","loc":[-85.621503,41.95027]},"n443":{"id":"n443","loc":[-85.634462,41.943294]},"n4430":{"id":"n4430","loc":[-85.621505,41.950353]},"n4431":{"id":"n4431","loc":[-85.621483,41.950354]},"n4432":{"id":"n4432","loc":[-85.621483,41.950392]},"n4433":{"id":"n4433","loc":[-85.621419,41.950393]},"n4434":{"id":"n4434","loc":[-85.621213,41.95039]},"n4435":{"id":"n4435","loc":[-85.621127,41.950391]},"n4436":{"id":"n4436","loc":[-85.621126,41.950357]},"n4437":{"id":"n4437","loc":[-85.621094,41.950357]},"n4438":{"id":"n4438","loc":[-85.621094,41.950391]},"n4439":{"id":"n4439","loc":[-85.620977,41.950392]},"n444":{"id":"n444","loc":[-85.634298,41.943389]},"n4440":{"id":"n4440","loc":[-85.620975,41.950278]},"n4441":{"id":"n4441","loc":[-85.621087,41.950277]},"n4442":{"id":"n4442","loc":[-85.621088,41.950331]},"n4443":{"id":"n4443","loc":[-85.621211,41.950312]},"n4444":{"id":"n4444","loc":[-85.621104,41.950313]},"n4445":{"id":"n4445","loc":[-85.621105,41.950331]},"n4446":{"id":"n4446","loc":[-85.620706,41.950328]},"n4447":{"id":"n4447","loc":[-85.620606,41.950327]},"n4448":{"id":"n4448","loc":[-85.620607,41.950261]},"n4449":{"id":"n4449","loc":[-85.620707,41.950262]},"n445":{"id":"n445","loc":[-85.634527,41.943623]},"n4450":{"id":"n4450","loc":[-85.620599,41.950336]},"n4451":{"id":"n4451","loc":[-85.620559,41.950336]},"n4452":{"id":"n4452","loc":[-85.620559,41.950299]},"n4453":{"id":"n4453","loc":[-85.620599,41.950299]},"n4454":{"id":"n4454","loc":[-85.620545,41.950357]},"n4455":{"id":"n4455","loc":[-85.620418,41.950357]},"n4456":{"id":"n4456","loc":[-85.620417,41.950257]},"n4457":{"id":"n4457","loc":[-85.620544,41.950256]},"n4458":{"id":"n4458","loc":[-85.620246,41.950131],"tags":{"highway":"crossing"}},"n4459":{"id":"n4459","loc":[-85.620252,41.950956]},"n446":{"id":"n446","loc":[-85.634608,41.943577]},"n4460":{"id":"n4460","loc":[-85.620245,41.950179]},"n4461":{"id":"n4461","loc":[-85.620246,41.950088]},"n4462":{"id":"n4462","loc":[-85.620251,41.950885]},"n4463":{"id":"n4463","loc":[-85.620103,41.950884],"tags":{"crossing":"zebra","highway":"crossing"}},"n4464":{"id":"n4464","loc":[-85.619992,41.950884]},"n4465":{"id":"n4465","loc":[-85.619704,41.951008]},"n4466":{"id":"n4466","loc":[-85.619599,41.951122]},"n4467":{"id":"n4467","loc":[-85.619264,41.951486]},"n4468":{"id":"n4468","loc":[-85.619179,41.951573],"tags":{"highway":"crossing"}},"n4469":{"id":"n4469","loc":[-85.620251,41.950999],"tags":{"highway":"crossing"}},"n447":{"id":"n447","loc":[-85.634555,41.943531]},"n4470":{"id":"n4470","loc":[-85.620249,41.951066]},"n4471":{"id":"n4471","loc":[-85.620256,41.951374]},"n4472":{"id":"n4472","loc":[-85.620249,41.951389]},"n4473":{"id":"n4473","loc":[-85.620249,41.951407]},"n4474":{"id":"n4474","loc":[-85.620255,41.951423]},"n4475":{"id":"n4475","loc":[-85.62026,41.951853]},"n4476":{"id":"n4476","loc":[-85.620262,41.951894],"tags":{"highway":"crossing"}},"n4477":{"id":"n4477","loc":[-85.620265,41.951957]},"n4478":{"id":"n4478","loc":[-85.620262,41.952135]},"n4479":{"id":"n4479","loc":[-85.620241,41.952424]},"n448":{"id":"n448","loc":[-85.634555,41.943482]},"n4480":{"id":"n4480","loc":[-85.620213,41.952583]},"n4481":{"id":"n4481","loc":[-85.620158,41.952754]},"n4482":{"id":"n4482","loc":[-85.620065,41.952942]},"n4483":{"id":"n4483","loc":[-85.619753,41.953439]},"n4484":{"id":"n4484","loc":[-85.619605,41.953626]},"n4485":{"id":"n4485","loc":[-85.619381,41.953834]},"n4486":{"id":"n4486","loc":[-85.619069,41.954066]},"n4487":{"id":"n4487","loc":[-85.618674,41.95429]},"n4488":{"id":"n4488","loc":[-85.621816,41.952389]},"n4489":{"id":"n4489","loc":[-85.6217,41.952386]},"n449":{"id":"n449","loc":[-85.634509,41.943427]},"n4490":{"id":"n4490","loc":[-85.621705,41.952306]},"n4491":{"id":"n4491","loc":[-85.621821,41.95231]},"n4492":{"id":"n4492","loc":[-85.621819,41.952272]},"n4493":{"id":"n4493","loc":[-85.621778,41.952272]},"n4494":{"id":"n4494","loc":[-85.621778,41.952199]},"n4495":{"id":"n4495","loc":[-85.621818,41.952199]},"n4496":{"id":"n4496","loc":[-85.621754,41.952281]},"n4497":{"id":"n4497","loc":[-85.621701,41.95228]},"n4498":{"id":"n4498","loc":[-85.621702,41.952197]},"n4499":{"id":"n4499","loc":[-85.621755,41.952197]},"n45":{"id":"n45","loc":[-85.636791,41.942792]},"n450":{"id":"n450","loc":[-85.63453,41.943365]},"n4500":{"id":"n4500","loc":[-85.628201,41.954694],"tags":{"highway":"stop","stop":"all","direction":"forward"}},"n4501":{"id":"n4501","loc":[-85.627921,41.954783],"tags":{"highway":"stop","stop":"all","direction":"backward"}},"n4502":{"id":"n4502","loc":[-85.62775,41.954696],"tags":{"highway":"stop","stop":"all","direction":"backward"}},"n4503":{"id":"n4503","loc":[-85.628046,41.954591],"tags":{"highway":"stop","stop":"all","direction":"forward"}},"n4504":{"id":"n4504","loc":[-85.631074,41.957428],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4505":{"id":"n4505","loc":[-85.630768,41.957429],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4506":{"id":"n4506","loc":[-85.629888,41.957432],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4507":{"id":"n4507","loc":[-85.629565,41.957433],"tags":{"highway":"stop","stop":"minor","direction":"forward"}},"n4508":{"id":"n4508","loc":[-85.629559,41.957343]},"n4509":{"id":"n4509","loc":[-85.628723,41.95735]},"n451":{"id":"n451","loc":[-85.634356,41.943468]},"n4510":{"id":"n4510","loc":[-85.62842,41.957515]},"n4511":{"id":"n4511","loc":[-85.627561,41.957525]},"n4512":{"id":"n4512","loc":[-85.630323,41.957508]},"n4513":{"id":"n4513","loc":[-85.630811,41.957506]},"n4514":{"id":"n4514","loc":[-85.630839,41.960874]},"n4515":{"id":"n4515","loc":[-85.631035,41.957506]},"n4516":{"id":"n4516","loc":[-85.632027,41.9575]},"n4517":{"id":"n4517","loc":[-85.631038,41.958066]},"n4518":{"id":"n4518","loc":[-85.630787,41.954769]},"n4519":{"id":"n4519","loc":[-85.630806,41.957342]},"n452":{"id":"n452","loc":[-85.634123,41.943596]},"n4520":{"id":"n4520","loc":[-85.630809,41.957428],"tags":{"highway":"crossing"}},"n4521":{"id":"n4521","loc":[-85.630912,41.957506],"tags":{"highway":"crossing"}},"n4522":{"id":"n4522","loc":[-85.631033,41.957428],"tags":{"highway":"crossing"}},"n4523":{"id":"n4523","loc":[-85.631032,41.957341]},"n4524":{"id":"n4524","loc":[-85.63091,41.957341],"tags":{"highway":"crossing"}},"n4525":{"id":"n4525","loc":[-85.631027,41.95597]},"n4526":{"id":"n4526","loc":[-85.631027,41.955913],"tags":{"highway":"crossing"}},"n4527":{"id":"n4527","loc":[-85.631025,41.955873]},"n4528":{"id":"n4528","loc":[-85.631073,41.955913],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4529":{"id":"n4529","loc":[-85.631007,41.954766]},"n453":{"id":"n453","loc":[-85.634709,41.943926]},"n4530":{"id":"n4530","loc":[-85.630881,41.954768],"tags":{"highway":"crossing"}},"n4531":{"id":"n4531","loc":[-85.628022,41.954776]},"n4532":{"id":"n4532","loc":[-85.627385,41.95584]},"n4533":{"id":"n4533","loc":[-85.627329,41.955937]},"n4534":{"id":"n4534","loc":[-85.626583,41.957153]},"n4535":{"id":"n4535","loc":[-85.629675,41.954564],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4536":{"id":"n4536","loc":[-85.630881,41.954806],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4537":{"id":"n4537","loc":[-85.630879,41.954564],"tags":{"highway":"stop","stop":"minor","direction":"forward"}},"n4538":{"id":"n4538","loc":[-85.630784,41.954682],"tags":{"highway":"crossing"}},"n4539":{"id":"n4539","loc":[-85.63078,41.954595]},"n454":{"id":"n454","loc":[-85.63525,41.943855]},"n4540":{"id":"n4540","loc":[-85.630879,41.954595],"tags":{"highway":"crossing"}},"n4541":{"id":"n4541","loc":[-85.631004,41.954594]},"n4542":{"id":"n4542","loc":[-85.631006,41.954681],"tags":{"highway":"crossing"}},"n4543":{"id":"n4543","loc":[-85.631045,41.959036],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4544":{"id":"n4544","loc":[-85.632071,41.959029],"tags":{"highway":"stop","stop":"minor","direction":"forward"}},"n4545":{"id":"n4545","loc":[-85.632257,41.959027],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4546":{"id":"n4546","loc":[-85.631966,41.957427],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4547":{"id":"n4547","loc":[-85.632297,41.957426],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4548":{"id":"n4548","loc":[-85.631976,41.955911],"tags":{"highway":"give_way","direction":"forward"}},"n4549":{"id":"n4549","loc":[-85.632272,41.955911],"tags":{"highway":"give_way","direction":"backward"}},"n455":{"id":"n455","loc":[-85.635224,41.943869]},"n4550":{"id":"n4550","loc":[-85.632097,41.954805],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4551":{"id":"n4551","loc":[-85.632094,41.954566],"tags":{"highway":"stop","stop":"minor","direction":"forward"}},"n4552":{"id":"n4552","loc":[-85.626519,41.957256]},"n4553":{"id":"n4553","loc":[-85.625334,41.959165]},"n4554":{"id":"n4554","loc":[-85.626483,41.95806]},"n4555":{"id":"n4555","loc":[-85.626481,41.958175]},"n4556":{"id":"n4556","loc":[-85.626412,41.958174]},"n4557":{"id":"n4557","loc":[-85.626412,41.958202]},"n4558":{"id":"n4558","loc":[-85.62628,41.958201]},"n4559":{"id":"n4559","loc":[-85.626283,41.958057]},"n456":{"id":"n456","loc":[-85.638854,41.943104]},"n4560":{"id":"n4560","loc":[-85.622763,41.95109],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4561":{"id":"n4561","loc":[-85.622858,41.950876],"tags":{"emergency":"fire_hydrant"}},"n4562":{"id":"n4562","loc":[-85.624073,41.950393]},"n4563":{"id":"n4563","loc":[-85.624077,41.950924]},"n4564":{"id":"n4564","loc":[-85.624599,41.950984],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4565":{"id":"n4565","loc":[-85.624831,41.95119],"tags":{"emergency":"fire_hydrant"}},"n4566":{"id":"n4566","loc":[-85.624437,41.952568],"tags":{"emergency":"fire_hydrant"}},"n4567":{"id":"n4567","loc":[-85.624077,41.954606],"tags":{"emergency":"fire_hydrant"}},"n4568":{"id":"n4568","loc":[-85.624263,41.954888]},"n4569":{"id":"n4569","loc":[-85.624206,41.954919]},"n457":{"id":"n457","loc":[-85.635186,41.943901]},"n4570":{"id":"n4570","loc":[-85.624154,41.954865]},"n4571":{"id":"n4571","loc":[-85.624212,41.954835]},"n4572":{"id":"n4572","loc":[-85.622442,41.954401],"tags":{"emergency":"fire_hydrant"}},"n4573":{"id":"n4573","loc":[-85.619751,41.954658],"tags":{"emergency":"fire_hydrant"}},"n4574":{"id":"n4574","loc":[-85.617785,41.954534]},"n4575":{"id":"n4575","loc":[-85.617416,41.954721]},"n4576":{"id":"n4576","loc":[-85.617662,41.95474]},"n4577":{"id":"n4577","loc":[-85.618014,41.954717]},"n4578":{"id":"n4578","loc":[-85.617886,41.954671]},"n4579":{"id":"n4579","loc":[-85.617831,41.954612]},"n458":{"id":"n458","loc":[-85.635162,41.943917]},"n4580":{"id":"n4580","loc":[-85.617968,41.954752]},"n4581":{"id":"n4581","loc":[-85.617815,41.954752]},"n4582":{"id":"n4582","loc":[-85.617938,41.954695]},"n4583":{"id":"n4583","loc":[-85.617856,41.954642],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4584":{"id":"n4584","loc":[-85.619116,41.954164],"tags":{"man_made":"flagpole"}},"n4585":{"id":"n4585","loc":[-85.619569,41.953255],"tags":{"emergency":"fire_hydrant"}},"n4586":{"id":"n4586","loc":[-85.620352,41.951894],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4587":{"id":"n4587","loc":[-85.620485,41.951948],"tags":{"emergency":"fire_hydrant"}},"n4588":{"id":"n4588","loc":[-85.620316,41.950999],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4589":{"id":"n4589","loc":[-85.620311,41.950131],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n459":{"id":"n459","loc":[-85.634856,41.943905]},"n4590":{"id":"n4590","loc":[-85.620374,41.95018],"tags":{"emergency":"fire_hydrant"}},"n4591":{"id":"n4591","loc":[-85.620301,41.949239],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4592":{"id":"n4592","loc":[-85.620278,41.947443],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4593":{"id":"n4593","loc":[-85.619844,41.947444],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4594":{"id":"n4594","loc":[-85.620191,41.947352],"tags":{"emergency":"fire_hydrant"}},"n4595":{"id":"n4595","loc":[-85.622819,41.947493],"tags":{"emergency":"fire_hydrant"}},"n4596":{"id":"n4596","loc":[-85.622744,41.947541],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4597":{"id":"n4597","loc":[-85.622739,41.947316],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4598":{"id":"n4598","loc":[-85.622909,41.948333],"tags":{"highway":"give_way"}},"n4599":{"id":"n4599","loc":[-85.622593,41.948333],"tags":{"highway":"give_way"}},"n46":{"id":"n46","loc":[-85.637131,41.94307]},"n460":{"id":"n460","loc":[-85.634811,41.944007]},"n4600":{"id":"n4600","loc":[-85.622835,41.948387],"tags":{"emergency":"fire_hydrant"}},"n4601":{"id":"n4601","loc":[-85.622768,41.949125],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4602":{"id":"n4602","loc":[-85.622769,41.949325],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4603":{"id":"n4603","loc":[-85.622837,41.949329],"tags":{"emergency":"fire_hydrant"}},"n4604":{"id":"n4604","loc":[-85.622614,41.950113],"tags":{"highway":"give_way","direction":"forward"}},"n4605":{"id":"n4605","loc":[-85.624777,41.949219],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4606":{"id":"n4606","loc":[-85.624849,41.949106],"tags":{"emergency":"fire_hydrant"}},"n4607":{"id":"n4607","loc":[-85.624858,41.950119],"tags":{"emergency":"fire_hydrant"}},"n4608":{"id":"n4608","loc":[-85.624752,41.948334],"tags":{"highway":"give_way"}},"n4609":{"id":"n4609","loc":[-85.624845,41.948422],"tags":{"emergency":"fire_hydrant"}},"n461":{"id":"n461","loc":[-85.634987,41.943112]},"n4610":{"id":"n4610","loc":[-85.62484,41.947539],"tags":{"emergency":"fire_hydrant"}},"n4611":{"id":"n4611","loc":[-85.62476,41.947428],"tags":{"highway":"stop","stop":"minor","direction":"forward"}},"n4612":{"id":"n4612","loc":[-85.620286,41.950926]},"n4613":{"id":"n4613","loc":[-85.618237,41.950963]},"n4614":{"id":"n4614","loc":[-85.618107,41.950876]},"n4615":{"id":"n4615","loc":[-85.618131,41.950393]},"n4616":{"id":"n4616","loc":[-85.618232,41.949913]},"n4617":{"id":"n4617","loc":[-85.619138,41.950212]},"n4618":{"id":"n4618","loc":[-85.619299,41.950388]},"n4619":{"id":"n4619","loc":[-85.619306,41.950897]},"n462":{"id":"n462","loc":[-85.634698,41.943194]},"n4620":{"id":"n4620","loc":[-85.619155,41.950958]},"n4621":{"id":"n4621","loc":[-85.620079,41.947715]},"n4622":{"id":"n4622","loc":[-85.619674,41.947728]},"n4623":{"id":"n4623","loc":[-85.619634,41.947735]},"n4624":{"id":"n4624","loc":[-85.619587,41.947756],"tags":{"barrier":"gate"}},"n4625":{"id":"n4625","loc":[-85.61953,41.947796]},"n4626":{"id":"n4626","loc":[-85.619475,41.947847]},"n4627":{"id":"n4627","loc":[-85.619433,41.947903]},"n4628":{"id":"n4628","loc":[-85.619402,41.947982]},"n4629":{"id":"n4629","loc":[-85.619394,41.948043]},"n463":{"id":"n463","loc":[-85.634632,41.943219]},"n4630":{"id":"n4630","loc":[-85.619395,41.948476]},"n4631":{"id":"n4631","loc":[-85.618367,41.947452]},"n4632":{"id":"n4632","loc":[-85.618371,41.947567],"tags":{"barrier":"gate"}},"n4633":{"id":"n4633","loc":[-85.618341,41.947622]},"n4634":{"id":"n4634","loc":[-85.618138,41.94773]},"n4635":{"id":"n4635","loc":[-85.618078,41.947814]},"n4636":{"id":"n4636","loc":[-85.618072,41.948009]},"n4637":{"id":"n4637","loc":[-85.618269,41.947666]},"n4638":{"id":"n4638","loc":[-85.618099,41.947765]},"n4639":{"id":"n4639","loc":[-85.618378,41.954453]},"n464":{"id":"n464","loc":[-85.63459,41.943239]},"n4640":{"id":"n4640","loc":[-85.618198,41.95453]},"n4641":{"id":"n4641","loc":[-85.618212,41.954623]},"n4642":{"id":"n4642","loc":[-85.635211,41.943103],"tags":{"leisure":"picnic_table"}},"n4643":{"id":"n4643","loc":[-85.635345,41.943448],"tags":{"leisure":"picnic_table"}},"n4644":{"id":"n4644","loc":[-85.635901,41.943353],"tags":{"amenity":"bench"}},"n4645":{"id":"n4645","loc":[-85.635815,41.942638],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4646":{"id":"n4646","loc":[-85.635355,41.942044],"tags":{"leisure":"picnic_table"}},"n4647":{"id":"n4647","loc":[-85.635206,41.942045],"tags":{"leisure":"picnic_table"}},"n4648":{"id":"n4648","loc":[-85.63504,41.941992],"tags":{"leisure":"picnic_table"}},"n4649":{"id":"n4649","loc":[-85.635185,41.942001]},"n465":{"id":"n465","loc":[-85.634555,41.943263]},"n4650":{"id":"n4650","loc":[-85.635176,41.942021]},"n4651":{"id":"n4651","loc":[-85.635127,41.942008]},"n4652":{"id":"n4652","loc":[-85.635136,41.941988]},"n4653":{"id":"n4653","loc":[-85.635,41.941709],"tags":{"emergency":"fire_hydrant"}},"n4654":{"id":"n4654","loc":[-85.634893,41.941801]},"n4655":{"id":"n4655","loc":[-85.634937,41.941843]},"n4656":{"id":"n4656","loc":[-85.634963,41.941859]},"n4657":{"id":"n4657","loc":[-85.635027,41.941904]},"n4658":{"id":"n4658","loc":[-85.63494,41.94187]},"n4659":{"id":"n4659","loc":[-85.634951,41.941871]},"n466":{"id":"n466","loc":[-85.634526,41.943289]},"n4660":{"id":"n4660","loc":[-85.634753,41.941701],"tags":{"amenity":"drinking_water"}},"n4661":{"id":"n4661","loc":[-85.634717,41.941804],"tags":{"amenity":"bench"}},"n4662":{"id":"n4662","loc":[-85.634554,41.941883],"tags":{"amenity":"bench"}},"n4663":{"id":"n4663","loc":[-85.635002,41.941579],"tags":{"amenity":"fountain"}},"n4664":{"id":"n4664","loc":[-85.635258,41.94188],"tags":{"amenity":"waste_basket"}},"n4665":{"id":"n4665","loc":[-85.635262,41.941581],"tags":{"amenity":"bench"}},"n4666":{"id":"n4666","loc":[-85.635319,41.941744],"tags":{"amenity":"bench"}},"n4667":{"id":"n4667","loc":[-85.634702,41.941473],"tags":{"amenity":"waste_basket"}},"n4668":{"id":"n4668","loc":[-85.633981,41.941966],"tags":{"amenity":"bench"}},"n4669":{"id":"n4669","loc":[-85.63388,41.941743]},"n467":{"id":"n467","loc":[-85.635163,41.944985]},"n4670":{"id":"n4670","loc":[-85.633746,41.941741]},"n4671":{"id":"n4671","loc":[-85.633749,41.941664]},"n4672":{"id":"n4672","loc":[-85.633883,41.941667]},"n4673":{"id":"n4673","loc":[-85.634283,41.941183],"tags":{"leisure":"picnic_table"}},"n4674":{"id":"n4674","loc":[-85.634046,41.941102],"tags":{"amenity":"bbq"}},"n4675":{"id":"n4675","loc":[-85.63401,41.941093],"tags":{"amenity":"bbq"}},"n4676":{"id":"n4676","loc":[-85.633408,41.940862],"tags":{"amenity":"bench"}},"n4677":{"id":"n4677","loc":[-85.633359,41.940651],"tags":{"amenity":"bench"}},"n4678":{"id":"n4678","loc":[-85.634109,41.940831]},"n4679":{"id":"n4679","loc":[-85.63396,41.940867]},"n468":{"id":"n468","loc":[-85.635095,41.945035]},"n4680":{"id":"n4680","loc":[-85.633816,41.940913]},"n4681":{"id":"n4681","loc":[-85.633237,41.940455]},"n4682":{"id":"n4682","loc":[-85.634453,41.940025],"tags":{"emergency":"fire_hydrant"}},"n4683":{"id":"n4683","loc":[-85.635692,41.940218],"tags":{"emergency":"fire_hydrant"}},"n4684":{"id":"n4684","loc":[-85.635566,41.940102],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4685":{"id":"n4685","loc":[-85.635961,41.940125],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4686":{"id":"n4686","loc":[-85.635883,41.94012],"tags":{"crossing":"zebra","highway":"crossing"}},"n4687":{"id":"n4687","loc":[-85.635883,41.94006]},"n4688":{"id":"n4688","loc":[-85.635768,41.940051],"tags":{"crossing":"zebra","highway":"crossing"}},"n4689":{"id":"n4689","loc":[-85.635669,41.940043]},"n469":{"id":"n469","loc":[-85.634269,41.944431]},"n4690":{"id":"n4690","loc":[-85.635661,41.940107],"tags":{"crossing":"zebra","highway":"crossing"}},"n4691":{"id":"n4691","loc":[-85.635424,41.941005],"tags":{"amenity":"fountain"}},"n4692":{"id":"n4692","loc":[-85.635542,41.941371],"tags":{"amenity":"bench"}},"n4693":{"id":"n4693","loc":[-85.635709,41.941341],"tags":{"emergency":"fire_hydrant"}},"n4694":{"id":"n4694","loc":[-85.637038,41.942513],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4695":{"id":"n4695","loc":[-85.637174,41.941354],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4696":{"id":"n4696","loc":[-85.637091,41.941273],"tags":{"emergency":"fire_hydrant"}},"n4697":{"id":"n4697","loc":[-85.638058,41.941346],"tags":{"highway":"give_way","direction":"forward"}},"n4698":{"id":"n4698","loc":[-85.638359,41.941344],"tags":{"highway":"give_way","direction":"backward"}},"n4699":{"id":"n4699","loc":[-85.638288,41.941236],"tags":{"emergency":"fire_hydrant"}},"n47":{"id":"n47","loc":[-85.636693,41.943073]},"n470":{"id":"n470","loc":[-85.634352,41.944376]},"n4700":{"id":"n4700","loc":[-85.63935,41.94128],"tags":{"emergency":"fire_hydrant"}},"n4701":{"id":"n4701","loc":[-85.639277,41.941337],"tags":{"highway":"give_way","direction":"forward"}},"n4702":{"id":"n4702","loc":[-85.639548,41.941334],"tags":{"highway":"give_way","direction":"backward"}},"n4703":{"id":"n4703","loc":[-85.642191,41.940039]},"n4704":{"id":"n4704","loc":[-85.640585,41.941263],"tags":{"emergency":"fire_hydrant"}},"n4705":{"id":"n4705","loc":[-85.64049,41.941327],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4706":{"id":"n4706","loc":[-85.640803,41.941324],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4707":{"id":"n4707","loc":[-85.641717,41.941317],"tags":{"highway":"stop","direction":"forward","stop":"all"}},"n4708":{"id":"n4708","loc":[-85.641846,41.941415],"tags":{"highway":"stop","direction":"backward","stop":"all"}},"n4709":{"id":"n4709","loc":[-85.641756,41.941392],"tags":{"emergency":"fire_hydrant"}},"n471":{"id":"n471","loc":[-85.634747,41.944561],"tags":{"railway":"crossing"}},"n4710":{"id":"n4710","loc":[-85.642014,41.941313],"tags":{"highway":"stop","direction":"forward","stop":"all"}},"n4711":{"id":"n4711","loc":[-85.641854,41.942455],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4712":{"id":"n4712","loc":[-85.641859,41.942739],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4713":{"id":"n4713","loc":[-85.640754,41.942707],"tags":{"emergency":"fire_hydrant"}},"n4714":{"id":"n4714","loc":[-85.640669,41.942716],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4715":{"id":"n4715","loc":[-85.640664,41.942478],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4716":{"id":"n4716","loc":[-85.63964,41.94274],"tags":{"man_made":"flagpole"}},"n4717":{"id":"n4717","loc":[-85.639455,41.942731],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4718":{"id":"n4718","loc":[-85.63945,41.942492],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4719":{"id":"n4719","loc":[-85.639527,41.942505],"tags":{"emergency":"fire_hydrant"}},"n472":{"id":"n472","loc":[-85.634667,41.944613]},"n4720":{"id":"n4720","loc":[-85.638238,41.942745],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4721":{"id":"n4721","loc":[-85.638233,41.942511],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4722":{"id":"n4722","loc":[-85.638018,41.94299],"tags":{"amenity":"waste_disposal"}},"n4723":{"id":"n4723","loc":[-85.637918,41.944152],"tags":{"amenity":"waste_basket"}},"n4724":{"id":"n4724","loc":[-85.635902,41.943291],"tags":{"leisure":"picnic_table"}},"n4725":{"id":"n4725","loc":[-85.63704,41.942741],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4726":{"id":"n4726","loc":[-85.633467,41.943818],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4727":{"id":"n4727","loc":[-85.633987,41.943531],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4728":{"id":"n4728","loc":[-85.632154,41.943539],"tags":{"emergency":"fire_hydrant"}},"n4729":{"id":"n4729","loc":[-85.633567,41.944641],"tags":{"amenity":"bench"}},"n473":{"id":"n473","loc":[-85.634161,41.944371]},"n4730":{"id":"n4730","loc":[-85.633127,41.944574],"tags":{"amenity":"bench"}},"n4731":{"id":"n4731","loc":[-85.633439,41.944871],"tags":{"amenity":"bench"}},"n4732":{"id":"n4732","loc":[-85.633676,41.944799],"tags":{"amenity":"waste_basket"}},"n4733":{"id":"n4733","loc":[-85.633466,41.944862],"tags":{"amenity":"waste_basket"}},"n4734":{"id":"n4734","loc":[-85.633451,41.944847],"tags":{"emergency":"fire_hydrant"}},"n4735":{"id":"n4735","loc":[-85.634202,41.945543],"tags":{"amenity":"waste_basket"}},"n4736":{"id":"n4736","loc":[-85.634652,41.945472],"tags":{"leisure":"picnic_table"}},"n4737":{"id":"n4737","loc":[-85.6347,41.945445],"tags":{"leisure":"picnic_table"}},"n4738":{"id":"n4738","loc":[-85.634646,41.945662],"tags":{"emergency":"fire_hydrant"}},"n4739":{"id":"n4739","loc":[-85.634673,41.945687],"tags":{"amenity":"waste_basket"}},"n474":{"id":"n474","loc":[-85.633861,41.944117]},"n4740":{"id":"n4740","loc":[-85.63449,41.945827],"tags":{"amenity":"clock","display":"analog"}},"n4741":{"id":"n4741","loc":[-85.63481,41.946056],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4742":{"id":"n4742","loc":[-85.634814,41.946176],"tags":{"amenity":"post_box"}},"n4743":{"id":"n4743","loc":[-85.638744,41.945328]},"n4744":{"id":"n4744","loc":[-85.63867,41.945228],"tags":{"amenity":"bench"}},"n4745":{"id":"n4745","loc":[-85.639487,41.945042],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4746":{"id":"n4746","loc":[-85.639635,41.94387],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4747":{"id":"n4747","loc":[-85.639549,41.943756],"tags":{"emergency":"fire_hydrant"}},"n4748":{"id":"n4748","loc":[-85.64055,41.943862],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4749":{"id":"n4749","loc":[-85.640864,41.943859],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n475":{"id":"n475","loc":[-85.633906,41.943535]},"n4750":{"id":"n4750","loc":[-85.640718,41.945022],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4751":{"id":"n4751","loc":[-85.640664,41.945076],"tags":{"emergency":"fire_hydrant"}},"n4752":{"id":"n4752","loc":[-85.641913,41.94502],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4753":{"id":"n4753","loc":[-85.641838,41.945076],"tags":{"emergency":"fire_hydrant"}},"n4754":{"id":"n4754","loc":[-85.642045,41.94385],"tags":{"highway":"give_way","direction":"backward"}},"n4755":{"id":"n4755","loc":[-85.641738,41.943852],"tags":{"highway":"give_way","direction":"forward"}},"n4756":{"id":"n4756","loc":[-85.642928,41.943843],"tags":{"highway":"stop","stop":"minor","direction":"forward"}},"n4757":{"id":"n4757","loc":[-85.64305,41.943902],"tags":{"emergency":"fire_hydrant"}},"n4758":{"id":"n4758","loc":[-85.642986,41.945105],"tags":{"highway":"stop","direction":"backward","stop":"all"}},"n4759":{"id":"n4759","loc":[-85.643136,41.94502],"tags":{"highway":"stop","stop":"all","direction":"forward"}},"n476":{"id":"n476","loc":[-85.63423,41.943692]},"n4760":{"id":"n4760","loc":[-85.63169,41.947812]},"n4761":{"id":"n4761","loc":[-85.631307,41.947655]},"n4762":{"id":"n4762","loc":[-85.631407,41.947413]},"n4763":{"id":"n4763","loc":[-85.631173,41.947306]},"n4764":{"id":"n4764","loc":[-85.631316,41.947145]},"n4765":{"id":"n4765","loc":[-85.631476,41.947087]},"n4766":{"id":"n4766","loc":[-85.631793,41.946871]},"n4767":{"id":"n4767","loc":[-85.631884,41.946723]},"n4768":{"id":"n4768","loc":[-85.631814,41.946397]},"n4769":{"id":"n4769","loc":[-85.631382,41.947685]},"n477":{"id":"n477","loc":[-85.635096,41.942814]},"n4770":{"id":"n4770","loc":[-85.63109,41.947819]},"n4771":{"id":"n4771","loc":[-85.630921,41.947961]},"n4772":{"id":"n4772","loc":[-85.630249,41.947709]},"n4773":{"id":"n4773","loc":[-85.630149,41.947451]},"n4774":{"id":"n4774","loc":[-85.629733,41.947339]},"n4775":{"id":"n4775","loc":[-85.629755,41.946948]},"n4776":{"id":"n4776","loc":[-85.630457,41.947103]},"n4777":{"id":"n4777","loc":[-85.630934,41.946939]},"n4778":{"id":"n4778","loc":[-85.631277,41.946852]},"n4779":{"id":"n4779","loc":[-85.63142,41.946781]},"n478":{"id":"n478","loc":[-85.635058,41.942795]},"n4780":{"id":"n4780","loc":[-85.631116,41.946474]},"n4781":{"id":"n4781","loc":[-85.63073,41.945965]},"n4782":{"id":"n4782","loc":[-85.631337,41.94571]},"n4783":{"id":"n4783","loc":[-85.631589,41.945487]},"n4784":{"id":"n4784","loc":[-85.632278,41.945784]},"n4785":{"id":"n4785","loc":[-85.632105,41.946034]},"n4786":{"id":"n4786","loc":[-85.632532,41.946198]},"n4787":{"id":"n4787","loc":[-85.632566,41.946151]},"n4788":{"id":"n4788","loc":[-85.632684,41.946196]},"n4789":{"id":"n4789","loc":[-85.628676,41.947106]},"n479":{"id":"n479","loc":[-85.635002,41.94279]},"n4790":{"id":"n4790","loc":[-85.628973,41.946476]},"n4791":{"id":"n4791","loc":[-85.629094,41.946079]},"n4792":{"id":"n4792","loc":[-85.629226,41.94578]},"n4793":{"id":"n4793","loc":[-85.629479,41.945682]},"n4794":{"id":"n4794","loc":[-85.630606,41.94569]},"n4795":{"id":"n4795","loc":[-85.631255,41.945588]},"n4796":{"id":"n4796","loc":[-85.631546,41.945281]},"n4797":{"id":"n4797","loc":[-85.631629,41.944823]},"n4798":{"id":"n4798","loc":[-85.631766,41.944958]},"n4799":{"id":"n4799","loc":[-85.631689,41.945318]},"n48":{"id":"n48","loc":[-85.636689,41.94276]},"n480":{"id":"n480","loc":[-85.634908,41.94279]},"n4800":{"id":"n4800","loc":[-85.615069,41.945527]},"n4801":{"id":"n4801","loc":[-85.615058,41.946677]},"n4802":{"id":"n4802","loc":[-85.613692,41.946689]},"n4803":{"id":"n4803","loc":[-85.613475,41.946531]},"n4804":{"id":"n4804","loc":[-85.611717,41.946252]},"n4805":{"id":"n4805","loc":[-85.611353,41.946385]},"n4806":{"id":"n4806","loc":[-85.611304,41.947397]},"n4807":{"id":"n4807","loc":[-85.610564,41.947401]},"n4808":{"id":"n4808","loc":[-85.610553,41.947122]},"n4809":{"id":"n4809","loc":[-85.610194,41.946992]},"n481":{"id":"n481","loc":[-85.634478,41.942342]},"n4810":{"id":"n4810","loc":[-85.609976,41.946628]},"n4811":{"id":"n4811","loc":[-85.609769,41.946523]},"n4812":{"id":"n4812","loc":[-85.609307,41.946523]},"n4813":{"id":"n4813","loc":[-85.609035,41.946462]},"n4814":{"id":"n4814","loc":[-85.609018,41.943277]},"n4815":{"id":"n4815","loc":[-85.609617,41.943423]},"n4816":{"id":"n4816","loc":[-85.610471,41.943447]},"n4817":{"id":"n4817","loc":[-85.621491,41.949168]},"n4818":{"id":"n4818","loc":[-85.620266,41.94917]},"n4819":{"id":"n4819","loc":[-85.620262,41.947557]},"n482":{"id":"n482","loc":[-85.634521,41.942254]},"n4820":{"id":"n4820","loc":[-85.620825,41.947556]},"n4821":{"id":"n4821","loc":[-85.620827,41.948371]},"n4822":{"id":"n4822","loc":[-85.621489,41.94837]},"n4823":{"id":"n4823","loc":[-85.622865,41.950928]},"n4824":{"id":"n4824","loc":[-85.622858,41.949744]},"n4825":{"id":"n4825","loc":[-85.623696,41.949714]},"n4826":{"id":"n4826","loc":[-85.623696,41.949647]},"n4827":{"id":"n4827","loc":[-85.624019,41.949647]},"n4828":{"id":"n4828","loc":[-85.624024,41.950093]},"n4829":{"id":"n4829","loc":[-85.622885,41.949711]},"n483":{"id":"n483","loc":[-85.63425,41.941819]},"n4830":{"id":"n4830","loc":[-85.624584,41.951049]},"n4831":{"id":"n4831","loc":[-85.624669,41.9511]},"n4832":{"id":"n4832","loc":[-85.624316,41.952218]},"n4833":{"id":"n4833","loc":[-85.623819,41.952094]},"n4834":{"id":"n4834","loc":[-85.623385,41.952101]},"n4835":{"id":"n4835","loc":[-85.623456,41.951238]},"n4836":{"id":"n4836","loc":[-85.623535,41.951051]},"n4837":{"id":"n4837","loc":[-85.624693,41.950921]},"n4838":{"id":"n4838","loc":[-85.624727,41.950897]},"n4839":{"id":"n4839","loc":[-85.624869,41.950341]},"n484":{"id":"n484","loc":[-85.634324,41.942131]},"n4840":{"id":"n4840","loc":[-85.624859,41.949284]},"n4841":{"id":"n4841","loc":[-85.624788,41.949262]},"n4842":{"id":"n4842","loc":[-85.62402,41.949265]},"n4843":{"id":"n4843","loc":[-85.610382,41.954663]},"n4844":{"id":"n4844","loc":[-85.605675,41.954667]},"n4845":{"id":"n4845","loc":[-85.605669,41.949407]},"n4846":{"id":"n4846","loc":[-85.610376,41.949404]},"n4847":{"id":"n4847","loc":[-85.605552,41.958536]},"n4848":{"id":"n4848","loc":[-85.595755,41.958588]},"n4849":{"id":"n4849","loc":[-85.595732,41.956419]},"n485":{"id":"n485","loc":[-85.634211,41.941374]},"n4850":{"id":"n4850","loc":[-85.596908,41.955605]},"n4851":{"id":"n4851","loc":[-85.597723,41.955596]},"n4852":{"id":"n4852","loc":[-85.597715,41.954967]},"n4853":{"id":"n4853","loc":[-85.5874,41.955018]},"n4854":{"id":"n4854","loc":[-85.586615,41.955124]},"n4855":{"id":"n4855","loc":[-85.58613,41.955293]},"n4856":{"id":"n4856","loc":[-85.586166,41.962122]},"n4857":{"id":"n4857","loc":[-85.587008,41.955052]},"n4858":{"id":"n4858","loc":[-85.591685,41.95499]},"n4859":{"id":"n4859","loc":[-85.591718,41.956649]},"n486":{"id":"n486","loc":[-85.634085,41.940704]},"n4860":{"id":"n4860","loc":[-85.591133,41.956649]},"n4861":{"id":"n4861","loc":[-85.591061,41.95582]},"n4862":{"id":"n4862","loc":[-85.590677,41.95613]},"n4863":{"id":"n4863","loc":[-85.590826,41.956369]},"n4864":{"id":"n4864","loc":[-85.591016,41.954991]},"n4865":{"id":"n4865","loc":[-85.587656,41.954855]},"n4866":{"id":"n4866","loc":[-85.5964,41.955274]},"n4867":{"id":"n4867","loc":[-85.58776,41.96178]},"n4868":{"id":"n4868","loc":[-85.601172,41.960448]},"n4869":{"id":"n4869","loc":[-85.589489,41.960478]},"n487":{"id":"n487","loc":[-85.635567,41.940944]},"n4870":{"id":"n4870","loc":[-85.586664,41.960493]},"n4871":{"id":"n4871","loc":[-85.591227,41.95676]},"n4872":{"id":"n4872","loc":[-85.589424,41.958093]},"n4873":{"id":"n4873","loc":[-85.588779,41.957611]},"n4874":{"id":"n4874","loc":[-85.590583,41.956278]},"n4875":{"id":"n4875","loc":[-85.590759,41.957106]},"n4876":{"id":"n4876","loc":[-85.592213,41.958218]},"n4877":{"id":"n4877","loc":[-85.592262,41.958279]},"n4878":{"id":"n4878","loc":[-85.592304,41.958358]},"n4879":{"id":"n4879","loc":[-85.592351,41.95849]},"n488":{"id":"n488","loc":[-85.635542,41.940919]},"n4880":{"id":"n4880","loc":[-85.592363,41.958605]},"n4881":{"id":"n4881","loc":[-85.592383,41.96047]},"n4882":{"id":"n4882","loc":[-85.592376,41.959808]},"n4883":{"id":"n4883","loc":[-85.600825,41.959779]},"n4884":{"id":"n4884","loc":[-85.601084,41.959844]},"n4885":{"id":"n4885","loc":[-85.601144,41.959908]},"n4886":{"id":"n4886","loc":[-85.601164,41.960008]},"n4887":{"id":"n4887","loc":[-85.601162,41.960125]},"n4888":{"id":"n4888","loc":[-85.601134,41.960221]},"n4889":{"id":"n4889","loc":[-85.600993,41.960353]},"n489":{"id":"n489","loc":[-85.635514,41.940906]},"n4890":{"id":"n4890","loc":[-85.600794,41.960449]},"n4891":{"id":"n4891","loc":[-85.60098,41.959792]},"n4892":{"id":"n4892","loc":[-85.601067,41.960294]},"n4893":{"id":"n4893","loc":[-85.596829,41.959793]},"n4894":{"id":"n4894","loc":[-85.596839,41.960459]},"n4895":{"id":"n4895","loc":[-85.589364,41.958048]},"n4896":{"id":"n4896","loc":[-85.587374,41.959511]},"n4897":{"id":"n4897","loc":[-85.587286,41.959564]},"n4898":{"id":"n4898","loc":[-85.587163,41.959632]},"n4899":{"id":"n4899","loc":[-85.586694,41.959865]},"n49":{"id":"n49","loc":[-85.637127,41.942757]},"n490":{"id":"n490","loc":[-85.635469,41.940896]},"n4900":{"id":"n4900","loc":[-85.586634,41.959921]},"n4901":{"id":"n4901","loc":[-85.586607,41.960001]},"n4902":{"id":"n4902","loc":[-85.586599,41.960099]},"n4903":{"id":"n4903","loc":[-85.586602,41.96034]},"n4904":{"id":"n4904","loc":[-85.586669,41.960439]},"n4905":{"id":"n4905","loc":[-85.586758,41.960493]},"n4906":{"id":"n4906","loc":[-85.586618,41.960391]},"n4907":{"id":"n4907","loc":[-85.591201,41.956352]},"n4908":{"id":"n4908","loc":[-85.59112,41.954843]},"n4909":{"id":"n4909","loc":[-85.591536,41.956349]},"n491":{"id":"n491","loc":[-85.635667,41.940826]},"n4910":{"id":"n4910","loc":[-85.590953,41.956354]},"n4911":{"id":"n4911","loc":[-85.591468,41.956406]},"n4912":{"id":"n4912","loc":[-85.591469,41.956478]},"n4913":{"id":"n4913","loc":[-85.591123,41.956481]},"n4914":{"id":"n4914","loc":[-85.591121,41.956409]},"n4915":{"id":"n4915","loc":[-85.590826,41.955954]},"n4916":{"id":"n4916","loc":[-85.590612,41.956115]},"n4917":{"id":"n4917","loc":[-85.590402,41.955962]},"n4918":{"id":"n4918","loc":[-85.590622,41.955804]},"n4919":{"id":"n4919","loc":[-85.59011,41.956502]},"n492":{"id":"n492","loc":[-85.636197,41.940599]},"n4920":{"id":"n4920","loc":[-85.589877,41.956668]},"n4921":{"id":"n4921","loc":[-85.589777,41.95659]},"n4922":{"id":"n4922","loc":[-85.59001,41.956424]},"n4923":{"id":"n4923","loc":[-85.589595,41.956427]},"n4924":{"id":"n4924","loc":[-85.589434,41.956549]},"n4925":{"id":"n4925","loc":[-85.589262,41.956424]},"n4926":{"id":"n4926","loc":[-85.589422,41.956302]},"n4927":{"id":"n4927","loc":[-85.589358,41.956286]},"n4928":{"id":"n4928","loc":[-85.5892,41.956408]},"n4929":{"id":"n4929","loc":[-85.589032,41.956288]},"n493":{"id":"n493","loc":[-85.6362,41.940686]},"n4930":{"id":"n4930","loc":[-85.58919,41.956166]},"n4931":{"id":"n4931","loc":[-85.589165,41.956132]},"n4932":{"id":"n4932","loc":[-85.589002,41.956253]},"n4933":{"id":"n4933","loc":[-85.588826,41.956122]},"n4934":{"id":"n4934","loc":[-85.588989,41.956001]},"n4935":{"id":"n4935","loc":[-85.588673,41.955757]},"n4936":{"id":"n4936","loc":[-85.588502,41.955882]},"n4937":{"id":"n4937","loc":[-85.588339,41.955759]},"n4938":{"id":"n4938","loc":[-85.58851,41.955633]},"n4939":{"id":"n4939","loc":[-85.590382,41.955892]},"n494":{"id":"n494","loc":[-85.635969,41.94069]},"n4940":{"id":"n4940","loc":[-85.589923,41.956231]},"n4941":{"id":"n4941","loc":[-85.58984,41.956168]},"n4942":{"id":"n4942","loc":[-85.5903,41.95583]},"n4943":{"id":"n4943","loc":[-85.589636,41.956038]},"n4944":{"id":"n4944","loc":[-85.589546,41.956105]},"n4945":{"id":"n4945","loc":[-85.589045,41.955729]},"n4946":{"id":"n4946","loc":[-85.589135,41.955662]},"n4947":{"id":"n4947","loc":[-85.590718,41.955293]},"n4948":{"id":"n4948","loc":[-85.590718,41.955374]},"n4949":{"id":"n4949","loc":[-85.589211,41.955369]},"n495":{"id":"n495","loc":[-85.635965,41.940561]},"n4950":{"id":"n4950","loc":[-85.589212,41.955287]},"n4951":{"id":"n4951","loc":[-85.589675,41.956817]},"n4952":{"id":"n4952","loc":[-85.58947,41.95697]},"n4953":{"id":"n4953","loc":[-85.589219,41.956784]},"n4954":{"id":"n4954","loc":[-85.589425,41.95663]},"n4955":{"id":"n4955","loc":[-85.589373,41.95702]},"n4956":{"id":"n4956","loc":[-85.589171,41.957172]},"n4957":{"id":"n4957","loc":[-85.588962,41.957019]},"n4958":{"id":"n4958","loc":[-85.589164,41.956867]},"n4959":{"id":"n4959","loc":[-85.588881,41.955006]},"n496":{"id":"n496","loc":[-85.636031,41.94056]},"n4960":{"id":"n4960","loc":[-85.588804,41.955006]},"n4961":{"id":"n4961","loc":[-85.604773,41.954521]},"n4962":{"id":"n4962","loc":[-85.601603,41.954527]},"n4963":{"id":"n4963","loc":[-85.600823,41.954169]},"n4964":{"id":"n4964","loc":[-85.600828,41.950191]},"n4965":{"id":"n4965","loc":[-85.601673,41.949457]},"n4966":{"id":"n4966","loc":[-85.604464,41.949488]},"n4967":{"id":"n4967","loc":[-85.60538,41.950212]},"n4968":{"id":"n4968","loc":[-85.605395,41.954108]},"n4969":{"id":"n4969","loc":[-85.604771,41.954109]},"n497":{"id":"n497","loc":[-85.636032,41.940602]},"n4970":{"id":"n4970","loc":[-85.600613,41.953916]},"n4971":{"id":"n4971","loc":[-85.599758,41.954649]},"n4972":{"id":"n4972","loc":[-85.591194,41.954663]},"n4973":{"id":"n4973","loc":[-85.591182,41.950465]},"n4974":{"id":"n4974","loc":[-85.591871,41.950464]},"n4975":{"id":"n4975","loc":[-85.591868,41.949209]},"n4976":{"id":"n4976","loc":[-85.592155,41.949209]},"n4977":{"id":"n4977","loc":[-85.592155,41.94848]},"n4978":{"id":"n4978","loc":[-85.600615,41.948482]},"n4979":{"id":"n4979","loc":[-85.605421,41.949378]},"n498":{"id":"n498","loc":[-85.635776,41.940583]},"n4980":{"id":"n4980","loc":[-85.600614,41.949373]},"n4981":{"id":"n4981","loc":[-85.601316,41.94849]},"n4982":{"id":"n4982","loc":[-85.601592,41.947641]},"n4983":{"id":"n4983","loc":[-85.60395,41.947618]},"n4984":{"id":"n4984","loc":[-85.603973,41.948114]},"n4985":{"id":"n4985","loc":[-85.605398,41.948103]},"n4986":{"id":"n4986","loc":[-85.614017,41.965566]},"n4987":{"id":"n4987","loc":[-85.605787,41.965619]},"n4988":{"id":"n4988","loc":[-85.60577,41.963821]},"n4989":{"id":"n4989","loc":[-85.612886,41.963808]},"n499":{"id":"n499","loc":[-85.63589,41.940578]},"n4990":{"id":"n4990","loc":[-85.613207,41.963705]},"n4991":{"id":"n4991","loc":[-85.613511,41.963525]},"n4992":{"id":"n4992","loc":[-85.613667,41.963305]},"n4993":{"id":"n4993","loc":[-85.613779,41.962983]},"n4994":{"id":"n4994","loc":[-85.613797,41.959709]},"n4995":{"id":"n4995","loc":[-85.613663,41.95936]},"n4996":{"id":"n4996","loc":[-85.61339,41.959064]},"n4997":{"id":"n4997","loc":[-85.610503,41.956898]},"n4998":{"id":"n4998","loc":[-85.610485,41.956595]},"n4999":{"id":"n4999","loc":[-85.613892,41.956621]},"n5":{"id":"n5","loc":[-85.622744,41.95268]},"n50":{"id":"n50","loc":[-85.636673,41.943143]},"n500":{"id":"n500","loc":[-85.636198,41.940578]},"n5000":{"id":"n5000","loc":[-85.613866,41.958574]},"n5001":{"id":"n5001","loc":[-85.615262,41.958561]},"n5002":{"id":"n5002","loc":[-85.615279,41.959541]},"n5003":{"id":"n5003","loc":[-85.615314,41.95597]},"n5004":{"id":"n5004","loc":[-85.613887,41.955988]},"n5005":{"id":"n5005","loc":[-85.613074,41.962244]},"n5006":{"id":"n5006","loc":[-85.611678,41.963354]},"n5007":{"id":"n5007","loc":[-85.611678,41.963487]},"n5008":{"id":"n5008","loc":[-85.606906,41.963502]},"n5009":{"id":"n5009","loc":[-85.605777,41.962657]},"n501":{"id":"n501","loc":[-85.636251,41.940584]},"n5010":{"id":"n5010","loc":[-85.605711,41.9599]},"n5011":{"id":"n5011","loc":[-85.608139,41.9585]},"n5012":{"id":"n5012","loc":[-85.60814,41.956306]},"n5013":{"id":"n5013","loc":[-85.608854,41.95581]},"n5014":{"id":"n5014","loc":[-85.610039,41.955883]},"n5015":{"id":"n5015","loc":[-85.610068,41.956754]},"n5016":{"id":"n5016","loc":[-85.613058,41.959411]},"n5017":{"id":"n5017","loc":[-85.610234,41.957068]},"n5018":{"id":"n5018","loc":[-85.609826,41.95581]},"n5019":{"id":"n5019","loc":[-85.606987,41.958505]},"n502":{"id":"n502","loc":[-85.636279,41.940605]},"n5020":{"id":"n5020","loc":[-85.606498,41.958846]},"n5021":{"id":"n5021","loc":[-85.606013,41.959342]},"n5022":{"id":"n5022","loc":[-85.614553,41.961581]},"n5023":{"id":"n5023","loc":[-85.61465,41.96214]},"n5024":{"id":"n5024","loc":[-85.615277,41.962442]},"n5025":{"id":"n5025","loc":[-85.615451,41.962972]},"n5026":{"id":"n5026","loc":[-85.614355,41.964826]},"n5027":{"id":"n5027","loc":[-85.615133,41.964589]},"n5028":{"id":"n5028","loc":[-85.615342,41.963818]},"n5029":{"id":"n5029","loc":[-85.615971,41.963792]},"n503":{"id":"n503","loc":[-85.636285,41.940633]},"n5030":{"id":"n5030","loc":[-85.615751,41.963122]},"n5031":{"id":"n5031","loc":[-85.616575,41.963123]},"n5032":{"id":"n5032","loc":[-85.612527,41.963846]},"n5033":{"id":"n5033","loc":[-85.630653,41.940709]},"n5034":{"id":"n5034","loc":[-85.629858,41.939568]},"n5035":{"id":"n5035","loc":[-85.629847,41.937926]},"n504":{"id":"n504","loc":[-85.636281,41.940662]},"n505":{"id":"n505","loc":[-85.636266,41.940688]},"n506":{"id":"n506","loc":[-85.636236,41.940701]},"n507":{"id":"n507","loc":[-85.63619,41.940706]},"n508":{"id":"n508","loc":[-85.635892,41.940707]},"n509":{"id":"n509","loc":[-85.635777,41.9407]},"n51":{"id":"n51","loc":[-85.636673,41.942864]},"n510":{"id":"n510","loc":[-85.636044,41.940578]},"n511":{"id":"n511","loc":[-85.635946,41.940578]},"n512":{"id":"n512","loc":[-85.636475,41.940732]},"n513":{"id":"n513","loc":[-85.636475,41.940777]},"n514":{"id":"n514","loc":[-85.636405,41.940777]},"n515":{"id":"n515","loc":[-85.636405,41.940732]},"n516":{"id":"n516","loc":[-85.636471,41.940916]},"n517":{"id":"n517","loc":[-85.636471,41.940961]},"n518":{"id":"n518","loc":[-85.636404,41.940961]},"n519":{"id":"n519","loc":[-85.636404,41.940916]},"n52":{"id":"n52","loc":[-85.636227,41.942864]},"n520":{"id":"n520","loc":[-85.636286,41.941127]},"n521":{"id":"n521","loc":[-85.636203,41.941126]},"n522":{"id":"n522","loc":[-85.636204,41.941083]},"n523":{"id":"n523","loc":[-85.636287,41.941083]},"n524":{"id":"n524","loc":[-85.636124,41.941064]},"n525":{"id":"n525","loc":[-85.636,41.941065]},"n526":{"id":"n526","loc":[-85.636,41.940964]},"n527":{"id":"n527","loc":[-85.636045,41.940964]},"n528":{"id":"n528","loc":[-85.636045,41.940928]},"n529":{"id":"n529","loc":[-85.636111,41.940928]},"n53":{"id":"n53","loc":[-85.636227,41.943143]},"n530":{"id":"n530","loc":[-85.636111,41.940961]},"n531":{"id":"n531","loc":[-85.636123,41.940961]},"n532":{"id":"n532","loc":[-85.636124,41.940997]},"n533":{"id":"n533","loc":[-85.636164,41.940997]},"n534":{"id":"n534","loc":[-85.636164,41.941044]},"n535":{"id":"n535","loc":[-85.636124,41.941044]},"n536":{"id":"n536","loc":[-85.636534,41.941256]},"n537":{"id":"n537","loc":[-85.63645,41.941246]},"n538":{"id":"n538","loc":[-85.636462,41.941189]},"n539":{"id":"n539","loc":[-85.636546,41.941199]},"n54":{"id":"n54","loc":[-85.636198,41.943119]},"n540":{"id":"n540","loc":[-85.636802,41.941226]},"n541":{"id":"n541","loc":[-85.636701,41.941215]},"n542":{"id":"n542","loc":[-85.636709,41.941174]},"n543":{"id":"n543","loc":[-85.636656,41.941168]},"n544":{"id":"n544","loc":[-85.636666,41.941122]},"n545":{"id":"n545","loc":[-85.636781,41.941136]},"n546":{"id":"n546","loc":[-85.636774,41.94117]},"n547":{"id":"n547","loc":[-85.636812,41.941175]},"n548":{"id":"n548","loc":[-85.636803,41.941047]},"n549":{"id":"n549","loc":[-85.636785,41.941047]},"n55":{"id":"n55","loc":[-85.635945,41.94312]},"n550":{"id":"n550","loc":[-85.636785,41.941058]},"n551":{"id":"n551","loc":[-85.636644,41.941059]},"n552":{"id":"n552","loc":[-85.636644,41.941038]},"n553":{"id":"n553","loc":[-85.636581,41.941039]},"n554":{"id":"n554","loc":[-85.636581,41.940995]},"n555":{"id":"n555","loc":[-85.636746,41.940995]},"n556":{"id":"n556","loc":[-85.636746,41.940978]},"n557":{"id":"n557","loc":[-85.636803,41.940978]},"n558":{"id":"n558","loc":[-85.636781,41.940768]},"n559":{"id":"n559","loc":[-85.636783,41.940828]},"n56":{"id":"n56","loc":[-85.635943,41.942909]},"n560":{"id":"n560","loc":[-85.636761,41.940828]},"n561":{"id":"n561","loc":[-85.636762,41.940857]},"n562":{"id":"n562","loc":[-85.636641,41.940859]},"n563":{"id":"n563","loc":[-85.63664,41.940805]},"n564":{"id":"n564","loc":[-85.636676,41.940804]},"n565":{"id":"n565","loc":[-85.636675,41.940769]},"n566":{"id":"n566","loc":[-85.636733,41.94033]},"n567":{"id":"n567","loc":[-85.636471,41.940334]},"n568":{"id":"n568","loc":[-85.636469,41.940262]},"n569":{"id":"n569","loc":[-85.636731,41.940257]},"n57":{"id":"n57","loc":[-85.636227,41.942909]},"n570":{"id":"n570","loc":[-85.636798,41.940419]},"n571":{"id":"n571","loc":[-85.6368,41.940524]},"n572":{"id":"n572","loc":[-85.63664,41.940526]},"n573":{"id":"n573","loc":[-85.636638,41.940421]},"n574":{"id":"n574","loc":[-85.636372,41.940551]},"n575":{"id":"n575","loc":[-85.636338,41.94055]},"n576":{"id":"n576","loc":[-85.636339,41.940524]},"n577":{"id":"n577","loc":[-85.636373,41.940525]},"n578":{"id":"n578","loc":[-85.636388,41.940435]},"n579":{"id":"n579","loc":[-85.636222,41.940436]},"n58":{"id":"n58","loc":[-85.63627,41.943175]},"n580":{"id":"n580","loc":[-85.636222,41.940366]},"n581":{"id":"n581","loc":[-85.636387,41.940365]},"n582":{"id":"n582","loc":[-85.636158,41.940482]},"n583":{"id":"n583","loc":[-85.635963,41.940484]},"n584":{"id":"n584","loc":[-85.635961,41.940399]},"n585":{"id":"n585","loc":[-85.636156,41.940397]},"n586":{"id":"n586","loc":[-85.635987,41.940314]},"n587":{"id":"n587","loc":[-85.635987,41.940268]},"n588":{"id":"n588","loc":[-85.635968,41.940268]},"n589":{"id":"n589","loc":[-85.635967,41.940212]},"n59":{"id":"n59","loc":[-85.635531,41.943176]},"n590":{"id":"n590","loc":[-85.636082,41.940211]},"n591":{"id":"n591","loc":[-85.636083,41.94027]},"n592":{"id":"n592","loc":[-85.636064,41.94027]},"n593":{"id":"n593","loc":[-85.636064,41.940313]},"n594":{"id":"n594","loc":[-85.638071,41.941562]},"n595":{"id":"n595","loc":[-85.637953,41.941562]},"n596":{"id":"n596","loc":[-85.637952,41.941522]},"n597":{"id":"n597","loc":[-85.637876,41.941523]},"n598":{"id":"n598","loc":[-85.637876,41.941471]},"n599":{"id":"n599","loc":[-85.638035,41.94147]},"n6":{"id":"n6","loc":[-85.624925,41.950604]},"n60":{"id":"n60","loc":[-85.63542,41.942883]},"n600":{"id":"n600","loc":[-85.638035,41.941513]},"n601":{"id":"n601","loc":[-85.638071,41.941512]},"n602":{"id":"n602","loc":[-85.637038,41.942543],"tags":{"crossing":"zebra","highway":"crossing"}},"n603":{"id":"n603","loc":[-85.637134,41.942542]},"n604":{"id":"n604","loc":[-85.638122,41.942532]},"n605":{"id":"n605","loc":[-85.638121,41.942478]},"n606":{"id":"n606","loc":[-85.638104,41.941424]},"n607":{"id":"n607","loc":[-85.637115,41.941438]},"n608":{"id":"n608","loc":[-85.637133,41.942453]},"n609":{"id":"n609","loc":[-85.637429,41.942004]},"n61":{"id":"n61","loc":[-85.635701,41.942802]},"n610":{"id":"n610","loc":[-85.637125,41.942004]},"n611":{"id":"n611","loc":[-85.637022,41.942004]},"n612":{"id":"n612","loc":[-85.635952,41.943579]},"n613":{"id":"n613","loc":[-85.635872,41.943594]},"n614":{"id":"n614","loc":[-85.635857,41.943551]},"n615":{"id":"n615","loc":[-85.635937,41.943535]},"n616":{"id":"n616","loc":[-85.63671,41.94344]},"n617":{"id":"n617","loc":[-85.636427,41.94334]},"n618":{"id":"n618","loc":[-85.635353,41.943279]},"n619":{"id":"n619","loc":[-85.635319,41.943257]},"n62":{"id":"n62","loc":[-85.6358,41.942997]},"n620":{"id":"n620","loc":[-85.638786,41.943105]},"n621":{"id":"n621","loc":[-85.634957,41.943146]},"n622":{"id":"n622","loc":[-85.635012,41.943119]},"n623":{"id":"n623","loc":[-85.632409,41.944222]},"n624":{"id":"n624","loc":[-85.631863,41.944749]},"n625":{"id":"n625","loc":[-85.631915,41.944722]},"n626":{"id":"n626","loc":[-85.631884,41.94464]},"n627":{"id":"n627","loc":[-85.631792,41.944359]},"n628":{"id":"n628","loc":[-85.631817,41.944703]},"n629":{"id":"n629","loc":[-85.633464,41.945787]},"n63":{"id":"n63","loc":[-85.635808,41.943176]},"n630":{"id":"n630","loc":[-85.633583,41.945919]},"n631":{"id":"n631","loc":[-85.63382,41.945698]},"n632":{"id":"n632","loc":[-85.633681,41.945571]},"n633":{"id":"n633","loc":[-85.634217,41.946824]},"n634":{"id":"n634","loc":[-85.634271,41.946836]},"n635":{"id":"n635","loc":[-85.634319,41.94573]},"n636":{"id":"n636","loc":[-85.634377,41.945672]},"n637":{"id":"n637","loc":[-85.634909,41.945354]},"n638":{"id":"n638","loc":[-85.634726,41.945493],"tags":{"artwork_type":"mural","tourism":"artwork"}},"n639":{"id":"n639","loc":[-85.63546,41.945612]},"n64":{"id":"n64","loc":[-85.63631,41.943253]},"n640":{"id":"n640","loc":[-85.635561,41.945493]},"n641":{"id":"n641","loc":[-85.635417,41.945565]},"n642":{"id":"n642","loc":[-85.635315,41.945583]},"n643":{"id":"n643","loc":[-85.63506,41.945383]},"n644":{"id":"n644","loc":[-85.635198,41.945199]},"n645":{"id":"n645","loc":[-85.635361,41.94558]},"n646":{"id":"n646","loc":[-85.635017,41.945066]},"n647":{"id":"n647","loc":[-85.634779,41.945206]},"n648":{"id":"n648","loc":[-85.63425,41.945655]},"n649":{"id":"n649","loc":[-85.634247,41.945631]},"n65":{"id":"n65","loc":[-85.635398,41.943259]},"n650":{"id":"n650","loc":[-85.634889,41.945921]},"n651":{"id":"n651","loc":[-85.634889,41.945939]},"n652":{"id":"n652","loc":[-85.634889,41.945761]},"n653":{"id":"n653","loc":[-85.634889,41.945778]},"n654":{"id":"n654","loc":[-85.635112,41.945715]},"n655":{"id":"n655","loc":[-85.635025,41.945714]},"n656":{"id":"n656","loc":[-85.635027,41.945761]},"n657":{"id":"n657","loc":[-85.635438,41.945665]},"n658":{"id":"n658","loc":[-85.635416,41.945676]},"n659":{"id":"n659","loc":[-85.635401,41.945709]},"n66":{"id":"n66","loc":[-85.635336,41.943036]},"n660":{"id":"n660","loc":[-85.635271,41.945566]},"n661":{"id":"n661","loc":[-85.636106,41.946268]},"n662":{"id":"n662","loc":[-85.635867,41.946747]},"n663":{"id":"n663","loc":[-85.636476,41.946797]},"n664":{"id":"n664","loc":[-85.63651,41.946796]},"n665":{"id":"n665","loc":[-85.635367,41.946389]},"n666":{"id":"n666","loc":[-85.635367,41.946437]},"n667":{"id":"n667","loc":[-85.634787,41.946441]},"n668":{"id":"n668","loc":[-85.6358,41.946243]},"n669":{"id":"n669","loc":[-85.635784,41.94622]},"n67":{"id":"n67","loc":[-85.635911,41.942899]},"n670":{"id":"n670","loc":[-85.635727,41.946195]},"n671":{"id":"n671","loc":[-85.635708,41.946588]},"n672":{"id":"n672","loc":[-85.635648,41.946561]},"n673":{"id":"n673","loc":[-85.635624,41.946555]},"n674":{"id":"n674","loc":[-85.635417,41.946559]},"n675":{"id":"n675","loc":[-85.634866,41.946561]},"n676":{"id":"n676","loc":[-85.634866,41.946543]},"n677":{"id":"n677","loc":[-85.635085,41.946546]},"n678":{"id":"n678","loc":[-85.635085,41.946554]},"n679":{"id":"n679","loc":[-85.634584,41.94488]},"n68":{"id":"n68","loc":[-85.635915,41.943156]},"n680":{"id":"n680","loc":[-85.634557,41.944882]},"n681":{"id":"n681","loc":[-85.634455,41.944943]},"n682":{"id":"n682","loc":[-85.634305,41.944968]},"n683":{"id":"n683","loc":[-85.634261,41.944927]},"n684":{"id":"n684","loc":[-85.634132,41.944741]},"n685":{"id":"n685","loc":[-85.633705,41.944759]},"n686":{"id":"n686","loc":[-85.633918,41.944616]},"n687":{"id":"n687","loc":[-85.633974,41.944663]},"n688":{"id":"n688","loc":[-85.6336,41.944665]},"n689":{"id":"n689","loc":[-85.633817,41.944528]},"n69":{"id":"n69","loc":[-85.63631,41.943157]},"n690":{"id":"n690","loc":[-85.633889,41.944485]},"n691":{"id":"n691","loc":[-85.633931,41.944525]},"n692":{"id":"n692","loc":[-85.633864,41.944563]},"n693":{"id":"n693","loc":[-85.633456,41.944524]},"n694":{"id":"n694","loc":[-85.633676,41.944399]},"n695":{"id":"n695","loc":[-85.633352,41.944415]},"n696":{"id":"n696","loc":[-85.633655,41.944234]},"n697":{"id":"n697","loc":[-85.633761,41.94435]},"n698":{"id":"n698","loc":[-85.633254,41.944318]},"n699":{"id":"n699","loc":[-85.633472,41.944188]},"n7":{"id":"n7","loc":[-85.638791,41.943231]},"n70":{"id":"n70","loc":[-85.63579,41.942967]},"n700":{"id":"n700","loc":[-85.633524,41.944237]},"n701":{"id":"n701","loc":[-85.633583,41.944202]},"n702":{"id":"n702","loc":[-85.633632,41.944247]},"n703":{"id":"n703","loc":[-85.633165,41.944228]},"n704":{"id":"n704","loc":[-85.633388,41.944105]},"n705":{"id":"n705","loc":[-85.633117,41.944175]},"n706":{"id":"n706","loc":[-85.633302,41.944077]},"n707":{"id":"n707","loc":[-85.633352,41.944126]},"n708":{"id":"n708","loc":[-85.633052,41.944107]},"n709":{"id":"n709","loc":[-85.633237,41.944009]},"n71":{"id":"n71","loc":[-85.637506,41.942824]},"n710":{"id":"n710","loc":[-85.633187,41.943955]},"n711":{"id":"n711","loc":[-85.633,41.944054]},"n712":{"id":"n712","loc":[-85.633155,41.944265]},"n713":{"id":"n713","loc":[-85.633669,41.944765]},"n714":{"id":"n714","loc":[-85.634468,41.945503]},"n715":{"id":"n715","loc":[-85.63455,41.945566]},"n716":{"id":"n716","loc":[-85.634737,41.945729]},"n717":{"id":"n717","loc":[-85.634753,41.945752]},"n718":{"id":"n718","loc":[-85.634756,41.945781]},"n719":{"id":"n719","loc":[-85.634758,41.945978]},"n72":{"id":"n72","loc":[-85.637511,41.943056]},"n720":{"id":"n720","loc":[-85.634363,41.945548],"tags":{"crossing":"zebra","highway":"crossing"}},"n721":{"id":"n721","loc":[-85.634245,41.945599]},"n722":{"id":"n722","loc":[-85.633474,41.944889]},"n723":{"id":"n723","loc":[-85.632997,41.944418]},"n724":{"id":"n724","loc":[-85.63278,41.944183]},"n725":{"id":"n725","loc":[-85.63331,41.944429]},"n726":{"id":"n726","loc":[-85.633568,41.944829],"tags":{"crossing":"zebra","highway":"crossing"}},"n727":{"id":"n727","loc":[-85.634669,41.94567]},"n728":{"id":"n728","loc":[-85.634462,41.945787]},"n729":{"id":"n729","loc":[-85.634272,41.945625]},"n73":{"id":"n73","loc":[-85.637361,41.943058]},"n730":{"id":"n730","loc":[-85.634344,41.945699],"tags":{"crossing":"zebra","highway":"crossing"}},"n731":{"id":"n731","loc":[-85.634426,41.945783]},"n732":{"id":"n732","loc":[-85.632425,41.944137]},"n733":{"id":"n733","loc":[-85.632302,41.944192]},"n734":{"id":"n734","loc":[-85.632762,41.944174]},"n735":{"id":"n735","loc":[-85.632713,41.944179]},"n736":{"id":"n736","loc":[-85.632411,41.944327]},"n737":{"id":"n737","loc":[-85.632362,41.944341]},"n738":{"id":"n738","loc":[-85.632236,41.944204]},"n739":{"id":"n739","loc":[-85.634939,41.942165]},"n74":{"id":"n74","loc":[-85.637356,41.942825]},"n740":{"id":"n740","loc":[-85.635079,41.941535]},"n741":{"id":"n741","loc":[-85.635112,41.941595]},"n742":{"id":"n742","loc":[-85.635113,41.941633]},"n743":{"id":"n743","loc":[-85.635067,41.941652]},"n744":{"id":"n744","loc":[-85.634989,41.941651]},"n745":{"id":"n745","loc":[-85.634921,41.941609]},"n746":{"id":"n746","loc":[-85.634881,41.941544]},"n747":{"id":"n747","loc":[-85.635537,41.940939]},"n748":{"id":"n748","loc":[-85.635573,41.941048]},"n749":{"id":"n749","loc":[-85.635453,41.94091]},"n75":{"id":"n75","loc":[-85.638097,41.942833]},"n750":{"id":"n750","loc":[-85.635319,41.940943]},"n751":{"id":"n751","loc":[-85.637057,41.943224]},"n752":{"id":"n752","loc":[-85.636989,41.943296]},"n753":{"id":"n753","loc":[-85.636851,41.943299]},"n754":{"id":"n754","loc":[-85.636848,41.94322]},"n755":{"id":"n755","loc":[-85.636986,41.943217]},"n756":{"id":"n756","loc":[-85.637569,41.943454]},"n757":{"id":"n757","loc":[-85.637437,41.943458]},"n758":{"id":"n758","loc":[-85.637432,41.943384]},"n759":{"id":"n759","loc":[-85.637564,41.94338]},"n76":{"id":"n76","loc":[-85.638098,41.942912]},"n760":{"id":"n760","loc":[-85.637213,41.943378]},"n761":{"id":"n761","loc":[-85.637217,41.943435]},"n762":{"id":"n762","loc":[-85.637235,41.943434]},"n763":{"id":"n763","loc":[-85.637237,41.943465]},"n764":{"id":"n764","loc":[-85.637424,41.943459]},"n765":{"id":"n765","loc":[-85.637418,41.943371]},"n766":{"id":"n766","loc":[-85.638094,41.943149]},"n767":{"id":"n767","loc":[-85.638096,41.943201]},"n768":{"id":"n768","loc":[-85.638041,41.943202]},"n769":{"id":"n769","loc":[-85.638042,41.943216]},"n77":{"id":"n77","loc":[-85.637705,41.942913]},"n770":{"id":"n770","loc":[-85.637927,41.943218]},"n771":{"id":"n771","loc":[-85.637926,41.943201]},"n772":{"id":"n772","loc":[-85.637897,41.943201]},"n773":{"id":"n773","loc":[-85.637896,41.943155]},"n774":{"id":"n774","loc":[-85.637962,41.943153]},"n775":{"id":"n775","loc":[-85.637962,41.943134]},"n776":{"id":"n776","loc":[-85.638017,41.943132]},"n777":{"id":"n777","loc":[-85.638018,41.943151]},"n778":{"id":"n778","loc":[-85.638045,41.943289]},"n779":{"id":"n779","loc":[-85.638048,41.943363]},"n78":{"id":"n78","loc":[-85.637705,41.942834]},"n780":{"id":"n780","loc":[-85.637842,41.943367]},"n781":{"id":"n781","loc":[-85.637839,41.943296]},"n782":{"id":"n782","loc":[-85.637896,41.943295]},"n783":{"id":"n783","loc":[-85.637897,41.943314]},"n784":{"id":"n784","loc":[-85.637957,41.943312]},"n785":{"id":"n785","loc":[-85.637957,41.943291]},"n786":{"id":"n786","loc":[-85.637816,41.943375]},"n787":{"id":"n787","loc":[-85.637815,41.943416]},"n788":{"id":"n788","loc":[-85.637715,41.943415]},"n789":{"id":"n789","loc":[-85.637716,41.943374]},"n79":{"id":"n79","loc":[-85.638071,41.942298]},"n790":{"id":"n790","loc":[-85.637912,41.943545]},"n791":{"id":"n791","loc":[-85.637909,41.943479]},"n792":{"id":"n792","loc":[-85.637967,41.943477]},"n793":{"id":"n793","loc":[-85.637967,41.94346]},"n794":{"id":"n794","loc":[-85.638077,41.943457]},"n795":{"id":"n795","loc":[-85.638078,41.943473]},"n796":{"id":"n796","loc":[-85.638124,41.943471]},"n797":{"id":"n797","loc":[-85.638126,41.943514]},"n798":{"id":"n798","loc":[-85.638079,41.943515]},"n799":{"id":"n799","loc":[-85.638079,41.943532]},"n8":{"id":"n8","loc":[-85.635241,41.941948]},"n80":{"id":"n80","loc":[-85.638074,41.942431]},"n800":{"id":"n800","loc":[-85.638028,41.943534]},"n801":{"id":"n801","loc":[-85.638028,41.943542]},"n802":{"id":"n802","loc":[-85.638845,41.942983]},"n803":{"id":"n803","loc":[-85.638846,41.94305]},"n804":{"id":"n804","loc":[-85.638661,41.943052]},"n805":{"id":"n805","loc":[-85.63866,41.942984]},"n806":{"id":"n806","loc":[-85.638579,41.942753]},"n807":{"id":"n807","loc":[-85.638445,41.942755]},"n808":{"id":"n808","loc":[-85.638452,41.942978]},"n809":{"id":"n809","loc":[-85.638545,41.942976]},"n81":{"id":"n81","loc":[-85.637836,41.942433]},"n810":{"id":"n810","loc":[-85.638543,41.942935]},"n811":{"id":"n811","loc":[-85.638571,41.942934]},"n812":{"id":"n812","loc":[-85.63857,41.942901]},"n813":{"id":"n813","loc":[-85.638611,41.9429]},"n814":{"id":"n814","loc":[-85.638607,41.942769]},"n815":{"id":"n815","loc":[-85.63858,41.94277]},"n816":{"id":"n816","loc":[-85.638597,41.942614]},"n817":{"id":"n817","loc":[-85.638601,41.94273]},"n818":{"id":"n818","loc":[-85.638686,41.942731]},"n819":{"id":"n819","loc":[-85.638689,41.942917]},"n82":{"id":"n82","loc":[-85.637835,41.94242]},"n820":{"id":"n820","loc":[-85.638558,41.943018]},"n821":{"id":"n821","loc":[-85.638243,41.943019]},"n822":{"id":"n822","loc":[-85.637536,41.943887]},"n823":{"id":"n823","loc":[-85.63749,41.943926]},"n824":{"id":"n824","loc":[-85.63743,41.943886]},"n825":{"id":"n825","loc":[-85.637476,41.943847]},"n826":{"id":"n826","loc":[-85.637527,41.943846]},"n827":{"id":"n827","loc":[-85.637141,41.943728]},"n828":{"id":"n828","loc":[-85.637201,41.943755]},"n829":{"id":"n829","loc":[-85.636987,41.943608]},"n83":{"id":"n83","loc":[-85.63776,41.942421]},"n830":{"id":"n830","loc":[-85.637441,41.943807]},"n831":{"id":"n831","loc":[-85.637673,41.94399]},"n832":{"id":"n832","loc":[-85.637783,41.944137]},"n833":{"id":"n833","loc":[-85.63845,41.944333]},"n834":{"id":"n834","loc":[-85.638159,41.944248]},"n835":{"id":"n835","loc":[-85.637859,41.94416]},"n836":{"id":"n836","loc":[-85.638685,41.944542]},"n837":{"id":"n837","loc":[-85.638714,41.944611]},"n838":{"id":"n838","loc":[-85.638711,41.944757]},"n839":{"id":"n839","loc":[-85.638774,41.945069]},"n84":{"id":"n84","loc":[-85.637758,41.942339]},"n840":{"id":"n840","loc":[-85.638742,41.945205]},"n841":{"id":"n841","loc":[-85.640267,41.942403]},"n842":{"id":"n842","loc":[-85.640154,41.942404]},"n843":{"id":"n843","loc":[-85.640152,41.942249]},"n844":{"id":"n844","loc":[-85.640266,41.942248]},"n845":{"id":"n845","loc":[-85.640366,41.942599]},"n846":{"id":"n846","loc":[-85.640362,41.942192]},"n847":{"id":"n847","loc":[-85.640146,41.942191]},"n848":{"id":"n848","loc":[-85.640122,41.942196]},"n849":{"id":"n849","loc":[-85.640108,41.942211]},"n85":{"id":"n85","loc":[-85.637836,41.942339]},"n850":{"id":"n850","loc":[-85.640101,41.942236]},"n851":{"id":"n851","loc":[-85.640103,41.94241]},"n852":{"id":"n852","loc":[-85.64011,41.942435]},"n853":{"id":"n853","loc":[-85.640126,41.942445]},"n854":{"id":"n854","loc":[-85.640153,41.942451]},"n855":{"id":"n855","loc":[-85.640183,41.942452]},"n856":{"id":"n856","loc":[-85.640364,41.942452]},"n857":{"id":"n857","loc":[-85.640007,41.942452]},"n858":{"id":"n858","loc":[-85.639449,41.942461]},"n859":{"id":"n859","loc":[-85.640049,41.942391]},"n86":{"id":"n86","loc":[-85.637835,41.942301]},"n860":{"id":"n860","loc":[-85.640052,41.942503]},"n861":{"id":"n861","loc":[-85.639575,41.94251]},"n862":{"id":"n862","loc":[-85.639572,41.942398]},"n863":{"id":"n863","loc":[-85.638782,41.942227]},"n864":{"id":"n864","loc":[-85.63843,41.942226]},"n865":{"id":"n865","loc":[-85.63823,41.942183]},"n866":{"id":"n866","loc":[-85.638363,41.942216],"tags":{"barrier":"gate"}},"n867":{"id":"n867","loc":[-85.6384,41.942223]},"n868":{"id":"n868","loc":[-85.636042,41.942797]},"n869":{"id":"n869","loc":[-85.636308,41.942752]},"n87":{"id":"n87","loc":[-85.637566,41.942367]},"n870":{"id":"n870","loc":[-85.636516,41.942729]},"n871":{"id":"n871","loc":[-85.636782,41.942712]},"n872":{"id":"n872","loc":[-85.636944,41.942706]},"n873":{"id":"n873","loc":[-85.63704,41.942706]},"n874":{"id":"n874","loc":[-85.637237,41.942703]},"n875":{"id":"n875","loc":[-85.637553,41.9427]},"n876":{"id":"n876","loc":[-85.638236,41.942697]},"n877":{"id":"n877","loc":[-85.636284,41.942781]},"n878":{"id":"n878","loc":[-85.636551,41.942641]},"n879":{"id":"n879","loc":[-85.633914,41.943693]},"n88":{"id":"n88","loc":[-85.637566,41.94241]},"n880":{"id":"n880","loc":[-85.63389,41.943708]},"n881":{"id":"n881","loc":[-85.633866,41.943686]},"n882":{"id":"n882","loc":[-85.63389,41.943671]},"n883":{"id":"n883","loc":[-85.633857,41.943609]},"n884":{"id":"n884","loc":[-85.634858,41.944474]},"n885":{"id":"n885","loc":[-85.633988,41.943234]},"n886":{"id":"n886","loc":[-85.633999,41.943485]},"n887":{"id":"n887","loc":[-85.634109,41.943449],"tags":{"emergency":"fire_hydrant"}},"n888":{"id":"n888","loc":[-85.635728,41.942655],"tags":{"emergency":"fire_hydrant"}},"n889":{"id":"n889","loc":[-85.636499,41.942845],"tags":{"man_made":"flagpole"}},"n89":{"id":"n89","loc":[-85.637455,41.94241]},"n890":{"id":"n890","loc":[-85.636197,41.943073]},"n891":{"id":"n891","loc":[-85.636227,41.943073]},"n892":{"id":"n892","loc":[-85.637433,41.942933],"tags":{"addr:city":"Three Rivers","addr:housenumber":"401","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","amenity":"restaurant","cuisine":"pizza","name":"Pizza Hut"}},"n893":{"id":"n893","loc":[-85.637907,41.942879],"tags":{"amenity":"car_wash"}},"n894":{"id":"n894","loc":[-85.637661,41.943018]},"n895":{"id":"n895","loc":[-85.636933,41.942733],"tags":{"emergency":"fire_hydrant"}},"n896":{"id":"n896","loc":[-85.637661,41.94304]},"n897":{"id":"n897","loc":[-85.637562,41.943041]},"n898":{"id":"n898","loc":[-85.637556,41.942725]},"n899":{"id":"n899","loc":[-85.637656,41.942724]},"n9":{"id":"n9","loc":[-85.635159,41.941926]},"n90":{"id":"n90","loc":[-85.637454,41.942367]},"n900":{"id":"n900","loc":[-85.637657,41.942779]},"n901":{"id":"n901","loc":[-85.637983,41.942777]},"n902":{"id":"n902","loc":[-85.637982,41.942616]},"n903":{"id":"n903","loc":[-85.637777,41.942778]},"n904":{"id":"n904","loc":[-85.637775,41.942699]},"n905":{"id":"n905","loc":[-85.637772,41.942618]},"n906":{"id":"n906","loc":[-85.637982,41.942698]},"n907":{"id":"n907","loc":[-85.637941,41.942378],"tags":{"addr:city":"Three Rivers","addr:housenumber":"416","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","name":"Gem Pawnbroker","shop":"pawnbroker"}},"n908":{"id":"n908","loc":[-85.637515,41.942394],"tags":{"second_hand":"only","shop":"car"}},"n909":{"id":"n909","loc":[-85.638743,41.942374],"tags":{"addr:city":"Three Rivers","addr:housenumber":"500","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","name":"William Towing","service:vehicle:towing":"yes","service:vehicle:tyres":"yes","shop":"car_repair"}},"n91":{"id":"n91","loc":[-85.637565,41.942341]},"n910":{"id":"n910","loc":[-85.638594,41.942357]},"n911":{"id":"n911","loc":[-85.634312,41.943562],"tags":{"addr:city":"Three Rivers","addr:housenumber":"145","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","amenity":"cafe","cuisine":"coffee_shop","name":"L.A.'s Coffee Cafe","outdoor_seating":"yes"}},"n912":{"id":"n912","loc":[-85.634404,41.943512]},"n913":{"id":"n913","loc":[-85.634391,41.943519],"tags":{"entrance":"yes"}},"n914":{"id":"n914","loc":[-85.634259,41.943538],"tags":{"entrance":"yes"}},"n915":{"id":"n915","loc":[-85.634247,41.943528]},"n916":{"id":"n916","loc":[-85.633747,41.943322],"tags":{"addr:city":"Three Rivers","addr:housenumber":"132","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","name":"Preferred Insurance Services","office":"insurance"}},"n917":{"id":"n917","loc":[-85.63299,41.943686],"tags":{"addr:city":"Three Rivers","addr:housenumber":"101","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Lynn's Garage","service:vehicle:tyres":"yes","shop":"car_repair"}},"n918":{"id":"n918","loc":[-85.633438,41.944883]},"n919":{"id":"n919","loc":[-85.633265,41.944983]},"n92":{"id":"n92","loc":[-85.637481,41.942341]},"n920":{"id":"n920","loc":[-85.633315,41.945027]},"n921":{"id":"n921","loc":[-85.633376,41.944827]},"n922":{"id":"n922","loc":[-85.633199,41.944922]},"n923":{"id":"n923","loc":[-85.633316,41.944772]},"n924":{"id":"n924","loc":[-85.633147,41.944867]},"n925":{"id":"n925","loc":[-85.633261,41.944719]},"n926":{"id":"n926","loc":[-85.633096,41.944812]},"n927":{"id":"n927","loc":[-85.633191,41.944645]},"n928":{"id":"n928","loc":[-85.632981,41.94476]},"n929":{"id":"n929","loc":[-85.633062,41.94483]},"n93":{"id":"n93","loc":[-85.637481,41.94226]},"n930":{"id":"n930","loc":[-85.633146,41.944602]},"n931":{"id":"n931","loc":[-85.632969,41.944703]},"n932":{"id":"n932","loc":[-85.633008,41.944745]},"n933":{"id":"n933","loc":[-85.633088,41.944545]},"n934":{"id":"n934","loc":[-85.632868,41.944655]},"n935":{"id":"n935","loc":[-85.632941,41.944718]},"n936":{"id":"n936","loc":[-85.633028,41.944483]},"n937":{"id":"n937","loc":[-85.632817,41.944605]},"n938":{"id":"n938","loc":[-85.632923,41.944373]},"n939":{"id":"n939","loc":[-85.632692,41.944485]},"n94":{"id":"n94","loc":[-85.637565,41.94226]},"n940":{"id":"n940","loc":[-85.632871,41.944316]},"n941":{"id":"n941","loc":[-85.632655,41.944421]},"n942":{"id":"n942","loc":[-85.632711,41.944478]},"n943":{"id":"n943","loc":[-85.632825,41.94426]},"n944":{"id":"n944","loc":[-85.632606,41.944363]},"n945":{"id":"n945","loc":[-85.63275,41.94418]},"n946":{"id":"n946","loc":[-85.632588,41.944256]},"n947":{"id":"n947","loc":[-85.632611,41.944279]},"n948":{"id":"n948","loc":[-85.632548,41.944306]},"n949":{"id":"n949","loc":[-85.632512,41.944406]},"n95":{"id":"n95","loc":[-85.637188,41.942217]},"n950":{"id":"n950","loc":[-85.632565,41.944463]},"n951":{"id":"n951","loc":[-85.632579,41.944456]},"n952":{"id":"n952","loc":[-85.632634,41.944518]},"n953":{"id":"n953","loc":[-85.632686,41.944569]},"n954":{"id":"n954","loc":[-85.632745,41.944537]},"n955":{"id":"n955","loc":[-85.632659,41.944587]},"n956":{"id":"n956","loc":[-85.632778,41.944705]},"n957":{"id":"n957","loc":[-85.632815,41.944301],"tags":{"addr:city":"Three Rivers","addr:housenumber":"5","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Access Point Employment","office":"employment_agency"}},"n958":{"id":"n958","loc":[-85.6332,41.944174],"tags":{"addr:city":"Three Rivers","addr:housenumber":"6","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Paisley Emporium","shop":"second_hand"}},"n959":{"id":"n959","loc":[-85.633578,41.944568],"tags":{"addr:city":"Three Rivers","addr:housenumber":"22","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Lowry's Books","shop":"books"}},"n96":{"id":"n96","loc":[-85.637189,41.942303]},"n960":{"id":"n960","loc":[-85.63344,41.944443],"tags":{"addr:city":"Three Rivers","addr:housenumber":"16","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","amenity":"restaurant","cuisine":"pizza","name":"Paisano's Bar and Grill"}},"n961":{"id":"n961","loc":[-85.633009,41.944542],"tags":{"addr:city":"Three Rivers","addr:housenumber":"13","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","amenity":"cafe","cuisine":"american","internet_access":"yes","name":"Main Street Cafe"}},"n962":{"id":"n962","loc":[-85.633674,41.944682],"tags":{"addr:city":"Three Rivers","addr:housenumber":"28","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","leisure":"fitness_centre","name":"Main Street Fitness"}},"n963":{"id":"n963","loc":[-85.633376,41.944868],"tags":{"addr:city":"Three Rivers","addr:housenumber":"27","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","leisure":"fitness_centre","name":"Main Street Barbell"}},"n964":{"id":"n964","loc":[-85.633366,41.944783]},"n965":{"id":"n965","loc":[-85.633296,41.94482]},"n966":{"id":"n966","loc":[-85.633214,41.94487]},"n967":{"id":"n967","loc":[-85.633005,41.944988]},"n968":{"id":"n968","loc":[-85.633269,41.944816]},"n969":{"id":"n969","loc":[-85.633215,41.944842]},"n97":{"id":"n97","loc":[-85.637299,41.942302]},"n970":{"id":"n970","loc":[-85.633245,41.944871]},"n971":{"id":"n971","loc":[-85.633296,41.944845]},"n972":{"id":"n972","loc":[-85.633254,41.944845],"tags":{"natural":"tree"}},"n973":{"id":"n973","loc":[-85.633557,41.945515]},"n974":{"id":"n974","loc":[-85.633279,41.945246]},"n975":{"id":"n975","loc":[-85.63324,41.945226]},"n976":{"id":"n976","loc":[-85.6332,41.945213]},"n977":{"id":"n977","loc":[-85.633133,41.945164]},"n978":{"id":"n978","loc":[-85.63312,41.945132]},"n979":{"id":"n979","loc":[-85.633095,41.945081]},"n98":{"id":"n98","loc":[-85.637299,41.942314]},"n980":{"id":"n980","loc":[-85.633064,41.945047]},"n981":{"id":"n981","loc":[-85.632739,41.944742]},"n982":{"id":"n982","loc":[-85.633281,41.945026]},"n983":{"id":"n983","loc":[-85.633155,41.944903]},"n984":{"id":"n984","loc":[-85.633079,41.944829]},"n985":{"id":"n985","loc":[-85.63304,41.944853]},"n986":{"id":"n986","loc":[-85.632949,41.944776]},"n987":{"id":"n987","loc":[-85.632921,41.944725]},"n988":{"id":"n988","loc":[-85.632859,41.944673]},"n989":{"id":"n989","loc":[-85.632895,41.94505]},"n99":{"id":"n99","loc":[-85.637396,41.942313]},"n990":{"id":"n990","loc":[-85.633336,41.945138]},"n991":{"id":"n991","loc":[-85.633466,41.945265]},"n992":{"id":"n992","loc":[-85.633367,41.945327]},"n993":{"id":"n993","loc":[-85.633163,41.945189]},"n994":{"id":"n994","loc":[-85.633678,41.945309]},"n995":{"id":"n995","loc":[-85.633619,41.945261]},"n996":{"id":"n996","loc":[-85.63355,41.945301]},"n997":{"id":"n997","loc":[-85.633607,41.945352]},"n998":{"id":"n998","loc":[-85.633579,41.945327],"tags":{"entrance":"yes"}},"n999":{"id":"n999","loc":[-85.633445,41.945404]},"r2":{"id":"r2","members":[{"id":"w225","role":"outer","type":"way"}],"tags":{"type":"multipolygon","waterway":"riverbank"}},"r5":{"id":"r5","members":[{"id":"w642","role":"outer","type":"way"}],"tags":{"admin_level":"8","border_type":"city","boundary":"administrative","name":"Three Rivers","place":"city","type":"boundary"}},"w1":{"id":"w1","nodes":["n5","n1797"],"tags":{"highway":"residential","name":"12th Avenue"}},"w10":{"id":"w10","nodes":["n54","n55","n56","n57","n891","n890","n54"],"tags":{"building":"yes"}},"w100":{"id":"w100","nodes":["n451","n915","n452"],"tags":{"highway":"footway"}},"w101":{"id":"w101","nodes":["n461","n462","n463","n464","n465","n466"],"tags":{"barrier":"fence"}},"w102":{"id":"w102","nodes":["n467","n468","n469","n470","n472","n467"],"tags":{"amenity":"parking"}},"w103":{"id":"w103","nodes":["n2597","n2444","n471","n472"],"tags":{"highway":"footway"}},"w104":{"id":"w104","nodes":["n473","n474","n325"],"tags":{"footway":"sidewalk","highway":"footway"}},"w105":{"id":"w105","nodes":["n475","n324","n325"],"tags":{"footway":"sidewalk","highway":"footway"}},"w106":{"id":"w106","nodes":["n886","n452","n476"],"tags":{"footway":"sidewalk","highway":"footway"}},"w107":{"id":"w107","nodes":["n485","n4678","n486","n18"],"tags":{"highway":"service"}},"w108":{"id":"w108","nodes":["n300","n487","n488","n489","n490"],"tags":{"highway":"footway"}},"w109":{"id":"w109","nodes":["n490","n491"],"tags":{"highway":"footway"}},"w11":{"id":"w11","nodes":["n58","n63","n59","n315","n60"],"tags":{"highway":"service"}},"w110":{"id":"w110","nodes":["n492","n493","n494","n495","n496","n497","n492"],"tags":{"building":"yes"}},"w111":{"id":"w111","nodes":["n498","n499","n511"],"tags":{"highway":"service"}},"w112":{"id":"w112","nodes":["n510","n500","n501","n502","n503","n504","n505","n506","n507","n508","n509"],"tags":{"highway":"service"}},"w113":{"id":"w113","nodes":["n511","n510"],"tags":{"covered":"yes","highway":"service"}},"w114":{"id":"w114","nodes":["n512","n513","n514","n515","n512"],"tags":{"building":"yes"}},"w115":{"id":"w115","nodes":["n516","n517","n518","n519","n516"],"tags":{"building":"yes"}},"w116":{"id":"w116","nodes":["n520","n521","n522","n523","n520"],"tags":{"building":"yes"}},"w117":{"id":"w117","nodes":["n524","n525","n526","n527","n528","n529","n530","n531","n532","n533","n534","n535","n524"],"tags":{"building":"yes"}},"w118":{"id":"w118","nodes":["n536","n537","n538","n539","n536"],"tags":{"building":"yes"}},"w119":{"id":"w119","nodes":["n540","n541","n542","n543","n544","n545","n546","n547","n540"],"tags":{"building":"yes"}},"w12":{"id":"w12","nodes":["n61","n314","n70","n62","n63"],"tags":{"highway":"service"}},"w120":{"id":"w120","nodes":["n548","n549","n550","n551","n552","n553","n554","n555","n556","n557","n548"],"tags":{"building":"yes"}},"w121":{"id":"w121","nodes":["n558","n559","n560","n561","n562","n563","n564","n565","n558"],"tags":{"building":"yes"}},"w122":{"id":"w122","nodes":["n566","n567","n568","n569","n566"],"tags":{"building":"yes"}},"w123":{"id":"w123","nodes":["n570","n571","n572","n573","n570"],"tags":{"building":"yes"}},"w124":{"id":"w124","nodes":["n574","n575","n576","n577","n574"],"tags":{"building":"yes"}},"w125":{"id":"w125","nodes":["n578","n579","n580","n581","n578"],"tags":{"building":"yes"}},"w126":{"id":"w126","nodes":["n582","n583","n584","n585","n582"],"tags":{"building":"yes"}},"w127":{"id":"w127","nodes":["n586","n587","n588","n589","n590","n591","n592","n593","n586"],"tags":{"building":"yes"}},"w128":{"id":"w128","nodes":["n594","n595","n596","n597","n598","n599","n600","n601","n594"],"tags":{"building":"yes"}},"w129":{"id":"w129","nodes":["n309","n602","n603"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w13":{"id":"w13","nodes":["n64","n65","n66","n67","n68","n69","n64"],"tags":{"amenity":"parking"}},"w130":{"id":"w130","nodes":["n603","n604"],"tags":{"footway":"sidewalk","highway":"footway"}},"w131":{"id":"w131","nodes":["n604","n605","n606"],"tags":{"footway":"sidewalk","highway":"footway"}},"w132":{"id":"w132","nodes":["n606","n607"],"tags":{"footway":"sidewalk","highway":"footway"}},"w133":{"id":"w133","nodes":["n607","n610","n608","n603"],"tags":{"footway":"sidewalk","highway":"footway"}},"w134":{"id":"w134","nodes":["n609","n610","n611"],"tags":{"highway":"service","service":"driveway","surface":"unpaved"}},"w135":{"id":"w135","nodes":["n244","n245","n246"],"tags":{"highway":"service"}},"w136":{"id":"w136","nodes":["n612","n613","n614","n615","n612"],"tags":{"amenity":"shelter"}},"w137":{"id":"w137","nodes":["n2779","n2788","n2776","n2778","n2775","n2787","n2440","n2437","n629","n2438","n630","n2439","n2407","n2408","n2409"],"tags":{"highway":"residential","name":"Foster Street"}},"w138":{"id":"w138","nodes":["n2779","n625","n626","n627"],"tags":{"highway":"residential","name":"Foster Street","oneway":"yes"}},"w139":{"id":"w139","nodes":["n630","n631","n632","n2437"],"tags":{"highway":"service"}},"w14":{"id":"w14","nodes":["n71","n72","n73","n74","n71"],"tags":{"building":"yes"}},"w140":{"id":"w140","nodes":["n643","n637","n715","n2410"],"tags":{"highway":"footway","name":"Mural Mall"}},"w141":{"id":"w141","nodes":["n639","n2516"],"tags":{"barrier":"wall"}},"w142":{"id":"w142","nodes":["n640","n641","n645","n642","n660","n643","n644"],"tags":{"highway":"service"}},"w143":{"id":"w143","nodes":["n646","n647"],"tags":{"highway":"service"}},"w144":{"id":"w144","nodes":["n654","n655","n656"],"tags":{"barrier":"wall"}},"w145":{"id":"w145","nodes":["n665","n666","n667"],"tags":{"barrier":"wall"}},"w146":{"id":"w146","nodes":["n2727","n662","n2719"],"tags":{"highway":"service","oneway":"yes","service":"parking_aisle"}},"w147":{"id":"w147","nodes":["n2725","n674"],"tags":{"highway":"service","oneway":"yes"}},"w148":{"id":"w148","nodes":["n2464","n2460","n2454","n684","n2455","n2464"],"tags":{"building":"yes"}},"w149":{"id":"w149","nodes":["n2456","n685","n686","n687","n2456"],"tags":{"building":"yes"}},"w15":{"id":"w15","nodes":["n75","n76","n77","n78","n75"],"tags":{"building":"yes"}},"w150":{"id":"w150","nodes":["n685","n688","n689","n690","n691","n692","n686","n685"],"tags":{"building":"yes"}},"w151":{"id":"w151","nodes":["n688","n693","n694","n689","n688"],"tags":{"building":"yes"}},"w152":{"id":"w152","nodes":["n693","n695","n702","n696","n697","n694","n693"],"tags":{"building":"yes"}},"w153":{"id":"w153","nodes":["n695","n698","n699","n700","n701","n702","n695"],"tags":{"building":"yes"}},"w154":{"id":"w154","nodes":["n698","n703","n707","n704","n699","n698"],"tags":{"building":"yes"}},"w155":{"id":"w155","nodes":["n703","n705","n706","n707","n703"],"tags":{"building":"yes"}},"w156":{"id":"w156","nodes":["n705","n708","n709","n706","n705"],"tags":{"building":"yes"}},"w157":{"id":"w157","nodes":["n709","n710","n711","n708","n709"],"tags":{"building":"yes"}},"w158":{"id":"w158","nodes":["n369","n712","n725","n713","n714","n715","n727","n716","n717","n718","n719"],"tags":{"footway":"sidewalk","highway":"footway"}},"w159":{"id":"w159","nodes":["n714","n720","n721"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w16":{"id":"w16","nodes":["n79","n80","n81","n82","n83","n84","n85","n86","n79"],"tags":{"building":"yes"}},"w160":{"id":"w160","nodes":["n729","n721","n722","n964","n723","n724"],"tags":{"footway":"sidewalk","highway":"footway"}},"w161":{"id":"w161","nodes":["n713","n726","n722"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w162":{"id":"w162","nodes":["n727","n2411","n728"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w163":{"id":"w163","nodes":["n729","n730","n731"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w164":{"id":"w164","nodes":["n365","n732","n733","n738"],"tags":{"footway":"sidewalk","highway":"footway"}},"w165":{"id":"w165","nodes":["n724","n734","n367","n735","n736","n737"],"tags":{"footway":"sidewalk","highway":"footway"}},"w166":{"id":"w166","nodes":["n739","n2037","n2038","n2039","n2040","n1623","n2032"],"tags":{"highway":"footway"}},"w167":{"id":"w167","nodes":["n150","n751"],"tags":{"highway":"service"}},"w168":{"id":"w168","nodes":["n752","n753","n754","n755","n752"],"tags":{"building":"yes"}},"w169":{"id":"w169","nodes":["n756","n757","n758","n759","n756"],"tags":{"building":"yes"}},"w17":{"id":"w17","nodes":["n87","n88","n89","n90","n87"],"tags":{"building":"yes"}},"w170":{"id":"w170","nodes":["n760","n761","n762","n763","n764","n765","n760"],"tags":{"building":"yes"}},"w171":{"id":"w171","nodes":["n766","n767","n768","n769","n770","n771","n772","n773","n774","n775","n776","n777","n766"],"tags":{"building":"yes"}},"w172":{"id":"w172","nodes":["n778","n779","n780","n781","n782","n783","n784","n785","n778"],"tags":{"building":"yes"}},"w173":{"id":"w173","nodes":["n786","n787","n788","n789","n786"],"tags":{"building":"yes"}},"w174":{"id":"w174","nodes":["n790","n791","n792","n793","n794","n795","n796","n797","n798","n799","n800","n801","n790"],"tags":{"building":"yes"}},"w175":{"id":"w175","nodes":["n802","n803","n804","n805","n802"],"tags":{"building":"yes"}},"w176":{"id":"w176","nodes":["n806","n807","n808","n809","n810","n811","n812","n813","n814","n815","n806"],"tags":{"building":"yes"}},"w177":{"id":"w177","nodes":["n816","n1140","n817","n818","n819","n820","n821"],"tags":{"highway":"service"}},"w178":{"id":"w178","nodes":["n822","n823","n824","n825","n822"],"tags":{"building":"yes"}},"w179":{"id":"w179","nodes":["n841","n842","n843","n844","n841"],"tags":{"building":"yes"}},"w18":{"id":"w18","nodes":["n91","n92","n93","n94","n91"],"tags":{"building":"yes"}},"w180":{"id":"w180","nodes":["n845","n856","n846"],"tags":{"highway":"service"}},"w181":{"id":"w181","nodes":["n846","n847","n848","n849","n850","n851","n852","n853","n854","n855","n856"],"tags":{"highway":"service","oneway":"yes","service":"drive-through"}},"w182":{"id":"w182","nodes":["n857","n858"],"tags":{"highway":"service"}},"w183":{"id":"w183","nodes":["n859","n860","n861","n862","n859"],"tags":{"amenity":"parking"}},"w184":{"id":"w184","nodes":["n863","n864","n867","n866","n865"],"tags":{"highway":"service"}},"w185":{"id":"w185","nodes":["n883","n884"],"tags":{"barrier":"fence"}},"w186":{"id":"w186","nodes":["n1954","n622","n1955"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w187":{"id":"w187","nodes":["n621","n1954"],"tags":{"highway":"steps","incline":"up","name":"Riverwalk Trail","surface":"wood"}},"w188":{"id":"w188","nodes":["n2274","n2275","n2276","n2277","n2278","n2279","n1953","n621"],"tags":{"highway":"path","name":"Riverwalk Trail","surface":"wood"}},"w189":{"id":"w189","nodes":["n2273","n2274"],"tags":{"highway":"steps","incline":"down","name":"Riverwalk Trail","surface":"wood"}},"w19":{"id":"w19","nodes":["n95","n96","n97","n98","n99","n100","n101","n102","n95"],"tags":{"building":"yes"}},"w190":{"id":"w190","nodes":["n821","n894","n900","n903","n901"],"tags":{"highway":"service"}},"w191":{"id":"w191","nodes":["n896","n897","n898","n899","n900","n894","n896"],"tags":{"amenity":"parking"}},"w192":{"id":"w192","nodes":["n903","n904","n905"],"tags":{"highway":"service"}},"w193":{"id":"w193","nodes":["n901","n906","n902"],"tags":{"highway":"service"}},"w194":{"id":"w194","nodes":["n912","n913"],"tags":{"highway":"footway"}},"w195":{"id":"w195","nodes":["n914","n915"],"tags":{"highway":"footway"}},"w196":{"id":"w196","nodes":["n2466","n918","n919","n920","n2466"],"tags":{"building":"yes"}},"w197":{"id":"w197","nodes":["n918","n921","n922","n919","n918"],"tags":{"building":"yes"}},"w198":{"id":"w198","nodes":["n923","n925","n926","n924","n923"],"tags":{"building":"yes"}},"w199":{"id":"w199","nodes":["n925","n927","n932","n928","n929","n926","n925"],"tags":{"building":"yes"}},"w2":{"id":"w2","nodes":["n3523","n2182","n2160"],"tags":{"highway":"service"}},"w20":{"id":"w20","nodes":["n103","n104","n105","n106","n107","n108","n109","n110","n111","n112","n113","n114","n103"],"tags":{"building":"yes"}},"w200":{"id":"w200","nodes":["n927","n930","n931","n932","n927"],"tags":{"building":"yes"}},"w201":{"id":"w201","nodes":["n930","n933","n934","n935","n931","n930"],"tags":{"building":"yes"}},"w202":{"id":"w202","nodes":["n933","n936","n937","n934","n933"],"tags":{"building":"yes"}},"w203":{"id":"w203","nodes":["n936","n938","n942","n939","n954","n937","n936"],"tags":{"building":"yes"}},"w204":{"id":"w204","nodes":["n938","n940","n941","n942","n938"],"tags":{"building":"yes"}},"w205":{"id":"w205","nodes":["n940","n943","n944","n941","n940"],"tags":{"building":"yes"}},"w206":{"id":"w206","nodes":["n943","n945","n946","n947","n948","n944","n943"],"tags":{"building":"yes"}},"w207":{"id":"w207","nodes":["n944","n949","n950","n951","n941","n944"],"tags":{"building":"yes"}},"w208":{"id":"w208","nodes":["n941","n951","n952","n939","n942","n941"],"tags":{"building":"yes"}},"w209":{"id":"w209","nodes":["n952","n953","n954","n939","n952"],"tags":{"building":"yes"}},"w21":{"id":"w21","nodes":["n115","n116","n117","n118","n115"],"tags":{"building":"yes"}},"w210":{"id":"w210","nodes":["n953","n955","n956","n934","n937","n954","n953"],"tags":{"building":"yes"}},"w211":{"id":"w211","nodes":["n964","n965"],"tags":{"highway":"footway"}},"w212":{"id":"w212","nodes":["n966","n983","n967","n989"],"tags":{"highway":"footway"}},"w213":{"id":"w213","nodes":["n965","n968","n969","n966","n970","n971","n965"],"tags":{"highway":"footway"}},"w214":{"id":"w214","nodes":["n973","n999","n992","n974","n975","n976","n993","n977","n978","n979","n980","n967","n981","n1000","n1001","n1002","n1003","n1004","n1005","n1006","n1007","n1008","n1009"],"tags":{"footway":"sidewalk","highway":"footway"}},"w215":{"id":"w215","nodes":["n978","n982","n983","n984","n985","n986","n987","n988","n981"],"tags":{"highway":"footway"}},"w216":{"id":"w216","nodes":["n976","n990","n991","n992"],"tags":{"highway":"footway"}},"w217":{"id":"w217","nodes":["n998","n999"],"tags":{"highway":"footway"}},"w218":{"id":"w218","nodes":["n1019","n1020","n1021","n1022","n731","n728","n1023","n1025","n1024","n1019"],"tags":{"footway":"sidewalk","highway":"footway"}},"w219":{"id":"w219","nodes":["n719","n1026","n1027"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w22":{"id":"w22","nodes":["n119","n120","n121","n122","n119"],"tags":{"building":"yes"}},"w220":{"id":"w220","nodes":["n1027","n1028","n1019"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w221":{"id":"w221","nodes":["n2080","n1828","n1863","n1829"],"tags":{"highway":"tertiary","name":"Constantine Street"}},"w222":{"id":"w222","nodes":["n1029","n1030","n1031"],"tags":{"highway":"service"}},"w223":{"id":"w223","nodes":["n2213","n2171","n2183","n2180","n2205","n2177","n2179","n2218","n2200","n2188","n2169","n2196","n2162","n2170","n2211","n2216","n2204","n2220","n2164","n2210","n2217","n2189","n460","n453","n2282"],"tags":{"name":"Rocky River","waterway":"river"}},"w224":{"id":"w224","nodes":["n3750","n3751","n3752"],"tags":{"highway":"service","service":"alley","surface":"unpaved"}},"w225":{"id":"w225","nodes":["n2134","n2127","n2313","n2109","n2112","n2129","n2156","n2146","n2126","n2153","n2288","n2283","n2284","n2131","n2286","n2287","n2285","n2132","n2140","n2289","n2122","n2114","n2149","n2119","n2106","n2111","n2145","n2113","n2117","n2159","n2143","n2123","n2142","n2116","n2154","n2139","n2150","n2157","n2120","n2138","n2130","n2136","n2155","n2107","n2141","n2124","n3754","n2121","n2105","n2108","n3755","n2128","n2110","n2152","n2125","n2135","n2186","n2115","n2144","n2137","n2133","n2148","n2118","n1871","n1875","n1872","n2041","n1873","n2042","n1874","n1884","n1870","n2151","n2147","n2158","n2104","n2134"]},"w226":{"id":"w226","nodes":["n2243","n2280","n2244","n2245","n2246","n2247","n1931","n1932","n1933","n1934","n1935","n1936","n1937","n1938","n4681","n1939","n1940","n1941","n1942","n1943","n1944","n1945","n1946","n1947"],"tags":{"highway":"path","name":"Riverwalk Trail","surface":"asphalt","width":"3"}},"w227":{"id":"w227","nodes":["n2994","n3012","n3011","n2958"],"tags":{"highway":"secondary","name":"Main Street"}},"w228":{"id":"w228","nodes":["n2747","n2762","n2757","n2746","n2761","n2758","n2760","n2755","n2749","n2691","n1028","n2432","n2414","n2413","n2412","n2411","n2410","n720","n726","n370","n368","n2748"],"tags":{"highway":"primary","name":"Main Street"}},"w229":{"id":"w229","nodes":["n2083","n2103","n2102","n2084","n2085","n2086","n2087","n2242","n471","n324","n2101","n332","n1868"],"tags":{"name":"Conrail Railroad","railway":"rail"}},"w23":{"id":"w23","nodes":["n123","n124","n125","n126","n123"],"tags":{"building":"yes"}},"w230":{"id":"w230","nodes":["n2232","n2236","n2231","n2230","n2226","n2241","n2237","n2227","n1182","n2233","n2228","n2229","n1183","n2234","n19","n1891","n20","n2223","n2224","n2238","n2235","n2240","n2225","n2239"],"tags":{"name":"Saint Joseph River","waterway":"river"}},"w231":{"id":"w231","nodes":["n456","n1036","n1037","n1038"],"tags":{"barrier":"wall"}},"w232":{"id":"w232","nodes":["n1034","n1039","n1040"],"tags":{"barrier":"wall"}},"w233":{"id":"w233","nodes":["n1041","n1042","n1043","n1044","n1045","n1046","n1041"],"tags":{"access":"private","leisure":"swimming_pool"}},"w234":{"id":"w234","nodes":["n1047","n1048"],"tags":{"barrier":"hedge"}},"w235":{"id":"w235","nodes":["n1049","n1050","n1051","n1052","n1049"],"tags":{"building":"yes"}},"w236":{"id":"w236","nodes":["n1053","n1054","n1055","n1056","n1057","n1058","n1059","n1060","n1053"],"tags":{"building":"yes"}},"w237":{"id":"w237","nodes":["n1061","n1062","n1063","n1064","n1065","n1061"],"tags":{"building":"yes"}},"w238":{"id":"w238","nodes":["n1066","n1067","n1068","n1069","n1070","n1071","n1066"],"tags":{"building":"yes"}},"w239":{"id":"w239","nodes":["n1072","n1073","n1074","n1075","n1072"],"tags":{"building":"yes"}},"w24":{"id":"w24","nodes":["n127","n128","n129","n130","n127"],"tags":{"building":"yes"}},"w240":{"id":"w240","nodes":["n1076","n1077","n1078","n1079","n1080","n1081","n1076"],"tags":{"building":"yes"}},"w241":{"id":"w241","nodes":["n1082","n1083","n1084","n1085","n1082"],"tags":{"building":"yes"}},"w242":{"id":"w242","nodes":["n1086","n1087","n1088","n1089","n1086"],"tags":{"building":"yes"}},"w243":{"id":"w243","nodes":["n1090","n1091","n1092","n1093","n1094","n1095","n1096","n1097","n1090"],"tags":{"building":"yes"}},"w244":{"id":"w244","nodes":["n1098","n1099","n1100","n1101"],"tags":{"barrier":"fence"}},"w245":{"id":"w245","nodes":["n1102","n835","n30","n2590","n35","n29","n2591","n34","n28","n2592","n2312","n32","n2593","n31","n33","n2594","n2595","n1102"],"tags":{"highway":"service"}},"w246":{"id":"w246","nodes":["n1103","n1139","n1104"],"tags":{"barrier":"fence"}},"w247":{"id":"w247","nodes":["n1105","n1106","n1107","n1108","n1109","n1110","n1111","n1112","n1113","n1114","n1105"],"tags":{"building":"yes"}},"w248":{"id":"w248","nodes":["n1115","n1116","n1117","n1118","n1119","n1120","n1115"],"tags":{"building":"yes"}},"w249":{"id":"w249","nodes":["n1121","n1122","n1123","n1124","n1121"],"tags":{"building":"yes"}},"w25":{"id":"w25","nodes":["n131","n132","n133","n134","n135","n136","n137","n138","n139","n140","n141","n142","n131"],"tags":{"building":"yes"}},"w250":{"id":"w250","nodes":["n1125","n1126","n1127","n1128","n1129","n1130","n1131","n1132","n1133","n1134","n1135","n1136","n1125"],"tags":{"building":"yes"}},"w251":{"id":"w251","nodes":["n1137","n1138","n1139"],"tags":{"barrier":"fence"}},"w252":{"id":"w252","nodes":["n876","n1140","n1141"],"tags":{"footway":"sidewalk","highway":"footway"}},"w253":{"id":"w253","nodes":["n1141","n1142","n1143","n1144","n1145","n1146"],"tags":{"footway":"sidewalk","highway":"footway"}},"w254":{"id":"w254","nodes":["n1146","n4743","n1147","n1148"],"tags":{"footway":"sidewalk","highway":"footway"}},"w255":{"id":"w255","nodes":["n1148","n1149","n1150","n1151"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w256":{"id":"w256","nodes":["n1151","n1153","n1154","n1155"],"tags":{"footway":"sidewalk","highway":"footway"}},"w257":{"id":"w257","nodes":["n1155","n1156"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w258":{"id":"w258","nodes":["n1157","n1158"],"tags":{"barrier":"retaining_wall"}},"w259":{"id":"w259","nodes":["n1156","n1161","n1159","n1160","n719"],"tags":{"footway":"sidewalk","highway":"footway"}},"w26":{"id":"w26","nodes":["n143","n608","n144"],"tags":{"highway":"service"}},"w260":{"id":"w260","nodes":["n1162","n1163","n1164","n1165","n1166","n1167","n1168","n1169","n1170","n2528"],"tags":{"highway":"footway"}},"w261":{"id":"w261","nodes":["n1171","n1172","n1173"],"tags":{"barrier":"wall"}},"w262":{"id":"w262","nodes":["n1175","n1176","n1177","n1178","n1179","n1180","n1181","n1175"],"tags":{"natural":"wood"}},"w263":{"id":"w263","nodes":["n1947","n1184","n1948","n1185","n1949","n1957","n1950","n480","n1951","n479","n478","n477","n1952","n1851","n1956","n2248","n619","n618","n2249","n2250","n2251","n617","n2252","n616","n2253","n829","n2254","n827","n828","n2255","n830","n2256","n826","n2257","n831","n2258","n832","n835","n834","n2312","n2267","n2259","n833","n2268","n2260","n836","n2261","n837","n2262","n838","n2263","n2264","n839","n2265","n840","n2266"],"tags":{"highway":"path","name":"Riverwalk Trail","surface":"asphalt","width":"3"}},"w264":{"id":"w264","nodes":["n1186","n1187","n1188","n1189","n1186"],"tags":{"building":"yes"}},"w265":{"id":"w265","nodes":["n1190","n1191","n1192","n1193","n1190"],"tags":{"building":"yes"}},"w266":{"id":"w266","nodes":["n1194","n1195","n1196","n1197","n1198","n1199","n1200","n1201","n1194"],"tags":{"building":"yes"}},"w267":{"id":"w267","nodes":["n1205","n1206","n1207","n1208","n1209","n1210","n1205"],"tags":{"building":"house"}},"w268":{"id":"w268","nodes":["n1211","n1212","n1213","n1214","n1215","n1216","n1217","n1218","n1219","n1220","n1211"],"tags":{"building":"house"}},"w269":{"id":"w269","nodes":["n1221","n1225","n1222","n1223","n1224","n1221"],"tags":{"building":"house"}},"w27":{"id":"w27","nodes":["n145","n147","n146"],"tags":{"highway":"footway"}},"w270":{"id":"w270","nodes":["n1225","n1226","n1227","n1229","n1228"],"tags":{"barrier":"fence"}},"w271":{"id":"w271","nodes":["n1229","n1230"],"tags":{"barrier":"fence"}},"w272":{"id":"w272","nodes":["n1231","n1232","n1233","n1234","n1235","n1236","n1237","n1238","n1231"],"tags":{"building":"house"}},"w273":{"id":"w273","nodes":["n1239","n1240","n1241","n1242","n1243","n1244","n1245","n1246","n1239"],"tags":{"building":"house"}},"w274":{"id":"w274","nodes":["n1247","n1248","n1249","n1250","n1247"],"tags":{"building":"house"}},"w275":{"id":"w275","nodes":["n1251","n1252","n1253","n1254","n1255","n1256","n1251"],"tags":{"building":"house"}},"w276":{"id":"w276","nodes":["n1257","n1258","n1259","n1260","n1257"],"tags":{"building":"shed"}},"w277":{"id":"w277","nodes":["n1261","n1262","n1263","n1264","n1265","n1266","n1267","n1268","n1261"],"tags":{"building":"house"}},"w278":{"id":"w278","nodes":["n1269","n1270","n1271","n1272","n1273","n1274","n1284","n1269"],"tags":{"building":"house"}},"w279":{"id":"w279","nodes":["n1275","n1276","n1277","n1278","n1279","n1280","n1275"],"tags":{"building":"house"}},"w28":{"id":"w28","nodes":["n147","n148"],"tags":{"highway":"footway"}},"w280":{"id":"w280","nodes":["n1281","n1282","n1283","n1284"],"tags":{"barrier":"fence"}},"w281":{"id":"w281","nodes":["n1285","n1286","n1287","n1288","n1285"],"tags":{"building":"house"}},"w282":{"id":"w282","nodes":["n1289","n1290","n1291","n1292","n1293","n1294","n1295","n1296","n1289"],"tags":{"building":"house"}},"w283":{"id":"w283","nodes":["n1297","n1298","n1299","n1300","n1301","n1302","n1297"],"tags":{"access":"private","leisure":"swimming_pool"}},"w284":{"id":"w284","nodes":["n1303","n1304","n1305","n1306","n1307","n1308","n1309","n1310","n1311","n1312","n1303"],"tags":{"building":"house"}},"w285":{"id":"w285","nodes":["n1313","n1314","n1315","n1316","n1313"],"tags":{"building":"house"}},"w286":{"id":"w286","nodes":["n1317","n1318","n1319","n1320","n1321","n1322","n1323","n1324","n1325","n1326","n1327","n1328","n1329","n1330","n1317"],"tags":{"building":"house"}},"w287":{"id":"w287","nodes":["n1331","n1332","n1333","n1334","n1465","n1335","n1336","n1331"],"tags":{"building":"yes"}},"w288":{"id":"w288","nodes":["n1349","n1350","n1351","n1352","n1353","n1354","n1355","n1337","n1338","n1341","n1342","n1343","n1344","n1345","n1346","n1347","n1348","n1339","n1340","n1349"],"tags":{"access":"private","leisure":"swimming_pool"}},"w289":{"id":"w289","nodes":["n1356","n1331"],"tags":{"barrier":"fence"}},"w29":{"id":"w29","nodes":["n149","n874","n150","n151","n897","n898","n875","n152"],"tags":{"highway":"service","oneway":"yes"}},"w290":{"id":"w290","nodes":["n1357","n1358","n1359","n1360","n1357"],"tags":{"building":"shed"}},"w291":{"id":"w291","nodes":["n1358","n1361","n1362"],"tags":{"barrier":"fence"}},"w292":{"id":"w292","nodes":["n1363","n1364","n1365","n1366","n1367","n1368","n1363"],"tags":{"building":"house"}},"w293":{"id":"w293","nodes":["n1369","n1370","n1371","n1372","n1373","n1374","n1369"],"tags":{"leisure":"swimming_pool"}},"w294":{"id":"w294","nodes":["n1367","n1375","n1376","n1377"],"tags":{"barrier":"fence"}},"w295":{"id":"w295","nodes":["n1378","n1379","n1380","n1381","n1378"],"tags":{"building":"house"}},"w296":{"id":"w296","nodes":["n1382","n1383","n1384","n1385","n1386","n1387","n1382"],"tags":{"building":"house"}},"w297":{"id":"w297","nodes":["n1388","n1389","n1390","n1391","n1392","n1393","n1388"],"tags":{"building":"house"}},"w298":{"id":"w298","nodes":["n1394","n1395","n1396","n1397","n1394"],"tags":{"building":"house"}},"w299":{"id":"w299","nodes":["n1398","n1399","n1400","n1401","n1398"],"tags":{"access":"private3","leisure":"swimming_pool"}},"w3":{"id":"w3","nodes":["n1","n2"],"tags":{"highway":"track","name":"Water Street"}},"w30":{"id":"w30","nodes":["n153","n154","n155","n156","n153"],"tags":{"amenity":"parking"}},"w300":{"id":"w300","nodes":["n1402","n1403","n1404","n1405","n1406","n1407","n1408","n1409","n1410","n1411","n1412","n1413","n1402"],"tags":{"building":"house"}},"w301":{"id":"w301","nodes":["n1414","n1415","n1416","n1417","n1414"],"tags":{"building":"garage"}},"w302":{"id":"w302","nodes":["n1406","n1418","n1419","n1403"],"tags":{"barrier":"fence"}},"w303":{"id":"w303","nodes":["n1423","n1424","n1425","n1426","n1427","n1428","n1429","n1430","n1431","n1432","n1423"],"tags":{"building":"house"}},"w304":{"id":"w304","nodes":["n1433","n1434","n1435","n1446","n1436","n1437","n1438","n1439","n1444","n1440","n1441","n1445","n1442","n1443","n1433"],"tags":{"access":"private","leisure":"swimming_pool"}},"w305":{"id":"w305","nodes":["n1447","n1448","n1452","n1453","n1454","n1451","n1449","n1450","n1447"],"tags":{"building":"house"}},"w306":{"id":"w306","nodes":["n1455","n1456","n1457","n1458","n1455"],"tags":{"building":"shed"}},"w307":{"id":"w307","nodes":["n1459","n1460","n1461","n1462","n1459"],"tags":{"building":"shed"}},"w308":{"id":"w308","nodes":["n1463","n1464"],"tags":{"barrier":"fence"}},"w309":{"id":"w309","nodes":["n1465","n1466","n1467","n1468"],"tags":{"barrier":"fence"}},"w31":{"id":"w31","nodes":["n157","n605","n158"],"tags":{"highway":"service"}},"w310":{"id":"w310","nodes":["n1469","n1481","n1463"],"tags":{"barrier":"hedge"}},"w311":{"id":"w311","nodes":["n1470","n1471","n1472","n1473","n1474","n1475","n1480","n1476","n1477","n1478","n1479","n1470"],"tags":{"building":"house"}},"w312":{"id":"w312","nodes":["n1480","n1481"],"tags":{"barrier":"wall"}},"w313":{"id":"w313","nodes":["n1482","n1483","n1484","n1485","n1486","n1487","n1488","n1489","n1490","n1491","n1482"],"tags":{"access":"private","leisure":"swimming_pool"}},"w314":{"id":"w314","nodes":["n1492","n1493","n1494","n1495","n1496","n1497","n1498","n1499","n1500","n1501","n1502","n1503","n1504","n1505","n1492"],"tags":{"building":"house"}},"w315":{"id":"w315","nodes":["n1506","n1507","n1508","n1509","n1510","n1511","n1512","n1513","n1514","n1515","n1506"],"tags":{"building":"house"}},"w316":{"id":"w316","nodes":["n1516","n1517","n1518","n1519","n1520","n1521","n1522","n1523","n1516"],"tags":{"building":"house"}},"w317":{"id":"w317","nodes":["n1524","n1525","n1526","n1527","n1528","n1529","n1530","n1531","n1524"],"tags":{"building":"house"}},"w318":{"id":"w318","nodes":["n1532","n1533"],"tags":{"barrier":"fence"}},"w319":{"id":"w319","nodes":["n1534","n1532","n1535"],"tags":{"barrier":"fence"}},"w32":{"id":"w32","nodes":["n159","n160","n161","n162","n159"],"tags":{"amenity":"parking"}},"w320":{"id":"w320","nodes":["n1536","n1537","n1538","n1539","n1536"],"tags":{"building":"shed"}},"w321":{"id":"w321","nodes":["n1540","n1541","n1542","n1543","n1540"],"tags":{"building":"shed"}},"w322":{"id":"w322","nodes":["n1544","n1545","n1546","n1547","n1544"],"tags":{"building":"shed"}},"w323":{"id":"w323","nodes":["n1548","n1549","n1550","n1551","n1548"],"tags":{"building":"house"}},"w324":{"id":"w324","nodes":["n1552","n1553","n1554","n1555","n1556","n1557","n1558","n1559","n1552"],"tags":{"building":"house"}},"w325":{"id":"w325","nodes":["n1560","n1561","n1562","n1563","n1564","n1565","n1566","n1567","n1560"],"tags":{"building":"house"}},"w326":{"id":"w326","nodes":["n1561","n1568","n1569","n1570"],"tags":{"barrier":"wall"}},"w327":{"id":"w327","nodes":["n1571","n1572"],"tags":{"barrier":"fence"}},"w328":{"id":"w328","nodes":["n1573","n1574","n1575","n1576","n1573"],"tags":{"building":"house"}},"w329":{"id":"w329","nodes":["n1577","n1578","n1579","n1580","n1581","n1582","n1583","n1584","n1585","n1586","n1577"],"tags":{"building":"house"}},"w33":{"id":"w33","nodes":["n157","n163"],"tags":{"highway":"service"}},"w330":{"id":"w330","nodes":["n1587","n1588","n1589","n1590","n1591","n1592","n1593","n1594","n1587"],"tags":{"building":"house"}},"w331":{"id":"w331","nodes":["n1595","n1596","n1597","n1598","n1599","n1600","n1601","n1595"],"tags":{"access":"private","leisure":"swimming_pool"}},"w332":{"id":"w332","nodes":["n1602","n1603","n1604","n1605","n1606","n1607","n1608","n1609","n1611","n1610","n1612","n1613","n1602"],"tags":{"building":"house"}},"w333":{"id":"w333","nodes":["n2018","n1626","n1627","n2017","n2018"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w334":{"id":"w334","nodes":["n2","n3","n2764"],"tags":{"highway":"service","name":"Water Street"}},"w335":{"id":"w335","nodes":["n3","n1628","n1614"],"tags":{"highway":"service"}},"w336":{"id":"w336","nodes":["n3198","n4545","n2747"],"tags":{"highway":"residential","name":"Morris Avenue"}},"w337":{"id":"w337","nodes":["n1629","n3504"],"tags":{"highway":"service","service":"alley","surface":"unpaved"}},"w338":{"id":"w338","nodes":["n1813","n1635","n1814","n1634","n1815","n1632","n1816","n1817"],"tags":{"highway":"service","service":"parking_aisle"}},"w339":{"id":"w339","nodes":["n1827","n4684","n4690","n1842","n4686","n4685","n1826","n1828","n1846","n1645","n1637","n4703","n1641"],"tags":{"highway":"residential","name":"Millard Street"}},"w34":{"id":"w34","nodes":["n164","n165","n166","n171","n866","n172","n167","n168","n169","n910","n170","n164"],"tags":{"amenity":"parking"}},"w340":{"id":"w340","nodes":["n1824","n1825"],"tags":{"highway":"service","service":"parking_aisle"}},"w341":{"id":"w341","nodes":["n1701","n1702","n1703","n1704","n1705","n1706","n1701"],"tags":{"building":"yes"}},"w342":{"id":"w342","nodes":["n1855","n1860","n1856","n1775","n1804","n1776","n1855"],"tags":{"amenity":"parking","fee":"no"}},"w343":{"id":"w343","nodes":["n1757","n1758","n1759","n1760","n1757"],"tags":{"building":"yes"}},"w344":{"id":"w344","nodes":["n1659","n1660","n1661","n1662","n1663","n1664","n1665","n1666","n1659"],"tags":{"building":"school"}},"w345":{"id":"w345","nodes":["n1751","n1752","n1753","n1754","n1755","n1756","n1751"],"tags":{"building":"yes"}},"w346":{"id":"w346","nodes":["n1641","n1676","n1673","n1639","n1810","n1642","n1849","n4759","n1845"],"tags":{"highway":"residential","name":"Douglas Avenue"}},"w347":{"id":"w347","nodes":["n1642","n1643","n1031","n1630","n845","n1631","n816","n1831","n902","n905","n152","n149","n1832","n1850","n878","n1833","n1852","n42","n1834","n61","n60","n1851","n1835"],"tags":{"highway":"primary","name":"Michigan Avenue"}},"w348":{"id":"w348","nodes":["n1650","n1651","n1652","n1653","n1654","n1655","n1656","n1657","n1658","n1650"],"tags":{"leisure":"playground"}},"w349":{"id":"w349","nodes":["n1861","n1818","n1819","n1820","n1821","n1825","n1823","n1639"],"tags":{"highway":"service"}},"w35":{"id":"w35","nodes":["n168","n167","n172"],"tags":{"barrier":"fence","fence_type":"chain_link"}},"w350":{"id":"w350","nodes":["n1783","n1819","n1784","n1857","n1861","n1858","n1783"],"tags":{"amenity":"parking"}},"w351":{"id":"w351","nodes":["n1717","n1718","n1719","n1720","n1717"],"tags":{"building":"yes"}},"w352":{"id":"w352","nodes":["n1743","n1744","n1745","n1746","n1747","n1748","n1749","n1750","n1743"],"tags":{"building":"yes"}},"w353":{"id":"w353","nodes":["n1637","n1636","n1029","n4715","n1630"],"tags":{"highway":"residential","name":"Lincoln Avenue"}},"w354":{"id":"w354","nodes":["n1713","n1714","n1715","n1716","n1713"],"tags":{"building":"yes"}},"w355":{"id":"w355","nodes":["n1689","n1690","n1691","n1692","n1693","n1694","n1695","n1696","n1689"],"tags":{"building":"yes"}},"w356":{"id":"w356","nodes":["n1631","n4717","n1840","n4745","n1841"],"tags":{"highway":"residential","name":"Hook Avenue"}},"w357":{"id":"w357","nodes":["n1737","n1738","n1739","n1740","n1741","n1742","n1737"],"tags":{"building":"yes"}},"w358":{"id":"w358","nodes":["n1707","n1708","n1709","n1710","n1711","n1712","n1707"],"tags":{"building":"yes"}},"w359":{"id":"w359","nodes":["n1829","n4695","n4697","n1843","n4698","n4701","n1638","n4702","n4705","n1636","n4706","n4707","n1633"],"tags":{"highway":"residential","name":"South Street"}},"w36":{"id":"w36","nodes":["n910","n171","n866","n172"],"tags":{"barrier":"fence","fence_type":"chain_link"}},"w360":{"id":"w360","nodes":["n1767","n1768","n1769","n1770","n1771","n1772","n1773","n1774","n1767"],"tags":{"building":"yes"}},"w361":{"id":"w361","nodes":["n1859","n1860","n1804","n1640","n1805","n1817","n1806","n1644","n1811","n1807","n1808","n3419","n1812","n1790","n3418","n3744","n1809","n1813","n1810"],"tags":{"highway":"service"}},"w362":{"id":"w362","nodes":["n1639","n1683","n4710","n1633"],"tags":{"highway":"residential","name":"South Street","oneway":"yes"}},"w363":{"id":"w363","nodes":["n1646","n1647","n1648","n1649","n1646"],"tags":{"leisure":"pitch","pitch":"basketball"}},"w364":{"id":"w364","nodes":["n3820","n3821","n3822","n3823","n3824","n3825","n3826","n3827","n3828","n3829","n3830","n3838","n3839","n3820"],"tags":{"amenity":"school","name":"Three Rivers Middle School"}},"w365":{"id":"w365","nodes":["n1721","n1722","n1723","n1724","n1725","n1726","n1727","n1728","n1729","n1730","n1731","n1732","n1733","n1734","n1735","n1736","n1721"],"tags":{"building":"yes"}},"w366":{"id":"w366","nodes":["n1791","n1792","n1793","n1794","n1795","n1796","n1798","n1799","n1800","n1801","n1802","n1803","n1791"],"tags":{"amenity":"parking"}},"w367":{"id":"w367","nodes":["n1633","n4708","n4711","n1643","n4712","n1838","n4752","n1839"],"tags":{"highway":"residential","name":"Grant Avenue"}},"w368":{"id":"w368","nodes":["n1853","n1687","n1688","n1854","n1853"],"tags":{"amenity":"library","building":"yes","name":"Three Rivers Public Library"}},"w369":{"id":"w369","nodes":["n1777","n1778","n1779","n1780","n1781","n1782","n1777"],"tags":{"amenity":"parking"}},"w37":{"id":"w37","nodes":["n173","n174","n175","n176","n177","n178","n179","n180","n173"],"tags":{"building":"yes"}},"w370":{"id":"w370","nodes":["n1645","n1638","n858","n4718","n1631"],"tags":{"highway":"residential","name":"Hook Avenue"}},"w371":{"id":"w371","nodes":["n3836","n3835","n4624","n3831","n4632","n3834","n3832","n3833","n3830","n3838","n3839","n3837","n3836"],"tags":{"amenity":"school","name":"Three Rivers High School"}},"w372":{"id":"w372","nodes":["n1697","n1698","n1699","n1700","n1697"],"tags":{"building":"yes"}},"w373":{"id":"w373","nodes":["n2891","n1785","n1786","n3394","n1787","n1788","n1789","n1830","n1836","n1837","n1848","n3409","n2891"],"tags":{"amenity":"parking"}},"w374":{"id":"w374","nodes":["n1761","n1762","n1763","n1764","n1765","n1766","n1761"],"tags":{"building":"yes"}},"w375":{"id":"w375","nodes":["n1822","n1823"],"tags":{"highway":"service","service":"parking_aisle"}},"w376":{"id":"w376","nodes":["n1677","n1678","n1679","n1680","n1681","n1682","n1677"],"tags":{"amenity":"parking"}},"w377":{"id":"w377","nodes":["n1676","n1675","n1674","n1673"],"tags":{"highway":"service","oneway":"yes"}},"w378":{"id":"w378","nodes":["n1667","n1668","n1669","n1670","n1671","n1672","n1667"],"tags":{"amenity":"school","name":"Andrews Elementary School"}},"w379":{"id":"w379","nodes":["n1630","n4714","n1847","n4750","n1844"],"tags":{"highway":"residential","name":"Lincoln Avenue"}},"w38":{"id":"w38","nodes":["n181","n182","n183","n185","n184","n181"],"tags":{"building":"yes"}},"w380":{"id":"w380","nodes":["n1683","n3745","n1686","n1633"],"tags":{"highway":"service","oneway":"yes","service":"parking_aisle"}},"w381":{"id":"w381","nodes":["n2022","n2037"],"tags":{"highway":"footway"}},"w382":{"id":"w382","nodes":["n1826","n1863"],"tags":{"highway":"residential"}},"w383":{"id":"w383","nodes":["n2011","n2012","n739","n2013","n2014","n2029","n2011"],"tags":{"amenity":"shelter","building":"yes","shelter_type":"picnic_shelter"}},"w384":{"id":"w384","nodes":["n2064","n2065","n2066","n2067","n2068","n2069","n2070","n2071","n2072","n2073","n2074","n2075","n2076","n2077","n2078","n2079","n2064"],"tags":{"building":"yes"}},"w385":{"id":"w385","nodes":["n1923","n1924","n1925","n1926","n1927","n1928","n1930","n1929","n1923"],"tags":{"natural":"water"}},"w386":{"id":"w386","nodes":["n1827","n14","n1886","n15","n1887","n16","n1888","n18","n17","n1889","n12","n13","n1890","n485","n1864","n11","n10","n2058","n2036","n1865","n2020","n9","n8","n1866","n295","n1867"],"tags":{"highway":"service"}},"w387":{"id":"w387","nodes":["n1846","n1843","n865","n157","n4721","n1831"],"tags":{"highway":"residential","name":"Andrews Street"}},"w388":{"id":"w388","nodes":["n2019","n2020","n2021","n2022","n2023","n2024","n2025","n2026","n2027","n2028","n2029"],"tags":{"highway":"footway"}},"w389":{"id":"w389","nodes":["n2217","n2222","n2221","n2219","n1877","n1879","n1882","n1883","n484","n1885","n483","n1880","n1881","n1878","n1884","n2223"],"tags":{"name":"Rocky River","waterway":"river"}},"w39":{"id":"w39","nodes":["n185","n186","n187"],"tags":{"barrier":"fence"}},"w390":{"id":"w390","nodes":["n2050","n2051","n2052","n2053","n2050"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w391":{"id":"w391","nodes":["n2089","n2090","n2091","n2092","n2093","n2094","n2311","n2095","n2096","n2097","n2098","n1174","n2099","n751","n43","n2062","n4725","n873","n1832"],"tags":{"highway":"residential","name":"Constantine Street"}},"w392":{"id":"w392","nodes":["n1869","n212","n436","n2281","n2081"],"tags":{"highway":"primary","name":"Michigan Avenue"}},"w393":{"id":"w393","nodes":["n1829","n611","n144","n4694","n602","n1832"],"tags":{"highway":"tertiary","name":"Constantine Street"}},"w394":{"id":"w394","nodes":["n1997","n1998","n2000","n1999"],"tags":{"highway":"service","service":"parking_aisle"}},"w395":{"id":"w395","nodes":["n1835","n1869"],"tags":{"bridge":"yes","highway":"primary","name":"Michigan Avenue"}},"w396":{"id":"w396","nodes":["n2000","n2001"],"tags":{"highway":"service","service":"parking_aisle"}},"w397":{"id":"w397","nodes":["n2082","n4688","n1842","n308","n498","n509","n246","n241","n1867","n4645","n293","n1834"],"tags":{"highway":"residential","name":"Spring Street"}},"w398":{"id":"w398","nodes":["n2015","n2016","n2017","n2018","n2015"],"tags":{"building":"yes"}},"w399":{"id":"w399","nodes":["n2062","n45","n2063","n877","n41","n1852"],"tags":{"highway":"service"}},"w4":{"id":"w4","nodes":["n7","n38","n378","n379","n7"],"tags":{"building":"yes"}},"w40":{"id":"w40","nodes":["n188","n189","n190","n191","n192","n193","n188"],"tags":{"building":"house"}},"w400":{"id":"w400","nodes":["n1968","n1969","n1970","n1971","n2007","n1972","n1973","n1978","n1974","n1977","n1976","n1975","n1968"],"tags":{"amenity":"parking"}},"w401":{"id":"w401","nodes":["n1963","n1964"],"tags":{"bridge":"yes","highway":"footway"}},"w402":{"id":"w402","nodes":["n1892","n1893","n1894","n1895","n1896","n1897","n1898","n1899","n1900","n1901","n1902","n1903","n1892"],"tags":{"addr:city":"Three Rivers","addr:housenumber":"112","addr:postcode":"49093","addr:state":"MI","addr:street":"Spring Street","barrier":"fence","name":"Scidmore Park Petting Zoo","tourism":"zoo","zoo":"petting_zoo"}},"w403":{"id":"w403","nodes":["n1957","n1958","n1959","n481","n1960","n482","n1949"],"tags":{"highway":"path"}},"w404":{"id":"w404","nodes":["n2281","n27","n330","n1987","n1988"],"tags":{"highway":"service"}},"w405":{"id":"w405","nodes":["n2249","n2269","n2270","n2271","n2272","n454","n455","n2273"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w406":{"id":"w406","nodes":["n1947","n1624","n1625","n2030","n2033","n4658","n4659","n2031","n2032","n2021"],"tags":{"highway":"footway"}},"w407":{"id":"w407","nodes":["n2034","n2036","n2009"],"tags":{"highway":"footway"}},"w408":{"id":"w408","nodes":["n1964","n1965","n2002","n1966","n21","n1967","n1969"],"tags":{"highway":"footway"}},"w409":{"id":"w409","nodes":["n1904","n1905","n1906","n1907","n1908","n1909","n748","n1910","n747","n1911","n749","n1912","n750","n1913","n1922","n1914","n1921","n1915","n746","n1916","n745","n1917","n744","n1918","n743","n742","n1919","n741","n1920","n740","n1904"],"tags":{"natural":"water"}},"w41":{"id":"w41","nodes":["n194","n195","n196","n197","n198","n199","n200","n201","n202","n203","n204","n205","n194"],"tags":{"building":"house"}},"w410":{"id":"w410","nodes":["n1868","n2088"],"tags":{"bridge":"yes","name":"Conrail Railroad","railway":"rail"}},"w411":{"id":"w411","nodes":["n2010","n2019","n2009","n2008","n2058","n2035","n1961","n1962","n1947","n1963"],"tags":{"highway":"footway"}},"w412":{"id":"w412","nodes":["n2290","n2043","n2044","n2045","n1872","n2041","n1873","n2042","n1874","n2046","n2047","n2048","n2049","n2290"],"tags":{"addr:city":"Three Rivers","addr:housenumber":"112","addr:postcode":"49093","addr:state":"MI","addr:street":"Spring Street","leisure":"park","name":"Scidmore Park"}},"w413":{"id":"w413","nodes":["n1831","n876","n4720","n821","n2089"],"tags":{"highway":"residential","name":"Andrews Street"}},"w414":{"id":"w414","nodes":["n2002","n2003","n2004","n2005","n2006","n2007"],"tags":{"highway":"footway"}},"w415":{"id":"w415","nodes":["n1979","n1980","n1981","n1982","n1979"],"tags":{"amenity":"parking"}},"w416":{"id":"w416","nodes":["n2054","n2055","n2056","n2057","n2054"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w417":{"id":"w417","nodes":["n2291","n2292","n2293","n2294","n2295","n2296","n2297","n2298","n2299","n1098","n2300","n2301","n2302","n2303","n2304","n2059","n2060","n2305","n2307","n2306","n2310","n2308","n2309","n2291"],"tags":{"leisure":"park","name":"Memory Isle Park"}},"w418":{"id":"w418","nodes":["n2033","n2034","n2035"],"tags":{"highway":"footway"}},"w419":{"id":"w419","nodes":["n1983","n1984","n1985","n1986","n1983"],"tags":{"amenity":"parking"}},"w42":{"id":"w42","nodes":["n206","n207","n208","n209","n210","n211","n206"],"tags":{"building":"house"}},"w420":{"id":"w420","nodes":["n1840","n4746","n4748","n1847","n4749","n4755","n1838","n4754","n4756","n1849"],"tags":{"highway":"residential","name":"French Street"}},"w421":{"id":"w421","nodes":["n2337","n2268"],"tags":{"highway":"path"}},"w422":{"id":"w422","nodes":["n2338","n2339","n2320","n2317","n2319","n2318","n2340","n2341","n2342","n2343","n2344","n2345","n2346","n2347","n2348","n2338"],"tags":{"natural":"water"}},"w423":{"id":"w423","nodes":["n2180","n2349","n2350","n2351","n2352","n2404","n2353","n2354","n2355","n2356","n2357","n2358","n2359","n2360","n2361","n2362","n2363","n2364","n2365","n2366","n2370","n2371","n2372","n2373","n2374","n2375","n2377","n2378","n2380","n2381","n2382","n2383","n2386","n2389","n2390","n2391","n2392","n2393","n2396","n2397","n2401","n2402","n2321","n2322","n2323","n2403","n2180"],"tags":{"natural":"wetland"}},"w424":{"id":"w424","nodes":["n2324","n2316","n1841","n2315","n2314","n1844","n1839","n4758","n1845"],"tags":{"highway":"residential","name":"Pealer Street"}},"w425":{"id":"w425","nodes":["n2267","n2337","n2336","n2335","n2334","n2333","n2332","n2331","n2330","n37","n2329","n2328","n2327","n36","n2326","n2325","n2266"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w426":{"id":"w426","nodes":["n2478","n681","n680","n679","n2459","n2467","n2487","n2478"],"tags":{"building":"yes"}},"w427":{"id":"w427","nodes":["n2671","n2672","n2673","n2674","n2671"],"tags":{"building":"yes"}},"w428":{"id":"w428","nodes":["n2483","n2482","n2486","n2489","n2492","n2502","n2495","n2480","n2483"],"tags":{"building":"yes"}},"w429":{"id":"w429","nodes":["n2707","n2708","n2716","n2712","n2714","n2713","n2715","n2711","n2710","n2723","n2709","n2707"],"tags":{"amenity":"parking"}},"w43":{"id":"w43","nodes":["n1955","n1956"],"tags":{"footway":"sidewalk","highway":"footway","name":"Riverwalk Trail"}},"w430":{"id":"w430","nodes":["n2471","n2474","n2484","n2479","n2471"],"tags":{"building":"yes"}},"w431":{"id":"w431","nodes":["n2218","n2434","n2436","n2433","n2435","n2210"],"tags":{"name":"Rocky River","waterway":"river"}},"w432":{"id":"w432","nodes":["n2782","n2532","n2783","n2784","n2782"],"tags":{"amenity":"parking"}},"w433":{"id":"w433","nodes":["n2513","n649","n2520","n2514","n2507","n2513"],"tags":{"building":"yes"}},"w434":{"id":"w434","nodes":["n2470","n2468","n2461","n2465","n2470"],"tags":{"building":"yes"}},"w435":{"id":"w435","nodes":["n2598","n2599","n648","n649","n2520","n2598"],"tags":{"building":"yes"}},"w436":{"id":"w436","nodes":["n2639","n2640","n2641","n2642","n2643","n2644","n2645","n2646","n2647","n2648","n2639"],"tags":{"building":"yes"}},"w437":{"id":"w437","nodes":["n2503","n2512","n2508","n2499","n2503"],"tags":{"building":"yes"}},"w438":{"id":"w438","nodes":["n2440","n2800","n2774","n1"],"tags":{"highway":"residential","name":"Water Street"}},"w439":{"id":"w439","nodes":["n2675","n2676","n2677","n2678","n2675"],"tags":{"building":"yes"}},"w44":{"id":"w44","nodes":["n213","n214","n215","n216","n213"],"tags":{"building":"yes"}},"w440":{"id":"w440","nodes":["n2512","n2503","n2507","n2514","n2512"],"tags":{"building":"yes"}},"w441":{"id":"w441","nodes":["n2554","n2717","n674","n2720","n2798"],"tags":{"highway":"service","oneway":"yes"}},"w442":{"id":"w442","nodes":["n2583","n2596","n2584","n2585","n2595","n2586","n2587","n2588","n2589","n2583"],"tags":{"amenity":"parking"}},"w443":{"id":"w443","nodes":["n2629","n2627","n2628","n2616","n2630","n2629"],"tags":{"building":"yes"}},"w444":{"id":"w444","nodes":["n2717","n2724","n670","n2718","n669","n668","n2722","n2727"],"tags":{"highway":"service","oneway":"yes","service":"parking_aisle"}},"w445":{"id":"w445","nodes":["n2572","n2573"],"tags":{"bridge":"yes","highway":"path","name":"Riverwalk Trail"}},"w446":{"id":"w446","nodes":["n2603","n2604","n2601","n2605","n2606","n2607","n2603"],"tags":{"building":"yes"}},"w447":{"id":"w447","nodes":["n2780","n2777","n628","n624","n2779"],"tags":{"highway":"residential","name":"Foster Street","oneway":"yes"}},"w448":{"id":"w448","nodes":["n2733","n2734","n2735","n2736","n2737","n2738","n663","n664","n2739","n2733"],"tags":{"building":"yes"}},"w449":{"id":"w449","nodes":["n2564","n2565","n2566","n2567","n2568","n2794","n2795","n2564"],"tags":{"amenity":"parking"}},"w45":{"id":"w45","nodes":["n217","n218","n219","n220","n217"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w450":{"id":"w450","nodes":["n2799","n2728","n2729","n2730","n2731","n2732","n2799"],"tags":{"building":"yes"}},"w451":{"id":"w451","nodes":["n2441","n1170","n2442","n2575","n2443","n2445","n2444","n2448","n2441"],"tags":{"amenity":"parking"}},"w452":{"id":"w452","nodes":["n2273","n457","n2569","n458","n2570"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w453":{"id":"w453","nodes":["n2447","n2242","n2448","n2527","n2530"],"tags":{"highway":"service"}},"w454":{"id":"w454","nodes":["n2560","n333","n2561"],"tags":{"highway":"service","service":"parking_aisle"}},"w455":{"id":"w455","nodes":["n2679","n2680","n2681","n2682","n2683","n2684","n2685","n2686","n2687","n2688","n2689","n2690","n2679"],"tags":{"building":"yes"}},"w456":{"id":"w456","nodes":["n2425","n2429","n2424"],"tags":{"bridge":"yes","highway":"residential","name":"Moore Street"}},"w457":{"id":"w457","nodes":["n2487","n2467","n2472","n2480","n2495","n2487"],"tags":{"building":"yes"}},"w458":{"id":"w458","nodes":["n2659","n2660","n2661","n2662","n678","n677","n2663","n2664","n2665","n2666","n675","n676","n2659"],"tags":{"building":"yes"}},"w459":{"id":"w459","nodes":["n2600","n2598","n2599","n2601","n2605","n2602","n2600"],"tags":{"building":"yes"}},"w46":{"id":"w46","nodes":["n221","n222","n223","n224","n221"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w460":{"id":"w460","nodes":["n2468","n2464","n2455","n2457","n2461","n2468"],"tags":{"building":"yes"}},"w461":{"id":"w461","nodes":["n2478","n2473","n683","n682","n2463","n681","n2478"],"tags":{"building":"yes"}},"w462":{"id":"w462","nodes":["n2547","n473","n2548","n2549"],"tags":{"highway":"service","service":"parking_aisle"}},"w463":{"id":"w463","nodes":["n2573","n2574"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w464":{"id":"w464","nodes":["n2445","n2597","n2527","n2528","n2529","n2530","n2531","n2597"],"tags":{"highway":"service","service":"parking_aisle"}},"w465":{"id":"w465","nodes":["n2571","n459","n2572"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w466":{"id":"w466","nodes":["n2445","n2574","n2552","n442","n2551","n4727","n323","n2446"],"tags":{"highway":"service"}},"w467":{"id":"w467","nodes":["n2484","n2474","n2477","n2485","n2488","n2484"],"tags":{"building":"yes"}},"w468":{"id":"w468","nodes":["n2695","n2696","n2697","n2698","n2699","n2700","n2701","n2702","n2695"],"tags":{"building":"yes"}},"w469":{"id":"w469","nodes":["n2469","n2476","n2481","n2475","n920","n2466","n2469"],"tags":{"building":"yes"}},"w47":{"id":"w47","nodes":["n1988","n1997","n1989","n25","n24","n1990","n26","n1991","n21","n1992","n2006","n1993","n22","n1994","n23","n1995","n1999","n1996","n2001","n1988"],"tags":{"highway":"service"}},"w470":{"id":"w470","nodes":["n2473","n2470","n2465","n2458","n2462","n683","n2473"],"tags":{"building":"yes"}},"w471":{"id":"w471","nodes":["n2490","n2496","n994","n997","n998","n996","n995","n2485","n2477","n2490"],"tags":{"building":"yes"}},"w472":{"id":"w472","nodes":["n2424","n2426","n2427","n2428"],"tags":{"highway":"residential","name":"Moore Street"}},"w473":{"id":"w473","nodes":["n2432","n1026","n4741","n2554","n2425"],"tags":{"highway":"residential","name":"Moore Street"}},"w474":{"id":"w474","nodes":["n2577","n2576"],"tags":{"bridge":"yes","highway":"footway"}},"w475":{"id":"w475","nodes":["n2497","n2505","n2500","n2493","n2497"],"tags":{"building":"yes"}},"w476":{"id":"w476","nodes":["n2493","n2500","n2501","n2496","n2490","n2493"],"tags":{"building":"yes"}},"w477":{"id":"w477","nodes":["n2431","n360","n4726","n418","n397","n396","n2547","n646","n2447","n644","n2418","n424","n640","n2419","n2420","n2423"],"tags":{"highway":"residential","name":"Railroad Drive"}},"w478":{"id":"w478","nodes":["n2515","n2511","n2498","n2504","n2509","n2515"],"tags":{"building":"yes"}},"w479":{"id":"w479","nodes":["n2525","n651","n650","n2526","n2524","n653","n652","n656","n2523","n654","n2518","n2517","n2521","n2522","n2525"],"tags":{"building":"yes"}},"w48":{"id":"w48","nodes":["n225","n237","n226","n227","n228","n229","n230","n231","n232","n233","n234","n235","n236","n225"],"tags":{"building":"yes"}},"w480":{"id":"w480","nodes":["n2703","n2704","n2710","n2711","n2705","n2706","n2703"],"tags":{"amenity":"parking"}},"w481":{"id":"w481","nodes":["n2796","n2657","n2658","n2797","n2796"],"tags":{"building":"yes"}},"w482":{"id":"w482","nodes":["n2550","n2551","n442","n2552","n2553","n2550"],"tags":{"amenity":"parking"}},"w483":{"id":"w483","nodes":["n2790","n2542"],"tags":{"highway":"service","service":"parking_aisle"}},"w484":{"id":"w484","nodes":["n2311","n1102"],"tags":{"highway":"service"}},"w485":{"id":"w485","nodes":["n2515","n2509","n2516","n2519","n2515"],"tags":{"building":"yes"}},"w486":{"id":"w486","nodes":["n2506","n2502","n2492","n2491","n2494","n2506"],"tags":{"building":"yes"}},"w487":{"id":"w487","nodes":["n2667","n2668","n2669","n2670","n2667"],"tags":{"building":"yes"}},"w488":{"id":"w488","nodes":["n2616","n2608","n2617","n2618","n2619","n2620","n2621","n2622","n2623","n2624","n2625","n2626","n2627","n2628","n2616"],"tags":{"building":"yes"}},"w489":{"id":"w489","nodes":["n2081","n2430"],"tags":{"bridge":"yes","highway":"primary","name":"Michigan Avenue"}},"w49":{"id":"w49","nodes":["n237","n238"],"tags":{"highway":"footway"}},"w490":{"id":"w490","nodes":["n2410","n636","n730","n635","n2409","n2694","n2751","n2765","n2753","n2768","n2754","n2769","n2745","n2766","n4503","n2763","n4501","n2752","n2781"],"tags":{"highway":"residential","name":"Portage Avenue"}},"w491":{"id":"w491","nodes":["n2578","n2579","n2580","n2581","n2578"],"tags":{"amenity":"shelter","building":"yes","shelter_type":"picnic_shelter"}},"w492":{"id":"w492","nodes":["n2556","n2557","n2558","n2559","n2556"],"tags":{"amenity":"parking"}},"w493":{"id":"w493","nodes":["n2460","n2456","n687","n2453","n2454","n2460"],"tags":{"building":"yes"}},"w494":{"id":"w494","nodes":["n2471","n2479","n2476","n2469","n2471"],"tags":{"building":"yes"}},"w495":{"id":"w495","nodes":["n2724","n2725","n673","n672","n671","n2726","n2727"],"tags":{"highway":"service","oneway":"yes","service":"parking_aisle"}},"w496":{"id":"w496","nodes":["n2649","n2650","n2651","n2652","n2653","n2654","n2655","n2656","n2649"],"tags":{"building":"yes"}},"w497":{"id":"w497","nodes":["n2430","n2446","n343","n2101","n2560","n2431","n363","n2748"],"tags":{"highway":"primary","name":"Michigan Avenue"}},"w498":{"id":"w498","nodes":["n2691","n2692","n634","n633","n2693","n2694"],"tags":{"highway":"service"}},"w499":{"id":"w499","nodes":["n2423","n2415","n661","n2416","n2417","n2719","n2721","n2772","n2756","n2773","n2759","n2767"],"tags":{"highway":"residential","name":"West Street"}},"w5":{"id":"w5","nodes":["n380","n381","n382","n383","n429","n430","n380"],"tags":{"building":"yes"}},"w50":{"id":"w50","nodes":["n239","n499","n508","n245","n238","n242","n240"],"tags":{"footway":"sidewalk","highway":"footway"}},"w500":{"id":"w500","nodes":["n2428","n1152","n2421","n2324"],"tags":{"bridge":"yes","highway":"residential","name":"Moore Street"}},"w501":{"id":"w501","nodes":["n2608","n2609","n2610","n2611","n2612","n2613","n2614","n2615","n2617","n2608"],"tags":{"building":"yes"}},"w502":{"id":"w502","nodes":["n2570","n2571"],"tags":{"bridge":"yes","highway":"path","name":"Riverwalk Trail"}},"w503":{"id":"w503","nodes":["n2540","n2542","n2787"],"tags":{"highway":"service"}},"w504":{"id":"w504","nodes":["n2269","n2582","n2250"],"tags":{"highway":"path"}},"w505":{"id":"w505","nodes":["n2631","n2632","n2633","n2634","n2635","n2636","n2637","n2638","n2631"],"tags":{"building":"yes"}},"w506":{"id":"w506","nodes":["n2543","n2544","n2545","n395","n2546","n2543"],"tags":{"amenity":"parking"}},"w507":{"id":"w507","nodes":["n2449","n2450","n2451","n2452","n1162","n2449"],"tags":{"leisure":"pitch","sport":"tennis"}},"w508":{"id":"w508","nodes":["n2554","n1160","n2559","n2558","n659","n2555","n658","n657","n2419"],"tags":{"highway":"service"}},"w509":{"id":"w509","nodes":["n2499","n2508","n2510","n2505","n2497","n2499"],"tags":{"building":"yes"}},"w51":{"id":"w51","nodes":["n241","n242","n243","n244"],"tags":{"highway":"service","surface":"unpaved"}},"w510":{"id":"w510","nodes":["n2575","n2577"],"tags":{"highway":"footway"}},"w511":{"id":"w511","nodes":["n2533","n2534","n2535","n2536","n2537","n2538","n2539","n2785","n2786","n2533"],"tags":{"amenity":"parking"}},"w512":{"id":"w512","nodes":["n2801","n2740","n2741","n2742","n2743","n2744","n2801"],"tags":{"building":"yes"}},"w513":{"id":"w513","nodes":["n2720","n2721"],"tags":{"highway":"service","service":"parking_aisle"}},"w514":{"id":"w514","nodes":["n2788","n2790","n2789","n989","n2540","n2541"],"tags":{"highway":"service","service":"parking_aisle"}},"w515":{"id":"w515","nodes":["n2848","n2849","n2850","n2851","n2803","n2804","n2812"],"tags":{"highway":"residential","name":"Middle Street"}},"w516":{"id":"w516","nodes":["n2852","n2805"],"tags":{"access":"private","highway":"service","name":"Battle Street"}},"w517":{"id":"w517","nodes":["n2863","n2815","n2814","n2812","n2864","n2855","n2865","n2867","n2868"],"tags":{"highway":"secondary","name":"Michigan Avenue","name_1":"State Highway 60","ref":"M 60"}},"w518":{"id":"w518","nodes":["n2859","n2808"],"tags":{"highway":"residential","name":"2nd Avenue"}},"w519":{"id":"w519","nodes":["n2823","n2824","n2825","n2826","n2827","n2828","n2823"],"tags":{"building":"yes"}},"w52":{"id":"w52","nodes":["n247","n248","n249","n250","n247"],"tags":{"amenity":"parking"}},"w520":{"id":"w520","nodes":["n2806","n2807","n2803"],"tags":{"highway":"residential","name":"2nd Avenue"}},"w521":{"id":"w521","nodes":["n2829","n2830","n2831","n2832","n2833","n2834","n2835","n2836","n2837","n2838","n2829"],"tags":{"building":"yes"}},"w522":{"id":"w522","nodes":["n2815","n2813","n2811","n4597","n2846","n4596","n2857","n4601","n2853","n4602","n2861","n4","n2879","n4560","n3550","n5","n1685"],"tags":{"highway":"residential","name":"Washington Street"}},"w523":{"id":"w523","nodes":["n2878","n2811","n2810","n2860","n2880","n2881","n2882"],"tags":{"highway":"residential","name":"5th Avenue"}},"w524":{"id":"w524","nodes":["n2816","n2817","n2818","n2819","n2820","n2821","n2822","n2816"],"tags":{"building":"yes"}},"w525":{"id":"w525","nodes":["n2869","n2856","n2806","n2808","n2814","n2809","n2810","n2847","n2858","n2854","n2870","n2871","n6","n2872","n2839","n2862"],"tags":{"highway":"residential","name":"Wood Street"}},"w526":{"id":"w526","nodes":["n2877","n2809","n2813","n2844","n2843"],"tags":{"highway":"residential","name":"4th Avenue"}},"w527":{"id":"w527","nodes":["n4785","n4784","n2936","n4788","n4787","n4786","n4785"],"tags":{"amenity":"parking"}},"w528":{"id":"w528","nodes":["n2864","n2892","n2893","n2877","n2860","n3840"],"tags":{"highway":"residential","name":"Garden Street"}},"w529":{"id":"w529","nodes":["n2868","n2890"],"tags":{"bridge":"yes","highway":"secondary","name":"Michigan Avenue","name_1":"State Highway 60","ref":"M 60"}},"w53":{"id":"w53","nodes":["n251","n252","n253","n254","n255","n256","n257","n258","n259","n260","n261","n262","n251"],"tags":{"building":"yes"}},"w530":{"id":"w530","nodes":["n2914","n2915","n2916","n2917","n2918","n2919","n2920","n2921","n2922","n2923","n2924","n2925","n2926","n2927","n2928","n2929","n2930","n2931","n2932","n2933","n2914"],"tags":{"building":"yes"}},"w531":{"id":"w531","nodes":["n2958","n2896"],"tags":{"bridge":"yes","highway":"secondary","name":"Main Street"}},"w532":{"id":"w532","nodes":["n2896","n394","n364","n2748"],"tags":{"highway":"secondary","name":"Main Street"}},"w533":{"id":"w533","nodes":["n2800","n2943","n2940","n2941","n2942","n2943"],"tags":{"highway":"service","service":"parking_aisle"}},"w534":{"id":"w534","nodes":["n3836","n3837","n3839","n3838","n3834","n4632","n3831","n4624","n3835","n3836"],"tags":{"barrier":"fence"}},"w535":{"id":"w535","nodes":["n2894","n2944","n2774","n2765"],"tags":{"highway":"residential","name":"5th Avenue"}},"w536":{"id":"w536","nodes":["n2890","n2780","n627","n2889","n2887","n623","n2888","n366","n2748"],"tags":{"highway":"secondary","name":"Michigan Avenue","name_1":"State Highway 60","ref":"M 60"}},"w537":{"id":"w537","nodes":["n2895","n738","n2887","n737","n2913"],"tags":{"highway":"residential","name":"Water Street"}},"w538":{"id":"w538","nodes":["n2855","n3756","n2884","n2885","n2886","n2945","n2946","n2947","n2948","n2949","n2950","n2951","n2952","n2953","n2955","n2848","n2956","n2856"],"tags":{"highway":"residential","name":"River Drive"}},"w539":{"id":"w539","nodes":["n2882","n2894"],"tags":{"bridge":"yes","highway":"residential","name":"5th Avenue"}},"w54":{"id":"w54","nodes":["n263","n264","n265","n266","n267","n268","n269","n270","n271","n272","n273","n274","n275","n276","n263"],"tags":{"building":"yes"}},"w540":{"id":"w540","nodes":["n2987","n2964","n2981","n2983","n2966","n2982","n2962","n2960","n2967","n2965","n2984","n2977","n2968","n2976","n2986","n2988","n2963","n2970","n2969","n2979","n2974","n2980","n2959","n2973","n2985","n2961","n2975","n2971","n2972","n2978","n2898","n2907","n2912","n2909","n2911","n2901","n2903","n2904","n2906","n2902","n2900","n2910","n2908","n2899","n2897","n2905","n2186","n2233"],"tags":{"name":"Portage River","waterway":"river"}},"w541":{"id":"w541","nodes":["n2852","n2851","n3003"],"tags":{"highway":"residential","name":"1st Avenue"}},"w542":{"id":"w542","nodes":["n2991","n3004","n2994"],"tags":{"highway":"residential","name":"River Street"}},"w543":{"id":"w543","nodes":["n2993","n2989"],"tags":{"bridge":"yes","highway":"residential","name":"6th Street"}},"w544":{"id":"w544","nodes":["n2995","n2996","n2997","n2998","n2999","n3000","n3001","n3002","n2990","n2991","n2993"],"tags":{"highway":"residential","name":"6th Street"}},"w545":{"id":"w545","nodes":["n2989","n2992","n2848"],"tags":{"highway":"residential","name":"6th Street"}},"w546":{"id":"w546","nodes":["n2313","n3169","n3170","n3171","n3172","n3173","n3174","n3175","n3176","n3177","n3178","n3179","n3180","n3191","n3181","n3190","n3182","n3183","n3184","n3185","n3186","n3187","n3188","n3189","n3160","n3161","n3162","n2126","n2146","n2156","n2129","n2112","n2109","n2313"],"tags":{"natural":"wetland"}},"w547":{"id":"w547","nodes":["n2088","n3013","n3015","n3014","n3017","n3018"],"tags":{"name":"Conrail Railroad","railway":"rail"}},"w548":{"id":"w548","nodes":["n3083","n3084","n3085","n3086","n3083"],"tags":{"building":"yes"}},"w549":{"id":"w549","nodes":["n3020","n2288","n2283","n2284","n2131","n2286","n2287","n2285","n2132","n2140","n2289","n3020"],"tags":{"leisure":"park","name":"Conservation Park"}},"w55":{"id":"w55","nodes":["n277","n278","n279","n280","n281","n282","n283","n284","n277"],"tags":{"building":"yes"}},"w550":{"id":"w550","nodes":["n3056","n3042","n3041","n3040","n3039","n3038","n3037","n3036","n3044","n3035","n3034","n3043","n3016","n3056","n3019","n3015","n3012"],"tags":{"highway":"service"}},"w551":{"id":"w551","nodes":["n3044","n3045","n3046","n3047","n3048","n3049","n3050","n3051","n3052","n3053","n3054","n3055","n3016"],"tags":{"highway":"footway"}},"w552":{"id":"w552","nodes":["n3117","n3118","n3119","n3120","n3121","n3122","n3117"],"tags":{"building":"yes"}},"w553":{"id":"w553","nodes":["n3123","n3124","n3129","n3125","n3126","n3123"],"tags":{"building":"yes"}},"w554":{"id":"w554","nodes":["n3069","n3070","n3071","n3072","n3073","n3074","n3075","n3076","n3077","n3078","n3079","n3080","n3081","n3082","n3069"],"tags":{"building":"yes"}},"w555":{"id":"w555","nodes":["n3087","n3088","n3089","n3090","n3087"],"tags":{"building":"yes"}},"w556":{"id":"w556","nodes":["n3113","n3114","n3115","n3116","n3113"],"tags":{"building":"yes"}},"w557":{"id":"w557","nodes":["n3103","n3104","n3105","n3106","n3103"],"tags":{"building":"yes"}},"w558":{"id":"w558","nodes":["n3127","n3128","n3129","n3124","n3127"],"tags":{"building":"yes"}},"w559":{"id":"w559","nodes":["n3137","n3141","n3142","n3138","n3139","n3140","n3137"],"tags":{"building":"yes"}},"w56":{"id":"w56","nodes":["n285","n286","n287","n288","n285"],"tags":{"amenity":"parking"}},"w560":{"id":"w560","nodes":["n3091","n3092","n3093","n3094","n3091"],"tags":{"building":"yes"}},"w561":{"id":"w561","nodes":["n3155","n3157","n3158","n3159","n3156","n3155"],"tags":{"building":"yes"}},"w562":{"id":"w562","nodes":["n3057","n3058","n3059","n3060","n3057"],"tags":{"building":"yes"}},"w563":{"id":"w563","nodes":["n3107","n3108","n3109","n3110","n3111","n3112","n3107"],"tags":{"building":"yes"}},"w564":{"id":"w564","nodes":["n3134","n3135","n3136","n3131","n3134"],"tags":{"building":"yes"}},"w565":{"id":"w565","nodes":["n3143","n3144","n3145","n3146","n3143"],"tags":{"building":"yes"}},"w566":{"id":"w566","nodes":["n3095","n3096","n3097","n3098","n3095"],"tags":{"building":"yes"}},"w567":{"id":"w567","nodes":["n3130","n3131","n3136","n3132","n3133","n3130"],"tags":{"building":"yes"}},"w568":{"id":"w568","nodes":["n3025","n3026","n3027","n3028","n3029","n3030","n3031","n3033","n3032","n3025"],"tags":{"amenity":"parking"}},"w569":{"id":"w569","nodes":["n3061","n3062","n3063","n3064","n3061"],"tags":{"building":"yes"}},"w57":{"id":"w57","nodes":["n289","n290","n291","n292","n289"],"tags":{"amenity":"parking"}},"w570":{"id":"w570","nodes":["n3155","n3156","n3152","n3153","n3155"],"tags":{"building":"yes"}},"w571":{"id":"w571","nodes":["n3099","n3100","n3101","n3102","n3099"],"tags":{"building":"yes"}},"w572":{"id":"w572","nodes":["n3147","n3148","n3149","n3150","n3147"],"tags":{"building":"yes"}},"w573":{"id":"w573","nodes":["n3039","n2284"],"tags":{"highway":"service"}},"w574":{"id":"w574","nodes":["n3151","n3152","n3153","n3154","n3151"],"tags":{"building":"yes"}},"w575":{"id":"w575","nodes":["n3021","n3022","n3023","n3024","n3021"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w576":{"id":"w576","nodes":["n3065","n3066","n3067","n3068","n3065"],"tags":{"building":"yes"}},"w577":{"id":"w577","nodes":["n2944","n3192","n3757","n3813","n3814","n3815","n3816","n3817","n3818","n3819"],"tags":{"highway":"service","name":"Willow Drive","service":"driveway","surface":"unpaved"}},"w578":{"id":"w578","nodes":["n2163","n2165","n2166","n2167","n2168","n2172","n2173","n2174","n2175","n2176","n2178","n2181","n2163"],"tags":{"building":"yes"}},"w579":{"id":"w579","nodes":["n2754","n3195","n3204","n3205","n4537","n4540","n3206","n4530","n4536","n3207","n4524","n3199","n4521","n3197","n1032"],"tags":{"highway":"residential","name":"Elm Street"}},"w58":{"id":"w58","nodes":["n240","n293","n294"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w580":{"id":"w580","nodes":["n2184","n2185","n2187","n2190","n2191","n2192","n2184"],"tags":{"building":"yes"}},"w581":{"id":"w581","nodes":["n2765","n3208","n3211","n2755","n3280","n2756","n3346"],"tags":{"highway":"residential","name":"Kelsey Street"}},"w582":{"id":"w582","nodes":["n2753","n3194","n3193","n3201","n3196","n4551","n3202","n4550","n3203","n3200","n3198","n1033"],"tags":{"highway":"residential","name":"Walnut Street"}},"w583":{"id":"w583","nodes":["n3272","n4469","n4588","n2879","n4564","n2872"],"tags":{"highway":"residential","name":"10th Avenue"}},"w584":{"id":"w584","nodes":["n3243","n3242","n3241","n3240","n3243"],"tags":{"building":"industrial"}},"w585":{"id":"w585","nodes":["n3273","n3274","n4631","n4593","n3275","n4592","n2846","n4611","n2847"],"tags":{"highway":"residential","name":"6th Avenue"}},"w586":{"id":"w586","nodes":["n3276","n4591","n2853","n4605","n2854"],"tags":{"highway":"residential","name":"8th Avenue"}},"w587":{"id":"w587","nodes":["n3269","n3268","n3267","n3266","n3265","n3264","n3263","n3262","n3269"],"tags":{"building":"industrial"}},"w588":{"id":"w588","nodes":["n3277","n4599","n2857","n4598","n4608","n2858"],"tags":{"highway":"residential","name":"7th Avenue"}},"w589":{"id":"w589","nodes":["n3239","n3238","n3271","n3270","n3237","n3236","n3235","n3234","n3239"],"tags":{"building":"yes"}},"w59":{"id":"w59","nodes":["n294","n295","n296","n297","n298","n299","n300","n301","n302","n303","n491","n304","n305","n306","n307"],"tags":{"footway":"sidewalk","highway":"footway"}},"w590":{"id":"w590","nodes":["n3278","n4458","n4589","n4604","n2861"],"tags":{"highway":"residential","name":"9th Avenue"}},"w591":{"id":"w591","nodes":["n3253","n3252","n3251","n3250","n3249","n3248","n3253"],"tags":{"building":"industrial"}},"w592":{"id":"w592","nodes":["n3229","n3228","n3227","n3226","n3225","n3224","n3223","n3222","n3221","n3220","n3219","n3218","n3217","n3216","n3215","n3214","n3213","n3212","n3229"],"tags":{"natural":"water","water":"pond"}},"w593":{"id":"w593","nodes":["n3261","n3260","n3259","n3258","n3257","n3256","n3255","n3254","n3261"],"tags":{"building":"industrial"}},"w594":{"id":"w594","nodes":["n3233","n3232","n3231","n3230","n3233"],"tags":{"building":"yes"}},"w595":{"id":"w595","nodes":["n3247","n3246","n3245","n3244","n3247"],"tags":{"building":"industrial"}},"w596":{"id":"w596","nodes":["n2769","n3195","n3193","n3209","n2758","n2759","n3279"],"tags":{"highway":"residential","name":"Armitage Street"}},"w597":{"id":"w597","nodes":["n2193","n2194","n2195","n2197","n2193"],"tags":{"building":"yes"}},"w598":{"id":"w598","nodes":["n3404","n3403","n3402","n3401","n3400","n3399","n3398","n3397","n3373","n3372","n3396","n3395","n3404"],"tags":{"building":"school"}},"w6":{"id":"w6","nodes":["n879","n880","n881","n882","n879"],"tags":{"building":"shed"}},"w60":{"id":"w60","nodes":["n239","n308","n307"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w600":{"id":"w600","nodes":["n3387","n3386","n3316","n3315","n3314","n3313","n3387"],"tags":{"building":"yes"}},"w601":{"id":"w601","nodes":["n3304","n3303","n3302","n3301","n3385","n3384","n3300","n3299","n3304"],"tags":{"building":"yes"}},"w602":{"id":"w602","nodes":["n3334","n3333","n3332","n3331","n3330","n3329","n3328","n3327","n3326","n3325","n3324","n3323","n3322","n3321","n3320","n3319","n3318","n3317","n3334"],"tags":{"building":"yes"}},"w603":{"id":"w603","nodes":["n3353","n3352","n3347","n3280","n2798"],"tags":{"highway":"service","service":"alley","surface":"unpaved"}},"w604":{"id":"w604","nodes":["n3753","n3211","n3383"],"tags":{"highway":"service","service":"alley"}},"w605":{"id":"w605","nodes":["n3290","n3289","n3288","n3287","n3286","n3285","n3284","n3283","n3282","n3281","n3290"],"tags":{"building":"yes"}},"w606":{"id":"w606","nodes":["n2198","n2199","n2201","n2202","n2203","n2206","n2198"],"tags":{"building":"yes"}},"w607":{"id":"w607","nodes":["n2198","n2207"],"tags":{"barrier":"wall"}},"w608":{"id":"w608","nodes":["n2751","n3208","n3210","n3209","n3415","n3410","n3414","n3413","n3412","n3416"],"tags":{"highway":"residential","name":"East Street"}},"w609":{"id":"w609","nodes":["n2772","n3346","n3746","n3748","n3747","n3345","n3378","n3279","n3411"],"tags":{"highway":"residential","name":"Maple Street"}},"w61":{"id":"w61","nodes":["n309","n310","n311","n312","n313","n240"],"tags":{"footway":"sidewalk","highway":"footway"}},"w610":{"id":"w610","nodes":["n3379","n3380","n3382","n3381","n3379"],"tags":{"leisure":"park","name":"LaFayette Park"}},"w611":{"id":"w611","nodes":["n2768","n3194","n3210","n3753","n2760","n3353","n2773","n3378"],"tags":{"highway":"residential","name":"Bennett Street"}},"w612":{"id":"w612","nodes":["n2751","n3383","n2749","n2798","n2772"],"tags":{"highway":"residential","name":"Market Street"}},"w613":{"id":"w613","nodes":["n3298","n3297","n3296","n3295","n3294","n3293","n3292","n3291","n3298"],"tags":{"building":"yes"}},"w614":{"id":"w614","nodes":["n3375","n3406","n3405","n3374","n3375"],"tags":{"leisure":"playground"}},"w615":{"id":"w615","nodes":["n3393","n3344","n3343","n3342","n3341","n3340","n3339","n3338","n3337","n3392","n3391","n3390","n3389","n3336","n3335","n3388","n3393"],"tags":{"building":"yes"}},"w616":{"id":"w616","nodes":["n3376","n3407","n3408","n3377","n3376"],"tags":{"amenity":"school","name":"Three Rivers Elementary School"}},"w617":{"id":"w617","nodes":["n3312","n3311","n3310","n3309","n3308","n3307","n3306","n3305","n3312"],"tags":{"building":"yes"}},"w619":{"id":"w619","nodes":["n2863","n3424","n3425","n3426","n3427","n3428","n3429","n3430","n3431","n3432","n3433","n2844"],"tags":{"highway":"secondary","name":"Michigan Avenue","ref":"M 60"}},"w62":{"id":"w62","nodes":["n876","n906","n904","n875","n874","n873","n872","n871","n870","n869","n41","n868","n146","n314","n315","n1956"],"tags":{"footway":"sidewalk","highway":"footway"}},"w620":{"id":"w620","nodes":["n2844","n3420","n3421","n3422","n3439","n2859","n3437","n3493","n3496","n3500","n3497"],"tags":{"highway":"residential"}},"w621":{"id":"w621","nodes":["n3468","n3469","n3470","n3471","n3468"],"tags":{"building":"yes"}},"w622":{"id":"w622","nodes":["n3417","n3436","n3438","n3491","n3488","n3492","n3495","n3494","n3498","n3487","n3499","n3490","n3489","n4800","n3417"],"tags":{"landuse":"cemetery","name":"Riverside Cemetery"}},"w623":{"id":"w623","nodes":["n3440","n3441","n3442","n3443","n3444","n3445","n3440"],"tags":{"building":"yes"}},"w624":{"id":"w624","nodes":["n3446","n3447","n3448","n3449","n3450","n3451","n3452","n3453","n3454","n3455","n3456","n3457","n3458","n3459","n3460","n3461","n3462","n3463","n3464","n3465","n3466","n3467","n3446"],"tags":{"building":"yes"}},"w625":{"id":"w625","nodes":["n2844","n3434","n3435","n2878","n3275","n4621","n3276","n3278","n4463","n3272","n3472","n3474","n3475","n3476","n3477","n3478","n1202","n3479","n3480","n3481","n1203","n3482","n3483","n3484","n3485","n4574","n3486","n3473"],"tags":{"highway":"secondary","name":"Jefferson Street","name_1":"State Highway 60","ref":"M 60"}},"w626":{"id":"w626","nodes":["n3439","n3423","n2863"],"tags":{"highway":"unclassified","name":"Michigan Avenue","name_1":"State Highway 60"}},"w627":{"id":"w627","nodes":["n3500","n3005"],"tags":{"highway":"service"}},"w628":{"id":"w628","nodes":["n3491","n3488","n3492","n3010","n3009","n3005","n3008","n3007","n3006","n3502","n3491"],"tags":{"leisure":"park","name":"Marina Park"}},"w629":{"id":"w629","nodes":["n2208","n2209","n2212","n2214","n2208"],"tags":{"building":"yes"}},"w63":{"id":"w63","nodes":["n1955","n316"],"tags":{"footway":"sidewalk","highway":"footway"}},"w630":{"id":"w630","nodes":["n2757","n3414","n3202","n4542","n3206","n4538","n3750","n3503","n1629","n4500","n2763","n4502","n2764","n3508"],"tags":{"highway":"residential","name":"Hoffman Street"}},"w631":{"id":"w631","nodes":["n2215","n2750","n2770","n2771","n2215"],"tags":{"building":"yes"}},"w632":{"id":"w632","nodes":["n2766","n3504","n3507","n3751","n3205","n3196","n3410","n2746"],"tags":{"highway":"residential","name":"Cushman Street"}},"w633":{"id":"w633","nodes":["n2745","n3749","n3507","n4535","n3503"],"tags":{"highway":"residential","name":"Pine Street"}},"w634":{"id":"w634","nodes":["n3510","n3511","n3512","n3509","n3510"],"tags":{"leisure":"park","name":"Bowman Park"}},"w636":{"id":"w636","nodes":["n2745","n3752","n3204","n3201","n3415","n2761","n2767","n3411"],"tags":{"highway":"residential","name":"Wheeler Street"}},"w637":{"id":"w637","nodes":["n3550","n4586","n4476","n3472"],"tags":{"highway":"residential","name":"11th Avenue"}},"w638":{"id":"w638","nodes":["n3508","n3518"],"tags":{"bridge":"yes","highway":"residential","name":"Hoffman Street"}},"w639":{"id":"w639","nodes":["n3518","n1204","n2862","n3519","n3520","n3521","n3522","n3523","n2161","n3524","n3549","n3552","n4239","n3551","n4577","n4582","n4578","n4583","n4579","n4574"],"tags":{"highway":"residential","name":"Hoffman Street"}},"w64":{"id":"w64","nodes":["n316","n317"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w640":{"id":"w640","nodes":["n3634","n3640","n3676","n3633","n3678","n3648","n3638","n3683","n3600","n3579","n3679","n3677","n2987","n3592","n3588","n3608","n3559","n3617","n3620","n3660","n3553","n3533","n3530","n3531","n3525","n3527","n3526","n3532","n3529","n3528","n3667","n3627","n3623","n3625","n3601","n3687","n3671","n3644","n3626","n3673","n3582","n3693","n3605","n3619","n3651","n3650","n3615","n3663","n3631","n3596","n3604","n3655","n3586","n3595","n3701","n3603","n3686","n3611","n3568","n3674","n3613","n3580","n3562","n3564","n3689","n3585","n3670","n3659","n3684","n3680","n3646","n3558","n3556","n3692","n3563","n3575","n3571","n3675","n3557","n3700","n3656","n3622","n3657","n3565","n3669","n3658","n3618","n3624","n3688","n3610","n3570","n3645","n3649","n3583","n3694","n3561","n3554","n3614","n3698","n3581","n3635","n3641","n3569","n3647","n3628","n3598","n3696","n3665","n3639","n3607","n3695","n3642","n3672","n3577","n3643","n3691","n3602","n3576","n3591","n3560","n3606","n3685","n3597","n3629","n3661","n3654","n3616","n3697","n3578","n3609","n3653","n3699","n3566","n3637","n3567","n3666","n3555","n3599","n3590","n3572","n3593","n3690","n3681","n3612","n3682","n3668","n3587","n3621","n3636","n3662","n3589","n3573","n3652","n3664","n3632","n3574","n3594","n3584","n3630","n3634"],"tags":{"landuse":"reservoir","name":"Hoffman Pond","natural":"water"}},"w641":{"id":"w641","nodes":["n2988","n3534","n3535","n3536","n3537","n3538","n3539","n3540","n3541","n3542","n3543","n3544","n3545","n3546","n3547","n3548","n2970"],"tags":{"waterway":"river"}},"w642":{"id":"w642","nodes":["n3702","n3703","n3704","n3705","n3706","n3707","n3708","n3709","n3710","n3711","n3712","n3713","n3714","n3715","n3716","n3717","n3718","n3719","n3720","n3721","n3722","n3723","n3724","n3725","n3726","n3727","n3728","n3729","n3730","n3731","n3732","n3733","n3734","n3735","n3736","n3737","n3738","n3739","n3740","n3741","n3742","n3743","n3702"],"tags":{"admin_level":"8","boundary":"administrative"}},"w643":{"id":"w643","nodes":["n2839","n2873"],"tags":{"highway":"service","service":"driveway"}},"w644":{"id":"w644","nodes":["n2873","n2840"],"tags":{"bridge":"yes","highway":"service","layer":"1","service":"driveway"}},"w645":{"id":"w645","nodes":["n2840","n2841","n2842","n2845","n2866"],"tags":{"highway":"service","service":"driveway","surface":"unpaved"}},"w646":{"id":"w646","nodes":["n2752","n3759","n1420","n1421","n1422","n3758","n4507","n4506","n4505","n4520","n3199","n4522","n4504","n4546","n3200","n4547","n3412"],"tags":{"highway":"residential","name":"Flower Street"}},"w647":{"id":"w647","nodes":["n2874","n2875","n2876","n2954","n2874"],"tags":{"building":"industrial"}},"w648":{"id":"w648","nodes":["n3778","n3779","n3780","n3781","n3782","n3783","n3778"],"tags":{"building":"yes"}},"w649":{"id":"w649","nodes":["n3197","n4543","n4544","n3198"],"tags":{"highway":"residential","name":"Morris Avenue","surface":"unpaved"}},"w65":{"id":"w65","nodes":["n317","n318","n319","n320","n321"],"tags":{"footway":"sidewalk","highway":"footway"}},"w650":{"id":"w650","nodes":["n3207","n4526","n4528","n4548","n3203","n4549","n3413","n2762"],"tags":{"highway":"residential","name":"Adams Street"}},"w651":{"id":"w651","nodes":["n3788","n3785","n3786","n3787","n3788"],"tags":{"power":"station"}},"w652":{"id":"w652","nodes":["n2957","n3163","n3241"],"tags":{"barrier":"wall"}},"w653":{"id":"w653","nodes":["n3549","n3802","n3803","n3800","n3801"],"tags":{"highway":"service","surface":"unpaved"}},"w654":{"id":"w654","nodes":["n3164","n3165","n3166","n3167","n3168","n3505","n3164"],"tags":{"building":"yes"}},"w655":{"id":"w655","nodes":["n3506","n3517","n3760","n3761","n3762","n3763","n3506"],"tags":{"building":"yes"}},"w656":{"id":"w656","nodes":["n3764","n3765","n3766","n3767","n3768","n3769","n3770","n3771","n3764"],"tags":{"building":"yes"}},"w657":{"id":"w657","nodes":["n3772","n3773","n3774","n3775","n3772"],"tags":{"building":"yes"}},"w658":{"id":"w658","nodes":["n3776","n3777","n3784","n3789","n3776"],"tags":{"building":"yes"}},"w659":{"id":"w659","nodes":["n3930","n3931","n3932","n3933","n3934","n3935","n3936","n3937","n3938","n3930"],"tags":{"leisure":"pitch","sport":"baseball"}},"w66":{"id":"w66","nodes":["n321","n322"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w660":{"id":"w660","nodes":["n3982","n3842","n3864","n3865","n2938","n3866","n2939","n3867","n3868","n3858","n2937","n3869","n2935","n2934","n3870","n3348","n3862"],"tags":{"highway":"service"}},"w661":{"id":"w661","nodes":["n3968","n3969"],"tags":{"highway":"footway"}},"w662":{"id":"w662","nodes":["n3875","n3876","n3877","n3878","n3879","n3880","n3881","n3882","n3875"],"tags":{"amenity":"parking"}},"w663":{"id":"w663","nodes":["n3964","n3965"],"tags":{"highway":"footway"}},"w664":{"id":"w664","nodes":["n3966","n3967"],"tags":{"highway":"footway"}},"w665":{"id":"w665","nodes":["n3857","n3890","n3884","n3894","n3889","n3899","n3885","n3886","n3896","n3887"],"tags":{"highway":"service","service":"parking_aisle"}},"w666":{"id":"w666","nodes":["n3895","n3896"],"tags":{"highway":"service","service":"parking_aisle"}},"w667":{"id":"w667","nodes":["n3274","n3977","n3984","n3983","n3981","n3844","n3978","n3982","n3861","n3862","n3873","n3874","n4468","n3863"],"tags":{"access":"private","highway":"service","name":"Collins Drive"}},"w668":{"id":"w668","nodes":["n3900","n3901","n3902","n3903","n3904","n3905","n3808","n3809","n3906","n3907","n3908","n3967","n3909","n3910","n3911","n3955","n3964","n3912","n3913","n3914","n3915","n3916","n3917","n3918","n3919","n3920","n3921","n3922","n3923","n3924","n3925","n3926","n3927","n3969","n3970","n3928","n3807","n3929","n3900"],"tags":{"building":"school"}},"w669":{"id":"w669","nodes":["n3272","n39","n40","n3974","n3863","n3857","n3892","n3883","n3891","n3889"],"tags":{"highway":"service"}},"w67":{"id":"w67","nodes":["n322","n886","n323","n475"],"tags":{"footway":"crossing","highway":"footway"}},"w670":{"id":"w670","nodes":["n3473","n3859","n3860","n3980","n4908","n4865"],"tags":{"highway":"secondary","name":"Hoffman Street","ref":"M 60"}},"w671":{"id":"w671","nodes":["n3970","n3806","n3971"],"tags":{"highway":"footway"}},"w672":{"id":"w672","nodes":["n3892","n3893","n3894"],"tags":{"highway":"service","service":"parking_aisle"}},"w673":{"id":"w673","nodes":["n3945","n3946","n3992","n3990","n3945"],"tags":{"leisure":"pitch","sport":"tennis"}},"w674":{"id":"w674","nodes":["n3890","n3893","n3891"],"tags":{"highway":"service","service":"parking_aisle"}},"w675":{"id":"w675","nodes":["n3947","n3948","n3994","n3993","n3947"],"tags":{"leisure":"pitch","sport":"tennis"}},"w676":{"id":"w676","nodes":["n3858","n3954","n3972","n3810","n3811","n3812","n3841","n3973","n3898","n3963","n3897","n3896"],"tags":{"highway":"service"}},"w677":{"id":"w677","nodes":["n3977","n3996","n3997","n4004","n3998","n3999","n4005","n4007","n4006","n3995","n4000","n3843","n4001","n4002","n4003","n3949","n3351","n3950","n3354","n3350","n3951","n3349","n3952","n3953","n3954","n3956","n3966","n3955"],"tags":{"highway":"footway"}},"w678":{"id":"w678","nodes":["n3887","n3888","n3895","n3899"],"tags":{"highway":"service","service":"parking_aisle"}},"w679":{"id":"w679","nodes":["n3946","n3947","n3993","n3992","n3946"],"tags":{"leisure":"pitch","sport":"tennis"}},"w68":{"id":"w68","nodes":["n294","n1952","n326"],"tags":{"footway":"sidewalk","highway":"footway"}},"w680":{"id":"w680","nodes":["n3939","n3940","n3941","n3985","n3986","n3987","n3988","n3989","n3942","n3943","n3939"],"tags":{"leisure":"pitch","sport":"baseball"}},"w681":{"id":"w681","nodes":["n3990","n3991","n3944","n3945","n3990"],"tags":{"leisure":"pitch","sport":"tennis"}},"w682":{"id":"w682","nodes":["n3871","n3872","n3873","n3874","n3871"],"tags":{"amenity":"parking"}},"w683":{"id":"w683","nodes":["n3956","n3965","n3957","n3958","n3959"],"tags":{"footway":"sidewalk","highway":"footway"}},"w684":{"id":"w684","nodes":["n3790","n3791","n3792","n3793","n3790"],"tags":{"building":"shed"}},"w685":{"id":"w685","nodes":["n3794","n3795","n3796","n3797","n3794"],"tags":{"building":"yes"}},"w686":{"id":"w686","nodes":["n3798","n3799","n3804","n3805","n3798"],"tags":{"building":"yes"}},"w687":{"id":"w687","nodes":["n3806","n3807"],"tags":{"highway":"footway"}},"w688":{"id":"w688","nodes":["n3845","n3846","n3847","n3848","n3845"],"tags":{"leisure":"pitch","sport":"american_football"}},"w689":{"id":"w689","nodes":["n3849","n4021","n3850","n3851","n3852","n3853","n3854","n3855","n3856","n3975","n3976","n3979","n4008","n4009","n4010","n4011","n4012","n4013","n4014","n4015","n4016","n4017","n4018","n4019","n4020","n4021"],"tags":{"leisure":"track","sport":"running"}},"w69":{"id":"w69","nodes":["n326","n327"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w690":{"id":"w690","nodes":["n4022","n4023","n4024","n4025","n4026","n4027","n4022"],"tags":{"building":"yes"}},"w691":{"id":"w691","nodes":["n4028","n4029","n4030","n4031","n4028"],"tags":{"building":"yes"}},"w692":{"id":"w692","nodes":["n4032","n4033","n4034","n4035","n4032"],"tags":{"building":"yes"}},"w693":{"id":"w693","nodes":["n4036","n4037","n4038","n4039","n4036"],"tags":{"building":"yes"}},"w694":{"id":"w694","nodes":["n4040","n4041","n4042","n4043","n4040"],"tags":{"building":"yes"}},"w695":{"id":"w695","nodes":["n4044","n4045","n4050","n4053","n4046","n4047","n4048","n4049","n4044"],"tags":{"building":"yes"}},"w696":{"id":"w696","nodes":["n4050","n4051","n4052","n4053","n4050"],"tags":{"building":"roof"}},"w697":{"id":"w697","nodes":["n4054","n4068","n4055","n4056","n4057","n4054"],"tags":{"building":"yes"}},"w698":{"id":"w698","nodes":["n4058","n4059","n4060","n4061","n4062","n4063","n4058"],"tags":{"building":"yes"}},"w699":{"id":"w699","nodes":["n4064","n4066","n4065"],"tags":{"barrier":"fence"}},"w7":{"id":"w7","nodes":["n43","n44","n45"],"tags":{"highway":"service"}},"w70":{"id":"w70","nodes":["n327","n328","n27","n329"],"tags":{"footway":"sidewalk","highway":"footway"}},"w700":{"id":"w700","nodes":["n4066","n4067","n4068"],"tags":{"barrier":"fence"}},"w701":{"id":"w701","nodes":["n4069","n4070","n4071","n4072","n4069"],"tags":{"building":"shed"}},"w702":{"id":"w702","nodes":["n4073","n4074","n4075","n4076","n4077","n4078","n4079","n4080","n4081","n4082","n4083","n4084","n4073"],"tags":{"building":"yes"}},"w703":{"id":"w703","nodes":["n4085","n4093","n4086","n4087","n4088","n4089","n4090","n4091","n4092","n4085"],"tags":{"building":"yes"}},"w704":{"id":"w704","nodes":["n4093","n4094","n4095","n4096"],"tags":{"barrier":"fence"}},"w705":{"id":"w705","nodes":["n4097","n4098","n4099","n4100","n4097"],"tags":{"building":"yes"}},"w706":{"id":"w706","nodes":["n4098","n4102","n4087"],"tags":{"barrier":"fence"}},"w707":{"id":"w707","nodes":["n4101","n4102","n4096","n4170","n4103"],"tags":{"barrier":"fence"}},"w708":{"id":"w708","nodes":["n4104","n4105","n4106","n4107","n4104"],"tags":{"access":"private","leisure":"swimming_pool"}},"w709":{"id":"w709","nodes":["n4108","n4109","n4110","n4111","n4108"],"tags":{"building":"yes"}},"w71":{"id":"w71","nodes":["n329","n331"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w710":{"id":"w710","nodes":["n4112","n4113","n4114","n4115","n4116","n4117","n4118","n4119","n4112"],"tags":{"building":"yes"}},"w711":{"id":"w711","nodes":["n4120","n4121","n4122","n4123","n4120"],"tags":{"building":"yes"}},"w712":{"id":"w712","nodes":["n4124","n4125","n4126","n4127","n4128","n4129","n4124"],"tags":{"building":"yes"}},"w713":{"id":"w713","nodes":["n4130","n4131","n4132","n4133","n4130"],"tags":{"building":"shed"}},"w714":{"id":"w714","nodes":["n4134","n4135","n4136","n4137","n4138","n4139","n4140","n4141","n4142","n4143","n4134"],"tags":{"building":"yes"}},"w715":{"id":"w715","nodes":["n4144","n4145","n4146","n4147","n4148","n4149","n4144"],"tags":{"building":"yes"}},"w716":{"id":"w716","nodes":["n4150","n4151","n4152","n4153","n4150"],"tags":{"building":"yes"}},"w717":{"id":"w717","nodes":["n4154","n4155","n4156","n4157","n4154"],"tags":{"building":"yes"}},"w718":{"id":"w718","nodes":["n4158","n4159","n4160","n4161","n4162","n4163","n4164","n4165","n4158"],"tags":{"building":"yes"}},"w719":{"id":"w719","nodes":["n4166","n4167","n4168","n4169","n4166"],"tags":{"building":"yes"}},"w72":{"id":"w72","nodes":["n331","n344","n332","n333","n334"],"tags":{"footway":"sidewalk","highway":"footway"}},"w720":{"id":"w720","nodes":["n4170","n4171"],"tags":{"barrier":"fence"}},"w721":{"id":"w721","nodes":["n4138","n4103"],"tags":{"barrier":"fence"}},"w722":{"id":"w722","nodes":["n4103","n4172"],"tags":{"barrier":"fence"}},"w723":{"id":"w723","nodes":["n4173","n4174"],"tags":{"barrier":"fence"}},"w724":{"id":"w724","nodes":["n4175","n4176","n4177","n4178","n4175"],"tags":{"building":"yes"}},"w725":{"id":"w725","nodes":["n4179","n4180","n4181","n4182","n4183","n4184","n4179"],"tags":{"building":"yes"}},"w726":{"id":"w726","nodes":["n4185","n4186","n4187","n4188","n4185"],"tags":{"building":"yes"}},"w727":{"id":"w727","nodes":["n4189","n4190","n4191","n4192","n4193","n4194","n4195","n4196","n4197","n4198","n4199","n4200","n4201","n4202","n4189"],"tags":{"building":"yes"}},"w728":{"id":"w728","nodes":["n4203","n4204","n4205","n4206","n4207","n4208","n4209","n4210","n4203"],"tags":{"building":"yes"}},"w729":{"id":"w729","nodes":["n4211","n4212","n4213","n4214","n4211"],"tags":{"building":"shed"}},"w73":{"id":"w73","nodes":["n335","n336","n337","n338","n339","n340","n341","n342","n335"],"tags":{"building":"yes"}},"w730":{"id":"w730","nodes":["n4215","n4216","n4217","n4218","n4215"],"tags":{"building":"yes"}},"w731":{"id":"w731","nodes":["n4219","n4220","n4221","n4222","n4223","n4224","n4225","n4226","n4227","n4228","n4229","n4230","n4219"],"tags":{"building":"yes"}},"w732":{"id":"w732","nodes":["n4231","n4232","n4233","n4234","n4235","n4236","n4237","n4238","n4231"],"tags":{"building":"yes"}},"w733":{"id":"w733","nodes":["n4239","n4240","n4241","n4242","n4243","n4244","n4245","n4246","n4247","n4248","n4241"],"tags":{"highway":"service"}},"w734":{"id":"w734","nodes":["n4240","n4249","n4248"],"tags":{"highway":"service","service":"parking_aisle"}},"w735":{"id":"w735","nodes":["n4250","n4251","n4252","n4253","n4254","n4255","n4256","n4257","n4258","n4250"],"tags":{"amenity":"parking"}},"w736":{"id":"w736","nodes":["n4259","n4260","n4261","n4262","n4259"],"tags":{"building":"yes"}},"w737":{"id":"w737","nodes":["n4263","n4264","n4265","n4266","n4267","n4268","n4269","n4270","n4271","n4272","n4273","n4274","n4275","n4276","n4263"],"tags":{"building":"yes"}},"w738":{"id":"w738","nodes":["n4277","n4278","n4279","n4280","n4281","n4282","n4277"],"tags":{"building":"yes"}},"w739":{"id":"w739","nodes":["n4283","n4284","n4285","n4286","n4287","n4288","n4289","n4290","n4291","n4292","n4293","n4294","n4283"],"tags":{"building":"yes"}},"w74":{"id":"w74","nodes":["n343","n344","n345"],"tags":{"highway":"service"}},"w740":{"id":"w740","nodes":["n4295","n4296","n4297","n4298","n4295"],"tags":{"building":"yes"}},"w741":{"id":"w741","nodes":["n4299","n4300","n4301","n4302","n4303","n4304","n4305","n4306","n4307","n4308","n4309","n4310","n4299"],"tags":{"building":"yes"}},"w742":{"id":"w742","nodes":["n4311","n4312","n4313","n4314","n4311"],"tags":{"building":"shed"}},"w743":{"id":"w743","nodes":["n4315","n4316","n4317","n4318","n4319","n4320","n4315"],"tags":{"building":"yes"}},"w744":{"id":"w744","nodes":["n4321","n4322","n4323","n4324","n4325","n4326","n4327","n4328","n4329","n4330","n4331","n4332","n4333","n4334","n4321"],"tags":{"building":"yes"}},"w745":{"id":"w745","nodes":["n4335","n4336","n4337","n4338","n4335"],"tags":{"building":"shed"}},"w746":{"id":"w746","nodes":["n4339","n4340","n4341","n4342","n4343","n4344","n4339"],"tags":{"building":"yes"}},"w747":{"id":"w747","nodes":["n4345","n4346","n4347","n4348","n4345"],"tags":{"building":"yes"}},"w748":{"id":"w748","nodes":["n4349","n4350","n4351","n4352","n4349"],"tags":{"building":"yes"}},"w749":{"id":"w749","nodes":["n4353","n4354","n4355","n4356","n4357","n4358","n4353"],"tags":{"building":"yes"}},"w75":{"id":"w75","nodes":["n346","n347","n348","n349","n350","n351","n346"],"tags":{"amenity":"parking"}},"w750":{"id":"w750","nodes":["n4612","n4359","n4360"],"tags":{"barrier":"fence"}},"w751":{"id":"w751","nodes":["n4361","n4362","n4363","n4364","n4361"],"tags":{"building":"yes"}},"w752":{"id":"w752","nodes":["n4365","n4366","n4367","n4368","n4365"],"tags":{"building":"yes"}},"w753":{"id":"w753","nodes":["n4369","n4370","n4371","n4372","n4375","n4369"],"tags":{"building":"yes"}},"w754":{"id":"w754","nodes":["n4373","n4374","n4375"],"tags":{"barrier":"fence"}},"w755":{"id":"w755","nodes":["n4376","n4377","n4378","n4379","n4376"],"tags":{"building":"shed"}},"w756":{"id":"w756","nodes":["n4380","n4381","n4382","n4383","n4384","n4385","n4386","n4387","n4388","n4389","n4390","n4391","n4380"],"tags":{"building":"yes"}},"w757":{"id":"w757","nodes":["n4392","n4393","n4394","n4395","n4392"],"tags":{"building":"yes"}},"w758":{"id":"w758","nodes":["n4396","n4397","n4398","n4399","n4396"],"tags":{"building":"shed"}},"w759":{"id":"w759","nodes":["n4400","n4401","n4402","n4403","n4404","n4405","n4406","n4407","n4408","n4409","n4410","n4411","n4412","n4413","n4414","n4415","n4400"],"tags":{"building":"yes"}},"w76":{"id":"w76","nodes":["n2561","n359","n2563","n2793","n357","n356","n2792","n355","n354","n2791","n2562","n353","n352","n358","n2561"],"tags":{"highway":"service","oneway":"yes","service":"parking_aisle"}},"w760":{"id":"w760","nodes":["n4416","n4417"],"tags":{"barrier":"fence"}},"w761":{"id":"w761","nodes":["n4418","n4416","n4419"],"tags":{"barrier":"fence"}},"w762":{"id":"w762","nodes":["n4420","n4421"],"tags":{"barrier":"fence"}},"w763":{"id":"w763","nodes":["n4422","n4423","n4424","n4425","n4426","n4427","n4428","n4429","n4430","n4431","n4432","n4433","n4422"],"tags":{"building":"yes"}},"w764":{"id":"w764","nodes":["n4434","n4435","n4436","n4437","n4438","n4439","n4440","n4441","n4442","n4445","n4444","n4443","n4434"],"tags":{"building":"yes"}},"w765":{"id":"w765","nodes":["n4446","n4447","n4448","n4449","n4446"],"tags":{"building":"yes"}},"w766":{"id":"w766","nodes":["n4450","n4451","n4452","n4453","n4450"],"tags":{"building":"yes"}},"w767":{"id":"w767","nodes":["n4454","n4455","n4456","n4457","n4454"],"tags":{"building":"yes"}},"w768":{"id":"w768","nodes":["n4461","n4458","n4460"],"tags":{"footway":"crossing","highway":"footway"}},"w769":{"id":"w769","nodes":["n4460","n4462","n4459"],"tags":{"footway":"sidewalk","highway":"footway"}},"w77":{"id":"w77","nodes":["n325","n360","n361"],"tags":{"footway":"crossing","highway":"footway"}},"w770":{"id":"w770","nodes":["n4462","n4463","n4464"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w771":{"id":"w771","nodes":["n4464","n4465","n4466","n4467"],"tags":{"footway":"sidewalk","highway":"footway"}},"w772":{"id":"w772","nodes":["n3959","n3968","n3971","n3960","n3961","n3962","n3963"],"tags":{"footway":"sidewalk","highway":"footway"}},"w773":{"id":"w773","nodes":["n4467","n4468","n3959"],"tags":{"footway":"crossing","highway":"footway"}},"w774":{"id":"w774","nodes":["n4459","n4469","n4470"],"tags":{"footway":"crossing","highway":"footway"}},"w775":{"id":"w775","nodes":["n4470","n4471","n4472","n4473","n4474","n4475"],"tags":{"footway":"sidewalk","highway":"footway"}},"w776":{"id":"w776","nodes":["n4475","n4476","n4477"],"tags":{"footway":"crossing","highway":"footway"}},"w777":{"id":"w777","nodes":["n4477","n4478","n4479","n4480","n4481","n4482","n4483","n4484","n4485","n4486","n4487"],"tags":{"footway":"sidewalk","highway":"footway"}},"w778":{"id":"w778","nodes":["n4488","n4489","n4490","n4491","n4488"],"tags":{"building":"yes"}},"w779":{"id":"w779","nodes":["n4492","n4493","n4494","n4495","n4492"],"tags":{"building":"yes"}},"w78":{"id":"w78","nodes":["n361","n362","n369"],"tags":{"footway":"sidewalk","highway":"footway"}},"w780":{"id":"w780","nodes":["n4496","n4497","n4498","n4499","n4496"],"tags":{"access":"private","leisure":"swimming_pool"}},"w781":{"id":"w781","nodes":["n4508","n4509"],"tags":{"footway":"sidewalk","highway":"footway"}},"w782":{"id":"w782","nodes":["n4510","n4511"],"tags":{"footway":"sidewalk","highway":"footway"}},"w783":{"id":"w783","nodes":["n4512","n4513"],"tags":{"footway":"sidewalk","highway":"footway"}},"w784":{"id":"w784","nodes":["n4513","n4514"],"tags":{"footway":"sidewalk","highway":"footway"}},"w785":{"id":"w785","nodes":["n4515","n4516"],"tags":{"footway":"sidewalk","highway":"footway"}},"w786":{"id":"w786","nodes":["n4517","n4515"],"tags":{"footway":"sidewalk","highway":"footway"}},"w787":{"id":"w787","nodes":["n4518","n4519"],"tags":{"footway":"sidewalk","highway":"footway"}},"w788":{"id":"w788","nodes":["n4519","n4520","n4513"],"tags":{"footway":"crossing","highway":"footway"}},"w789":{"id":"w789","nodes":["n4515","n4521","n4513"],"tags":{"footway":"crossing","highway":"footway"}},"w79":{"id":"w79","nodes":["n362","n363","n334"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w790":{"id":"w790","nodes":["n4515","n4522","n4523"],"tags":{"footway":"crossing","highway":"footway"}},"w791":{"id":"w791","nodes":["n4523","n4524","n4519"],"tags":{"footway":"crossing","highway":"footway"}},"w792":{"id":"w792","nodes":["n4523","n4525"],"tags":{"footway":"sidewalk","highway":"footway"}},"w793":{"id":"w793","nodes":["n4525","n4526","n4527"],"tags":{"footway":"crossing","highway":"footway"}},"w794":{"id":"w794","nodes":["n4527","n4529"],"tags":{"footway":"sidewalk","highway":"footway"}},"w795":{"id":"w795","nodes":["n4529","n4530","n4518"],"tags":{"footway":"crossing","highway":"footway"}},"w796":{"id":"w796","nodes":["n4518","n4531"],"tags":{"footway":"sidewalk","highway":"footway"}},"w797":{"id":"w797","nodes":["n4531","n4532"],"tags":{"footway":"sidewalk","highway":"footway"}},"w798":{"id":"w798","nodes":["n4533","n4534"],"tags":{"footway":"sidewalk","highway":"footway"}},"w799":{"id":"w799","nodes":["n4518","n4538","n4539"],"tags":{"footway":"crossing","highway":"footway"}},"w8":{"id":"w8","nodes":["n46","n47","n145","n48","n49","n46"],"tags":{"amenity":"parking"}},"w80":{"id":"w80","nodes":["n334","n364","n365"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w800":{"id":"w800","nodes":["n4539","n4540","n4541"],"tags":{"footway":"crossing","highway":"footway"}},"w801":{"id":"w801","nodes":["n4541","n4542","n4529"],"tags":{"footway":"crossing","highway":"footway"}},"w802":{"id":"w802","nodes":["n4552","n4553"],"tags":{"footway":"sidewalk","highway":"footway"}},"w803":{"id":"w803","nodes":["n4554","n4555","n4556","n4557","n4558","n4559","n4554"],"tags":{"building":"yes"}},"w804":{"id":"w804","nodes":["n4562","n4563"],"tags":{"barrier":"retaining_wall"}},"w805":{"id":"w805","nodes":["n4568","n4569","n4570","n4571","n4568"],"tags":{"building":"yes"}},"w806":{"id":"w806","nodes":["n3473","n4575","n4576","n4581","n4580","n3551"],"tags":{"highway":"residential","oneway":"yes"}},"w807":{"id":"w807","nodes":["n4613","n4614","n4615","n4616","n4617","n4618","n4619","n4620","n4613"],"tags":{"leisure":"pitch","sport":"baseball"}},"w808":{"id":"w808","nodes":["n4621","n4622","n4623","n4624","n4625","n4626","n4627","n4628","n4629","n4630"],"tags":{"highway":"service"}},"w809":{"id":"w809","nodes":["n4631","n4632","n4633","n4637","n4634","n4638","n4635","n4636"],"tags":{"highway":"service"}},"w81":{"id":"w81","nodes":["n365","n366","n367"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w810":{"id":"w810","nodes":["n4639","n4640","n4641"],"tags":{"barrier":"fence"}},"w811":{"id":"w811","nodes":["n4649","n4650","n4651","n4652","n4649"],"tags":{"building":"yes"}},"w812":{"id":"w812","nodes":["n4654","n4655"],"tags":{"barrier":"fence"}},"w813":{"id":"w813","nodes":["n4656","n4657"],"tags":{"barrier":"fence"}},"w814":{"id":"w814","nodes":["n4669","n4670","n4671","n4672","n4669"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelters"}},"w815":{"id":"w815","nodes":["n4678","n4679","n4680","n1889"],"tags":{"highway":"service"}},"w816":{"id":"w816","nodes":["n239","n4686","n4687"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w817":{"id":"w817","nodes":["n4687","n4688","n4689"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w818":{"id":"w818","nodes":["n4689","n4690","n307"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w819":{"id":"w819","nodes":["n2266","n4743"],"tags":{"highway":"path"}},"w82":{"id":"w82","nodes":["n724","n368","n369"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w820":{"id":"w820","nodes":["n4785","n4786","n4787","n4788","n1684","n4760","n4769","n4761","n4762","n4763","n4764","n4765","n4766","n4767","n4768","n4785"],"tags":{"natural":"wood"}},"w821":{"id":"w821","nodes":["n4769","n4770","n4771","n4772","n4773","n4774","n4775","n4776","n4777","n4778","n4779","n4780","n4781","n4782","n4783","n4784","n4785","n4768","n4767","n4766","n4765","n4764","n4763","n4762","n4761","n4769"],"tags":{"natural":"scrub"}},"w822":{"id":"w822","nodes":["n4772","n4789","n4790","n4791","n4792","n4793","n4794","n4795","n4796","n4797","n4798","n4799","n4783","n4782","n4781","n4780","n4779","n4778","n4777","n4776","n4775","n4774","n4773","n4772"],"tags":{"natural":"wood"}},"w823":{"id":"w823","nodes":["n4800","n4801","n4802","n4803","n4804","n4805","n4806","n4807","n4808","n4809","n4810","n4811","n4812","n4813","n4814","n4815","n4816","n3490","n3489","n4800"],"tags":{"natural":"wood"}},"w824":{"id":"w824","nodes":["n4817","n4818","n4819","n4820","n4821","n4822","n4817"],"tags":{"landuse":"recreation_ground"}},"w825":{"id":"w825","nodes":["n4563","n4823","n4824","n4829","n4825","n4826","n4827","n4828","n4562","n4563"],"tags":{"landuse":"recreation_ground"}},"w826":{"id":"w826","nodes":["n4830","n4831","n4832","n4833","n4834","n4835","n4836","n4830"],"tags":{"landuse":"industrial"}},"w827":{"id":"w827","nodes":["n4563","n4837","n4838","n4839","n4840","n4841","n4842","n4827","n4828","n4562","n4563"],"tags":{"landuse":"industrial"}},"w828":{"id":"w828","nodes":["n4843","n4844","n4845","n4846","n4843"],"tags":{"landuse":"farmland"}},"w829":{"id":"w829","nodes":["n3712","n4847","n4848","n4849","n4850","n4851","n4852","n4858","n4864","n4959","n4960","n4853","n4857","n4854","n4855","n4856","n3712"],"tags":{"aeroway":"aerodrome","name":"Three Rivers Municipal Airport"}},"w83":{"id":"w83","nodes":["n371","n372","n373","n374","n371"],"tags":{"building":"yes"}},"w830":{"id":"w830","nodes":["n4855","n4854","n4857","n4853","n4960"],"tags":{"barrier":"fence"}},"w831":{"id":"w831","nodes":["n4860","n4859","n4858","n4852","n4851"],"tags":{"barrier":"fence"}},"w832":{"id":"w832","nodes":["n4866","n4878","n4869","n4867"],"tags":{"aeroway":"runway","ref":"5/23"}},"w833":{"id":"w833","nodes":["n4868","n4890","n4894","n4881","n4869","n4905","n4870"],"tags":{"aeroway":"runway","ref":"9/27"}},"w834":{"id":"w834","nodes":["n4871","n4875","n4872","n4895","n4873","n4874","n4871"],"tags":{"aeroway":"apron"}},"w835":{"id":"w835","nodes":["n4875","n4876","n4877","n4878","n4879","n4880","n4882","n4881"],"tags":{"aeroway":"taxiway"}},"w836":{"id":"w836","nodes":["n4882","n4893","n4883","n4891","n4884","n4885","n4886","n4887","n4888","n4892","n4889","n4890"],"tags":{"aeroway":"taxiway"}},"w837":{"id":"w837","nodes":["n4893","n4894"],"tags":{"aeroway":"taxiway"}},"w838":{"id":"w838","nodes":["n4895","n4896","n4897","n4898","n4899","n4900","n4901","n4902","n4903","n4906","n4904","n4905"],"tags":{"aeroway":"taxiway"}},"w839":{"id":"w839","nodes":["n4907","n4908"],"tags":{"highway":"service"}},"w84":{"id":"w84","nodes":["n374","n375","n376","n377","n373","n374"],"tags":{"building":"yes"}},"w840":{"id":"w840","nodes":["n4909","n4907","n4910"],"tags":{"highway":"service"}},"w841":{"id":"w841","nodes":["n4911","n4912","n4913","n4914","n4911"],"tags":{"building":"yes"}},"w842":{"id":"w842","nodes":["n4915","n4916","n4917","n4918","n4915"],"tags":{"aeroway":"hangar","building":"yes"}},"w843":{"id":"w843","nodes":["n4919","n4920","n4921","n4922","n4919"],"tags":{"building":"yes"}},"w844":{"id":"w844","nodes":["n4923","n4924","n4925","n4926","n4923"],"tags":{"aeroway":"hangar","building":"yes"}},"w845":{"id":"w845","nodes":["n4927","n4928","n4929","n4930","n4927"],"tags":{"aeroway":"hangar","building":"yes"}},"w846":{"id":"w846","nodes":["n4931","n4932","n4933","n4934","n4931"],"tags":{"aeroway":"hangar","building":"yes"}},"w847":{"id":"w847","nodes":["n4935","n4936","n4937","n4938","n4935"],"tags":{"aeroway":"hangar","building":"yes"}},"w848":{"id":"w848","nodes":["n4939","n4940","n4941","n4942","n4939"],"tags":{"aeroway":"hangar","building":"yes"}},"w849":{"id":"w849","nodes":["n4943","n4944","n4945","n4946","n4943"],"tags":{"aeroway":"hangar","building":"yes"}},"w85":{"id":"w85","nodes":["n431","n432","n1038","n433","n434","n1040","n431"],"tags":{"building":"yes"}},"w850":{"id":"w850","nodes":["n4947","n4948","n4949","n4950","n4947"],"tags":{"aeroway":"hangar","building":"yes"}},"w851":{"id":"w851","nodes":["n4951","n4952","n4953","n4954","n4951"],"tags":{"aeroway":"hangar","building":"yes"}},"w852":{"id":"w852","nodes":["n4955","n4956","n4957","n4958","n4955"],"tags":{"aeroway":"hangar","building":"yes"}},"w853":{"id":"w853","nodes":["n4959","n4864","n4861","n4862","n4863"],"tags":{"barrier":"fence"}},"w854":{"id":"w854","nodes":["n4961","n4962","n4963","n4964","n4965","n4966","n4967","n4968","n4969","n4961"],"tags":{"landuse":"farmland"}},"w855":{"id":"w855","nodes":["n4970","n4971","n4972","n4973","n4974","n4975","n4976","n4977","n4978","n4980","n4970"],"tags":{"landuse":"farmland"}},"w856":{"id":"w856","nodes":["n4979","n4980","n4978","n4981","n4982","n4983","n4984","n4985","n4979"],"tags":{"natural":"scrub"}},"w857":{"id":"w857","nodes":["n4986","n4987","n4988","n5032","n4989","n4990","n4991","n4992","n4993","n4994","n4995","n4996","n4997","n4998","n4999","n5000","n5001","n5002","n5022","n5023","n5024","n5025","n5030","n5031","n5029","n5028","n5027","n5026","n4986"],"tags":{"landuse":"farmland"}},"w858":{"id":"w858","nodes":["n5001","n5003","n5004","n4999","n5000","n5001"],"tags":{"natural":"scrub"}},"w859":{"id":"w859","nodes":["n5005","n5006","n5007","n5008","n5009","n5010","n5021","n5020","n5019","n5011","n5012","n5013","n5018","n5014","n5015","n5017","n5016","n5005"],"tags":{"landuse":"farmland"}},"w86":{"id":"w86","nodes":["n384","n385","n386","n387","n384"],"tags":{"building":"yes"}},"w860":{"id":"w860","nodes":["n3020","n5033","n5034","n5035","n3179","n3180","n3191","n3181","n3190","n3182","n3183","n3184","n3185","n3186","n3187","n3188","n3189","n3160","n3161","n3162","n2126","n2153","n2288","n3020"],"tags":{"landuse":"industrial"}},"w87":{"id":"w87","nodes":["n387","n388","n389","n386","n387"],"tags":{"building":"yes"}},"w88":{"id":"w88","nodes":["n390","n391","n392","n393","n390"],"tags":{"building":"yes"}},"w89":{"id":"w89","nodes":["n394","n2895"],"tags":{"highway":"service"}},"w9":{"id":"w9","nodes":["n50","n51","n148","n52","n57","n891","n53","n50"],"tags":{"building":"yes"}},"w90":{"id":"w90","nodes":["n398","n399","n400","n401","n402","n403","n404","n405","n406","n407","n408","n409","n410","n411","n412","n413","n414","n415","n416","n417","n398"],"tags":{"building":"yes"}},"w91":{"id":"w91","nodes":["n418","n423","n419"],"tags":{"highway":"service"}},"w92":{"id":"w92","nodes":["n420","n421","n422","n423","n420"],"tags":{"amenity":"parking"}},"w93":{"id":"w93","nodes":["n2282","n1876"],"tags":{"name":"Rocky River","tunnel":"building_passage","waterway":"river"}},"w94":{"id":"w94","nodes":["n1876","n885","n1875","n2234"],"tags":{"name":"Rocky River","waterway":"river"}},"w95":{"id":"w95","nodes":["n425","n426","n427","n914","n428","n913","n425"],"tags":{"building":"yes"}},"w96":{"id":"w96","nodes":["n456","n620","n1034","n1035","n456"],"tags":{"building":"yes"}},"w97":{"id":"w97","nodes":["n435","n912","n451","n321"],"tags":{"highway":"footway"}},"w98":{"id":"w98","nodes":["n436","n319","n437","n438","n439","n440","n441","n476","n442"],"tags":{"highway":"service"}},"w99":{"id":"w99","nodes":["n443","n444","n445","n446","n447","n448","n449","n450","n443"],"tags":{"amenity":"parking"}},"n2934":{"id":"n2934","loc":[-85.617051,41.952263]},"n2935":{"id":"n2935","loc":[-85.61699,41.952276]},"n2937":{"id":"n2937","loc":[-85.616847,41.952262]},"n2938":{"id":"n2938","loc":[-85.616577,41.951956]},"n2939":{"id":"n2939","loc":[-85.61656,41.952044]},"n3348":{"id":"n3348","loc":[-85.61714,41.9522]},"n3349":{"id":"n3349","loc":[-85.616517,41.95212]},"n3350":{"id":"n3350","loc":[-85.616489,41.952033]},"n3351":{"id":"n3351","loc":[-85.616529,41.951907]},"n3354":{"id":"n3354","loc":[-85.616488,41.951994]}};
49374
49375 // Tooltips and svg mask used to highlight certain features
49376 function uiCurtain() {
49377
49378     var surface = d3_select(null),
49379         tooltip = d3_select(null),
49380         darkness = d3_select(null);
49381
49382     function curtain(selection$$1) {
49383         surface = selection$$1
49384             .append('svg')
49385             .attr('id', 'curtain')
49386             .style('z-index', 1000)
49387             .style('pointer-events', 'none')
49388             .style('position', 'absolute')
49389             .style('top', 0)
49390             .style('left', 0);
49391
49392         darkness = surface.append('path')
49393             .attr('x', 0)
49394             .attr('y', 0)
49395             .attr('class', 'curtain-darkness');
49396
49397         d3_select(window).on('resize.curtain', resize);
49398
49399         tooltip = selection$$1.append('div')
49400             .attr('class', 'tooltip')
49401             .style('z-index', 1002);
49402
49403         tooltip
49404             .append('div')
49405             .attr('class', 'tooltip-arrow');
49406
49407         tooltip
49408             .append('div')
49409             .attr('class', 'tooltip-inner');
49410
49411         resize();
49412
49413
49414         function resize() {
49415             surface
49416                 .attr('width', window.innerWidth)
49417                 .attr('height', window.innerHeight);
49418             curtain.cut(darkness.datum());
49419         }
49420     }
49421
49422
49423     /**
49424      * Reveal cuts the curtain to highlight the given box,
49425      * and shows a tooltip with instructions next to the box.
49426      *
49427      * @param  {String|ClientRect} [box]   box used to cut the curtain
49428      * @param  {String}    [text]          text for a tooltip
49429      * @param  {Object}    [options]
49430      * @param  {string}    [options.tooltipClass]    optional class to add to the tooltip
49431      * @param  {integer}   [options.duration]        transition time in milliseconds
49432      * @param  {string}    [options.buttonText]      if set, create a button with this text label
49433      * @param  {function}  [options.buttonCallback]  if set, the callback for the button
49434      * @param  {String|ClientRect} [options.tooltipBox]  box for tooltip position, if different from box for the curtain
49435      */
49436     curtain.reveal = function(box, text, options) {
49437         if (typeof box === 'string') {
49438             box = d3_select(box).node();
49439         }
49440         if (box && box.getBoundingClientRect) {
49441             box = copyBox(box.getBoundingClientRect());
49442         }
49443
49444         options = options || {};
49445
49446         var tooltipBox;
49447         if (options.tooltipBox) {
49448             tooltipBox = options.tooltipBox;
49449             if (typeof tooltipBox === 'string') {
49450                 tooltipBox = d3_select(tooltipBox).node();
49451             }
49452             if (tooltipBox && tooltipBox.getBoundingClientRect) {
49453                 tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
49454             }
49455         } else {
49456             tooltipBox = box;
49457         }
49458
49459         if (tooltipBox && text) {
49460             // pseudo markdown bold text for the instruction section..
49461             var parts = text.split('**');
49462             var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
49463             if (parts[1]) {
49464                 html += '<span class="instruction">' + parts[1] + '</span>';
49465             }
49466
49467             html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');   // emphasis
49468             html = html.replace(/\{br\}/g, '<br/><br/>');       // linebreak
49469
49470             if (options.buttonText && options.buttonCallback) {
49471                 html += '<div class="button-section">' +
49472                     '<button href="#" class="button action col8">' + options.buttonText + '</button></div>';
49473             }
49474
49475             var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
49476             tooltip
49477                 .classed(classes, true)
49478                 .selectAll('.tooltip-inner')
49479                 .html(html);
49480
49481             if (options.buttonText && options.buttonCallback) {
49482                 var button = tooltip.selectAll('.button-section .button.action');
49483                 button
49484                     .on('click', function() {
49485                         event.preventDefault();
49486                         options.buttonCallback();
49487                     });
49488             }
49489
49490             var tip = copyBox(tooltip.node().getBoundingClientRect()),
49491                 w = window.innerWidth,
49492                 h = window.innerHeight,
49493                 tooltipWidth = 200,
49494                 tooltipArrow = 5,
49495                 side, pos;
49496
49497
49498             // hack: this will have bottom placement,
49499             // so need to reserve extra space for the tooltip illustration.
49500             if (options.tooltipClass === 'intro-mouse') {
49501                 tip.height += 80;
49502             }
49503
49504             // trim box dimensions to just the portion that fits in the window..
49505             if (tooltipBox.top + tooltipBox.height > h) {
49506                 tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
49507             }
49508             if (tooltipBox.left + tooltipBox.width > w) {
49509                 tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
49510             }
49511
49512             // determine tooltip placement..
49513
49514             if (tooltipBox.top + tooltipBox.height < 100) {
49515                 // tooltip below box..
49516                 side = 'bottom';
49517                 pos = [
49518                     tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
49519                     tooltipBox.top + tooltipBox.height
49520                 ];
49521
49522             } else if (tooltipBox.top > h - 140) {
49523                 // tooltip above box..
49524                 side = 'top';
49525                 pos = [
49526                     tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
49527                     tooltipBox.top - tip.height
49528                 ];
49529
49530             } else {
49531                 // tooltip to the side of the tooltipBox..
49532                 var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
49533
49534                 if (textDirection === 'rtl') {
49535                     if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
49536                         side = 'right';
49537                         pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
49538
49539                     } else {
49540                         side = 'left';
49541                         pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
49542                     }
49543
49544                 } else {
49545                     if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
49546                         side = 'left';
49547                         pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
49548                     }
49549                     else {
49550                         side = 'right';
49551                         pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
49552                     }
49553                 }
49554             }
49555
49556             if (options.duration !== 0 || !tooltip.classed(side)) {
49557                 tooltip.call(uiToggle(true));
49558             }
49559
49560             tooltip
49561                 .style('top', pos[1] + 'px')
49562                 .style('left', pos[0] + 'px')
49563                 .attr('class', classes + ' ' + side);
49564
49565
49566             // shift tooltip-inner if it is very close to the top or bottom edge
49567             // (doesn't affect the placement of the tooltip-arrow)
49568             var shiftY = 0;
49569             if (side === 'left' || side === 'right') {
49570                 if (pos[1] < 60) {
49571                     shiftY = 60 - pos[1];
49572                 }
49573                 else if (pos[1] + tip.height > h - 100) {
49574                     shiftY = h - pos[1] - tip.height - 100;
49575                 }
49576             }
49577             tooltip.selectAll('.tooltip-inner')
49578                 .style('top', shiftY + 'px');
49579
49580         } else {
49581             tooltip
49582                 .classed('in', false)
49583                 .call(uiToggle(false));
49584         }
49585
49586         curtain.cut(box, options.duration);
49587
49588         return tooltip;
49589     };
49590
49591
49592     curtain.cut = function(datum, duration) {
49593         darkness.datum(datum)
49594             .interrupt();
49595
49596         var selection$$1;
49597         if (duration === 0) {
49598             selection$$1 = darkness;
49599         } else {
49600             selection$$1 = darkness
49601                 .transition()
49602                 .duration(duration || 600)
49603                 .ease(linear$1);
49604         }
49605
49606         selection$$1
49607             .attr('d', function(d) {
49608                 var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
49609                     window.innerWidth + ',' + window.innerHeight + 'L' +
49610                     window.innerWidth + ',0 Z';
49611
49612                 if (!d) return string;
49613                 return string + 'M' +
49614                     d.left + ',' + d.top + 'L' +
49615                     d.left + ',' + (d.top + d.height) + 'L' +
49616                     (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
49617                     (d.left + d.width) + ',' + (d.top) + 'Z';
49618
49619             });
49620     };
49621
49622
49623     curtain.remove = function() {
49624         surface.remove();
49625         tooltip.remove();
49626         d3_select(window).on('resize.curtain', null);
49627     };
49628
49629
49630     // ClientRects are immutable, so copy them to an object,
49631     // in case we need to trim the height/width.
49632     function copyBox(src) {
49633         return {
49634             top: src.top,
49635             right: src.right,
49636             bottom: src.bottom,
49637             left: src.left,
49638             width: src.width,
49639             height: src.height
49640         };
49641     }
49642
49643
49644     return curtain;
49645 }
49646
49647 function uiIntroWelcome(context, reveal) {
49648     var dispatch$$1 = dispatch('done'),
49649         listener = clickListener();
49650
49651     var chapter = {
49652         title: 'intro.welcome.title'
49653     };
49654
49655
49656     function welcome() {
49657         context.map().centerZoom([-85.63591, 41.94285], 19);
49658         reveal('.intro-nav-wrap .chapter-welcome',
49659             t('intro.welcome.welcome'),
49660             { buttonText: t('intro.ok'), buttonCallback: practice }
49661         );
49662     }
49663
49664     function practice() {
49665         reveal('.intro-nav-wrap .chapter-welcome',
49666             t('intro.welcome.practice'),
49667             { buttonText: t('intro.ok'), buttonCallback: words }
49668         );
49669     }
49670
49671     function words() {
49672         reveal('.intro-nav-wrap .chapter-welcome',
49673             t('intro.welcome.words'),
49674             { buttonText: t('intro.ok'), buttonCallback: mouse }
49675         );
49676     }
49677
49678
49679     function mouse() {
49680         reveal('.intro-nav-wrap .chapter-welcome',
49681             t('intro.welcome.mouse'),
49682             { buttonText: t('intro.ok'), buttonCallback: leftClick }
49683         );
49684     }
49685
49686
49687     function leftClick() {
49688         var counter = 0,
49689             times = 5;
49690
49691         var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
49692             t('intro.welcome.leftclick', { num: times }),
49693             { tooltipClass: 'intro-mouse' }
49694         );
49695
49696         tooltip.selectAll('.tooltip-inner')
49697             .insert('svg', 'span')
49698             .attr('class', 'tooltip-illustration')
49699             .append('use')
49700             .attr('xlink:href', '#walkthrough-mouse');
49701
49702         tooltip
49703             .append('div')
49704             .attr('class', 'counter');
49705
49706         tooltip.call(listener);
49707
49708         listener.on('click', function(which) {
49709             if (which === 'left') {
49710                 d3_select('.curtain-tooltip.intro-mouse .counter')
49711                     .text(String(++counter));
49712
49713                 if (counter === times) {
49714                     window.setTimeout(function() { continueTo(rightClick); }, 1000);
49715                 }
49716             }
49717         });
49718
49719         function continueTo(nextStep) {
49720             listener.on('click', null);
49721             tooltip.call(listener.off);
49722             tooltip.select('.counter').remove();
49723             nextStep();
49724         }
49725     }
49726
49727
49728     function rightClick() {
49729         var counter = 0,
49730             times = 5;
49731
49732         var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
49733             t('intro.welcome.rightclick', { num: times }),
49734             { tooltipClass: 'intro-mouse' }
49735         );
49736
49737         tooltip.selectAll('.tooltip-inner')
49738             .insert('svg', 'span')
49739             .attr('class', 'tooltip-illustration')
49740             .append('use')
49741             .attr('xlink:href', '#walkthrough-mouse');
49742
49743         tooltip
49744             .append('div')
49745             .attr('class', 'counter');
49746
49747         tooltip.call(listener);
49748
49749         listener.on('click', function(which) {
49750             if (which === 'right') {
49751                 d3_select('.curtain-tooltip.intro-mouse .counter')
49752                     .text(String(++counter));
49753
49754                 if (counter === times) {
49755                     window.setTimeout(function() { continueTo(chapters); }, 1000);
49756                 }
49757             }
49758         });
49759
49760         function continueTo(nextStep) {
49761             listener.on('click', null);
49762             tooltip.call(listener.off);
49763             tooltip.select('.counter').remove();
49764             nextStep();
49765         }
49766     }
49767
49768
49769     function chapters() {
49770         dispatch$$1.call('done');
49771         reveal('.intro-nav-wrap .chapter-navigation',
49772             t('intro.welcome.chapters', { next: t('intro.navigation.title') })
49773         );
49774     }
49775
49776
49777     chapter.enter = function() {
49778         welcome();
49779     };
49780
49781
49782     chapter.exit = function() {
49783         listener.off();
49784         d3_select('.curtain-tooltip.intro-mouse')
49785             .selectAll('.counter')
49786             .remove();
49787     };
49788
49789
49790     chapter.restart = function() {
49791         chapter.exit();
49792         chapter.enter();
49793     };
49794
49795
49796     return utilRebind(chapter, dispatch$$1, 'on');
49797 }
49798
49799
49800
49801 function clickListener() {
49802     var dispatch$$1 = dispatch('click'),
49803         minTime = 120,
49804         tooltip = d3_select(null),
49805         down = {};
49806
49807     // `down` keeps track of which buttons/keys are down.
49808     // Setting a property in `down` happens immediately.
49809     // Unsetting a property in `down` is delayed because
49810     //   on Windows a contextmenu event happens after keyup/mouseup
49811
49812     function keydown() {
49813         if (event.keyCode === 93)  {   // context menu
49814             event.preventDefault();
49815             event.stopPropagation();
49816             down.menu = event.timeStamp;
49817             tooltip.classed('rightclick', true);
49818         }
49819     }
49820
49821
49822     function keyup() {
49823         if (event.keyCode === 93)  {   // context menu
49824             event.preventDefault();
49825             event.stopPropagation();
49826             var endTime = event.timeStamp,
49827                 startTime = down.menu || endTime,
49828                 delay = (endTime - startTime < minTime) ? minTime : 0;
49829
49830             window.setTimeout(function() {
49831                 tooltip.classed('rightclick', false);
49832                 down.menu = undefined;  // delayed, for Windows
49833             }, delay);
49834
49835             dispatch$$1.call('click', this, 'right');
49836         }
49837     }
49838
49839
49840     function mousedown() {
49841         var button = event.button;
49842         if (button === 0 && !event.ctrlKey) {
49843             tooltip.classed('leftclick', true);
49844         } else if (button === 2) {
49845             tooltip.classed('rightclick', true);
49846         }
49847         down[button] = event.timeStamp;
49848     }
49849
49850
49851     function mouseup() {
49852         var button = event.button,
49853             endTime = event.timeStamp,
49854             startTime = down[button] || endTime,
49855             delay = (endTime - startTime < minTime) ? minTime : 0;
49856
49857         if (button === 0 && !event.ctrlKey) {
49858             window.setTimeout(function() {
49859                 tooltip.classed('leftclick', false);
49860                 down[button] = undefined;  // delayed, for Windows
49861             }, delay);
49862
49863             dispatch$$1.call('click', this, 'left');
49864
49865         } else if (button === 2) {
49866             window.setTimeout(function() {
49867                 tooltip.classed('rightclick', false);
49868                 down[button] = undefined;  // delayed, for Windows
49869             }, delay);
49870
49871             dispatch$$1.call('click', this, 'right');
49872
49873         } else {
49874             window.setTimeout(function() {
49875                 down[button] = undefined;  // delayed, for Windows
49876             }, delay);
49877         }
49878     }
49879
49880
49881     function contextmenu() {
49882         event.preventDefault();
49883         event.stopPropagation();
49884         if (!down[2] && !down.menu) {
49885             tooltip.classed('rightclick', true);
49886             window.setTimeout(function() {
49887                 tooltip.classed('rightclick', false);
49888             }, minTime);
49889             dispatch$$1.call('click', this, 'right');
49890         }
49891     }
49892
49893
49894     var behavior = function(selection$$1) {
49895         tooltip = selection$$1;
49896         down = {};
49897
49898         d3_select(window)
49899             .on('keydown.intro', keydown)
49900             .on('keyup.intro', keyup)
49901             .on('mousedown.intro', mousedown)
49902             .on('mouseup.intro', mouseup)
49903             .on('contextmenu.intro', contextmenu);
49904     };
49905
49906
49907     behavior.off = function() {
49908         d3_select(window)
49909             .on('keydown.intro', null)
49910             .on('keyup.intro', null)
49911             .on('mousedown.intro', null)
49912             .on('mouseup.intro', null)
49913             .on('contextmenu.intro', null);
49914
49915         tooltip
49916             .classed('leftclick', false)
49917             .classed('rightclick', false);
49918     };
49919
49920     return utilRebind(behavior, dispatch$$1, 'on');
49921 }
49922
49923 function uiIntroNavigation(context, reveal) {
49924     var dispatch$$1 = dispatch('done'),
49925         timeouts = [],
49926         hallId = 'n2061',
49927         townHall = [-85.63591, 41.94285],
49928         springStreetId = 'w397',
49929         springStreetEndId = 'n1834',
49930         springStreet = [-85.63582, 41.94255],
49931         onewayField = context.presets().field('oneway'),
49932         maxspeedField = context.presets().field('maxspeed');
49933
49934
49935     var chapter = {
49936         title: 'intro.navigation.title'
49937     };
49938
49939
49940     function timeout(f, t$$1) {
49941         timeouts.push(window.setTimeout(f, t$$1));
49942     }
49943
49944
49945     function eventCancel() {
49946         event.stopPropagation();
49947         event.preventDefault();
49948     }
49949
49950
49951     function isTownHallSelected() {
49952         var ids = context.selectedIDs();
49953         return ids.length === 1 && ids[0] === hallId;
49954     }
49955
49956
49957     function dragMap() {
49958         context.enter(modeBrowse(context));
49959         context.history().reset('initial');
49960
49961         var msec = transitionTime(townHall, context.map().center());
49962         if (msec) { reveal(null, null, { duration: 0 }); }
49963         context.map().zoom(19).centerEase(townHall, msec);
49964
49965         timeout(function() {
49966             var centerStart = context.map().center();
49967
49968             reveal('#surface', t('intro.navigation.drag'));
49969             context.map().on('drawn.intro', function() {
49970                 reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
49971             });
49972
49973             context.map().on('move.intro', function() {
49974                 var centerNow = context.map().center();
49975                 if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
49976                     context.map().on('move.intro', null);
49977                     timeout(function() { continueTo(zoomMap); }, 3000);
49978                 }
49979             });
49980
49981         }, msec + 100);
49982
49983         function continueTo(nextStep) {
49984             context.map().on('move.intro drawn.intro', null);
49985             nextStep();
49986         }
49987     }
49988
49989
49990     function zoomMap() {
49991         var zoomStart = context.map().zoom();
49992
49993         reveal('#surface',
49994             t('intro.navigation.zoom', {
49995                 plus: icon('#icon-plus', 'pre-text'),
49996                 minus: icon('#icon-minus', 'pre-text')
49997             })
49998         );
49999
50000         context.map().on('drawn.intro', function() {
50001             reveal('#surface',
50002                 t('intro.navigation.zoom', {
50003                     plus: icon('#icon-plus', 'pre-text'),
50004                     minus: icon('#icon-minus', 'pre-text')
50005                 }), { duration: 0 }
50006             );
50007         });
50008
50009         context.map().on('move.intro', function() {
50010             if (context.map().zoom() !== zoomStart) {
50011                 context.map().on('move.intro', null);
50012                 timeout(function() { continueTo(features); }, 3000);
50013             }
50014         });
50015
50016         function continueTo(nextStep) {
50017             context.map().on('move.intro drawn.intro', null);
50018             nextStep();
50019         }
50020     }
50021
50022
50023     function features() {
50024         var onClick = function() { continueTo(pointsLinesAreas); };
50025
50026         reveal('#surface', t('intro.navigation.features'),
50027             { buttonText: t('intro.ok'), buttonCallback: onClick }
50028         );
50029
50030         context.map().on('drawn.intro', function() {
50031             reveal('#surface', t('intro.navigation.features'),
50032                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50033             );
50034         });
50035
50036         function continueTo(nextStep) {
50037             context.map().on('drawn.intro', null);
50038             nextStep();
50039         }
50040     }
50041
50042     function pointsLinesAreas() {
50043         var onClick = function() { continueTo(nodesWays); };
50044
50045         reveal('#surface', t('intro.navigation.points_lines_areas'),
50046             { buttonText: t('intro.ok'), buttonCallback: onClick }
50047         );
50048
50049         context.map().on('drawn.intro', function() {
50050             reveal('#surface', t('intro.navigation.points_lines_areas'),
50051                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50052             );
50053         });
50054
50055         function continueTo(nextStep) {
50056             context.map().on('drawn.intro', null);
50057             nextStep();
50058         }
50059     }
50060
50061     function nodesWays() {
50062         var onClick = function() { continueTo(clickTownHall); };
50063
50064         reveal('#surface', t('intro.navigation.nodes_ways'),
50065             { buttonText: t('intro.ok'), buttonCallback: onClick }
50066         );
50067
50068         context.map().on('drawn.intro', function() {
50069             reveal('#surface', t('intro.navigation.nodes_ways'),
50070                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50071             );
50072         });
50073
50074         function continueTo(nextStep) {
50075             context.map().on('drawn.intro', null);
50076             nextStep();
50077         }
50078     }
50079
50080     function clickTownHall() {
50081         context.enter(modeBrowse(context));
50082         context.history().reset('initial');
50083
50084         reveal(null, null, { duration: 0 });
50085         context.map().zoomEase(19, 500);
50086
50087         timeout(function() {
50088             var entity = context.hasEntity(hallId);
50089             if (!entity) return;
50090             context.map().centerEase(entity.loc, 500);
50091
50092             timeout(function() {
50093                 var entity = context.hasEntity(hallId);
50094                 if (!entity) return;
50095                 var box = pointBox(entity.loc, context);
50096                 reveal(box, t('intro.navigation.click_townhall'));
50097
50098                 context.map().on('move.intro drawn.intro', function() {
50099                     var entity = context.hasEntity(hallId);
50100                     if (!entity) return;
50101                     var box = pointBox(entity.loc, context);
50102                     reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
50103                 });
50104
50105                 context.on('enter.intro', function() {
50106                     if (isTownHallSelected()) continueTo(selectedTownHall);
50107                 });
50108
50109             }, 550);  // after centerEase
50110
50111         }, 550); // after zoomEase
50112
50113         context.history().on('change.intro', function() {
50114             if (!context.hasEntity(hallId)) {
50115                 continueTo(clickTownHall);
50116             }
50117         });
50118
50119         function continueTo(nextStep) {
50120             context.on('enter.intro', null);
50121             context.map().on('move.intro drawn.intro', null);
50122             context.history().on('change.intro', null);
50123             nextStep();
50124         }
50125     }
50126
50127
50128     function selectedTownHall() {
50129         if (!isTownHallSelected()) return clickTownHall();
50130
50131         var entity = context.hasEntity(hallId);
50132         if (!entity) return clickTownHall();
50133
50134         var box = pointBox(entity.loc, context);
50135         var onClick = function() { continueTo(editorTownHall); };
50136
50137         reveal(box, t('intro.navigation.selected_townhall'),
50138             { buttonText: t('intro.ok'), buttonCallback: onClick }
50139         );
50140
50141         context.map().on('move.intro drawn.intro', function() {
50142             var entity = context.hasEntity(hallId);
50143             if (!entity) return;
50144             var box = pointBox(entity.loc, context);
50145             reveal(box, t('intro.navigation.selected_townhall'),
50146                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50147             );
50148         });
50149
50150         context.history().on('change.intro', function() {
50151             if (!context.hasEntity(hallId)) {
50152                 continueTo(clickTownHall);
50153             }
50154         });
50155
50156         function continueTo(nextStep) {
50157             context.map().on('move.intro drawn.intro', null);
50158             context.history().on('change.intro', null);
50159             nextStep();
50160         }
50161     }
50162
50163
50164     function editorTownHall() {
50165         if (!isTownHallSelected()) return clickTownHall();
50166
50167         // disallow scrolling
50168         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50169
50170         var onClick = function() { continueTo(presetTownHall); };
50171
50172         reveal('.entity-editor-pane',
50173             t('intro.navigation.editor_townhall'),
50174             { buttonText: t('intro.ok'), buttonCallback: onClick }
50175         );
50176
50177         context.on('exit.intro', function() {
50178             continueTo(clickTownHall);
50179         });
50180
50181         context.history().on('change.intro', function() {
50182             if (!context.hasEntity(hallId)) {
50183                 continueTo(clickTownHall);
50184             }
50185         });
50186
50187         function continueTo(nextStep) {
50188             context.on('exit.intro', null);
50189             context.history().on('change.intro', null);
50190             d3_select('.inspector-wrap').on('wheel.intro', null);
50191             nextStep();
50192         }
50193     }
50194
50195
50196     function presetTownHall() {
50197         if (!isTownHallSelected()) return clickTownHall();
50198
50199         // reset pane, in case user happened to change it..
50200         d3_select('.inspector-wrap .panewrap').style('right', '0%');
50201         // disallow scrolling
50202         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50203
50204         // preset match, in case the user happened to change it.
50205         var entity = context.entity(context.selectedIDs()[0]);
50206         var preset = context.presets().match(entity, context.graph());
50207
50208         var onClick = function() { continueTo(fieldsTownHall); };
50209
50210         context.on('exit.intro', function() {
50211             continueTo(clickTownHall);
50212         });
50213
50214         context.history().on('change.intro', function() {
50215             if (!context.hasEntity(hallId)) {
50216                 continueTo(clickTownHall);
50217             }
50218         });
50219
50220         reveal('.inspector-body .preset-list-item.inspector-inner',
50221             t('intro.navigation.preset_townhall', { preset: preset.name() }),
50222             { buttonText: t('intro.ok'), buttonCallback: onClick }
50223         );
50224
50225         function continueTo(nextStep) {
50226             context.on('exit.intro', null);
50227             context.history().on('change.intro', null);
50228             d3_select('.inspector-wrap').on('wheel.intro', null);
50229             nextStep();
50230         }
50231     }
50232
50233
50234     function fieldsTownHall() {
50235         if (!isTownHallSelected()) return clickTownHall();
50236
50237         // reset pane, in case user happened to change it..
50238         d3_select('.inspector-wrap .panewrap').style('right', '0%');
50239         // disallow scrolling
50240         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50241
50242         var onClick = function() { continueTo(closeTownHall); };
50243
50244         reveal('.inspector-body .preset-editor',
50245             t('intro.navigation.fields_townhall'),
50246             { buttonText: t('intro.ok'), buttonCallback: onClick }
50247         );
50248
50249         context.on('exit.intro', function() {
50250             continueTo(clickTownHall);
50251         });
50252
50253         context.history().on('change.intro', function() {
50254             if (!context.hasEntity(hallId)) {
50255                 continueTo(clickTownHall);
50256             }
50257         });
50258
50259         function continueTo(nextStep) {
50260             context.on('exit.intro', null);
50261             context.history().on('change.intro', null);
50262             d3_select('.inspector-wrap').on('wheel.intro', null);
50263             nextStep();
50264         }
50265     }
50266
50267
50268     function closeTownHall() {
50269         if (!isTownHallSelected()) return clickTownHall();
50270
50271         var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50272         var href = d3_select(selector$$1).attr('href') || '#icon-close';
50273
50274         reveal('.entity-editor-pane',
50275             t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
50276         );
50277
50278         context.on('exit.intro', function() {
50279             continueTo(searchStreet);
50280         });
50281
50282         context.history().on('change.intro', function() {
50283             // update the close icon in the tooltip if the user edits something.
50284             var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50285             var href = d3_select(selector$$1).attr('href') || '#icon-close';
50286
50287             reveal('.entity-editor-pane',
50288                 t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
50289                 { duration: 0 }
50290             );
50291         });
50292
50293         function continueTo(nextStep) {
50294             context.on('exit.intro', null);
50295             context.history().on('change.intro', null);
50296             nextStep();
50297         }
50298     }
50299
50300
50301     function searchStreet() {
50302         context.enter(modeBrowse(context));
50303         context.history().reset('initial');  // ensure spring street exists
50304
50305         var msec = transitionTime(springStreet, context.map().center());
50306         if (msec) { reveal(null, null, { duration: 0 }); }
50307         context.map().zoom(19).centerEase(springStreet, msec);  // ..and user can see it
50308
50309         timeout(function() {
50310             reveal('.search-header input',
50311                 t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
50312             );
50313
50314             d3_select('.search-header input')
50315                 .on('keyup.intro', checkSearchResult);
50316         }, msec + 100);
50317     }
50318
50319
50320     function checkSearchResult() {
50321         var first = d3_select('.feature-list-item:nth-child(0n+2)'),  // skip "No Results" item
50322             firstName = first.select('.entity-name'),
50323             name = t('intro.graph.name.spring-street');
50324
50325         if (!firstName.empty() && firstName.text() === name) {
50326             reveal(first.node(),
50327                 t('intro.navigation.choose_street', { name: name }),
50328                 { duration: 300 }
50329             );
50330
50331             context.on('exit.intro', function() {
50332                 continueTo(selectedStreet);
50333             });
50334
50335             d3_select('.search-header input')
50336                 .on('keydown.intro', eventCancel, true)
50337                 .on('keyup.intro', null);
50338         }
50339
50340         function continueTo(nextStep) {
50341             context.on('exit.intro', null);
50342             d3_select('.search-header input')
50343                 .on('keydown.intro', null)
50344                 .on('keyup.intro', null);
50345             nextStep();
50346         }
50347     }
50348
50349
50350     function selectedStreet() {
50351         if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
50352             return searchStreet();
50353         }
50354
50355         var onClick = function() { continueTo(editorStreet); };
50356         var entity = context.entity(springStreetEndId);
50357         var box = pointBox(entity.loc, context);
50358         box.height = 500;
50359
50360         reveal(box,
50361             t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
50362             { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
50363         );
50364
50365         timeout(function() {
50366             context.map().on('move.intro drawn.intro', function() {
50367                 var entity = context.hasEntity(springStreetEndId);
50368                 if (!entity) return;
50369                 var box = pointBox(entity.loc, context);
50370                 box.height = 500;
50371                 reveal(box,
50372                     t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
50373                     { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50374                 );
50375             });
50376         }, 600);  // after reveal.
50377
50378         context.on('enter.intro', function(mode) {
50379             if (!context.hasEntity(springStreetId)) {
50380                 return continueTo(searchStreet);
50381             }
50382             var ids = context.selectedIDs();
50383             if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
50384                 // keep Spring Street selected..
50385                 context.enter(modeSelect(context, [springStreetId]));
50386             }
50387         });
50388
50389         context.history().on('change.intro', function() {
50390             if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
50391                 timeout(function() {
50392                     continueTo(searchStreet);
50393                 }, 300);  // after any transition (e.g. if user deleted intersection)
50394             }
50395         });
50396
50397         function continueTo(nextStep) {
50398             context.map().on('move.intro drawn.intro', null);
50399             context.on('enter.intro', null);
50400             context.history().on('change.intro', null);
50401             nextStep();
50402         }
50403     }
50404
50405
50406     function editorStreet() {
50407         var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50408         var href = d3_select(selector$$1).attr('href') || '#icon-close';
50409
50410         reveal('.entity-editor-pane',
50411             t('intro.navigation.editor_street', {
50412                 button: icon(href, 'pre-text'),
50413                 field1: onewayField.label(),
50414                 field2: maxspeedField.label()
50415             })
50416         );
50417
50418         context.on('exit.intro', function() {
50419             continueTo(play);
50420         });
50421
50422         context.history().on('change.intro', function() {
50423             // update the close icon in the tooltip if the user edits something.
50424             var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50425             var href = d3_select(selector$$1).attr('href') || '#icon-close';
50426
50427             reveal('.entity-editor-pane',
50428                 t('intro.navigation.editor_street', {
50429                     button: icon(href, 'pre-text'),
50430                     field1: onewayField.label().toLowerCase(),
50431                     field2: maxspeedField.label().toLowerCase()
50432                 }), { duration: 0 }
50433             );
50434         });
50435
50436         function continueTo(nextStep) {
50437             context.on('exit.intro', null);
50438             context.history().on('change.intro', null);
50439             nextStep();
50440         }
50441     }
50442
50443
50444     function play() {
50445         dispatch$$1.call('done');
50446         reveal('#id-container',
50447             t('intro.navigation.play', { next: t('intro.points.title') }), {
50448                 tooltipBox: '.intro-nav-wrap .chapter-point',
50449                 buttonText: t('intro.ok'),
50450                 buttonCallback: function() { reveal('#id-container'); }
50451             }
50452         );
50453     }
50454
50455
50456     chapter.enter = function() {
50457         dragMap();
50458     };
50459
50460
50461     chapter.exit = function() {
50462         timeouts.forEach(window.clearTimeout);
50463         context.on('enter.intro exit.intro', null);
50464         context.map().on('move.intro drawn.intro', null);
50465         context.history().on('change.intro', null);
50466         d3_select('.inspector-wrap').on('wheel.intro', null);
50467         d3_select('.search-header input').on('keydown.intro keyup.intro', null);
50468     };
50469
50470
50471     chapter.restart = function() {
50472         chapter.exit();
50473         chapter.enter();
50474     };
50475
50476
50477     return utilRebind(chapter, dispatch$$1, 'on');
50478 }
50479
50480 function uiIntroPoint(context, reveal) {
50481     var dispatch$$1 = dispatch('done'),
50482         timeouts = [],
50483         intersection = [-85.63279, 41.94394],
50484         building = [-85.632422, 41.944045],
50485         cafePreset = context.presets().item('amenity/cafe'),
50486         pointId = null;
50487
50488
50489     var chapter = {
50490         title: 'intro.points.title'
50491     };
50492
50493
50494     function timeout(f, t$$1) {
50495         timeouts.push(window.setTimeout(f, t$$1));
50496     }
50497
50498
50499     function revealEditMenu(loc, text, options) {
50500         var rect = context.surfaceRect();
50501         var point$$1 = context.curtainProjection(loc);
50502         var pad = 40;
50503         var width = 250 + (2 * pad);
50504         var height = 250;
50505         var startX = rect.left + point$$1[0];
50506         var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
50507         var box = {
50508             left: left,
50509             top: point$$1[1] + rect.top - 60,
50510             width: width,
50511             height: height
50512         };
50513         reveal(box, text, options);
50514     }
50515
50516
50517     function eventCancel() {
50518         event.stopPropagation();
50519         event.preventDefault();
50520     }
50521
50522
50523     function addPoint() {
50524         context.enter(modeBrowse(context));
50525         context.history().reset('initial');
50526
50527         var msec = transitionTime(intersection, context.map().center());
50528         if (msec) { reveal(null, null, { duration: 0 }); }
50529         context.map().zoom(19).centerEase(intersection, msec);
50530
50531         timeout(function() {
50532             var tooltip = reveal('button.add-point',
50533                 t('intro.points.add_point', { button: icon('#icon-point', 'pre-text') }));
50534
50535             pointId = null;
50536
50537             tooltip.selectAll('.tooltip-inner')
50538                 .insert('svg', 'span')
50539                 .attr('class', 'tooltip-illustration')
50540                 .append('use')
50541                 .attr('xlink:href', '#poi-images');
50542
50543             context.on('enter.intro', function(mode) {
50544                 if (mode.id !== 'add-point') return;
50545                 continueTo(placePoint);
50546             });
50547         }, msec + 100);
50548
50549         function continueTo(nextStep) {
50550             context.on('enter.intro', null);
50551             nextStep();
50552         }
50553     }
50554
50555
50556     function placePoint() {
50557         if (context.mode().id !== 'add-point') {
50558             return chapter.restart();
50559         }
50560
50561         var pointBox$$1 = pad$1(building, 150, context);
50562         reveal(pointBox$$1, t('intro.points.place_point'));
50563
50564         context.map().on('move.intro drawn.intro', function() {
50565             pointBox$$1 = pad$1(building, 150, context);
50566             reveal(pointBox$$1, t('intro.points.place_point'), { duration: 0 });
50567         });
50568
50569         context.on('enter.intro', function(mode) {
50570             if (mode.id !== 'select') return chapter.restart();
50571             pointId = context.mode().selectedIDs()[0];
50572             continueTo(searchPreset);
50573         });
50574
50575         function continueTo(nextStep) {
50576             context.map().on('move.intro drawn.intro', null);
50577             context.on('enter.intro', null);
50578             nextStep();
50579         }
50580     }
50581
50582
50583     function searchPreset() {
50584         if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
50585             return addPoint();
50586         }
50587
50588         // disallow scrolling
50589         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50590
50591         d3_select('.preset-search-input')
50592             .on('keydown.intro', null)
50593             .on('keyup.intro', checkPresetSearch);
50594
50595         reveal('.preset-search-input',
50596             t('intro.points.search_cafe', { preset: cafePreset.name() })
50597         );
50598
50599         context.on('enter.intro', function(mode) {
50600             if (!pointId || !context.hasEntity(pointId)) {
50601                 return continueTo(addPoint);
50602             }
50603
50604             var ids = context.selectedIDs();
50605             if (mode.id !== 'select' || !ids.length || ids[0] !== pointId) {
50606                 // keep the user's point selected..
50607                 context.enter(modeSelect(context, [pointId]));
50608
50609                 // disallow scrolling
50610                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50611
50612                 d3_select('.preset-search-input')
50613                     .on('keydown.intro', null)
50614                     .on('keyup.intro', checkPresetSearch);
50615
50616                 reveal('.preset-search-input',
50617                     t('intro.points.search_cafe', { preset: cafePreset.name() })
50618                 );
50619
50620                 context.history().on('change.intro', null);
50621             }
50622         });
50623
50624
50625         function checkPresetSearch() {
50626             var first = d3_select('.preset-list-item:first-child');
50627
50628             if (first.classed('preset-amenity-cafe')) {
50629                 d3_select('.preset-search-input')
50630                     .on('keydown.intro', eventCancel, true)
50631                     .on('keyup.intro', null);
50632
50633                 reveal(first.select('.preset-list-button').node(),
50634                     t('intro.points.choose_cafe', { preset: cafePreset.name() }),
50635                     { duration: 300 }
50636                 );
50637
50638                 context.history().on('change.intro', function() {
50639                     continueTo(aboutFeatureEditor);
50640                 });
50641             }
50642         }
50643
50644         function continueTo(nextStep) {
50645             context.on('enter.intro', null);
50646             context.history().on('change.intro', null);
50647             d3_select('.inspector-wrap').on('wheel.intro', null);
50648             d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
50649             nextStep();
50650         }
50651     }
50652
50653
50654     function aboutFeatureEditor() {
50655         if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
50656             return addPoint();
50657         }
50658
50659         timeout(function() {
50660             reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
50661                 tooltipClass: 'intro-points-describe',
50662                 buttonText: t('intro.ok'),
50663                 buttonCallback: function() { continueTo(addName); }
50664             });
50665         }, 400);
50666
50667         context.on('exit.intro', function() {
50668             // if user leaves select mode here, just continue with the tutorial.
50669             continueTo(reselectPoint);
50670         });
50671
50672         function continueTo(nextStep) {
50673             context.on('exit.intro', null);
50674             nextStep();
50675         }
50676     }
50677
50678
50679     function addName() {
50680         if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
50681             return addPoint();
50682         }
50683
50684         // reset pane, in case user happened to change it..
50685         d3_select('.inspector-wrap .panewrap').style('right', '0%');
50686
50687         timeout(function() {
50688             // It's possible for the user to add a name in a previous step..
50689             // If so, don't tell them to add the name in this step.
50690             // Give them an OK button instead.
50691             var entity = context.entity(pointId);
50692             if (entity.tags.name) {
50693                 var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
50694                     tooltipClass: 'intro-points-describe',
50695                     buttonText: t('intro.ok'),
50696                     buttonCallback: function() { continueTo(addCloseEditor); }
50697                 });
50698                 tooltip.select('.instruction').style('display', 'none');
50699
50700             } else {
50701                 reveal('.entity-editor-pane', t('intro.points.add_name'),
50702                     { tooltipClass: 'intro-points-describe' }
50703                 );
50704             }
50705         }, 400);
50706
50707         context.history().on('change.intro', function() {
50708             continueTo(addCloseEditor);
50709         });
50710
50711         context.on('exit.intro', function() {
50712             // if user leaves select mode here, just continue with the tutorial.
50713             continueTo(reselectPoint);
50714         });
50715
50716         function continueTo(nextStep) {
50717             context.on('exit.intro', null);
50718             context.history().on('change.intro', null);
50719             nextStep();
50720         }
50721     }
50722
50723
50724     function addCloseEditor() {
50725         // reset pane, in case user happened to change it..
50726         d3_select('.inspector-wrap .panewrap').style('right', '0%');
50727
50728         var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50729         var href = d3_select(selector$$1).attr('href') || '#icon-close';
50730
50731         context.on('exit.intro', function() {
50732             continueTo(reselectPoint);
50733         });
50734
50735         reveal('.entity-editor-pane',
50736             t('intro.points.add_close', { button: icon(href, 'pre-text') })
50737         );
50738
50739         function continueTo(nextStep) {
50740             context.on('exit.intro', null);
50741             nextStep();
50742         }
50743     }
50744
50745
50746     function reselectPoint() {
50747         if (!pointId) return chapter.restart();
50748         var entity = context.hasEntity(pointId);
50749         if (!entity) return chapter.restart();
50750
50751         // make sure it's still a cafe, in case user somehow changed it..
50752         var oldPreset = context.presets().match(entity, context.graph());
50753         context.replace(actionChangePreset(pointId, oldPreset, cafePreset));
50754
50755         context.enter(modeBrowse(context));
50756
50757         var msec = transitionTime(entity.loc, context.map().center());
50758         if (msec) { reveal(null, null, { duration: 0 }); }
50759         context.map().centerEase(entity.loc, msec);
50760
50761         timeout(function() {
50762             var box = pointBox(entity.loc, context);
50763             reveal(box, t('intro.points.reselect'), { duration: 600 });
50764
50765             timeout(function() {
50766                 context.map().on('move.intro drawn.intro', function() {
50767                     var entity = context.hasEntity(pointId);
50768                     if (!entity) return chapter.restart();
50769                     var box = pointBox(entity.loc, context);
50770                     reveal(box, t('intro.points.reselect'), { duration: 0 });
50771                 });
50772             }, 600); // after reveal..
50773
50774             context.on('enter.intro', function(mode) {
50775                 if (mode.id !== 'select') return;
50776                 continueTo(updatePoint);
50777             });
50778
50779         }, msec + 100);
50780
50781         function continueTo(nextStep) {
50782             context.map().on('move.intro drawn.intro', null);
50783             context.on('enter.intro', null);
50784             nextStep();
50785         }
50786     }
50787
50788
50789     function updatePoint() {
50790         if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
50791             return continueTo(reselectPoint);
50792         }
50793
50794         // reset pane, in case user happened to untag the point..
50795         d3_select('.inspector-wrap .panewrap').style('right', '0%');
50796
50797         context.on('exit.intro', function() {
50798             continueTo(reselectPoint);
50799         });
50800
50801         context.history().on('change.intro', function() {
50802             continueTo(updateCloseEditor);
50803         });
50804
50805         timeout(function() {
50806             reveal('.entity-editor-pane', t('intro.points.update'),
50807                 { tooltipClass: 'intro-points-describe' }
50808             );
50809         }, 400);
50810
50811         function continueTo(nextStep) {
50812             context.on('exit.intro', null);
50813             context.history().on('change.intro', null);
50814             nextStep();
50815         }
50816     }
50817
50818
50819     function updateCloseEditor() {
50820         if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
50821             return continueTo(reselectPoint);
50822         }
50823
50824         // reset pane, in case user happened to change it..
50825         d3_select('.inspector-wrap .panewrap').style('right', '0%');
50826
50827         context.on('exit.intro', function() {
50828             continueTo(rightClickPoint);
50829         });
50830
50831         timeout(function() {
50832             reveal('.entity-editor-pane',
50833                 t('intro.points.update_close', { button: icon('#icon-apply', 'pre-text') })
50834             );
50835         }, 500);
50836
50837         function continueTo(nextStep) {
50838             context.on('exit.intro', null);
50839             nextStep();
50840         }
50841     }
50842
50843
50844     function rightClickPoint() {
50845         if (!pointId) return chapter.restart();
50846         var entity = context.hasEntity(pointId);
50847         if (!entity) return chapter.restart();
50848
50849         context.enter(modeBrowse(context));
50850
50851         var box = pointBox(entity.loc, context);
50852         reveal(box, t('intro.points.rightclick'), { duration: 600 });
50853
50854         timeout(function() {
50855             context.map().on('move.intro drawn.intro', function() {
50856                 var entity = context.hasEntity(pointId);
50857                 if (!entity) return chapter.restart();
50858                 var box = pointBox(entity.loc, context);
50859                 reveal(box, t('intro.points.rightclick'), { duration: 0 });
50860             });
50861         }, 600); // after reveal
50862
50863         context.on('enter.intro', function(mode) {
50864             if (mode.id !== 'select') return;
50865             var ids = context.selectedIDs();
50866             if (ids.length !== 1 || ids[0] !== pointId) return;
50867
50868             timeout(function() {
50869                 var node = selectMenuItem('delete').node();
50870                 if (!node) return;
50871                 continueTo(enterDelete);
50872             }, 300);  // after menu visible
50873         });
50874
50875         function continueTo(nextStep) {
50876             context.on('enter.intro', null);
50877             context.map().on('move.intro drawn.intro', null);
50878             nextStep();
50879         }
50880     }
50881
50882
50883     function enterDelete() {
50884         if (!pointId) return chapter.restart();
50885         var entity = context.hasEntity(pointId);
50886         if (!entity) return chapter.restart();
50887
50888         var node = selectMenuItem('delete').node();
50889         if (!node) { return continueTo(rightClickPoint); }
50890
50891         revealEditMenu(entity.loc,
50892             t('intro.points.delete', { button: icon('#operation-delete', 'pre-text') })
50893         );
50894
50895         timeout(function() {
50896             context.map().on('move.intro drawn.intro', function() {
50897                 revealEditMenu(entity.loc,
50898                     t('intro.points.delete', { button: icon('#operation-delete', 'pre-text') }),
50899                     { duration: 0}
50900                 );
50901             });
50902         }, 300); // after menu visible
50903
50904         context.on('exit.intro', function() {
50905             if (!pointId) return chapter.restart();
50906             var entity = context.hasEntity(pointId);
50907             if (entity) return continueTo(rightClickPoint);  // point still exists
50908         });
50909
50910         context.history().on('change.intro', function(changed) {
50911             if (changed.deleted().length) {
50912                 continueTo(undo);
50913             }
50914         });
50915
50916         function continueTo(nextStep) {
50917             context.map().on('move.intro drawn.intro', null);
50918             context.history().on('change.intro', null);
50919             context.on('exit.intro', null);
50920             nextStep();
50921         }
50922     }
50923
50924
50925     function undo() {
50926         context.history().on('change.intro', function() {
50927             continueTo(play);
50928         });
50929
50930         var iconName = '#icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
50931         reveal('#bar button.undo-button',
50932             t('intro.points.undo', { button: icon(iconName, 'pre-text') })
50933         );
50934
50935         function continueTo(nextStep) {
50936             context.history().on('change.intro', null);
50937             nextStep();
50938         }
50939     }
50940
50941
50942     function play() {
50943         dispatch$$1.call('done');
50944         reveal('#id-container',
50945             t('intro.points.play', { next: t('intro.areas.title') }), {
50946                 tooltipBox: '.intro-nav-wrap .chapter-area',
50947                 buttonText: t('intro.ok'),
50948                 buttonCallback: function() { reveal('#id-container'); }
50949             }
50950         );
50951     }
50952
50953
50954     chapter.enter = function() {
50955         addPoint();
50956     };
50957
50958
50959     chapter.exit = function() {
50960         timeouts.forEach(window.clearTimeout);
50961         context.on('enter.intro exit.intro', null);
50962         context.map().on('move.intro drawn.intro', null);
50963         context.history().on('change.intro', null);
50964         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50965         d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
50966     };
50967
50968
50969     chapter.restart = function() {
50970         chapter.exit();
50971         chapter.enter();
50972     };
50973
50974
50975     return utilRebind(chapter, dispatch$$1, 'on');
50976 }
50977
50978 function uiIntroArea(context, reveal) {
50979     var dispatch$$1 = dispatch('done'),
50980         playground = [-85.63552, 41.94159],
50981         playgroundPreset = context.presets().item('leisure/playground'),
50982         descriptionField = context.presets().field('description'),
50983         timeouts = [],
50984         areaId;
50985
50986
50987     var chapter = {
50988         title: 'intro.areas.title'
50989     };
50990
50991
50992     function timeout(f, t$$1) {
50993         timeouts.push(window.setTimeout(f, t$$1));
50994     }
50995
50996
50997     function eventCancel() {
50998         event.stopPropagation();
50999         event.preventDefault();
51000     }
51001
51002
51003     function revealPlayground(center, text, options) {
51004         var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
51005         var box = pad$1(center, padding, context);
51006         reveal(box, text, options);
51007     }
51008
51009
51010     function addArea() {
51011         context.enter(modeBrowse(context));
51012         context.history().reset('initial');
51013         areaId = null;
51014
51015         var msec = transitionTime(playground, context.map().center());
51016         if (msec) { reveal(null, null, { duration: 0 }); }
51017         context.map().zoom(19).centerEase(playground, msec);
51018
51019         timeout(function() {
51020             var tooltip = reveal('button.add-area',
51021                 t('intro.areas.add_playground', { button: icon('#icon-area', 'pre-text') }));
51022
51023             tooltip.selectAll('.tooltip-inner')
51024                 .insert('svg', 'span')
51025                 .attr('class', 'tooltip-illustration')
51026                 .append('use')
51027                 .attr('xlink:href', '#landuse-images');
51028
51029             context.on('enter.intro', function(mode) {
51030                 if (mode.id !== 'add-area') return;
51031                 continueTo(startPlayground);
51032             });
51033         }, msec + 100);
51034
51035         function continueTo(nextStep) {
51036             context.on('enter.intro', null);
51037             nextStep();
51038         }
51039     }
51040
51041
51042     function startPlayground() {
51043         if (context.mode().id !== 'add-area') {
51044             return chapter.restart();
51045         }
51046
51047         areaId = null;
51048         context.map().zoomEase(19.5, 500);
51049
51050         timeout(function() {
51051             revealPlayground(playground,
51052                 t('intro.areas.start_playground'), { duration: 250 }
51053             );
51054
51055             timeout(function() {
51056                 context.map().on('move.intro drawn.intro', function() {
51057                     revealPlayground(playground,
51058                         t('intro.areas.start_playground'), { duration: 0 }
51059                     );
51060                 });
51061                 context.on('enter.intro', function(mode) {
51062                     if (mode.id !== 'draw-area') return chapter.restart();
51063                     continueTo(continuePlayground);
51064                 });
51065             }, 250);  // after reveal
51066
51067         }, 550);  // after easing
51068
51069         function continueTo(nextStep) {
51070             context.map().on('move.intro drawn.intro', null);
51071             context.on('enter.intro', null);
51072             nextStep();
51073         }
51074     }
51075
51076
51077     function continuePlayground() {
51078         if (context.mode().id !== 'draw-area') {
51079             return chapter.restart();
51080         }
51081
51082         areaId = null;
51083         revealPlayground(playground,
51084             t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
51085             { duration: 250 }
51086         );
51087
51088         timeout(function() {
51089             context.map().on('move.intro drawn.intro', function() {
51090                 revealPlayground(playground,
51091                     t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
51092                     { duration: 0 }
51093                 );
51094             });
51095         }, 250);  // after reveal
51096
51097         context.on('enter.intro', function(mode) {
51098             if (mode.id === 'draw-area') {
51099                 var entity = context.hasEntity(context.selectedIDs()[0]);
51100                 if (entity && entity.nodes.length >= 6) {
51101                     return continueTo(finishPlayground);
51102                 } else {
51103                     return;
51104                 }
51105             } else if (mode.id === 'select') {
51106                 areaId = context.selectedIDs()[0];
51107                 return continueTo(searchPresets);
51108             } else {
51109                 return chapter.restart();
51110             }
51111         });
51112
51113         function continueTo(nextStep) {
51114             context.map().on('move.intro drawn.intro', null);
51115             context.on('enter.intro', null);
51116             nextStep();
51117         }
51118     }
51119
51120
51121     function finishPlayground() {
51122         if (context.mode().id !== 'draw-area') {
51123             return chapter.restart();
51124         }
51125
51126         areaId = null;
51127         revealPlayground(playground,
51128             t('intro.areas.finish_playground'), { duration: 250 }
51129         );
51130
51131         timeout(function() {
51132             context.map().on('move.intro drawn.intro', function() {
51133                 revealPlayground(playground,
51134                     t('intro.areas.finish_playground'), { duration: 0 }
51135                 );
51136             });
51137         }, 250);  // after reveal
51138
51139         context.on('enter.intro', function(mode) {
51140             if (mode.id === 'draw-area') {
51141                 return;
51142             } else if (mode.id === 'select') {
51143                 areaId = context.selectedIDs()[0];
51144                 return continueTo(searchPresets);
51145             } else {
51146                 return chapter.restart();
51147             }
51148         });
51149
51150         function continueTo(nextStep) {
51151             context.map().on('move.intro drawn.intro', null);
51152             context.on('enter.intro', null);
51153             nextStep();
51154         }
51155     }
51156
51157
51158     function searchPresets() {
51159         if (!areaId || !context.hasEntity(areaId)) {
51160             return addArea();
51161         }
51162         var ids = context.selectedIDs();
51163         if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51164             context.enter(modeSelect(context, [areaId]));
51165         }
51166
51167         // disallow scrolling
51168         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51169
51170         timeout(function() {
51171             // reset pane, in case user somehow happened to change it..
51172             d3_select('.inspector-wrap .panewrap').style('right', '-100%');
51173
51174             d3_select('.preset-search-input')
51175                 .on('keydown.intro', null)
51176                 .on('keyup.intro', checkPresetSearch);
51177
51178             reveal('.preset-search-input',
51179                 t('intro.areas.search_playground', { preset: playgroundPreset.name() })
51180             );
51181         }, 400);  // after preset list pane visible..
51182
51183         context.on('enter.intro', function(mode) {
51184             if (!areaId || !context.hasEntity(areaId)) {
51185                 return continueTo(addArea);
51186             }
51187
51188             var ids = context.selectedIDs();
51189             if (mode.id !== 'select' || !ids.length || ids[0] !== areaId) {
51190                 // keep the user's area selected..
51191                 context.enter(modeSelect(context, [areaId]));
51192
51193                 // reset pane, in case user somehow happened to change it..
51194                 d3_select('.inspector-wrap .panewrap').style('right', '-100%');
51195                 // disallow scrolling
51196                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51197
51198                 d3_select('.preset-search-input')
51199                     .on('keydown.intro', null)
51200                     .on('keyup.intro', checkPresetSearch);
51201
51202                 reveal('.preset-search-input',
51203                     t('intro.areas.search_playground', { preset: playgroundPreset.name() })
51204                 );
51205
51206                 context.history().on('change.intro', null);
51207             }
51208         });
51209
51210         function checkPresetSearch() {
51211             var first = d3_select('.preset-list-item:first-child');
51212
51213             if (first.classed('preset-leisure-playground')) {
51214                 reveal(first.select('.preset-list-button').node(),
51215                     t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
51216                     { duration: 300 }
51217                 );
51218
51219                 d3_select('.preset-search-input')
51220                     .on('keydown.intro', eventCancel, true)
51221                     .on('keyup.intro', null);
51222
51223                 context.history().on('change.intro', function() {
51224                     continueTo(clickAddField);
51225                 });
51226             }
51227         }
51228
51229         function continueTo(nextStep) {
51230             d3_select('.inspector-wrap').on('wheel.intro', null);
51231             context.on('enter.intro', null);
51232             context.history().on('change.intro', null);
51233             d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
51234             nextStep();
51235         }
51236     }
51237
51238
51239     function clickAddField() {
51240         if (!areaId || !context.hasEntity(areaId)) {
51241             return addArea();
51242         }
51243         var ids = context.selectedIDs();
51244         if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51245             return searchPresets();
51246         }
51247
51248         if (!d3_select('.form-field-description').empty()) {
51249             return continueTo(describePlayground);
51250         }
51251
51252         // disallow scrolling
51253         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51254
51255         timeout(function() {
51256             // reset pane, in case user somehow happened to change it..
51257             d3_select('.inspector-wrap .panewrap').style('right', '0%');
51258
51259             // It's possible for the user to add a description in a previous step..
51260             // If they did this already, just continue to next step.
51261             var entity = context.entity(areaId);
51262             if (entity.tags.description) {
51263                 return continueTo(play);
51264             }
51265
51266             // scroll "Add field" into view
51267             var box = d3_select('.more-fields').node().getBoundingClientRect();
51268             if (box.top > 300) {
51269                 var pane = d3_select('.entity-editor-pane .inspector-body');
51270                 var start = pane.node().scrollTop;
51271                 var end = start + (box.top - 300);
51272
51273                 pane
51274                     .transition()
51275                     .duration(250)
51276                     .tween('scroll.inspector', function() {
51277                         var node = this;
51278                         var i = d3_interpolateNumber(start, end);
51279                         return function(t$$1) {
51280                             node.scrollTop = i(t$$1);
51281                         };
51282                     });
51283             }
51284
51285             timeout(function() {
51286                 reveal('.more-fields .combobox-input',
51287                     t('intro.areas.add_field'),
51288                     { duration: 300 }
51289                 );
51290
51291                 d3_select('.more-fields .combobox-input')
51292                     .on('click.intro', function() {
51293                         continueTo(chooseDescriptionField);
51294                     });
51295             }, 300);  // after "Add Field" visible
51296
51297         }, 400);  // after editor pane visible
51298
51299         context.on('exit.intro', function() {
51300             return continueTo(searchPresets);
51301         });
51302
51303         function continueTo(nextStep) {
51304             d3_select('.inspector-wrap').on('wheel.intro', null);
51305             d3_select('.more-fields .combobox-input').on('click.intro', null);
51306             context.on('exit.intro', null);
51307             nextStep();
51308         }
51309     }
51310
51311
51312     function chooseDescriptionField() {
51313         if (!areaId || !context.hasEntity(areaId)) {
51314             return addArea();
51315         }
51316         var ids = context.selectedIDs();
51317         if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51318             return searchPresets();
51319         }
51320
51321         if (!d3_select('.form-field-description').empty()) {
51322             return continueTo(describePlayground);
51323         }
51324
51325         // Make sure combobox is ready..
51326         if (d3_select('div.combobox').empty()) {
51327             return continueTo(clickAddField);
51328         }
51329         // Watch for the combobox to go away..
51330         var watcher;
51331         watcher = window.setInterval(function() {
51332             if (d3_select('div.combobox').empty()) {
51333                 window.clearInterval(watcher);
51334                 timeout(function() {
51335                     if (d3_select('.form-field-description').empty()) {
51336                         continueTo(retryChooseDescription);
51337                     } else {
51338                         continueTo(describePlayground);
51339                     }
51340                 }, 300);  // after description field added.
51341             }
51342         }, 300);
51343
51344         reveal('div.combobox',
51345             t('intro.areas.choose_field', { field: descriptionField.label() }),
51346             { duration: 300 }
51347         );
51348
51349         context.on('exit.intro', function() {
51350             return continueTo(searchPresets);
51351         });
51352
51353         function continueTo(nextStep) {
51354             if (watcher) window.clearInterval(watcher);
51355             context.on('exit.intro', null);
51356             nextStep();
51357         }
51358     }
51359
51360
51361     function describePlayground() {
51362         if (!areaId || !context.hasEntity(areaId)) {
51363             return addArea();
51364         }
51365         var ids = context.selectedIDs();
51366         if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51367             return searchPresets();
51368         }
51369
51370         // reset pane, in case user happened to change it..
51371         d3_select('.inspector-wrap .panewrap').style('right', '0%');
51372
51373         if (d3_select('.form-field-description').empty()) {
51374             return continueTo(retryChooseDescription);
51375         }
51376
51377         context.on('exit.intro', function() {
51378             continueTo(play);
51379         });
51380
51381         reveal('.entity-editor-pane',
51382             t('intro.areas.describe_playground', { button: icon('#icon-apply', 'pre-text') }),
51383             { duration: 300 }
51384         );
51385
51386         function continueTo(nextStep) {
51387             context.on('exit.intro', null);
51388             nextStep();
51389         }
51390     }
51391
51392
51393     function retryChooseDescription() {
51394         if (!areaId || !context.hasEntity(areaId)) {
51395             return addArea();
51396         }
51397         var ids = context.selectedIDs();
51398         if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51399             return searchPresets();
51400         }
51401
51402         // reset pane, in case user happened to change it..
51403         d3_select('.inspector-wrap .panewrap').style('right', '0%');
51404
51405         reveal('.entity-editor-pane',
51406             t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
51407             buttonText: t('intro.ok'),
51408             buttonCallback: function() { continueTo(clickAddField); }
51409         });
51410
51411         context.on('exit.intro', function() {
51412             return continueTo(searchPresets);
51413         });
51414
51415         function continueTo(nextStep) {
51416             context.on('exit.intro', null);
51417             nextStep();
51418         }
51419     }
51420
51421
51422     function play() {
51423         dispatch$$1.call('done');
51424         reveal('#id-container',
51425             t('intro.areas.play', { next: t('intro.lines.title') }), {
51426                 tooltipBox: '.intro-nav-wrap .chapter-line',
51427                 buttonText: t('intro.ok'),
51428                 buttonCallback: function() { reveal('#id-container'); }
51429             }
51430         );
51431     }
51432
51433
51434     chapter.enter = function() {
51435         addArea();
51436     };
51437
51438
51439     chapter.exit = function() {
51440         timeouts.forEach(window.clearTimeout);
51441         context.on('enter.intro exit.intro', null);
51442         context.map().on('move.intro drawn.intro', null);
51443         context.history().on('change.intro', null);
51444         d3_select('.inspector-wrap').on('wheel.intro', null);
51445         d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
51446         d3_select('.more-fields .combobox-input').on('click.intro', null);
51447     };
51448
51449
51450     chapter.restart = function() {
51451         chapter.exit();
51452         chapter.enter();
51453     };
51454
51455
51456     return utilRebind(chapter, dispatch$$1, 'on');
51457 }
51458
51459 function uiIntroLine(context, reveal) {
51460     var dispatch$$1 = dispatch('done'),
51461         timeouts = [],
51462         tulipRoadId = null,
51463         flowerRoadId = 'w646',
51464         tulipRoadStart = [-85.6297754121684, 41.95805253325314],
51465         tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204],
51466         tulipRoadIntersection = [-85.62974496187628, 41.95742515554585],
51467         roadCategory = context.presets().item('category-road'),
51468         residentialPreset = context.presets().item('highway/residential'),
51469         woodRoadId = 'w525',
51470         woodRoadEndId = 'n2862',
51471         woodRoadAddNode = [-85.62390110349587, 41.95397111462291],
51472         woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487],
51473         woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872],
51474         washingtonStreetId = 'w522',
51475         twelfthAvenueId = 'w1',
51476         eleventhAvenueEndId = 'n3550',
51477         twelfthAvenueEndId = 'n5',
51478         washingtonSegmentId = null,
51479         eleventhAvenueEnd = context.entity(eleventhAvenueEndId).loc,
51480         twelfthAvenueEnd = context.entity(twelfthAvenueEndId).loc,
51481         deleteLinesLoc = [-85.6219395542764, 41.95228033922477],
51482         twelfthAvenue = [-85.62219310052491, 41.952505413152956];
51483
51484
51485     var chapter = {
51486         title: 'intro.lines.title'
51487     };
51488
51489
51490     function timeout(f, t$$1) {
51491         timeouts.push(window.setTimeout(f, t$$1));
51492     }
51493
51494
51495     function eventCancel() {
51496         event.stopPropagation();
51497         event.preventDefault();
51498     }
51499
51500
51501     function revealEditMenu(loc, text, options) {
51502         var rect = context.surfaceRect();
51503         var point$$1 = context.curtainProjection(loc);
51504         var pad = 40;
51505         var width = 250 + (2 * pad);
51506         var height = 350;
51507         var startX = rect.left + point$$1[0];
51508         var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
51509         var box = {
51510             left: left,
51511             top: point$$1[1] + rect.top - 60,
51512             width: width,
51513             height: height
51514         };
51515         reveal(box, text, options);
51516     }
51517
51518
51519     function addLine() {
51520         context.enter(modeBrowse(context));
51521         context.history().reset('initial');
51522
51523         var msec = transitionTime(tulipRoadStart, context.map().center());
51524         if (msec) { reveal(null, null, { duration: 0 }); }
51525         context.map().zoom(18.5).centerEase(tulipRoadStart, msec);
51526
51527         timeout(function() {
51528             var tooltip = reveal('button.add-line',
51529                 t('intro.lines.add_line', { button: icon('#icon-line', 'pre-text') }));
51530
51531             tooltip.selectAll('.tooltip-inner')
51532                 .insert('svg', 'span')
51533                 .attr('class', 'tooltip-illustration')
51534                 .append('use')
51535                 .attr('xlink:href', '#feature-images');
51536
51537             context.on('enter.intro', function(mode) {
51538                 if (mode.id !== 'add-line') return;
51539                 continueTo(startLine);
51540             });
51541         }, msec + 100);
51542
51543         function continueTo(nextStep) {
51544             context.on('enter.intro', null);
51545             nextStep();
51546         }
51547     }
51548
51549
51550     function startLine() {
51551         if (context.mode().id !== 'add-line') {
51552             return chapter.restart();
51553         }
51554
51555         tulipRoadId = null;
51556
51557         var padding = 70 * Math.pow(2, context.map().zoom() - 18);
51558         var box = pad$1(tulipRoadStart, padding, context);
51559         box.height = box.height + 100;
51560         reveal(box, t('intro.lines.start_line'));
51561
51562         context.map().on('move.intro drawn.intro', function() {
51563             padding = 70 * Math.pow(2, context.map().zoom() - 18);
51564             box = pad$1(tulipRoadStart, padding, context);
51565             box.height = box.height + 100;
51566             reveal(box, t('intro.lines.start_line'), { duration: 0 });
51567         });
51568
51569         context.on('enter.intro', function(mode) {
51570             if (mode.id !== 'draw-line') return chapter.restart();
51571             continueTo(drawLine);
51572         });
51573
51574         function continueTo(nextStep) {
51575             context.map().on('move.intro drawn.intro', null);
51576             context.on('enter.intro', null);
51577             nextStep();
51578         }
51579     }
51580
51581
51582     function drawLine() {
51583         if (context.mode().id !== 'draw-line') {
51584             return chapter.restart();
51585         }
51586
51587         tulipRoadId = context.mode().selectedIDs()[0];
51588         context.map().centerEase(tulipRoadMidpoint, 500);
51589
51590         timeout(function() {
51591             var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
51592             var box = pad$1(tulipRoadMidpoint, padding, context);
51593             box.height = box.height * 2;
51594             reveal(box,
51595                 t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
51596             );
51597
51598             context.map().on('move.intro drawn.intro', function() {
51599                 padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
51600                 box = pad$1(tulipRoadMidpoint, padding, context);
51601                 box.height = box.height * 2;
51602                 reveal(box,
51603                     t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
51604                     { duration: 0 }
51605                 );
51606             });
51607         }, 550);  // after easing..
51608
51609         context.history().on('change.intro', function() {
51610             var entity = tulipRoadId && context.hasEntity(tulipRoadId);
51611             if (!entity) return chapter.restart();
51612
51613             if (isLineConnected()) {
51614                 continueTo(continueLine);
51615             }
51616         });
51617
51618         context.on('enter.intro', function(mode) {
51619             if (mode.id === 'draw-line')
51620                 return;
51621             else if (mode.id === 'select') {
51622                 continueTo(retryIntersect);
51623                 return;
51624             }
51625             else
51626                 return chapter.restart();
51627         });
51628
51629         function continueTo(nextStep) {
51630             context.map().on('move.intro drawn.intro', null);
51631             context.history().on('change.intro', null);
51632             context.on('enter.intro', null);
51633             nextStep();
51634         }
51635     }
51636
51637
51638     function isLineConnected() {
51639         var entity = tulipRoadId && context.hasEntity(tulipRoadId);
51640         if (!entity) return false;
51641
51642         var drawNodes = context.graph().childNodes(entity);
51643         return some(drawNodes, function(node) {
51644             return some(context.graph().parentWays(node), function(parent) {
51645                 return parent.id === flowerRoadId;
51646             });
51647         });
51648     }
51649
51650
51651     function retryIntersect() {
51652         d3_select(window).on('mousedown.intro', eventCancel, true);
51653
51654         var box = pad$1(tulipRoadIntersection, 80, context);
51655         reveal(box,
51656             t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
51657         );
51658
51659         timeout(chapter.restart, 3000);
51660     }
51661
51662
51663     function continueLine() {
51664         if (context.mode().id !== 'draw-line') return chapter.restart();
51665         var entity = tulipRoadId && context.hasEntity(tulipRoadId);
51666         if (!entity) return chapter.restart();
51667
51668         context.map().centerEase(tulipRoadIntersection, 500);
51669
51670         reveal('#surface', t('intro.lines.continue_line'));
51671
51672         context.on('enter.intro', function(mode) {
51673             if (mode.id === 'draw-line')
51674                 return;
51675             else if (mode.id === 'select')
51676                 return continueTo(chooseCategoryRoad);
51677             else
51678                 return chapter.restart();
51679         });
51680
51681         function continueTo(nextStep) {
51682             context.on('enter.intro', null);
51683             nextStep();
51684         }
51685     }
51686
51687
51688     function chooseCategoryRoad() {
51689         if (context.mode().id !== 'select') {
51690             return chapter.restart();
51691         }
51692
51693         context.on('exit.intro', function() {
51694             return chapter.restart();
51695         });
51696
51697         var button = d3_select('.preset-category-road .preset-list-button');
51698         if (button.empty()) return chapter.restart();
51699
51700         // disallow scrolling
51701         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51702
51703         timeout(function() {
51704             // reset pane, in case user somehow happened to change it..
51705             d3_select('.inspector-wrap .panewrap').style('right', '-100%');
51706
51707             reveal(button.node(),
51708                 t('intro.lines.choose_category_road', { category: roadCategory.name() })
51709             );
51710
51711             button.on('click.intro', function() {
51712                 continueTo(choosePresetResidential);
51713             });
51714
51715         }, 400);  // after editor pane visible
51716
51717         function continueTo(nextStep) {
51718             d3_select('.inspector-wrap').on('wheel.intro', null);
51719             d3_select('.preset-list-button').on('click.intro', null);
51720             context.on('exit.intro', null);
51721             nextStep();
51722         }
51723     }
51724
51725
51726     function choosePresetResidential() {
51727         if (context.mode().id !== 'select') {
51728             return chapter.restart();
51729         }
51730
51731         context.on('exit.intro', function() {
51732             return chapter.restart();
51733         });
51734
51735         var subgrid = d3_select('.preset-category-road .subgrid');
51736         if (subgrid.empty()) return chapter.restart();
51737
51738         subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
51739             .on('click.intro', function() {
51740                 continueTo(retryPresetResidential);
51741             });
51742
51743         subgrid.selectAll('.preset-highway-residential .preset-list-button')
51744             .on('click.intro', function() {
51745                 continueTo(nameRoad);
51746             });
51747
51748         timeout(function() {
51749             reveal(subgrid.node(),
51750                 t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
51751                 { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
51752             );
51753         }, 300);
51754
51755         function continueTo(nextStep) {
51756             d3_select('.preset-list-button').on('click.intro', null);
51757             context.on('exit.intro', null);
51758             nextStep();
51759         }
51760     }
51761
51762
51763     // selected wrong road type
51764     function retryPresetResidential() {
51765         if (context.mode().id !== 'select') {
51766             return chapter.restart();
51767         }
51768
51769         context.on('exit.intro', function() {
51770             return chapter.restart();
51771         });
51772
51773         // disallow scrolling
51774         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51775
51776         timeout(function() {
51777             var button = d3_select('.entity-editor-pane .preset-list-button');
51778
51779             reveal(button.node(),
51780                 t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
51781             );
51782
51783             button.on('click.intro', function() {
51784                 continueTo(chooseCategoryRoad);
51785             });
51786
51787         }, 500);
51788
51789         function continueTo(nextStep) {
51790             d3_select('.inspector-wrap').on('wheel.intro', null);
51791             d3_select('.preset-list-button').on('click.intro', null);
51792             context.on('exit.intro', null);
51793             nextStep();
51794         }
51795     }
51796
51797
51798     function nameRoad() {
51799         context.on('exit.intro', function() {
51800             continueTo(didNameRoad);
51801         });
51802
51803         timeout(function() {
51804             reveal('.entity-editor-pane',
51805                 t('intro.lines.name_road', { button: icon('#icon-apply', 'pre-text') }),
51806                 { tooltipClass: 'intro-lines-name_road' }
51807             );
51808         }, 500);
51809
51810         function continueTo(nextStep) {
51811             context.on('exit.intro', null);
51812             nextStep();
51813         }
51814     }
51815
51816
51817     function didNameRoad() {
51818         context.history().checkpoint('doneAddLine');
51819
51820         timeout(function() {
51821             reveal('#surface', t('intro.lines.did_name_road'), {
51822                 buttonText: t('intro.ok'),
51823                 buttonCallback: function() { continueTo(updateLine); }
51824             });
51825         }, 500);
51826
51827         function continueTo(nextStep) {
51828             nextStep();
51829         }
51830     }
51831
51832
51833     function updateLine() {
51834         context.history().reset('doneAddLine');
51835         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51836             return chapter.restart();
51837         }
51838
51839         var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
51840         if (msec) { reveal(null, null, { duration: 0 }); }
51841         context.map().zoom(19).centerEase(woodRoadDragMidpoint, msec);
51842
51843         timeout(function() {
51844             var padding = 250 * Math.pow(2, context.map().zoom() - 19);
51845             var box = pad$1(woodRoadDragMidpoint, padding, context);
51846             var advance = function() { continueTo(addNode); };
51847
51848             reveal(box, t('intro.lines.update_line'),
51849                 { buttonText: t('intro.ok'), buttonCallback: advance }
51850             );
51851
51852             context.map().on('move.intro drawn.intro', function() {
51853                 var padding = 250 * Math.pow(2, context.map().zoom() - 19);
51854                 var box = pad$1(woodRoadDragMidpoint, padding, context);
51855                 reveal(box, t('intro.lines.update_line'),
51856                     { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
51857                 );
51858             });
51859         }, msec + 100);
51860
51861         function continueTo(nextStep) {
51862             context.map().on('move.intro drawn.intro', null);
51863             nextStep();
51864         }
51865     }
51866
51867
51868     function addNode() {
51869         context.history().reset('doneAddLine');
51870         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51871             return chapter.restart();
51872         }
51873
51874         var padding = 40 * Math.pow(2, context.map().zoom() - 19);
51875         var box = pad$1(woodRoadAddNode, padding, context);
51876         reveal(box, t('intro.lines.add_node'));
51877
51878         context.map().on('move.intro drawn.intro', function() {
51879             var padding = 40 * Math.pow(2, context.map().zoom() - 19);
51880             var box = pad$1(woodRoadAddNode, padding, context);
51881             reveal(box, t('intro.lines.add_node'), { duration: 0 });
51882         });
51883
51884         context.history().on('change.intro', function(changed) {
51885             if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51886                 return continueTo(updateLine);
51887             }
51888             if (changed.created().length === 1) {
51889                 timeout(function() { continueTo(startDragEndpoint); }, 500);
51890             }
51891         });
51892
51893         context.on('enter.intro', function(mode) {
51894             if (mode.id !== 'select') {
51895                 continueTo(updateLine);
51896             }
51897         });
51898
51899         function continueTo(nextStep) {
51900             context.map().on('move.intro drawn.intro', null);
51901             context.history().on('change.intro', null);
51902             context.on('enter.intro', null);
51903             nextStep();
51904         }
51905     }
51906
51907
51908     function startDragEndpoint() {
51909         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51910             return continueTo(updateLine);
51911         }
51912         var padding = 100 * Math.pow(2, context.map().zoom() - 19);
51913         var box = pad$1(woodRoadDragEndpoint, padding, context);
51914         reveal(box, t('intro.lines.start_drag_endpoint'));
51915
51916         context.map().on('move.intro drawn.intro', function() {
51917             if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51918                 return continueTo(updateLine);
51919             }
51920             var padding = 100 * Math.pow(2, context.map().zoom() - 19);
51921             var box = pad$1(woodRoadDragEndpoint, padding, context);
51922             reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
51923
51924             var entity = context.entity(woodRoadEndId);
51925             if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
51926                 continueTo(finishDragEndpoint);
51927             }
51928         });
51929
51930         function continueTo(nextStep) {
51931             context.map().on('move.intro drawn.intro', null);
51932             nextStep();
51933         }
51934     }
51935
51936
51937     function finishDragEndpoint() {
51938         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51939             return continueTo(updateLine);
51940         }
51941
51942         var padding = 100 * Math.pow(2, context.map().zoom() - 19);
51943         var box = pad$1(woodRoadDragEndpoint, padding, context);
51944         reveal(box, t('intro.lines.finish_drag_endpoint'));
51945
51946         context.map().on('move.intro drawn.intro', function() {
51947             if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51948                 return continueTo(updateLine);
51949             }
51950             var padding = 100 * Math.pow(2, context.map().zoom() - 19);
51951             var box = pad$1(woodRoadDragEndpoint, padding, context);
51952             reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
51953
51954             var entity = context.entity(woodRoadEndId);
51955             if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
51956                 continueTo(startDragEndpoint);
51957             }
51958         });
51959
51960         context.on('enter.intro', function() {
51961             continueTo(startDragMidpoint);
51962         });
51963
51964         function continueTo(nextStep) {
51965             context.map().on('move.intro drawn.intro', null);
51966             context.on('enter.intro', null);
51967             nextStep();
51968         }
51969     }
51970
51971
51972     function startDragMidpoint() {
51973         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51974             return continueTo(updateLine);
51975         }
51976         if (context.selectedIDs().indexOf(woodRoadId) === -1) {
51977             context.enter(modeSelect(context, [woodRoadId]));
51978         }
51979
51980         var padding = 80 * Math.pow(2, context.map().zoom() - 19);
51981         var box = pad$1(woodRoadDragMidpoint, padding, context);
51982         reveal(box, t('intro.lines.start_drag_midpoint'));
51983
51984         context.map().on('move.intro drawn.intro', function() {
51985             if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51986                 return continueTo(updateLine);
51987             }
51988             var padding = 80 * Math.pow(2, context.map().zoom() - 19);
51989             var box = pad$1(woodRoadDragMidpoint, padding, context);
51990             reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
51991         });
51992
51993         context.history().on('change.intro', function(changed) {
51994             if (changed.created().length === 1) {
51995                 continueTo(continueDragMidpoint);
51996             }
51997         });
51998
51999         context.on('enter.intro', function(mode) {
52000             if (mode.id !== 'select') {
52001                 // keep Wood Road selected so midpoint triangles are drawn..
52002                 context.enter(modeSelect(context, [woodRoadId]));
52003             }
52004         });
52005
52006         function continueTo(nextStep) {
52007             context.map().on('move.intro drawn.intro', null);
52008             context.history().on('change.intro', null);
52009             context.on('enter.intro', null);
52010             nextStep();
52011         }
52012     }
52013
52014
52015     function continueDragMidpoint() {
52016         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52017             return continueTo(updateLine);
52018         }
52019
52020         var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52021         var box = pad$1(woodRoadDragEndpoint, padding, context);
52022         box.height += 400;
52023
52024         var advance = function() {
52025             context.history().checkpoint('doneUpdateLine');
52026             continueTo(deleteLines);
52027         };
52028
52029         reveal(box, t('intro.lines.continue_drag_midpoint'),
52030             { buttonText: t('intro.ok'), buttonCallback: advance }
52031         );
52032
52033         context.map().on('move.intro drawn.intro', function() {
52034             if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52035                 return continueTo(updateLine);
52036             }
52037             var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52038             var box = pad$1(woodRoadDragEndpoint, padding, context);
52039             box.height += 400;
52040             reveal(box, t('intro.lines.continue_drag_midpoint'),
52041                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
52042             );
52043         });
52044
52045         function continueTo(nextStep) {
52046             context.map().on('move.intro drawn.intro', null);
52047             nextStep();
52048         }
52049     }
52050
52051
52052     function deleteLines() {
52053         context.history().reset('doneUpdateLine');
52054         context.enter(modeBrowse(context));
52055
52056         if (!context.hasEntity(washingtonStreetId) ||
52057             !context.hasEntity(twelfthAvenueId) ||
52058             !context.hasEntity(eleventhAvenueEndId)) {
52059             return chapter.restart();
52060         }
52061
52062         var msec = transitionTime(deleteLinesLoc, context.map().center());
52063         if (msec) { reveal(null, null, { duration: 0 }); }
52064         context.map().zoom(18).centerEase(deleteLinesLoc, msec);
52065
52066         timeout(function() {
52067             var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52068             var box = pad$1(deleteLinesLoc, padding, context);
52069             box.top -= 200;
52070             box.height += 400;
52071             var advance = function() { continueTo(rightClickIntersection); };
52072
52073             reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
52074                 { buttonText: t('intro.ok'), buttonCallback: advance }
52075             );
52076
52077             context.map().on('move.intro drawn.intro', function() {
52078                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52079                 var box = pad$1(deleteLinesLoc, padding, context);
52080                 box.top -= 200;
52081                 box.height += 400;
52082                 reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
52083                     { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
52084                 );
52085             });
52086
52087             context.history().on('change.intro', function() {
52088                 timeout(function() {
52089                     continueTo(deleteLines);
52090                 }, 500);  // after any transition (e.g. if user deleted intersection)
52091             });
52092
52093         }, msec + 100);
52094
52095         function continueTo(nextStep) {
52096             context.map().on('move.intro drawn.intro', null);
52097             context.history().on('change.intro', null);
52098             nextStep();
52099         }
52100     }
52101
52102
52103     function rightClickIntersection() {
52104         context.history().reset('doneUpdateLine');
52105         context.enter(modeBrowse(context));
52106
52107         context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
52108
52109         timeout(function() {
52110             var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52111             var box = pad$1(eleventhAvenueEnd, padding, context);
52112             reveal(box, t('intro.lines.rightclick_intersection',
52113                 { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
52114             );
52115
52116             context.map().on('move.intro drawn.intro', function() {
52117                 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52118                 var box = pad$1(eleventhAvenueEnd, padding, context);
52119                 reveal(box, t('intro.lines.rightclick_intersection',
52120                     { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
52121                     { duration: 0 }
52122                 );
52123             });
52124
52125             context.on('enter.intro', function(mode) {
52126                 if (mode.id !== 'select') return;
52127                 var ids = context.selectedIDs();
52128                 if (ids.length !== 1 || ids[0] !== eleventhAvenueEndId) return;
52129
52130                 timeout(function() {
52131                     var node = selectMenuItem('split').node();
52132                     if (!node) return;
52133                     continueTo(splitIntersection);
52134                 }, 300);  // after menu visible
52135             });
52136
52137             context.history().on('change.intro', function() {
52138                 timeout(function() {
52139                     continueTo(deleteLines);
52140                 }, 300);  // after any transition (e.g. if user deleted intersection)
52141             });
52142
52143         }, 600);
52144
52145         function continueTo(nextStep) {
52146             context.map().on('move.intro drawn.intro', null);
52147             context.on('enter.intro', null);
52148             context.history().on('change.intro', null);
52149             nextStep();
52150         }
52151     }
52152
52153
52154     function splitIntersection() {
52155         if (!context.hasEntity(washingtonStreetId) ||
52156             !context.hasEntity(twelfthAvenueId) ||
52157             !context.hasEntity(eleventhAvenueEndId)) {
52158             return continueTo(deleteLines);
52159         }
52160
52161         var node = selectMenuItem('split').node();
52162         if (!node) { return continueTo(rightClickIntersection); }
52163
52164         var wasChanged = false;
52165         var menuCoords = context.map().mouseCoordinates();
52166         washingtonSegmentId = null;
52167
52168         revealEditMenu(menuCoords, t('intro.lines.split_intersection',
52169             { button: icon('#operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
52170         );
52171
52172         context.map().on('move.intro drawn.intro', function() {
52173             var node = selectMenuItem('split').node();
52174             if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
52175
52176             revealEditMenu(menuCoords, t('intro.lines.split_intersection',
52177                 { button: icon('#operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
52178                 { duration: 0 }
52179             );
52180         });
52181
52182         context.history().on('change.intro', function(changed) {
52183             wasChanged = true;
52184             timeout(function() {
52185                 if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
52186                     washingtonSegmentId = changed.created()[0].id;
52187                     continueTo(didSplit);
52188                 } else {
52189                     washingtonSegmentId = null;
52190                     continueTo(retrySplit);
52191                 }
52192             }, 300);  // after any transition (e.g. if user deleted intersection)
52193         });
52194
52195         function continueTo(nextStep) {
52196             context.map().on('move.intro drawn.intro', null);
52197             context.history().on('change.intro', null);
52198             nextStep();
52199         }
52200     }
52201
52202
52203     function retrySplit() {
52204         context.enter(modeBrowse(context));
52205         context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
52206         var advance = function() { continueTo(rightClickIntersection); };
52207
52208         var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52209         var box = pad$1(eleventhAvenueEnd, padding, context);
52210         reveal(box, t('intro.lines.retry_split'),
52211             { buttonText: t('intro.ok'), buttonCallback: advance }
52212         );
52213
52214         context.map().on('move.intro drawn.intro', function() {
52215             var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52216             var box = pad$1(eleventhAvenueEnd, padding, context);
52217             reveal(box, t('intro.lines.retry_split'),
52218                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
52219             );
52220         });
52221
52222         function continueTo(nextStep) {
52223             context.map().on('move.intro drawn.intro', null);
52224             nextStep();
52225         }
52226     }
52227
52228
52229     function didSplit() {
52230         if (!washingtonSegmentId ||
52231             !context.hasEntity(washingtonSegmentId) ||
52232             !context.hasEntity(washingtonStreetId) ||
52233             !context.hasEntity(twelfthAvenueId) ||
52234             !context.hasEntity(eleventhAvenueEndId)) {
52235             return continueTo(rightClickIntersection);
52236         }
52237
52238         var ids = context.selectedIDs();
52239         var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
52240         var street = t('intro.graph.name.washington-street');
52241
52242         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52243         var box = pad$1(twelfthAvenue, padding, context);
52244         box.width = box.width / 2;
52245         reveal(box, t(string, { street1: street, street2: street }),
52246             { duration: 500 }
52247         );
52248
52249         timeout(function() {
52250             context.map().zoom(18).centerEase(twelfthAvenue, 500);
52251
52252             context.map().on('move.intro drawn.intro', function() {
52253                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52254                 var box = pad$1(twelfthAvenue, padding, context);
52255                 box.width = box.width / 2;
52256                 reveal(box, t(string, { street1: street, street2: street }),
52257                     { duration: 0 }
52258                 );
52259             });
52260         }, 600);  // after initial reveal and curtain cut
52261
52262         context.on('enter.intro', function() {
52263             var ids = context.selectedIDs();
52264             if (ids.length === 1 && ids[0] === washingtonSegmentId) {
52265                 continueTo(multiSelect);
52266             }
52267         });
52268
52269         context.history().on('change.intro', function() {
52270             if (!washingtonSegmentId ||
52271                 !context.hasEntity(washingtonSegmentId) ||
52272                 !context.hasEntity(washingtonStreetId) ||
52273                 !context.hasEntity(twelfthAvenueId) ||
52274                 !context.hasEntity(eleventhAvenueEndId)) {
52275                 return continueTo(rightClickIntersection);
52276             }
52277         });
52278
52279         function continueTo(nextStep) {
52280             context.map().on('move.intro drawn.intro', null);
52281             context.on('enter.intro', null);
52282             context.history().on('change.intro', null);
52283             nextStep();
52284         }
52285     }
52286
52287
52288     function multiSelect() {
52289         if (!washingtonSegmentId ||
52290             !context.hasEntity(washingtonSegmentId) ||
52291             !context.hasEntity(washingtonStreetId) ||
52292             !context.hasEntity(twelfthAvenueId) ||
52293             !context.hasEntity(eleventhAvenueEndId)) {
52294             return continueTo(rightClickIntersection);
52295         }
52296
52297         var ids = context.selectedIDs();
52298         var hasWashington = ids.indexOf(washingtonSegmentId) !== -1;
52299         var hasTwelfth = ids.indexOf(twelfthAvenueId) !== -1;
52300
52301         if (hasWashington && hasTwelfth) {
52302             return continueTo(multiRightClick);
52303         } else if (!hasWashington && !hasTwelfth) {
52304             return continueTo(didSplit);
52305         }
52306
52307         context.map().zoom(18).centerEase(twelfthAvenue, 500);
52308
52309         timeout(function() {
52310             var selected, other, padding, box;
52311             if (hasWashington) {
52312                 selected = t('intro.graph.name.washington-street');
52313                 other = t('intro.graph.name.12th-avenue');
52314                 padding = 60 * Math.pow(2, context.map().zoom() - 18);
52315                 box = pad$1(twelfthAvenueEnd, padding, context);
52316                 box.width *= 3;
52317             } else {
52318                 selected = t('intro.graph.name.12th-avenue');
52319                 other = t('intro.graph.name.washington-street');
52320                 padding = 200 * Math.pow(2, context.map().zoom() - 18);
52321                 box = pad$1(twelfthAvenue, padding, context);
52322                 box.width /= 2;
52323             }
52324
52325             reveal(box,
52326                 t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
52327             );
52328
52329             context.map().on('move.intro drawn.intro', function() {
52330                 if (hasWashington) {
52331                     selected = t('intro.graph.name.washington-street');
52332                     other = t('intro.graph.name.12th-avenue');
52333                     padding = 60 * Math.pow(2, context.map().zoom() - 18);
52334                     box = pad$1(twelfthAvenueEnd, padding, context);
52335                     box.width *= 3;
52336                 } else {
52337                     selected = t('intro.graph.name.12th-avenue');
52338                     other = t('intro.graph.name.washington-street');
52339                     padding = 200 * Math.pow(2, context.map().zoom() - 18);
52340                     box = pad$1(twelfthAvenue, padding, context);
52341                     box.width /= 2;
52342                 }
52343
52344                 reveal(box,
52345                     t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
52346                     { duration: 0 }
52347                 );
52348             });
52349
52350             context.on('enter.intro', function() {
52351                 continueTo(multiSelect);
52352             });
52353
52354             context.history().on('change.intro', function() {
52355                 if (!washingtonSegmentId ||
52356                     !context.hasEntity(washingtonSegmentId) ||
52357                     !context.hasEntity(washingtonStreetId) ||
52358                     !context.hasEntity(twelfthAvenueId) ||
52359                     !context.hasEntity(eleventhAvenueEndId)) {
52360                     return continueTo(rightClickIntersection);
52361                 }
52362             });
52363         }, 600);
52364
52365         function continueTo(nextStep) {
52366             context.map().on('move.intro drawn.intro', null);
52367             context.on('enter.intro', null);
52368             context.history().on('change.intro', null);
52369             nextStep();
52370         }
52371     }
52372
52373
52374     function multiRightClick() {
52375         if (!washingtonSegmentId ||
52376             !context.hasEntity(washingtonSegmentId) ||
52377             !context.hasEntity(washingtonStreetId) ||
52378             !context.hasEntity(twelfthAvenueId) ||
52379             !context.hasEntity(eleventhAvenueEndId)) {
52380             return continueTo(rightClickIntersection);
52381         }
52382
52383         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52384         var box = pad$1(twelfthAvenue, padding, context);
52385         reveal(box, t('intro.lines.multi_rightclick'));
52386
52387         context.map().on('move.intro drawn.intro', function() {
52388             var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52389             var box = pad$1(twelfthAvenue, padding, context);
52390             reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
52391         });
52392
52393         d3_select(window).on('click.intro contextmenu.intro', function() {
52394             timeout(function() {
52395                 var ids = context.selectedIDs();
52396                 if (ids.length === 2 &&
52397                     ids.indexOf(twelfthAvenueId) !== -1 &&
52398                     ids.indexOf(washingtonSegmentId) !== -1) {
52399                         var node = selectMenuItem('delete').node();
52400                         if (!node) return;
52401                         continueTo(multiDelete);
52402                 } else if (ids.length === 1 &&
52403                     ids.indexOf(washingtonSegmentId) !== -1) {
52404                     return continueTo(multiSelect);
52405                 } else {
52406                     return continueTo(didSplit);
52407                 }
52408             }, 300);  // after edit menu visible
52409         }, true);
52410
52411         context.history().on('change.intro', function() {
52412             if (!washingtonSegmentId ||
52413                 !context.hasEntity(washingtonSegmentId) ||
52414                 !context.hasEntity(washingtonStreetId) ||
52415                 !context.hasEntity(twelfthAvenueId) ||
52416                 !context.hasEntity(eleventhAvenueEndId)) {
52417                 return continueTo(rightClickIntersection);
52418             }
52419         });
52420
52421         function continueTo(nextStep) {
52422             context.map().on('move.intro drawn.intro', null);
52423             d3_select(window).on('click.intro contextmenu.intro', null, true);
52424             context.history().on('change.intro', null);
52425             nextStep();
52426         }
52427     }
52428
52429
52430     function multiDelete() {
52431         if (!washingtonSegmentId ||
52432             !context.hasEntity(washingtonSegmentId) ||
52433             !context.hasEntity(washingtonStreetId) ||
52434             !context.hasEntity(twelfthAvenueId) ||
52435             !context.hasEntity(eleventhAvenueEndId)) {
52436             return continueTo(rightClickIntersection);
52437         }
52438
52439         var node = selectMenuItem('delete').node();
52440         if (!node) return continueTo(multiRightClick);
52441
52442         var menuCoords = context.map().mouseCoordinates();
52443         revealEditMenu(menuCoords,
52444             t('intro.lines.multi_delete', { button: icon('#operation-delete', 'pre-text') })
52445         );
52446
52447         context.map().on('move.intro drawn.intro', function() {
52448             revealEditMenu(menuCoords,
52449                 t('intro.lines.multi_delete', { button: icon('#operation-delete', 'pre-text') }),
52450                 { duration: 0 }
52451             );
52452         });
52453
52454         context.on('exit.intro', function() {
52455             if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
52456                 return continueTo(multiSelect);  // left select mode but roads still exist
52457             }
52458         });
52459
52460         context.history().on('change.intro', function() {
52461             if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
52462                 continueTo(retryDelete);         // changed something but roads still exist
52463             } else {
52464                 continueTo(play);
52465             }
52466         });
52467
52468         function continueTo(nextStep) {
52469             context.map().on('move.intro drawn.intro', null);
52470             context.on('exit.intro', null);
52471             context.history().on('change.intro', null);
52472             nextStep();
52473         }
52474     }
52475
52476
52477     function retryDelete() {
52478         context.enter(modeBrowse(context));
52479
52480         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52481         var box = pad$1(twelfthAvenue, padding, context);
52482         reveal(box, t('intro.lines.retry_delete'), {
52483             buttonText: t('intro.ok'),
52484             buttonCallback: function() { continueTo(multiSelect); }
52485         });
52486
52487         function continueTo(nextStep) {
52488             nextStep();
52489         }
52490     }
52491
52492
52493     function play() {
52494         dispatch$$1.call('done');
52495         reveal('#id-container',
52496             t('intro.lines.play', { next: t('intro.buildings.title') }), {
52497                 tooltipBox: '.intro-nav-wrap .chapter-building',
52498                 buttonText: t('intro.ok'),
52499                 buttonCallback: function() { reveal('#id-container'); }
52500             }
52501         );
52502    }
52503
52504
52505     chapter.enter = function() {
52506         addLine();
52507     };
52508
52509
52510     chapter.exit = function() {
52511         timeouts.forEach(window.clearTimeout);
52512         d3_select(window).on('mousedown.intro', null, true);
52513         context.on('enter.intro exit.intro', null);
52514         context.map().on('move.intro drawn.intro', null);
52515         context.history().on('change.intro', null);
52516         d3_select('.inspector-wrap').on('wheel.intro', null);
52517         d3_select('.preset-list-button').on('click.intro', null);
52518     };
52519
52520
52521     chapter.restart = function() {
52522         chapter.exit();
52523         chapter.enter();
52524     };
52525
52526
52527     return utilRebind(chapter, dispatch$$1, 'on');
52528 }
52529
52530 function uiIntroBuilding(context, reveal) {
52531     var dispatch$$1 = dispatch('done'),
52532         house = [-85.62815, 41.95638],
52533         tank = [-85.62732, 41.95347],
52534         buildingCatetory = context.presets().item('category-building'),
52535         housePreset = context.presets().item('building/house'),
52536         tankPreset = context.presets().item('man_made/storage_tank'),
52537         timeouts = [],
52538         houseId = null,
52539         tankId = null;
52540
52541
52542     var chapter = {
52543         title: 'intro.buildings.title'
52544     };
52545
52546
52547     function timeout(f, t$$1) {
52548         timeouts.push(window.setTimeout(f, t$$1));
52549     }
52550
52551
52552     function eventCancel() {
52553         event.stopPropagation();
52554         event.preventDefault();
52555     }
52556
52557
52558     function revealHouse(center, text, options) {
52559         var padding = 160 * Math.pow(2, context.map().zoom() - 20);
52560         var box = pad$1(center, padding, context);
52561         reveal(box, text, options);
52562     }
52563
52564
52565     function revealTank(center, text, options) {
52566         var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
52567         var box = pad$1(center, padding, context);
52568         reveal(box, text, options);
52569     }
52570
52571
52572     function revealEditMenu(loc, text, options) {
52573         var rect = context.surfaceRect();
52574         var point$$1 = context.curtainProjection(loc);
52575         var pad = 40;
52576         var width = 250 + (2 * pad);
52577         var height = 350;
52578         var startX = rect.left + point$$1[0];
52579         var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
52580         var box = {
52581             left: left,
52582             top: point$$1[1] + rect.top - 60,
52583             width: width,
52584             height: height
52585         };
52586         reveal(box, text, options);
52587     }
52588
52589
52590     function addHouse() {
52591         context.enter(modeBrowse(context));
52592         context.history().reset('initial');
52593         houseId = null;
52594
52595         var msec = transitionTime(house, context.map().center());
52596         if (msec) { reveal(null, null, { duration: 0 }); }
52597         context.map().zoom(19).centerEase(house, msec);
52598
52599         timeout(function() {
52600             var tooltip = reveal('button.add-area',
52601                 t('intro.buildings.add_building', { button: icon('#icon-area', 'pre-text') }));
52602
52603             tooltip.selectAll('.tooltip-inner')
52604                 .insert('svg', 'span')
52605                 .attr('class', 'tooltip-illustration')
52606                 .append('use')
52607                 .attr('xlink:href', '#building-images');
52608
52609             context.on('enter.intro', function(mode) {
52610                 if (mode.id !== 'add-area') return;
52611                 continueTo(startHouse);
52612             });
52613         }, msec + 100);
52614
52615         function continueTo(nextStep) {
52616             context.on('enter.intro', null);
52617             nextStep();
52618         }
52619     }
52620
52621
52622     function startHouse() {
52623         if (context.mode().id !== 'add-area') {
52624             return continueTo(addHouse);
52625         }
52626
52627         houseId = null;
52628         context.map().zoomEase(20, 500);
52629
52630         timeout(function() {
52631             revealHouse(house, t('intro.buildings.start_building'));
52632
52633             context.map().on('move.intro drawn.intro', function() {
52634                 revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
52635             });
52636
52637             context.on('enter.intro', function(mode) {
52638                 if (mode.id !== 'draw-area') return chapter.restart();
52639                 continueTo(continueHouse);
52640             });
52641
52642         }, 550);  // after easing
52643
52644         function continueTo(nextStep) {
52645             context.map().on('move.intro drawn.intro', null);
52646             context.on('enter.intro', null);
52647             nextStep();
52648         }
52649     }
52650
52651
52652     function continueHouse() {
52653         if (context.mode().id !== 'draw-area') {
52654             return continueTo(addHouse);
52655         }
52656
52657         houseId = null;
52658
52659         revealHouse(house, t('intro.buildings.continue_building'));
52660
52661         context.map().on('move.intro drawn.intro', function() {
52662             revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
52663         });
52664
52665         context.on('enter.intro', function(mode) {
52666             if (mode.id === 'draw-area') {
52667                 return;
52668             } else if (mode.id === 'select') {
52669                 var graph = context.graph(),
52670                     way = context.entity(context.selectedIDs()[0]),
52671                     nodes = graph.childNodes(way),
52672                     points = uniq(nodes).map(function(n) { return context.projection(n.loc); });
52673
52674                 if (isMostlySquare(points)) {
52675                     houseId = way.id;
52676                     return continueTo(chooseCategoryBuilding);
52677                 } else {
52678                     return continueTo(retryHouse);
52679                 }
52680
52681             } else {
52682                 return chapter.restart();
52683             }
52684         });
52685
52686         function continueTo(nextStep) {
52687             context.map().on('move.intro drawn.intro', null);
52688             context.on('enter.intro', null);
52689             nextStep();
52690         }
52691     }
52692
52693
52694     function retryHouse() {
52695         var onClick = function() { continueTo(addHouse); };
52696
52697         revealHouse(house, t('intro.buildings.retry_building'),
52698             { buttonText: t('intro.ok'), buttonCallback: onClick }
52699         );
52700
52701         context.map().on('move.intro drawn.intro', function() {
52702             revealHouse(house, t('intro.buildings.retry_building'),
52703                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
52704             );
52705         });
52706
52707         function continueTo(nextStep) {
52708             context.map().on('move.intro drawn.intro', null);
52709             nextStep();
52710         }
52711     }
52712
52713
52714     function chooseCategoryBuilding() {
52715         if (!houseId || !context.hasEntity(houseId)) {
52716             return addHouse();
52717         }
52718         var ids = context.selectedIDs();
52719         if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
52720             context.enter(modeSelect(context, [houseId]));
52721         }
52722
52723         // disallow scrolling
52724         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
52725
52726         timeout(function() {
52727             // reset pane, in case user somehow happened to change it..
52728             d3_select('.inspector-wrap .panewrap').style('right', '-100%');
52729
52730             var button = d3_select('.preset-category-building .preset-list-button');
52731
52732             reveal(button.node(),
52733                 t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
52734             );
52735
52736             button.on('click.intro', function() {
52737                 button.on('click.intro', null);
52738                 continueTo(choosePresetHouse);
52739             });
52740
52741         }, 400);  // after preset list pane visible..
52742
52743
52744         context.on('enter.intro', function(mode) {
52745             if (!houseId || !context.hasEntity(houseId)) {
52746                 return continueTo(addHouse);
52747             }
52748             var ids = context.selectedIDs();
52749             if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
52750                 return continueTo(chooseCategoryBuilding);
52751             }
52752         });
52753
52754         function continueTo(nextStep) {
52755             d3_select('.inspector-wrap').on('wheel.intro', null);
52756             d3_select('.preset-list-button').on('click.intro', null);
52757             context.on('enter.intro', null);
52758             nextStep();
52759         }
52760     }
52761
52762
52763     function choosePresetHouse() {
52764         if (!houseId || !context.hasEntity(houseId)) {
52765             return addHouse();
52766         }
52767         var ids = context.selectedIDs();
52768         if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
52769             context.enter(modeSelect(context, [houseId]));
52770         }
52771
52772         // disallow scrolling
52773         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
52774
52775         timeout(function() {
52776             // reset pane, in case user somehow happened to change it..
52777             d3_select('.inspector-wrap .panewrap').style('right', '-100%');
52778
52779             var button = d3_select('.preset-building-house .preset-list-button');
52780
52781             reveal(button.node(),
52782                 t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
52783                 { duration: 300 }
52784             );
52785
52786             button.on('click.intro', function() {
52787                 button.on('click.intro', null);
52788                 continueTo(closeEditorHouse);
52789             });
52790
52791
52792         }, 400);  // after preset list pane visible..
52793
52794         context.on('enter.intro', function(mode) {
52795             if (!houseId || !context.hasEntity(houseId)) {
52796                 return continueTo(addHouse);
52797             }
52798             var ids = context.selectedIDs();
52799             if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
52800                 return continueTo(chooseCategoryBuilding);
52801             }
52802         });
52803
52804         function continueTo(nextStep) {
52805             d3_select('.inspector-wrap').on('wheel.intro', null);
52806             d3_select('.preset-list-button').on('click.intro', null);
52807             context.on('enter.intro', null);
52808             nextStep();
52809         }
52810     }
52811
52812
52813     function closeEditorHouse() {
52814         if (!houseId || !context.hasEntity(houseId)) {
52815             return addHouse();
52816         }
52817         var ids = context.selectedIDs();
52818         if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
52819             context.enter(modeSelect(context, [houseId]));
52820         }
52821
52822         context.history().checkpoint('hasHouse');
52823
52824         context.on('exit.intro', function() {
52825             continueTo(rightClickHouse);
52826         });
52827
52828         timeout(function() {
52829             reveal('.entity-editor-pane',
52830                 t('intro.buildings.close', { button: icon('#icon-apply', 'pre-text') })
52831             );
52832         }, 500);
52833
52834         function continueTo(nextStep) {
52835             context.on('exit.intro', null);
52836             nextStep();
52837         }
52838     }
52839
52840
52841     function rightClickHouse() {
52842         if (!houseId) return chapter.restart();
52843
52844         context.enter(modeBrowse(context));
52845         context.history().reset('hasHouse');
52846         context.map().centerEase(house, 500);
52847
52848         timeout(function() {
52849             if (context.map().zoom() < 20) {
52850                 context.map().zoomEase(20, 500);
52851             }
52852         }, 520);
52853
52854         context.on('enter.intro', function(mode) {
52855             if (mode.id !== 'select') return;
52856             var ids = context.selectedIDs();
52857             if (ids.length !== 1 || ids[0] !== houseId) return;
52858
52859             timeout(function() {
52860                 var node = selectMenuItem('orthogonalize').node();
52861                 if (!node) return;
52862                 continueTo(clickSquare);
52863             }, 300);  // after menu visible
52864         });
52865
52866         context.map().on('move.intro drawn.intro', function() {
52867             revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
52868         });
52869
52870         context.history().on('change.intro', function() {
52871             continueTo(rightClickHouse);
52872         });
52873
52874         function continueTo(nextStep) {
52875             context.on('enter.intro', null);
52876             context.map().on('move.intro drawn.intro', null);
52877             context.history().on('change.intro', null);
52878             nextStep();
52879         }
52880     }
52881
52882
52883     function clickSquare() {
52884         if (!houseId) return chapter.restart();
52885         var entity = context.hasEntity(houseId);
52886         if (!entity) return continueTo(rightClickHouse);
52887
52888         var node = selectMenuItem('orthogonalize').node();
52889         if (!node) { return continueTo(rightClickHouse); }
52890
52891         var wasChanged = false;
52892         var menuCoords = context.map().mouseCoordinates();
52893
52894         revealEditMenu(menuCoords,
52895             t('intro.buildings.square_building', { button: icon('#operation-orthogonalize', 'pre-text') })
52896         );
52897
52898         context.on('enter.intro', function(mode) {
52899             if (mode.id === 'browse') {
52900                 continueTo(rightClickHouse);
52901             } else if (mode.id === 'move' || mode.id === 'rotate') {
52902                 continueTo(retryClickSquare);
52903             }
52904         });
52905
52906         context.map().on('move.intro drawn.intro', function() {
52907             var node = selectMenuItem('orthogonalize').node();
52908             if (!wasChanged && !node) { return continueTo(rightClickHouse); }
52909
52910             revealEditMenu(menuCoords,
52911                 t('intro.buildings.square_building', { button: icon('#operation-orthogonalize', 'pre-text') }),
52912                 { duration: 0 }
52913             );
52914         });
52915
52916         context.history().on('change.intro', function() {
52917             wasChanged = true;
52918             context.history().on('change.intro', null);
52919
52920             // Something changed.  Wait for transition to complete and check undo annotation.
52921             timeout(function() {
52922                 if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
52923                     continueTo(doneSquare);
52924                 } else {
52925                     continueTo(retryClickSquare);
52926                 }
52927             }, 500);  // after transitioned actions
52928         });
52929
52930         function continueTo(nextStep) {
52931             context.on('enter.intro', null);
52932             context.map().on('move.intro drawn.intro', null);
52933             context.history().on('change.intro', null);
52934             nextStep();
52935         }
52936     }
52937
52938
52939     function retryClickSquare() {
52940         context.enter(modeBrowse(context));
52941
52942         revealHouse(house, t('intro.buildings.retry_square'), {
52943             buttonText: t('intro.ok'),
52944             buttonCallback: function() { continueTo(rightClickHouse); }
52945         });
52946
52947         function continueTo(nextStep) {
52948             nextStep();
52949         }
52950     }
52951
52952
52953     function doneSquare() {
52954         context.history().checkpoint('doneSquare');
52955
52956         revealHouse(house, t('intro.buildings.done_square'), {
52957             buttonText: t('intro.ok'),
52958             buttonCallback: function() { continueTo(addTank); }
52959         });
52960
52961         function continueTo(nextStep) {
52962             nextStep();
52963         }
52964     }
52965
52966
52967     function addTank() {
52968         context.enter(modeBrowse(context));
52969         context.history().reset('doneSquare');
52970         tankId = null;
52971
52972         var msec = transitionTime(tank, context.map().center());
52973         if (msec) { reveal(null, null, { duration: 0 }); }
52974         context.map().zoom(19.5).centerEase(tank, msec);
52975
52976         timeout(function() {
52977             reveal('button.add-area',
52978                 t('intro.buildings.add_tank', { button: icon('#icon-area', 'pre-text') })
52979             );
52980
52981             context.on('enter.intro', function(mode) {
52982                 if (mode.id !== 'add-area') return;
52983                 continueTo(startTank);
52984             });
52985         }, msec + 100);
52986
52987         function continueTo(nextStep) {
52988             context.on('enter.intro', null);
52989             nextStep();
52990         }
52991     }
52992
52993
52994     function startTank() {
52995         if (context.mode().id !== 'add-area') {
52996             return continueTo(addTank);
52997         }
52998
52999         tankId = null;
53000
53001         timeout(function() {
53002             revealTank(tank, t('intro.buildings.start_tank'));
53003
53004             context.map().on('move.intro drawn.intro', function() {
53005                 revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
53006             });
53007
53008             context.on('enter.intro', function(mode) {
53009                 if (mode.id !== 'draw-area') return chapter.restart();
53010                 continueTo(continueTank);
53011             });
53012
53013         }, 550);  // after easing
53014
53015         function continueTo(nextStep) {
53016             context.map().on('move.intro drawn.intro', null);
53017             context.on('enter.intro', null);
53018             nextStep();
53019         }
53020     }
53021
53022
53023     function continueTank() {
53024         if (context.mode().id !== 'draw-area') {
53025             return continueTo(addTank);
53026         }
53027
53028         tankId = null;
53029
53030         revealTank(tank, t('intro.buildings.continue_tank'));
53031
53032         context.map().on('move.intro drawn.intro', function() {
53033             revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
53034         });
53035
53036         context.on('enter.intro', function(mode) {
53037             if (mode.id === 'draw-area') {
53038                 return;
53039             } else if (mode.id === 'select') {
53040                 tankId = context.selectedIDs()[0];
53041                 return continueTo(searchPresetTank);
53042             } else {
53043                 return continueTo(addTank);
53044             }
53045         });
53046
53047         function continueTo(nextStep) {
53048             context.map().on('move.intro drawn.intro', null);
53049             context.on('enter.intro', null);
53050             nextStep();
53051         }
53052     }
53053
53054
53055     function searchPresetTank() {
53056         if (!tankId || !context.hasEntity(tankId)) {
53057             return addTank();
53058         }
53059         var ids = context.selectedIDs();
53060         if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
53061             context.enter(modeSelect(context, [tankId]));
53062         }
53063
53064         // disallow scrolling
53065         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
53066
53067         timeout(function() {
53068             // reset pane, in case user somehow happened to change it..
53069             d3_select('.inspector-wrap .panewrap').style('right', '-100%');
53070
53071             d3_select('.preset-search-input')
53072                 .on('keydown.intro', null)
53073                 .on('keyup.intro', checkPresetSearch);
53074
53075             reveal('.preset-search-input',
53076                 t('intro.buildings.search_tank', { preset: tankPreset.name() })
53077             );
53078         }, 400);  // after preset list pane visible..
53079
53080         context.on('enter.intro', function(mode) {
53081             if (!tankId || !context.hasEntity(tankId)) {
53082                 return continueTo(addTank);
53083             }
53084
53085             var ids = context.selectedIDs();
53086             if (mode.id !== 'select' || !ids.length || ids[0] !== tankId) {
53087                 // keep the user's area selected..
53088                 context.enter(modeSelect(context, [tankId]));
53089
53090                 // reset pane, in case user somehow happened to change it..
53091                 d3_select('.inspector-wrap .panewrap').style('right', '-100%');
53092                 // disallow scrolling
53093                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
53094
53095                 d3_select('.preset-search-input')
53096                     .on('keydown.intro', null)
53097                     .on('keyup.intro', checkPresetSearch);
53098
53099                 reveal('.preset-search-input',
53100                     t('intro.buildings.search_tank', { preset: tankPreset.name() })
53101                 );
53102
53103                 context.history().on('change.intro', null);
53104             }
53105         });
53106
53107         function checkPresetSearch() {
53108             var first = d3_select('.preset-list-item:first-child');
53109
53110             if (first.classed('preset-man_made-storage_tank')) {
53111                 reveal(first.select('.preset-list-button').node(),
53112                     t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
53113                     { duration: 300 }
53114                 );
53115
53116                 d3_select('.preset-search-input')
53117                     .on('keydown.intro', eventCancel, true)
53118                     .on('keyup.intro', null);
53119
53120                 context.history().on('change.intro', function() {
53121                     continueTo(closeEditorTank);
53122                 });
53123             }
53124         }
53125
53126         function continueTo(nextStep) {
53127             d3_select('.inspector-wrap').on('wheel.intro', null);
53128             context.on('enter.intro', null);
53129             context.history().on('change.intro', null);
53130             d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
53131             nextStep();
53132         }
53133     }
53134
53135
53136     function closeEditorTank() {
53137         if (!tankId || !context.hasEntity(tankId)) {
53138             return addTank();
53139         }
53140         var ids = context.selectedIDs();
53141         if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
53142             context.enter(modeSelect(context, [tankId]));
53143         }
53144
53145         context.history().checkpoint('hasTank');
53146
53147         context.on('exit.intro', function() {
53148             continueTo(rightClickTank);
53149         });
53150
53151         timeout(function() {
53152             reveal('.entity-editor-pane',
53153                 t('intro.buildings.close', { button: icon('#icon-apply', 'pre-text') })
53154             );
53155         }, 500);
53156
53157         function continueTo(nextStep) {
53158             context.on('exit.intro', null);
53159             nextStep();
53160         }
53161     }
53162
53163
53164     function rightClickTank() {
53165         if (!tankId) return continueTo(addTank);
53166
53167         context.enter(modeBrowse(context));
53168         context.history().reset('hasTank');
53169         context.map().centerEase(tank, 500);
53170
53171         timeout(function() {
53172             context.on('enter.intro', function(mode) {
53173                 if (mode.id !== 'select') return;
53174                 var ids = context.selectedIDs();
53175                 if (ids.length !== 1 || ids[0] !== tankId) return;
53176
53177                 timeout(function() {
53178                     var node = selectMenuItem('circularize').node();
53179                     if (!node) return;
53180                     continueTo(clickCircle);
53181                 }, 300);  // after menu visible
53182             });
53183
53184             revealTank(tank, t('intro.buildings.rightclick_tank'));
53185
53186             context.map().on('move.intro drawn.intro', function() {
53187                 revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
53188             });
53189
53190             context.history().on('change.intro', function() {
53191                 continueTo(rightClickTank);
53192             });
53193
53194         }, 600);
53195
53196         function continueTo(nextStep) {
53197             context.on('enter.intro', null);
53198             context.map().on('move.intro drawn.intro', null);
53199             context.history().on('change.intro', null);
53200             nextStep();
53201         }
53202     }
53203
53204
53205     function clickCircle() {
53206         if (!tankId) return chapter.restart();
53207         var entity = context.hasEntity(tankId);
53208         if (!entity) return continueTo(rightClickTank);
53209
53210         var node = selectMenuItem('circularize').node();
53211         if (!node) { return continueTo(rightClickTank); }
53212
53213         var wasChanged = false;
53214         var menuCoords = context.map().mouseCoordinates();
53215
53216         revealEditMenu(menuCoords,
53217             t('intro.buildings.circle_tank', { button: icon('#operation-circularize', 'pre-text') })
53218         );
53219
53220         context.on('enter.intro', function(mode) {
53221             if (mode.id === 'browse') {
53222                 continueTo(rightClickTank);
53223             } else if (mode.id === 'move' || mode.id === 'rotate') {
53224                 continueTo(retryClickCircle);
53225             }
53226         });
53227
53228         context.map().on('move.intro drawn.intro', function() {
53229             var node = selectMenuItem('circularize').node();
53230             if (!wasChanged && !node) { return continueTo(rightClickTank); }
53231
53232             revealEditMenu(menuCoords,
53233                 t('intro.buildings.circle_tank', { button: icon('#operation-circularize', 'pre-text') }),
53234                 { duration: 0 }
53235             );
53236         });
53237
53238         context.history().on('change.intro', function() {
53239             wasChanged = true;
53240             context.history().on('change.intro', null);
53241
53242             // Something changed.  Wait for transition to complete and check undo annotation.
53243             timeout(function() {
53244                 if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
53245                     continueTo(play);
53246                 } else {
53247                     continueTo(retryClickCircle);
53248                 }
53249             }, 500);  // after transitioned actions
53250         });
53251
53252         function continueTo(nextStep) {
53253             context.on('enter.intro', null);
53254             context.map().on('move.intro drawn.intro', null);
53255             context.history().on('change.intro', null);
53256             nextStep();
53257         }
53258     }
53259
53260
53261     function retryClickCircle() {
53262         context.enter(modeBrowse(context));
53263
53264         revealTank(tank, t('intro.buildings.retry_circle'), {
53265             buttonText: t('intro.ok'),
53266             buttonCallback: function() { continueTo(rightClickTank); }
53267         });
53268
53269         function continueTo(nextStep) {
53270             nextStep();
53271         }
53272     }
53273
53274
53275     function play() {
53276         dispatch$$1.call('done');
53277         reveal('#id-container',
53278             t('intro.buildings.play', { next: t('intro.startediting.title') }), {
53279                 tooltipBox: '.intro-nav-wrap .chapter-startEditing',
53280                 buttonText: t('intro.ok'),
53281                 buttonCallback: function() { reveal('#id-container'); }
53282             }
53283         );
53284     }
53285
53286
53287     chapter.enter = function() {
53288         addHouse();
53289     };
53290
53291
53292     chapter.exit = function() {
53293         timeouts.forEach(window.clearTimeout);
53294         context.on('enter.intro exit.intro', null);
53295         context.map().on('move.intro drawn.intro', null);
53296         context.history().on('change.intro', null);
53297         d3_select('.inspector-wrap').on('wheel.intro', null);
53298         d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
53299         d3_select('.more-fields .combobox-input').on('click.intro', null);
53300     };
53301
53302
53303     chapter.restart = function() {
53304         chapter.exit();
53305         chapter.enter();
53306     };
53307
53308
53309     return utilRebind(chapter, dispatch$$1, 'on');
53310 }
53311
53312 function uiModal(selection$$1, blocking) {
53313     var keybinding = d3keybinding('modal');
53314     var previous = selection$$1.select('div.modal');
53315     var animate = previous.empty();
53316
53317     previous.transition()
53318         .duration(200)
53319         .style('opacity', 0)
53320         .remove();
53321
53322     var shaded = selection$$1
53323         .append('div')
53324         .attr('class', 'shaded')
53325         .style('opacity', 0);
53326
53327     shaded.close = function() {
53328         shaded
53329             .transition()
53330             .duration(200)
53331             .style('opacity',0)
53332             .remove();
53333
53334         modal
53335             .transition()
53336             .duration(200)
53337             .style('top','0px');
53338
53339         keybinding.off();
53340     };
53341
53342
53343     var modal = shaded
53344         .append('div')
53345         .attr('class', 'modal fillL col6');
53346
53347     if (!blocking) {
53348         shaded.on('click.remove-modal', function() {
53349             if (event.target === this) {
53350                 shaded.close();
53351             }
53352         });
53353
53354         modal.append('button')
53355             .attr('class', 'close')
53356             .on('click', shaded.close)
53357             .call(svgIcon('#icon-close'));
53358
53359         keybinding
53360             .on('⌫', shaded.close)
53361             .on('⎋', shaded.close);
53362
53363         d3_select(document)
53364             .call(keybinding);
53365     }
53366
53367     modal
53368         .append('div')
53369         .attr('class', 'content');
53370
53371     if (animate) {
53372         shaded.transition().style('opacity', 1);
53373     } else {
53374         shaded.style('opacity', 1);
53375     }
53376
53377
53378     return shaded;
53379 }
53380
53381 function uiIntroStartEditing(context, reveal) {
53382     var dispatch$$1 = dispatch('done', 'startEditing'),
53383         modalSelection = d3_select(null);
53384
53385
53386     var chapter = {
53387         title: 'intro.startediting.title'
53388     };
53389
53390     function showHelp() {
53391         reveal('.map-control.help-control',
53392             t('intro.startediting.help', { button: icon('#icon-help', 'pre-text'), key: t('help.key') }), {
53393                 buttonText: t('intro.ok'),
53394                 buttonCallback: function() { shortcuts(); }
53395             }
53396         );
53397     }
53398
53399     function shortcuts() {
53400         reveal('.map-control.help-control',
53401             t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
53402                 buttonText: t('intro.ok'),
53403                 buttonCallback: function() { showSave(); }
53404             }
53405         );
53406     }
53407
53408     function showSave() {
53409         d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
53410         reveal('#bar button.save',
53411             t('intro.startediting.save'), {
53412                 buttonText: t('intro.ok'),
53413                 buttonCallback: function() { showStart(); }
53414             }
53415         );
53416     }
53417
53418     function showStart() {
53419         d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
53420
53421         modalSelection = uiModal(context.container());
53422
53423         modalSelection.select('.modal')
53424             .attr('class', 'modal-splash modal col6');
53425
53426         modalSelection.selectAll('.close').remove();
53427
53428         var startbutton = modalSelection.select('.content')
53429             .attr('class', 'fillL')
53430             .append('button')
53431                 .attr('class', 'modal-section huge-modal-button')
53432                 .on('click', function() {
53433                     modalSelection.remove();
53434                 });
53435
53436             startbutton
53437                 .append('svg')
53438                 .attr('class', 'illustration')
53439                 .append('use')
53440                 .attr('xlink:href', '#logo-walkthrough');
53441
53442             startbutton
53443                 .append('h2')
53444                 .text(t('intro.startediting.start'));
53445
53446         dispatch$$1.call('startEditing');
53447     }
53448
53449
53450     chapter.enter = function() {
53451         showHelp();
53452     };
53453
53454
53455     chapter.exit = function() {
53456         modalSelection.remove();
53457         d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
53458     };
53459
53460
53461     return utilRebind(chapter, dispatch$$1, 'on');
53462 }
53463
53464 var chapterUi = {
53465     welcome: uiIntroWelcome,
53466     navigation: uiIntroNavigation,
53467     point: uiIntroPoint,
53468     area: uiIntroArea,
53469     line: uiIntroLine,
53470     building: uiIntroBuilding,
53471     startEditing: uiIntroStartEditing
53472 };
53473
53474 var chapterFlow = [
53475     'welcome',
53476     'navigation',
53477     'point',
53478     'area',
53479     'line',
53480     'building',
53481     'startEditing'
53482 ];
53483
53484
53485 function uiIntro(context) {
53486     var introGraph = {},
53487         currChapter;
53488
53489
53490     // create entities for intro graph and localize names
53491     for (var id in dataIntroGraph) {
53492         introGraph[id] = osmEntity$$1(localize(dataIntroGraph[id]));
53493     }
53494
53495
53496     function intro(selection$$1) {
53497         context.enter(modeBrowse(context));
53498
53499         // Save current map state
53500         var osm = context.connection(),
53501             history = context.history().toJSON(),
53502             hash = window.location.hash,
53503             center = context.map().center(),
53504             zoom = context.map().zoom(),
53505             background = context.background().baseLayerSource(),
53506             overlays = context.background().overlayLayerSources(),
53507             opacity = d3_selectAll('#map .layer-background').style('opacity'),
53508             loadedTiles = osm && osm.loadedTiles(),
53509             baseEntities = context.history().graph().base().entities,
53510             countryCode = services.geocoder.countryCode;
53511
53512         // Block saving
53513         context.inIntro(true);
53514
53515         // Load semi-real data used in intro
53516         if (osm) { osm.toggle(false).reset(); }
53517         context.history().reset();
53518         context.history().merge(values$1(coreGraph$$1().load(introGraph).entities));
53519         context.history().checkpoint('initial');
53520
53521         var esri = context.background().findSource('EsriWorldImagery');
53522         if (esri) {
53523             context.background().baseLayerSource(esri);
53524         } else {
53525             context.background().bing();
53526         }
53527         overlays.forEach(function (d) {
53528             context.background().toggleOverlayLayer(d);
53529         });
53530
53531         // Mock geocoder
53532         services.geocoder.countryCode = function(location, callback) {
53533             callback(null, t('intro.graph.countrycode'));
53534         };
53535
53536         d3_selectAll('#map .layer-background').style('opacity', 1);
53537
53538         var curtain = uiCurtain();
53539         selection$$1.call(curtain);
53540
53541         // store that the user started the walkthrough..
53542         context.storage('walkthrough_started', 'yes');
53543
53544         // restore previous walkthrough progress..
53545         var storedProgress = context.storage('walkthrough_progress') || '';
53546         var progress = storedProgress.split(';').filter(Boolean);
53547
53548         var chapters = chapterFlow.map(function(chapter, i) {
53549             var s = chapterUi[chapter](context, curtain.reveal)
53550                 .on('done', function() {
53551                     context.presets().init();  // clear away "recent" presets
53552
53553                     buttons.filter(function(d) {
53554                         return d.title === s.title;
53555                     }).classed('finished', true);
53556
53557                     if (i < chapterFlow.length - 1) {
53558                         var next = chapterFlow[i + 1];
53559                         d3_select('button.chapter-' + next)
53560                             .classed('next', true);
53561                     }
53562
53563                     // store walkthrough progress..
53564                     progress.push(chapter);
53565                     context.storage('walkthrough_progress', uniq(progress).join(';'));
53566                 });
53567             return s;
53568         });
53569
53570         chapters[chapters.length - 1].on('startEditing', function() {
53571             // store walkthrough progress..
53572             progress.push('startEditing');
53573             context.storage('walkthrough_progress', uniq(progress).join(';'));
53574
53575             // store if walkthrough is completed..
53576             var incomplete = difference(chapterFlow, progress);
53577             if (!incomplete.length) {
53578                 context.storage('walkthrough_completed', 'yes');
53579             }
53580
53581             curtain.remove();
53582             navwrap.remove();
53583             d3_selectAll('#map .layer-background').style('opacity', opacity);
53584             if (osm) { osm.toggle(true).reset().loadedTiles(loadedTiles); }
53585             context.history().reset().merge(values$1(baseEntities));
53586             context.background().baseLayerSource(background);
53587             overlays.forEach(function (d) { context.background().toggleOverlayLayer(d); });
53588             if (history) { context.history().fromJSON(history, false); }
53589             context.map().centerZoom(center, zoom);
53590             window.location.replace(hash);
53591             services.geocoder.countryCode = countryCode;
53592             context.inIntro(false);
53593         });
53594
53595         var navwrap = selection$$1
53596             .append('div')
53597             .attr('class', 'intro-nav-wrap fillD');
53598
53599         navwrap
53600             .append('svg')
53601             .attr('class', 'intro-nav-wrap-logo')
53602             .append('use')
53603             .attr('xlink:href', '#logo-walkthrough');
53604
53605         var buttonwrap = navwrap
53606             .append('div')
53607             .attr('class', 'joined')
53608             .selectAll('button.chapter');
53609
53610         var buttons = buttonwrap
53611             .data(chapters)
53612             .enter()
53613             .append('button')
53614             .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
53615             .on('click', enterChapter);
53616
53617         buttons
53618             .append('span')
53619             .text(function(d) { return t(d.title); });
53620
53621         buttons
53622             .append('span')
53623             .attr('class', 'status')
53624             .call(svgIcon((textDirection === 'rtl' ? '#icon-backward' : '#icon-forward'), 'inline'));
53625
53626         enterChapter(chapters[0]);
53627
53628
53629         function enterChapter(newChapter) {
53630             if (currChapter) { currChapter.exit(); }
53631             context.enter(modeBrowse(context));
53632
53633             currChapter = newChapter;
53634             currChapter.enter();
53635
53636             buttons
53637                 .classed('next', false)
53638                 .classed('active', function(d) {
53639                     return d.title === currChapter.title;
53640                 });
53641         }
53642     }
53643
53644
53645     return intro;
53646 }
53647
53648 function uiTooltipHtml(text, key, heading) {
53649     var s = '';
53650
53651     if (heading) {
53652         s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
53653     }
53654     if (text) {
53655         s += '<div class="tooltip-text"><span>' + text + '</span></div>';
53656     }
53657     if (key) {
53658         s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
53659             '<span class="keyhint">' + key + '</span></div>';
53660     }
53661
53662     return s;
53663 }
53664
53665 function uiMapData(context) {
53666     var key = t('map_data.key');
53667     var features = context.features().keys();
53668     var layers = context.layers();
53669     var fills = ['wireframe', 'partial', 'full'];
53670
53671     var _fillSelected = context.storage('area-fill') || 'partial';
53672     var _shown = false;
53673     var _dataLayerContainer = d3_select(null);
53674     var _fillList = d3_select(null);
53675     var _featureList = d3_select(null);
53676
53677
53678     function showsFeature(d) {
53679         return context.features().enabled(d);
53680     }
53681
53682
53683     function autoHiddenFeature(d) {
53684         return context.features().autoHidden(d);
53685     }
53686
53687
53688     function clickFeature(d) {
53689         context.features().toggle(d);
53690         update();
53691     }
53692
53693
53694     function showsFill(d) {
53695         return _fillSelected === d;
53696     }
53697
53698
53699     function setFill(d) {
53700         fills.forEach(function(opt) {
53701             context.surface().classed('fill-' + opt, Boolean(opt === d));
53702         });
53703
53704         _fillSelected = d;
53705         context.storage('area-fill', d);
53706         if (d !== 'wireframe') {
53707             context.storage('area-fill-toggle', d);
53708         }
53709         update();
53710     }
53711
53712
53713     function showsLayer(which) {
53714         var layer = layers.layer(which);
53715         if (layer) {
53716             return layer.enabled();
53717         }
53718         return false;
53719     }
53720
53721
53722     function setLayer(which, enabled) {
53723         var layer = layers.layer(which);
53724         if (layer) {
53725             layer.enabled(enabled);
53726             update();
53727         }
53728     }
53729
53730
53731     function toggleLayer(which) {
53732         setLayer(which, !showsLayer(which));
53733     }
53734
53735
53736     function drawPhotoItems(selection$$1) {
53737         var photoKeys = ['mapillary-images', 'mapillary-signs', 'openstreetcam-images'];
53738         var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; });
53739         var data = photoLayers.filter(function(obj) { return obj.layer.supported(); });
53740
53741         function layerSupported(d) {
53742             return d.layer && d.layer.supported();
53743         }
53744         function layerEnabled(d) {
53745             return layerSupported(d) && d.layer.enabled();
53746         }
53747
53748         var ul = selection$$1
53749             .selectAll('.layer-list-photos')
53750             .data([0]);
53751
53752         ul = ul.enter()
53753             .append('ul')
53754             .attr('class', 'layer-list layer-list-photos')
53755             .merge(ul);
53756
53757         var li = ul.selectAll('.list-item-photos')
53758             .data(data);
53759
53760         li.exit()
53761             .remove();
53762
53763         var liEnter = li.enter()
53764             .append('li')
53765             .attr('class', function(d) { return 'list-item-photos list-item-' + d.id; });
53766
53767         var labelEnter = liEnter
53768             .append('label')
53769             .each(function(d) {
53770                 d3_select(this)
53771                     .call(tooltip()
53772                         .title(t(d.id.replace('-', '_') + '.tooltip'))
53773                         .placement('top')
53774                     );
53775             });
53776
53777         labelEnter
53778             .append('input')
53779             .attr('type', 'checkbox')
53780             .on('change', function(d) { toggleLayer(d.id); });
53781
53782         labelEnter
53783             .append('span')
53784             .text(function(d) { return t(d.id.replace('-', '_') + '.title'); });
53785
53786
53787         // Update
53788         li = li
53789             .merge(liEnter);
53790
53791         li
53792             .classed('active', layerEnabled)
53793             .selectAll('input')
53794             .property('checked', layerEnabled);
53795     }
53796
53797
53798     function drawOsmItem(selection$$1) {
53799         var osm = layers.layer('osm'),
53800             showsOsm = osm.enabled();
53801
53802         var ul = selection$$1
53803             .selectAll('.layer-list-osm')
53804             .data(osm ? [0] : []);
53805
53806         // Exit
53807         ul.exit()
53808             .remove();
53809
53810         // Enter
53811         var ulEnter = ul.enter()
53812             .append('ul')
53813             .attr('class', 'layer-list layer-list-osm');
53814
53815         var liEnter = ulEnter
53816             .append('li')
53817             .attr('class', 'list-item-osm');
53818
53819         var labelEnter = liEnter
53820             .append('label')
53821             .call(tooltip()
53822                 .title(t('map_data.layers.osm.tooltip'))
53823                 .placement('top')
53824             );
53825
53826         labelEnter
53827             .append('input')
53828             .attr('type', 'checkbox')
53829             .on('change', function() { toggleLayer('osm'); });
53830
53831         labelEnter
53832             .append('span')
53833             .text(t('map_data.layers.osm.title'));
53834
53835         // Update
53836         ul = ul
53837             .merge(ulEnter);
53838
53839         ul.selectAll('.list-item-osm')
53840             .classed('active', showsOsm)
53841             .selectAll('input')
53842             .property('checked', showsOsm);
53843     }
53844
53845
53846     function drawGpxItem(selection$$1) {
53847         var gpx = layers.layer('gpx'),
53848             hasGpx = gpx && gpx.hasGpx(),
53849             showsGpx = hasGpx && gpx.enabled();
53850
53851         var ul = selection$$1
53852             .selectAll('.layer-list-gpx')
53853             .data(gpx ? [0] : []);
53854
53855         // Exit
53856         ul.exit()
53857             .remove();
53858
53859         // Enter
53860         var ulEnter = ul.enter()
53861             .append('ul')
53862             .attr('class', 'layer-list layer-list-gpx');
53863
53864         var liEnter = ulEnter
53865             .append('li')
53866             .attr('class', 'list-item-gpx');
53867
53868         liEnter
53869             .append('button')
53870             .attr('class', 'list-item-gpx-extent')
53871             .call(tooltip()
53872                 .title(t('gpx.zoom'))
53873                 .placement((textDirection === 'rtl') ? 'right' : 'left')
53874             )
53875             .on('click', function() {
53876                 event.preventDefault();
53877                 event.stopPropagation();
53878                 gpx.fitZoom();
53879             })
53880             .call(svgIcon('#icon-search'));
53881
53882         liEnter
53883             .append('button')
53884             .attr('class', 'list-item-gpx-browse')
53885             .call(tooltip()
53886                 .title(t('gpx.browse'))
53887                 .placement((textDirection === 'rtl') ? 'right' : 'left')
53888             )
53889             .on('click', function() {
53890                 d3_select(document.createElement('input'))
53891                     .attr('type', 'file')
53892                     .on('change', function() {
53893                         gpx.files(event.target.files);
53894                     })
53895                     .node().click();
53896             })
53897             .call(svgIcon('#icon-geolocate'));
53898
53899         var labelEnter = liEnter
53900             .append('label')
53901             .call(tooltip()
53902                 .title(t('gpx.drag_drop'))
53903                 .placement('top')
53904             );
53905
53906         labelEnter
53907             .append('input')
53908             .attr('type', 'checkbox')
53909             .on('change', function() { toggleLayer('gpx'); });
53910
53911         labelEnter
53912             .append('span')
53913             .text(t('gpx.local_layer'));
53914
53915         // Update
53916         ul = ul
53917             .merge(ulEnter);
53918
53919         ul.selectAll('.list-item-gpx')
53920             .classed('active', showsGpx)
53921             .selectAll('label')
53922             .classed('deemphasize', !hasGpx)
53923             .selectAll('input')
53924             .property('disabled', !hasGpx)
53925             .property('checked', showsGpx);
53926     }
53927
53928
53929     function drawListItems(selection$$1, data, type, name, change, active) {
53930         var items = selection$$1.selectAll('li')
53931             .data(data);
53932
53933         // Exit
53934         items.exit()
53935             .remove();
53936
53937         // Enter
53938         var enter = items.enter()
53939             .append('li')
53940             .attr('class', 'layer')
53941             .call(tooltip()
53942                 .html(true)
53943                 .title(function(d) {
53944                     var tip = t(name + '.' + d + '.tooltip'),
53945                         key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
53946
53947                     if (name === 'feature' && autoHiddenFeature(d)) {
53948                         var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
53949                         tip += '<div>' + msg + '</div>';
53950                     }
53951                     return uiTooltipHtml(tip, key);
53952                 })
53953                 .placement('top')
53954             );
53955
53956         var label = enter
53957             .append('label');
53958
53959         label
53960             .append('input')
53961             .attr('type', type)
53962             .attr('name', name)
53963             .on('change', change);
53964
53965         label
53966             .append('span')
53967             .text(function(d) { return t(name + '.' + d + '.description'); });
53968
53969         // Update
53970         items = items
53971             .merge(enter);
53972
53973         items
53974             .classed('active', active)
53975             .selectAll('input')
53976             .property('checked', active)
53977             .property('indeterminate', function(d) {
53978                 return (name === 'feature' && autoHiddenFeature(d));
53979             });
53980     }
53981
53982
53983     function renderDataLayers(selection$$1) {
53984         var container = selection$$1.selectAll('data-layer-container')
53985             .data([0]);
53986
53987         _dataLayerContainer = container.enter()
53988             .append('div')
53989             .attr('class', 'data-layer-container')
53990             .merge(container);
53991     }
53992
53993
53994     function renderFillList(selection$$1) {
53995         var container = selection$$1.selectAll('layer-fill-list')
53996             .data([0]);
53997
53998         _fillList = container.enter()
53999             .append('ul')
54000             .attr('class', 'layer-list layer-fill-list')
54001             .merge(container);
54002     }
54003
54004
54005     function renderFeatureList(selection$$1) {
54006         var container = selection$$1.selectAll('layer-feature-list')
54007             .data([0]);
54008
54009         _featureList = container.enter()
54010             .append('ul')
54011             .attr('class', 'layer-list layer-feature-list')
54012             .merge(container);
54013     }
54014
54015
54016     function update() {
54017         _dataLayerContainer
54018             .call(drawOsmItem)
54019             .call(drawPhotoItems)
54020             .call(drawGpxItem);
54021
54022         _fillList
54023             .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill);
54024
54025         _featureList
54026             .call(drawListItems, features, 'checkbox', 'feature', clickFeature, showsFeature);
54027     }
54028
54029
54030     function toggleWireframe() {
54031         if (event) {
54032             event.preventDefault();
54033             event.stopPropagation();
54034         }
54035
54036         if (_fillSelected === 'wireframe') {
54037             _fillSelected = context.storage('area-fill-toggle') || 'partial';
54038         } else {
54039             _fillSelected = 'wireframe';
54040         }
54041
54042         setFill(_fillSelected);
54043         context.map().pan([0,0]);  // trigger a redraw
54044     }
54045
54046
54047     function mapData(selection$$1) {
54048
54049         function hidePane() {
54050             setVisible(false);
54051         }
54052
54053         function togglePane() {
54054             if (event) event.preventDefault();
54055             paneTooltip.hide(button);
54056             setVisible(!button.classed('active'));
54057         }
54058
54059         function setVisible(show) {
54060             if (show !== _shown) {
54061                 button.classed('active', show);
54062                 _shown = show;
54063
54064                 if (show) {
54065                     uiBackground.hidePane();
54066                     uiHelp.hidePane();
54067                     update();
54068
54069                     pane
54070                         .style('display', 'block')
54071                         .style('right', '-300px')
54072                         .transition()
54073                         .duration(200)
54074                         .style('right', '0px');
54075
54076                 } else {
54077                     pane
54078                         .style('display', 'block')
54079                         .style('right', '0px')
54080                         .transition()
54081                         .duration(200)
54082                         .style('right', '-300px')
54083                         .on('end', function() {
54084                             d3_select(this).style('display', 'none');
54085                         });
54086                 }
54087             }
54088         }
54089
54090
54091         var pane = selection$$1
54092             .append('div')
54093             .attr('class', 'fillL map-overlay col3 content hide');
54094
54095         var paneTooltip = tooltip()
54096             .placement((textDirection === 'rtl') ? 'right' : 'left')
54097             .html(true)
54098             .title(uiTooltipHtml(t('map_data.description'), key));
54099
54100         var button = selection$$1
54101             .append('button')
54102             .attr('tabindex', -1)
54103             .on('click', togglePane)
54104             .call(svgIcon('#icon-data', 'light'))
54105             .call(paneTooltip);
54106
54107
54108         pane
54109             .append('h2')
54110             .text(t('map_data.title'));
54111
54112
54113         // data layers
54114         pane
54115             .append('div')
54116             .attr('class', 'map-data-data-layers')
54117             .call(uiDisclosure(context, 'data_layers', true)
54118                 .title(t('map_data.data_layers'))
54119                 .content(renderDataLayers)
54120             );
54121
54122         // area fills
54123         pane
54124             .append('div')
54125             .attr('class', 'map-data-area-fills')
54126             .call(uiDisclosure(context, 'fill_area', false)
54127                 .title(t('map_data.fill_area'))
54128                 .content(renderFillList)
54129             );
54130
54131         // feature filters
54132         pane
54133             .append('div')
54134             .attr('class', 'map-data-feature-filters')
54135             .call(uiDisclosure(context, 'map_features', false)
54136                 .title(t('map_data.map_features'))
54137                 .content(renderFeatureList)
54138             );
54139
54140
54141         // add listeners
54142         context.features()
54143             .on('change.map_data-update', update);
54144
54145         update();
54146         setFill(_fillSelected);
54147
54148         var keybinding = d3keybinding('features')
54149             .on(key, togglePane)
54150             .on(t('area_fill.wireframe.key'), toggleWireframe)
54151             .on([t('background.key'), t('help.key')], hidePane);
54152
54153         d3_select(document)
54154             .call(keybinding);
54155
54156         uiMapData.hidePane = hidePane;
54157         uiMapData.togglePane = togglePane;
54158         uiMapData.setVisible = setVisible;
54159     }
54160
54161     return mapData;
54162 }
54163
54164 function uiShortcuts() {
54165     var detected = utilDetect();
54166     var activeTab = 0;
54167     var modalSelection;
54168     var savedSelection;
54169
54170
54171     var keybinding = d3keybinding('shortcuts')
54172         .on(t('shortcuts.toggle.key'), function () {
54173             if (d3_selectAll('.modal-shortcuts').size()) {  // already showing
54174                 if (modalSelection) {
54175                     modalSelection.close();
54176                     modalSelection = null;
54177                 }
54178             } else {
54179                 modalSelection = uiModal(savedSelection);
54180                 shortcutsModal(modalSelection);
54181             }
54182         });
54183
54184     d3_select(document)
54185         .call(keybinding);
54186
54187
54188
54189     function shortcutsModal(modalSelection) {
54190         modalSelection.select('.modal')
54191             .classed('modal-shortcuts', true);
54192
54193         var shortcutsModal = modalSelection.select('.content');
54194
54195         shortcutsModal
54196             .append('div')
54197             .attr('class', 'modal-section')
54198             .append('h3')
54199             .text(t('shortcuts.title'));
54200
54201         shortcutsModal
54202             .call(render);
54203     }
54204
54205
54206     function render(selection$$1) {
54207         var wrapper = selection$$1
54208             .selectAll('.wrapper')
54209             .data([0]);
54210
54211         var wrapperEnter = wrapper
54212             .enter()
54213             .append('div')
54214             .attr('class', 'wrapper modal-section');
54215
54216         var tabsBar = wrapperEnter
54217             .append('div')
54218             .attr('class', 'tabs-bar');
54219
54220         var shortcutsList = wrapperEnter
54221             .append('div')
54222             .attr('class', 'shortcuts-list');
54223
54224         wrapper = wrapper.merge(wrapperEnter);
54225
54226         var tabs = tabsBar
54227             .selectAll('.tab')
54228             .data(dataShortcuts);
54229
54230         var tabsEnter = tabs
54231             .enter()
54232             .append('div')
54233             .attr('class', 'tab')
54234             .on('click', function (d, i) {
54235                 activeTab = i;
54236                 render(selection$$1);
54237             });
54238
54239         tabsEnter
54240             .append('span')
54241             .text(function (d) { return t(d.text); });
54242
54243         tabs = tabs
54244             .merge(tabsEnter);
54245
54246         // Update
54247         wrapper.selectAll('.tab')
54248             .classed('active', function (d, i) {
54249                 return i === activeTab;
54250             });
54251
54252
54253         var shortcuts = shortcutsList
54254             .selectAll('.shortcut-tab')
54255             .data(dataShortcuts);
54256
54257         var shortcutsEnter = shortcuts
54258             .enter()
54259             .append('div')
54260             .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
54261
54262         var columnsEnter = shortcutsEnter
54263             .selectAll('.shortcut-column')
54264             .data(function (d) { return d.columns; })
54265             .enter()
54266             .append('table')
54267             .attr('class', 'shortcut-column');
54268
54269         var rowsEnter = columnsEnter
54270             .selectAll('.shortcut-row')
54271             .data(function (d) { return d.rows; })
54272             .enter()
54273             .append('tr')
54274             .attr('class', 'shortcut-row');
54275
54276
54277         var sectionRows = rowsEnter
54278             .filter(function (d) { return !d.shortcuts; });
54279
54280         sectionRows
54281             .append('td');
54282
54283         sectionRows
54284             .append('td')
54285             .attr('class', 'shortcut-section')
54286             .append('h3')
54287             .text(function (d) { return t(d.text); });
54288
54289
54290         var shortcutRows = rowsEnter
54291             .filter(function (d) { return d.shortcuts; });
54292
54293         var shortcutKeys = shortcutRows
54294             .append('td')
54295             .attr('class', 'shortcut-keys');
54296
54297         var modifierKeys = shortcutKeys
54298             .filter(function (d) { return d.modifiers; });
54299
54300         modifierKeys
54301             .selectAll('kbd.modifier')
54302             .data(function (d) {
54303                 if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
54304                     return ['⌘'];
54305                 } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
54306                     return [];
54307                 } else {
54308                     return d.modifiers;
54309                 }
54310             })
54311             .enter()
54312             .each(function () {
54313                 var selection$$1 = d3_select(this);
54314
54315                 selection$$1
54316                     .append('kbd')
54317                     .attr('class', 'modifier')
54318                     .text(function (d) { return uiCmd.display(d); });
54319
54320                 selection$$1
54321                     .append('span')
54322                     .text('+');
54323             });
54324
54325
54326         shortcutKeys
54327             .selectAll('kbd.shortcut')
54328             .data(function (d) {
54329                 var arr = d.shortcuts;
54330                 if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
54331                     arr = ['Y'];
54332                 } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
54333                     arr = ['F11'];
54334                 }
54335
54336                 return arr.map(function(s) {
54337                     return {
54338                         shortcut: s,
54339                         separator: d.separator
54340                     };
54341                 });
54342             })
54343             .enter()
54344             .each(function (d, i, nodes) {
54345                 var selection$$1 = d3_select(this);
54346                 var click = d.shortcut.toLowerCase().match(/(.*).click/);
54347
54348                 if (click && click[1]) {
54349                     selection$$1
54350                         .call(svgIcon('#walkthrough-mouse', 'mouseclick', click[1]));
54351                 } else {
54352                     selection$$1
54353                         .append('kbd')
54354                         .attr('class', 'shortcut')
54355                         .text(function (d) {
54356                             var key = d.shortcut;
54357                             return key.indexOf('.') !== -1 ? uiCmd.display(t(key)) : uiCmd.display(key);
54358                         });
54359                 }
54360
54361                 if (i < nodes.length - 1) {
54362                     selection$$1
54363                         .append('span')
54364                         .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
54365                 }
54366             });
54367
54368
54369         shortcutKeys
54370             .filter(function(d) { return d.gesture; })
54371             .each(function () {
54372                 var selection$$1 = d3_select(this);
54373
54374                 selection$$1
54375                     .append('span')
54376                     .text('+');
54377
54378                 selection$$1
54379                     .append('span')
54380                     .attr('class', 'gesture')
54381                     .text(function (d) { return t(d.gesture); });
54382             });
54383
54384
54385         shortcutRows
54386             .append('td')
54387             .attr('class', 'shortcut-desc')
54388             .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
54389
54390
54391         shortcuts = shortcuts
54392             .merge(shortcutsEnter);
54393
54394         // Update
54395         wrapper.selectAll('.shortcut-tab')
54396             .style('display', function (d, i) {
54397                 return i === activeTab ? 'flex' : 'none';
54398             });
54399     }
54400
54401
54402     return function(selection$$1, show) {
54403         savedSelection = selection$$1;
54404         if (show) {
54405             modalSelection = uiModal(selection$$1);
54406             shortcutsModal(modalSelection);
54407         }
54408     };
54409 }
54410
54411 function uiHelp(context) {
54412     var key = t('help.key');
54413
54414     var docKeys = [
54415         ['help', [
54416             'welcome',
54417             'open_data_h',
54418             'open_data',
54419             'before_start_h',
54420             'before_start',
54421             'open_source_h',
54422             'open_source',
54423             'open_source_help'
54424         ]],
54425         ['overview', [
54426             'navigation_h',
54427             'navigation_drag',
54428             'navigation_zoom',
54429             'features_h',
54430             'features',
54431             'nodes_ways'
54432         ]],
54433         ['editing', [
54434             'select_h',
54435             'select_left_click',
54436             'select_right_click',
54437             'multiselect_h',
54438             'multiselect_shift_click',
54439             'multiselect_lasso',
54440             'undo_redo_h',
54441             'undo_redo',
54442             'save_h',
54443             'save',
54444             'save_validation',
54445             'upload_h',
54446             'upload',
54447             'backups_h',
54448             'backups',
54449             'keyboard_h',
54450             'keyboard'
54451         ]],
54452         ['feature_editor', [
54453             'intro',
54454             'definitions',
54455             'type_h',
54456             'type',
54457             'type_picker',
54458             'fields_h',
54459             'fields_all_fields',
54460             'fields_example',
54461             'fields_add_field',
54462             'tags_h',
54463             'tags_all_tags',
54464             'tags_resources'
54465         ]],
54466         ['points', [
54467             'intro',
54468             'add_point_h',
54469             'add_point',
54470             'add_point_finish',
54471             'move_point_h',
54472             'move_point',
54473             'delete_point_h',
54474             'delete_point',
54475             'delete_point_command'
54476         ]],
54477         ['lines', [
54478             'intro',
54479             'add_line_h',
54480             'add_line',
54481             'add_line_draw',
54482             'add_line_finish',
54483             'modify_line_h',
54484             'modify_line_dragnode',
54485             'modify_line_addnode',
54486             'connect_line_h',
54487             'connect_line',
54488             'connect_line_display',
54489             'connect_line_drag',
54490             'connect_line_tag',
54491             'disconnect_line_h',
54492             'disconnect_line_command',
54493             'move_line_h',
54494             'move_line_command',
54495             'move_line_connected',
54496             'delete_line_h',
54497             'delete_line',
54498             'delete_line_command'
54499         ]],
54500         ['areas', [
54501             'intro',
54502             'point_or_area_h',
54503             'point_or_area',
54504             'add_area_h',
54505             'add_area_command',
54506             'add_area_draw',
54507             'add_area_finish',
54508             'square_area_h',
54509             'square_area_command',
54510             'modify_area_h',
54511             'modify_area_dragnode',
54512             'modify_area_addnode',
54513             'delete_area_h',
54514             'delete_area',
54515             'delete_area_command'
54516         ]],
54517         ['relations', [
54518             'intro',
54519             'edit_relation_h',
54520             'edit_relation',
54521             'edit_relation_add',
54522             'edit_relation_delete',
54523             'maintain_relation_h',
54524             'maintain_relation',
54525             'relation_types_h',
54526             'multipolygon_h',
54527             'multipolygon',
54528             'multipolygon_create',
54529             'multipolygon_merge',
54530             'turn_restriction_h',
54531             'turn_restriction',
54532             'turn_restriction_field',
54533             'turn_restriction_editing',
54534             'route_h',
54535             'route',
54536             'route_add',
54537             'boundary_h',
54538             'boundary',
54539             'boundary_add'
54540         ]],
54541         ['imagery', [
54542             'intro',
54543             'sources_h',
54544             'choosing',
54545             'sources',
54546             'offsets_h',
54547             'offset',
54548             'offset_change'
54549         ]],
54550         ['streetlevel', [
54551             'intro',
54552             'using_h',
54553             'using',
54554             'photos',
54555             'viewer'
54556         ]],
54557         ['gps', [
54558             'intro',
54559             'survey',
54560             'using_h',
54561             'using',
54562             'tracing',
54563             'upload'
54564         ]]
54565     ];
54566
54567     var headings = {
54568         'help.help.open_data_h': 3,
54569         'help.help.before_start_h': 3,
54570         'help.help.open_source_h': 3,
54571         'help.overview.navigation_h': 3,
54572         'help.overview.features_h': 3,
54573         'help.editing.select_h': 3,
54574         'help.editing.multiselect_h': 3,
54575         'help.editing.undo_redo_h': 3,
54576         'help.editing.save_h': 3,
54577         'help.editing.upload_h': 3,
54578         'help.editing.backups_h': 3,
54579         'help.editing.keyboard_h': 3,
54580         'help.feature_editor.type_h': 3,
54581         'help.feature_editor.fields_h': 3,
54582         'help.feature_editor.tags_h': 3,
54583         'help.points.add_point_h': 3,
54584         'help.points.move_point_h': 3,
54585         'help.points.delete_point_h': 3,
54586         'help.lines.add_line_h': 3,
54587         'help.lines.modify_line_h': 3,
54588         'help.lines.connect_line_h': 3,
54589         'help.lines.disconnect_line_h': 3,
54590         'help.lines.move_line_h': 3,
54591         'help.lines.delete_line_h': 3,
54592         'help.areas.point_or_area_h': 3,
54593         'help.areas.add_area_h': 3,
54594         'help.areas.square_area_h': 3,
54595         'help.areas.modify_area_h': 3,
54596         'help.areas.delete_area_h': 3,
54597         'help.relations.edit_relation_h': 3,
54598         'help.relations.maintain_relation_h': 3,
54599         'help.relations.relation_types_h': 2,
54600         'help.relations.multipolygon_h': 3,
54601         'help.relations.turn_restriction_h': 3,
54602         'help.relations.route_h': 3,
54603         'help.relations.boundary_h': 3,
54604         'help.imagery.sources_h': 3,
54605         'help.imagery.offsets_h': 3,
54606         'help.streetlevel.using_h': 3,
54607         'help.gps.using_h': 3,
54608     };
54609
54610     var replacements = {
54611         point: icon('#icon-point', 'pre-text'),
54612         line: icon('#icon-line', 'pre-text'),
54613         area: icon('#icon-area', 'pre-text'),
54614         plus: icon('#icon-plus', 'pre-text'),
54615         minus: icon('#icon-minus', 'pre-text'),
54616         orthogonalize: icon('#operation-orthogonalize', 'pre-text'),
54617         disconnect: icon('#operation-disconnect', 'pre-text'),
54618         layers: icon('#icon-layers', 'pre-text'),
54619         data: icon('#icon-data', 'pre-text'),
54620         inspect: icon('#icon-inspect', 'pre-text'),
54621         move: icon('#operation-move', 'pre-text'),
54622         merge: icon('#operation-merge', 'pre-text'),
54623         delete: icon('#operation-delete', 'pre-text'),
54624         close: icon('#icon-close', 'pre-text'),
54625         undo: icon(textDirection === 'rtl' ? '#icon-redo' : '#icon-undo', 'pre-text'),
54626         redo: icon(textDirection === 'rtl' ? '#icon-undo' : '#icon-redo', 'pre-text'),
54627         save: icon('#icon-save', 'pre-text'),
54628         leftclick: icon('#walkthrough-mouse', 'pre-text mouseclick', 'left'),
54629         rightclick: icon('#walkthrough-mouse', 'pre-text mouseclick', 'right'),
54630         shift: uiCmd.display('⇧'),
54631         alt: uiCmd.display('⌥'),
54632         return: uiCmd.display('↵'),
54633         version: context.version
54634     };
54635
54636     // For each section, squash all the texts into a single markdown document
54637     var docs = docKeys.map(function(key) {
54638         var helpkey = 'help.' + key[0];
54639         var text = key[1].reduce(function(all, part) {
54640             var subkey = helpkey + '.' + part;
54641             var depth = headings[subkey];                              // is this subkey a heading?
54642             var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
54643             return all + hhh + t(subkey, replacements) + '\n\n';
54644         }, '');
54645
54646         return {
54647             title: t(helpkey + '.title'),
54648             html: marked(text.trim())
54649         };
54650     });
54651
54652
54653     function help(selection$$1) {
54654
54655         function hidePane() {
54656             setVisible(false);
54657         }
54658
54659
54660         function togglePane() {
54661             if (event) event.preventDefault();
54662             tooltipBehavior.hide(button);
54663             setVisible(!button.classed('active'));
54664         }
54665
54666
54667         function setVisible(show) {
54668             if (show !== shown) {
54669                 button.classed('active', show);
54670                 shown = show;
54671
54672                 if (show) {
54673                     uiBackground.hidePane();
54674                     uiMapData.hidePane();
54675
54676                     pane.style('display', 'block')
54677                         .style('right', '-500px')
54678                         .transition()
54679                         .duration(200)
54680                         .style('right', '0px');
54681
54682                 } else {
54683                     pane.style('right', '0px')
54684                         .transition()
54685                         .duration(200)
54686                         .style('right', '-500px')
54687                         .on('end', function() {
54688                             d3_select(this).style('display', 'none');
54689                         });
54690                 }
54691             }
54692         }
54693
54694
54695         function clickHelp(d, i) {
54696             var rtl = (textDirection === 'rtl');
54697             pane.property('scrollTop', 0);
54698             doctitle.html(d.title);
54699
54700             body.html(d.html);
54701             body.selectAll('a')
54702                 .attr('target', '_blank');
54703             menuItems.classed('selected', function(m) {
54704                 return m.title === d.title;
54705             });
54706
54707             nav.html('');
54708             if (rtl) {
54709                 nav.call(drawNext).call(drawPrevious);
54710             } else {
54711                 nav.call(drawPrevious).call(drawNext);
54712             }
54713
54714
54715             function drawNext(selection$$1) {
54716                 if (i < docs.length - 1) {
54717                     var nextLink = selection$$1
54718                         .append('a')
54719                         .attr('class', 'next')
54720                         .on('click', function() {
54721                             clickHelp(docs[i + 1], i + 1);
54722                         });
54723
54724                     nextLink
54725                         .append('span')
54726                         .text(docs[i + 1].title)
54727                         .call(svgIcon((rtl ? '#icon-backward' : '#icon-forward'), 'inline'));
54728                 }
54729             }
54730
54731
54732             function drawPrevious(selection$$1) {
54733                 if (i > 0) {
54734                     var prevLink = selection$$1
54735                         .append('a')
54736                         .attr('class', 'previous')
54737                         .on('click', function() {
54738                             clickHelp(docs[i - 1], i - 1);
54739                         });
54740
54741                     prevLink
54742                         .call(svgIcon((rtl ? '#icon-forward' : '#icon-backward'), 'inline'))
54743                         .append('span')
54744                         .text(docs[i - 1].title);
54745                 }
54746             }
54747         }
54748
54749
54750         function clickWalkthrough() {
54751             if (context.inIntro()) return;
54752             context.container().call(uiIntro(context));
54753             setVisible(false);
54754         }
54755
54756
54757         function clickShortcuts() {
54758             context.container().call(uiShortcuts(context), true);
54759         }
54760
54761
54762         var pane = selection$$1.append('div')
54763             .attr('class', 'help-wrap map-overlay fillL col6 content hide');
54764         var tooltipBehavior = tooltip()
54765             .placement((textDirection === 'rtl') ? 'right' : 'left')
54766             .html(true)
54767             .title(uiTooltipHtml(t('help.title'), key));
54768         var button = selection$$1.append('button')
54769             .attr('tabindex', -1)
54770             .on('click', togglePane)
54771             .call(svgIcon('#icon-help', 'light'))
54772             .call(tooltipBehavior);
54773         var shown = false;
54774
54775
54776         var toc = pane
54777             .append('ul')
54778             .attr('class', 'toc');
54779
54780         var menuItems = toc.selectAll('li')
54781             .data(docs)
54782             .enter()
54783             .append('li')
54784             .append('a')
54785             .html(function(d) { return d.title; })
54786             .on('click', clickHelp);
54787
54788         var shortcuts = toc
54789             .append('li')
54790             .attr('class', 'shortcuts')
54791             .call(tooltip()
54792                 .html(true)
54793                 .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
54794                 .placement('top')
54795             )
54796             .append('a')
54797             .on('click', clickShortcuts);
54798
54799         shortcuts
54800             .append('div')
54801             .text(t('shortcuts.title'));
54802
54803         var walkthrough = toc
54804             .append('li')
54805             .attr('class', 'walkthrough')
54806             .append('a')
54807             .on('click', clickWalkthrough);
54808
54809         walkthrough
54810             .append('svg')
54811             .attr('class', 'logo logo-walkthrough')
54812             .append('use')
54813             .attr('xlink:href', '#logo-walkthrough');
54814
54815         walkthrough
54816             .append('div')
54817             .text(t('splash.walkthrough'));
54818
54819
54820         var content = pane
54821             .append('div')
54822             .attr('class', 'left-content');
54823
54824         var doctitle = content
54825             .append('h2')
54826             .text(t('help.title'));
54827
54828         var body = content
54829             .append('div')
54830             .attr('class', 'body');
54831
54832         var nav = content
54833             .append('div')
54834             .attr('class', 'nav');
54835
54836         clickHelp(docs[0], 0);
54837
54838         var keybinding = d3keybinding('help')
54839             .on(key, togglePane)
54840             .on([t('background.key'), t('map_data.key')], hidePane);
54841
54842         d3_select(document)
54843             .call(keybinding);
54844
54845         uiHelp.hidePane = hidePane;
54846         uiHelp.togglePane = togglePane;
54847         uiHelp.setVisible = setVisible;
54848     }
54849
54850     return help;
54851 }
54852
54853 function localeDateString(s) {
54854     if (!s) return null;
54855     var detected = utilDetect();
54856     var options = { day: 'numeric', month: 'short', year: 'numeric' };
54857     var d = new Date(s);
54858     if (isNaN(d.getTime())) return null;
54859     return d.toLocaleDateString(detected.locale, options);
54860 }
54861
54862 function vintageRange(vintage) {
54863     var s;
54864     if (vintage.start || vintage.end) {
54865         s = (vintage.start || '?');
54866         if (vintage.start !== vintage.end) {
54867             s += ' - ' + (vintage.end || '?');
54868         }
54869     }
54870     return s;
54871 }
54872
54873
54874 function rendererBackgroundSource(data) {
54875     var source = clone(data);
54876     var offset = [0, 0];
54877     var name = source.name;
54878     var description = source.description;
54879     var best = !!source.best;
54880     var template = source.template;
54881
54882     source.scaleExtent = data.scaleExtent || [0, 22];
54883     source.overzoom = data.overzoom !== false;
54884
54885
54886     source.offset = function(_) {
54887         if (!arguments.length) return offset;
54888         offset = _;
54889         return source;
54890     };
54891
54892
54893     source.nudge = function(_, zoomlevel) {
54894         offset[0] += _[0] / Math.pow(2, zoomlevel);
54895         offset[1] += _[1] / Math.pow(2, zoomlevel);
54896         return source;
54897     };
54898
54899
54900     source.name = function() {
54901         var id_safe = source.id.replace('.', '<TX_DOT>');
54902         return t('imagery.' + id_safe + '.name', { default: name });
54903     };
54904
54905
54906     source.description = function() {
54907         var id_safe = source.id.replace('.', '<TX_DOT>');
54908         return t('imagery.' + id_safe + '.description', { default: description });
54909     };
54910
54911
54912     source.best = function() {
54913         return best;
54914     };
54915
54916
54917     source.area = function() {
54918         if (!data.polygon) return Number.MAX_VALUE;  // worldwide
54919         var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
54920         return isNaN(area) ? 0 : area;
54921     };
54922
54923
54924     source.imageryUsed = function() {
54925         return name || source.id;
54926     };
54927
54928
54929     source.template = function(_) {
54930         if (!arguments.length) return template;
54931         if (source.id === 'custom') template = _;
54932         return source;
54933     };
54934
54935
54936     source.url = function(coord) {
54937         if (this.type === 'wms') {
54938             var tileToProjectedCoords = (function(x, y, z) {
54939                 //polyfill for IE11, PhantomJS
54940                 var sinh = Math.sinh || function(x) {
54941                     var y = Math.exp(x);
54942                     return (y - 1 / y) / 2;
54943                 };
54944
54945                 var zoomSize = Math.pow(2, z);
54946                 var lon = x / zoomSize * Math.PI * 2 - Math.PI;
54947                 var lat = Math.atan(sinh(Math.PI * (1 - 2 * y / zoomSize)));
54948
54949                 switch (this.projection) {
54950                   case 'EPSG:4326': // todo: alternative codes of WGS 84?
54951                     return {
54952                       x: lon * 180 / Math.PI,
54953                       y: lat * 180 / Math.PI
54954                     };
54955                   default: // EPSG:3857 and synonyms
54956                     var mercCoords = mercatorRaw(lon, lat);
54957                     return {
54958                       x: 20037508.34 / Math.PI * mercCoords[0],
54959                       y: 20037508.34 / Math.PI * mercCoords[1]
54960                     };
54961                 }
54962             }).bind(this);
54963             var minXmaxY = tileToProjectedCoords(coord[0], coord[1], coord[2]);
54964             var maxXminY = tileToProjectedCoords(coord[0]+1, coord[1]+1, coord[2]);
54965             return template
54966                 .replace('{width}', 256)
54967                 .replace('{height}', 256)
54968                 .replace('{proj}', this.projection)
54969                 .replace('{bbox}', minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y);
54970         }
54971         return template
54972             .replace('{x}', coord[0])
54973             .replace('{y}', coord[1])
54974             // TMS-flipped y coordinate
54975             .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
54976             .replace(/\{z(oom)?\}/, coord[2])
54977             .replace(/\{switch:([^}]+)\}/, function(s, r) {
54978                 var subdomains = r.split(',');
54979                 return subdomains[(coord[0] + coord[1]) % subdomains.length];
54980             })
54981             .replace('{u}', function() {
54982                 var u = '';
54983                 for (var zoom = coord[2]; zoom > 0; zoom--) {
54984                     var b = 0;
54985                     var mask = 1 << (zoom - 1);
54986                     if ((coord[0] & mask) !== 0) b++;
54987                     if ((coord[1] & mask) !== 0) b += 2;
54988                     u += b.toString();
54989                 }
54990                 return u;
54991             });
54992     };
54993
54994
54995     source.intersects = function(extent) {
54996         extent = extent.polygon();
54997         return !data.polygon || data.polygon.some(function(polygon) {
54998             return geoPolygonIntersectsPolygon(polygon, extent, true);
54999         });
55000     };
55001
55002
55003     source.validZoom = function(z) {
55004         return source.scaleExtent[0] <= z &&
55005             (source.overzoom || source.scaleExtent[1] > z);
55006     };
55007
55008
55009     source.isLocatorOverlay = function() {
55010         return source.id === 'mapbox_locator_overlay';
55011     };
55012
55013
55014     /* hides a source from the list, but leaves it available for use */
55015     source.isHidden = function() {
55016         return source.id === 'DigitalGlobe-Premium-vintage' ||
55017             source.id === 'DigitalGlobe-Standard-vintage';
55018     };
55019
55020
55021     source.copyrightNotices = function() {};
55022
55023
55024     source.getMetadata = function(center, tileCoord, callback) {
55025         var vintage = {
55026             start: localeDateString(source.startDate),
55027             end: localeDateString(source.endDate)
55028         };
55029         vintage.range = vintageRange(vintage);
55030
55031         var metadata = { vintage: vintage };
55032         callback(null, metadata);
55033     };
55034
55035
55036     return source;
55037 }
55038
55039
55040 rendererBackgroundSource.Bing = function(data, dispatch) {
55041     // http://msdn.microsoft.com/en-us/library/ff701716.aspx
55042     // http://msdn.microsoft.com/en-us/library/ff701701.aspx
55043
55044     data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
55045
55046     var bing = rendererBackgroundSource(data),
55047         key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU', // Same as P2 and JOSM
55048         url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' +
55049             key + '&jsonp={callback}',
55050         cache = {},
55051         inflight = {},
55052         providers = [];
55053
55054     jsonpRequest(url, function(json) {
55055         providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
55056             return {
55057                 attribution: provider.attribution,
55058                 areas: provider.coverageAreas.map(function(area) {
55059                     return {
55060                         zoom: [area.zoomMin, area.zoomMax],
55061                         extent: geoExtent$$1([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
55062                     };
55063                 })
55064             };
55065         });
55066         dispatch.call('change');
55067     });
55068
55069
55070     bing.copyrightNotices = function(zoom, extent) {
55071         zoom = Math.min(zoom, 21);
55072         return providers.filter(function(provider) {
55073             return some(provider.areas, function(area) {
55074                 return extent.intersects(area.extent) &&
55075                     area.zoom[0] <= zoom &&
55076                     area.zoom[1] >= zoom;
55077             });
55078         }).map(function(provider) {
55079             return provider.attribution;
55080         }).join(', ');
55081     };
55082
55083
55084     bing.getMetadata = function(center, tileCoord, callback) {
55085         var tileId = tileCoord.slice(0, 3).join('/'),
55086             zoom = Math.min(tileCoord[2], 21),
55087             centerPoint = center[1] + ',' + center[0],  // lat,lng
55088             url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
55089                 '?zl=' + zoom + '&key=' + key + '&jsonp={callback}';
55090
55091         if (inflight[tileId]) return;
55092
55093         if (!cache[tileId]) {
55094             cache[tileId] = {};
55095         }
55096         if (cache[tileId] && cache[tileId].metadata) {
55097             return callback(null, cache[tileId].metadata);
55098         }
55099
55100         inflight[tileId] = true;
55101         jsonpRequest(url, function(result) {
55102             delete inflight[tileId];
55103
55104             var err = (!result && 'Unknown Error') || result.errorDetails;
55105             if (err) {
55106                 return callback(err);
55107             } else {
55108                 var vintage = {
55109                     start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
55110                     end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
55111                 };
55112                 vintage.range = vintageRange(vintage);
55113
55114                 var metadata = { vintage: vintage };
55115                 cache[tileId].metadata = metadata;
55116                 return callback(null, metadata);
55117             }
55118         });
55119     };
55120
55121
55122     bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
55123
55124
55125     return bing;
55126 };
55127
55128
55129
55130 rendererBackgroundSource.Esri = function(data) {
55131
55132     // don't request blank tiles, instead overzoom real tiles - #4327
55133     // deprecated technique, but it works (for now)
55134     if (data.template.match(/blankTile/) === null) {
55135         data.template = data.template + '?blankTile=false';
55136     }
55137
55138     var esri = rendererBackgroundSource(data),
55139         cache = {},
55140         inflight = {};
55141
55142     esri.getMetadata = function(center, tileCoord, callback) {
55143         var tileId = tileCoord.slice(0, 3).join('/'),
55144             zoom = Math.min(tileCoord[2], esri.scaleExtent[1]),
55145             centerPoint = center[0] + ',' + center[1],  // long, lat (as it should be)
55146             unknown = t('info_panels.background.unknown'),
55147             metadataLayer,
55148             vintage = {},
55149             metadata = {};
55150
55151         if (inflight[tileId]) return;
55152
55153         switch (true) {
55154             case (zoom >= 20 && esri.id === 'EsriWorldImageryClarity'):
55155                 metadataLayer = 4;
55156                 break;
55157             case zoom >= 19:
55158                 metadataLayer = 3;
55159                 break;
55160             case zoom >= 17:
55161                 metadataLayer = 2;
55162                 break;
55163             case zoom >= 13:
55164                 metadataLayer = 0;
55165                 break;
55166             default:
55167                 metadataLayer = 99;
55168         }
55169
55170         var url;
55171         // build up query using the layer appropriate to the current zoom
55172         if (esri.id === 'EsriWorldImagery') {
55173             url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/';
55174         } else if (esri.id === 'EsriWorldImageryClarity') {
55175             url = 'https://serviceslab.arcgisonline.com/arcgis/rest/services/Clarity_World_Imagery/MapServer/';
55176         }
55177
55178         url += metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json&callback={callback}';
55179
55180         if (!cache[tileId]) {
55181             cache[tileId] = {};
55182         }
55183         if (cache[tileId] && cache[tileId].metadata) {
55184             return callback(null, cache[tileId].metadata);
55185         }
55186
55187         // accurate metadata is only available >= 13
55188         if (metadataLayer === 99) {
55189             vintage = {
55190                 start: null,
55191                 end: null,
55192                 range: null
55193             };
55194             metadata = {
55195                 vintage: null,
55196                 source: unknown,
55197                 description: unknown,
55198                 resolution: unknown,
55199                 accuracy: unknown
55200             };
55201
55202             callback(null, metadata);
55203
55204         } else {
55205             inflight[tileId] = true;
55206             jsonpRequest(url, function(result) {
55207                 delete inflight[tileId];
55208
55209                 var err;
55210                 if (!result) {
55211                     err = 'Unknown Error';
55212                 } else if (result.features && result.features.length < 1) {
55213                     err = 'No Results';
55214                 } else if (result.error && result.error.message) {
55215                     err = result.error.message;
55216                 }
55217
55218                 if (err) {
55219                     return callback(err);
55220                 } else {
55221                     // pass through the discrete capture date from metadata
55222                     var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
55223                     vintage = {
55224                         start: captureDate,
55225                         end: captureDate,
55226                         range: captureDate
55227                     };
55228                     metadata = {
55229                         vintage: vintage,
55230                         source: clean(result.features[0].attributes.NICE_NAME),
55231                         description: clean(result.features[0].attributes.NICE_DESC),
55232                         resolution: clean(result.features[0].attributes.SRC_RES),
55233                         accuracy: clean(result.features[0].attributes.SRC_ACC)
55234                     };
55235
55236                     // append units - meters
55237                     if (isFinite(metadata.resolution)) {
55238                         metadata.resolution += ' m';
55239                     }
55240                     if (isFinite(metadata.accuracy)) {
55241                         metadata.accuracy += ' m';
55242                     }
55243
55244                     cache[tileId].metadata = metadata;
55245                     return callback(null, metadata);
55246                 }
55247             });
55248         }
55249
55250
55251         function clean(val) {
55252             return String(val).trim() || unknown;
55253         }
55254     };
55255
55256     return esri;
55257 };
55258
55259
55260 rendererBackgroundSource.None = function() {
55261     var source = rendererBackgroundSource({ id: 'none', template: '' });
55262
55263
55264     source.name = function() {
55265         return t('background.none');
55266     };
55267
55268
55269     source.imageryUsed = function() {
55270         return 'None';
55271     };
55272
55273
55274     source.area = function() {
55275         return -1;  // sources in background pane are sorted by area
55276     };
55277
55278
55279     return source;
55280 };
55281
55282
55283 rendererBackgroundSource.Custom = function(template) {
55284     var source = rendererBackgroundSource({ id: 'custom', template: template });
55285
55286
55287     source.name = function() {
55288         return t('background.custom');
55289     };
55290
55291
55292     source.imageryUsed = function() {
55293         return 'Custom (' + source.template() + ')';
55294     };
55295
55296
55297     source.area = function() {
55298         return -2;  // sources in background pane are sorted by area
55299     };
55300
55301
55302     return source;
55303 };
55304
55305 function rendererTileLayer(context) {
55306     var tileSize = 256;
55307     var transformProp = utilPrefixCSSProperty('Transform');
55308     var geotile = d3geoTile();
55309
55310     var _projection;
55311     var _cache = {};
55312     var _tileOrigin;
55313     var _zoom;
55314     var _source;
55315
55316
55317     // blacklist overlay tiles around Null Island..
55318     function nearNullIsland(x, y, z) {
55319         if (z >= 7) {
55320             var center = Math.pow(2, z - 1);
55321             var width = Math.pow(2, z - 6);
55322             var min = center - (width / 2);
55323             var max = center + (width / 2) - 1;
55324             return x >= min && x <= max && y >= min && y <= max;
55325         }
55326         return false;
55327     }
55328
55329
55330     function tileSizeAtZoom(d, z) {
55331         var EPSILON = 0.002;
55332         return ((tileSize * Math.pow(2, z - d[2])) / tileSize) + EPSILON;
55333     }
55334
55335
55336     function atZoom(t$$1, distance) {
55337         var power = Math.pow(2, distance);
55338         return [
55339             Math.floor(t$$1[0] * power),
55340             Math.floor(t$$1[1] * power),
55341             t$$1[2] + distance
55342         ];
55343     }
55344
55345
55346     function lookUp(d) {
55347         for (var up = -1; up > -d[2]; up--) {
55348             var tile = atZoom(d, up);
55349             if (_cache[_source.url(tile)] !== false) {
55350                 return tile;
55351             }
55352         }
55353     }
55354
55355
55356     function uniqueBy(a, n) {
55357         var o = [];
55358         var seen = {};
55359         for (var i = 0; i < a.length; i++) {
55360             if (seen[a[i][n]] === undefined) {
55361                 o.push(a[i]);
55362                 seen[a[i][n]] = true;
55363             }
55364         }
55365         return o;
55366     }
55367
55368
55369     function addSource(d) {
55370         d.push(_source.url(d));
55371         return d;
55372     }
55373
55374
55375     // Update tiles based on current state of `projection`.
55376     function background(selection$$1) {
55377         _zoom = geoScaleToZoom(_projection.scale(), tileSize);
55378
55379         var pixelOffset;
55380         if (_source) {
55381             pixelOffset = [
55382                 _source.offset()[0] * Math.pow(2, _zoom),
55383                 _source.offset()[1] * Math.pow(2, _zoom)
55384             ];
55385         } else {
55386             pixelOffset = [0, 0];
55387         }
55388
55389         var translate = [
55390             _projection.translate()[0] + pixelOffset[0],
55391             _projection.translate()[1] + pixelOffset[1]
55392         ];
55393
55394         geotile
55395             .scale(_projection.scale() * 2 * Math.PI)
55396             .translate(translate);
55397
55398         _tileOrigin = [
55399             _projection.scale() * Math.PI - translate[0],
55400             _projection.scale() * Math.PI - translate[1]
55401         ];
55402
55403         render(selection$$1);
55404     }
55405
55406
55407     // Derive the tiles onscreen, remove those offscreen and position them.
55408     // Important that this part not depend on `_projection` because it's
55409     // rentered when tiles load/error (see #644).
55410     function render(selection$$1) {
55411         if (!_source) return;
55412         var requests = [];
55413         var showDebug = context.getDebug('tile') && !_source.overlay;
55414
55415         if (_source.validZoom(_zoom)) {
55416             geotile().forEach(function(d) {
55417                 addSource(d);
55418                 if (d[3] === '') return;
55419                 if (typeof d[3] !== 'string') return; // Workaround for #2295
55420                 requests.push(d);
55421                 if (_cache[d[3]] === false && lookUp(d)) {
55422                     requests.push(addSource(lookUp(d)));
55423                 }
55424             });
55425
55426             requests = uniqueBy(requests, 3).filter(function(r) {
55427                 if (!!_source.overlay && nearNullIsland(r[0], r[1], r[2])) {
55428                     return false;
55429                 }
55430                 // don't re-request tiles which have failed in the past
55431                 return _cache[r[3]] !== false;
55432             });
55433         }
55434
55435
55436         function load(d) {
55437             _cache[d[3]] = true;
55438             d3_select(this)
55439                 .on('error', null)
55440                 .on('load', null)
55441                 .classed('tile-loaded', true);
55442             render(selection$$1);
55443         }
55444
55445         function error(d) {
55446             _cache[d[3]] = false;
55447             d3_select(this)
55448                 .on('error', null)
55449                 .on('load', null)
55450                 .remove();
55451             render(selection$$1);
55452         }
55453
55454         function imageTransform(d) {
55455             var ts = tileSize * Math.pow(2, _zoom - d[2]);
55456             var scale = tileSizeAtZoom(d, _zoom);
55457             return 'translate(' +
55458                 ((d[0] * ts) - _tileOrigin[0]) + 'px,' +
55459                 ((d[1] * ts) - _tileOrigin[1]) + 'px) ' +
55460                 'scale(' + scale + ',' + scale + ')';
55461         }
55462
55463         function tileCenter(d) {
55464             var ts = tileSize * Math.pow(2, _zoom - d[2]);
55465             return [
55466                 ((d[0] * ts) - _tileOrigin[0] + (ts / 2)),
55467                 ((d[1] * ts) - _tileOrigin[1] + (ts / 2))
55468             ];
55469         }
55470
55471         function debugTransform(d) {
55472             var coord = tileCenter(d);
55473             return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
55474         }
55475
55476
55477         // Pick a representative tile near the center of the viewport
55478         // (This is useful for sampling the imagery vintage)
55479         var dims = geotile.size();
55480         var mapCenter = [dims[0] / 2, dims[1] / 2];
55481         var minDist = Math.max(dims[0], dims[1]);
55482         var nearCenter;
55483
55484         requests.forEach(function(d) {
55485             var c = tileCenter(d);
55486             var dist = geoVecLength(c, mapCenter);
55487             if (dist < minDist) {
55488                 minDist = dist;
55489                 nearCenter = d;
55490             }
55491         });
55492
55493
55494         var image = selection$$1.selectAll('img')
55495             .data(requests, function(d) { return d[3]; });
55496
55497         image.exit()
55498             .style(transformProp, imageTransform)
55499             .classed('tile-removing', true)
55500             .classed('tile-center', false)
55501             .each(function() {
55502                 var tile = d3_select(this);
55503                 window.setTimeout(function() {
55504                     if (tile.classed('tile-removing')) {
55505                         tile.remove();
55506                     }
55507                 }, 300);
55508             });
55509
55510         image.enter()
55511           .append('img')
55512             .attr('class', 'tile')
55513             .attr('src', function(d) { return d[3]; })
55514             .on('error', error)
55515             .on('load', load)
55516           .merge(image)
55517             .style(transformProp, imageTransform)
55518             .classed('tile-debug', showDebug)
55519             .classed('tile-removing', false)
55520             .classed('tile-center', function(d) { return d === nearCenter; });
55521
55522
55523
55524         var debug = selection$$1.selectAll('.tile-label-debug')
55525             .data(showDebug ? requests : [], function(d) { return d[3]; });
55526
55527         debug.exit()
55528             .remove();
55529
55530         if (showDebug) {
55531             var debugEnter = debug.enter()
55532                 .append('div')
55533                 .attr('class', 'tile-label-debug');
55534
55535             debugEnter
55536                 .append('div')
55537                 .attr('class', 'tile-label-debug-coord');
55538
55539             debugEnter
55540                 .append('div')
55541                 .attr('class', 'tile-label-debug-vintage');
55542
55543             debug = debug.merge(debugEnter);
55544
55545             debug
55546                 .style(transformProp, debugTransform);
55547
55548             debug
55549                 .selectAll('.tile-label-debug-coord')
55550                 .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
55551
55552             debug
55553                 .selectAll('.tile-label-debug-vintage')
55554                 .each(function(d) {
55555                     var span = d3_select(this);
55556                     var center = context.projection.invert(tileCenter(d));
55557                     _source.getMetadata(center, d, function(err, result) {
55558                         span.text((result && result.vintage && result.vintage.range) ||
55559                             t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
55560                         );
55561                     });
55562                 });
55563         }
55564
55565     }
55566
55567
55568     background.projection = function(_) {
55569         if (!arguments.length) return _projection;
55570         _projection = _;
55571         return background;
55572     };
55573
55574
55575     background.dimensions = function(_) {
55576         if (!arguments.length) return geotile.size();
55577         geotile.size(_);
55578         return background;
55579     };
55580
55581
55582     background.source = function(_) {
55583         if (!arguments.length) return _source;
55584         _source = _;
55585         _cache = {};
55586         geotile.scaleExtent(_source.scaleExtent);
55587         return background;
55588     };
55589
55590
55591     return background;
55592 }
55593
55594 function rendererBackground(context) {
55595     var dispatch$$1 = dispatch('change');
55596     var detected = utilDetect();
55597     var baseLayer = rendererTileLayer(context).projection(context.projection);
55598     var _overlayLayers = [];
55599     var _backgroundSources = [];
55600     var _brightness = 1;
55601     var _contrast = 1;
55602     var _saturation = 1;
55603     var _sharpness = 1;
55604
55605
55606     function background(selection$$1) {
55607
55608         var baseFilter = '';
55609         if (detected.cssfilters) {
55610             if (_brightness !== 1) {
55611                 baseFilter += 'brightness(' + _brightness + ')';
55612             }
55613             if (_contrast !== 1) {
55614                 baseFilter += 'contrast(' + _contrast + ')';
55615             }
55616             if (_saturation !== 1) {
55617                 baseFilter += 'saturate(' + _saturation + ')';
55618             }
55619             if (_sharpness < 1) {  // gaussian blur
55620                 var blur = d3_interpolateNumber(0.5, 5)(1 - _sharpness);
55621                 baseFilter += 'blur(' + blur + 'px)';
55622             }
55623         }
55624
55625         var base = selection$$1.selectAll('.layer-background')
55626             .data([0]);
55627
55628         base = base.enter()
55629             .insert('div', '.layer-data')
55630             .attr('class', 'layer layer-background')
55631             .merge(base);
55632
55633         if (detected.cssfilters) {
55634             base.style('filter', baseFilter || null);
55635         } else {
55636             base.style('opacity', _brightness);
55637         }
55638
55639
55640         var imagery = base.selectAll('.layer-imagery')
55641             .data([0]);
55642
55643         imagery.enter()
55644             .append('div')
55645             .attr('class', 'layer layer-imagery')
55646             .merge(imagery)
55647             .call(baseLayer);
55648
55649
55650         var maskFilter = '';
55651         var mixBlendMode = '';
55652         if (detected.cssfilters && _sharpness > 1) {  // apply unsharp mask
55653             mixBlendMode = 'overlay';
55654             maskFilter = 'saturate(0) blur(3px) invert(1)';
55655
55656             var contrast = _sharpness - 1;
55657             maskFilter += ' contrast(' + contrast + ')';
55658
55659             var brightness = d3_interpolateNumber(1, 0.85)(_sharpness - 1);
55660             maskFilter += ' brightness(' + brightness + ')';
55661         }
55662
55663         var mask = base.selectAll('.layer-unsharp-mask')
55664             .data(detected.cssfilters && _sharpness > 1 ? [0] : []);
55665
55666         mask.exit()
55667             .remove();
55668
55669         mask.enter()
55670             .append('div')
55671             .attr('class', 'layer layer-mask layer-unsharp-mask')
55672             .merge(mask)
55673             .call(baseLayer)
55674             .style('filter', maskFilter || null)
55675             .style('mix-blend-mode', mixBlendMode || null);
55676
55677
55678         var overlays = selection$$1.selectAll('.layer-overlay')
55679             .data(_overlayLayers, function(d) { return d.source().name(); });
55680
55681         overlays.exit()
55682             .remove();
55683
55684         overlays.enter()
55685             .insert('div', '.layer-data')
55686             .attr('class', 'layer layer-overlay')
55687             .merge(overlays)
55688             .each(function(layer) { d3_select(this).call(layer); });
55689     }
55690
55691
55692     background.updateImagery = function() {
55693         if (context.inIntro()) return;
55694
55695         var b = background.baseLayerSource(),
55696             o = _overlayLayers
55697                 .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
55698                 .map(function (d) { return d.source().id; })
55699                 .join(','),
55700             meters = geoOffsetToMeters(b.offset()),
55701             epsilon = 0.01,
55702             x = +meters[0].toFixed(2),
55703             y = +meters[1].toFixed(2),
55704             q = utilStringQs(window.location.hash.substring(1));
55705
55706         var id = b.id;
55707         if (id === 'custom') {
55708             id = 'custom:' + b.template();
55709         }
55710
55711         if (id) {
55712             q.background = id;
55713         } else {
55714             delete q.background;
55715         }
55716
55717         if (o) {
55718             q.overlays = o;
55719         } else {
55720             delete q.overlays;
55721         }
55722
55723         if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
55724             q.offset = x + ',' + y;
55725         } else {
55726             delete q.offset;
55727         }
55728
55729         if (!window.mocha) {
55730             window.location.replace('#' + utilQsString(q, true));
55731         }
55732
55733         var imageryUsed = [b.imageryUsed()];
55734
55735         _overlayLayers
55736             .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
55737             .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
55738
55739         var gpx = context.layers().layer('gpx');
55740         if (gpx && gpx.enabled() && gpx.hasGpx()) {
55741             // Include a string like '.gpx data file' or '.geojson data file'
55742             var match = gpx.getSrc().match(/(kml|gpx|(?:geo)?json)$/i);
55743             var extension = match ? ('.' + match[0].toLowerCase() + ' ') : '';
55744             imageryUsed.push(extension + 'data file');
55745         }
55746
55747         var mapillary_images = context.layers().layer('mapillary-images');
55748         if (mapillary_images && mapillary_images.enabled()) {
55749             imageryUsed.push('Mapillary Images');
55750         }
55751
55752         var mapillary_signs = context.layers().layer('mapillary-signs');
55753         if (mapillary_signs && mapillary_signs.enabled()) {
55754             imageryUsed.push('Mapillary Signs');
55755         }
55756
55757         var openstreetcam_images = context.layers().layer('openstreetcam-images');
55758         if (openstreetcam_images && openstreetcam_images.enabled()) {
55759             imageryUsed.push('OpenStreetCam Images');
55760         }
55761
55762         context.history().imageryUsed(imageryUsed);
55763     };
55764
55765
55766     background.sources = function(extent) {
55767         return _backgroundSources.filter(function(source) {
55768             return source.intersects(extent);
55769         });
55770     };
55771
55772
55773     background.dimensions = function(_) {
55774         if (!_) return;
55775         baseLayer.dimensions(_);
55776
55777         _overlayLayers.forEach(function(layer) {
55778             layer.dimensions(_);
55779         });
55780     };
55781
55782
55783     background.baseLayerSource = function(d) {
55784         if (!arguments.length) return baseLayer.source();
55785
55786         // test source against OSM imagery blacklists..
55787         var osm = context.connection();
55788         if (!osm) return background;
55789
55790         var blacklists = context.connection().imageryBlacklists();
55791
55792         var template = d.template(),
55793             fail = false,
55794             tested = 0,
55795             regex, i;
55796
55797         for (i = 0; i < blacklists.length; i++) {
55798             try {
55799                 regex = new RegExp(blacklists[i]);
55800                 fail = regex.test(template);
55801                 tested++;
55802                 if (fail) break;
55803             } catch (e) {
55804                 /* noop */
55805             }
55806         }
55807
55808         // ensure at least one test was run.
55809         if (!tested) {
55810             regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
55811             fail = regex.test(template);
55812         }
55813
55814         baseLayer.source(!fail ? d : background.findSource('none'));
55815         dispatch$$1.call('change');
55816         background.updateImagery();
55817         return background;
55818     };
55819
55820
55821     background.findSource = function(id) {
55822         return find$1(_backgroundSources, function(d) {
55823             return d.id && d.id === id;
55824         });
55825     };
55826
55827
55828     background.bing = function() {
55829         background.baseLayerSource(background.findSource('Bing'));
55830     };
55831
55832
55833     background.showsLayer = function(d) {
55834         return d.id === baseLayer.source().id ||
55835             _overlayLayers.some(function(layer) { return d.id === layer.source().id; });
55836     };
55837
55838
55839     background.overlayLayerSources = function() {
55840         return _overlayLayers.map(function (l) { return l.source(); });
55841     };
55842
55843
55844     background.toggleOverlayLayer = function(d) {
55845         var layer;
55846
55847         for (var i = 0; i < _overlayLayers.length; i++) {
55848             layer = _overlayLayers[i];
55849             if (layer.source() === d) {
55850                 _overlayLayers.splice(i, 1);
55851                 dispatch$$1.call('change');
55852                 background.updateImagery();
55853                 return;
55854             }
55855         }
55856
55857         layer = rendererTileLayer(context)
55858             .source(d)
55859             .projection(context.projection)
55860             .dimensions(baseLayer.dimensions()
55861         );
55862
55863         _overlayLayers.push(layer);
55864         dispatch$$1.call('change');
55865         background.updateImagery();
55866     };
55867
55868
55869     background.nudge = function(d, zoom) {
55870         baseLayer.source().nudge(d, zoom);
55871         dispatch$$1.call('change');
55872         background.updateImagery();
55873         return background;
55874     };
55875
55876
55877     background.offset = function(d) {
55878         if (!arguments.length) return baseLayer.source().offset();
55879         baseLayer.source().offset(d);
55880         dispatch$$1.call('change');
55881         background.updateImagery();
55882         return background;
55883     };
55884
55885
55886     background.brightness = function(d) {
55887         if (!arguments.length) return _brightness;
55888         _brightness = d;
55889         if (context.mode()) dispatch$$1.call('change');
55890         return background;
55891     };
55892
55893
55894     background.contrast = function(d) {
55895         if (!arguments.length) return _contrast;
55896         _contrast = d;
55897         if (context.mode()) dispatch$$1.call('change');
55898         return background;
55899     };
55900
55901
55902     background.saturation = function(d) {
55903         if (!arguments.length) return _saturation;
55904         _saturation = d;
55905         if (context.mode()) dispatch$$1.call('change');
55906         return background;
55907     };
55908
55909
55910     background.sharpness = function(d) {
55911         if (!arguments.length) return _sharpness;
55912         _sharpness = d;
55913         if (context.mode()) dispatch$$1.call('change');
55914         return background;
55915     };
55916
55917
55918     background.init = function() {
55919         function parseMap(qmap) {
55920             if (!qmap) return false;
55921             var args = qmap.split('/').map(Number);
55922             if (args.length < 3 || args.some(isNaN)) return false;
55923             return geoExtent$$1([args[2], args[1]]);
55924         }
55925
55926         var dataImagery = data.imagery || [],
55927             q = utilStringQs(window.location.hash.substring(1)),
55928             requested = q.background || q.layer,
55929             extent = parseMap(q.map),
55930             first,
55931             best;
55932
55933         // Add all the available imagery sources
55934         _backgroundSources = dataImagery.map(function(source) {
55935             if (source.type === 'bing') {
55936                 return rendererBackgroundSource.Bing(source, dispatch$$1);
55937             } else if (/^EsriWorldImagery/.test(source.id)) {
55938                 return rendererBackgroundSource.Esri(source);
55939             } else {
55940                 return rendererBackgroundSource(source);
55941             }
55942         });
55943
55944         first = _backgroundSources.length && _backgroundSources[0];
55945
55946         // Add 'None'
55947         _backgroundSources.unshift(rendererBackgroundSource.None());
55948
55949         // Add 'Custom'
55950         var template = context.storage('background-custom-template') || '';
55951         var custom = rendererBackgroundSource.Custom(template);
55952         _backgroundSources.unshift(custom);
55953
55954
55955         // Decide which background layer to display
55956         if (!requested && extent) {
55957             best = find$1(this.sources(extent), function(s) { return s.best(); });
55958         }
55959         if (requested && requested.indexOf('custom:') === 0) {
55960             template = requested.replace(/^custom:/, '');
55961             background.baseLayerSource(custom.template(template));
55962             context.storage('background-custom-template', template);
55963         } else {
55964             background.baseLayerSource(
55965                 background.findSource(requested) ||
55966                 best ||
55967                 background.findSource(context.storage('background-last-used')) ||
55968                 background.findSource('Bing') ||
55969                 first ||
55970                 background.findSource('none')
55971             );
55972         }
55973
55974         var locator = find$1(_backgroundSources, function(d) {
55975             return d.overlay && d.default;
55976         });
55977
55978         if (locator) {
55979             background.toggleOverlayLayer(locator);
55980         }
55981
55982         var overlays = (q.overlays || '').split(',');
55983         overlays.forEach(function(overlay) {
55984             overlay = background.findSource(overlay);
55985             if (overlay) {
55986                 background.toggleOverlayLayer(overlay);
55987             }
55988         });
55989
55990         if (q.gpx) {
55991             var gpx = context.layers().layer('gpx');
55992             if (gpx) {
55993                 gpx.url(q.gpx);
55994             }
55995         }
55996
55997         if (q.offset) {
55998             var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
55999                 return !isNaN(n) && n;
56000             });
56001
56002             if (offset.length === 2) {
56003                 background.offset(geoMetersToOffset(offset));
56004             }
56005         }
56006     };
56007
56008
56009     return utilRebind(background, dispatch$$1, 'on');
56010 }
56011
56012 function rendererFeatures(context) {
56013     var traffic_roads = {
56014         'motorway': true,
56015         'motorway_link': true,
56016         'trunk': true,
56017         'trunk_link': true,
56018         'primary': true,
56019         'primary_link': true,
56020         'secondary': true,
56021         'secondary_link': true,
56022         'tertiary': true,
56023         'tertiary_link': true,
56024         'residential': true,
56025         'unclassified': true,
56026         'living_street': true
56027     };
56028
56029     var service_roads = {
56030         'service': true,
56031         'road': true,
56032         'track': true
56033     };
56034
56035     var paths = {
56036         'path': true,
56037         'footway': true,
56038         'cycleway': true,
56039         'bridleway': true,
56040         'steps': true,
56041         'pedestrian': true,
56042         'corridor': true
56043     };
56044
56045     var past_futures = {
56046         'proposed': true,
56047         'construction': true,
56048         'abandoned': true,
56049         'dismantled': true,
56050         'disused': true,
56051         'razed': true,
56052         'demolished': true,
56053         'obliterated': true
56054     };
56055
56056     var dispatch$$1 = dispatch('change', 'redraw'),
56057         _cullFactor = 1,
56058         _cache = {},
56059         _features = {},
56060         _stats = {},
56061         _keys = [],
56062         _hidden = [];
56063
56064
56065     function update() {
56066         if (!window.mocha) {
56067             var q = utilStringQs(window.location.hash.substring(1));
56068             var disabled = features.disabled();
56069             if (disabled.length) {
56070                 q.disable_features = disabled.join(',');
56071             } else {
56072                 delete q.disable_features;
56073             }
56074             window.location.replace('#' + utilQsString(q, true));
56075             context.storage('disabled-features', disabled.join(','));
56076         }
56077         _hidden = features.hidden();
56078         dispatch$$1.call('change');
56079         dispatch$$1.call('redraw');
56080     }
56081
56082
56083     function defineFeature(k, filter, max) {
56084         var isEnabled = true;
56085
56086         _keys.push(k);
56087         _features[k] = {
56088             filter: filter,
56089             enabled: isEnabled,   // whether the user wants it enabled..
56090             count: 0,
56091             currentMax: (max || Infinity),
56092             defaultMax: (max || Infinity),
56093             enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
56094             disable: function() { this.enabled = false; this.currentMax = 0; },
56095             hidden: function() { return !context.editable() || this.count > this.currentMax * _cullFactor; },
56096             autoHidden: function() { return this.hidden() && this.currentMax > 0; }
56097         };
56098     }
56099
56100
56101     defineFeature('points', function isPoint(entity, resolver, geometry) {
56102         return geometry === 'point';
56103     }, 200);
56104
56105     defineFeature('traffic_roads', function isTrafficRoad(entity) {
56106         return traffic_roads[entity.tags.highway];
56107     });
56108
56109     defineFeature('service_roads', function isServiceRoad(entity) {
56110         return service_roads[entity.tags.highway];
56111     });
56112
56113     defineFeature('paths', function isPath(entity) {
56114         return paths[entity.tags.highway];
56115     });
56116
56117     defineFeature('buildings', function isBuilding(entity) {
56118         return (
56119             !!entity.tags['building:part'] ||
56120             (!!entity.tags.building && entity.tags.building !== 'no') ||
56121             entity.tags.amenity === 'shelter' ||
56122             entity.tags.parking === 'multi-storey' ||
56123             entity.tags.parking === 'sheds' ||
56124             entity.tags.parking === 'carports' ||
56125             entity.tags.parking === 'garage_boxes'
56126         );
56127     }, 250);
56128
56129     defineFeature('landuse', function isLanduse(entity, resolver, geometry) {
56130         return geometry === 'area' &&
56131             !_features.buildings.filter(entity) &&
56132             !_features.water.filter(entity);
56133     });
56134
56135     defineFeature('boundaries', function isBoundary(entity) {
56136         return !!entity.tags.boundary;
56137     });
56138
56139     defineFeature('water', function isWater(entity) {
56140         return (
56141             !!entity.tags.waterway ||
56142             entity.tags.natural === 'water' ||
56143             entity.tags.natural === 'coastline' ||
56144             entity.tags.natural === 'bay' ||
56145             entity.tags.landuse === 'pond' ||
56146             entity.tags.landuse === 'basin' ||
56147             entity.tags.landuse === 'reservoir' ||
56148             entity.tags.landuse === 'salt_pond'
56149         );
56150     });
56151
56152     defineFeature('rail', function isRail(entity) {
56153         return (
56154             !!entity.tags.railway ||
56155             entity.tags.landuse === 'railway'
56156         ) && !(
56157             traffic_roads[entity.tags.highway] ||
56158             service_roads[entity.tags.highway] ||
56159             paths[entity.tags.highway]
56160         );
56161     });
56162
56163     defineFeature('power', function isPower(entity) {
56164         return !!entity.tags.power;
56165     });
56166
56167     // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
56168     defineFeature('past_future', function isPastFuture(entity) {
56169         if (
56170             traffic_roads[entity.tags.highway] ||
56171             service_roads[entity.tags.highway] ||
56172             paths[entity.tags.highway]
56173         ) { return false; }
56174
56175         var strings = Object.keys(entity.tags);
56176
56177         for (var i = 0; i < strings.length; i++) {
56178             var s = strings[i];
56179             if (past_futures[s] || past_futures[entity.tags[s]]) { return true; }
56180         }
56181         return false;
56182     });
56183
56184     // Lines or areas that don't match another feature filter.
56185     // IMPORTANT: The 'others' feature must be the last one defined,
56186     //   so that code in getMatches can skip this test if `hasMatch = true`
56187     defineFeature('others', function isOther(entity, resolver, geometry) {
56188         return (geometry === 'line' || geometry === 'area');
56189     });
56190
56191
56192     function features() {}
56193
56194
56195     features.features = function() {
56196         return _features;
56197     };
56198
56199
56200     features.keys = function() {
56201         return _keys;
56202     };
56203
56204
56205     features.enabled = function(k) {
56206         if (!arguments.length) {
56207             return _keys.filter(function(k) { return _features[k].enabled; });
56208         }
56209         return _features[k] && _features[k].enabled;
56210     };
56211
56212
56213     features.disabled = function(k) {
56214         if (!arguments.length) {
56215             return _keys.filter(function(k) { return !_features[k].enabled; });
56216         }
56217         return _features[k] && !_features[k].enabled;
56218     };
56219
56220
56221     features.hidden = function(k) {
56222         if (!arguments.length) {
56223             return _keys.filter(function(k) { return _features[k].hidden(); });
56224         }
56225         return _features[k] && _features[k].hidden();
56226     };
56227
56228
56229     features.autoHidden = function(k) {
56230         if (!arguments.length) {
56231             return _keys.filter(function(k) { return _features[k].autoHidden(); });
56232         }
56233         return _features[k] && _features[k].autoHidden();
56234     };
56235
56236
56237     features.enable = function(k) {
56238         if (_features[k] && !_features[k].enabled) {
56239             _features[k].enable();
56240             update();
56241         }
56242     };
56243
56244
56245     features.disable = function(k) {
56246         if (_features[k] && _features[k].enabled) {
56247             _features[k].disable();
56248             update();
56249         }
56250     };
56251
56252
56253     features.toggle = function(k) {
56254         if (_features[k]) {
56255             (function(f) { return f.enabled ? f.disable() : f.enable(); }(_features[k]));
56256             update();
56257         }
56258     };
56259
56260
56261     features.resetStats = function() {
56262         for (var i = 0; i < _keys.length; i++) {
56263             _features[_keys[i]].count = 0;
56264         }
56265         dispatch$$1.call('change');
56266     };
56267
56268
56269     features.gatherStats = function(d, resolver, dimensions) {
56270         var needsRedraw = false,
56271             type = groupBy(d, function(ent) { return ent.type; }),
56272             entities = [].concat(type.relation || [], type.way || [], type.node || []),
56273             currHidden, geometry, matches, i, j;
56274
56275         for (i = 0; i < _keys.length; i++) {
56276             _features[_keys[i]].count = 0;
56277         }
56278
56279         // adjust the threshold for point/building culling based on viewport size..
56280         // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
56281         _cullFactor = dimensions[0] * dimensions[1] / 1000000;
56282
56283         for (i = 0; i < entities.length; i++) {
56284             geometry = entities[i].geometry(resolver);
56285             if (!(geometry === 'vertex' || geometry === 'relation')) {
56286                 matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
56287                 for (j = 0; j < matches.length; j++) {
56288                     _features[matches[j]].count++;
56289                 }
56290             }
56291         }
56292
56293         currHidden = features.hidden();
56294         if (currHidden !== _hidden) {
56295             _hidden = currHidden;
56296             needsRedraw = true;
56297             dispatch$$1.call('change');
56298         }
56299
56300         return needsRedraw;
56301     };
56302
56303
56304     features.stats = function() {
56305         for (var i = 0; i < _keys.length; i++) {
56306             _stats[_keys[i]] = _features[_keys[i]].count;
56307         }
56308
56309         return _stats;
56310     };
56311
56312
56313     features.clear = function(d) {
56314         for (var i = 0; i < d.length; i++) {
56315             features.clearEntity(d[i]);
56316         }
56317     };
56318
56319
56320     features.clearEntity = function(entity) {
56321         delete _cache[osmEntity$$1.key(entity)];
56322     };
56323
56324
56325     features.reset = function() {
56326         _cache = {};
56327     };
56328
56329
56330     features.getMatches = function(entity, resolver, geometry) {
56331         if (geometry === 'vertex' || geometry === 'relation') return {};
56332
56333         var ent = osmEntity$$1.key(entity);
56334         if (!_cache[ent]) {
56335             _cache[ent] = {};
56336         }
56337
56338         if (!_cache[ent].matches) {
56339             var matches = {},
56340                 hasMatch = false;
56341
56342             for (var i = 0; i < _keys.length; i++) {
56343                 if (_keys[i] === 'others') {
56344                     if (hasMatch) continue;
56345
56346                     // Multipolygon members:
56347                     // If an entity...
56348                     //   1. is a way that hasn't matched other 'interesting' feature rules,
56349                     //   2. and it belongs to a single parent multipolygon relation
56350                     // ...then match whatever feature rules the parent multipolygon has matched.
56351                     // see #2548, #2887
56352                     //
56353                     // IMPORTANT:
56354                     // For this to work, getMatches must be called on relations before ways.
56355                     //
56356                     if (entity.type === 'way') {
56357                         var parents = features.getParents(entity, resolver, geometry);
56358                         if (parents.length === 1 && parents[0].isMultipolygon()) {
56359                             var pkey = osmEntity$$1.key(parents[0]);
56360                             if (_cache[pkey] && _cache[pkey].matches) {
56361                                 matches = clone(_cache[pkey].matches);
56362                                 continue;
56363                             }
56364                         }
56365                     }
56366                 }
56367
56368                 if (_features[_keys[i]].filter(entity, resolver, geometry)) {
56369                     matches[_keys[i]] = hasMatch = true;
56370                 }
56371             }
56372             _cache[ent].matches = matches;
56373         }
56374
56375         return _cache[ent].matches;
56376     };
56377
56378
56379     features.getParents = function(entity, resolver, geometry) {
56380         if (geometry === 'point') return [];
56381
56382         var ent = osmEntity$$1.key(entity);
56383         if (!_cache[ent]) {
56384             _cache[ent] = {};
56385         }
56386
56387         if (!_cache[ent].parents) {
56388             var parents = [];
56389             if (geometry === 'vertex') {
56390                 parents = resolver.parentWays(entity);
56391             } else {   // 'line', 'area', 'relation'
56392                 parents = resolver.parentRelations(entity);
56393             }
56394             _cache[ent].parents = parents;
56395         }
56396         return _cache[ent].parents;
56397     };
56398
56399
56400     features.isHiddenFeature = function(entity, resolver, geometry) {
56401         if (!_hidden.length) return false;
56402         if (!entity.version) return false;
56403
56404         var matches = features.getMatches(entity, resolver, geometry);
56405
56406         for (var i = 0; i < _hidden.length; i++) {
56407             if (matches[_hidden[i]]) return true;
56408         }
56409         return false;
56410     };
56411
56412
56413     features.isHiddenChild = function(entity, resolver, geometry) {
56414         if (!_hidden.length) return false;
56415         if (!entity.version || geometry === 'point') return false;
56416
56417         var parents = features.getParents(entity, resolver, geometry);
56418         if (!parents.length) return false;
56419
56420         for (var i = 0; i < parents.length; i++) {
56421             if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
56422                 return false;
56423             }
56424         }
56425         return true;
56426     };
56427
56428
56429     features.hasHiddenConnections = function(entity, resolver) {
56430         if (!_hidden.length) return false;
56431         var childNodes, connections;
56432
56433         if (entity.type === 'midpoint') {
56434             childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
56435             connections = [];
56436         } else {
56437             childNodes = entity.nodes ? resolver.childNodes(entity) : [];
56438             connections = features.getParents(entity, resolver, entity.geometry(resolver));
56439         }
56440
56441         // gather ways connected to child nodes..
56442         connections = reduce(childNodes, function(result, e) {
56443             return resolver.isShared(e) ? union(result, resolver.parentWays(e)) : result;
56444         }, connections);
56445
56446         return connections.length ? some(connections, function(e) {
56447             return features.isHidden(e, resolver, e.geometry(resolver));
56448         }) : false;
56449     };
56450
56451
56452     features.isHidden = function(entity, resolver, geometry) {
56453         if (!_hidden.length) return false;
56454         if (!entity.version) return false;
56455
56456         var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
56457         return fn(entity, resolver, geometry);
56458     };
56459
56460
56461     features.filter = function(d, resolver) {
56462         if (!_hidden.length) return d;
56463
56464         var result = [];
56465         for (var i = 0; i < d.length; i++) {
56466             var entity = d[i];
56467             if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
56468                 result.push(entity);
56469             }
56470         }
56471         return result;
56472     };
56473
56474
56475     features.init = function() {
56476         var storage = context.storage('disabled-features');
56477         if (storage) {
56478             var storageDisabled = storage.replace(/;/g, ',').split(',');
56479             storageDisabled.forEach(features.disable);
56480         }
56481         
56482         var q = utilStringQs(window.location.hash.substring(1));
56483         if (q.disable_features) {
56484             var hashDisabled = q.disable_features.replace(/;/g, ',').split(',');
56485             hashDisabled.forEach(features.disable);
56486         }
56487     };
56488
56489     return utilRebind(features, dispatch$$1, 'on');
56490 }
56491
56492 function utilBindOnce(target, type, listener, capture) {
56493     var typeOnce = type + '.once';
56494     function one() {
56495         target.on(typeOnce, null);
56496         listener.apply(this, arguments);
56497     }
56498     target.on(typeOnce, one, capture);
56499     return this;
56500 }
56501
56502 function rendererMap(context) {
56503
56504     var dimensions = [1, 1],
56505         dispatch$$1 = dispatch('move', 'drawn'),
56506         projection = context.projection,
56507         curtainProjection = context.curtainProjection,
56508         dblclickEnabled = true,
56509         redrawEnabled = true,
56510         transformStart = projection.transform(),
56511         transformLast,
56512         transformed = false,
56513         minzoom = 0,
56514         drawLayers = svgLayers(projection, context),
56515         drawPoints = svgPoints$$1(projection, context),
56516         drawVertices = svgVertices$$1(projection, context),
56517         drawLines = svgLines$$1(projection, context),
56518         drawAreas = svgAreas$$1(projection, context),
56519         drawMidpoints = svgMidpoints$$1(projection, context),
56520         drawLabels = svgLabels(projection, context),
56521         supersurface = d3_select(null),
56522         wrapper = d3_select(null),
56523         surface = d3_select(null),
56524         mouse,
56525         mousemove;
56526
56527     var zoom$$1 = d3_zoom()
56528         .scaleExtent([ztok(2), ztok(24)])
56529         .interpolate(d3_interpolate)
56530         .filter(zoomEventFilter)
56531         .on('zoom', zoomPan);
56532
56533     var _selection = d3_select(null);
56534
56535     var scheduleRedraw = throttle(redraw, 750);
56536     // var isRedrawScheduled = false;
56537     // var pendingRedrawCall;
56538     // function scheduleRedraw() {
56539     //     // Only schedule the redraw if one has not already been set.
56540     //     if (isRedrawScheduled) return;
56541     //     isRedrawScheduled = true;
56542     //     var that = this;
56543     //     var args = arguments;
56544     //     pendingRedrawCall = window.requestIdleCallback(function () {
56545     //         // Reset the boolean so future redraws can be set.
56546     //         isRedrawScheduled = false;
56547     //         redraw.apply(that, args);
56548     //     }, { timeout: 1400 });
56549     // }
56550
56551     function cancelPendingRedraw() {
56552         scheduleRedraw.cancel();
56553         // isRedrawScheduled = false;
56554         // window.cancelIdleCallback(pendingRedrawCall);
56555     }
56556
56557     function map(selection$$1) {
56558
56559         _selection = selection$$1;
56560
56561         context
56562             .on('change.map', immediateRedraw);
56563
56564         var osm = context.connection();
56565         if (osm) {
56566             osm.on('change.map', immediateRedraw);
56567         }
56568
56569         context.history()
56570             .on('change.map', immediateRedraw)
56571             .on('undone.map redone.map', function(stack) {
56572                 var mode = context.mode().id;
56573                 if (mode !== 'browse' && mode !== 'select') return;
56574
56575                 var followSelected = false;
56576                 if (Array.isArray(stack.selectedIDs)) {
56577                     followSelected = (stack.selectedIDs.length === 1 && stack.selectedIDs[0][0] === 'n');
56578                     context.enter(
56579                         modeSelect(context, stack.selectedIDs).follow(followSelected)
56580                     );
56581                 }
56582                 if (!followSelected && stack.transform) {
56583                     map.transformEase(stack.transform);
56584                 }
56585             });
56586
56587         context.background()
56588             .on('change.map', immediateRedraw);
56589
56590         context.features()
56591             .on('redraw.map', immediateRedraw);
56592
56593         drawLayers
56594             .on('change.map', function() {
56595                 context.background().updateImagery();
56596                 immediateRedraw();
56597             });
56598
56599         selection$$1
56600             .on('dblclick.map', dblClick)
56601             .call(zoom$$1)
56602             .call(zoom$$1.transform, projection.transform());
56603
56604         supersurface = selection$$1.append('div')
56605             .attr('id', 'supersurface')
56606             .call(utilSetTransform, 0, 0);
56607
56608         // Need a wrapper div because Opera can't cope with an absolutely positioned
56609         // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
56610         wrapper = supersurface
56611             .append('div')
56612             .attr('class', 'layer layer-data');
56613
56614         map.surface = surface = wrapper
56615             .call(drawLayers)
56616             .selectAll('.surface')
56617             .attr('id', 'surface');
56618
56619         surface
56620             .call(drawLabels.observe)
56621             .on('mousedown.zoom', function() {
56622                 if (event.button === 2) {
56623                     event.stopPropagation();
56624                 }
56625             }, true)
56626             .on('mouseup.zoom', function() {
56627                 if (resetTransform()) immediateRedraw();
56628             })
56629             .on('mousemove.map', function() {
56630                 mousemove = event;
56631             })
56632             .on('mouseover.vertices', function() {
56633                 if (map.editable() && !transformed) {
56634                     var hover = event.target.__data__;
56635                     surface.selectAll('.data-layer-osm')
56636                         .call(drawVertices.drawHover, context.graph(), hover, map.extent());
56637                     dispatch$$1.call('drawn', this, { full: false });
56638                 }
56639             })
56640             .on('mouseout.vertices', function() {
56641                 if (map.editable() && !transformed) {
56642                     var hover = event.relatedTarget && event.relatedTarget.__data__;
56643                     surface.selectAll('.data-layer-osm')
56644                         .call(drawVertices.drawHover, context.graph(), hover, map.extent());
56645                     dispatch$$1.call('drawn', this, { full: false });
56646                 }
56647             });
56648
56649         supersurface
56650             .call(context.background());
56651
56652         context.on('enter.map',  function() {
56653             if (map.editable() && !transformed) {
56654
56655                 // redraw immediately any objects affected by a change in selectedIDs.
56656                 var graph = context.graph();
56657                 var selectedAndParents = {};
56658                 context.selectedIDs().forEach(function(id) {
56659                     var entity = graph.hasEntity(id);
56660                     if (entity) {
56661                         selectedAndParents[entity.id] = entity;
56662                         if (entity.type === 'node') {
56663                             graph.parentWays(entity).forEach(function(parent) {
56664                                 selectedAndParents[parent.id] = parent;
56665                             });
56666                         }
56667                     }
56668                 });
56669                 var data = values$1(selectedAndParents);
56670                 var filter = function(d) { return d.id in selectedAndParents; };
56671
56672                 data = context.features().filter(data, graph);
56673
56674                 surface.selectAll('.data-layer-osm')
56675                     .call(drawVertices.drawSelected, graph, map.extent())
56676                     .call(drawLines, graph, data, filter)
56677                     .call(drawAreas, graph, data, filter)
56678                     .call(drawMidpoints, graph, data, filter, map.trimmedExtent());
56679
56680                 dispatch$$1.call('drawn', this, { full: false });
56681
56682
56683                 // redraw everything else later
56684                 scheduleRedraw();
56685             }
56686         });
56687
56688         map.dimensions(utilGetDimensions(selection$$1));
56689     }
56690
56691
56692     function zoomEventFilter() {
56693         // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
56694         // Intercept `mousedown` and check if there is an orphaned zoom gesture.
56695         // This can happen if a previous `mousedown` occurred without a `mouseup`.
56696         // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
56697         // so that d3-zoom won't stop propagation of new `mousedown` events.
56698         if (event.type === 'mousedown') {
56699             var hasOrphan = false;
56700             var listeners = window.__on;
56701             for (var i = 0; i < listeners.length; i++) {
56702                 var listener = listeners[i];
56703                 if (listener.name === 'zoom' && listener.type === 'mouseup') {
56704                     hasOrphan = true;
56705                     break;
56706                 }
56707             }
56708             if (hasOrphan) {
56709                 var event$$1 = window.CustomEvent;
56710                 if (event$$1) {
56711                     event$$1 = new event$$1('mouseup');
56712                 } else {
56713                     event$$1 = window.document.createEvent('Event');
56714                     event$$1.initEvent('mouseup', false, false);
56715                 }
56716                 // Event needs to be dispatched with an event.view property.
56717                 event$$1.view = window;
56718                 window.dispatchEvent(event$$1);
56719             }
56720         }
56721
56722         return event.button !== 2;   // ignore right clicks
56723     }
56724
56725
56726     function ztok(z) {
56727         return 256 * Math.pow(2, z);
56728     }
56729
56730     function ktoz(k) {
56731         return Math.max(Math.log(k) / Math.LN2 - 8, 0);
56732     }
56733
56734     function pxCenter() {
56735         return [dimensions[0] / 2, dimensions[1] / 2];
56736     }
56737
56738
56739     function drawVector(difference, extent) {
56740         var mode = context.mode();
56741         var graph = context.graph();
56742         var features = context.features();
56743         var all = context.intersects(map.extent());
56744         var fullRedraw = false;
56745         var data;
56746         var filter;
56747
56748         if (difference) {
56749             var complete = difference.complete(map.extent());
56750             data = compact(values$1(complete));
56751             filter = function(d) { return d.id in complete; };
56752             features.clear(data);
56753
56754         } else {
56755             // force a full redraw if gatherStats detects that a feature
56756             // should be auto-hidden (e.g. points or buildings)..
56757             if (features.gatherStats(all, graph, dimensions)) {
56758                 extent = undefined;
56759             }
56760
56761             if (extent) {
56762                 data = context.intersects(map.extent().intersection(extent));
56763                 var set$$1 = set$2(map$3(data, 'id'));
56764                 filter = function(d) { return set$$1.has(d.id); };
56765
56766             } else {
56767                 data = all;
56768                 fullRedraw = true;
56769                 filter = utilFunctor(true);
56770             }
56771         }
56772
56773         data = features.filter(data, graph);
56774
56775         if (mode && mode.id === 'select') {
56776             // update selected vertices - the user might have just double-clicked a way,
56777             // creating a new vertex, triggering a partial redraw without a mode change
56778             surface.selectAll('.data-layer-osm')
56779                 .call(drawVertices.drawSelected, graph, map.extent());
56780         }
56781
56782         surface.selectAll('.data-layer-osm')
56783             .call(drawVertices, graph, data, filter, map.extent(), fullRedraw)
56784             .call(drawLines, graph, data, filter)
56785             .call(drawAreas, graph, data, filter)
56786             .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
56787             .call(drawLabels, graph, data, filter, dimensions, fullRedraw)
56788             .call(drawPoints, graph, data, filter);
56789
56790         dispatch$$1.call('drawn', this, {full: true});
56791     }
56792
56793
56794     function editOff() {
56795         context.features().resetStats();
56796         surface.selectAll('.layer-osm *').remove();
56797
56798         var mode = context.mode();
56799         if (mode && mode.id !== 'save') {
56800             context.enter(modeBrowse(context));
56801         }
56802
56803         dispatch$$1.call('drawn', this, {full: true});
56804     }
56805
56806
56807     function dblClick() {
56808         if (!dblclickEnabled) {
56809             event.preventDefault();
56810             event.stopImmediatePropagation();
56811         }
56812     }
56813
56814
56815     function zoomPan(manualEvent) {
56816         var event$$1 = (manualEvent || event);
56817         var source = event$$1.sourceEvent;
56818         var eventTransform = event$$1.transform;
56819
56820         if (transformStart.x === eventTransform.x &&
56821             transformStart.y === eventTransform.y &&
56822             transformStart.k === eventTransform.k) {
56823             return;  // no change
56824         }
56825
56826         // Normalize mousewheel - #3029
56827         // If wheel delta is provided in LINE units, recalculate it in PIXEL units
56828         // We are essentially redoing the calculations that occur here:
56829         //   https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
56830         // See this for more info:
56831         //   https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
56832         if (source && source.type === 'wheel' && source.deltaMode === 1 /* LINE */) {
56833             // pick sensible scroll amount if user scrolling fast or slow..
56834             var lines = Math.abs(source.deltaY);
56835             var scroll = lines > 2 ? 40 : lines * 10;
56836
56837             var t0 = transformed ? transformLast : transformStart;
56838             var p0 = mouse(source);
56839             var p1 = t0.invert(p0);
56840             var k2 = t0.k * Math.pow(2, -source.deltaY * scroll / 500);
56841             var x2 = p0[0] - p1[0] * k2;
56842             var y2 = p0[1] - p1[1] * k2;
56843
56844             eventTransform = identity$7.translate(x2,y2).scale(k2);
56845             _selection.node().__zoom = eventTransform;
56846         }
56847
56848         if (ktoz(eventTransform.k * 2 * Math.PI) < minzoom) {
56849             surface.interrupt();
56850             uiFlash().text(t('cannot_zoom'))();
56851             setZoom(context.minEditableZoom(), true);
56852             scheduleRedraw();
56853             dispatch$$1.call('move', this, map);
56854             return;
56855         }
56856
56857         projection.transform(eventTransform);
56858
56859         var scale = eventTransform.k / transformStart.k;
56860         var tX = (eventTransform.x / scale - transformStart.x) * scale;
56861         var tY = (eventTransform.y / scale - transformStart.y) * scale;
56862
56863         if (context.inIntro()) {
56864             curtainProjection.transform({
56865                 x: eventTransform.x - tX,
56866                 y: eventTransform.y - tY,
56867                 k: eventTransform.k
56868             });
56869         }
56870
56871         if (source) mousemove = event$$1;
56872         transformed = true;
56873         transformLast = eventTransform;
56874         utilSetTransform(supersurface, tX, tY, scale);
56875         scheduleRedraw();
56876
56877         dispatch$$1.call('move', this, map);
56878     }
56879
56880
56881     function resetTransform() {
56882         if (!transformed) return false;
56883
56884         // deprecation warning - Radial Menu to be removed in iD v3
56885         surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
56886         utilSetTransform(supersurface, 0, 0);
56887         transformed = false;
56888         if (context.inIntro()) {
56889             curtainProjection.transform(projection.transform());
56890         }
56891         return true;
56892     }
56893
56894
56895     function redraw(difference, extent) {
56896         if (surface.empty() || !redrawEnabled) return;
56897
56898         // If we are in the middle of a zoom/pan, we can't do differenced redraws.
56899         // It would result in artifacts where differenced entities are redrawn with
56900         // one transform and unchanged entities with another.
56901         if (resetTransform()) {
56902             difference = extent = undefined;
56903         }
56904
56905         var z = String(~~map.zoom());
56906         if (surface.attr('data-zoom') !== z) {
56907             surface.attr('data-zoom', z)
56908                 .classed('low-zoom', z <= 16);
56909         }
56910
56911         if (!difference) {
56912             supersurface.call(context.background());
56913         }
56914
56915         wrapper
56916             .call(drawLayers);
56917
56918         // OSM
56919         if (map.editable()) {
56920             context.loadTiles(projection, dimensions);
56921             drawVector(difference, extent);
56922         } else {
56923             editOff();
56924         }
56925
56926         transformStart = projection.transform();
56927
56928         return map;
56929     }
56930
56931
56932
56933     var immediateRedraw = function(difference, extent) {
56934         if (!difference && !extent) cancelPendingRedraw();
56935         redraw(difference, extent);
56936     };
56937
56938
56939     function pointLocation(p) {
56940         var translate = projection.translate(),
56941             scale = projection.scale() * 2 * Math.PI;
56942         return [(p[0] - translate[0]) / scale, (p[1] - translate[1]) / scale];
56943     }
56944
56945
56946     function locationPoint(l) {
56947         var translate = projection.translate(),
56948             scale = projection.scale() * 2 * Math.PI;
56949         return [l[0] * scale + translate[0], l[1] * scale + translate[1]];
56950     }
56951
56952
56953     map.mouse = function() {
56954         var event$$1 = mousemove || event;
56955         if (event$$1) {
56956             var s;
56957             while ((s = event$$1.sourceEvent)) { event$$1 = s; }
56958             return mouse(event$$1);
56959         }
56960         return null;
56961     };
56962
56963
56964     // returns Lng/Lat
56965     map.mouseCoordinates = function() {
56966         var coord = map.mouse() || pxCenter();
56967         return projection.invert(coord);
56968     };
56969
56970
56971     map.dblclickEnable = function(_) {
56972         if (!arguments.length) return dblclickEnabled;
56973         dblclickEnabled = _;
56974         return map;
56975     };
56976
56977
56978     map.redrawEnable = function(_) {
56979         if (!arguments.length) return redrawEnabled;
56980         redrawEnabled = _;
56981         return map;
56982     };
56983
56984
56985     function setTransform(t2, duration, force) {
56986         var t$$1 = projection.transform();
56987         if (!force && t2.k === t$$1.k && t2.x === t$$1.x && t2.y === t$$1.y) {
56988             return false;
56989         }
56990
56991         if (duration) {
56992             _selection
56993                 .transition()
56994                 .duration(duration)
56995                 .on('start', function() { map.startEase(); })
56996                 .call(zoom$$1.transform, identity$7.translate(t2.x, t2.y).scale(t2.k));
56997         } else {
56998             projection.transform(t2);
56999             transformStart = t2;
57000             _selection.call(zoom$$1.transform, transformStart);
57001         }
57002     }
57003
57004
57005     function setZoom(z2, force, duration) {
57006         if (z2 === map.zoom() && !force) {
57007             return false;
57008         }
57009
57010         var k = projection.scale(),
57011             k2 = Math.max(ztok(2), Math.min(ztok(24), ztok(z2))) / (2 * Math.PI),
57012             center = pxCenter(),
57013             l = pointLocation(center);
57014
57015         projection.scale(k2);
57016
57017         var t$$1 = projection.translate();
57018         l = locationPoint(l);
57019
57020         t$$1[0] += center[0] - l[0];
57021         t$$1[1] += center[1] - l[1];
57022
57023         if (duration) {
57024             projection.scale(k);  // reset scale
57025             _selection
57026                 .transition()
57027                 .duration(duration)
57028                 .on('start', function() { map.startEase(); })
57029                 .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k2));
57030         } else {
57031             projection.translate(t$$1);
57032             transformStart = projection.transform();
57033             _selection.call(zoom$$1.transform, transformStart);
57034         }
57035
57036         return true;
57037     }
57038
57039
57040     function setCenter(loc2, duration) {
57041         var c = map.center();
57042         if (loc2[0] === c[0] && loc2[1] === c[1]) {
57043             return false;
57044         }
57045
57046         var t$$1 = projection.translate(),
57047             k = projection.scale(),
57048             pxC = pxCenter(),
57049             ll = projection(loc2);
57050
57051         t$$1[0] = t$$1[0] - ll[0] + pxC[0];
57052         t$$1[1] = t$$1[1] - ll[1] + pxC[1];
57053
57054         if (duration) {
57055             _selection
57056                 .transition()
57057                 .duration(duration)
57058                 .on('start', function() { map.startEase(); })
57059                 .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
57060         } else {
57061             projection.translate(t$$1);
57062             transformStart = projection.transform();
57063             _selection.call(zoom$$1.transform, transformStart);
57064         }
57065
57066         return true;
57067     }
57068
57069
57070     map.pan = function(delta, duration) {
57071         var t$$1 = projection.translate(),
57072             k = projection.scale();
57073
57074         t$$1[0] += delta[0];
57075         t$$1[1] += delta[1];
57076
57077         if (duration) {
57078             _selection
57079                 .transition()
57080                 .duration(duration)
57081                 .on('start', function() { map.startEase(); })
57082                 .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
57083         } else {
57084             projection.translate(t$$1);
57085             transformStart = projection.transform();
57086             _selection.call(zoom$$1.transform, transformStart);
57087             dispatch$$1.call('move', this, map);
57088             immediateRedraw();
57089         }
57090
57091         return map;
57092     };
57093
57094
57095     map.dimensions = function(_) {
57096         if (!arguments.length) return dimensions;
57097         var center = map.center();
57098         dimensions = _;
57099         drawLayers.dimensions(dimensions);
57100         context.background().dimensions(dimensions);
57101         projection.clipExtent([[0, 0], dimensions]);
57102         mouse = utilFastMouse(supersurface.node());
57103         setCenter(center);
57104
57105         scheduleRedraw();
57106         return map;
57107     };
57108
57109
57110     function zoomIn(delta) {
57111         setZoom(~~map.zoom() + delta, true, 250);
57112     }
57113
57114     function zoomOut(delta) {
57115         setZoom(~~map.zoom() - delta, true, 250);
57116     }
57117
57118     map.zoomIn = function() { zoomIn(1); };
57119     map.zoomInFurther = function() { zoomIn(4); };
57120
57121     map.zoomOut = function() { zoomOut(1); };
57122     map.zoomOutFurther = function() { zoomOut(4); };
57123
57124
57125     map.center = function(loc2) {
57126         if (!arguments.length) {
57127             return projection.invert(pxCenter());
57128         }
57129
57130         if (setCenter(loc2)) {
57131             dispatch$$1.call('move', this, map);
57132         }
57133
57134         scheduleRedraw();
57135         return map;
57136     };
57137
57138
57139     map.zoom = function(z2) {
57140         if (!arguments.length) {
57141             return Math.max(ktoz(projection.scale() * 2 * Math.PI), 0);
57142         }
57143
57144         if (z2 < minzoom) {
57145             surface.interrupt();
57146             uiFlash().text(t('cannot_zoom'))();
57147             z2 = context.minEditableZoom();
57148         }
57149
57150         if (setZoom(z2)) {
57151             dispatch$$1.call('move', this, map);
57152         }
57153
57154         scheduleRedraw();
57155         return map;
57156     };
57157
57158
57159     map.zoomTo = function(entity, zoomLimits) {
57160         var extent = entity.extent(context.graph());
57161         if (!isFinite(extent.area())) return;
57162
57163         var z2 = map.trimmedExtentZoom(extent);
57164         zoomLimits = zoomLimits || [context.minEditableZoom(), 20];
57165         map.centerZoom(extent.center(), Math.min(Math.max(z2, zoomLimits[0]), zoomLimits[1]));
57166     };
57167
57168
57169     map.centerZoom = function(loc2, z2) {
57170         var centered = setCenter(loc2),
57171             zoomed   = setZoom(z2);
57172
57173         if (centered || zoomed) {
57174             dispatch$$1.call('move', this, map);
57175         }
57176
57177         scheduleRedraw();
57178         return map;
57179     };
57180
57181
57182     map.centerEase = function(loc2, duration) {
57183         duration = duration || 250;
57184         setCenter(loc2, duration);
57185         return map;
57186     };
57187
57188
57189     map.zoomEase = function(z2, duration) {
57190         duration = duration || 250;
57191         setZoom(z2, false, duration);
57192         return map;
57193     };
57194
57195
57196     map.transformEase = function(t2, duration) {
57197         duration = duration || 250;
57198         setTransform(t2, duration, false);
57199         return map;
57200     };
57201
57202
57203     map.startEase = function() {
57204         utilBindOnce(surface, 'mousedown.ease', function() {
57205             map.cancelEase();
57206         });
57207         return map;
57208     };
57209
57210
57211     map.cancelEase = function() {
57212         _selection.interrupt();
57213         return map;
57214     };
57215
57216
57217     map.extent = function(_) {
57218         if (!arguments.length) {
57219             return new geoExtent$$1(projection.invert([0, dimensions[1]]),
57220                                  projection.invert([dimensions[0], 0]));
57221         } else {
57222             var extent = geoExtent$$1(_);
57223             map.centerZoom(extent.center(), map.extentZoom(extent));
57224         }
57225     };
57226
57227
57228     map.trimmedExtent = function(_) {
57229         if (!arguments.length) {
57230             var headerY = 60, footerY = 30, pad = 10;
57231             return new geoExtent$$1(projection.invert([pad, dimensions[1] - footerY - pad]),
57232                                  projection.invert([dimensions[0] - pad, headerY + pad]));
57233         } else {
57234             var extent = geoExtent$$1(_);
57235             map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
57236         }
57237     };
57238
57239
57240     function calcZoom(extent, dim) {
57241         var tl = projection([extent[0][0], extent[1][1]]),
57242             br = projection([extent[1][0], extent[0][1]]);
57243
57244         // Calculate maximum zoom that fits extent
57245         var hFactor = (br[0] - tl[0]) / dim[0],
57246             vFactor = (br[1] - tl[1]) / dim[1],
57247             hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2,
57248             vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2,
57249             newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
57250
57251         return newZoom;
57252     }
57253
57254
57255     map.extentZoom = function(_) {
57256         return calcZoom(geoExtent$$1(_), dimensions);
57257     };
57258
57259
57260     map.trimmedExtentZoom = function(_) {
57261         var trimY = 120, trimX = 40,
57262             trimmed = [dimensions[0] - trimX, dimensions[1] - trimY];
57263         return calcZoom(geoExtent$$1(_), trimmed);
57264     };
57265
57266
57267     map.editable = function() {
57268         var osmLayer = surface.selectAll('.data-layer-osm');
57269         if (!osmLayer.empty() && osmLayer.classed('disabled')) return false;
57270
57271         return map.zoom() >= context.minEditableZoom();
57272     };
57273
57274
57275     map.minzoom = function(_) {
57276         if (!arguments.length) return minzoom;
57277         minzoom = _;
57278         return map;
57279     };
57280
57281
57282     map.layers = drawLayers;
57283
57284
57285     return utilRebind(map, dispatch$$1, 'on');
57286 }
57287
57288 function uiMapInMap(context) {
57289
57290     function map_in_map(selection$$1) {
57291         var backgroundLayer = rendererTileLayer(context);
57292         var overlayLayers = {};
57293         var projection$$1 = geoRawMercator();
57294         var gpxLayer = svgGpx$$1(projection$$1, context).showLabels(false);
57295         var debugLayer = svgDebug$$1(projection$$1, context);
57296         var zoom$$1 = d3_zoom()
57297             .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)])
57298             .on('start', zoomStarted)
57299             .on('zoom', zoomed)
57300             .on('end', zoomEnded);
57301         var isTransformed = false;
57302         var isHidden = true;
57303         var skipEvents = false;
57304         var gesture = null;
57305         var zDiff = 6;    // by default, minimap renders at (main zoom - 6)
57306         var wrap = d3_select(null);
57307         var tiles = d3_select(null);
57308         var viewport = d3_select(null);
57309         var tStart;    // transform at start of gesture
57310         var tCurr;     // transform at most recent event
57311         var timeoutId;
57312
57313
57314         function zoomStarted() {
57315             if (skipEvents) return;
57316             tStart = tCurr = projection$$1.transform();
57317             gesture = null;
57318         }
57319
57320
57321         function zoomed() {
57322             if (skipEvents) return;
57323
57324             var x = event.transform.x;
57325             var y = event.transform.y;
57326             var k = event.transform.k;
57327             var isZooming = (k !== tStart.k);
57328             var isPanning = (x !== tStart.x || y !== tStart.y);
57329
57330             if (!isZooming && !isPanning) {
57331                 return;  // no change
57332             }
57333
57334             // lock in either zooming or panning, don't allow both in minimap.
57335             if (!gesture) {
57336                 gesture = isZooming ? 'zoom' : 'pan';
57337             }
57338
57339             var tMini = projection$$1.transform();
57340             var tX, tY, scale;
57341
57342             if (gesture === 'zoom') {
57343                 var dMini = utilGetDimensions(wrap);
57344                 var cMini = geoVecScale(dMini, 0.5);
57345                 scale = k / tMini.k;
57346                 tX = (cMini[0] / scale - cMini[0]) * scale;
57347                 tY = (cMini[1] / scale - cMini[1]) * scale;
57348             } else {
57349                 k = tMini.k;
57350                 scale = 1;
57351                 tX = x - tMini.x;
57352                 tY = y - tMini.y;
57353             }
57354
57355             utilSetTransform(tiles, tX, tY, scale);
57356             utilSetTransform(viewport, 0, 0, scale);
57357             isTransformed = true;
57358             tCurr = identity$7.translate(x, y).scale(k);
57359
57360             var zMain = geoScaleToZoom(context.projection.scale());
57361             var zMini = geoScaleToZoom(k);
57362
57363             zDiff = zMain - zMini;
57364
57365             queueRedraw();
57366         }
57367
57368
57369         function zoomEnded() {
57370             if (skipEvents) return;
57371             if (gesture !== 'pan') return;
57372
57373             updateProjection();
57374             gesture = null;
57375             var dMini = utilGetDimensions(wrap);
57376             var cMini = geoVecScale(dMini, 0.5);
57377             context.map().center(projection$$1.invert(cMini));   // recenter main map..
57378         }
57379
57380
57381         function updateProjection() {
57382             var loc = context.map().center();
57383             var dMini = utilGetDimensions(wrap);
57384             var cMini = geoVecScale(dMini, 0.5);
57385             var tMain = context.projection.transform();
57386             var zMain = geoScaleToZoom(tMain.k);
57387             var zMini = Math.max(zMain - zDiff, 0.5);
57388             var kMini = geoZoomToScale(zMini);
57389
57390             projection$$1
57391                 .translate([tMain.x, tMain.y])
57392                 .scale(kMini);
57393
57394             var point$$1 = projection$$1(loc);
57395             var mouse = (gesture === 'pan') ? geoVecSubtract([tCurr.x, tCurr.y], [tStart.x, tStart.y]) : [0, 0];
57396             var xMini = cMini[0] - point$$1[0] + tMain.x + mouse[0];
57397             var yMini = cMini[1] - point$$1[1] + tMain.y + mouse[1];
57398
57399             projection$$1
57400                 .translate([xMini, yMini])
57401                 .clipExtent([[0, 0], dMini]);
57402
57403             tCurr = projection$$1.transform();
57404
57405             if (isTransformed) {
57406                 utilSetTransform(tiles, 0, 0);
57407                 utilSetTransform(viewport, 0, 0);
57408                 isTransformed = false;
57409             }
57410
57411             zoom$$1
57412                 .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
57413
57414             skipEvents = true;
57415             wrap.call(zoom$$1.transform, tCurr);
57416             skipEvents = false;
57417         }
57418
57419
57420         function redraw() {
57421             clearTimeout(timeoutId);
57422             if (isHidden) return;
57423
57424             updateProjection();
57425
57426             var dMini = utilGetDimensions(wrap);
57427             var zMini = geoScaleToZoom(projection$$1.scale());
57428
57429             // setup tile container
57430             tiles = wrap
57431                 .selectAll('.map-in-map-tiles')
57432                 .data([0]);
57433
57434             tiles = tiles.enter()
57435                 .append('div')
57436                 .attr('class', 'map-in-map-tiles')
57437                 .merge(tiles);
57438
57439             // redraw background
57440             backgroundLayer
57441                 .source(context.background().baseLayerSource())
57442                 .projection(projection$$1)
57443                 .dimensions(dMini);
57444
57445             var background = tiles
57446                 .selectAll('.map-in-map-background')
57447                 .data([0]);
57448
57449             background.enter()
57450                 .append('div')
57451                 .attr('class', 'map-in-map-background')
57452                 .merge(background)
57453                 .call(backgroundLayer);
57454
57455
57456             // redraw overlay
57457             var overlaySources = context.background().overlayLayerSources();
57458             var activeOverlayLayers = [];
57459             for (var i = 0; i < overlaySources.length; i++) {
57460                 if (overlaySources[i].validZoom(zMini)) {
57461                     if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
57462                     activeOverlayLayers.push(overlayLayers[i]
57463                         .source(overlaySources[i])
57464                         .projection(projection$$1)
57465                         .dimensions(dMini));
57466                 }
57467             }
57468
57469             var overlay = tiles
57470                 .selectAll('.map-in-map-overlay')
57471                 .data([0]);
57472
57473             overlay = overlay.enter()
57474                 .append('div')
57475                 .attr('class', 'map-in-map-overlay')
57476                 .merge(overlay);
57477
57478
57479             var overlays = overlay
57480                 .selectAll('div')
57481                 .data(activeOverlayLayers, function(d) { return d.source().name(); });
57482
57483             overlays.exit()
57484                 .remove();
57485
57486             overlays = overlays.enter()
57487                 .append('div')
57488                 .merge(overlays)
57489                 .each(function(layer) { d3_select(this).call(layer); });
57490
57491
57492             var dataLayers = tiles
57493                 .selectAll('.map-in-map-data')
57494                 .data([0]);
57495
57496             dataLayers.exit()
57497                 .remove();
57498
57499             dataLayers = dataLayers.enter()
57500                 .append('svg')
57501                 .attr('class', 'map-in-map-data')
57502                 .merge(dataLayers)
57503                 .call(gpxLayer)
57504                 .call(debugLayer);
57505
57506
57507             // redraw viewport bounding box
57508             if (gesture !== 'pan') {
57509                 var getPath = d3_geoPath(projection$$1);
57510                 var bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
57511
57512                 viewport = wrap.selectAll('.map-in-map-viewport')
57513                     .data([0]);
57514
57515                 viewport = viewport.enter()
57516                     .append('svg')
57517                     .attr('class', 'map-in-map-viewport')
57518                     .merge(viewport);
57519
57520
57521                 var path = viewport.selectAll('.map-in-map-bbox')
57522                     .data([bbox]);
57523
57524                 path.enter()
57525                     .append('path')
57526                     .attr('class', 'map-in-map-bbox')
57527                     .merge(path)
57528                     .attr('d', getPath)
57529                     .classed('thick', function(d) { return getPath.area(d) < 30; });
57530             }
57531         }
57532
57533
57534         function queueRedraw() {
57535             clearTimeout(timeoutId);
57536             timeoutId = setTimeout(function() { redraw(); }, 750);
57537         }
57538
57539
57540         function toggle() {
57541             if (event) event.preventDefault();
57542
57543             isHidden = !isHidden;
57544
57545             d3_select('.minimap-toggle-item')
57546                 .classed('active', !isHidden)
57547                 .select('input')
57548                 .property('checked', !isHidden);
57549
57550             if (isHidden) {
57551                 wrap
57552                     .style('display', 'block')
57553                     .style('opacity', '1')
57554                     .transition()
57555                     .duration(200)
57556                     .style('opacity', '0')
57557                     .on('end', function() {
57558                         selection$$1.selectAll('.map-in-map')
57559                             .style('display', 'none');
57560                     });
57561             } else {
57562                 wrap
57563                     .style('display', 'block')
57564                     .style('opacity', '0')
57565                     .transition()
57566                     .duration(200)
57567                     .style('opacity', '1')
57568                     .on('end', function() {
57569                         redraw();
57570                     });
57571             }
57572         }
57573
57574
57575         uiMapInMap.toggle = toggle;
57576
57577         wrap = selection$$1.selectAll('.map-in-map')
57578             .data([0]);
57579
57580         wrap = wrap.enter()
57581             .append('div')
57582             .attr('class', 'map-in-map')
57583             .style('display', (isHidden ? 'none' : 'block'))
57584             .call(zoom$$1)
57585             .on('dblclick.zoom', null)
57586             .merge(wrap);
57587
57588         context.map()
57589             .on('drawn.map-in-map', function(drawn) {
57590                 if (drawn.full === true) {
57591                     redraw();
57592                 }
57593             });
57594
57595         redraw();
57596
57597         var keybinding = d3keybinding('map-in-map')
57598             .on(t('background.minimap.key'), toggle);
57599
57600         d3_select(document)
57601             .call(keybinding);
57602     }
57603
57604     return map_in_map;
57605 }
57606
57607 function uiBackground(context) {
57608     var key = t('background.key');
57609
57610     var _customSource = context.background().findSource('custom');
57611     var _previousBackground = context.background().findSource(context.storage('background-last-used-toggle'));
57612     var _shown = false;
57613
57614     var _backgroundList = d3_select(null);
57615     var _overlayList = d3_select(null);
57616     var _displayOptionsContainer = d3_select(null);
57617     var _offsetContainer = d3_select(null);
57618
57619     var backgroundDisplayOptions = uiBackgroundDisplayOptions(context);
57620     var backgroundOffset = uiBackgroundOffset(context);
57621
57622
57623     function setTooltips(selection$$1) {
57624         selection$$1.each(function(d, i, nodes) {
57625             var item = d3_select(this).select('label');
57626             var span = item.select('span');
57627             var placement = (i < nodes.length / 2) ? 'bottom' : 'top';
57628             var description = d.description();
57629             var isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
57630
57631             if (d === _previousBackground) {
57632                 item.call(tooltip()
57633                     .placement(placement)
57634                     .html(true)
57635                     .title(function() {
57636                         var tip = '<div>' + t('background.switch') + '</div>';
57637                         return uiTooltipHtml(tip, uiCmd('⌘' + key));
57638                     })
57639                 );
57640             } else if (description || isOverflowing) {
57641                 item.call(tooltip()
57642                     .placement(placement)
57643                     .title(description || d.name())
57644                 );
57645             } else {
57646                 item.call(tooltip().destroy);
57647             }
57648         });
57649     }
57650
57651
57652     function updateLayerSelections(selection$$1) {
57653         function active(d) {
57654             return context.background().showsLayer(d);
57655         }
57656
57657         selection$$1.selectAll('.layer')
57658             .classed('active', active)
57659             .classed('switch', function(d) { return d === _previousBackground; })
57660             .call(setTooltips)
57661             .selectAll('input')
57662             .property('checked', active);
57663     }
57664
57665
57666     function chooseBackground(d) {
57667         if (d.id === 'custom' && !d.template()) {
57668             return editCustom();
57669         }
57670
57671         event.preventDefault();
57672         _previousBackground = context.background().baseLayerSource();
57673         context.storage('background-last-used-toggle', _previousBackground.id);
57674         context.storage('background-last-used', d.id);
57675         context.background().baseLayerSource(d);
57676         _backgroundList.call(updateLayerSelections);
57677         document.activeElement.blur();
57678     }
57679
57680
57681     function editCustom() {
57682         event.preventDefault();
57683         var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
57684         var template = window.prompt(
57685             t('background.custom_prompt', { example: example }),
57686             _customSource.template() || example
57687         );
57688
57689         if (template) {
57690             context.storage('background-custom-template', template);
57691             _customSource.template(template);
57692             chooseBackground(_customSource);
57693         } else {
57694             _backgroundList.call(updateLayerSelections);
57695         }
57696     }
57697
57698
57699     function chooseOverlay(d) {
57700         event.preventDefault();
57701         context.background().toggleOverlayLayer(d);
57702         _overlayList.call(updateLayerSelections);
57703         document.activeElement.blur();
57704     }
57705
57706
57707     function drawListItems(layerList, type, change, filter) {
57708         var sources = context.background()
57709             .sources(context.map().extent())
57710             .filter(filter);
57711
57712         var layerLinks = layerList.selectAll('li.layer')
57713             .data(sources, function(d) { return d.name(); });
57714
57715         layerLinks.exit()
57716             .remove();
57717
57718         var enter = layerLinks.enter()
57719             .append('li')
57720             .attr('class', 'layer')
57721             .classed('layer-custom', function(d) { return d.id === 'custom'; })
57722             .classed('best', function(d) { return d.best(); });
57723
57724         enter.filter(function(d) { return d.id === 'custom'; })
57725             .append('button')
57726             .attr('class', 'layer-browse')
57727             .call(tooltip()
57728                 .title(t('background.custom_button'))
57729                 .placement((textDirection === 'rtl') ? 'right' : 'left')
57730             )
57731             .on('click', editCustom)
57732             .call(svgIcon('#icon-search'));
57733
57734         enter.filter(function(d) { return d.best(); })
57735             .append('div')
57736             .attr('class', 'best')
57737             .call(tooltip()
57738                 .title(t('background.best_imagery'))
57739                 .placement((textDirection === 'rtl') ? 'right' : 'left')
57740             )
57741             .append('span')
57742             .html('&#9733;');
57743
57744         var label = enter
57745             .append('label');
57746
57747         label
57748             .append('input')
57749             .attr('type', type)
57750             .attr('name', 'layers')
57751             .on('change', change);
57752
57753         label
57754             .append('span')
57755             .text(function(d) { return d.name(); });
57756
57757
57758         layerList.selectAll('li.layer')
57759             .sort(sortSources)
57760             .style('display', layerList.selectAll('li.layer').data().length > 0 ? 'block' : 'none');
57761
57762         layerList
57763             .call(updateLayerSelections);
57764
57765
57766         function sortSources(a, b) {
57767             return a.best() && !b.best() ? -1
57768                 : b.best() && !a.best() ? 1
57769                 : d3_descending(a.area(), b.area()) || d3_ascending(a.name(), b.name()) || 0;
57770         }
57771     }
57772
57773
57774     function renderBackgroundList(selection$$1) {
57775
57776         // the background list
57777         var container = selection$$1.selectAll('.layer-background-list')
57778             .data([0]);
57779
57780         _backgroundList = container.enter()
57781             .append('ul')
57782             .attr('class', 'layer-list layer-background-list')
57783             .attr('dir', 'auto')
57784             .merge(container);
57785
57786
57787         // add minimap toggle below list
57788         var minimapEnter = selection$$1.selectAll('.minimap-toggle-list')
57789             .data([0])
57790             .enter()
57791             .append('ul')
57792             .attr('class', 'layer-list minimap-toggle-list')
57793             .append('li')
57794             .attr('class', 'layer minimap-toggle-item');
57795
57796         var minimapLabelEnter = minimapEnter
57797             .append('label')
57798             .call(tooltip()
57799                 .html(true)
57800                 .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
57801                 .placement('top')
57802             );
57803
57804         minimapLabelEnter
57805             .append('input')
57806             .attr('type', 'checkbox')
57807             .on('change', function() {
57808                 event.preventDefault();
57809                 uiMapInMap.toggle();
57810             });
57811
57812         minimapLabelEnter
57813             .append('span')
57814             .text(t('background.minimap.description'));
57815
57816
57817         // "Info / Report a Problem" link
57818         selection$$1.selectAll('.imagery-faq')
57819             .data([0])
57820             .enter()
57821             .append('div')
57822             .attr('class', 'imagery-faq')
57823             .append('a')
57824             .attr('target', '_blank')
57825             .attr('tabindex', -1)
57826             .call(svgIcon('#icon-out-link', 'inline'))
57827             .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
57828             .append('span')
57829             .text(t('background.imagery_source_faq'));
57830     }
57831
57832
57833     function renderOverlayList(selection$$1) {
57834         var container = selection$$1.selectAll('.layer-overlay-list')
57835             .data([0]);
57836
57837         _overlayList = container.enter()
57838             .append('ul')
57839             .attr('class', 'layer-list layer-overlay-list')
57840             .attr('dir', 'auto')
57841             .merge(container);
57842     }
57843
57844
57845     function update() {
57846         _backgroundList
57847             .call(drawListItems, 'radio', chooseBackground, function(d) { return !d.isHidden() && !d.overlay; });
57848
57849         _overlayList
57850             .call(drawListItems, 'checkbox', chooseOverlay, function(d) { return !d.isHidden() && d.overlay; });
57851
57852         _displayOptionsContainer
57853             .call(backgroundDisplayOptions);
57854
57855         _offsetContainer
57856             .call(backgroundOffset);
57857     }
57858
57859
57860     function quickSwitch() {
57861         if (event) {
57862             event.stopImmediatePropagation();
57863             event.preventDefault();
57864         }
57865         if (_previousBackground) {
57866             chooseBackground(_previousBackground);
57867         }
57868     }
57869
57870
57871     function background(selection$$1) {
57872
57873         function hidePane() {
57874             setVisible(false);
57875         }
57876
57877         function togglePane() {
57878             if (event) event.preventDefault();
57879             paneTooltip.hide(button);
57880             setVisible(!button.classed('active'));
57881         }
57882
57883         function setVisible(show) {
57884             if (show !== _shown) {
57885                 button.classed('active', show);
57886                 _shown = show;
57887
57888                 if (show) {
57889                     uiMapData.hidePane();
57890                     uiHelp.hidePane();
57891                     update();
57892
57893                     pane
57894                         .style('display', 'block')
57895                         .style('right', '-300px')
57896                         .transition()
57897                         .duration(200)
57898                         .style('right', '0px');
57899
57900                 } else {
57901                     pane
57902                         .style('display', 'block')
57903                         .style('right', '0px')
57904                         .transition()
57905                         .duration(200)
57906                         .style('right', '-300px')
57907                         .on('end', function() {
57908                             d3_select(this).style('display', 'none');
57909                         });
57910                 }
57911             }
57912         }
57913
57914
57915         var pane = selection$$1
57916             .append('div')
57917             .attr('class', 'fillL map-overlay col3 content hide');
57918
57919         var paneTooltip = tooltip()
57920             .placement((textDirection === 'rtl') ? 'right' : 'left')
57921             .html(true)
57922             .title(uiTooltipHtml(t('background.description'), key));
57923
57924         var button = selection$$1
57925             .append('button')
57926             .attr('tabindex', -1)
57927             .on('click', togglePane)
57928             .call(svgIcon('#icon-layers', 'light'))
57929             .call(paneTooltip);
57930
57931         pane
57932             .append('h2')
57933             .text(t('background.title'));
57934
57935         // background list
57936         pane
57937             .append('div')
57938             .attr('class', 'background-background-list-container')
57939             .call(uiDisclosure(context, 'background_list', true)
57940                 .title(t('background.backgrounds'))
57941                 .content(renderBackgroundList)
57942             );
57943
57944         // overlay list
57945         pane
57946             .append('div')
57947             .attr('class', 'background-overlay-list-container')
57948             .call(uiDisclosure(context, 'overlay_list', true)
57949                 .title(t('background.overlays'))
57950                 .content(renderOverlayList)
57951             );
57952
57953         // display options
57954         _displayOptionsContainer = pane
57955             .append('div')
57956             .attr('class', 'background-display-options');
57957
57958         // offset controls
57959         _offsetContainer = pane
57960             .append('div')
57961             .attr('class', 'background-offset');
57962
57963
57964         // add listeners
57965         context.map()
57966             .on('move.background-update', debounce(utilCallWhenIdle(update), 1000));
57967
57968         context.background()
57969             .on('change.background-update', update);
57970
57971
57972         update();
57973
57974         var keybinding = d3keybinding('background')
57975             .on(key, togglePane)
57976             .on(uiCmd('⌘' + key), quickSwitch)
57977             .on([t('map_data.key'), t('help.key')], hidePane);
57978
57979         d3_select(document)
57980             .call(keybinding);
57981
57982         uiBackground.hidePane = hidePane;
57983         uiBackground.togglePane = togglePane;
57984         uiBackground.setVisible = setVisible;
57985     }
57986
57987     return background;
57988 }
57989
57990 function uiContributors(context) {
57991     var osm = context.connection(),
57992         debouncedUpdate = debounce(function() { update(); }, 1000),
57993         limit = 4,
57994         hidden = false,
57995         wrap = d3_select(null);
57996
57997
57998     function update() {
57999         if (!osm) return;
58000
58001         var users = {},
58002             entities = context.intersects(context.map().extent());
58003
58004         entities.forEach(function(entity) {
58005             if (entity && entity.user) users[entity.user] = true;
58006         });
58007
58008         var u = Object.keys(users),
58009             subset = u.slice(0, u.length > limit ? limit - 1 : limit);
58010
58011         wrap.html('')
58012             .call(svgIcon('#icon-nearby', 'pre-text light'));
58013
58014         var userList = d3_select(document.createElement('span'));
58015
58016         userList.selectAll()
58017             .data(subset)
58018             .enter()
58019             .append('a')
58020             .attr('class', 'user-link')
58021             .attr('href', function(d) { return osm.userURL(d); })
58022             .attr('target', '_blank')
58023             .attr('tabindex', -1)
58024             .text(String);
58025
58026         if (u.length > limit) {
58027             var count = d3_select(document.createElement('span'));
58028
58029             count.append('a')
58030                 .attr('target', '_blank')
58031                 .attr('tabindex', -1)
58032                 .attr('href', function() {
58033                     return osm.changesetsURL(context.map().center(), context.map().zoom());
58034                 })
58035                 .text(u.length - limit + 1);
58036
58037             wrap.append('span')
58038                 .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
58039
58040         } else {
58041             wrap.append('span')
58042                 .html(t('contributors.list', { users: userList.html() }));
58043         }
58044
58045         if (!u.length) {
58046             hidden = true;
58047             wrap
58048                 .transition()
58049                 .style('opacity', 0);
58050
58051         } else if (hidden) {
58052             wrap
58053                 .transition()
58054                 .style('opacity', 1);
58055         }
58056     }
58057
58058
58059     return function(selection$$1) {
58060         if (!osm) return;
58061         wrap = selection$$1;
58062         update();
58063
58064         osm.on('loaded.contributors', debouncedUpdate);
58065         context.map().on('move.contributors', debouncedUpdate);
58066     };
58067 }
58068
58069 function uiFeatureInfo(context) {
58070     function update(selection$$1) {
58071         var features = context.features(),
58072             stats = features.stats(),
58073             count = 0,
58074             hiddenList = compact(map$3(features.hidden(), function(k) {
58075                 if (stats[k]) {
58076                     count += stats[k];
58077                     return String(stats[k]) + ' ' + t('feature.' + k + '.description');
58078                 }
58079             }));
58080
58081         selection$$1.html('');
58082
58083         if (hiddenList.length) {
58084             var tooltipBehavior = tooltip()
58085                 .placement('top')
58086                 .html(true)
58087                 .title(function() {
58088                     return uiTooltipHtml(hiddenList.join('<br/>'));
58089                 });
58090
58091             var warning = selection$$1.append('a')
58092                 .attr('href', '#')
58093                 .attr('tabindex', -1)
58094                 .html(t('feature_info.hidden_warning', { count: count }))
58095                 .call(tooltipBehavior)
58096                 .on('click', function() {
58097                     tooltipBehavior.hide(warning);
58098                     // open map data panel?
58099                     event.preventDefault();
58100                 });
58101         }
58102
58103         selection$$1
58104             .classed('hide', !hiddenList.length);
58105     }
58106
58107
58108     return function(selection$$1) {
58109         update(selection$$1);
58110
58111         context.features().on('change.feature_info', function() {
58112             update(selection$$1);
58113         });
58114     };
58115 }
58116
58117 function uiFullScreen(context) {
58118     var element = context.container().node(),
58119         keybinding = d3keybinding('full-screen');
58120         // button;
58121
58122
58123     function getFullScreenFn() {
58124         if (element.requestFullscreen) {
58125             return element.requestFullscreen;
58126         } else if (element.msRequestFullscreen) {
58127             return element.msRequestFullscreen;
58128         } else if (element.mozRequestFullScreen) {
58129             return element.mozRequestFullScreen;
58130         } else if (element.webkitRequestFullscreen) {
58131             return element.webkitRequestFullscreen;
58132         }
58133     }
58134
58135
58136     function getExitFullScreenFn() {
58137         if (document.exitFullscreen) {
58138             return document.exitFullscreen;
58139         } else if (document.msExitFullscreen) {
58140             return document.msExitFullscreen;
58141         } else if (document.mozCancelFullScreen) {
58142             return document.mozCancelFullScreen;
58143         } else if (document.webkitExitFullscreen) {
58144             return document.webkitExitFullscreen;
58145         }
58146     }
58147
58148
58149     function isFullScreen() {
58150         return document.fullscreenElement ||
58151             document.mozFullScreenElement ||
58152             document.webkitFullscreenElement ||
58153             document.msFullscreenElement;
58154     }
58155
58156
58157     function isSupported() {
58158         return !!getFullScreenFn();
58159     }
58160
58161
58162     function fullScreen() {
58163         event.preventDefault();
58164         if (!isFullScreen()) {
58165             // button.classed('active', true);
58166             getFullScreenFn().apply(element);
58167         } else {
58168             // button.classed('active', false);
58169             getExitFullScreenFn().apply(document);
58170         }
58171     }
58172
58173
58174     return function() { // selection) {
58175         if (!isSupported())
58176             return;
58177
58178         // button = selection.append('button')
58179         //     .attr('title', t('full_screen'))
58180         //     .attr('tabindex', -1)
58181         //     .on('click', fullScreen)
58182         //     .call(tooltip);
58183
58184         // button.append('span')
58185         //     .attr('class', 'icon full-screen');
58186
58187         var detected = utilDetect();
58188         var keys = detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11'];
58189         keybinding.on(keys, fullScreen);
58190
58191         d3_select(document)
58192             .call(keybinding);
58193     };
58194 }
58195
58196 function uiLoading(context) {
58197     var _modalSelection = d3_select(null);
58198     var _message = '';
58199     var _blocking = false;
58200
58201
58202     var loading = function(selection$$1) {
58203         _modalSelection = uiModal(selection$$1, _blocking);
58204
58205         var loadertext = _modalSelection.select('.content')
58206             .classed('loading-modal', true)
58207             .append('div')
58208             .attr('class', 'modal-section fillL');
58209
58210         loadertext
58211             .append('img')
58212             .attr('class', 'loader')
58213             .attr('src', context.imagePath('loader-white.gif'));
58214
58215         loadertext
58216             .append('h3')
58217             .text(_message);
58218
58219         _modalSelection.select('button.close')
58220             .attr('class', 'hide');
58221
58222         return loading;
58223     };
58224
58225
58226     loading.message = function(_) {
58227         if (!arguments.length) return _message;
58228         _message = _;
58229         return loading;
58230     };
58231
58232
58233     loading.blocking = function(_) {
58234         if (!arguments.length) return _blocking;
58235         _blocking = _;
58236         return loading;
58237     };
58238
58239
58240     loading.close = function() {
58241         _modalSelection.remove();
58242     };
58243
58244
58245     return loading;
58246 }
58247
58248 function uiGeolocate(context) {
58249     var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ },
58250         locating = uiLoading(context).message(t('geolocate.locating')).blocking(true),
58251         timeoutId;
58252
58253
58254     function click() {
58255         if (context.inIntro()) return;
58256         context.enter(modeBrowse(context));
58257         context.container().call(locating);
58258         navigator.geolocation.getCurrentPosition(success, error, geoOptions);
58259
58260         // This timeout ensures that we still call finish() even if
58261         // the user declines to share their location in Firefox
58262         timeoutId = setTimeout(finish, 10000 /* 10sec */ );
58263     }
58264
58265
58266     function success(position) {
58267         var map = context.map(),
58268             extent = geoExtent$$1([position.coords.longitude, position.coords.latitude])
58269                 .padByMeters(position.coords.accuracy);
58270
58271         map.centerZoom(extent.center(), Math.min(20, map.extentZoom(extent)));
58272         finish();
58273     }
58274
58275
58276     function error() {
58277         finish();
58278     }
58279
58280
58281     function finish() {
58282         locating.close();  // unblock ui
58283         if (timeoutId) { clearTimeout(timeoutId); }
58284         timeoutId = undefined;
58285     }
58286
58287
58288     return function(selection) {
58289         if (!navigator.geolocation) return;
58290
58291         selection
58292             .append('button')
58293             .attr('tabindex', -1)
58294             .attr('title', t('geolocate.title'))
58295             .on('click', click)
58296             .call(svgIcon('#icon-geolocate', 'light'))
58297             .call(tooltip()
58298                 .placement((textDirection === 'rtl') ? 'right' : 'left'));
58299     };
58300 }
58301
58302 function uiPanelBackground(context) {
58303     var background = context.background();
58304     var currSourceName = null;
58305     var metadata = {};
58306     var metadataKeys = [
58307         'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
58308     ];
58309
58310     var debouncedRedraw = debounce(redraw, 250);
58311
58312     function redraw(selection$$1) {
58313         var source = background.baseLayerSource(),
58314             isDG = (source.id.match(/^DigitalGlobe/i) !== null);
58315
58316         if (currSourceName !== source.name()) {
58317             currSourceName = source.name();
58318             metadata = {};
58319         }
58320
58321         selection$$1.html('');
58322
58323         var list = selection$$1
58324             .append('ul')
58325             .attr('class', 'background-info');
58326
58327         list
58328             .append('li')
58329             .text(currSourceName);
58330
58331         metadataKeys.forEach(function(k) {
58332             // DigitalGlobe vintage is available in raster layers for now.
58333             if (isDG && k === 'vintage') return;
58334
58335             list
58336                 .append('li')
58337                 .attr('class', 'background-info-list-' + k)
58338                 .classed('hide', !metadata[k])
58339                 .text(t('info_panels.background.' + k) + ':')
58340                 .append('span')
58341                 .attr('class', 'background-info-span-' + k)
58342                 .text(metadata[k]);
58343         });
58344
58345         debouncedGetMetadata(selection$$1);
58346
58347         var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
58348
58349         selection$$1
58350             .append('a')
58351             .text(t('info_panels.background.' + toggleTiles))
58352             .attr('href', '#')
58353             .attr('class', 'button button-toggle-tiles')
58354             .on('click', function() {
58355                 event.preventDefault();
58356                 context.setDebug('tile', !context.getDebug('tile'));
58357                 selection$$1.call(redraw);
58358             });
58359
58360         if (isDG) {
58361             var key = source.id + '-vintage';
58362             var sourceVintage = context.background().findSource(key);
58363             var showsVintage = context.background().showsLayer(sourceVintage);
58364             var toggleVintage = showsVintage ? 'hide_vintage' : 'show_vintage';
58365             selection$$1
58366                 .append('a')
58367                 .text(t('info_panels.background.' + toggleVintage))
58368                 .attr('href', '#')
58369                 .attr('class', 'button button-toggle-vintage')
58370                 .on('click', function() {
58371                     event.preventDefault();
58372                     context.background().toggleOverlayLayer(sourceVintage);
58373                     selection$$1.call(redraw);
58374                 });
58375         }
58376
58377         // disable if necessary
58378         ['DigitalGlobe-Premium', 'DigitalGlobe-Standard'].forEach(function(layerId) {
58379             if (source.id !== layerId) {
58380                 var key = layerId + '-vintage';
58381                 var sourceVintage = context.background().findSource(key);
58382                 if (context.background().showsLayer(sourceVintage)) {
58383                     context.background().toggleOverlayLayer(sourceVintage);
58384                 }
58385             }
58386         });
58387     }
58388
58389
58390     var debouncedGetMetadata = debounce(getMetadata, 250);
58391
58392     function getMetadata(selection$$1) {
58393         var tile = d3_select('.layer-background img.tile-center');   // tile near viewport center
58394         if (tile.empty()) return;
58395
58396         var sourceName = currSourceName,
58397             d = tile.datum(),
58398             zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom()),
58399             center = context.map().center();
58400
58401         // update zoom
58402         metadata.zoom = String(zoom);
58403         selection$$1.selectAll('.background-info-list-zoom')
58404             .classed('hide', false)
58405             .selectAll('.background-info-span-zoom')
58406             .text(metadata.zoom);
58407
58408         if (!d || !d.length >= 3) return;
58409
58410         background.baseLayerSource().getMetadata(center, d, function(err, result) {
58411             if (err || currSourceName !== sourceName) return;
58412
58413             // update vintage
58414             var vintage = result.vintage;
58415             metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
58416             selection$$1.selectAll('.background-info-list-vintage')
58417                 .classed('hide', false)
58418                 .selectAll('.background-info-span-vintage')
58419                 .text(metadata.vintage);
58420
58421             // update other metdata
58422             without(metadataKeys, 'zoom', 'vintage')
58423                 .forEach(function(k) {
58424                     var val = result[k];
58425                     metadata[k] = val;
58426                     selection$$1.selectAll('.background-info-list-' + k)
58427                         .classed('hide', !val)
58428                         .selectAll('.background-info-span-' + k)
58429                         .text(val);
58430                 });
58431         });
58432     }
58433
58434
58435     var panel = function(selection$$1) {
58436         selection$$1.call(redraw);
58437
58438         context.map()
58439             .on('drawn.info-background', function() {
58440                 selection$$1.call(debouncedRedraw);
58441             })
58442             .on('move.info-background', function() {
58443                 selection$$1.call(debouncedGetMetadata);
58444             });
58445
58446     };
58447
58448     panel.off = function() {
58449         context.map()
58450             .on('drawn.info-background', null)
58451             .on('move.info-background', null);
58452     };
58453
58454     panel.id = 'background';
58455     panel.title = t('info_panels.background.title');
58456     panel.key = t('info_panels.background.key');
58457
58458
58459     return panel;
58460 }
58461
58462 function uiPanelHistory(context) {
58463     var osm;
58464
58465     function displayTimestamp(entity) {
58466         if (!entity.timestamp) return t('info_panels.history.unknown');
58467         var detected = utilDetect();
58468         var options = {
58469             day: 'numeric', month: 'short', year: 'numeric',
58470             hour: 'numeric', minute: 'numeric', second: 'numeric'
58471         };
58472         var d = new Date(entity.timestamp);
58473         if (isNaN(d.getTime())) return t('info_panels.history.unknown');
58474         return d.toLocaleString(detected.locale, options);
58475     }
58476
58477
58478     function displayUser(selection, entity) {
58479         if (!entity.user) {
58480             selection
58481                 .append('span')
58482                 .text(t('info_panels.history.unknown'));
58483             return;
58484         }
58485
58486         selection
58487             .append('span')
58488             .attr('class', 'user-name')
58489             .text(entity.user);
58490
58491         var links = selection
58492             .append('div')
58493             .attr('class', 'links');
58494
58495         if (osm) {
58496             links
58497                 .append('a')
58498                 .attr('class', 'user-osm-link')
58499                 .attr('href', osm.userURL(entity.user))
58500                 .attr('target', '_blank')
58501                 .attr('tabindex', -1)
58502                 .text('OSM');
58503         }
58504
58505         links
58506             .append('a')
58507             .attr('class', 'user-hdyc-link')
58508             .attr('href', 'https://hdyc.neis-one.org/?' + entity.user)
58509             .attr('target', '_blank')
58510             .attr('tabindex', -1)
58511             .text('HDYC');
58512     }
58513
58514
58515     function displayChangeset(selection, entity) {
58516         if (!entity.changeset) {
58517             selection
58518                 .append('span')
58519                 .text(t('info_panels.history.unknown'));
58520             return;
58521         }
58522
58523         selection
58524             .append('span')
58525             .attr('class', 'changeset-id')
58526             .text(entity.changeset);
58527
58528         var links = selection
58529             .append('div')
58530             .attr('class', 'links');
58531
58532         if (osm) {
58533             links
58534                 .append('a')
58535                 .attr('class', 'changeset-osm-link')
58536                 .attr('href', osm.changesetURL(entity.changeset))
58537                 .attr('target', '_blank')
58538                 .attr('tabindex', -1)
58539                 .text('OSM');
58540         }
58541
58542         links
58543             .append('a')
58544             .attr('class', 'changeset-osmcha-link')
58545             .attr('href', 'https://osmcha.mapbox.com/changesets/' + entity.changeset)
58546             .attr('target', '_blank')
58547             .attr('tabindex', -1)
58548             .text('OSMCha');
58549     }
58550
58551
58552     function redraw(selection) {
58553         var selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); }),
58554             singular = selected.length === 1 ? selected[0] : null;
58555
58556         osm = context.connection();
58557
58558         selection.html('');
58559
58560         selection
58561             .append('h4')
58562             .attr('class', 'history-heading')
58563             .text(singular || t('info_panels.history.selected', { n: selected.length }));
58564
58565         if (!singular) return;
58566
58567         var entity = context.entity(singular);
58568
58569         var list = selection
58570             .append('ul');
58571
58572         list
58573             .append('li')
58574             .text(t('info_panels.history.version') + ':')
58575             .append('span')
58576             .text(entity.version);
58577
58578         list
58579             .append('li')
58580             .text(t('info_panels.history.last_edit') + ':')
58581             .append('span')
58582             .text(displayTimestamp(entity));
58583
58584         list
58585             .append('li')
58586             .text(t('info_panels.history.edited_by') + ':')
58587             .call(displayUser, entity);
58588
58589         list
58590             .append('li')
58591             .text(t('info_panels.history.changeset') + ':')
58592             .call(displayChangeset, entity);
58593
58594         if (osm) {
58595             selection
58596                 .append('a')
58597                 .attr('class', 'view-history-on-osm')
58598                 .attr('target', '_blank')
58599                 .attr('tabindex', -1)
58600                 .attr('href', osm.historyURL(entity))
58601                 .call(svgIcon('#icon-out-link', 'inline'))
58602                 .append('span')
58603                 .text(t('info_panels.history.link_text'));
58604         }
58605     }
58606
58607
58608     var panel = function(selection) {
58609         selection.call(redraw);
58610
58611         context.map()
58612             .on('drawn.info-history', function() {
58613                 selection.call(redraw);
58614             });
58615     };
58616
58617     panel.off = function() {
58618         context.map()
58619             .on('drawn.info-history', null);
58620     };
58621
58622     panel.id = 'history';
58623     panel.title = t('info_panels.history.title');
58624     panel.key = t('info_panels.history.key');
58625
58626
58627     return panel;
58628 }
58629
58630 //      
58631
58632 var OSM_PRECISION = 7;
58633 var locale$2 = utilDetect().locale;
58634
58635 /**
58636  * Returns a localized representation of the given length measurement.
58637  *
58638  * @param {Number} m area in meters
58639  * @param {Boolean} isImperial true for U.S. customary units; false for metric
58640  */
58641 function displayLength(m        , isImperial         )         {
58642         var d = m * (isImperial ? 3.28084 : 1),
58643                 unit;
58644
58645         if (isImperial) {
58646                 if (d >= 5280) {
58647                         d /= 5280;
58648                         unit = 'miles';
58649                 } else {
58650                         unit = 'feet';
58651                 }
58652         } else {
58653                 if (d >= 1000) {
58654                         d /= 1000;
58655                         unit = 'kilometers';
58656                 } else {
58657                         unit = 'meters';
58658                 }
58659         }
58660
58661         return t('units.' + unit, {
58662                 quantity: d.toLocaleString(locale$2, {
58663                         maximumSignificantDigits: 4
58664                 })
58665         });
58666 }
58667
58668 /**
58669  * Returns a localized representation of the given area measurement.
58670  *
58671  * @param {Number} m2 area in square meters
58672  * @param {Boolean} isImperial true for U.S. customary units; false for metric
58673  */
58674 function displayArea(m2        , isImperial         )         {
58675         var d = m2 * (isImperial ? 10.7639111056 : 1),
58676                 d1, d2, area;
58677         var unit1         = '';
58678         var unit2         = '';
58679
58680         if (isImperial) {
58681                 if (d >= 6969600) { // > 0.25mi² show mi²
58682                         d1 = d / 27878400;
58683                         unit1 = 'square_miles';
58684                 } else {
58685                         d1 = d;
58686                         unit1 = 'square_feet';
58687                 }
58688
58689                 if (d > 4356 && d < 43560000) { // 0.1 - 1000 acres
58690                         d2 = d / 43560;
58691                         unit2 = 'acres';
58692                 }
58693
58694         } else {
58695                 if (d >= 250000) { // > 0.25km² show km²
58696                         d1 = d / 1000000;
58697                         unit1 = 'square_kilometers';
58698                 } else {
58699                         d1 = d;
58700                         unit1 = 'square_meters';
58701                 }
58702
58703                 if (d > 1000 && d < 10000000) { // 0.1 - 1000 hectares
58704                         d2 = d / 10000;
58705                         unit2 = 'hectares';
58706                 }
58707         }
58708
58709         area = t('units.' + unit1, {
58710                 quantity: d1.toLocaleString(locale$2, {
58711                         maximumSignificantDigits: 4
58712                 })
58713         });
58714
58715         if (d2) {
58716                 return t('units.area_pair', {
58717                         area1: area,
58718                         area2: t('units.' + unit2, {
58719                                 quantity: d2.toLocaleString(locale$2, {
58720                                         maximumSignificantDigits: 2
58721                                 })
58722                         })
58723                 });
58724         } else {
58725                 return area;
58726         }
58727 }
58728
58729 function wrap(x        , min        , max        )         {
58730         var d = max - min;
58731         return ((x - min) % d + d) % d + min;
58732 }
58733
58734 function clamp(x        , min        , max        )         {
58735         return Math.max(min, Math.min(x, max));
58736 }
58737
58738 function displayCoordinate(deg        , pos     , neg     )         {
58739         var min = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60,
58740                 sec = (min - Math.floor(min)) * 60,
58741                 displayDegrees = t('units.arcdegrees', {
58742                         quantity: Math.floor(Math.abs(deg)).toLocaleString(locale$2)
58743                 }),
58744                 displayCoordinate;
58745
58746         if (Math.floor(sec) > 0) {
58747                 displayCoordinate = displayDegrees +
58748                         t('units.arcminutes', {
58749                                 quantity: Math.floor(min).toLocaleString(locale$2)
58750                         }) +
58751                         t('units.arcseconds', {
58752                                 quantity: Math.round(sec).toLocaleString(locale$2)
58753                         });
58754         } else if (Math.floor(min) > 0) {
58755                 displayCoordinate = displayDegrees +
58756                         t('units.arcminutes', {
58757                                 quantity: Math.round(min).toLocaleString(locale$2)
58758                         });
58759         } else {
58760                 displayCoordinate = t('units.arcdegrees', {
58761                         quantity: Math.round(Math.abs(deg)).toLocaleString(locale$2)
58762                 });
58763         }
58764
58765         if (deg === 0) {
58766                 return displayCoordinate;
58767         } else {
58768                 return t('units.coordinate', {
58769                         coordinate: displayCoordinate,
58770                         direction: t('units.' + (deg > 0 ? pos : neg))
58771                 });
58772         }
58773 }
58774
58775 /**
58776  * Returns given coordinate pair in degree-minute-second format.
58777  *
58778  * @param {Array<Number>} coord longitude and latitude
58779  */
58780 function dmsCoordinatePair(coord          )         {
58781         return t('units.coordinate_pair', {
58782                 latitude: displayCoordinate(clamp(coord[1], -90, 90), 'north', 'south'),
58783                 longitude: displayCoordinate(wrap(coord[0], -180, 180), 'east', 'west')
58784         });
58785 }
58786
58787 /**
58788  * Returns the given coordinate pair in decimal format.
58789  * note: unlocalized to avoid comma ambiguity - see #4765
58790  *
58791  * @param {Array<Number>} coord longitude and latitude
58792  */
58793 function decimalCoordinatePair(coord          )         {
58794         return t('units.coordinate_pair', {
58795                 latitude: clamp(coord[1], -90, 90).toFixed(OSM_PRECISION),
58796                 longitude: wrap(coord[0], -180, 180).toFixed(OSM_PRECISION)
58797         });
58798 }
58799
58800 function uiPanelLocation(context) {
58801     var currLocation = '';
58802
58803
58804     function redraw(selection) {
58805         selection.html('');
58806
58807         var list = selection
58808             .append('ul');
58809
58810         // Mouse coordinates
58811         var coord = context.map().mouseCoordinates();
58812         if (coord.some(isNaN)) {
58813             coord = context.map().center();
58814         }
58815
58816         list
58817             .append('li')
58818             .text(dmsCoordinatePair(coord))
58819             .append('li')
58820             .text(decimalCoordinatePair(coord));
58821
58822         // Location Info
58823         selection
58824             .append('div')
58825             .attr('class', 'location-info')
58826             .text(currLocation || ' ');
58827
58828         debouncedGetLocation(selection, coord);
58829     }
58830
58831
58832     var debouncedGetLocation = debounce(getLocation, 250);
58833     function getLocation(selection, coord) {
58834         if (!services.geocoder) {
58835             currLocation = t('info_panels.location.unknown_location');
58836             selection.selectAll('.location-info')
58837                 .text(currLocation);
58838         } else {
58839             services.geocoder.reverse(coord, function(err, result) {
58840                 currLocation = result ? result.display_name : t('info_panels.location.unknown_location');
58841                 selection.selectAll('.location-info')
58842                     .text(currLocation);
58843             });
58844         }
58845     }
58846
58847
58848     var panel = function(selection) {
58849         selection.call(redraw);
58850
58851         context.surface()
58852             .on('mousemove.info-location', function() {
58853                 selection.call(redraw);
58854             });
58855     };
58856
58857     panel.off = function() {
58858         context.surface()
58859             .on('mousemove.info-location', null);
58860     };
58861
58862     panel.id = 'location';
58863     panel.title = t('info_panels.location.title');
58864     panel.key = t('info_panels.location.key');
58865
58866
58867     return panel;
58868 }
58869
58870 function uiPanelMeasurement(context) {
58871     var locale = utilDetect().locale,
58872         isImperial = (locale.toLowerCase() === 'en-us');
58873
58874
58875     function radiansToMeters(r) {
58876         // using WGS84 authalic radius (6371007.1809 m)
58877         return r * 6371007.1809;
58878     }
58879
58880     function steradiansToSqmeters(r) {
58881         // http://gis.stackexchange.com/a/124857/40446
58882         return r / (4 * Math.PI) * 510065621724000;
58883     }
58884
58885
58886     function toLineString(feature) {
58887         if (feature.type === 'LineString') return feature;
58888
58889         var result = { type: 'LineString', coordinates: [] };
58890         if (feature.type === 'Polygon') {
58891             result.coordinates = feature.coordinates[0];
58892         } else if (feature.type === 'MultiPolygon') {
58893             result.coordinates = feature.coordinates[0][0];
58894         }
58895
58896         return result;
58897     }
58898
58899     function nodeCount(feature) {
58900       if (feature.type === 'LineString') return feature.coordinates.length;
58901
58902       if (feature.type === 'Polygon') {
58903           return feature.coordinates[0].length - 1;
58904       }
58905     }
58906
58907
58908     function redraw(selection$$1) {
58909         var resolver = context.graph();
58910         var selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
58911         var singular = selected.length === 1 ? selected[0] : null;
58912         var extent = geoExtent$$1();
58913         var entity;
58914
58915         selection$$1.html('');
58916
58917         selection$$1
58918             .append('h4')
58919             .attr('class', 'measurement-heading')
58920             .text(singular || t('info_panels.measurement.selected', { n: selected.length.toLocaleString(locale) }));
58921
58922         if (!selected.length) return;
58923
58924         var center;
58925         for (var i = 0; i < selected.length; i++) {
58926             entity = context.entity(selected[i]);
58927             extent._extend(entity.extent(resolver));
58928         }
58929         center = extent.center();
58930
58931
58932         var list = selection$$1
58933             .append('ul');
58934         var coordItem;
58935
58936         // multiple features, just display extent center..
58937         if (!singular) {
58938             coordItem = list
58939                 .append('li')
58940                 .text(t('info_panels.measurement.center') + ':');
58941             coordItem.append('span')
58942                 .text(dmsCoordinatePair(center));
58943             coordItem.append('span')
58944                 .text(decimalCoordinatePair(center));
58945             return;
58946         }
58947
58948         // single feature, display details..
58949         if (!entity) return;
58950         var geometry = entity.geometry(resolver);
58951
58952         if (geometry === 'line' || geometry === 'area') {
58953             var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate()),
58954                 feature = entity.asGeoJSON(resolver),
58955                 length = radiansToMeters(d3_geoLength(toLineString(feature))),
58956                 lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length')),
58957                 centroid = d3_geoCentroid(feature);
58958
58959             list
58960                 .append('li')
58961                 .text(t('info_panels.measurement.geometry') + ':')
58962                 .append('span')
58963                 .text(
58964                     closed ? t('info_panels.measurement.closed_' + geometry) : t('geometry.' + geometry)
58965                 );
58966
58967             if (entity.type !== 'relation') {
58968                 list
58969                     .append('li')
58970                     .text(t('info_panels.measurement.node_count') + ':')
58971                     .append('span')
58972                     .text(nodeCount(feature).toLocaleString(locale));
58973             }
58974
58975             if (closed) {
58976                 var area = steradiansToSqmeters(entity.area(resolver));
58977                 list
58978                     .append('li')
58979                     .text(t('info_panels.measurement.area') + ':')
58980                     .append('span')
58981                     .text(displayArea(area, isImperial));
58982             }
58983
58984
58985             list
58986                 .append('li')
58987                 .text(lengthLabel + ':')
58988                 .append('span')
58989                 .text(displayLength(length, isImperial));
58990
58991             coordItem = list
58992                 .append('li')
58993                 .text(t('info_panels.measurement.centroid') + ':');
58994             coordItem.append('span')
58995                 .text(dmsCoordinatePair(centroid));
58996             coordItem.append('span')
58997                 .text(decimalCoordinatePair(centroid));
58998
58999             var toggle  = isImperial ? 'imperial' : 'metric';
59000
59001             selection$$1
59002                 .append('a')
59003                 .text(t('info_panels.measurement.' + toggle))
59004                 .attr('href', '#')
59005                 .attr('class', 'button button-toggle-units')
59006                 .on('click', function() {
59007                     event.preventDefault();
59008                     isImperial = !isImperial;
59009                     selection$$1.call(redraw);
59010                 });
59011
59012         } else {
59013             var centerLabel = t('info_panels.measurement.' + (entity.type === 'node' ? 'location' : 'center'));
59014
59015             list
59016                 .append('li')
59017                 .text(t('info_panels.measurement.geometry') + ':')
59018                 .append('span')
59019                 .text(t('geometry.' + geometry));
59020
59021             coordItem = list
59022                 .append('li')
59023                 .text(centerLabel + ':');
59024             coordItem.append('span')
59025                 .text(dmsCoordinatePair(center));
59026             coordItem.append('span')
59027                 .text(decimalCoordinatePair(center));
59028         }
59029     }
59030
59031
59032     var panel = function(selection$$1) {
59033         selection$$1.call(redraw);
59034
59035         context.map()
59036             .on('drawn.info-measurement', function() {
59037                 selection$$1.call(redraw);
59038             });
59039     };
59040
59041     panel.off = function() {
59042         context.map()
59043             .on('drawn.info-measurement', null);
59044     };
59045
59046     panel.id = 'measurement';
59047     panel.title = t('info_panels.measurement.title');
59048     panel.key = t('info_panels.measurement.key');
59049
59050
59051     return panel;
59052 }
59053
59054 var uiInfoPanels = {
59055     background: uiPanelBackground,
59056     history: uiPanelHistory,
59057     location: uiPanelLocation,
59058     measurement: uiPanelMeasurement,
59059 };
59060
59061 function uiInfo(context) {
59062     var ids = Object.keys(uiInfoPanels),
59063         wasActive = ['measurement'],
59064         panels = {},
59065         active = {};
59066
59067     // create panels
59068     ids.forEach(function(k) {
59069         if (!panels[k]) {
59070             panels[k] = uiInfoPanels[k](context);
59071             active[k] = false;
59072         }
59073     });
59074
59075
59076     function info(selection$$1) {
59077
59078         function redraw() {
59079             var activeids = ids.filter(function(k) { return active[k]; }).sort();
59080
59081             var containers = infoPanels.selectAll('.panel-container')
59082                 .data(activeids, function(k) { return k; });
59083
59084             containers.exit()
59085                 .style('opacity', 1)
59086                 .transition()
59087                 .duration(200)
59088                 .style('opacity', 0)
59089                 .on('end', function(d) {
59090                     d3_select(this)
59091                         .call(panels[d].off)
59092                         .remove();
59093                 });
59094
59095             var enter = containers.enter()
59096                 .append('div')
59097                 .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
59098
59099             enter
59100                 .style('opacity', 0)
59101                 .transition()
59102                 .duration(200)
59103                 .style('opacity', 1);
59104
59105             var title = enter
59106                 .append('div')
59107                 .attr('class', 'panel-title fillD2');
59108
59109             title
59110                 .append('h3')
59111                 .text(function(d) { return panels[d].title; });
59112
59113             title
59114                 .append('button')
59115                 .attr('class', 'close')
59116                 .on('click', function (d) { toggle(d); })
59117                 .call(svgIcon('#icon-close'));
59118
59119             enter
59120                 .append('div')
59121                 .attr('class', function(d) { return 'panel-content panel-content-' + d; });
59122
59123
59124             // redraw the panels
59125             infoPanels.selectAll('.panel-content')
59126                 .each(function(d) {
59127                     d3_select(this).call(panels[d]);
59128                 });
59129         }
59130
59131
59132         function toggle(which) {
59133             if (event) {
59134                 event.stopImmediatePropagation();
59135                 event.preventDefault();
59136             }
59137
59138             var activeids = ids.filter(function(k) { return active[k]; });
59139
59140             if (which) {  // toggle one
59141                 active[which] = !active[which];
59142                 if (activeids.length === 1 && activeids[0] === which) {  // none active anymore
59143                     wasActive = [which];
59144                 }
59145             } else {      // toggle all
59146                 if (activeids.length) {
59147                     wasActive = activeids;
59148                     activeids.forEach(function(k) { active[k] = false; });
59149                 } else {
59150                     wasActive.forEach(function(k) { active[k] = true; });
59151                 }
59152             }
59153
59154             redraw();
59155         }
59156
59157
59158         var infoPanels = selection$$1.selectAll('.info-panels')
59159             .data([0]);
59160
59161         infoPanels = infoPanels.enter()
59162             .append('div')
59163             .attr('class', 'info-panels')
59164             .merge(infoPanels);
59165
59166         redraw();
59167
59168         var keybinding = d3keybinding('info')
59169             .on(uiCmd('⌘' + t('info_panels.key')), toggle);
59170
59171         ids.forEach(function(k) {
59172             var key = t('info_panels.' + k + '.key', { default: null });
59173             if (!key) return;
59174             keybinding
59175                 .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
59176         });
59177
59178         d3_select(document)
59179             .call(keybinding);
59180     }
59181
59182     return info;
59183 }
59184
59185 function uiModes(context) {
59186     var modes = [
59187         modeAddPoint$$1(context),
59188         modeAddLine$$1(context),
59189         modeAddArea$$1(context)
59190     ];
59191
59192
59193     function editable() {
59194         var mode = context.mode();
59195         return context.editable() && mode && mode.id !== 'save';
59196     }
59197
59198
59199     return function(selection$$1) {
59200         var buttons = selection$$1.selectAll('button.add-button')
59201             .data(modes);
59202
59203         buttons = buttons.enter()
59204             .append('button')
59205             .attr('tabindex', -1)
59206             .attr('class', function(mode) { return mode.id + ' add-button col4'; })
59207             .on('click.mode-buttons', function(mode) {
59208                 // When drawing, ignore accidental clicks on mode buttons - #4042
59209                 var currMode = context.mode().id;
59210                 if (currMode.match(/^draw/) !== null) return;
59211
59212                 if (mode.id === currMode) {
59213                     context.enter(modeBrowse(context));
59214                 } else {
59215                     context.enter(mode);
59216                 }
59217             })
59218             .call(tooltip()
59219                 .placement('bottom')
59220                 .html(true)
59221                 .title(function(mode) {
59222                     return uiTooltipHtml(mode.description, mode.key);
59223                 })
59224             );
59225
59226         buttons
59227             .each(function(d) {
59228                 d3_select(this)
59229                     .call(svgIcon('#icon-' + d.button, 'pre-text'));
59230             });
59231
59232         buttons
59233             .append('span')
59234             .attr('class', 'label')
59235             .text(function(mode) { return mode.title; });
59236
59237         context
59238             .on('enter.editor', function(entered) {
59239                 selection$$1.selectAll('button.add-button')
59240                     .classed('active', function(mode) { return entered.button === mode.button; });
59241                 context.container()
59242                     .classed('mode-' + entered.id, true);
59243             });
59244
59245         context
59246             .on('exit.editor', function(exited) {
59247                 context.container()
59248                     .classed('mode-' + exited.id, false);
59249             });
59250
59251         var keybinding = d3keybinding('mode-buttons');
59252
59253         modes.forEach(function(mode) {
59254             keybinding.on(mode.key, function() {
59255                 if (editable()) {
59256                     if (mode.id === context.mode().id) {
59257                         context.enter(modeBrowse(context));
59258                     } else {
59259                         context.enter(mode);
59260                     }
59261                 }
59262             });
59263         });
59264
59265         d3_select(document)
59266             .call(keybinding);
59267
59268
59269         var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
59270
59271         context.map()
59272             .on('move.modes', debouncedUpdate)
59273             .on('drawn.modes', debouncedUpdate);
59274
59275         context
59276             .on('enter.modes', update);
59277
59278
59279
59280         function update() {
59281             selection$$1.selectAll('button.add-button')
59282                 .property('disabled', !editable());
59283         }
59284     };
59285 }
59286
59287 function uiNotice(context) {
59288
59289     return function(selection$$1) {
59290         var div = selection$$1
59291             .append('div')
59292             .attr('class', 'notice');
59293
59294         var button = div
59295             .append('button')
59296             .attr('class', 'zoom-to notice fillD')
59297             .on('click', function() {
59298                 context.map().zoomEase(context.minEditableZoom());
59299             })
59300             .on('wheel', function() {   // let wheel events pass through #4482
59301                 var e2 = new WheelEvent(event.type, event);
59302                 context.surface().node().dispatchEvent(e2);
59303             });
59304
59305         button
59306             .call(svgIcon('#icon-plus', 'pre-text'))
59307             .append('span')
59308             .attr('class', 'label')
59309             .text(t('zoom_in_edit'));
59310
59311
59312         function disableTooHigh() {
59313             var canEdit = context.map().zoom() >= context.minEditableZoom();
59314             div.style('display', canEdit ? 'none' : 'block');
59315         }
59316
59317         context.map()
59318             .on('move.notice', debounce(disableTooHigh, 500));
59319
59320         disableTooHigh();
59321     };
59322 }
59323
59324 function uiRestore(context) {
59325
59326     return function(selection) {
59327         if (!context.history().lock() || !context.history().restorableChanges())
59328             return;
59329
59330         var modalSelection = uiModal(selection, true);
59331
59332         modalSelection.select('.modal')
59333             .attr('class', 'modal fillL col6');
59334
59335         var introModal = modalSelection.select('.content');
59336
59337         introModal
59338             .attr('class','cf');
59339
59340         introModal
59341             .append('div')
59342             .attr('class', 'modal-section')
59343             .append('h3')
59344             .text(t('restore.heading'));
59345
59346         introModal
59347             .append('div')
59348             .attr('class','modal-section')
59349             .append('p')
59350             .text(t('restore.description'));
59351
59352         var buttonWrap = introModal
59353             .append('div')
59354             .attr('class', 'modal-actions cf');
59355
59356         var restore = buttonWrap
59357             .append('button')
59358             .attr('class', 'restore col6')
59359             .on('click', function() {
59360                 context.history().restore();
59361                 modalSelection.remove();
59362             });
59363
59364         restore
59365             .append('svg')
59366             .attr('class', 'logo logo-restore')
59367             .append('use')
59368             .attr('xlink:href', '#logo-restore');
59369
59370         restore
59371             .append('div')
59372             .text(t('restore.restore'));
59373
59374         var reset = buttonWrap
59375             .append('button')
59376             .attr('class', 'reset col6')
59377             .on('click', function() {
59378                 context.history().clearSaved();
59379                 modalSelection.remove();
59380             });
59381
59382         reset
59383             .append('svg')
59384             .attr('class', 'logo logo-reset')
59385             .append('use')
59386             .attr('xlink:href', '#logo-reset');
59387
59388         reset
59389             .append('div')
59390             .text(t('restore.reset'));
59391
59392         restore.node().focus();
59393     };
59394 }
59395
59396 function uiSave(context) {
59397     var history = context.history();
59398     var key = uiCmd('⌘S');
59399
59400
59401     function saving() {
59402         var mode = context.mode();
59403         return mode && mode.id === 'save';
59404     }
59405
59406
59407     function save() {
59408         event.preventDefault();
59409         if (!context.inIntro() && !saving() && history.hasChanges()) {
59410             context.enter(modeSave$$1(context));
59411         }
59412     }
59413
59414
59415     function getBackground(numChanges) {
59416         var step;
59417         if (numChanges === 0) {
59418             return null;
59419         } else if (numChanges <= 50) {
59420             step = numChanges / 50;
59421             return d3_interpolateRgb('#fff', '#ff8')(step);  // white -> yellow
59422         } else {
59423             step = Math.min((numChanges - 50) / 50, 1.0);
59424             return d3_interpolateRgb('#ff8', '#f88')(step);  // yellow -> red
59425         }
59426     }
59427
59428
59429     return function(selection$$1) {
59430         var numChanges = 0;
59431
59432         function updateCount() {
59433             var _ = history.difference().summary().length;
59434             if (_ === numChanges) return;
59435             numChanges = _;
59436
59437             tooltipBehavior
59438                 .title(uiTooltipHtml(
59439                     t(numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
59440                 );
59441
59442             var background = getBackground(numChanges);
59443
59444             button
59445                 .classed('disabled', numChanges === 0)
59446                 .classed('has-count', numChanges > 0)
59447                 .style('background', background);
59448
59449             button.select('span.count')
59450                 .text(numChanges)
59451                 .style('background', background)
59452                 .style('border-color', background);
59453         }
59454
59455
59456         var tooltipBehavior = tooltip()
59457             .placement('bottom')
59458             .html(true)
59459             .title(uiTooltipHtml(t('save.no_changes'), key));
59460
59461         var button = selection$$1
59462             .append('button')
59463             .attr('class', 'save col12 disabled')
59464             .attr('tabindex', -1)
59465             .on('click', save)
59466             .call(tooltipBehavior);
59467
59468         button
59469             .call(svgIcon('#icon-save', 'pre-text'))
59470             .append('span')
59471             .attr('class', 'label')
59472             .text(t('save.title'));
59473
59474         button
59475             .append('span')
59476             .attr('class', 'count')
59477             .text('0');
59478
59479         updateCount();
59480
59481
59482         var keybinding = d3keybinding('uiSave')
59483             .on(key, save, true);
59484
59485         d3_select(document)
59486             .call(keybinding);
59487
59488         context.history()
59489             .on('change.save', updateCount);
59490
59491         context
59492             .on('enter.save', function() {
59493                 button.property('disabled', saving());
59494                 if (saving()) button.call(tooltipBehavior.hide);
59495             });
59496     };
59497 }
59498
59499 function uiScale(context) {
59500     var projection = context.projection,
59501         isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
59502         maxLength = 180,
59503         tickHeight = 8;
59504
59505
59506     function scaleDefs(loc1, loc2) {
59507         var lat = (loc2[1] + loc1[1]) / 2,
59508             conversion = (isImperial ? 3.28084 : 1),
59509             dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
59510             scale = { dist: 0, px: 0, text: '' },
59511             buckets, i, val, dLon;
59512
59513         if (isImperial) {
59514             buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
59515         } else {
59516             buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
59517         }
59518
59519         // determine a user-friendly endpoint for the scale
59520         for (i = 0; i < buckets.length; i++) {
59521             val = buckets[i];
59522             if (dist >= val) {
59523                 scale.dist = Math.floor(dist / val) * val;
59524                 break;
59525             } else {
59526                 scale.dist = +dist.toFixed(2);
59527             }
59528         }
59529
59530         dLon = geoMetersToLon(scale.dist / conversion, lat);
59531         scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
59532
59533         scale.text = displayLength(scale.dist / conversion, isImperial);
59534
59535         return scale;
59536     }
59537
59538
59539     function update(selection) {
59540         // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
59541         var dims = context.map().dimensions(),
59542             loc1 = projection.invert([0, dims[1]]),
59543             loc2 = projection.invert([maxLength, dims[1]]),
59544             scale = scaleDefs(loc1, loc2);
59545
59546         selection.select('#scale-path')
59547             .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
59548
59549         selection.select('#scale-textgroup')
59550             .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
59551
59552         selection.select('#scale-text')
59553             .text(scale.text);
59554     }
59555
59556
59557     return function(selection) {
59558         function switchUnits() {
59559             isImperial = !isImperial;
59560             selection.call(update);
59561         }
59562
59563         var scalegroup = selection.append('svg')
59564             .attr('id', 'scale')
59565             .on('click', switchUnits)
59566             .append('g')
59567             .attr('transform', 'translate(10,11)');
59568
59569         scalegroup
59570             .append('path')
59571             .attr('id', 'scale-path');
59572
59573         scalegroup
59574             .append('g')
59575             .attr('id', 'scale-textgroup')
59576             .append('text')
59577             .attr('id', 'scale-text');
59578
59579         selection.call(update);
59580
59581         context.map().on('move.scale', function() {
59582             update(selection);
59583         });
59584     };
59585 }
59586
59587 var pair_1 = pair$1;
59588
59589 function search(x, dims, r) {
59590   if (!dims) dims = 'NSEW';
59591   if (typeof x !== 'string') return { val: null, regex: r };
59592
59593   r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
59594
59595   var m = r.exec(x);
59596   if (!m) return { val: null, regex: r };
59597
59598   var dim = m[1] || m[5];
59599   if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
59600
59601   return {
59602     val: (((m[2]) ? parseFloat(m[2]) : 0) +
59603           ((m[3] ? parseFloat(m[3]) / 60 : 0)) +
59604           ((m[4] ? parseFloat(m[4]) / 3600 : 0))) *
59605           ((dim === 'S' || dim === 'W') ? -1 : 1),
59606     regex: r,
59607     raw: m[0],
59608     dim: dim
59609   };
59610 }
59611
59612 function pair$1(x, dims) {
59613   x = x.trim();
59614   var one = search(x, dims);
59615   if (one.val === null) return null;
59616   var two = search(x, dims, one.regex);
59617   if (two.val === null) return null;
59618   // null if one/two are not contiguous.
59619   if (one.raw + two.raw !== x) return null;
59620   if (one.dim) {
59621     return swapdim(one.val, two.val, one.dim);
59622   } else {
59623     return [one.val, two.val];
59624   }
59625 }
59626
59627 function swapdim(a, b, dim) {
59628   if (dim === 'N' || dim === 'S') return [a, b];
59629   if (dim === 'W' || dim === 'E') return [b, a];
59630 }
59631
59632 function uiFeatureList(context) {
59633     var keybinding = d3keybinding('uiFeatureList');
59634     var _geocodeResults;
59635
59636
59637     function featureList(selection$$1) {
59638         var header = selection$$1
59639             .append('div')
59640             .attr('class', 'header fillL cf');
59641
59642         header
59643             .append('h3')
59644             .text(t('inspector.feature_list'));
59645
59646         var searchWrap = selection$$1
59647             .append('div')
59648             .attr('class', 'search-header');
59649
59650         var search = searchWrap
59651             .append('input')
59652             .attr('placeholder', t('inspector.search'))
59653             .attr('type', 'search')
59654             .call(utilNoAuto)
59655             .on('keypress', keypress)
59656             .on('keydown', keydown)
59657             .on('input', inputevent);
59658
59659         searchWrap
59660             .call(svgIcon('#icon-search', 'pre-text'));
59661
59662         var listWrap = selection$$1
59663             .append('div')
59664             .attr('class', 'inspector-body');
59665
59666         var list = listWrap
59667             .append('div')
59668             .attr('class', 'feature-list cf');
59669
59670         context
59671             .on('exit.feature-list', clearSearch);
59672         context.map()
59673             .on('drawn.feature-list', mapDrawn);
59674
59675         keybinding
59676             .on(uiCmd('⌘F'), focusSearch);
59677
59678         d3_select(document)
59679             .call(keybinding);
59680
59681
59682         function focusSearch() {
59683             var mode = context.mode() && context.mode().id;
59684             if (mode !== 'browse') return;
59685
59686             event.preventDefault();
59687             search.node().focus();
59688         }
59689
59690
59691         function keydown() {
59692             if (event.keyCode === 27) {  // escape
59693                 search.node().blur();
59694             }
59695         }
59696
59697
59698         function keypress() {
59699             var q = search.property('value'),
59700                 items = list.selectAll('.feature-list-item');
59701             if (event.keyCode === 13 && q.length && items.size()) {  // return
59702                 click(items.datum());
59703             }
59704         }
59705
59706
59707         function inputevent() {
59708             _geocodeResults = undefined;
59709             drawList();
59710         }
59711
59712
59713         function clearSearch() {
59714             search.property('value', '');
59715             drawList();
59716         }
59717
59718
59719         function mapDrawn(e) {
59720             if (e.full) {
59721                 drawList();
59722             }
59723         }
59724
59725
59726         function features() {
59727             var entities = {};
59728             var result = [];
59729             var graph = context.graph();
59730             var q = search.property('value').toLowerCase();
59731
59732             if (!q) return result;
59733
59734             var idMatch = q.match(/^([nwr])([0-9]+)$/);
59735
59736             if (idMatch) {
59737                 result.push({
59738                     id: idMatch[0],
59739                     geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
59740                     type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
59741                     name: idMatch[2]
59742                 });
59743             }
59744
59745             var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
59746
59747             if (locationMatch) {
59748                 var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
59749                 result.push({
59750                     id: -1,
59751                     geometry: 'point',
59752                     type: t('inspector.location'),
59753                     name: dmsCoordinatePair([loc[1], loc[0]]),
59754                     location: loc
59755                 });
59756             }
59757
59758             function addEntity(entity) {
59759                 if (entity.id in entities || result.length > 200)
59760                     return;
59761
59762                 entities[entity.id] = true;
59763
59764                 var name = utilDisplayName(entity) || '';
59765                 if (name.toLowerCase().indexOf(q) >= 0) {
59766                     var matched = context.presets().match(entity, graph);
59767                     var type = (matched && matched.name()) || utilDisplayType(entity.id);
59768
59769                     result.push({
59770                         id: entity.id,
59771                         entity: entity,
59772                         geometry: context.geometry(entity.id),
59773                         type: type,
59774                         name: name
59775                     });
59776                 }
59777
59778                 graph.parentRelations(entity).forEach(function(parent) {
59779                     addEntity(parent);
59780                 });
59781             }
59782
59783             var visible = context.surface().selectAll('.point, .line, .area').nodes();
59784             for (var i = 0; i < visible.length && result.length <= 200; i++) {
59785                 var datum = visible[i].__data__;
59786                 var entity = datum && datum.properties && datum.properties.entity;
59787                 if (entity) { addEntity(entity); }
59788             }
59789
59790             (_geocodeResults || []).forEach(function(d) {
59791                 if (d.osm_type && d.osm_id) {    // some results may be missing these - #1890
59792
59793                     // Make a temporary osmEntity so we can preset match
59794                     // and better localize the search result - #4725
59795                     var id = osmEntity$$1.id.fromOSM(d.osm_type, d.osm_id);
59796                     var tags = {};
59797                     tags[d.class] = d.type;
59798
59799                     var attrs = { id: id, type: d.osm_type, tags: tags };
59800                     if (d.osm_type === 'way') {   // for ways, add some fake closed nodes
59801                         attrs.nodes = ['a','a'];  // so that geometry area is possible
59802                     }
59803
59804                     var tempEntity = osmEntity$$1(attrs);
59805                     var tempGraph = coreGraph$$1([tempEntity]);
59806                     var matched = context.presets().match(tempEntity, tempGraph);
59807                     var type = (matched && matched.name()) || utilDisplayType(id);
59808
59809                     result.push({
59810                         id: tempEntity.id,
59811                         geometry: tempEntity.geometry(tempGraph),
59812                         type: type,
59813                         name: d.display_name,
59814                         extent: new geoExtent$$1(
59815                             [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
59816                             [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
59817                     });
59818                 }
59819             });
59820
59821             return result;
59822         }
59823
59824
59825         function drawList() {
59826             var value = search.property('value');
59827             var results = features();
59828
59829             list.classed('filtered', value.length);
59830
59831             var noResultsWorldwide = _geocodeResults && _geocodeResults.length === 0;
59832
59833             var resultsIndicator = list.selectAll('.no-results-item')
59834                 .data([0])
59835                 .enter()
59836                 .append('button')
59837                 .property('disabled', true)
59838                 .attr('class', 'no-results-item')
59839                 .call(svgIcon('#icon-alert', 'pre-text'));
59840
59841             resultsIndicator.append('span')
59842                 .attr('class', 'entity-name');
59843
59844             list.selectAll('.no-results-item .entity-name')
59845                 .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
59846
59847             if (services.geocoder) {
59848               list.selectAll('.geocode-item')
59849                   .data([0])
59850                   .enter()
59851                   .append('button')
59852                   .attr('class', 'geocode-item')
59853                   .on('click', geocoderSearch)
59854                   .append('div')
59855                   .attr('class', 'label')
59856                   .append('span')
59857                   .attr('class', 'entity-name')
59858                   .text(t('geocoder.search'));
59859             }
59860
59861             list.selectAll('.no-results-item')
59862                 .style('display', (value.length && !results.length) ? 'block' : 'none');
59863
59864             list.selectAll('.geocode-item')
59865                 .style('display', (value && _geocodeResults === undefined) ? 'block' : 'none');
59866
59867             list.selectAll('.feature-list-item')
59868                 .data([-1])
59869                 .remove();
59870
59871             var items = list.selectAll('.feature-list-item')
59872                 .data(results, function(d) { return d.id; });
59873
59874             var enter = items.enter()
59875                 .insert('button', '.geocode-item')
59876                 .attr('class', 'feature-list-item')
59877                 .on('mouseover', mouseover)
59878                 .on('mouseout', mouseout)
59879                 .on('click', click);
59880
59881             var label = enter
59882                 .append('div')
59883                 .attr('class', 'label');
59884
59885             label
59886                 .each(function(d) {
59887                     d3_select(this)
59888                         .call(svgIcon('#icon-' + d.geometry, 'pre-text'));
59889                 });
59890
59891             label
59892                 .append('span')
59893                 .attr('class', 'entity-type')
59894                 .text(function(d) { return d.type; });
59895
59896             label
59897                 .append('span')
59898                 .attr('class', 'entity-name')
59899                 .text(function(d) { return d.name; });
59900
59901             enter
59902                 .style('opacity', 0)
59903                 .transition()
59904                 .style('opacity', 1);
59905
59906             items.order();
59907
59908             items.exit()
59909                 .remove();
59910         }
59911
59912
59913         function mouseover(d) {
59914             if (d.id === -1) return;
59915
59916             context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
59917                 .classed('hover', true);
59918         }
59919
59920
59921         function mouseout() {
59922             context.surface().selectAll('.hover')
59923                 .classed('hover', false);
59924         }
59925
59926
59927         function click(d) {
59928             event.preventDefault();
59929             if (d.location) {
59930                 context.map().centerZoom([d.location[1], d.location[0]], 20);
59931             }
59932             else if (d.entity) {
59933                 if (d.entity.type === 'node') {
59934                     context.map().center(d.entity.loc);
59935                 } else if (d.entity.type === 'way') {
59936                     var center = context.projection(context.map().center());
59937                     var edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
59938                     context.map().center(edge.loc);
59939                 }
59940                 context.enter(modeSelect(context, [d.entity.id]));
59941             } else {
59942                 context.zoomToEntity(d.id);
59943             }
59944         }
59945
59946
59947         function geocoderSearch() {
59948             services.geocoder.search(search.property('value'), function (err, resp) {
59949                 _geocodeResults = resp || [];
59950                 drawList();
59951             });
59952         }
59953     }
59954
59955
59956     return featureList;
59957 }
59958
59959 function uiPresetIcon() {
59960     var preset, geometry;
59961
59962
59963     function presetIcon(selection$$1) {
59964         selection$$1.each(render);
59965     }
59966
59967
59968     function getIcon(p, geom) {
59969         if (p.icon)
59970             return p.icon;
59971         else if (geom === 'line')
59972             return 'other-line';
59973         else if (geom === 'vertex')
59974             return p.isFallback() ? '' : 'poi-vertex';
59975         else
59976             return 'marker-stroked';
59977     }
59978
59979
59980     function render() {
59981         var selection$$1 = d3_select(this),
59982             p = preset.apply(this, arguments),
59983             geom = geometry.apply(this, arguments),
59984             picon = getIcon(p, geom),
59985             isPoi = picon.match(/^poi-/) !== null,
59986             isMaki = dataFeatureIcons.indexOf(picon) !== -1,
59987             isFramed = (geom === 'area' || geom === 'verex');
59988
59989
59990         function tag_classes(p) {
59991             var s = '';
59992             for (var i in p.tags) {
59993                 s += ' tag-' + i;
59994                 if (p.tags[i] !== '*') {
59995                     s += ' tag-' + i + '-' + p.tags[i];
59996                 }
59997             }
59998             return s;
59999         }
60000
60001
60002         var fill = selection$$1.selectAll('.preset-icon-fill')
60003             .data([0]);
60004
60005         fill = fill.enter()
60006             .append('div')
60007             .merge(fill);
60008
60009         fill
60010             .attr('class', function() {
60011                 return 'preset-icon-fill preset-icon-fill-' + geom + tag_classes(p);
60012             });
60013
60014
60015         var areaFrame = selection$$1.selectAll('.preset-icon-frame')
60016             .data((geom === 'area') ? [0] : []);
60017
60018         areaFrame.exit()
60019             .remove();
60020
60021         areaFrame = areaFrame.enter()
60022             .append('div')
60023             .attr('class', 'preset-icon-frame')
60024             .call(svgIcon('#preset-icon-frame'));
60025
60026
60027         var icon = selection$$1.selectAll('.preset-icon')
60028             .data([0]);
60029
60030         icon = icon.enter()
60031             .append('div')
60032             .attr('class', 'preset-icon')
60033             .call(svgIcon(''))
60034             .merge(icon);
60035
60036         icon
60037             .attr('class', 'preset-icon preset-icon-' +
60038                 ((isMaki || isPoi) ? (isFramed ? '24' : '28') : (isFramed ? '44' : '60'))
60039             );
60040
60041         icon.selectAll('svg')
60042             .attr('class', function() {
60043                 return 'icon ' + picon + (isMaki || isPoi ? '' : tag_classes(p));
60044             });
60045
60046         icon.selectAll('use')
60047             .attr('href', '#' + picon + (isMaki ? '-15' : ''));
60048     }
60049
60050
60051     presetIcon.preset = function(_) {
60052         if (!arguments.length) return preset;
60053         preset = utilFunctor(_);
60054         return presetIcon;
60055     };
60056
60057
60058     presetIcon.geometry = function(_) {
60059         if (!arguments.length) return geometry;
60060         geometry = utilFunctor(_);
60061         return presetIcon;
60062     };
60063
60064     return presetIcon;
60065 }
60066
60067 function d3combobox() {
60068     var dispatch$$1 = dispatch('accept');
60069     var _container = d3_select(document.body);
60070     var _data = [];
60071     var _suggestions = [];
60072     var _minItems = 2;
60073     var _caseSensitive = false;
60074
60075     var _fetcher = function(val, cb) {
60076         cb(_data.filter(function(d) {
60077             return d.value
60078                 .toString()
60079                 .toLowerCase()
60080                 .indexOf(val.toLowerCase()) !== -1;
60081         }));
60082     };
60083
60084     var combobox = function(input, attachTo) {
60085         var idx = -1;
60086         var wrapper = _container
60087             .selectAll('div.combobox')
60088             .filter(function(d) { return d === input.node(); });
60089         var shown = !wrapper.empty();
60090         var tagName = input.node() ? input.node().tagName.toLowerCase() : '';
60091
60092         input
60093             .classed('combobox-input', true)
60094             .on('focus.typeahead', focus)
60095             .on('blur.typeahead', blur)
60096             .on('keydown.typeahead', keydown)
60097             .on('keyup.typeahead', keyup)
60098             .on('input.typeahead', change)
60099             .each(function() {
60100                 var parent = this.parentNode;
60101                 var sibling = this.nextSibling;
60102
60103                 var caret = d3_select(parent).selectAll('.combobox-caret')
60104                     .filter(function(d) { return d === input.node(); })
60105                     .data([input.node()]);
60106
60107                 caret = caret.enter()
60108                     .insert('div', function() { return sibling; })
60109                     .attr('class', 'combobox-caret')
60110                     .merge(caret);
60111
60112                 caret
60113                     .on('mousedown', function () {
60114                         // prevent the form element from blurring. it blurs
60115                         // on mousedown
60116                         event.stopPropagation();
60117                         event.preventDefault();
60118                         if (!shown) {
60119                             input.node().focus();
60120                             fetch('', render);
60121                         } else {
60122                             hide();
60123                         }
60124                     });
60125             });
60126
60127         function focus() {
60128             fetch(value(), render);
60129         }
60130
60131         function blur() {
60132             window.setTimeout(hide, 150);
60133         }
60134
60135         function show() {
60136             if (!shown) {
60137                 wrapper = _container
60138                     .insert('div', ':first-child')
60139                     .datum(input.node())
60140                     .attr('class', 'combobox')
60141                     .style('position', 'absolute')
60142                     .style('display', 'block')
60143                     .style('left', '0px')
60144                     .on('mousedown', function () {
60145                         // prevent moving focus out of the text field
60146                         event.preventDefault();
60147                     });
60148
60149                 d3_select('body')
60150                     .on('scroll.combobox', render, true);
60151
60152                 shown = true;
60153             }
60154         }
60155
60156         function hide() {
60157             if (shown) {
60158                 idx = -1;
60159                 wrapper.remove();
60160
60161                 d3_select('body')
60162                     .on('scroll.combobox', null);
60163
60164                 shown = false;
60165             }
60166         }
60167
60168         function keydown() {
60169            switch (event.keyCode) {
60170                // backspace, delete
60171                case 8:
60172                case 46:
60173                    input.on('input.typeahead', function() {
60174                        idx = -1;
60175                        render();
60176                        var start = input.property('selectionStart');
60177                        input.node().setSelectionRange(start, start);
60178                        input.on('input.typeahead', change);
60179                    });
60180                    break;
60181                // tab
60182                case 9:
60183                    wrapper.selectAll('a.selected').each(function (d) {
60184                        dispatch$$1.call('accept', this, d);
60185                    });
60186                    hide();
60187                    break;
60188                // return
60189                case 13:
60190                    event.preventDefault();
60191                    break;
60192                // up arrow
60193                case 38:
60194                    if (tagName === 'textarea' && !shown) return;
60195                    nav(-1);
60196                    event.preventDefault();
60197                    break;
60198                // down arrow
60199                case 40:
60200                    if (tagName === 'textarea' && !shown) return;
60201                    nav(+1);
60202                    event.preventDefault();
60203                    break;
60204            }
60205            event.stopPropagation();
60206         }
60207
60208         function keyup() {
60209             switch (event.keyCode) {
60210                 // escape
60211                 case 27:
60212                     hide();
60213                     break;
60214                 // return
60215                 case 13:
60216                     wrapper.selectAll('a.selected').each(function (d) {
60217                        dispatch$$1.call('accept', this, d);
60218                     });
60219                     hide();
60220                     break;
60221             }
60222         }
60223
60224         function change() {
60225             fetch(value(), function() {
60226                 if (input.property('selectionEnd') === input.property('value').length) {
60227                     autocomplete();
60228                 }
60229                 render();
60230             });
60231         }
60232
60233         function nav(dir) {
60234             if (!_suggestions.length) return;
60235             idx = Math.max(Math.min(idx + dir, _suggestions.length - 1), 0);
60236             input.property('value', _suggestions[idx].value);
60237             render();
60238             ensureVisible();
60239         }
60240
60241         function value() {
60242             var value = input.property('value');
60243             var start = input.property('selectionStart');
60244             var end = input.property('selectionEnd');
60245
60246             if (start && end) {
60247                 value = value.substring(0, start);
60248             }
60249
60250             return value;
60251         }
60252
60253         function fetch(v, cb) {
60254             _fetcher.call(input, v, function(_) {
60255                 _suggestions = _;
60256                 cb();
60257             });
60258         }
60259
60260         function autocomplete() {
60261             var v = _caseSensitive ? value() : value().toLowerCase();
60262             idx = -1;
60263             if (!v) return;
60264
60265             var best = -1;
60266             var suggestion, compare;
60267
60268             for (var i = 0; i < _suggestions.length; i++) {
60269                 suggestion = _suggestions[i].value;
60270                 compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
60271
60272                 // if search string matches suggestion exactly, pick it..
60273                 if (compare === v) {
60274                     best = i;
60275                     break;
60276
60277                 // otherwise lock in the first result that starts with the search string..
60278                 } else if (best === -1 && compare.indexOf(v) === 0) {
60279                     best = i;
60280                 }
60281             }
60282
60283             if (best !== -1) {
60284                 idx = best;
60285                 suggestion = _suggestions[best].value;
60286                 input.property('value', suggestion);
60287                 input.node().setSelectionRange(v.length, suggestion.length);
60288             }
60289         }
60290
60291         function render() {
60292             if (_suggestions.length >= _minItems && document.activeElement === input.node()) {
60293                 show();
60294             } else {
60295                 hide();
60296                 return;
60297             }
60298
60299             var options = wrapper
60300                 .selectAll('a.combobox-option')
60301                 .data(_suggestions, function(d) { return d.value; });
60302
60303             options.exit()
60304                 .remove();
60305
60306             options.enter()
60307                 .append('a')
60308                 .attr('class', 'combobox-option')
60309                 .text(function(d) { return d.value; })
60310                 .merge(options)
60311                 .attr('title', function(d) { return d.title; })
60312                 .classed('selected', function(d, i) { return i === idx; })
60313                 .on('mouseover', select$$1)
60314                 .on('click', accept)
60315                 .order();
60316
60317
60318             var node = attachTo ? attachTo.node() : input.node();
60319             var rect = node.getBoundingClientRect();
60320
60321             wrapper
60322                 .style('left', (rect.left + 5) + 'px')
60323                 .style('width', (rect.width - 10) + 'px')
60324                 .style('top', rect.height + rect.top + 'px');
60325         }
60326
60327         function select$$1(d, i) {
60328             idx = i;
60329             render();
60330         }
60331
60332         function ensureVisible() {
60333             var node = wrapper.selectAll('a.selected').node();
60334             if (node) node.scrollIntoView();
60335         }
60336
60337         function accept(d) {
60338             if (!shown) return;
60339             input.property('value', d.value);
60340             utilTriggerEvent(input, 'change');
60341             dispatch$$1.call('accept', this, d);
60342             hide();
60343         }
60344     };
60345
60346     combobox.fetcher = function(_) {
60347         if (!arguments.length) return _fetcher;
60348         _fetcher = _;
60349         return combobox;
60350     };
60351
60352     combobox.data = function(_) {
60353         if (!arguments.length) return _data;
60354         _data = _;
60355         return combobox;
60356     };
60357
60358     combobox.minItems = function(_) {
60359         if (!arguments.length) return _minItems;
60360         _minItems = _;
60361         return combobox;
60362     };
60363
60364     combobox.caseSensitive = function(_) {
60365         if (!arguments.length) return _caseSensitive;
60366         _caseSensitive = _;
60367         return combobox;
60368     };
60369
60370     combobox.container = function(_) {
60371         if (!arguments.length) return _container;
60372         _container = _;
60373         return combobox;
60374     };
60375
60376     return utilRebind(combobox, dispatch$$1, 'on');
60377 }
60378
60379
60380 d3combobox.off = function(input) {
60381     input
60382         .on('focus.typeahead', null)
60383         .on('blur.typeahead', null)
60384         .on('keydown.typeahead', null)
60385         .on('keyup.typeahead', null)
60386         .on('input.typeahead', null)
60387         .each(function() {
60388             d3_select(this.parentNode).selectAll('.combobox-caret')
60389                 .filter(function(d) { return d === input.node(); })
60390                 .on('mousedown', null);
60391         });
60392
60393     d3_select('body')
60394         .on('scroll.combobox', null);
60395 };
60396
60397 function uiRawMemberEditor(context) {
60398     var taginfo = services.taginfo,
60399         _entityID;
60400
60401
60402     function selectMember(d) {
60403         event.preventDefault();
60404         context.enter(modeSelect(context, [d.id]));
60405     }
60406
60407
60408     function changeRole(d) {
60409         var role = d3_select(this).property('value');
60410         var member = { id: d.id, type: d.type, role: role };
60411         context.perform(
60412             actionChangeMember(d.relation.id, member, d.index),
60413             t('operations.change_role.annotation')
60414         );
60415     }
60416
60417
60418     function deleteMember(d) {
60419         context.perform(
60420             actionDeleteMember(d.relation.id, d.index),
60421             t('operations.delete_member.annotation')
60422         );
60423
60424         if (!context.hasEntity(d.relation.id)) {
60425             context.enter(modeBrowse(context));
60426         }
60427     }
60428
60429
60430     function rawMemberEditor(selection$$1) {
60431         var entity = context.entity(_entityID),
60432             memberships = [];
60433
60434         entity.members.slice(0, 1000).forEach(function(member, index) {
60435             memberships.push({
60436                 index: index,
60437                 id: member.id,
60438                 type: member.type,
60439                 role: member.role,
60440                 relation: entity,
60441                 member: context.hasEntity(member.id)
60442             });
60443         });
60444
60445         var gt = entity.members.length > 1000 ? '>' : '';
60446         selection$$1.call(uiDisclosure(context, 'raw_member_editor', true)
60447             .title(t('inspector.all_members') + ' (' + gt + memberships.length + ')')
60448             .expanded(true)
60449             .updatePreference(false)
60450             .on('toggled', function(expanded) {
60451                 if (expanded) { selection$$1.node().parentNode.scrollTop += 200; }
60452             })
60453             .content(content)
60454         );
60455
60456
60457         function content(wrap) {
60458             var list = wrap.selectAll('.member-list')
60459                 .data([0]);
60460
60461             list = list.enter()
60462                 .append('ul')
60463                 .attr('class', 'member-list')
60464                 .merge(list);
60465
60466
60467             var items = list.selectAll('li')
60468                 .data(memberships, function(d) {
60469                     return osmEntity$$1.key(d.relation) + ',' + d.index + ',' +
60470                         (d.member ? osmEntity$$1.key(d.member) : 'incomplete');
60471                 });
60472
60473             items.exit()
60474                 .each(unbind)
60475                 .remove();
60476
60477             var enter = items.enter()
60478                 .append('li')
60479                 .attr('class', 'member-row form-field')
60480                 .classed('member-incomplete', function(d) { return !d.member; });
60481
60482             enter
60483                 .each(function(d) {
60484                     if (d.member) {
60485                         var label = d3_select(this).append('label')
60486                             .attr('class', 'form-label')
60487                             .append('a')
60488                             .attr('href', '#')
60489                             .on('click', selectMember);
60490
60491                         label.append('span')
60492                             .attr('class', 'member-entity-type')
60493                             .text(function(d) {
60494                                 var matched = context.presets().match(d.member, context.graph());
60495                                 return (matched && matched.name()) || utilDisplayType(d.member.id);
60496                             });
60497
60498                         label.append('span')
60499                             .attr('class', 'member-entity-name')
60500                             .text(function(d) { return utilDisplayName(d.member); });
60501
60502                     } else {
60503                         d3_select(this).append('label')
60504                             .attr('class', 'form-label')
60505                             .text(t('inspector.incomplete', { id: d.id }));
60506                     }
60507                 });
60508
60509             enter
60510                 .append('input')
60511                 .attr('class', 'member-role')
60512                 .property('type', 'text')
60513                 .attr('maxlength', 255)
60514                 .attr('placeholder', t('inspector.role'))
60515                 .call(utilNoAuto)
60516                 .property('value', function(d) { return d.role; })
60517                 .on('change', changeRole);
60518
60519             enter
60520                 .append('button')
60521                 .attr('tabindex', -1)
60522                 .attr('class', 'remove button-input-action member-delete minor')
60523                 .on('click', deleteMember)
60524                 .call(svgIcon('#operation-delete'));
60525
60526             if (taginfo) {
60527                 enter.each(bindTypeahead);
60528             }
60529
60530
60531             function bindTypeahead(d) {
60532                 var row = d3_select(this),
60533                     role = row.selectAll('input.member-role');
60534
60535                 function sort(value, data) {
60536                     var sameletter = [],
60537                         other = [];
60538                     for (var i = 0; i < data.length; i++) {
60539                         if (data[i].value.substring(0, value.length) === value) {
60540                             sameletter.push(data[i]);
60541                         } else {
60542                             other.push(data[i]);
60543                         }
60544                     }
60545                     return sameletter.concat(other);
60546                 }
60547
60548                 role.call(d3combobox()
60549                     .container(context.container())
60550                     .fetcher(function(role, callback) {
60551                         var rtype = entity.tags.type;
60552                         taginfo.roles({
60553                             debounce: true,
60554                             rtype: rtype || '',
60555                             geometry: context.geometry(d.member.id),
60556                             query: role
60557                         }, function(err, data) {
60558                             if (!err) callback(sort(role, data));
60559                         });
60560                     }));
60561             }
60562
60563
60564             function unbind() {
60565                 var row = d3_select(this);
60566
60567                 row.selectAll('input.member-role')
60568                     .call(d3combobox.off);
60569             }
60570         }
60571     }
60572
60573
60574     rawMemberEditor.entityID = function(_) {
60575         if (!arguments.length) return _entityID;
60576         _entityID = _;
60577         return rawMemberEditor;
60578     };
60579
60580
60581     return rawMemberEditor;
60582 }
60583
60584 function uiRawMembershipEditor(context) {
60585     var taginfo = services.taginfo,
60586         _entityID,
60587         _showBlank;
60588
60589
60590     function selectRelation(d) {
60591         event.preventDefault();
60592         context.enter(modeSelect(context, [d.relation.id]));
60593     }
60594
60595
60596     function changeRole(d) {
60597         var role = d3_select(this).property('value');
60598         context.perform(
60599             actionChangeMember(d.relation.id, assignIn({}, d.member, { role: role }), d.index),
60600             t('operations.change_role.annotation')
60601         );
60602     }
60603
60604
60605     function addMembership(d, role) {
60606         _showBlank = false;
60607
60608         var member = { id: _entityID, type: context.entity(_entityID).type, role: role };
60609
60610         if (d.relation) {
60611             context.perform(
60612                 actionAddMember(d.relation.id, member),
60613                 t('operations.add_member.annotation')
60614             );
60615
60616         } else {
60617             var relation = osmRelation();
60618             context.perform(
60619                 actionAddEntity(relation),
60620                 actionAddMember(relation.id, member),
60621                 t('operations.add.annotation.relation')
60622             );
60623
60624             context.enter(modeSelect(context, [relation.id]));
60625         }
60626     }
60627
60628
60629     function deleteMembership(d) {
60630         context.perform(
60631             actionDeleteMember(d.relation.id, d.index),
60632             t('operations.delete_member.annotation')
60633         );
60634     }
60635
60636
60637     function relations(q) {
60638         var newRelation = { relation: null, value: t('inspector.new_relation') };
60639         var result = [];
60640         var graph = context.graph();
60641
60642         context.intersects(context.extent()).forEach(function(entity) {
60643             if (entity.type !== 'relation' || entity.id === _entityID)
60644                 return;
60645
60646             var matched = context.presets().match(entity, graph),
60647                 presetName = (matched && matched.name()) || t('inspector.relation'),
60648                 entityName = utilDisplayName(entity) || '';
60649
60650             var value = presetName + ' ' + entityName;
60651             if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1)
60652                 return;
60653
60654             result.push({ relation: entity, value: value });
60655         });
60656
60657         result.sort(function(a, b) {
60658             return osmRelation.creationOrder(a.relation, b.relation);
60659         });
60660
60661         // Dedupe identical names by appending relation id - see #2891
60662         var dupeGroups = filter(
60663             groupBy(result, 'value'),
60664             function(v) { return v.length > 1; }
60665         );
60666
60667         dupeGroups.forEach(function(group) {
60668             group.forEach(function(obj) {
60669                 obj.value += ' ' + obj.relation.id;
60670             });
60671         });
60672
60673         forEach(result, function(obj) {
60674             obj.title = obj.value;
60675         });
60676
60677         result.unshift(newRelation);
60678         return result;
60679     }
60680
60681
60682     function rawMembershipEditor(selection$$1) {
60683         var entity = context.entity(_entityID),
60684             parents = context.graph().parentRelations(entity),
60685             memberships = [];
60686
60687         parents.slice(0, 1000).forEach(function(relation) {
60688             relation.members.forEach(function(member, index) {
60689                 if (member.id === entity.id) {
60690                     memberships.push({ relation: relation, member: member, index: index });
60691                 }
60692             });
60693         });
60694
60695         var gt = parents.length > 1000 ? '>' : '';
60696         selection$$1.call(uiDisclosure(context, 'raw_membership_editor', true)
60697             .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
60698             .expanded(true)
60699             .updatePreference(false)
60700             .on('toggled', function(expanded) {
60701                 if (expanded) { selection$$1.node().parentNode.scrollTop += 200; }
60702             })
60703             .content(content)
60704         );
60705
60706
60707         function content(wrap) {
60708             var list = wrap.selectAll('.member-list')
60709                 .data([0]);
60710
60711             list = list.enter()
60712                 .append('ul')
60713                 .attr('class', 'member-list')
60714                 .merge(list);
60715
60716
60717             var items = list.selectAll('li.member-row-normal')
60718                 .data(memberships, function(d) {
60719                     return osmEntity$$1.key(d.relation) + ',' + d.index;
60720                 });
60721
60722             items.exit()
60723                 .each(unbind)
60724                 .remove();
60725
60726             var enter = items.enter()
60727                 .append('li')
60728                 .attr('class', 'member-row member-row-normal form-field');
60729
60730             var label = enter
60731                 .append('label')
60732                 .attr('class', 'form-label')
60733                 .append('a')
60734                 .attr('href', '#')
60735                 .on('click', selectRelation);
60736
60737             label
60738                 .append('span')
60739                 .attr('class', 'member-entity-type')
60740                 .text(function(d) {
60741                     var matched = context.presets().match(d.relation, context.graph());
60742                     return (matched && matched.name()) || t('inspector.relation');
60743                 });
60744
60745             label
60746                 .append('span')
60747                 .attr('class', 'member-entity-name')
60748                 .text(function(d) { return utilDisplayName(d.relation); });
60749
60750             enter
60751                 .append('input')
60752                 .attr('class', 'member-role')
60753                 .property('type', 'text')
60754                 .attr('maxlength', 255)
60755                 .attr('placeholder', t('inspector.role'))
60756                 .call(utilNoAuto)
60757                 .property('value', function(d) { return d.member.role; })
60758                 .on('change', changeRole);
60759
60760             enter
60761                 .append('button')
60762                 .attr('tabindex', -1)
60763                 .attr('class', 'remove button-input-action member-delete minor')
60764                 .on('click', deleteMembership)
60765                 .call(svgIcon('#operation-delete'));
60766
60767             if (taginfo) {
60768                 enter.each(bindTypeahead);
60769             }
60770
60771
60772             var newrow = list.selectAll('.member-row-new')
60773                 .data(_showBlank ? [0] : []);
60774
60775             newrow.exit()
60776                 .remove();
60777
60778             enter = newrow.enter()
60779                 .append('li')
60780                 .attr('class', 'member-row member-row-new form-field');
60781
60782             enter
60783                 .append('input')
60784                 .attr('type', 'text')
60785                 .attr('class', 'member-entity-input')
60786                 .call(utilNoAuto);
60787
60788             enter
60789                 .append('input')
60790                 .attr('class', 'member-role')
60791                 .property('type', 'text')
60792                 .attr('maxlength', 255)
60793                 .attr('placeholder', t('inspector.role'))
60794                 .call(utilNoAuto)
60795                 .on('change', changeRole);
60796
60797             enter
60798                 .append('button')
60799                 .attr('tabindex', -1)
60800                 .attr('class', 'remove button-input-action member-delete minor')
60801                 .on('click', deleteMembership)
60802                 .call(svgIcon('#operation-delete'));
60803
60804             newrow = newrow
60805                 .merge(enter);
60806
60807             newrow.selectAll('.member-entity-input')
60808                 .call(d3combobox()
60809                     .container(context.container())
60810                     .minItems(1)
60811                     .fetcher(function(value, callback) { callback(relations(value)); })
60812                     .on('accept', onAccept)
60813                 );
60814
60815
60816             var addrel = wrap.selectAll('.add-relation')
60817                 .data([0]);
60818
60819             addrel = addrel.enter()
60820                 .append('button')
60821                 .attr('class', 'add-relation')
60822                 .merge(addrel);
60823
60824             addrel
60825                 .call(svgIcon('#icon-plus', 'light'))
60826                 .on('click', function() {
60827                     _showBlank = true;
60828                     content(wrap);
60829                     list.selectAll('.member-entity-input').node().focus();
60830                 });
60831
60832
60833             function onAccept(d) {
60834                 var role = list.selectAll('.member-row-new .member-role').property('value');
60835                 addMembership(d, role);
60836             }
60837
60838
60839             function bindTypeahead(d) {
60840                 var row = d3_select(this),
60841                     role = row.selectAll('input.member-role');
60842
60843                 function sort(value, data) {
60844                     var sameletter = [],
60845                         other = [];
60846                     for (var i = 0; i < data.length; i++) {
60847                         if (data[i].value.substring(0, value.length) === value) {
60848                             sameletter.push(data[i]);
60849                         } else {
60850                             other.push(data[i]);
60851                         }
60852                     }
60853                     return sameletter.concat(other);
60854                 }
60855
60856                 role.call(d3combobox()
60857                     .container(context.container())
60858                     .fetcher(function(role, callback) {
60859                         var rtype = d.relation.tags.type;
60860                         taginfo.roles({
60861                             debounce: true,
60862                             rtype: rtype || '',
60863                             geometry: context.geometry(_entityID),
60864                             query: role
60865                         }, function(err, data) {
60866                             if (!err) callback(sort(role, data));
60867                         });
60868                     }));
60869             }
60870
60871
60872             function unbind() {
60873                 var row = d3_select(this);
60874
60875                 row.selectAll('input.member-role')
60876                     .call(d3combobox.off);
60877             }
60878         }
60879     }
60880
60881
60882     rawMembershipEditor.entityID = function(_) {
60883         if (!arguments.length) return _entityID;
60884         _entityID = _;
60885         return rawMembershipEditor;
60886     };
60887
60888
60889     return rawMembershipEditor;
60890 }
60891
60892 function uiTagReference(tag) {
60893     var taginfo = services.taginfo;
60894     var tagReference = {};
60895
60896     var _button = d3_select(null);
60897     var _body = d3_select(null);
60898     var _loaded;
60899     var _showing;
60900
60901
60902     function findLocal(data) {
60903         var locale = utilDetect().locale.toLowerCase();
60904         var localized;
60905
60906         if (locale !== 'pt-br') {  // see #3776, prefer 'pt' over 'pt-br'
60907             localized = find$1(data, function(d) {
60908                 return d.lang.toLowerCase() === locale;
60909             });
60910             if (localized) return localized;
60911         }
60912
60913         // try the non-regional version of a language, like
60914         // 'en' if the language is 'en-US'
60915         if (locale.indexOf('-') !== -1) {
60916             var first = locale.split('-')[0];
60917             localized = find$1(data, function(d) {
60918                 return d.lang.toLowerCase() === first;
60919             });
60920             if (localized) return localized;
60921         }
60922
60923         // finally fall back to english
60924         return find$1(data, function(d) {
60925             return d.lang.toLowerCase() === 'en';
60926         });
60927     }
60928
60929
60930     function load(param) {
60931         if (!taginfo) return;
60932
60933         _button
60934             .classed('tag-reference-loading', true);
60935
60936         taginfo.docs(param, function show(err, data) {
60937             var docs;
60938             if (!err && data) {
60939                 docs = findLocal(data);
60940             }
60941
60942             _body.html('');
60943
60944             if (!docs || !docs.title) {
60945                 if (param.hasOwnProperty('value')) {
60946                     load(omit(param, 'value'));   // retry with key only
60947                 } else {
60948                     _body
60949                         .append('p')
60950                         .attr('class', 'tag-reference-description')
60951                         .text(t('inspector.no_documentation_key'));
60952                     done();
60953                 }
60954                 return;
60955             }
60956
60957             if (docs.image && docs.image.thumb_url_prefix) {
60958                 _body
60959                     .append('img')
60960                     .attr('class', 'tag-reference-wiki-image')
60961                     .attr('src', docs.image.thumb_url_prefix + '100' + docs.image.thumb_url_suffix)
60962                     .on('load', function() { done(); })
60963                     .on('error', function() { d3_select(this).remove(); done(); });
60964             } else {
60965                 done();
60966             }
60967
60968             _body
60969                 .append('p')
60970                 .attr('class', 'tag-reference-description')
60971                 .text(docs.description || t('inspector.documentation_redirect'));
60972
60973             _body
60974                 .append('a')
60975                 .attr('class', 'tag-reference-link')
60976                 .attr('target', '_blank')
60977                 .attr('tabindex', -1)
60978                 .attr('href', 'https://wiki.openstreetmap.org/wiki/' + docs.title)
60979                 .call(svgIcon('#icon-out-link', 'inline'))
60980                 .append('span')
60981                 .text(t('inspector.reference'));
60982
60983             // Add link to info about "good changeset comments" - #2923
60984             if (param.key === 'comment') {
60985                 _body
60986                     .append('a')
60987                     .attr('class', 'tag-reference-comment-link')
60988                     .attr('target', '_blank')
60989                     .attr('tabindex', -1)
60990                     .call(svgIcon('#icon-out-link', 'inline'))
60991                     .attr('href', t('commit.about_changeset_comments_link'))
60992                     .append('span')
60993                     .text(t('commit.about_changeset_comments'));
60994             }
60995         });
60996     }
60997
60998
60999     function done() {
61000         _loaded = true;
61001
61002         _button
61003             .classed('tag-reference-loading', false);
61004
61005         _body
61006             .classed('expanded', true)
61007             .transition()
61008             .duration(200)
61009             .style('max-height', '200px')
61010             .style('opacity', '1');
61011
61012         _showing = true;
61013     }
61014
61015
61016     function hide() {
61017         _body
61018             .transition()
61019             .duration(200)
61020             .style('max-height', '0px')
61021             .style('opacity', '0')
61022             .on('end', function () {
61023                 _body.classed('expanded', false);
61024             });
61025
61026         _showing = false;
61027     }
61028
61029
61030     tagReference.button = function(selection$$1) {
61031         _button = selection$$1.selectAll('.tag-reference-button')
61032             .data([0]);
61033
61034         _button = _button.enter()
61035             .append('button')
61036             .attr('class', 'tag-reference-button')
61037             .attr('tabindex', -1)
61038             .call(svgIcon('#icon-inspect'))
61039             .merge(_button);
61040
61041         _button
61042             .on('click', function () {
61043                 event.stopPropagation();
61044                 event.preventDefault();
61045                 if (_showing) {
61046                     hide();
61047                 } else if (_loaded) {
61048                     done();
61049                 } else {
61050                     load(tag);
61051                 }
61052             });
61053     };
61054
61055
61056     tagReference.body = function(selection$$1) {
61057         var tagid = tag.rtype || (tag.key + '-' + tag.value);
61058         _body = selection$$1.selectAll('.tag-reference-body')
61059             .data([tagid], function(d) { return d; });
61060
61061         _body.exit()
61062             .remove();
61063
61064         _body = _body.enter()
61065             .append('div')
61066             .attr('class', 'tag-reference-body cf')
61067             .style('max-height', '0')
61068             .style('opacity', '0')
61069             .merge(_body);
61070
61071         if (_showing === false) {
61072             hide();
61073         }
61074     };
61075
61076
61077     tagReference.showing = function(_) {
61078         if (!arguments.length) return _showing;
61079         _showing = _;
61080         return tagReference;
61081     };
61082
61083
61084     return tagReference;
61085 }
61086
61087 function uiRawTagEditor(context) {
61088     var taginfo = services.taginfo,
61089         dispatch$$1 = dispatch('change'),
61090         _readOnlyTags = [],
61091         _showBlank = false,
61092         _updatePreference = true,
61093         _expanded = false,
61094         _newRow,
61095         _state,
61096         _preset,
61097         _tags,
61098         _entityID;
61099
61100
61101     function rawTagEditor(selection$$1) {
61102         var count = Object.keys(_tags).filter(function(d) { return d; }).length;
61103
61104         var disclosure = uiDisclosure(context, 'raw_tag_editor', false)
61105             .title(t('inspector.all_tags') + ' (' + count + ')')
61106             .on('toggled', toggled)
61107             .updatePreference(_updatePreference)
61108             .content(content);
61109
61110         // Sometimes we want to force the raw_tag_editor to be opened/closed..
61111         // When undefined, uiDisclosure will use the user's stored preference.
61112         if (_expanded !== undefined) {
61113             disclosure.expanded(_expanded);
61114         }
61115
61116         selection$$1.call(disclosure);
61117
61118         function toggled(expanded) {
61119             _expanded = expanded;
61120             if (expanded) {
61121                 selection$$1.node().parentNode.scrollTop += 200;
61122             }
61123         }
61124     }
61125
61126
61127     function content(wrap) {
61128         var entries = map$3(_tags, function(v, k) {
61129             return { key: k, value: v };
61130         });
61131
61132         if (!entries.length || _showBlank) {
61133             _showBlank = false;
61134             entries.push({key: '', value: ''});
61135             _newRow = '';
61136         }
61137
61138         var list = wrap.selectAll('.tag-list')
61139             .data([0]);
61140
61141         list = list.enter()
61142             .append('ul')
61143             .attr('class', 'tag-list')
61144             .merge(list);
61145
61146         var newTag = wrap.selectAll('.add-tag')
61147             .data([0]);
61148
61149         newTag.enter()
61150             .append('button')
61151             .attr('class', 'add-tag')
61152             .on('click', addTag)
61153             .call(svgIcon('#icon-plus', 'light'));
61154
61155
61156         var items = list.selectAll('.tag-row')
61157             .data(entries, function(d) { return d.key; });
61158
61159         items.exit()
61160             .each(unbind)
61161             .remove();
61162
61163         // Enter
61164
61165         var enter = items.enter()
61166             .append('li')
61167             .attr('class', 'tag-row cf')
61168             .classed('readonly', isReadOnly);
61169
61170         enter
61171             .append('div')
61172             .attr('class', 'key-wrap')
61173             .append('input')
61174             .property('type', 'text')
61175             .attr('class', 'key')
61176             .attr('maxlength', 255)
61177             .call(utilNoAuto)
61178             .on('blur', keyChange)
61179             .on('change', keyChange);
61180
61181         enter
61182             .append('div')
61183             .attr('class', 'input-wrap-position')
61184             .append('input')
61185             .property('type', 'text')
61186             .attr('class', 'value')
61187             .attr('maxlength', 255)
61188             .call(utilNoAuto)
61189             .on('blur', valueChange)
61190             .on('change', valueChange)
61191             .on('keydown.push-more', pushMore);
61192
61193         enter
61194             .append('button')
61195             .attr('tabindex', -1)
61196             .attr('class', 'remove minor')
61197             .call(svgIcon('#operation-delete'));
61198
61199
61200         // Update
61201
61202         items = items
61203             .merge(enter)
61204             .sort(function(a, b) {
61205                 return (a.key === _newRow && b.key !== _newRow) ? 1
61206                     : (a.key !== _newRow && b.key === _newRow) ? -1
61207                     : d3_ascending(a.key, b.key);
61208             });
61209
61210         items
61211             .each(function(tag) {
61212                 var row = d3_select(this),
61213                     key = row.select('input.key'),      // propagate bound data to child
61214                     value = row.select('input.value');  // propagate bound data to child
61215
61216                 if (_entityID && taginfo) {
61217                     bindTypeahead(key, value);
61218                 }
61219
61220                 var isRelation = (_entityID && context.entity(_entityID).type === 'relation'),
61221                     reference;
61222
61223                 if (isRelation && tag.key === 'type') {
61224                     reference = uiTagReference({ rtype: tag.value }, context);
61225                 } else {
61226                     reference = uiTagReference({ key: tag.key, value: tag.value }, context);
61227                 }
61228
61229                 if (_state === 'hover') {
61230                     reference.showing(false);
61231                 }
61232
61233                 row
61234                     .call(reference.button)
61235                     .call(reference.body);
61236             });
61237
61238         items.selectAll('input.key')
61239             .attr('title', function(d) { return d.key; })
61240             .call(utilGetSetValue, function(d) { return d.key; })
61241             .property('disabled', isReadOnly);
61242
61243         items.selectAll('input.value')
61244             .attr('title', function(d) { return d.value; })
61245             .call(utilGetSetValue, function(d) { return d.value; })
61246             .property('disabled', isReadOnly);
61247
61248         items.selectAll('button.remove')
61249             .on('click', removeTag);
61250
61251
61252
61253         function isReadOnly(d) {
61254             for (var i = 0; i < _readOnlyTags.length; i++) {
61255                 if (d.key.match(_readOnlyTags[i]) !== null) {
61256                     return true;
61257                 }
61258             }
61259             return false;
61260         }
61261
61262
61263         function pushMore() {
61264             if (event.keyCode === 9 && !event.shiftKey &&
61265                 list.selectAll('li:last-child input.value').node() === this) {
61266                 addTag();
61267             }
61268         }
61269
61270
61271         function bindTypeahead(key, value) {
61272             if (isReadOnly({ key: key })) return;
61273             var geometry = context.geometry(_entityID);
61274
61275             key.call(d3combobox()
61276                 .container(context.container())
61277                 .fetcher(function(value, callback) {
61278                     taginfo.keys({
61279                         debounce: true,
61280                         geometry: geometry,
61281                         query: value
61282                     }, function(err, data) {
61283                         if (!err) callback(sort(value, data));
61284                     });
61285                 }));
61286
61287             value.call(d3combobox()
61288                 .container(context.container())
61289                 .fetcher(function(value, callback) {
61290                     taginfo.values({
61291                         debounce: true,
61292                         key: utilGetSetValue(key),
61293                         geometry: geometry,
61294                         query: value
61295                     }, function(err, data) {
61296                         if (!err) callback(sort(value, data));
61297                     });
61298                 }));
61299
61300
61301             function sort(value, data) {
61302                 var sameletter = [],
61303                     other = [];
61304                 for (var i = 0; i < data.length; i++) {
61305                     if (data[i].value.substring(0, value.length) === value) {
61306                         sameletter.push(data[i]);
61307                     } else {
61308                         other.push(data[i]);
61309                     }
61310                 }
61311                 return sameletter.concat(other);
61312             }
61313         }
61314
61315
61316         function unbind() {
61317             var row = d3_select(this);
61318
61319             row.selectAll('input.key')
61320                 .call(d3combobox.off);
61321
61322             row.selectAll('input.value')
61323                 .call(d3combobox.off);
61324         }
61325
61326
61327         function keyChange(d) {
61328             var kOld = d.key,
61329                 kNew = this.value.trim(),
61330                 tag = {};
61331
61332
61333             if (isReadOnly({ key: kNew })) {
61334                 this.value = kOld;
61335                 return;
61336             }
61337
61338             if (kNew && kNew !== kOld) {
61339                 var match = kNew.match(/^(.*?)(?:_(\d+))?$/),
61340                     base = match[1],
61341                     suffix = +(match[2] || 1);
61342                 while (_tags[kNew]) {  // rename key if already in use
61343                     kNew = base + '_' + suffix++;
61344                 }
61345             }
61346             tag[kOld] = undefined;
61347             tag[kNew] = d.value;
61348
61349             d.key = kNew; // Maintain DOM identity through the subsequent update.
61350
61351             if (_newRow === kOld) {  // see if this row is still a new row
61352                 _newRow = ((d.value === '' || kNew === '') ? kNew : undefined);
61353             }
61354
61355             this.value = kNew;
61356             dispatch$$1.call('change', this, tag);
61357         }
61358
61359
61360         function valueChange(d) {
61361             if (isReadOnly(d)) return;
61362             var tag = {};
61363             tag[d.key] = this.value;
61364
61365             if (_newRow === d.key && d.key !== '' && d.value !== '') {   // not a new row anymore
61366                 _newRow = undefined;
61367             }
61368
61369             dispatch$$1.call('change', this, tag);
61370         }
61371
61372
61373         function removeTag(d) {
61374             if (isReadOnly(d)) return;
61375             var tag = {};
61376             tag[d.key] = undefined;
61377             dispatch$$1.call('change', this, tag);
61378             d3_select(this.parentNode).remove();
61379         }
61380
61381
61382         function addTag() {
61383             // Wrapped in a setTimeout in case it's being called from a blur
61384             // handler. Without the setTimeout, the call to `content` would
61385             // wipe out the pending value change.
61386             setTimeout(function() {
61387                 _showBlank = true;
61388                 content(wrap);
61389                 list.selectAll('li:last-child input.key').node().focus();
61390             }, 0);
61391         }
61392     }
61393
61394
61395     rawTagEditor.state = function(_) {
61396         if (!arguments.length) return _state;
61397         _state = _;
61398         return rawTagEditor;
61399     };
61400
61401
61402     rawTagEditor.preset = function(_) {
61403         if (!arguments.length) return _preset;
61404         _preset = _;
61405         if (_preset.isFallback()) {
61406             _expanded = true;
61407             _updatePreference = false;
61408         } else {
61409             _expanded = undefined;
61410             _updatePreference = true;
61411         }
61412         return rawTagEditor;
61413     };
61414
61415
61416     rawTagEditor.tags = function(_) {
61417         if (!arguments.length) return _tags;
61418         _tags = _;
61419         return rawTagEditor;
61420     };
61421
61422
61423     rawTagEditor.entityID = function(_) {
61424         if (!arguments.length) return _entityID;
61425         _entityID = _;
61426         return rawTagEditor;
61427     };
61428
61429
61430     rawTagEditor.expanded = function(_) {
61431         if (!arguments.length) return _expanded;
61432         _expanded = _;
61433         _updatePreference = false;
61434         return rawTagEditor;
61435     };
61436
61437
61438     rawTagEditor.readOnlyTags = function(_) {
61439         if (!arguments.length) return _readOnlyTags;
61440         _readOnlyTags = _;
61441         return rawTagEditor;
61442     };
61443
61444
61445     return utilRebind(rawTagEditor, dispatch$$1, 'on');
61446 }
61447
61448 // This currently only works with the 'restrictions' field
61449 // It borrows some code from uiHelp
61450
61451 function uiFieldHelp(context, fieldName) {
61452     var fieldHelp = {};
61453     var _inspector = d3_select(null);
61454     var _wrap = d3_select(null);
61455     var _body = d3_select(null);
61456
61457     var fieldHelpKeys = {
61458         restrictions: [
61459             ['about',[
61460                 'about',
61461                 'from_via_to',
61462                 'maxdist',
61463                 'maxvia'
61464             ]],
61465             ['inspecting',[
61466                 'about',
61467                 'from_shadow',
61468                 'allow_shadow',
61469                 'restrict_shadow',
61470                 'only_shadow',
61471                 'restricted',
61472                 'only'
61473             ]],
61474             ['modifying',[
61475                 'about',
61476                 'indicators',
61477                 'allow_turn',
61478                 'restrict_turn',
61479                 'only_turn'
61480             ]],
61481             ['tips',[
61482                 'simple',
61483                 'simple_example',
61484                 'indirect',
61485                 'indirect_example',
61486                 'indirect_noedit'
61487             ]]
61488         ]
61489     };
61490
61491     var fieldHelpHeadings = {};
61492
61493     var replacements = {
61494         distField: t('restriction.controls.distance'),
61495         viaField: t('restriction.controls.via'),
61496         fromShadow: icon('#turn-shadow', 'pre-text shadow from'),
61497         allowShadow: icon('#turn-shadow', 'pre-text shadow allow'),
61498         restrictShadow: icon('#turn-shadow', 'pre-text shadow restrict'),
61499         onlyShadow: icon('#turn-shadow', 'pre-text shadow only'),
61500         allowTurn: icon('#turn-yes', 'pre-text turn'),
61501         restrictTurn: icon('#turn-no', 'pre-text turn'),
61502         onlyTurn: icon('#turn-only', 'pre-text turn')
61503     };
61504
61505
61506     // For each section, squash all the texts into a single markdown document
61507     var docs = fieldHelpKeys[fieldName].map(function(key) {
61508         var helpkey = 'help.field.' + fieldName + '.' + key[0];
61509         var text = key[1].reduce(function(all, part) {
61510             var subkey = helpkey + '.' + part;
61511             var depth = fieldHelpHeadings[subkey];                     // is this subkey a heading?
61512             var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
61513             return all + hhh + t(subkey, replacements) + '\n\n';
61514         }, '');
61515
61516         return {
61517             key: helpkey,
61518             title: t(helpkey + '.title'),
61519             html: marked(text.trim())
61520         };
61521     });
61522
61523
61524     function show() {
61525         updatePosition();
61526
61527         _body
61528             .classed('hide', false)
61529             .style('opacity', '0')
61530             .transition()
61531             .duration(200)
61532             .style('opacity', '1');
61533     }
61534
61535
61536     function hide() {
61537         _body
61538             .classed('hide', true)
61539             .transition()
61540             .duration(200)
61541             .style('opacity', '0')
61542             .on('end', function () {
61543                 _body.classed('hide', true);
61544             });
61545     }
61546
61547
61548     function clickHelp(index) {
61549         var d = docs[index];
61550         var tkeys = fieldHelpKeys[fieldName][index][1];
61551
61552         _body.selectAll('.field-help-nav-item')
61553             .classed('active', function(d, i) { return i === index; });
61554
61555         var content = _body.selectAll('.field-help-content')
61556             .html(d.html);
61557
61558         // class the paragraphs so we can find and style them
61559         content.selectAll('p')
61560             .attr('class', function(d, i) { return tkeys[i]; });
61561
61562         // insert special content for certain help sections
61563         if (d.key === 'help.field.restrictions.inspecting') {
61564             content
61565                 .insert('img', 'p.from_shadow')
61566                 .attr('class', 'field-help-image cf')
61567                 .attr('src', context.imagePath('tr_inspect.gif'));
61568
61569         } else if (d.key === 'help.field.restrictions.modifying') {
61570             content
61571                 .insert('img', 'p.allow_turn')
61572                 .attr('class', 'field-help-image cf')
61573                 .attr('src', context.imagePath('tr_modify.gif'));
61574         }
61575     }
61576
61577
61578     fieldHelp.button = function(selection$$1) {
61579         if (_body.empty()) return;
61580
61581         var button = selection$$1.selectAll('.field-help-button')
61582             .data([0]);
61583
61584         // enter/update
61585         button.enter()
61586             .append('button')
61587             .attr('class', 'field-help-button')
61588             .attr('tabindex', -1)
61589             .call(svgIcon('#icon-help'))
61590             .merge(button)
61591             .on('click', function () {
61592                 event.stopPropagation();
61593                 event.preventDefault();
61594                 if (_body.classed('hide')) {
61595                     show();
61596                 } else {
61597                     hide();
61598                 }
61599             });
61600     };
61601
61602
61603     function updatePosition() {
61604         var wrap = _wrap.node();
61605         var inspector = _inspector.node();
61606         var wRect = wrap.getBoundingClientRect();
61607         var iRect = inspector.getBoundingClientRect();
61608
61609         _body
61610             .style('top', wRect.top + inspector.scrollTop - iRect.top + 'px');
61611     }
61612
61613
61614     fieldHelp.body = function(selection$$1) {
61615         // This control expects the field to have a preset-input-wrap div
61616         _wrap = selection$$1.selectAll('.preset-input-wrap');
61617         if (_wrap.empty()) return;
61618
61619         // absolute position relative to the inspector, so it "floats" above the fields
61620         _inspector = d3_select('#sidebar .entity-editor-pane .inspector-body');
61621         if (_inspector.empty()) return;
61622
61623         _body = _inspector.selectAll('.field-help-body')
61624             .data([0]);
61625
61626         var enter = _body.enter()
61627             .append('div')
61628             .attr('class', 'field-help-body hide');   // initially hidden
61629
61630         var titleEnter = enter
61631             .append('div')
61632             .attr('class', 'field-help-title cf');
61633
61634         titleEnter
61635             .append('h2')
61636             .attr('class', 'fl')
61637             .text(t('help.field.' + fieldName + '.title'));
61638
61639         titleEnter
61640             .append('button')
61641             .attr('class', 'fr close')
61642             .on('click', function() {
61643                 event.stopPropagation();
61644                 event.preventDefault();
61645                 hide();
61646             })
61647             .call(svgIcon('#icon-close'));
61648
61649         var navEnter = enter
61650             .append('div')
61651             .attr('class', 'field-help-nav cf');
61652
61653         var titles = docs.map(function(d) { return d.title; });
61654         navEnter.selectAll('.field-help-nav-item')
61655             .data(titles)
61656             .enter()
61657             .append('div')
61658             .attr('class', 'field-help-nav-item')
61659             .text(function(d) { return d; })
61660             .on('click', function(d, i) {
61661                 event.stopPropagation();
61662                 event.preventDefault();
61663                 clickHelp(i);
61664             });
61665
61666         enter
61667             .append('div')
61668             .attr('class', 'field-help-content');
61669
61670         _body = _body
61671             .merge(enter);
61672
61673         clickHelp(0);
61674     };
61675
61676
61677     return fieldHelp;
61678 }
61679
61680 function uiFieldCheck(field, context) {
61681     var dispatch$$1 = dispatch('change');
61682     var options = field.strings && field.strings.options;
61683     var values = [];
61684     var texts = [];
61685
61686     var input = d3_select(null);
61687     var text = d3_select(null);
61688     var label = d3_select(null);
61689     var reverser = d3_select(null);
61690
61691     var _impliedYes;
61692     var _entityID;
61693     var _value;
61694
61695
61696     if (options) {
61697         for (var k in options) {
61698             values.push(k === 'undefined' ? undefined : k);
61699             texts.push(field.t('options.' + k, { 'default': options[k] }));
61700         }
61701     } else {
61702         values = [undefined, 'yes'];
61703         texts = [t('inspector.unknown'), t('inspector.check.yes')];
61704         if (field.type !== 'defaultCheck') {
61705             values.push('no');
61706             texts.push(t('inspector.check.no'));
61707         }
61708     }
61709
61710
61711     // Checks tags to see whether an undefined value is "Assumed to be Yes"
61712     function checkImpliedYes() {
61713         _impliedYes = (field.id === 'oneway_yes');
61714
61715         // hack: pretend `oneway` field is a `oneway_yes` field
61716         // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
61717         if (field.id === 'oneway') {
61718             var entity = context.entity(_entityID);
61719             for (var key in entity.tags) {
61720                 if (key in osmOneWayTags && (entity.tags[key] in osmOneWayTags[key])) {
61721                     _impliedYes = true;
61722                     texts[0] = t('presets.fields.oneway_yes.options.undefined');
61723                     break;
61724                 }
61725             }
61726         }
61727     }
61728
61729
61730     function reverserHidden() {
61731         if (!d3_select('div.inspector-hover').empty()) return true;
61732         return !(_value === 'yes' || (_impliedYes && !_value));
61733     }
61734
61735
61736     function reverserSetText(selection$$1) {
61737         var entity = context.hasEntity(_entityID);
61738         if (reverserHidden() || !entity) return selection$$1;
61739
61740         var first = entity.first();
61741         var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
61742         var pseudoDirection = first < last;
61743         var icon = pseudoDirection ? '#icon-forward' : '#icon-backward';
61744
61745         selection$$1.selectAll('.reverser-span')
61746             .text(t('inspector.check.reverser'))
61747             .call(svgIcon(icon, 'inline'));
61748
61749         return selection$$1;
61750     }
61751
61752
61753     var check = function(selection$$1) {
61754         checkImpliedYes();
61755         selection$$1.classed('checkselect', 'true');
61756
61757         label = selection$$1.selectAll('.preset-input-wrap')
61758             .data([0]);
61759
61760         var enter = label.enter()
61761             .append('label')
61762             .attr('class', 'preset-input-wrap');
61763
61764         enter
61765             .append('input')
61766             .property('indeterminate', field.type !== 'defaultCheck')
61767             .attr('type', 'checkbox')
61768             .attr('id', 'preset-input-' + field.id);
61769
61770         enter
61771             .append('span')
61772             .text(texts[0])
61773             .attr('class', 'value');
61774
61775         if (field.type === 'onewayCheck') {
61776             enter
61777                 .append('a')
61778                 .attr('id', 'preset-input-' + field.id + '-reverser')
61779                 .attr('class', 'reverser button' + (reverserHidden() ? ' hide' : ''))
61780                 .attr('href', '#')
61781                 .append('span')
61782                 .attr('class', 'reverser-span');
61783         }
61784
61785         label = label.merge(enter);
61786         input = label.selectAll('input');
61787         text = label.selectAll('span.value');
61788
61789         input
61790             .on('click', function() {
61791                 var t$$1 = {};
61792                 t$$1[field.key] = values[(values.indexOf(_value) + 1) % values.length];
61793                 dispatch$$1.call('change', this, t$$1);
61794                 event.stopPropagation();
61795             });
61796
61797         if (field.type === 'onewayCheck') {
61798             reverser = label.selectAll('.reverser');
61799
61800             reverser
61801                 .call(reverserSetText)
61802                 .on('click', function() {
61803                     event.preventDefault();
61804                     event.stopPropagation();
61805                     context.perform(
61806                         actionReverse(_entityID),
61807                         t('operations.reverse.annotation')
61808                     );
61809                     d3_select(this)
61810                         .call(reverserSetText);
61811                 });
61812         }
61813     };
61814
61815
61816     check.entity = function(_) {
61817         if (!arguments.length) return context.hasEntity(_entityID);
61818         _entityID = _.id;
61819         return check;
61820     };
61821
61822
61823     check.tags = function(tags) {
61824
61825         function isChecked(val) {
61826             return val !== 'no' && val !== '' && val !== undefined && val !== null;
61827         }
61828
61829         function textFor(val) {
61830             if (val === '') val = undefined;
61831             var index = values.indexOf(val);
61832             return (index !== -1 ? texts[index] : ('"' + val + '"'));
61833         }
61834
61835         checkImpliedYes();
61836         _value = tags[field.key] && tags[field.key].toLowerCase();
61837
61838         if (field.type === 'onewayCheck' && (_value === '1' || _value === '-1')) {
61839             _value = 'yes';
61840         }
61841
61842         input
61843             .property('indeterminate', field.type !== 'defaultCheck' && !_value)
61844             .property('checked', isChecked(_value));
61845
61846         text
61847             .text(textFor(_value));
61848
61849         label
61850             .classed('set', !!_value);
61851
61852         if (field.type === 'onewayCheck') {
61853             reverser
61854                 .classed('hide', reverserHidden())
61855                 .call(reverserSetText);
61856         }
61857     };
61858
61859
61860     check.focus = function() {
61861         input.node().focus();
61862     };
61863
61864     return utilRebind(check, dispatch$$1, 'on');
61865 }
61866
61867 /** Used for built-in method references. */
61868 var arrayProto$1 = Array.prototype;
61869
61870 /** Built-in value references. */
61871 var splice$1 = arrayProto$1.splice;
61872
61873 /**
61874  * The base implementation of `_.pullAt` without support for individual
61875  * indexes or capturing the removed elements.
61876  *
61877  * @private
61878  * @param {Array} array The array to modify.
61879  * @param {number[]} indexes The indexes of elements to remove.
61880  * @returns {Array} Returns `array`.
61881  */
61882 function basePullAt(array, indexes) {
61883   var length = array ? indexes.length : 0,
61884       lastIndex = length - 1;
61885
61886   while (length--) {
61887     var index = indexes[length];
61888     if (length == lastIndex || index !== previous) {
61889       var previous = index;
61890       if (isIndex(index)) {
61891         splice$1.call(array, index, 1);
61892       } else {
61893         baseUnset(array, index);
61894       }
61895     }
61896   }
61897   return array;
61898 }
61899
61900 /**
61901  * Removes all elements from `array` that `predicate` returns truthy for
61902  * and returns an array of the removed elements. The predicate is invoked
61903  * with three arguments: (value, index, array).
61904  *
61905  * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
61906  * to pull elements from an array by value.
61907  *
61908  * @static
61909  * @memberOf _
61910  * @since 2.0.0
61911  * @category Array
61912  * @param {Array} array The array to modify.
61913  * @param {Function} [predicate=_.identity] The function invoked per iteration.
61914  * @returns {Array} Returns the new array of removed elements.
61915  * @example
61916  *
61917  * var array = [1, 2, 3, 4];
61918  * var evens = _.remove(array, function(n) {
61919  *   return n % 2 == 0;
61920  * });
61921  *
61922  * console.log(array);
61923  * // => [1, 3]
61924  *
61925  * console.log(evens);
61926  * // => [2, 4]
61927  */
61928 function remove$8(array, predicate) {
61929   var result = [];
61930   if (!(array && array.length)) {
61931     return result;
61932   }
61933   var index = -1,
61934       indexes = [],
61935       length = array.length;
61936
61937   predicate = baseIteratee(predicate, 3);
61938   while (++index < length) {
61939     var value = array[index];
61940     if (predicate(value, index, array)) {
61941       result.push(value);
61942       indexes.push(index);
61943     }
61944   }
61945   basePullAt(array, indexes);
61946   return result;
61947 }
61948
61949 function uiFieldCombo(field, context) {
61950     var dispatch$$1 = dispatch('change'),
61951         nominatim = services.geocoder,
61952         taginfo = services.taginfo,
61953         isMulti = (field.type === 'multiCombo'),
61954         isNetwork = (field.type === 'networkCombo'),
61955         isSemi = (field.type === 'semiCombo'),
61956         optstrings = field.strings && field.strings.options,
61957         optarray = field.options,
61958         snake_case = (field.snake_case || (field.snake_case === undefined)),
61959         caseSensitive = field.caseSensitive,
61960         combobox = d3combobox()
61961             .container(context.container())
61962             .caseSensitive(caseSensitive)
61963             .minItems(isMulti || isSemi ? 1 : 2),
61964         comboData = [],
61965         multiData = [],
61966         container,
61967         input,
61968         entity,
61969         country;
61970
61971     // ensure multiCombo field.key ends with a ':'
61972     if (isMulti && field.key.match(/:$/) === null) {
61973         field.key += ':';
61974     }
61975
61976
61977     function snake(s) {
61978         return s.replace(/\s+/g, '_');
61979     }
61980
61981     function unsnake(s) {
61982         return s.replace(/_+/g, ' ');
61983     }
61984
61985     function clean(s) {
61986         return s.split(';')
61987             .map(function(s) { return s.trim(); })
61988             .join(';');
61989     }
61990
61991
61992     // returns the tag value for a display value
61993     // (for multiCombo, dval should be the key suffix, not the entire key)
61994     function tagValue(dval) {
61995         dval = clean(dval || '');
61996
61997         if (optstrings) {
61998             var match = find$1(comboData, function(o) {
61999                 return o.key && clean(o.value) === dval;
62000             });
62001             if (match) {
62002                 return match.key;
62003             }
62004         }
62005
62006         if (field.type === 'typeCombo' && !dval) {
62007             return 'yes';
62008         }
62009
62010         return (snake_case ? snake(dval) : dval) || undefined;
62011     }
62012
62013
62014     // returns the display value for a tag value
62015     // (for multiCombo, tval should be the key suffix, not the entire key)
62016     function displayValue(tval) {
62017         tval = tval || '';
62018
62019         if (optstrings) {
62020             var match = find$1(comboData, function(o) { return o.key === tval && o.value; });
62021             if (match) {
62022                 return match.value;
62023             }
62024         }
62025
62026         if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
62027             return '';
62028         }
62029
62030         return snake_case ? unsnake(tval) : tval;
62031     }
62032
62033
62034     function objectDifference(a, b) {
62035         return reject(a, function(d1) {
62036             return some(b, function(d2) { return d1.value === d2.value; });
62037         });
62038     }
62039
62040
62041     function initCombo(selection$$1, attachTo) {
62042         if (optstrings) {
62043             selection$$1.attr('readonly', 'readonly');
62044             selection$$1.call(combobox, attachTo);
62045             setStaticValues(setPlaceholder);
62046
62047         } else if (optarray) {
62048             selection$$1.call(combobox, attachTo);
62049             setStaticValues(setPlaceholder);
62050
62051         } else if (taginfo) {
62052             selection$$1.call(combobox.fetcher(setTaginfoValues), attachTo);
62053             setTaginfoValues('', setPlaceholder);
62054         }
62055     }
62056
62057
62058     function setStaticValues(callback) {
62059         if (!(optstrings || optarray)) return;
62060
62061         if (optstrings) {
62062             comboData = Object.keys(optstrings).map(function(k) {
62063                 var v = field.t('options.' + k, { 'default': optstrings[k] });
62064                 return {
62065                     key: k,
62066                     value: v,
62067                     title: v
62068                 };
62069             });
62070
62071         } else if (optarray) {
62072             comboData = optarray.map(function(k) {
62073                 var v = snake_case ? unsnake(k) : k;
62074                 return {
62075                     key: k,
62076                     value: v,
62077                     title: v
62078                 };
62079             });
62080         }
62081
62082         combobox.data(objectDifference(comboData, multiData));
62083         if (callback) callback(comboData);
62084     }
62085
62086
62087     function setTaginfoValues(q, callback) {
62088         var fn = isMulti ? 'multikeys' : 'values';
62089         var query = (isMulti ? field.key : '') + q;
62090         var hasCountryPrefix = isNetwork && country && country.indexOf(q.toLowerCase()) === 0;
62091         if (hasCountryPrefix) {
62092             query = country + ':';
62093         }
62094
62095         var params = {
62096             debounce: (q !== ''),
62097             key: field.key,
62098             query: query
62099         };
62100
62101         if (entity) {
62102             params.geometry = context.geometry(entity.id);
62103         }
62104
62105         taginfo[fn](params, function(err, data) {
62106             if (err) return;
62107             if (hasCountryPrefix) {
62108                 data = filter(data, function(d) {
62109                     return d.value.toLowerCase().indexOf(country + ':') === 0;
62110                 });
62111             }
62112
62113             comboData = map$3(data, function(d) {
62114                 var k = d.value;
62115                 if (isMulti) k = k.replace(field.key, '');
62116                 var v = snake_case ? unsnake(k) : k;
62117                 return {
62118                     key: k,
62119                     value: v,
62120                     title: isMulti ? v : d.title
62121                 };
62122             });
62123
62124             comboData = objectDifference(comboData, multiData);
62125             if (callback) callback(comboData);
62126         });
62127     }
62128
62129
62130     function setPlaceholder(d) {
62131         var ph;
62132
62133         if (isMulti || isSemi) {
62134             ph = field.placeholder() || t('inspector.add');
62135         } else {
62136             var vals = map$3(d, 'value').filter(function(s) { return s.length < 20; }),
62137                 placeholders = vals.length > 1 ? vals : map$3(d, 'key');
62138             ph = field.placeholder() || placeholders.slice(0, 3).join(', ');
62139         }
62140
62141         if (ph.match(/(…|\.\.\.)$/) === null) {
62142             ph += '…';
62143         }
62144
62145         container.selectAll('input')
62146             .attr('placeholder', ph);
62147     }
62148
62149
62150     function change() {
62151         var val = tagValue(utilGetSetValue(input)),
62152             t$$1 = {};
62153
62154         if (isMulti || isSemi) {
62155             if (!val) return;
62156             container.classed('active', false);
62157             utilGetSetValue(input, '');
62158             if (isMulti) {
62159                 field.keys.push(field.key + val);
62160                 t$$1[field.key + val] = 'yes';
62161             } else if (isSemi) {
62162                 var arr = multiData.map(function(d) { return d.key; });
62163                 arr.push(val);
62164                 t$$1[field.key] = compact(uniq(arr)).join(';');
62165             }
62166             window.setTimeout(function() { input.node().focus(); }, 10);
62167
62168         } else {
62169             t$$1[field.key] = val;
62170         }
62171
62172         dispatch$$1.call('change', this, t$$1);
62173     }
62174
62175
62176     function removeMultikey(d) {
62177         event.stopPropagation();
62178         var t$$1 = {};
62179         if (isMulti) {
62180             t$$1[d.key] = undefined;
62181         } else if (isSemi) {
62182             remove$8(multiData, function(md) { return md.key === d.key; });
62183             var arr = multiData.map(function(md) { return md.key; });
62184             arr = compact(uniq(arr));
62185             t$$1[field.key] = arr.length ? arr.join(';') : undefined;
62186         }
62187         dispatch$$1.call('change', this, t$$1);
62188     }
62189
62190
62191     function combo(selection$$1) {
62192         if (isMulti || isSemi) {
62193             container = selection$$1.selectAll('ul').data([0]);
62194
62195             container = container.enter()
62196                 .append('ul')
62197                 .attr('class', 'form-field-multicombo')
62198                 .on('click', function() {
62199                     window.setTimeout(function() { input.node().focus(); }, 10);
62200                 })
62201                 .merge(container);
62202
62203         } else {
62204             container = selection$$1;
62205         }
62206
62207         input = container.selectAll('input')
62208             .data([0]);
62209
62210         input = input.enter()
62211             .append('input')
62212             .attr('type', 'text')
62213             .attr('id', 'preset-input-' + field.id)
62214             .call(utilNoAuto)
62215             .call(initCombo, selection$$1)
62216             .merge(input);
62217
62218         if (isNetwork && nominatim && entity) {
62219             var center = entity.extent(context.graph()).center();
62220             nominatim.countryCode(center, function (err, code) {
62221                 country = code;
62222             });
62223         }
62224
62225         input
62226             .on('change', change)
62227             .on('blur', change);
62228
62229         if (isMulti || isSemi) {
62230             combobox
62231                 .on('accept', function() {
62232                     input.node().blur();
62233                     input.node().focus();
62234                 });
62235
62236             input
62237                 .on('focus', function() { container.classed('active', true); });
62238         }
62239     }
62240
62241
62242     combo.tags = function(tags) {
62243         if (isMulti || isSemi) {
62244             multiData = [];
62245
62246             if (isMulti) {
62247                 // Build multiData array containing keys already set..
62248                 Object.keys(tags).forEach(function(key) {
62249                     if (key.indexOf(field.key) !== 0 || tags[key].toLowerCase() !== 'yes') return;
62250
62251                     var suffix = key.substring(field.key.length);
62252                     multiData.push({
62253                         key: key,
62254                         value: displayValue(suffix)
62255                     });
62256                 });
62257
62258                 // Set keys for form-field modified (needed for undo and reset buttons)..
62259                 field.keys = map$3(multiData, 'key');
62260
62261             } else if (isSemi) {
62262                 var arr = compact(uniq((tags[field.key] || '').split(';')));
62263                 multiData = arr.map(function(key) {
62264                     return {
62265                         key: key,
62266                         value: displayValue(key)
62267                     };
62268                 });
62269             }
62270
62271             // Exclude existing multikeys from combo options..
62272             var available = objectDifference(comboData, multiData);
62273             combobox.data(available);
62274
62275             // Hide 'Add' button if this field uses fixed set of
62276             // translateable optstrings and they're all currently used..
62277             container.selectAll('.combobox-input, .combobox-caret')
62278                 .classed('hide', optstrings && !available.length);
62279
62280
62281             // Render chips
62282             var chips = container.selectAll('.chips')
62283                 .data(multiData);
62284
62285             chips.exit()
62286                 .remove();
62287
62288             var enter = chips.enter()
62289                 .insert('li', 'input')
62290                 .attr('class', 'chips');
62291
62292             enter.append('span');
62293             enter.append('a');
62294
62295             chips = chips.merge(enter);
62296
62297             chips.select('span')
62298                 .text(function(d) { return d.value; });
62299
62300             chips.select('a')
62301                 .on('click', removeMultikey)
62302                 .attr('class', 'remove')
62303                 .text('×');
62304
62305         } else {
62306             utilGetSetValue(input, displayValue(tags[field.key]));
62307         }
62308     };
62309
62310
62311     combo.focus = function() {
62312         input.node().focus();
62313     };
62314
62315
62316     combo.entity = function(_) {
62317         if (!arguments.length) return entity;
62318         entity = _;
62319         return combo;
62320     };
62321
62322
62323     return utilRebind(combo, dispatch$$1, 'on');
62324 }
62325
62326 function uiFieldText(field, context) {
62327     var dispatch$$1 = dispatch('change'),
62328         nominatim = services.geocoder,
62329         input,
62330         entity;
62331
62332
62333     function i(selection$$1) {
62334         var fieldId = 'preset-input-' + field.id;
62335
62336         input = selection$$1.selectAll('input')
62337             .data([0]);
62338
62339         input = input.enter()
62340             .append('input')
62341             .attr('type', field.type)
62342             .attr('id', fieldId)
62343             .attr('placeholder', field.placeholder() || t('inspector.unknown'))
62344             .call(utilNoAuto)
62345             .merge(input);
62346
62347         input
62348             .on('input', change(true))
62349             .on('blur', change())
62350             .on('change', change());
62351
62352         if (field.type === 'tel' && nominatim && entity) {
62353             var center = entity.extent(context.graph()).center();
62354             nominatim.countryCode(center, function (err, countryCode) {
62355                 if (err || !dataPhoneFormats[countryCode]) return;
62356                 selection$$1.selectAll('#' + fieldId)
62357                     .attr('placeholder', dataPhoneFormats[countryCode]);
62358             });
62359
62360         } else if (field.type === 'number') {
62361             var rtl = (textDirection === 'rtl');
62362
62363             input.attr('type', 'text');
62364
62365             var spinControl = selection$$1.selectAll('.spin-control')
62366                 .data([0]);
62367
62368             var enter = spinControl.enter()
62369                 .append('div')
62370                 .attr('class', 'spin-control');
62371
62372             enter
62373                 .append('button')
62374                 .datum(rtl ? 1 : -1)
62375                 .attr('class', rtl ? 'increment' : 'decrement')
62376                 .attr('tabindex', -1);
62377
62378             enter
62379                 .append('button')
62380                 .datum(rtl ? -1 : 1)
62381                 .attr('class', rtl ? 'decrement' : 'increment')
62382                 .attr('tabindex', -1);
62383
62384             spinControl = spinControl
62385                 .merge(enter);
62386
62387             spinControl.selectAll('button')
62388                 .on('click', function(d) {
62389                     event.preventDefault();
62390                     var num = parseInt(input.node().value || 0, 10);
62391                     if (!isNaN(num)) input.node().value = num + d;
62392                     change()();
62393                 });
62394         }
62395     }
62396
62397
62398     function change(onInput) {
62399         return function() {
62400             var t$$1 = {};
62401             t$$1[field.key] = utilGetSetValue(input) || undefined;
62402             dispatch$$1.call('change', this, t$$1, onInput);
62403         };
62404     }
62405
62406
62407     i.entity = function(_) {
62408         if (!arguments.length) return entity;
62409         entity = _;
62410         return i;
62411     };
62412
62413
62414     i.tags = function(tags) {
62415         utilGetSetValue(input, tags[field.key] || '');
62416     };
62417
62418
62419     i.focus = function() {
62420         var node = input.node();
62421         if (node) node.focus();
62422     };
62423
62424     return utilRebind(i, dispatch$$1, 'on');
62425 }
62426
62427 function uiFieldAccess(field, context) {
62428     var dispatch$$1 = dispatch('change'),
62429         items;
62430
62431     function access(selection$$1) {
62432         var wrap = selection$$1.selectAll('.preset-input-wrap')
62433             .data([0]);
62434
62435         wrap = wrap.enter()
62436             .append('div')
62437             .attr('class', 'cf preset-input-wrap')
62438             .append('ul')
62439             .merge(wrap);
62440
62441         var list = wrap.selectAll('ul')
62442             .data([0]);
62443
62444         list = list.enter()
62445             .append('ul')
62446             .merge(list);
62447
62448
62449         items = list.selectAll('li')
62450             .data(field.keys);
62451
62452         // Enter
62453         var enter = items.enter()
62454             .append('li')
62455             .attr('class', function(d) { return 'cf preset-access-' + d; });
62456
62457         enter
62458             .append('span')
62459             .attr('class', 'col6 label preset-label-access')
62460             .attr('for', function(d) { return 'preset-input-access-' + d; })
62461             .text(function(d) { return field.t('types.' + d); });
62462
62463         enter
62464             .append('div')
62465             .attr('class', 'col6 preset-input-access-wrap')
62466             .append('input')
62467             .attr('type', 'text')
62468             .attr('class', 'preset-input-access')
62469             .attr('id', function(d) { return 'preset-input-access-' + d; })
62470             .call(utilNoAuto)
62471             .each(function(d) {
62472                 d3_select(this)
62473                     .call(d3combobox()
62474                         .container(context.container())
62475                         .data(access.options(d))
62476                     );
62477             });
62478
62479
62480         // Update
62481         items = items.merge(enter);
62482
62483         wrap.selectAll('.preset-input-access')
62484             .on('change', change)
62485             .on('blur', change);
62486     }
62487
62488
62489     function change(d) {
62490         var tag = {};
62491         tag[d] = utilGetSetValue(d3_select(this)) || undefined;
62492         dispatch$$1.call('change', this, tag);
62493     }
62494
62495
62496     access.options = function(type) {
62497         var options = ['no', 'permissive', 'private', 'destination'];
62498
62499         if (type !== 'access') {
62500             options.unshift('yes');
62501             options.push('designated');
62502
62503             if (type === 'bicycle') {
62504                 options.push('dismount');
62505             }
62506         }
62507
62508         return options.map(function(option) {
62509             return {
62510                 title: field.t('options.' + option + '.description'),
62511                 value: option
62512             };
62513         });
62514     };
62515
62516
62517     var placeholders = {
62518         footway: {
62519             foot: 'designated',
62520             motor_vehicle: 'no'
62521         },
62522         steps: {
62523             foot: 'yes',
62524             motor_vehicle: 'no',
62525             bicycle: 'no',
62526             horse: 'no'
62527         },
62528         pedestrian: {
62529             foot: 'yes',
62530             motor_vehicle: 'no'
62531         },
62532         cycleway: {
62533             motor_vehicle: 'no',
62534             bicycle: 'designated'
62535         },
62536         bridleway: {
62537             motor_vehicle: 'no',
62538             horse: 'designated'
62539         },
62540         path: {
62541             foot: 'yes',
62542             motor_vehicle: 'no',
62543             bicycle: 'yes',
62544             horse: 'yes'
62545         },
62546         motorway: {
62547             foot: 'no',
62548             motor_vehicle: 'yes',
62549             bicycle: 'no',
62550             horse: 'no'
62551         },
62552         trunk: {
62553             motor_vehicle: 'yes'
62554         },
62555         primary: {
62556             foot: 'yes',
62557             motor_vehicle: 'yes',
62558             bicycle: 'yes',
62559             horse: 'yes'
62560         },
62561         secondary: {
62562             foot: 'yes',
62563             motor_vehicle: 'yes',
62564             bicycle: 'yes',
62565             horse: 'yes'
62566         },
62567         tertiary: {
62568             foot: 'yes',
62569             motor_vehicle: 'yes',
62570             bicycle: 'yes',
62571             horse: 'yes'
62572         },
62573         residential: {
62574             foot: 'yes',
62575             motor_vehicle: 'yes',
62576             bicycle: 'yes',
62577             horse: 'yes'
62578         },
62579         unclassified: {
62580             foot: 'yes',
62581             motor_vehicle: 'yes',
62582             bicycle: 'yes',
62583             horse: 'yes'
62584         },
62585         service: {
62586             foot: 'yes',
62587             motor_vehicle: 'yes',
62588             bicycle: 'yes',
62589             horse: 'yes'
62590         },
62591         motorway_link: {
62592             foot: 'no',
62593             motor_vehicle: 'yes',
62594             bicycle: 'no',
62595             horse: 'no'
62596         },
62597         trunk_link: {
62598             motor_vehicle: 'yes'
62599         },
62600         primary_link: {
62601             foot: 'yes',
62602             motor_vehicle: 'yes',
62603             bicycle: 'yes',
62604             horse: 'yes'
62605         },
62606         secondary_link: {
62607             foot: 'yes',
62608             motor_vehicle: 'yes',
62609             bicycle: 'yes',
62610             horse: 'yes'
62611         },
62612         tertiary_link: {
62613             foot: 'yes',
62614             motor_vehicle: 'yes',
62615             bicycle: 'yes',
62616             horse: 'yes'
62617         }
62618     };
62619
62620
62621     access.tags = function(tags) {
62622         utilGetSetValue(items.selectAll('.preset-input-access'),
62623             function(d) { return tags[d] || ''; })
62624             .attr('placeholder', function() {
62625                 return tags.access ? tags.access : field.placeholder();
62626             });
62627
62628         items.selectAll('#preset-input-access-access')
62629             .attr('placeholder', 'yes');
62630
62631         forEach(placeholders[tags.highway], function(v, k) {
62632             items.selectAll('#preset-input-access-' + k)
62633                 .attr('placeholder', function() { return (tags.access || v); });
62634         });
62635     };
62636
62637
62638     access.focus = function() {
62639         items.selectAll('.preset-input-access')
62640             .node().focus();
62641     };
62642
62643
62644     return utilRebind(access, dispatch$$1, 'on');
62645 }
62646
62647 function uiFieldAddress(field, context) {
62648     var dispatch$$1 = dispatch('init', 'change'),
62649         nominatim = services.geocoder,
62650         wrap = d3_select(null),
62651         isInitialized = false,
62652         entity;
62653
62654     function getNearStreets() {
62655         var extent = entity.extent(context.graph()),
62656             l = extent.center(),
62657             box = geoExtent$$1(l).padByMeters(200);
62658
62659         var streets = context.intersects(box)
62660             .filter(isAddressable)
62661             .map(function(d) {
62662                 var loc = context.projection([
62663                     (extent[0][0] + extent[1][0]) / 2,
62664                     (extent[0][1] + extent[1][1]) / 2]),
62665                     choice = geoChooseEdge(context.childNodes(d), loc, context.projection);
62666                 return {
62667                     title: d.tags.name,
62668                     value: d.tags.name,
62669                     dist: choice.distance
62670                 };
62671             })
62672             .sort(function(a, b) {
62673                 return a.dist - b.dist;
62674             });
62675
62676         return uniqBy(streets, 'value');
62677
62678         function isAddressable(d) {
62679             return d.tags.highway && d.tags.name && d.type === 'way';
62680         }
62681     }
62682
62683
62684     function getNearCities() {
62685         var extent = entity.extent(context.graph()),
62686             l = extent.center(),
62687             box = geoExtent$$1(l).padByMeters(200);
62688
62689         var cities = context.intersects(box)
62690             .filter(isAddressable)
62691             .map(function(d) {
62692                 return {
62693                     title: d.tags['addr:city'] || d.tags.name,
62694                     value: d.tags['addr:city'] || d.tags.name,
62695                     dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
62696                 };
62697             })
62698             .sort(function(a, b) {
62699                 return a.dist - b.dist;
62700             });
62701
62702         return uniqBy(cities, 'value');
62703
62704
62705         function isAddressable(d) {
62706             if (d.tags.name &&
62707                 (d.tags.admin_level === '8' || d.tags.border_type === 'city'))
62708                 return true;
62709
62710             if (d.tags.place && d.tags.name && (
62711                     d.tags.place === 'city' ||
62712                     d.tags.place === 'town' ||
62713                     d.tags.place === 'village'))
62714                 return true;
62715
62716             if (d.tags['addr:city']) return true;
62717
62718             return false;
62719         }
62720     }
62721
62722     function getNearValues(key) {
62723         var extent = entity.extent(context.graph()),
62724             l = extent.center(),
62725             box = geoExtent$$1(l).padByMeters(200);
62726
62727         var results = context.intersects(box)
62728             .filter(function hasTag(d) {
62729                 return d.tags[key];
62730             })
62731             .map(function(d) {
62732                 return {
62733                     title: d.tags[key],
62734                     value: d.tags[key],
62735                     dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
62736                 };
62737             })
62738             .sort(function(a, b) {
62739                 return a.dist - b.dist;
62740             });
62741
62742         return uniqBy(results, 'value');
62743     }
62744
62745
62746     function initCallback(err, countryCode) {
62747         if (err) return;
62748
62749         var addressFormat = find$1(dataAddressFormats, function (a) {
62750             return a && a.countryCodes && includes(a.countryCodes, countryCode.toLowerCase());
62751         }) || dataAddressFormats[0];
62752
62753         var widths = addressFormat.widths || {
62754             housenumber: 1/3, street: 2/3,
62755             city: 2/3, state: 1/4, postcode: 1/3
62756         };
62757
62758         function row(r) {
62759             // Normalize widths.
62760             var total = reduce(r, function(sum, field) {
62761                 return sum + (widths[field] || 0.5);
62762             }, 0);
62763
62764             return r.map(function (field) {
62765                 return {
62766                     id: field,
62767                     width: (widths[field] || 0.5) / total
62768                 };
62769             });
62770         }
62771
62772         wrap.selectAll('div.addr-row')
62773             .data(addressFormat.format)
62774             .enter()
62775             .append('div')
62776             .attr('class', 'addr-row')
62777             .selectAll('input')
62778             .data(row)
62779             .enter()
62780             .append('input')
62781             .property('type', 'text')
62782             .attr('placeholder', function (d) {
62783                 var localkey = d.id + '!' + countryCode.toLowerCase(),
62784                     tkey = field.strings.placeholders[localkey] ? localkey : d.id;
62785                 return field.t('placeholders.' + tkey);
62786             })
62787             .attr('class', function (d) { return 'addr-' + d.id; })
62788             .call(utilNoAuto)
62789             .style('width', function (d) { return d.width * 100 + '%'; });
62790
62791         // Update
62792
62793         // setup dropdowns for common address tags
62794         var dropdowns = addressFormat.dropdowns || [
62795             'city', 'county', 'country', 'district', 'hamlet',
62796             'neighbourhood', 'place', 'postcode', 'province',
62797             'quarter', 'state', 'street', 'subdistrict', 'suburb'
62798         ];
62799
62800         // If fields exist for any of these tags, create dropdowns to pick nearby values..
62801         dropdowns.forEach(function(tag) {
62802             var nearValues = (tag === 'street') ? getNearStreets
62803                     : (tag === 'city') ? getNearCities
62804                     : getNearValues;
62805
62806             wrap.selectAll('input.addr-' + tag)
62807                 .call(d3combobox()
62808                     .container(context.container())
62809                     .minItems(1)
62810                     .fetcher(function(value, callback) {
62811                         callback(nearValues('addr:' + tag));
62812                     })
62813                 );
62814         });
62815
62816         wrap.selectAll('input')
62817             .on('blur', change())
62818             .on('change', change());
62819
62820         wrap.selectAll('input:not(.combobox-input)')
62821             .on('input', change(true));
62822
62823         dispatch$$1.call('init');
62824         isInitialized = true;
62825     }
62826
62827
62828     function address(selection$$1) {
62829         isInitialized = false;
62830
62831         wrap = selection$$1.selectAll('.preset-input-wrap')
62832             .data([0]);
62833
62834         wrap = wrap.enter()
62835             .append('div')
62836             .attr('class', 'preset-input-wrap')
62837             .merge(wrap);
62838
62839         if (nominatim && entity) {
62840             var center = entity.extent(context.graph()).center();
62841             nominatim.countryCode(center, initCallback);
62842         }
62843     }
62844
62845
62846     function change(onInput) {
62847         return function() {
62848             var tags = {};
62849
62850             wrap.selectAll('input')
62851                 .each(function (field) {
62852                     tags['addr:' + field.id] = this.value || undefined;
62853                 });
62854
62855             dispatch$$1.call('change', this, tags, onInput);
62856         };
62857     }
62858
62859
62860     function updateTags(tags) {
62861         utilGetSetValue(wrap.selectAll('input'), function (field) {
62862             return tags['addr:' + field.id] || '';
62863         });
62864     }
62865
62866
62867     address.entity = function(_) {
62868         if (!arguments.length) return entity;
62869         entity = _;
62870         return address;
62871     };
62872
62873
62874     address.tags = function(tags) {
62875         if (isInitialized) {
62876             updateTags(tags);
62877         } else {
62878             dispatch$$1.on('init', function () {
62879                 dispatch$$1.on('init', null);
62880                 updateTags(tags);
62881             });
62882         }
62883     };
62884
62885
62886     address.focus = function() {
62887         var node = wrap.selectAll('input').node();
62888         if (node) node.focus();
62889     };
62890
62891
62892     return utilRebind(address, dispatch$$1, 'on');
62893 }
62894
62895 function uiFieldCycleway(field, context) {
62896     var dispatch$$1 = dispatch('change'),
62897         items = d3_select(null);
62898
62899
62900     function cycleway(selection$$1) {
62901
62902         function stripcolon(s) {
62903             return s.replace(':', '');
62904         }
62905
62906
62907         var wrap = selection$$1.selectAll('.preset-input-wrap')
62908             .data([0]);
62909
62910         wrap = wrap.enter()
62911             .append('div')
62912             .attr('class', 'cf preset-input-wrap')
62913             .merge(wrap);
62914
62915
62916         var div = wrap.selectAll('ul')
62917             .data([0]);
62918
62919         div = div.enter()
62920             .append('ul')
62921             .merge(div);
62922
62923
62924         items = div.selectAll('li')
62925             .data(field.keys);
62926
62927         var enter = items.enter()
62928             .append('li')
62929             .attr('class', function(d) { return 'cf preset-cycleway-' + stripcolon(d); });
62930
62931         enter
62932             .append('span')
62933             .attr('class', 'col6 label preset-label-cycleway')
62934             .attr('for', function(d) { return 'preset-input-cycleway-' + stripcolon(d); })
62935             .text(function(d) { return field.t('types.' + d); });
62936
62937         enter
62938             .append('div')
62939             .attr('class', 'col6 preset-input-cycleway-wrap')
62940             .append('input')
62941             .attr('type', 'text')
62942             .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
62943             .call(utilNoAuto)
62944             .each(function(d) {
62945                 d3_select(this)
62946                     .call(d3combobox()
62947                         .container(context.container())
62948                         .data(cycleway.options(d))
62949                     );
62950             });
62951
62952
62953         // Update
62954         wrap.selectAll('.preset-input-cycleway')
62955             .on('change', change)
62956             .on('blur', change);
62957     }
62958
62959
62960     function change() {
62961         var left = utilGetSetValue(d3_select('.preset-input-cyclewayleft')),
62962             right = utilGetSetValue(d3_select('.preset-input-cyclewayright')),
62963             tag = {};
62964
62965         if (left === 'none' || left === '') { left = undefined; }
62966         if (right === 'none' || right === '') { right = undefined; }
62967
62968         // Always set both left and right as changing one can affect the other
62969         tag = {
62970             cycleway: undefined,
62971             'cycleway:left': left,
62972             'cycleway:right': right
62973         };
62974
62975         // If the left and right tags match, use the cycleway tag to tag both
62976         // sides the same way
62977         if (left === right) {
62978             tag = {
62979                 cycleway: left,
62980                 'cycleway:left': undefined,
62981                 'cycleway:right': undefined
62982             };
62983         }
62984
62985         dispatch$$1.call('change', this, tag);
62986     }
62987
62988
62989     cycleway.options = function() {
62990         return keys$1(field.strings.options).map(function(option) {
62991             return {
62992                 title: field.t('options.' + option + '.description'),
62993                 value: option
62994             };
62995         });
62996     };
62997
62998
62999     cycleway.tags = function(tags) {
63000         utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
63001                 // If cycleway is set, always return that
63002                 if (tags.cycleway) {
63003                     return tags.cycleway;
63004                 }
63005                 return tags[d] || '';
63006             })
63007             .attr('placeholder', field.placeholder());
63008     };
63009
63010
63011     cycleway.focus = function() {
63012         items.selectAll('.preset-input-cycleway')
63013             .node().focus();
63014     };
63015
63016
63017     return utilRebind(cycleway, dispatch$$1, 'on');
63018 }
63019
63020 function uiFieldLanes(field, context) {
63021     var dispatch$$1 = dispatch('change'),
63022         LANE_WIDTH = 40,
63023         LANE_HEIGHT = 200,
63024         wayID,
63025         lanesData;
63026
63027     function lanes(selection$$1) {
63028         lanesData = context.entity(wayID).lanes();
63029
63030         if (!d3_select('.inspector-wrap.inspector-hidden').empty() || !selection$$1.node().parentNode) {
63031             selection$$1.call(lanes.off);
63032             return;
63033         }
63034
63035         var wrap = selection$$1.selectAll('.preset-input-wrap')
63036             .data([0]);
63037
63038         wrap = wrap.enter()
63039             .append('div')
63040             .attr('class', 'preset-input-wrap')
63041             .merge(wrap);
63042
63043         var surface =  wrap.selectAll('.surface')
63044             .data([0]);
63045
63046         var d = utilGetDimensions(wrap);
63047         var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
63048
63049         surface = surface.enter()
63050             .append('svg')
63051             .attr('width', d[0])
63052             .attr('height', 300)
63053             .attr('class', 'surface')
63054             .merge(surface);
63055
63056
63057         var lanesSelection = surface.selectAll('.lanes')
63058             .data([0]);
63059
63060         lanesSelection = lanesSelection.enter()
63061             .append('g')
63062             .attr('class', 'lanes')
63063             .merge(lanesSelection);
63064
63065         lanesSelection
63066             .attr('transform', function () {
63067                 return 'translate(' + (freeSpace / 2) + ', 0)';
63068             });
63069
63070
63071         var lane = lanesSelection.selectAll('.lane')
63072            .data(lanesData.lanes);
63073
63074         lane.exit()
63075             .remove();
63076
63077         var enter = lane.enter()
63078             .append('g')
63079             .attr('class', 'lane');
63080
63081         enter
63082             .append('g')
63083             .append('rect')
63084             .attr('y', 50)
63085             .attr('width', LANE_WIDTH)
63086             .attr('height', LANE_HEIGHT);
63087
63088         enter
63089             .append('g')
63090             .attr('class', 'forward')
63091             .append('text')
63092             .attr('y', 40)
63093             .attr('x', 14)
63094             .text('▲');
63095
63096         enter
63097             .append('g')
63098             .attr('class', 'bothways')
63099             .append('text')
63100             .attr('y', 40)
63101             .attr('x', 14)
63102             .text('▲▼');
63103
63104         enter
63105             .append('g')
63106             .attr('class', 'backward')
63107             .append('text')
63108             .attr('y', 40)
63109             .attr('x', 14)
63110             .text('▼');
63111
63112
63113         lane = lane
63114             .merge(enter);
63115
63116         lane
63117             .attr('transform', function(d) {
63118                 return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
63119             });
63120
63121         lane.select('.forward')
63122             .style('visibility', function(d) {
63123                 return d.direction === 'forward' ? 'visible' : 'hidden';
63124             });
63125
63126         lane.select('.bothways')
63127             .style('visibility', function(d) {
63128                 return d.direction === 'bothways' ? 'visible' : 'hidden';
63129             });
63130
63131         lane.select('.backward')
63132             .style('visibility', function(d) {
63133                 return d.direction === 'backward' ? 'visible' : 'hidden';
63134             });
63135     }
63136
63137
63138     lanes.entity = function(_) {
63139         if (!wayID || wayID !== _.id) {
63140             wayID = _.id;
63141         }
63142     };
63143
63144     lanes.tags = function() {};
63145     lanes.focus = function() {};
63146     lanes.off = function() {};
63147
63148     return utilRebind(lanes, dispatch$$1, 'on');
63149 }
63150
63151 function uiFieldLocalized(field, context) {
63152     var dispatch$$1 = dispatch('change', 'input'),
63153         wikipedia = services.wikipedia,
63154         input = d3_select(null),
63155         localizedInputs = d3_select(null),
63156         wikiTitles,
63157         entity;
63158
63159
63160     function localized(selection$$1) {
63161         input = selection$$1.selectAll('.localized-main')
63162             .data([0]);
63163
63164         input = input.enter()
63165             .append('input')
63166             .attr('type', 'text')
63167             .attr('id', 'preset-input-' + field.id)
63168             .attr('class', 'localized-main')
63169             .attr('placeholder', field.placeholder())
63170             .call(utilNoAuto)
63171             .merge(input);
63172
63173         if (field.id === 'name') {
63174             var preset = context.presets().match(entity, context.graph());
63175             input
63176                 .call(d3combobox()
63177                     .container(context.container())
63178                     .fetcher(utilSuggestNames(preset, dataSuggestions))
63179                 );
63180         }
63181
63182         input
63183             .on('input', change(true))
63184             .on('blur', change())
63185             .on('change', change());
63186
63187
63188         var translateButton = selection$$1.selectAll('.localized-add')
63189             .data([0]);
63190
63191         translateButton = translateButton.enter()
63192             .append('button')
63193             .attr('class', 'button-input-action localized-add minor')
63194             .attr('tabindex', -1)
63195             .call(svgIcon('#icon-plus'))
63196             .call(tooltip()
63197                 .title(t('translate.translate'))
63198                 .placement('left'))
63199             .merge(translateButton);
63200
63201         translateButton
63202             .on('click', addNew);
63203
63204
63205         localizedInputs = selection$$1.selectAll('.localized-wrap')
63206             .data([0]);
63207
63208         localizedInputs = localizedInputs.enter().append('div')
63209             .attr('class', 'localized-wrap')
63210             .merge(localizedInputs);
63211     }
63212
63213
63214     function addNew() {
63215         event.preventDefault();
63216         var data$$1 = localizedInputs.selectAll('div.entry').data();
63217         var defaultLang = utilDetect().locale.toLowerCase().split('-')[0];
63218         var langExists = find$1(data$$1, function(datum) { return datum.lang === defaultLang;});
63219         var isLangEn = defaultLang.indexOf('en') > -1;
63220         if (isLangEn || langExists) {
63221             defaultLang = '';
63222         }
63223         data$$1.push({ lang: defaultLang, value: '' });
63224         localizedInputs.call(render, data$$1);
63225     }
63226
63227
63228     function change(onInput) {
63229         return function() {
63230             var t$$1 = {};
63231             t$$1[field.key] = utilGetSetValue(d3_select(this)) || undefined;
63232             dispatch$$1.call('change', this, t$$1, onInput);
63233         };
63234     }
63235
63236
63237     function key(lang) {
63238         return field.key + ':' + lang;
63239     }
63240
63241
63242     function changeLang(d) {
63243         var lang = utilGetSetValue(d3_select(this)),
63244             t$$1 = {},
63245             language = find$1(wikipedia$2, function(d) {
63246                 return d[0].toLowerCase() === lang.toLowerCase() ||
63247                     d[1].toLowerCase() === lang.toLowerCase();
63248             });
63249
63250         if (language) lang = language[2];
63251
63252         if (d.lang && d.lang !== lang) {
63253             t$$1[key(d.lang)] = undefined;
63254         }
63255
63256         var value = utilGetSetValue(d3_select(this.parentNode)
63257             .selectAll('.localized-value'));
63258
63259         if (lang && value) {
63260             t$$1[key(lang)] = value;
63261         } else if (lang && wikiTitles && wikiTitles[d.lang]) {
63262             t$$1[key(lang)] = wikiTitles[d.lang];
63263         }
63264
63265         d.lang = lang;
63266         dispatch$$1.call('change', this, t$$1);
63267     }
63268
63269
63270     function changeValue(d) {
63271         if (!d.lang) return;
63272         var t$$1 = {};
63273         t$$1[key(d.lang)] = utilGetSetValue(d3_select(this)) || undefined;
63274         dispatch$$1.call('change', this, t$$1);
63275     }
63276
63277
63278     function fetcher(value, cb) {
63279         var v = value.toLowerCase();
63280
63281         cb(wikipedia$2.filter(function(d) {
63282             return d[0].toLowerCase().indexOf(v) >= 0 ||
63283             d[1].toLowerCase().indexOf(v) >= 0 ||
63284             d[2].toLowerCase().indexOf(v) >= 0;
63285         }).map(function(d) {
63286             return { value: d[1] };
63287         }));
63288     }
63289
63290
63291     function render(selection$$1, data$$1) {
63292         var wraps = selection$$1.selectAll('div.entry').
63293             data(data$$1, function(d) { return d.lang; });
63294
63295         wraps.exit()
63296             .transition()
63297             .duration(200)
63298             .style('max-height','0px')
63299             .style('opacity', '0')
63300             .style('top','-10px')
63301             .remove();
63302
63303         var innerWrap = wraps.enter()
63304             .insert('div', ':first-child');
63305
63306         innerWrap.attr('class', 'entry')
63307             .each(function() {
63308                 var wrap = d3_select(this);
63309                 var langcombo = d3combobox()
63310                     .container(context.container())
63311                     .fetcher(fetcher)
63312                     .minItems(0);
63313
63314                 var label = wrap
63315                     .append('label')
63316                     .attr('class','form-label')
63317                     .text(t('translate.localized_translation_label'))
63318                     .attr('for','localized-lang');
63319
63320                 label
63321                     .append('button')
63322                     .attr('class', 'minor remove')
63323                     .on('click', function(d){
63324                         event.preventDefault();
63325                         var t$$1 = {};
63326                         t$$1[key(d.lang)] = undefined;
63327                         dispatch$$1.call('change', this, t$$1);
63328                         d3_select(this.parentNode.parentNode)
63329                             .style('top','0')
63330                             .style('max-height','240px')
63331                             .transition()
63332                             .style('opacity', '0')
63333                             .style('max-height','0px')
63334                             .remove();
63335                     })
63336                     .call(svgIcon('#operation-delete'));
63337
63338                 wrap
63339                     .append('input')
63340                     .attr('class', 'localized-lang')
63341                     .attr('type', 'text')
63342                     .attr('placeholder',t('translate.localized_translation_language'))
63343                     .on('blur', changeLang)
63344                     .on('change', changeLang)
63345                     .call(langcombo);
63346
63347                 wrap
63348                     .append('input')
63349                     .on('blur', changeValue)
63350                     .on('change', changeValue)
63351                     .attr('type', 'text')
63352                     .attr('placeholder', t('translate.localized_translation_name'))
63353                     .attr('class', 'localized-value');
63354             });
63355
63356         innerWrap
63357             .style('margin-top', '0px')
63358             .style('max-height', '0px')
63359             .style('opacity', '0')
63360             .transition()
63361             .duration(200)
63362             .style('margin-top', '10px')
63363             .style('max-height', '240px')
63364             .style('opacity', '1')
63365             .on('end', function() {
63366                 d3_select(this)
63367                     .style('max-height', '')
63368                     .style('overflow', 'visible');
63369             });
63370
63371
63372         var entry = selection$$1.selectAll('.entry');
63373
63374         utilGetSetValue(entry.select('.localized-lang'), function(d) {
63375                 var lang = find$1(wikipedia$2, function(lang) { return lang[2] === d.lang; });
63376                 return lang ? lang[1] : d.lang;
63377             });
63378
63379         utilGetSetValue(entry.select('.localized-value'),
63380             function(d) { return d.value; });
63381     }
63382
63383
63384     localized.tags = function(tags) {
63385         // Fetch translations from wikipedia
63386         if (tags.wikipedia && !wikiTitles) {
63387             wikiTitles = {};
63388             var wm = tags.wikipedia.match(/([^:]+):(.+)/);
63389             if (wm && wm[0] && wm[1]) {
63390                 wikipedia.translations(wm[1], wm[2], function(d) {
63391                     wikiTitles = d;
63392                 });
63393             }
63394         }
63395
63396         utilGetSetValue(input, tags[field.key] || '');
63397
63398         var postfixed = [], k, m;
63399         for (k in tags) {
63400             m = k.match(/^(.*):([a-zA-Z_-]+)$/);
63401             if (m && m[1] === field.key && m[2]) {
63402                 postfixed.push({ lang: m[2], value: tags[k] });
63403             }
63404         }
63405
63406         localizedInputs.call(render, postfixed.reverse());
63407     };
63408
63409
63410     localized.focus = function() {
63411         input.node().focus();
63412     };
63413
63414
63415     localized.entity = function(_) {
63416         if (!arguments.length) return entity;
63417         entity = _;
63418         return localized;
63419     };
63420
63421     return utilRebind(localized, dispatch$$1, 'on');
63422 }
63423
63424 function uiFieldMaxspeed(field, context) {
63425     var dispatch$$1 = dispatch('change'),
63426         entity,
63427         isImperial,
63428         unitInput = d3_select(null),
63429         input = d3_select(null),
63430         combobox;
63431
63432     var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120],
63433         imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
63434
63435
63436     function maxspeed(selection$$1) {
63437         combobox = d3combobox()
63438             .container(context.container());
63439
63440         var unitCombobox = d3combobox()
63441             .container(context.container())
63442             .data(['km/h', 'mph'].map(comboValues));
63443
63444         input = selection$$1.selectAll('#preset-input-' + field.id)
63445             .data([0]);
63446
63447         input = input.enter()
63448             .append('input')
63449             .attr('type', 'text')
63450             .attr('id', 'preset-input-' + field.id)
63451             .attr('placeholder', field.placeholder())
63452             .call(utilNoAuto)
63453             .call(combobox)
63454             .merge(input);
63455
63456         input
63457             .on('change', change)
63458             .on('blur', change);
63459
63460         var childNodes = context.graph().childNodes(context.entity(entity.id)),
63461             loc = childNodes[~~(childNodes.length/2)].loc;
63462
63463         isImperial = some(dataImperial.features, function(f) {
63464             return some(f.geometry.coordinates, function(d) {
63465                 return geoPointInPolygon(loc, d);
63466             });
63467         });
63468
63469         unitInput = selection$$1.selectAll('input.maxspeed-unit')
63470             .data([0]);
63471
63472         unitInput = unitInput.enter()
63473             .append('input')
63474             .attr('type', 'text')
63475             .attr('class', 'maxspeed-unit')
63476             .call(unitCombobox)
63477             .merge(unitInput);
63478
63479         unitInput
63480             .on('blur', changeUnits)
63481             .on('change', changeUnits);
63482
63483
63484         function changeUnits() {
63485             isImperial = utilGetSetValue(unitInput) === 'mph';
63486             utilGetSetValue(unitInput, isImperial ? 'mph' : 'km/h');
63487             setSuggestions();
63488             change();
63489         }
63490     }
63491
63492
63493     function setSuggestions() {
63494         combobox.data((isImperial ? imperialValues : metricValues).map(comboValues));
63495         utilGetSetValue(unitInput, isImperial ? 'mph' : 'km/h');
63496     }
63497
63498
63499     function comboValues(d) {
63500         return {
63501             value: d.toString(),
63502             title: d.toString()
63503         };
63504     }
63505
63506
63507     function change() {
63508         var tag = {},
63509             value = utilGetSetValue(input);
63510
63511         if (!value) {
63512             tag[field.key] = undefined;
63513         } else if (isNaN(value) || !isImperial) {
63514             tag[field.key] = value;
63515         } else {
63516             tag[field.key] = value + ' mph';
63517         }
63518
63519         dispatch$$1.call('change', this, tag);
63520     }
63521
63522
63523     maxspeed.tags = function(tags) {
63524         var value = tags[field.key];
63525
63526         if (value && value.indexOf('mph') >= 0) {
63527             value = parseInt(value, 10);
63528             isImperial = true;
63529         } else if (value) {
63530             isImperial = false;
63531         }
63532
63533         setSuggestions();
63534         utilGetSetValue(input, value || '');
63535     };
63536
63537
63538     maxspeed.focus = function() {
63539         input.node().focus();
63540     };
63541
63542
63543     maxspeed.entity = function(_) {
63544         entity = _;
63545     };
63546
63547
63548     return utilRebind(maxspeed, dispatch$$1, 'on');
63549 }
63550
63551 /**
63552  * This function is like `baseIndexOf` except that it accepts a comparator.
63553  *
63554  * @private
63555  * @param {Array} array The array to inspect.
63556  * @param {*} value The value to search for.
63557  * @param {number} fromIndex The index to search from.
63558  * @param {Function} comparator The comparator invoked per element.
63559  * @returns {number} Returns the index of the matched value, else `-1`.
63560  */
63561 function baseIndexOfWith(array, value, fromIndex, comparator) {
63562   var index = fromIndex - 1,
63563       length = array.length;
63564
63565   while (++index < length) {
63566     if (comparator(array[index], value)) {
63567       return index;
63568     }
63569   }
63570   return -1;
63571 }
63572
63573 /** Used for built-in method references. */
63574 var arrayProto$2 = Array.prototype;
63575
63576 /** Built-in value references. */
63577 var splice$2 = arrayProto$2.splice;
63578
63579 /**
63580  * The base implementation of `_.pullAllBy` without support for iteratee
63581  * shorthands.
63582  *
63583  * @private
63584  * @param {Array} array The array to modify.
63585  * @param {Array} values The values to remove.
63586  * @param {Function} [iteratee] The iteratee invoked per element.
63587  * @param {Function} [comparator] The comparator invoked per element.
63588  * @returns {Array} Returns `array`.
63589  */
63590 function basePullAll(array, values, iteratee, comparator) {
63591   var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
63592       index = -1,
63593       length = values.length,
63594       seen = array;
63595
63596   if (array === values) {
63597     values = copyArray(values);
63598   }
63599   if (iteratee) {
63600     seen = arrayMap(array, baseUnary(iteratee));
63601   }
63602   while (++index < length) {
63603     var fromIndex = 0,
63604         value = values[index],
63605         computed = iteratee ? iteratee(value) : value;
63606
63607     while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
63608       if (seen !== array) {
63609         splice$2.call(seen, fromIndex, 1);
63610       }
63611       splice$2.call(array, fromIndex, 1);
63612     }
63613   }
63614   return array;
63615 }
63616
63617 /**
63618  * This method is like `_.pull` except that it accepts an array of values to remove.
63619  *
63620  * **Note:** Unlike `_.difference`, this method mutates `array`.
63621  *
63622  * @static
63623  * @memberOf _
63624  * @since 4.0.0
63625  * @category Array
63626  * @param {Array} array The array to modify.
63627  * @param {Array} values The values to remove.
63628  * @returns {Array} Returns `array`.
63629  * @example
63630  *
63631  * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
63632  *
63633  * _.pullAll(array, ['a', 'c']);
63634  * console.log(array);
63635  * // => ['b', 'b']
63636  */
63637 function pullAll(array, values) {
63638   return (array && array.length && values && values.length)
63639     ? basePullAll(array, values)
63640     : array;
63641 }
63642
63643 /**
63644  * Removes all given values from `array` using
63645  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
63646  * for equality comparisons.
63647  *
63648  * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
63649  * to remove elements from an array by predicate.
63650  *
63651  * @static
63652  * @memberOf _
63653  * @since 2.0.0
63654  * @category Array
63655  * @param {Array} array The array to modify.
63656  * @param {...*} [values] The values to remove.
63657  * @returns {Array} Returns `array`.
63658  * @example
63659  *
63660  * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
63661  *
63662  * _.pull(array, 'a', 'c');
63663  * console.log(array);
63664  * // => ['b', 'b']
63665  */
63666 var pull = baseRest(pullAll);
63667
63668 function uiFieldRadio(field, context) {
63669     var dispatch$$1 = dispatch('change'),
63670         placeholder = d3_select(null),
63671         wrap = d3_select(null),
63672         labels = d3_select(null),
63673         radios = d3_select(null),
63674         radioData = clone(field.options || field.keys),
63675         typeField,
63676         layerField,
63677         oldType = {},
63678         entity;
63679
63680
63681     function selectedKey() {
63682         var node = wrap.selectAll('.toggle-list label.active input');
63683         return !node.empty() && node.datum();
63684     }
63685
63686
63687     function radio(selection$$1) {
63688         selection$$1.classed('preset-radio', true);
63689
63690         wrap = selection$$1.selectAll('.preset-input-wrap')
63691             .data([0]);
63692
63693         var enter = wrap.enter()
63694             .append('div')
63695             .attr('class', 'preset-input-wrap toggle-list');
63696
63697         enter
63698             .append('span')
63699             .attr('class', 'placeholder');
63700
63701         wrap = wrap
63702             .merge(enter);
63703
63704
63705         placeholder = wrap.selectAll('.placeholder');
63706
63707         labels = wrap.selectAll('label')
63708             .data(radioData);
63709
63710         enter = labels.enter()
63711             .append('label');
63712
63713         enter
63714             .append('input')
63715             .attr('type', 'radio')
63716             .attr('name', field.id)
63717             .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
63718             .attr('checked', false);
63719
63720         enter
63721             .append('span')
63722             .text(function(d) { return field.t('options.' + d, { 'default': d }); });
63723
63724         labels = labels
63725             .merge(enter);
63726
63727         radios = labels.selectAll('input')
63728             .on('change', changeRadio);
63729
63730     }
63731
63732
63733     function structureExtras(selection$$1, tags) {
63734         var selected = selectedKey(),
63735             type = context.presets().field(selected),
63736             layer = context.presets().field('layer'),
63737             showLayer = (selected === 'bridge' || selected === 'tunnel');
63738
63739
63740         var extrasWrap = selection$$1.selectAll('.structure-extras-wrap')
63741             .data(selected ? [0] : []);
63742
63743         extrasWrap.exit()
63744             .remove();
63745
63746         extrasWrap = extrasWrap.enter()
63747             .append('div')
63748             .attr('class', 'structure-extras-wrap')
63749             .merge(extrasWrap);
63750
63751         var list = extrasWrap.selectAll('ul')
63752             .data([0]);
63753
63754         list = list.enter()
63755             .append('ul')
63756             .merge(list);
63757
63758
63759         // Type
63760         if (type) {
63761             if (!typeField || typeField.id !== selected) {
63762                 typeField = uiField(context, type, entity, { wrap: false })
63763                     .on('change', changeType);
63764             }
63765             typeField.tags(tags);
63766         } else {
63767             typeField = null;
63768         }
63769
63770         var typeItem = list.selectAll('.structure-type-item')
63771             .data(typeField ? [typeField] : [], function(d) { return d.id; });
63772
63773         // Exit
63774         typeItem.exit()
63775             .remove();
63776
63777         // Enter
63778         var typeEnter = typeItem.enter()
63779             .insert('li', ':first-child')
63780             .attr('class', 'cf structure-type-item');
63781
63782         typeEnter
63783             .append('span')
63784             .attr('class', 'col6 label structure-label-type')
63785             .attr('for', 'preset-input-' + selected)
63786             .text(t('inspector.radio.structure.type'));
63787
63788         typeEnter
63789             .append('div')
63790             .attr('class', 'col6 structure-input-type-wrap');
63791
63792         // Update
63793         typeItem = typeItem
63794             .merge(typeEnter);
63795
63796         if (typeField) {
63797             typeItem.selectAll('.structure-input-type-wrap')
63798                 .call(typeField.render);
63799         }
63800
63801
63802         // Layer
63803         if (layer && showLayer) {
63804             if (!layerField) {
63805                 layerField = uiField(context, layer, entity, { wrap: false })
63806                     .on('change', changeLayer);
63807             }
63808             layerField.tags(tags);
63809             field.keys = union(field.keys, ['layer']);
63810         } else {
63811             layerField = null;
63812             pull(field.keys, 'layer');
63813         }
63814
63815         var layerItem = list.selectAll('.structure-layer-item')
63816             .data(layerField ? [layerField] : []);
63817
63818         // Exit
63819         layerItem.exit()
63820             .remove();
63821
63822         // Enter
63823         var layerEnter = layerItem.enter()
63824             .append('li')
63825             .attr('class', 'cf structure-layer-item');
63826
63827         layerEnter
63828             .append('span')
63829             .attr('class', 'col6 label structure-label-layer')
63830             .attr('for', 'preset-input-layer')
63831             .text(t('inspector.radio.structure.layer'));
63832
63833         layerEnter
63834             .append('div')
63835             .attr('class', 'col6 structure-input-layer-wrap');
63836
63837         // Update
63838         layerItem = layerItem
63839             .merge(layerEnter);
63840
63841         if (layerField) {
63842             layerItem.selectAll('.structure-input-layer-wrap')
63843                 .call(layerField.render);
63844         }
63845     }
63846
63847
63848     function changeType(t$$1, onInput) {
63849         var key = selectedKey();
63850         if (!key) return;
63851
63852         var val = t$$1[key];
63853         if (val !== 'no') {
63854             oldType[key] = val;
63855         }
63856
63857         if (field.type === 'structureRadio') {
63858             // remove layer if it should not be set
63859             if (val === 'no' ||
63860                 (key !== 'bridge' && key !== 'tunnel') ||
63861                 (key === 'tunnel' && val === 'building_passage')) {
63862                 t$$1.layer = undefined;
63863             }
63864             // add layer if it should be set
63865             if (t$$1.layer === undefined) {
63866                 if (key === 'bridge' && val !== 'no') {
63867                     t$$1.layer = '1';
63868                 }
63869                 if (key === 'tunnel' && val !== 'no' && val !== 'building_passage') {
63870                     t$$1.layer = '-1';
63871                 }
63872             }
63873          }
63874
63875         dispatch$$1.call('change', this, t$$1, onInput);
63876     }
63877
63878
63879     function changeLayer(t$$1, onInput) {
63880         if (t$$1.layer === '0') {
63881             t$$1.layer = undefined;
63882         }
63883         dispatch$$1.call('change', this, t$$1, onInput);
63884     }
63885
63886
63887     function changeRadio() {
63888         var t$$1 = {},
63889             activeKey;
63890
63891         if (field.key) {
63892             t$$1[field.key] = undefined;
63893         }
63894
63895         radios.each(function(d) {
63896             var active = d3_select(this).property('checked');
63897             if (active) activeKey = d;
63898
63899             if (field.key) {
63900                 if (active) t$$1[field.key] = d;
63901             } else {
63902                 var val = oldType[activeKey] || 'yes';
63903                 t$$1[d] = active ? val : undefined;
63904             }
63905         });
63906
63907         if (field.type === 'structureRadio') {
63908             if (activeKey === 'bridge') {
63909                 t$$1.layer = '1';
63910             } else if (activeKey === 'tunnel' && t$$1.tunnel !== 'building_passage') {
63911                 t$$1.layer = '-1';
63912             } else {
63913                 t$$1.layer = undefined;
63914             }
63915         }
63916
63917         dispatch$$1.call('change', this, t$$1);
63918     }
63919
63920
63921     radio.tags = function(tags) {
63922         function checked(d) {
63923             if (field.key) {
63924                 return tags[field.key] === d;
63925             } else {
63926                 return !!(tags[d] && tags[d].toLowerCase() !== 'no');
63927             }
63928         }
63929
63930         labels.classed('active', checked);
63931         radios.property('checked', checked);
63932
63933         var selection$$1 = radios.filter(function() { return this.checked; });
63934
63935         if (selection$$1.empty()) {
63936             placeholder.text(t('inspector.none'));
63937         } else {
63938             placeholder.text(selection$$1.attr('value'));
63939             oldType[selection$$1.datum()] = tags[selection$$1.datum()];
63940         }
63941
63942         if (field.type === 'structureRadio') {
63943             // For waterways without a tunnel tag, set 'culvert' as
63944             // the oldType to default to if the user picks 'tunnel'
63945             if (!!tags.waterway && !oldType.tunnel) {
63946                 oldType.tunnel = 'culvert';
63947             }
63948
63949             wrap.call(structureExtras, tags);
63950         }
63951     };
63952
63953
63954     radio.focus = function() {
63955         radios.node().focus();
63956     };
63957
63958
63959     radio.entity = function(_) {
63960         if (!arguments.length) return entity;
63961         entity = _;
63962         oldType = {};
63963         return radio;
63964     };
63965
63966
63967     return utilRebind(radio, dispatch$$1, 'on');
63968 }
63969
63970 function uiFieldRestrictions(field, context) {
63971     var dispatch$$1 = dispatch('change');
63972     var breathe = behaviorBreathe(context);
63973     var storedViaWay = context.storage('turn-restriction-via-way');
63974     var storedDistance = context.storage('turn-restriction-distance');
63975
63976     var _maxViaWay = storedViaWay !== null ? (+storedViaWay) : 1;
63977     var _maxDistance = storedDistance ? (+storedDistance) : 30;
63978     var _initialized = false;
63979     var _parent = d3_select(null);       // the entire field
63980     var _container = d3_select(null);    // just the map
63981     var _oldTurns;
63982     var _graph;
63983     var _vertexID;
63984     var _intersection;
63985     var _fromWayID;
63986
63987
63988     function restrictions(selection$$1) {
63989         _parent = selection$$1;
63990
63991         // try to reuse the intersection, but always rebuild it if the graph has changed
63992         if (_vertexID && (context.graph() !== _graph || !_intersection)) {
63993             _graph = context.graph();
63994             _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
63995         }
63996
63997         // It's possible for there to be no actual intersection here.
63998         // for example, a vertex of two `highway=path`
63999         // In this case, hide the field.
64000         var isOK = (_intersection && _intersection.vertices.length && _intersection.ways.length);
64001         d3_select(selection$$1.node().parentNode).classed('hide', !isOK);
64002
64003         // if form field is hidden or has detached from dom, clean up.
64004         if (!isOK ||
64005             !d3_select('.inspector-wrap.inspector-hidden').empty() ||
64006             !selection$$1.node().parentNode ||
64007             !selection$$1.node().parentNode.parentNode) {
64008             selection$$1.call(restrictions.off);
64009             return;
64010         }
64011
64012
64013         var wrap = selection$$1.selectAll('.preset-input-wrap')
64014             .data([0]);
64015
64016         wrap = wrap.enter()
64017             .append('div')
64018             .attr('class', 'preset-input-wrap')
64019             .merge(wrap);
64020
64021         var container = wrap.selectAll('.restriction-container')
64022             .data([0]);
64023
64024         // enter
64025         var containerEnter = container.enter()
64026             .append('div')
64027             .attr('class', 'restriction-container');
64028
64029         containerEnter
64030             .append('div')
64031             .attr('class', 'restriction-help');
64032
64033         // update
64034         _container = containerEnter
64035             .merge(container)
64036             .call(renderViewer);
64037
64038         var controls = wrap.selectAll('.restriction-controls')
64039             .data([0]);
64040
64041         // enter/update
64042         controls.enter()
64043             .append('div')
64044             .attr('class', 'restriction-controls-container')
64045             .append('div')
64046             .attr('class', 'restriction-controls')
64047             .merge(controls)
64048             .call(renderControls);
64049     }
64050
64051
64052     function renderControls(selection$$1) {
64053         var distControl = selection$$1.selectAll('.restriction-distance')
64054             .data([0]);
64055
64056         distControl.exit()
64057             .remove();
64058
64059         var distControlEnter = distControl.enter()
64060             .append('div')
64061             .attr('class', 'restriction-control restriction-distance');
64062
64063         distControlEnter
64064             .append('span')
64065             .attr('class', 'restriction-control-label restriction-distance-label')
64066             .text(t('restriction.controls.distance') + ':');
64067
64068         distControlEnter
64069             .append('input')
64070             .attr('class', 'restriction-distance-input')
64071             .attr('type', 'range')
64072             .attr('min', '20')
64073             .attr('max', '50')
64074             .attr('step', '5');
64075
64076         distControlEnter
64077             .append('span')
64078             .attr('class', 'restriction-distance-text');
64079
64080         // update
64081         selection$$1.selectAll('.restriction-distance-input')
64082             .property('value', _maxDistance)
64083             .on('input', function() {
64084                 var val = d3_select(this).property('value');
64085                 _maxDistance = +val;
64086                 _intersection = null;
64087                 _container.selectAll('.layer-osm .layer-turns *').remove();
64088                 context.storage('turn-restriction-distance', _maxDistance);
64089                 _parent.call(restrictions);
64090             });
64091
64092         selection$$1.selectAll('.restriction-distance-text')
64093             .text(displayMaxDistance(_maxDistance));
64094
64095
64096         var viaControl = selection$$1.selectAll('.restriction-via-way')
64097             .data([0]);
64098
64099         viaControl.exit()
64100             .remove();
64101
64102         var viaControlEnter = viaControl.enter()
64103             .append('div')
64104             .attr('class', 'restriction-control restriction-via-way');
64105
64106         viaControlEnter
64107             .append('span')
64108             .attr('class', 'restriction-control-label restriction-via-way-label')
64109             .text(t('restriction.controls.via') + ':');
64110
64111         viaControlEnter
64112             .append('input')
64113             .attr('class', 'restriction-via-way-input')
64114             .attr('type', 'range')
64115             .attr('min', '0')
64116             .attr('max', '2')
64117             .attr('step', '1');
64118
64119         viaControlEnter
64120             .append('span')
64121             .attr('class', 'restriction-via-way-text');
64122
64123         // update
64124         selection$$1.selectAll('.restriction-via-way-input')
64125             .property('value', _maxViaWay)
64126             .on('input', function() {
64127                 var val = d3_select(this).property('value');
64128                 _maxViaWay = +val;
64129                 _container.selectAll('.layer-osm .layer-turns *').remove();
64130                 context.storage('turn-restriction-via-way', _maxViaWay);
64131                 _parent.call(restrictions);
64132             });
64133
64134         selection$$1.selectAll('.restriction-via-way-text')
64135             .text(displayMaxVia(_maxViaWay));
64136     }
64137
64138
64139     function renderViewer(selection$$1) {
64140         if (!_intersection) return;
64141
64142         var vgraph = _intersection.graph;
64143         var filter = utilFunctor(true);
64144         var projection = geoRawMercator();
64145
64146         var d = utilGetDimensions(selection$$1);
64147         var c = geoVecScale(d, 0.5);
64148         var z = 22;
64149
64150         projection.scale(geoZoomToScale(z));
64151
64152         // Calculate extent of all key vertices
64153         var extent = geoExtent$$1();
64154         for (var i = 0; i < _intersection.vertices.length; i++) {
64155             extent._extend(_intersection.vertices[i].extent());
64156         }
64157
64158         // If this is a large intersection, adjust zoom to fit extent
64159         if (_intersection.vertices.length > 1) {
64160             var padding = 180;   // in z22 pixels
64161             var tl = projection([extent[0][0], extent[1][1]]);
64162             var br = projection([extent[1][0], extent[0][1]]);
64163             var hFactor = (br[0] - tl[0]) / (d[0] - padding);
64164             var vFactor = (br[1] - tl[1]) / (d[1] - padding);
64165             var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
64166             var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
64167             z = z - Math.max(hZoomDiff, vZoomDiff);
64168             projection.scale(geoZoomToScale(z));
64169         }
64170
64171         var padTop = 35;   // reserve top space for hint text
64172         var extentCenter = projection(extent.center());
64173         extentCenter[1] = extentCenter[1] - padTop;
64174
64175         projection
64176             .translate(geoVecSubtract(c, extentCenter))
64177             .clipExtent([[0, 0], d]);
64178
64179         var drawLayers = svgLayers(projection, context).only('osm').dimensions(d);
64180         var drawVertices = svgVertices$$1(projection, context);
64181         var drawLines = svgLines$$1(projection, context);
64182         var drawTurns = svgTurns(projection, context);
64183
64184         var firstTime = selection$$1.selectAll('.surface').empty();
64185
64186         selection$$1
64187             .call(drawLayers);
64188
64189         var surface = selection$$1.selectAll('.surface')
64190             .classed('tr', true);
64191
64192         if (firstTime) {
64193             _initialized = true;
64194
64195             surface
64196                 .call(breathe);
64197
64198             d3_select(window)
64199                 .on('resize.restrictions', function() {
64200                     utilSetDimensions(_container, null);
64201                     redraw();
64202                 });
64203         }
64204
64205
64206         // This can happen if we've lowered the detail while a FROM way
64207         // is selected, and that way is no longer part of the intersection.
64208         if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
64209             _fromWayID = null;
64210             _oldTurns = null;
64211         }
64212
64213         surface
64214             .call(utilSetDimensions, d)
64215             .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z)
64216             .call(drawLines, vgraph, _intersection.ways, filter)
64217             .call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay));
64218
64219         surface
64220             .on('click.restrictions', click)
64221             .on('mouseover.restrictions', mouseover);
64222
64223         surface
64224             .selectAll('.selected')
64225             .classed('selected', false);
64226
64227         surface
64228             .selectAll('.related')
64229             .classed('related', false);
64230
64231         if (_fromWayID) {
64232             var way = vgraph.entity(_fromWayID);
64233             surface
64234                 .selectAll('.' + _fromWayID)
64235                 .classed('selected', true)
64236                 .classed('related', true);
64237         }
64238
64239         updateHints(null);
64240
64241
64242         function click() {
64243             surface
64244                 .call(breathe.off)
64245                 .call(breathe);
64246
64247             var datum = event.target.__data__;
64248             var entity = datum && datum.properties && datum.properties.entity;
64249             if (entity) {
64250                 datum = entity;
64251             }
64252
64253             if (datum instanceof osmWay && (datum.__from || datum.__via)) {
64254                 _fromWayID = datum.id;
64255                 _oldTurns = null;
64256                 redraw();
64257
64258             } else if (datum instanceof osmTurn) {
64259                 var actions, extraActions, turns, i;
64260                 var restrictionType = osmInferRestriction(vgraph, datum, projection);
64261
64262                 if (datum.restrictionID && !datum.direct) {
64263                     return;
64264
64265                 } else if (datum.restrictionID && !datum.only) {    // NO -> ONLY
64266                     var datumOnly = cloneDeep(datum);
64267                     datumOnly.only = true;
64268                     restrictionType = restrictionType.replace(/^no/, 'only');
64269
64270                     // Adding an ONLY restriction should destroy all other direct restrictions from the FROM.
64271                     // We will remember them in _oldTurns, and restore them if the user clicks again.
64272                     turns = _intersection.turns(_fromWayID, 2);
64273                     extraActions = [];
64274                     _oldTurns = [];
64275                     for (i = 0; i < turns.length; i++) {
64276                         if (turns[i].direct) {
64277                             turns[i].restrictionType = osmInferRestriction(vgraph, turns[i], projection);
64278                             _oldTurns.push(turns[i]);
64279                             extraActions.push(actionUnrestrictTurn(turns[i]));
64280                         }
64281                     }
64282
64283                     actions = _intersection.actions.concat(extraActions, [
64284                         actionRestrictTurn(datumOnly, restrictionType),
64285                         t('operations.restriction.annotation.create')
64286                     ]);
64287
64288                 } else if (datum.restrictionID) {   // ONLY -> Allowed
64289                     // Restore whatever restrictions we might have destroyed by cycling thru the ONLY state.
64290                     // This relies on the assumption that the intersection was already split up when we
64291                     // performed the previous action (NO -> ONLY), so the IDs in _oldTurns shouldn't have changed.
64292                     turns = _oldTurns || [];
64293                     extraActions = [];
64294                     for (i = 0; i < turns.length; i++) {
64295                         if (turns[i].key !== datum.key) {
64296                             extraActions.push(actionRestrictTurn(turns[i], turns[i].restrictionType));
64297                         }
64298                     }
64299                     _oldTurns = null;
64300
64301                     actions = _intersection.actions.concat(extraActions, [
64302                         actionUnrestrictTurn(datum),
64303                         t('operations.restriction.annotation.delete')
64304                     ]);
64305
64306                 } else {    // Allowed -> NO
64307                     actions = _intersection.actions.concat([
64308                         actionRestrictTurn(datum, restrictionType),
64309                         t('operations.restriction.annotation.create')
64310                     ]);
64311                 }
64312
64313                 context.perform.apply(context, actions);
64314
64315                 // At this point the datum will be changed, but will have same key..
64316                 // Refresh it and update the help..
64317                 var s = surface.selectAll('.' + datum.key);
64318                 datum = s.empty() ? null : s.datum();
64319                 updateHints(datum);
64320
64321             } else {
64322                 _fromWayID = null;
64323                 _oldTurns = null;
64324                 redraw();
64325             }
64326         }
64327
64328
64329         function mouseover() {
64330             var datum = event.target.__data__;
64331             updateHints(datum);
64332         }
64333
64334
64335         function redraw() {
64336             if (context.hasEntity(_vertexID)) {
64337                 _container.call(renderViewer);
64338             }
64339         }
64340
64341
64342         function highlightPathsFrom(wayID) {
64343             surface.selectAll('.related')
64344                 .classed('related', false)
64345                 .classed('allow', false)
64346                 .classed('restrict', false)
64347                 .classed('only', false);
64348
64349             surface.selectAll('.' + wayID)
64350                 .classed('related', true);
64351
64352             if (wayID) {
64353                 var turns = _intersection.turns(wayID, _maxViaWay);
64354                 for (var i = 0; i < turns.length; i++) {
64355                     var turn = turns[i];
64356                     var ids = [turn.to.way];
64357                     var klass = (turn.no ? 'restrict' : (turn.only ? 'only' : 'allow'));
64358
64359                     if (turn.only || turns.length === 1) {
64360                         if (turn.via.ways) {
64361                             ids = ids.concat(turn.via.ways);
64362                         }
64363                     } else if (turn.to.way === wayID) {
64364                         continue;
64365                     }
64366
64367                     surface.selectAll(utilEntitySelector(ids))
64368                         .classed('related', true)
64369                         .classed('allow', (klass === 'allow'))
64370                         .classed('restrict', (klass === 'restrict'))
64371                         .classed('only', (klass === 'only'));
64372                 }
64373             }
64374         }
64375
64376
64377         function updateHints(datum) {
64378             var help = _container.selectAll('.restriction-help').html('');
64379
64380             var placeholders = {};
64381             ['from', 'via', 'to'].forEach(function(k) {
64382                 placeholders[k] = '<span class="qualifier">' + t('restriction.help.' + k) + '</span>';
64383             });
64384
64385             var entity = datum && datum.properties && datum.properties.entity;
64386             if (entity) {
64387                 datum = entity;
64388             }
64389
64390             if (_fromWayID) {
64391                 way = vgraph.entity(_fromWayID);
64392                 surface
64393                     .selectAll('.' + _fromWayID)
64394                     .classed('selected', true)
64395                     .classed('related', true);
64396             }
64397
64398             // Hovering a way
64399             if (datum instanceof osmWay && datum.__from) {
64400                 way = datum;
64401
64402                 highlightPathsFrom(_fromWayID ? null : way.id);
64403                 surface.selectAll('.' + way.id)
64404                     .classed('related', true);
64405
64406                 var clickSelect = (!_fromWayID || _fromWayID !== way.id);
64407                 help
64408                     .append('div')      // "Click to select FROM {fromName}." / "FROM {fromName}"
64409                     .html(t('restriction.help.' + (clickSelect ? 'select_from_name' : 'from_name'), {
64410                         from: placeholders.from,
64411                         fromName: displayName(way.id, vgraph)
64412                     }));
64413
64414
64415             // Hovering a turn arrow
64416             } else if (datum instanceof osmTurn) {
64417                 var restrictionType = osmInferRestriction(vgraph, datum, projection);
64418                 var turnType = restrictionType.replace(/^(only|no)\_/, '');
64419                 var indirect = (datum.direct === false ? t('restriction.help.indirect') : '');
64420                 var klass, turnText, nextText;
64421
64422                 if (datum.no) {
64423                     klass = 'restrict';
64424                     turnText = t('restriction.help.turn.no_' + turnType, { indirect: indirect });
64425                     nextText = t('restriction.help.turn.only_' + turnType, { indirect: '' });
64426                 } else if (datum.only) {
64427                     klass = 'only';
64428                     turnText = t('restriction.help.turn.only_' + turnType, { indirect: indirect });
64429                     nextText = t('restriction.help.turn.allowed_' + turnType, { indirect: '' });
64430                 } else {
64431                     klass = 'allow';
64432                     turnText = t('restriction.help.turn.allowed_' + turnType, { indirect: indirect });
64433                     nextText = t('restriction.help.turn.no_' + turnType, { indirect: '' });
64434                 }
64435
64436                 help
64437                     .append('div')      // "NO Right Turn (indirect)"
64438                     .attr('class', 'qualifier ' + klass)
64439                     .text(turnText);
64440
64441                 help
64442                     .append('div')      // "FROM {fromName} TO {toName}"
64443                     .html(t('restriction.help.from_name_to_name', {
64444                         from: placeholders.from,
64445                         fromName: displayName(datum.from.way, vgraph),
64446                         to: placeholders.to,
64447                         toName: displayName(datum.to.way, vgraph)
64448                     }));
64449
64450                 if (datum.via.ways && datum.via.ways.length) {
64451                     var names = [];
64452                     for (var i = 0; i < datum.via.ways.length; i++) {
64453                         var prev = names[names.length - 1];
64454                         var curr = displayName(datum.via.ways[i], vgraph);
64455                         if (!prev || curr !== prev)   // collapse identical names
64456                             names.push(curr);
64457                     }
64458
64459                     help
64460                         .append('div')      // "VIA {viaNames}"
64461                         .html(t('restriction.help.via_names', {
64462                             via: placeholders.via,
64463                             viaNames: names.join(', ')
64464                         }));
64465                 }
64466
64467                 if (!indirect) {
64468                     help
64469                         .append('div')      // Click for "No Right Turn"
64470                         .text(t('restriction.help.toggle', { turn: nextText.trim() }));
64471                 }
64472
64473                 highlightPathsFrom(null);
64474                 var alongIDs = datum.path.slice();
64475                 surface.selectAll(utilEntitySelector(alongIDs))
64476                     .classed('related', true)
64477                     .classed('allow', (klass === 'allow'))
64478                     .classed('restrict', (klass === 'restrict'))
64479                     .classed('only', (klass === 'only'));
64480
64481
64482             // Hovering empty surface
64483             } else {
64484                 highlightPathsFrom(null);
64485                 if (_fromWayID) {
64486                     help
64487                         .append('div')      // "FROM {fromName}"
64488                         .html(t('restriction.help.from_name', {
64489                             from: placeholders.from,
64490                             fromName: displayName(_fromWayID, vgraph)
64491                         }));
64492
64493                 } else {
64494                     help
64495                         .append('div')      // "Click to select a FROM segment."
64496                         .html(t('restriction.help.select_from', {
64497                             from: placeholders.from
64498                         }));
64499                 }
64500             }
64501         }
64502     }
64503
64504
64505     function displayMaxDistance(maxDist) {
64506         var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
64507         var opts;
64508
64509         if (isImperial) {
64510             var distToFeet = {   // imprecise conversion for prettier display
64511                 20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160
64512             }[maxDist];
64513             opts = { distance: t('units.feet', { quantity: distToFeet }) };
64514         } else {
64515             opts = { distance: t('units.meters', { quantity: maxDist }) };
64516         }
64517
64518         return t('restriction.controls.distance_up_to', opts);
64519     }
64520
64521
64522     function displayMaxVia(maxVia) {
64523         return maxVia === 0 ? t('restriction.controls.via_node_only')
64524             : maxVia === 1 ? t('restriction.controls.via_up_to_one')
64525             : t('restriction.controls.via_up_to_two');
64526     }
64527
64528
64529     function displayName(entityID, graph) {
64530         var entity = graph.entity(entityID);
64531         var name = utilDisplayName(entity) || '';
64532         var matched = context.presets().match(entity, graph);
64533         var type = (matched && matched.name()) || utilDisplayType(entity.id);
64534         return name || type;
64535     }
64536
64537
64538     restrictions.entity = function(_) {
64539         _intersection = null;
64540         _fromWayID = null;
64541         _oldTurns = null;
64542         _vertexID = _.id;
64543     };
64544
64545
64546     restrictions.tags = function() {};
64547     restrictions.focus = function() {};
64548
64549
64550     restrictions.off = function(selection$$1) {
64551         if (!_initialized) return;
64552
64553         selection$$1.selectAll('.surface')
64554             .call(breathe.off)
64555             .on('click.restrictions', null)
64556             .on('mouseover.restrictions', null);
64557
64558         d3_select(window)
64559             .on('resize.restrictions', null);
64560     };
64561
64562
64563     return utilRebind(restrictions, dispatch$$1, 'on');
64564 }
64565
64566 function uiFieldTextarea(field) {
64567     var dispatch$$1 = dispatch('change'),
64568         input = d3_select(null);
64569
64570
64571     function textarea(selection$$1) {
64572         input = selection$$1.selectAll('textarea')
64573             .data([0]);
64574
64575         input = input.enter()
64576             .append('textarea')
64577             .attr('id', 'preset-input-' + field.id)
64578             .attr('placeholder', field.placeholder() || t('inspector.unknown'))
64579             .attr('maxlength', 255)
64580             .call(utilNoAuto)
64581             .on('input', change(true))
64582             .on('blur', change())
64583             .on('change', change())
64584             .merge(input);
64585     }
64586
64587
64588     function change(onInput) {
64589         return function() {
64590             var t$$1 = {};
64591             t$$1[field.key] = utilGetSetValue(input) || undefined;
64592             dispatch$$1.call('change', this, t$$1, onInput);
64593         };
64594     }
64595
64596
64597     textarea.tags = function(tags) {
64598         utilGetSetValue(input, tags[field.key] || '');
64599     };
64600
64601
64602     textarea.focus = function() {
64603         input.node().focus();
64604     };
64605
64606
64607     return utilRebind(textarea, dispatch$$1, 'on');
64608 }
64609
64610 function uiFieldWikipedia(field, context) {
64611     var dispatch$$1 = dispatch('change'),
64612         wikipedia = services.wikipedia,
64613         wikidata = services.wikidata,
64614         link = d3_select(null),
64615         lang = d3_select(null),
64616         title = d3_select(null),
64617         wikiURL = '',
64618         entity;
64619
64620
64621     function wiki(selection$$1) {
64622         var langcombo = d3combobox()
64623             .container(context.container())
64624             .fetcher(function(value, cb) {
64625                 var v = value.toLowerCase();
64626
64627                 cb(wikipedia$2.filter(function(d) {
64628                     return d[0].toLowerCase().indexOf(v) >= 0 ||
64629                         d[1].toLowerCase().indexOf(v) >= 0 ||
64630                         d[2].toLowerCase().indexOf(v) >= 0;
64631                 }).map(function(d) {
64632                     return { value: d[1] };
64633                 }));
64634             });
64635
64636         var titlecombo = d3combobox()
64637             .container(context.container())
64638             .fetcher(function(value, cb) {
64639                 if (!value) {
64640                     value = context.entity(entity.id).tags.name || '';
64641                 }
64642
64643                 var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
64644                 searchfn(language()[2], value, function(query, data$$1) {
64645                     cb(data$$1.map(function(d) {
64646                         return { value: d };
64647                     }));
64648                 });
64649             });
64650
64651
64652         lang = selection$$1.selectAll('input.wiki-lang')
64653             .data([0]);
64654
64655         lang = lang.enter()
64656             .append('input')
64657             .attr('type', 'text')
64658             .attr('class', 'wiki-lang')
64659             .attr('placeholder', t('translate.localized_translation_language'))
64660             .call(utilNoAuto)
64661             .merge(lang);
64662
64663         utilGetSetValue(lang, language()[1]);
64664
64665         lang
64666             .call(langcombo)
64667             .on('blur', changeLang)
64668             .on('change', changeLang);
64669
64670
64671         title = selection$$1.selectAll('input.wiki-title')
64672             .data([0]);
64673
64674         title = title.enter()
64675             .append('input')
64676             .attr('type', 'text')
64677             .attr('class', 'wiki-title')
64678             .attr('id', 'preset-input-' + field.id)
64679             .call(utilNoAuto)
64680             .merge(title);
64681
64682         title
64683             .call(titlecombo)
64684             .on('blur', blur)
64685             .on('change', change);
64686
64687
64688         link = selection$$1.selectAll('.wiki-link')
64689             .data([0]);
64690
64691         link = link.enter()
64692             .append('button')
64693             .attr('class', 'button-input-action wiki-link minor')
64694             .attr('tabindex', -1)
64695             .call(svgIcon('#icon-out-link'))
64696             .merge(link);
64697
64698         link
64699             .on('click', function() {
64700                 event.preventDefault();
64701                 if (wikiURL) window.open(wikiURL, '_blank');
64702             });
64703     }
64704
64705
64706     function language() {
64707         var value = utilGetSetValue(lang).toLowerCase();
64708         var locale = utilDetect().locale.toLowerCase();
64709         var localeLanguage;
64710         return find$1(wikipedia$2, function(d) {
64711             if (d[2] === locale) localeLanguage = d;
64712             return d[0].toLowerCase() === value ||
64713                 d[1].toLowerCase() === value ||
64714                 d[2] === value;
64715         }) || localeLanguage || ['English', 'English', 'en'];
64716     }
64717
64718
64719     function changeLang() {
64720         utilGetSetValue(lang, language()[1]);
64721         change(true);
64722     }
64723
64724
64725     function blur() {
64726         change(true);
64727     }
64728
64729
64730     function change(skipWikidata) {
64731         var value = utilGetSetValue(title),
64732             m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/),
64733             l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; }),
64734             syncTags = {};
64735
64736         if (l) {
64737             // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
64738             value = decodeURIComponent(m[2]).replace(/_/g, ' ');
64739             if (m[3]) {
64740                 var anchor;
64741                 try {
64742                     // Best-effort `anchordecode:` implementation
64743                     anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
64744                 } catch (e) {
64745                     anchor = decodeURIComponent(m[3]);
64746                 }
64747                 value += '#' + anchor.replace(/_/g, ' ');
64748             }
64749             value = value.slice(0, 1).toUpperCase() + value.slice(1);
64750             utilGetSetValue(lang, l[1]);
64751             utilGetSetValue(title, value);
64752         }
64753
64754         if (value) {
64755             syncTags.wikipedia = language()[2] + ':' + value;
64756         } else {
64757             syncTags.wikipedia = undefined;
64758             syncTags.wikidata = undefined;
64759         }
64760
64761         dispatch$$1.call('change', this, syncTags);
64762
64763
64764         if (skipWikidata || !value || !language()[2]) return;
64765
64766         // attempt asynchronous update of wikidata tag..
64767         var initGraph = context.graph(),
64768             initEntityId = entity.id;
64769
64770         wikidata.itemsByTitle(language()[2], value, function(title, data$$1) {
64771             // If graph has changed, we can't apply this update.
64772             if (context.graph() !== initGraph) return;
64773
64774             if (!data$$1 || !Object.keys(data$$1).length) return;
64775
64776             var qids = Object.keys(data$$1);
64777             var value = qids && find$1(qids, function(id) { return id.match(/^Q\d+$/); });
64778             var currTags = clone(context.entity(initEntityId).tags);
64779
64780             currTags.wikidata = value;
64781
64782             // Coalesce the update of wikidata tag into the previous tag change
64783             context.overwrite(
64784                 actionChangeTags(initEntityId, currTags),
64785                 context.history().undoAnnotation()
64786             );
64787
64788             // do not dispatch.call('change') here, because entity_editor
64789             // changeTags() is not intended to be called asynchronously
64790         });
64791     }
64792
64793
64794     wiki.tags = function(tags) {
64795         var value = tags[field.key] || '',
64796             m = value.match(/([^:]+):([^#]+)(?:#(.+))?/),
64797             l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; }),
64798             anchor = m && m[3];
64799
64800         // value in correct format
64801         if (l) {
64802             utilGetSetValue(lang, l[1]);
64803             utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
64804             if (anchor) {
64805                 try {
64806                     // Best-effort `anchorencode:` implementation
64807                     anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
64808                 } catch (e) {
64809                     anchor = anchor.replace(/ /g, '_');
64810                 }
64811             }
64812             wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
64813                 m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
64814
64815         // unrecognized value format
64816         } else {
64817             utilGetSetValue(title, value);
64818             if (value && value !== '') {
64819                 utilGetSetValue(lang, '');
64820                 wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
64821             } else {
64822                 wikiURL = '';
64823             }
64824         }
64825     };
64826
64827
64828     wiki.entity = function(_) {
64829         if (!arguments.length) return entity;
64830         entity = _;
64831         return wiki;
64832     };
64833
64834
64835     wiki.focus = function() {
64836         title.node().focus();
64837     };
64838
64839
64840     return utilRebind(wiki, dispatch$$1, 'on');
64841 }
64842
64843 var uiFields = {
64844     access: uiFieldAccess,
64845     address: uiFieldAddress,
64846     check: uiFieldCheck,
64847     combo: uiFieldCombo,
64848     cycleway: uiFieldCycleway,
64849     defaultCheck: uiFieldCheck,
64850     email: uiFieldText,
64851     lanes: uiFieldLanes,
64852     localized: uiFieldLocalized,
64853     maxspeed: uiFieldMaxspeed,
64854     multiCombo: uiFieldCombo,
64855     networkCombo: uiFieldCombo,
64856     number: uiFieldText,
64857     onewayCheck: uiFieldCheck,
64858     radio: uiFieldRadio,
64859     restrictions: uiFieldRestrictions,
64860     semiCombo: uiFieldCombo,
64861     structureRadio: uiFieldRadio,
64862     tel: uiFieldText,
64863     text: uiFieldText,
64864     textarea: uiFieldTextarea,
64865     typeCombo: uiFieldCombo,
64866     url: uiFieldText,
64867     wikipedia: uiFieldWikipedia
64868 };
64869
64870 function uiField(context, presetField, entity, options) {
64871     options = assignIn({
64872         show: true,
64873         wrap: true,
64874         remove: true,
64875         revert: true,
64876         info: true
64877     }, options);
64878
64879     var dispatch$$1 = dispatch('change');
64880     var field = clone(presetField);
64881     var _show = options.show;
64882     var _state = '';
64883     var _tags = {};
64884
64885
64886     field.impl = uiFields[field.type](field, context)
64887         .on('change', function(t$$1, onInput) {
64888             dispatch$$1.call('change', field, t$$1, onInput);
64889         });
64890
64891     if (entity && field.impl.entity) {
64892         field.impl.entity(entity);
64893     }
64894
64895     field.keys = field.keys || [field.key];
64896
64897
64898     function isModified() {
64899         if (!entity) return false;
64900         var original = context.graph().base().entities[entity.id];
64901         return some(field.keys, function(key) {
64902             return original ? _tags[key] !== original.tags[key] : _tags[key];
64903         });
64904     }
64905
64906
64907     function isPresent() {
64908         return some(field.keys, function(key) {
64909             return _tags[key];
64910         });
64911     }
64912
64913
64914     function revert(d) {
64915         event.stopPropagation();
64916         event.preventDefault();
64917         if (!entity) return false;
64918
64919         var original = context.graph().base().entities[entity.id];
64920         var t$$1 = {};
64921         d.keys.forEach(function(key) {
64922             t$$1[key] = original ? original.tags[key] : undefined;
64923         });
64924
64925         dispatch$$1.call('change', d, t$$1);
64926     }
64927
64928
64929     function remove(d) {
64930         event.stopPropagation();
64931         event.preventDefault();
64932
64933         var t$$1 = {};
64934         d.keys.forEach(function(key) {
64935             t$$1[key] = undefined;
64936         });
64937
64938         dispatch$$1.call('change', d, t$$1);
64939     }
64940
64941
64942     field.render = function(selection$$1) {
64943         var container = selection$$1.selectAll('.form-field')
64944             .data([field]);
64945
64946         // Enter
64947         var enter = container.enter()
64948             .append('div')
64949             .attr('class', function(d) { return 'form-field form-field-' + d.id; })
64950             .classed('nowrap', !options.wrap);
64951
64952         if (options.wrap) {
64953             var label = enter
64954                 .append('label')
64955                 .attr('class', 'form-label')
64956                 .attr('for', function(d) { return 'preset-input-' + d.id; })
64957                 .text(function(d) { return d.label(); });
64958
64959             var wrap = label
64960                 .append('div')
64961                 .attr('class', 'form-label-button-wrap');
64962
64963             if (options.remove) {
64964                 wrap
64965                     .append('button')
64966                     .attr('class', 'remove-icon')
64967                     .attr('tabindex', -1)
64968                     .call(svgIcon('#operation-delete'));
64969             }
64970
64971             if (options.revert) {
64972                 wrap
64973                     .append('button')
64974                     .attr('class', 'modified-icon')
64975                     .attr('tabindex', -1)
64976                     .call(
64977                         (textDirection === 'rtl') ? svgIcon('#icon-redo') : svgIcon('#icon-undo')
64978                     );
64979             }
64980         }
64981
64982
64983         // Update
64984         container = container
64985             .merge(enter);
64986
64987         container.selectAll('.form-label-button-wrap .remove-icon')
64988             .on('click', remove);
64989
64990         container.selectAll('.form-label-button-wrap .modified-icon')
64991             .on('click', revert);
64992
64993         container
64994             .classed('modified', isModified())
64995             .classed('present', isPresent())
64996             .each(function(d) {
64997                 var reference, help;
64998
64999                 // instantiate field help
65000                 if (options.wrap && field.type === 'restrictions') {
65001                     help = uiFieldHelp(context, 'restrictions');
65002                 }
65003
65004                 // instantiate tag reference
65005                 if (options.wrap && options.info) {
65006                     var referenceKey = d.key;
65007                     if (d.type === 'multiCombo') {   // lookup key without the trailing ':'
65008                         referenceKey = referenceKey.replace(/:$/, '');
65009                     }
65010
65011                     reference = uiTagReference(d.reference || { key: referenceKey }, context);
65012                     if (_state === 'hover') {
65013                         reference.showing(false);
65014                     }
65015                 }
65016
65017                 d3_select(this)
65018                     .call(d.impl);
65019
65020                 // add field help components
65021                 if (help) {
65022                     d3_select(this)
65023                         .call(help.body)
65024                         .select('.form-label-button-wrap')
65025                         .call(help.button);
65026                 }
65027
65028                 // add tag reference components
65029                 if (reference) {
65030                     d3_select(this)
65031                         .call(reference.body)
65032                         .select('.form-label-button-wrap')
65033                         .call(reference.button);
65034                 }
65035
65036                 d.impl.tags(_tags);
65037             });
65038     };
65039
65040
65041     field.state = function(_) {
65042         if (!arguments.length) return _state;
65043         _state = _;
65044         return field;
65045     };
65046
65047
65048     field.tags = function(_) {
65049         if (!arguments.length) return _tags;
65050         _tags = _;
65051         return field;
65052     };
65053
65054
65055     field.show = function() {
65056         _show = true;
65057         if (field.default && field.key && _tags[field.key] !== field.default) {
65058             var t$$1 = {};
65059             t$$1[field.key] = field.default;
65060             dispatch$$1.call('change', this, t$$1);
65061         }
65062     };
65063
65064
65065     field.isShown = function() {
65066         return _show || some(field.keys, function(key) { return !!_tags[key]; });
65067     };
65068
65069
65070     field.focus = function() {
65071         field.impl.focus();
65072     };
65073
65074
65075     return utilRebind(field, dispatch$$1, 'on');
65076 }
65077
65078 function uiFormFields(context) {
65079     var fieldsArr;
65080
65081
65082     function formFields(selection$$1, klass) {
65083         render(selection$$1, klass);
65084     }
65085
65086
65087     function render(selection$$1, klass) {
65088
65089         var shown = fieldsArr.filter(function(field) { return field.isShown(); }),
65090             notShown = fieldsArr.filter(function(field) { return !field.isShown(); });
65091
65092         var container = selection$$1.selectAll('.form-fields-container')
65093             .data([0]);
65094
65095         container = container.enter()
65096             .append('div')
65097             .attr('class', 'form-fields-container ' + (klass || ''))
65098             .merge(container);
65099
65100
65101         var fields = container.selectAll('.wrap-form-field')
65102             .data(shown, function(d) { return d.id; });
65103
65104         fields.exit()
65105             .remove();
65106
65107         // Enter
65108         var enter = fields.enter()
65109             .append('div')
65110             .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.id; });
65111
65112         // Update
65113         fields = fields
65114             .merge(enter);
65115
65116         fields
65117             .order()
65118             .each(function(d) {
65119                 d3_select(this)
65120                     .call(d.render);
65121             });
65122
65123
65124         notShown = notShown.map(function(field) {
65125             return {
65126                 title: field.label(),
65127                 value: field.label(),
65128                 field: field
65129             };
65130         });
65131
65132
65133         var more = selection$$1.selectAll('.more-fields')
65134             .data((notShown.length > 0) ? [0] : []);
65135
65136         more.exit()
65137             .remove();
65138
65139         more = more.enter()
65140             .append('div')
65141             .attr('class', 'more-fields')
65142             .append('label')
65143             .text(t('inspector.add_fields'))
65144             .merge(more);
65145
65146
65147         var input = more.selectAll('.value')
65148             .data([0]);
65149
65150         input.exit()
65151             .remove();
65152
65153         input = input.enter()
65154             .append('input')
65155             .attr('class', 'value')
65156             .attr('type', 'text')
65157             .call(utilNoAuto)
65158             .merge(input);
65159
65160         input
65161             .call(utilGetSetValue, '')
65162             .attr('placeholder', function() {
65163                 var placeholder = [];
65164                 for (var field in notShown) {
65165                     placeholder.push(notShown[field].title);
65166                 }
65167                 return placeholder.slice(0,3).join(', ') + ((placeholder.length > 3) ? '…' : '');
65168             })
65169             .call(d3combobox()
65170                 .container(context.container())
65171                 .data(notShown)
65172                 .minItems(1)
65173                 .on('accept', function (d) {
65174                     var field = d.field;
65175                     field.show();
65176                     render(selection$$1);
65177                     if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
65178                         field.focus();
65179                     }
65180                 })
65181             );
65182     }
65183
65184
65185     formFields.fieldsArr = function(_) {
65186         if (!arguments.length) return fieldsArr;
65187         fieldsArr = _;
65188         return formFields;
65189     };
65190
65191
65192     return formFields;
65193 }
65194
65195 function uiPresetEditor(context) {
65196     var dispatch$$1 = dispatch('change'),
65197         formFields = uiFormFields(context),
65198         state,
65199         fieldsArr,
65200         preset,
65201         tags,
65202         entityId;
65203
65204
65205     function presetEditor(selection$$1) {
65206         selection$$1.call(uiDisclosure(context, 'preset_fields', true)
65207             .title(t('inspector.all_fields'))
65208             .content(render)
65209         );
65210     }
65211
65212
65213     function render(selection$$1) {
65214         if (!fieldsArr) {
65215             var entity = context.entity(entityId),
65216                 geometry = context.geometry(entityId),
65217                 presets = context.presets();
65218
65219             fieldsArr = [];
65220
65221             preset.fields.forEach(function(field) {
65222                 if (field.matchGeometry(geometry)) {
65223                     fieldsArr.push(
65224                         uiField(context, field, entity)
65225                     );
65226                 }
65227             });
65228
65229             if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
65230                 fieldsArr.push(
65231                     uiField(context, presets.field('restrictions'), entity)
65232                 );
65233             }
65234
65235             presets.universal().forEach(function(field) {
65236                 if (preset.fields.indexOf(field) === -1) {
65237                     fieldsArr.push(
65238                         uiField(context, field, entity, { show: false })
65239                     );
65240                 }
65241             });
65242
65243             fieldsArr.forEach(function(field) {
65244                 field
65245                     .on('change', function(t$$1, onInput) {
65246                         dispatch$$1.call('change', field, t$$1, onInput);
65247                     });
65248             });
65249         }
65250
65251         fieldsArr.forEach(function(field) {
65252             field
65253                 .state(state)
65254                 .tags(tags);
65255         });
65256
65257
65258         selection$$1
65259             .call(formFields.fieldsArr(fieldsArr), 'inspector-inner fillL3');
65260
65261
65262         selection$$1.selectAll('.wrap-form-field input')
65263             .on('keydown', function() {
65264                 // if user presses enter, and combobox is not active, accept edits..
65265                 if (event.keyCode === 13 && d3_select('.combobox').empty()) {
65266                     context.enter(modeBrowse(context));
65267                 }
65268             });
65269     }
65270
65271
65272     presetEditor.preset = function(_) {
65273         if (!arguments.length) return preset;
65274         if (preset && preset.id === _.id) return presetEditor;
65275         preset = _;
65276         fieldsArr = null;
65277         return presetEditor;
65278     };
65279
65280
65281     presetEditor.state = function(_) {
65282         if (!arguments.length) return state;
65283         state = _;
65284         return presetEditor;
65285     };
65286
65287
65288     presetEditor.tags = function(_) {
65289         if (!arguments.length) return tags;
65290         tags = _;
65291         // Don't reset fieldsArr here.
65292         return presetEditor;
65293     };
65294
65295
65296     presetEditor.entityID = function(_) {
65297         if (!arguments.length) return entityId;
65298         if (entityId === _) return presetEditor;
65299         entityId = _;
65300         fieldsArr = null;
65301         return presetEditor;
65302     };
65303
65304
65305     return utilRebind(presetEditor, dispatch$$1, 'on');
65306 }
65307
65308 function uiEntityEditor(context) {
65309     var dispatch$$1 = dispatch('choose'),
65310         state = 'select',
65311         coalesceChanges = false,
65312         modified = false,
65313         base,
65314         entityId,
65315         activePreset,
65316         reference;
65317
65318     var presetEditor = uiPresetEditor(context)
65319         .on('change', changeTags);
65320     var rawTagEditor = uiRawTagEditor(context)
65321         .on('change', changeTags);
65322
65323
65324     function entityEditor(selection$$1) {
65325         var entity = context.entity(entityId),
65326             tags = clone(entity.tags);
65327
65328         // Header
65329         var header = selection$$1.selectAll('.header')
65330             .data([0]);
65331
65332         // Enter
65333         var enter = header.enter()
65334             .append('div')
65335             .attr('class', 'header fillL cf');
65336
65337         enter
65338             .append('button')
65339             .attr('class', 'fl preset-reset preset-choose')
65340             .call(svgIcon((textDirection === 'rtl') ? '#icon-forward' : '#icon-backward'));
65341
65342         enter
65343             .append('button')
65344             .attr('class', 'fr preset-close')
65345             .on('click', function() { context.enter(modeBrowse(context)); })
65346             .call(svgIcon(modified ? '#icon-apply' : '#icon-close'));
65347
65348         enter
65349             .append('h3')
65350             .text(t('inspector.edit'));
65351
65352         // Update
65353         header = header
65354             .merge(enter);
65355
65356         header.selectAll('.preset-reset')
65357             .on('click', function() {
65358                 dispatch$$1.call('choose', this, activePreset);
65359             });
65360
65361
65362         // Body
65363         var body = selection$$1.selectAll('.inspector-body')
65364             .data([0]);
65365
65366         // Enter
65367         enter = body.enter()
65368             .append('div')
65369             .attr('class', 'inspector-body');
65370
65371         enter
65372             .append('div')
65373             .attr('class', 'preset-list-item inspector-inner')
65374             .append('div')
65375             .attr('class', 'preset-list-button-wrap')
65376             .append('button')
65377             .attr('class', 'preset-list-button preset-reset')
65378             .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
65379             .append('div')
65380             .attr('class', 'label');
65381
65382         enter
65383             .append('div')
65384             .attr('class', 'inspector-border preset-editor');
65385
65386         enter
65387             .append('div')
65388             .attr('class', 'inspector-border raw-tag-editor inspector-inner');
65389
65390         enter
65391             .append('div')
65392             .attr('class', 'inspector-border raw-member-editor inspector-inner');
65393
65394         enter
65395             .append('div')
65396             .attr('class', 'raw-membership-editor inspector-inner');
65397
65398         enter
65399             .append('input')
65400             .attr('type', 'text')
65401             .attr('class', 'key-trap');
65402
65403
65404         // Update
65405         body = body
65406             .merge(enter);
65407
65408         body.selectAll('.preset-list-button-wrap')
65409             .call(reference.button);
65410
65411         body.selectAll('.preset-list-item')
65412             .call(reference.body);
65413
65414         body.selectAll('.preset-reset')
65415             .on('click', function() {
65416                 dispatch$$1.call('choose', this, activePreset);
65417             });
65418
65419         body.select('.preset-list-item button')
65420             .call(uiPresetIcon()
65421                 .geometry(context.geometry(entityId))
65422                 .preset(activePreset)
65423             );
65424
65425         body.select('.preset-list-item .label')
65426             .text(activePreset.name());
65427
65428         body.select('.preset-editor')
65429             .call(presetEditor
65430                 .preset(activePreset)
65431                 .entityID(entityId)
65432                 .tags(tags)
65433                 .state(state)
65434             );
65435
65436         body.select('.raw-tag-editor')
65437             .call(rawTagEditor
65438                 .preset(activePreset)
65439                 .entityID(entityId)
65440                 .tags(tags)
65441                 .state(state)
65442             );
65443
65444         if (entity.type === 'relation') {
65445             body.select('.raw-member-editor')
65446                 .style('display', 'block')
65447                 .call(uiRawMemberEditor(context)
65448                     .entityID(entityId)
65449                 );
65450         } else {
65451             body.select('.raw-member-editor')
65452                 .style('display', 'none');
65453         }
65454
65455         body.select('.raw-membership-editor')
65456             .call(uiRawMembershipEditor(context)
65457                 .entityID(entityId)
65458             );
65459
65460         body.select('.key-trap')
65461             .on('keydown.key-trap', function() {
65462                 // On tabbing, send focus back to the first field on the inspector-body
65463                 // (probably the `name` field) #4159
65464                 if (event.keyCode === 9 && !event.shiftKey) {
65465                     event.preventDefault();
65466                     body.select('input').node().focus();
65467                 }
65468             });
65469
65470         context.history()
65471             .on('change.entity-editor', historyChanged);
65472
65473
65474         function historyChanged() {
65475             if (state === 'hide') return;
65476
65477             var entity = context.hasEntity(entityId);
65478             var graph = context.graph();
65479             if (!entity) return;
65480
65481             var match = context.presets().match(entity, graph);
65482             var activePreset = entityEditor.preset();
65483             var weakPreset = activePreset && isEmpty(activePreset.addTags);
65484
65485             // A "weak" preset doesn't set any tags. (e.g. "Address")
65486             // Don't replace a weak preset with a fallback preset (e.g. "Point")
65487             if (!(weakPreset && match.isFallback())) {
65488                 entityEditor.preset(match);
65489             }
65490             entityEditor.modified(base !== graph);
65491             entityEditor(selection$$1);
65492         }
65493     }
65494
65495
65496     function clean(o) {
65497
65498         function cleanVal(k, v) {
65499             function keepSpaces(k) {
65500                 return k.match(/_hours|_times/) !== null;
65501             }
65502
65503             var blacklist = ['description', 'note', 'fixme'];
65504             if (some(blacklist, function(s) { return k.indexOf(s) !== -1; })) return v;
65505
65506             var cleaned = v.split(';')
65507                 .map(function(s) { return s.trim(); })
65508                 .join(keepSpaces(k) ? '; ' : ';');
65509
65510             // The code below is not intended to validate websites and emails.
65511             // It is only intended to prevent obvious copy-paste errors. (#2323)
65512             // clean website- and email-like tags
65513             if (k.indexOf('website') !== -1 ||
65514                 k.indexOf('email') !== -1 ||
65515                 cleaned.indexOf('http') === 0) {
65516                 cleaned = cleaned
65517                     .replace(/[\u200B-\u200F\uFEFF]/g, '');  // strip LRM and other zero width chars
65518
65519             }
65520
65521             return cleaned;
65522         }
65523
65524         var out = {}, k, v;
65525         for (k in o) {
65526             if (k && (v = o[k]) !== undefined) {
65527                 out[k] = cleanVal(k, v);
65528             }
65529         }
65530         return out;
65531     }
65532
65533
65534     // Tag changes that fire on input can all get coalesced into a single
65535     // history operation when the user leaves the field.  #2342
65536     function changeTags(changed, onInput) {
65537         var entity = context.entity(entityId),
65538             annotation = t('operations.change_tags.annotation'),
65539             tags = clone(entity.tags);
65540
65541         forEach(changed, function(v, k) {
65542             if (v !== undefined || tags.hasOwnProperty(k)) {
65543                 tags[k] = v;
65544             }
65545         });
65546
65547         if (!onInput) {
65548             tags = clean(tags);
65549         }
65550
65551         if (!isEqual(entity.tags, tags)) {
65552             if (coalesceChanges) {
65553                 context.overwrite(actionChangeTags(entityId, tags), annotation);
65554             } else {
65555                 context.perform(actionChangeTags(entityId, tags), annotation);
65556                 coalesceChanges = !!onInput;
65557             }
65558         }
65559     }
65560
65561
65562     entityEditor.modified = function(_) {
65563         if (!arguments.length) return modified;
65564         modified = _;
65565         d3_selectAll('button.preset-close use')
65566             .attr('xlink:href', (modified ? '#icon-apply' : '#icon-close'));
65567     };
65568
65569
65570     entityEditor.state = function(_) {
65571         if (!arguments.length) return state;
65572         state = _;
65573         return entityEditor;
65574     };
65575
65576
65577     entityEditor.entityID = function(_) {
65578         if (!arguments.length) return entityId;
65579         entityId = _;
65580         base = context.graph();
65581         entityEditor.preset(context.presets().match(context.entity(entityId), base));
65582         entityEditor.modified(false);
65583         coalesceChanges = false;
65584         return entityEditor;
65585     };
65586
65587
65588     entityEditor.preset = function(_) {
65589         if (!arguments.length) return activePreset;
65590         if (_ !== activePreset) {
65591             activePreset = _;
65592             reference = uiTagReference(activePreset.reference(context.geometry(entityId)), context)
65593                 .showing(false);
65594         }
65595         return entityEditor;
65596     };
65597
65598
65599     return utilRebind(entityEditor, dispatch$$1, 'on');
65600 }
65601
65602 function uiPresetList(context) {
65603     var dispatch$$1 = dispatch('choose'),
65604         id,
65605         currentPreset,
65606         autofocus = false;
65607
65608
65609     function presetList(selection$$1) {
65610         var entity = context.entity(id),
65611             geometry = context.geometry(id);
65612
65613         // Treat entities on addr:interpolation lines as points, not vertices (#3241)
65614         if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
65615             geometry = 'point';
65616         }
65617
65618         var presets = context.presets().matchGeometry(geometry);
65619
65620         selection$$1.html('');
65621
65622         var messagewrap = selection$$1
65623             .append('div')
65624             .attr('class', 'header fillL cf');
65625
65626         var message = messagewrap
65627             .append('h3')
65628             .text(t('inspector.choose'));
65629
65630         if (context.entity(id).isUsed(context.graph())) {
65631             messagewrap
65632                 .append('button')
65633                 .attr('class', 'preset-choose')
65634                 .on('click', function() { dispatch$$1.call('choose', this, currentPreset); })
65635                 .call(svgIcon((textDirection === 'rtl') ? '#icon-backward' : '#icon-forward'));
65636         } else {
65637             messagewrap
65638                 .append('button')
65639                 .attr('class', 'close')
65640                 .on('click', function() {
65641                     context.enter(modeBrowse(context));
65642                 })
65643                 .call(svgIcon('#icon-close'));
65644         }
65645
65646         function keydown() {
65647             // hack to let delete shortcut work when search is autofocused
65648             if (search.property('value').length === 0 &&
65649                 (event.keyCode === d3keybinding.keyCodes['⌫'] ||
65650                  event.keyCode === d3keybinding.keyCodes['⌦'])) {
65651                 event.preventDefault();
65652                 event.stopPropagation();
65653                 operationDelete([id], context)();
65654             } else if (search.property('value').length === 0 &&
65655                 (event.ctrlKey || event.metaKey) &&
65656                 event.keyCode === d3keybinding.keyCodes.z) {
65657                 event.preventDefault();
65658                 event.stopPropagation();
65659                 context.undo();
65660             } else if (!event.ctrlKey && !event.metaKey) {
65661                 d3_select(this).on('keydown', null);
65662             }
65663         }
65664
65665         function keypress() {
65666             // enter
65667             var value = search.property('value');
65668             if (event.keyCode === 13 && value.length) {
65669                 list.selectAll('.preset-list-item:first-child').datum().choose();
65670             }
65671         }
65672
65673         function inputevent() {
65674             var value = search.property('value');
65675             list.classed('filtered', value.length);
65676             if (value.length) {
65677                 var results = presets.search(value, geometry);
65678                 message.text(t('inspector.results', {
65679                     n: results.collection.length,
65680                     search: value
65681                 }));
65682                 list.call(drawList, results);
65683             } else {
65684                 list.call(drawList, context.presets().defaults(geometry, 36));
65685                 message.text(t('inspector.choose'));
65686             }
65687         }
65688
65689         var searchWrap = selection$$1
65690             .append('div')
65691             .attr('class', 'search-header');
65692
65693         var search = searchWrap
65694             .append('input')
65695             .attr('class', 'preset-search-input')
65696             .attr('placeholder', t('inspector.search'))
65697             .attr('type', 'search')
65698             .call(utilNoAuto)
65699             .on('keydown', keydown)
65700             .on('keypress', keypress)
65701             .on('input', inputevent);
65702
65703         searchWrap
65704             .call(svgIcon('#icon-search', 'pre-text'));
65705
65706         if (autofocus) {
65707             search.node().focus();
65708         }
65709
65710         var listWrap = selection$$1
65711             .append('div')
65712             .attr('class', 'inspector-body');
65713
65714         var list = listWrap
65715             .append('div')
65716             .attr('class', 'preset-list fillL cf')
65717             .call(drawList, context.presets().defaults(geometry, 36));
65718     }
65719
65720
65721     function drawList(list, presets) {
65722         var collection = presets.collection.map(function(preset) {
65723             return preset.members ? CategoryItem(preset) : PresetItem(preset);
65724         });
65725
65726         var items = list.selectAll('.preset-list-item')
65727             .data(collection, function(d) { return d.preset.id; });
65728
65729         items.order();
65730
65731         items.exit()
65732             .remove();
65733
65734         items.enter()
65735             .append('div')
65736             .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
65737             .classed('current', function(item) { return item.preset === currentPreset; })
65738             .each(function(item) { d3_select(this).call(item); })
65739             .style('opacity', 0)
65740             .transition()
65741             .style('opacity', 1);
65742     }
65743
65744
65745     function CategoryItem(preset) {
65746         var box, sublist, shown = false;
65747
65748         function item(selection$$1) {
65749             var wrap = selection$$1.append('div')
65750                 .attr('class', 'preset-list-button-wrap category col12');
65751
65752             var button = wrap
65753                 .append('button')
65754                 .attr('class', 'preset-list-button')
65755                 .classed('expanded', false)
65756                 .call(uiPresetIcon()
65757                     .geometry(context.geometry(id))
65758                     .preset(preset))
65759                 .on('click', function() {
65760                     var isExpanded = d3_select(this).classed('expanded');
65761                     var iconName = isExpanded ?
65762                         (textDirection === 'rtl' ? '#icon-backward' : '#icon-forward') : '#icon-down';
65763                     d3_select(this)
65764                         .classed('expanded', !isExpanded);
65765                     d3_select(this).selectAll('div.label svg.icon use')
65766                         .attr('href', iconName);
65767                     item.choose();
65768                 });
65769
65770             var label = button
65771                 .append('div')
65772                 .attr('class', 'label');
65773
65774             label
65775                 .call(svgIcon((textDirection === 'rtl' ? '#icon-backward' : '#icon-forward'), 'inline'))
65776                 .append('span')
65777                 .html(function() { return preset.name() + '&hellip;'; });
65778
65779             box = selection$$1.append('div')
65780                 .attr('class', 'subgrid col12')
65781                 .style('max-height', '0px')
65782                 .style('opacity', 0);
65783
65784             box.append('div')
65785                 .attr('class', 'arrow');
65786
65787             sublist = box.append('div')
65788                 .attr('class', 'preset-list fillL3 cf fl');
65789         }
65790
65791
65792         item.choose = function() {
65793             if (!box || !sublist) return;
65794
65795             if (shown) {
65796                 shown = false;
65797                 box.transition()
65798                     .duration(200)
65799                     .style('opacity', '0')
65800                     .style('max-height', '0px')
65801                     .style('padding-bottom', '0px');
65802             } else {
65803                 shown = true;
65804                 sublist.call(drawList, preset.members);
65805                 box.transition()
65806                     .duration(200)
65807                     .style('opacity', '1')
65808                     .style('max-height', 200 + preset.members.collection.length * 190 + 'px')
65809                     .style('padding-bottom', '20px');
65810             }
65811         };
65812
65813         item.preset = preset;
65814
65815         return item;
65816     }
65817
65818
65819     function PresetItem(preset) {
65820         function item(selection$$1) {
65821             var wrap = selection$$1.append('div')
65822                 .attr('class', 'preset-list-button-wrap col12');
65823
65824             wrap.append('button')
65825                 .attr('class', 'preset-list-button')
65826                 .call(uiPresetIcon()
65827                     .geometry(context.geometry(id))
65828                     .preset(preset))
65829                 .on('click', item.choose)
65830                 .append('div')
65831                 .attr('class', 'label')
65832                 .text(preset.name());
65833
65834             wrap.call(item.reference.button);
65835             selection$$1.call(item.reference.body);
65836         }
65837
65838         item.choose = function() {
65839             context.presets().choose(preset);
65840
65841             context.perform(
65842                 actionChangePreset(id, currentPreset, preset),
65843                 t('operations.change_tags.annotation')
65844             );
65845
65846             dispatch$$1.call('choose', this, preset);
65847         };
65848
65849         item.help = function() {
65850             event.stopPropagation();
65851             item.reference.toggle();
65852         };
65853
65854         item.preset = preset;
65855         item.reference = uiTagReference(preset.reference(context.geometry(id)), context);
65856
65857         return item;
65858     }
65859
65860
65861     presetList.autofocus = function(_) {
65862         if (!arguments.length) return autofocus;
65863         autofocus = _;
65864         return presetList;
65865     };
65866
65867
65868     presetList.entityID = function(_) {
65869         if (!arguments.length) return id;
65870         id = _;
65871         presetList.preset(context.presets().match(context.entity(id), context.graph()));
65872         return presetList;
65873     };
65874
65875
65876     presetList.preset = function(_) {
65877         if (!arguments.length) return currentPreset;
65878         currentPreset = _;
65879         return presetList;
65880     };
65881
65882
65883     return utilRebind(presetList, dispatch$$1, 'on');
65884 }
65885
65886 function uiViewOnOSM(context) {
65887     var id;
65888
65889     function viewOnOSM(selection) {
65890         var entity = context.entity(id);
65891
65892         selection.style('display', entity.isNew() ? 'none' : null);
65893
65894         var link = selection.selectAll('.view-on-osm')
65895             .data([0]);
65896
65897         var enter = link.enter()
65898             .append('a')
65899             .attr('class', 'view-on-osm')
65900             .attr('target', '_blank')
65901             .call(svgIcon('#icon-out-link', 'inline'));
65902
65903         enter
65904             .append('span')
65905             .text(t('inspector.view_on_osm'));
65906
65907         link
65908             .merge(enter)
65909             .attr('href', context.connection().entityURL(entity));
65910     }
65911
65912
65913     viewOnOSM.entityID = function(_) {
65914         if (!arguments.length) return id;
65915         id = _;
65916         return viewOnOSM;
65917     };
65918
65919     return viewOnOSM;
65920 }
65921
65922 function uiInspector(context) {
65923     var presetList = uiPresetList(context);
65924     var entityEditor = uiEntityEditor(context);
65925     var _state = 'select';
65926     var _entityID;
65927     var _newFeature = false;
65928
65929
65930     function inspector(selection$$1) {
65931         presetList
65932             .entityID(_entityID)
65933             .autofocus(_newFeature)
65934             .on('choose', setPreset);
65935
65936         entityEditor
65937             .state(_state)
65938             .entityID(_entityID)
65939             .on('choose', showList);
65940
65941         var wrap = selection$$1.selectAll('.panewrap')
65942             .data([0]);
65943
65944         var enter = wrap.enter()
65945             .append('div')
65946             .attr('class', 'panewrap');
65947
65948         enter
65949             .append('div')
65950             .attr('class', 'preset-list-pane pane');
65951
65952         enter
65953             .append('div')
65954             .attr('class', 'entity-editor-pane pane');
65955
65956         wrap = wrap.merge(enter);
65957         var presetPane = wrap.selectAll('.preset-list-pane');
65958         var editorPane = wrap.selectAll('.entity-editor-pane');
65959
65960         var graph = context.graph(),
65961             entity = context.entity(_entityID),
65962             showEditor = _state === 'hover' ||
65963                 entity.isUsed(graph) ||
65964                 entity.isHighwayIntersection(graph);
65965
65966         if (showEditor) {
65967             wrap.style('right', '0%');
65968             editorPane.call(entityEditor);
65969         } else {
65970             wrap.style('right', '-100%');
65971             presetPane.call(presetList);
65972         }
65973
65974         var footer = selection$$1.selectAll('.footer')
65975             .data([0]);
65976
65977         footer = footer.enter()
65978             .append('div')
65979             .attr('class', 'footer')
65980             .merge(footer);
65981
65982         footer
65983             .call(uiViewOnOSM(context).entityID(_entityID));
65984
65985
65986         function showList(preset) {
65987             wrap.transition()
65988                 .styleTween('right', function() { return d3_interpolate('0%', '-100%'); });
65989
65990             presetPane
65991                 .call(presetList.preset(preset).autofocus(true));
65992         }
65993
65994
65995         function setPreset(preset) {
65996             wrap.transition()
65997                 .styleTween('right', function() { return d3_interpolate('-100%', '0%'); });
65998
65999             editorPane
66000                 .call(entityEditor.preset(preset));
66001         }
66002     }
66003
66004
66005     inspector.state = function(_) {
66006         if (!arguments.length) return _state;
66007         _state = _;
66008         entityEditor.state(_state);
66009
66010         // remove any old field help overlay that might have gotten attached to the inspector
66011         d3_selectAll('.field-help-body').remove();
66012
66013         return inspector;
66014     };
66015
66016
66017     inspector.entityID = function(_) {
66018         if (!arguments.length) return _entityID;
66019         _entityID = _;
66020         return inspector;
66021     };
66022
66023
66024     inspector.newFeature = function(_) {
66025         if (!arguments.length) return _newFeature;
66026         _newFeature = _;
66027         return inspector;
66028     };
66029
66030
66031     return inspector;
66032 }
66033
66034 function uiSidebar(context) {
66035     var inspector = uiInspector(context),
66036         current;
66037
66038
66039     function sidebar(selection) {
66040         var featureListWrap = selection
66041             .append('div')
66042             .attr('class', 'feature-list-pane')
66043             .call(uiFeatureList(context));
66044
66045
66046         var inspectorWrap = selection
66047             .append('div')
66048             .attr('class', 'inspector-hidden inspector-wrap fr');
66049
66050
66051         function hover(id) {
66052             if (!current && context.hasEntity(id)) {
66053                 featureListWrap
66054                     .classed('inspector-hidden', true);
66055
66056                 inspectorWrap
66057                     .classed('inspector-hidden', false)
66058                     .classed('inspector-hover', true);
66059
66060                 if (inspector.entityID() !== id || inspector.state() !== 'hover') {
66061                     inspector
66062                         .state('hover')
66063                         .entityID(id);
66064
66065                     inspectorWrap
66066                         .call(inspector);
66067                 }
66068
66069             } else if (!current) {
66070                 featureListWrap
66071                     .classed('inspector-hidden', false);
66072                 inspectorWrap
66073                     .classed('inspector-hidden', true);
66074                 inspector
66075                     .state('hide');
66076             }
66077         }
66078
66079
66080         sidebar.hover = throttle(hover, 200);
66081
66082
66083         sidebar.select = function(id, newFeature) {
66084             if (!current && id) {
66085                 featureListWrap
66086                     .classed('inspector-hidden', true);
66087
66088                 inspectorWrap
66089                     .classed('inspector-hidden', false)
66090                     .classed('inspector-hover', false);
66091
66092                 if (inspector.entityID() !== id || inspector.state() !== 'select') {
66093                     inspector
66094                         .state('select')
66095                         .entityID(id)
66096                         .newFeature(newFeature);
66097
66098                     inspectorWrap
66099                         .call(inspector);
66100                 }
66101
66102             } else if (!current) {
66103                 featureListWrap
66104                     .classed('inspector-hidden', false);
66105                 inspectorWrap
66106                     .classed('inspector-hidden', true);
66107                 inspector
66108                     .state('hide');
66109             }
66110         };
66111
66112
66113         sidebar.show = function(component) {
66114             featureListWrap
66115                 .classed('inspector-hidden', true);
66116             inspectorWrap
66117                 .classed('inspector-hidden', true);
66118
66119             if (current) current.remove();
66120             current = selection
66121                 .append('div')
66122                 .attr('class', 'sidebar-component')
66123                 .call(component);
66124         };
66125
66126
66127         sidebar.hide = function() {
66128             featureListWrap
66129                 .classed('inspector-hidden', false);
66130             inspectorWrap
66131                 .classed('inspector-hidden', true);
66132
66133             if (current) current.remove();
66134             current = null;
66135         };
66136     }
66137
66138
66139     sidebar.hover = function() {};
66140     sidebar.hover.cancel = function() {};
66141     sidebar.select = function() {};
66142     sidebar.show = function() {};
66143     sidebar.hide = function() {};
66144
66145     return sidebar;
66146 }
66147
66148 function uiSpinner(context) {
66149     var osm = context.connection();
66150
66151
66152     return function(selection) {
66153         var img = selection
66154             .append('img')
66155             .attr('src', context.imagePath('loader-black.gif'))
66156             .style('opacity', 0);
66157
66158         if (osm) {
66159             osm
66160                 .on('loading.spinner', function() {
66161                     img.transition()
66162                         .style('opacity', 1);
66163                 })
66164                 .on('loaded.spinner', function() {
66165                     img.transition()
66166                         .style('opacity', 0);
66167                 });
66168         }
66169     };
66170 }
66171
66172 function uiSplash(context) {
66173
66174     return function(selection) {
66175         if (context.storage('sawSplash'))
66176              return;
66177
66178         context.storage('sawSplash', true);
66179
66180         var modalSelection = uiModal(selection);
66181
66182         modalSelection.select('.modal')
66183             .attr('class', 'modal-splash modal col6');
66184
66185         var introModal = modalSelection.select('.content')
66186             .append('div')
66187             .attr('class', 'fillL');
66188
66189         introModal
66190             .append('div')
66191             .attr('class','modal-section cf')
66192             .append('h3').text(t('splash.welcome'));
66193
66194         introModal
66195             .append('div')
66196             .attr('class','modal-section')
66197             .append('p')
66198             .html(t('splash.text', {
66199                 version: context.version,
66200                 website: '<a href="http://ideditor.com/">ideditor.com</a>',
66201                 github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
66202             }));
66203
66204         var buttonWrap = introModal
66205             .append('div')
66206             .attr('class', 'modal-actions cf');
66207
66208         var walkthrough = buttonWrap
66209             .append('button')
66210             .attr('class', 'walkthrough col6')
66211             .on('click', function() {
66212                 context.container().call(uiIntro(context));
66213                 modalSelection.close();
66214             });
66215
66216         walkthrough
66217             .append('svg')
66218             .attr('class', 'logo logo-walkthrough')
66219             .append('use')
66220             .attr('xlink:href', '#logo-walkthrough');
66221
66222         walkthrough
66223             .append('div')
66224             .text(t('splash.walkthrough'));
66225
66226         var startEditing = buttonWrap
66227             .append('button')
66228             .attr('class', 'start-editing col6')
66229             .on('click', modalSelection.close);
66230
66231         startEditing
66232             .append('svg')
66233             .attr('class', 'logo logo-features')
66234             .append('use')
66235             .attr('xlink:href', '#logo-features');
66236
66237         startEditing
66238             .append('div')
66239             .text(t('splash.start'));
66240
66241
66242         modalSelection.select('button.close')
66243             .attr('class','hide');
66244
66245     };
66246 }
66247
66248 function uiStatus(context) {
66249     var osm = context.connection();
66250
66251
66252     return function(selection$$1) {
66253         if (!osm) return;
66254
66255         function update() {
66256             osm.status(function(err, apiStatus) {
66257                 selection$$1.html('');
66258
66259                 if (err) {
66260                     if (apiStatus === 'connectionSwitched') {
66261                         // if the connection was just switched, we can't rely on
66262                         // the status (we're getting the status of the previous api)
66263                         return;
66264
66265                     } else if (apiStatus === 'rateLimited') {
66266                         selection$$1
66267                             .text(t('status.rateLimit'))
66268                             .append('a')
66269                             .attr('class', 'api-status-login')
66270                             .attr('target', '_blank')
66271                             .call(svgIcon('#icon-out-link', 'inline'))
66272                             .append('span')
66273                             .text(t('login'))
66274                             .on('click.login', function() {
66275                                 event.preventDefault();
66276                                 osm.authenticate();
66277                             });
66278                     } else {
66279                         // eslint-disable-next-line no-warning-comments
66280                         // TODO: nice messages for different error types
66281                         selection$$1.text(t('status.error'));
66282                     }
66283
66284                 } else if (apiStatus === 'readonly') {
66285                     selection$$1.text(t('status.readonly'));
66286                 } else if (apiStatus === 'offline') {
66287                     selection$$1.text(t('status.offline'));
66288                 }
66289
66290                 selection$$1.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
66291             });
66292         }
66293
66294         osm.on('change', function() { update(selection$$1); });
66295
66296         window.setInterval(update, 90000);
66297         update(selection$$1);
66298     };
66299 }
66300
66301 function uiUndoRedo(context) {
66302     var commands = [{
66303         id: 'undo',
66304         cmd: uiCmd('⌘Z'),
66305         action: function() { if (editable()) context.undo(); },
66306         annotation: function() { return context.history().undoAnnotation(); }
66307     }, {
66308         id: 'redo',
66309         cmd: uiCmd('⌘⇧Z'),
66310         action: function() { if (editable()) context.redo(); },
66311         annotation: function() { return context.history().redoAnnotation(); }
66312     }];
66313
66314
66315     function editable() {
66316         var mode = context.mode();
66317         return context.editable() && mode && mode.id !== 'save';
66318     }
66319
66320
66321     return function(selection$$1) {
66322         var tooltipBehavior = tooltip()
66323             .placement('bottom')
66324             .html(true)
66325             .title(function (d) {
66326                 return uiTooltipHtml(d.annotation() ?
66327                     t(d.id + '.tooltip', {action: d.annotation()}) :
66328                     t(d.id + '.nothing'), d.cmd);
66329             });
66330
66331         var buttons = selection$$1.selectAll('button')
66332             .data(commands)
66333             .enter()
66334             .append('button')
66335             .attr('class', function(d) { return 'col6 disabled ' + d.id + '-button'; })
66336             .on('click', function(d) { return d.action(); })
66337             .call(tooltipBehavior);
66338
66339         buttons.each(function(d) {
66340             var iconName = d.id;
66341             if (textDirection === 'rtl') {
66342                 if (iconName === 'undo') {
66343                     iconName = 'redo';
66344                 } else if (iconName === 'redo') {
66345                     iconName = 'undo';
66346                 }
66347             }
66348             d3_select(this)
66349                 .call(svgIcon('#icon-' + iconName));
66350         });
66351
66352         var keybinding = d3keybinding('undo')
66353             .on(commands[0].cmd, function() { event.preventDefault(); commands[0].action(); })
66354             .on(commands[1].cmd, function() { event.preventDefault(); commands[1].action(); });
66355
66356         d3_select(document)
66357             .call(keybinding);
66358
66359
66360         var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
66361
66362         context.map()
66363             .on('move.undo_redo', debouncedUpdate)
66364             .on('drawn.undo_redo', debouncedUpdate);
66365
66366         context.history()
66367             .on('change.undo_redo', update);
66368
66369         context
66370             .on('enter.undo_redo', update);
66371
66372
66373         function update() {
66374             buttons
66375                 .property('disabled', !editable())
66376                 .classed('disabled', function(d) { return !d.annotation(); })
66377                 .each(function() {
66378                     var selection$$1 = d3_select(this);
66379                     if (selection$$1.property('tooltipVisible')) {
66380                         selection$$1.call(tooltipBehavior.show);
66381                     }
66382                 });
66383         }
66384     };
66385 }
66386
66387 // these are module variables so they are preserved through a ui.restart()
66388 var sawVersion = null,
66389     isNewVersion = false,
66390     isNewUser = false;
66391
66392
66393 function uiVersion(context) {
66394
66395     var currVersion = context.version,
66396         matchedVersion = currVersion.match(/\d\.\d\.\d.*/);
66397
66398     if (sawVersion === null && matchedVersion !== null) {
66399         isNewVersion = (context.storage('sawVersion') !== currVersion);
66400         isNewUser = !context.storage('sawSplash');
66401         context.storage('sawVersion', currVersion);
66402         sawVersion = currVersion;
66403     }
66404
66405     return function(selection) {
66406         selection
66407             .append('a')
66408             .attr('target', '_blank')
66409             .attr('tabindex', -1)
66410             .attr('href', 'https://github.com/openstreetmap/iD')
66411             .text(currVersion);
66412
66413         // only show new version indicator to users that have used iD before
66414         if (isNewVersion && !isNewUser) {
66415             selection
66416                 .append('div')
66417                 .attr('class', 'badge')
66418                 .append('a')
66419                 .attr('target', '_blank')
66420                 .attr('tabindex', -1)
66421                 .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CHANGELOG.md#whats-new')
66422                 .call(svgIcon('#gift-11'))
66423                 .call(tooltip()
66424                     .title(t('version.whats_new', { version: currVersion }))
66425                     .placement('top')
66426                 );
66427         }
66428     };
66429 }
66430
66431 function uiZoom(context) {
66432     var zooms = [{
66433         id: 'zoom-in',
66434         icon: 'plus',
66435         title: t('zoom.in'),
66436         action: context.zoomIn,
66437         key: '+'
66438     }, {
66439         id: 'zoom-out',
66440         icon: 'minus',
66441         title: t('zoom.out'),
66442         action: context.zoomOut,
66443         key: '-'
66444     }];
66445
66446
66447     function zoomIn() {
66448         event.preventDefault();
66449         context.zoomIn();
66450     }
66451
66452
66453     function zoomOut() {
66454         event.preventDefault();
66455         context.zoomOut();
66456     }
66457
66458
66459     function zoomInFurther() {
66460         event.preventDefault();
66461         context.zoomInFurther();
66462     }
66463
66464
66465     function zoomOutFurther() {
66466         event.preventDefault();
66467         context.zoomOutFurther();
66468     }
66469
66470
66471     return function(selection$$1) {
66472         var button = selection$$1.selectAll('button')
66473             .data(zooms)
66474             .enter()
66475             .append('button')
66476             .attr('tabindex', -1)
66477             .attr('class', function(d) { return d.id; })
66478             .on('click.editor', function(d) { d.action(); })
66479             .call(tooltip()
66480                 .placement((textDirection === 'rtl') ? 'right' : 'left')
66481                 .html(true)
66482                 .title(function(d) {
66483                     return uiTooltipHtml(d.title, d.key);
66484                 })
66485             );
66486
66487         button.each(function(d) {
66488             d3_select(this)
66489                 .call(svgIcon('#icon-' + d.icon, 'light'));
66490         });
66491
66492         var keybinding = d3keybinding('zoom');
66493
66494         ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
66495             keybinding.on([key], zoomIn);
66496             keybinding.on([uiCmd('⌘' + key)], zoomInFurther);
66497         });
66498
66499         ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
66500             keybinding.on([key], zoomOut);
66501             keybinding.on([uiCmd('⌘' + key)], zoomOutFurther);
66502         });
66503
66504         d3_select(document)
66505             .call(keybinding);
66506     };
66507 }
66508
66509 function uiInit(context) {
66510     var uiInitCounter = 0;
66511
66512
66513     function render(container) {
66514         container
66515             .attr('dir', textDirection);
66516
66517         var map = context.map();
66518
66519         var hash = behaviorHash(context);
66520         hash();
66521
66522         if (!hash.hadHash) {
66523             map.centerZoom([0, 0], 2);
66524         }
66525
66526         container
66527             .append('svg')
66528             .attr('id', 'defs')
66529             .call(svgDefs(context));
66530
66531         container
66532             .append('div')
66533             .attr('id', 'sidebar')
66534             .attr('class', 'col4')
66535             .call(ui.sidebar);
66536
66537         var content = container
66538             .append('div')
66539             .attr('id', 'content')
66540             .attr('class', 'active');
66541
66542         var bar = content
66543             .append('div')
66544             .attr('id', 'bar')
66545             .attr('class', 'fillD');
66546
66547         content
66548             .append('div')
66549             .attr('id', 'map')
66550             .attr('dir', 'ltr')
66551             .call(map);
66552
66553         content
66554             .call(uiMapInMap(context))
66555             .call(uiInfo(context))
66556             .call(uiNotice(context));
66557
66558         bar
66559             .append('div')
66560             .attr('class', 'spacer col4');
66561
66562         var limiter = bar.append('div')
66563             .attr('class', 'limiter');
66564
66565         limiter
66566             .append('div')
66567             .attr('class', 'button-wrap joined col3')
66568             .call(uiModes(context), limiter);
66569
66570         limiter
66571             .append('div')
66572             .attr('class', 'button-wrap joined col1')
66573             .call(uiUndoRedo(context));
66574
66575         limiter
66576             .append('div')
66577             .attr('class', 'button-wrap col1')
66578             .call(uiSave(context));
66579
66580         bar
66581             .append('div')
66582             .attr('class', 'full-screen')
66583             .call(uiFullScreen(context));
66584
66585         bar
66586             .append('div')
66587             .attr('class', 'spinner')
66588             .call(uiSpinner(context));
66589
66590
66591         var controls = bar
66592             .append('div')
66593             .attr('class', 'map-controls');
66594
66595         controls
66596             .append('div')
66597             .attr('class', 'map-control zoombuttons')
66598             .call(uiZoom(context));
66599
66600         controls
66601             .append('div')
66602             .attr('class', 'map-control geolocate-control')
66603             .call(uiGeolocate(context));
66604
66605         controls
66606             .append('div')
66607             .attr('class', 'map-control background-control')
66608             .call(uiBackground(context));
66609
66610         controls
66611             .append('div')
66612             .attr('class', 'map-control map-data-control')
66613             .call(uiMapData(context));
66614
66615         controls
66616             .append('div')
66617             .attr('class', 'map-control help-control')
66618             .call(uiHelp(context));
66619
66620
66621         var about = content
66622             .append('div')
66623             .attr('id', 'about');
66624
66625         about
66626             .append('div')
66627             .attr('id', 'attrib')
66628             .attr('dir', 'ltr')
66629             .call(uiAttribution(context));
66630
66631         about
66632             .append('div')
66633             .attr('class', 'api-status')
66634             .call(uiStatus(context));
66635
66636
66637         var footer = about
66638             .append('div')
66639             .attr('id', 'footer')
66640             .attr('class', 'fillD');
66641
66642         footer
66643             .append('div')
66644             .attr('id', 'flash-wrap')
66645             .attr('class', 'footer-hide');
66646
66647         var footerWrap = footer
66648             .append('div')
66649             .attr('id', 'footer-wrap')
66650             .attr('class', 'footer-show');
66651
66652         footerWrap
66653             .append('div')
66654             .attr('id', 'scale-block')
66655             .call(uiScale(context));
66656
66657         var aboutList = footerWrap
66658             .append('div')
66659             .attr('id', 'info-block')
66660             .append('ul')
66661             .attr('id', 'about-list');
66662
66663         if (!context.embed()) {
66664             aboutList
66665                 .call(uiAccount(context));
66666         }
66667
66668         aboutList
66669             .append('li')
66670             .attr('class', 'version')
66671             .call(uiVersion(context));
66672
66673         var issueLinks = aboutList
66674             .append('li');
66675
66676         issueLinks
66677             .append('a')
66678             .attr('target', '_blank')
66679             .attr('tabindex', -1)
66680             .attr('href', 'https://github.com/openstreetmap/iD/issues')
66681             .call(svgIcon('#icon-bug', 'light'))
66682             .call(tooltip().title(t('report_a_bug')).placement('top'));
66683
66684         issueLinks
66685             .append('a')
66686             .attr('target', '_blank')
66687             .attr('tabindex', -1)
66688             .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
66689             .call(svgIcon('#icon-translate', 'light'))
66690             .call(tooltip().title(t('help_translate')).placement('top'));
66691
66692         aboutList
66693             .append('li')
66694             .attr('class', 'feature-warning')
66695             .attr('tabindex', -1)
66696             .call(uiFeatureInfo(context));
66697
66698         aboutList
66699             .append('li')
66700             .attr('class', 'user-list')
66701             .attr('tabindex', -1)
66702             .call(uiContributors(context));
66703
66704
66705         var photoviewer = content
66706             .append('div')
66707             .attr('id', 'photoviewer')
66708             .classed('al', true)       // 'al'=left,  'ar'=right
66709             .classed('hide', true);
66710
66711         photoviewer
66712             .append('button')
66713             .attr('class', 'thumb-hide')
66714             .on('click', function () {
66715                 if (services.mapillary) { services.mapillary.hideViewer(); }
66716                 if (services.openstreetcam) { services.openstreetcam.hideViewer(); }
66717             })
66718             .append('div')
66719             .call(svgIcon('#icon-close'));
66720
66721
66722         window.onbeforeunload = function() {
66723             return context.save();
66724         };
66725
66726         window.onunload = function() {
66727             context.history().unlock();
66728         };
66729
66730         var mapDimensions = map.dimensions();
66731
66732
66733         function onResize() {
66734             mapDimensions = utilGetDimensions(content, true);
66735             map.dimensions(mapDimensions);
66736         }
66737
66738         d3_select(window)
66739             .on('resize.editor', onResize);
66740
66741         onResize();
66742
66743         function pan(d) {
66744             return function() {
66745                 event.preventDefault();
66746                 context.pan(d, 100);
66747             };
66748         }
66749
66750
66751         // pan amount
66752         var pa = 80;
66753
66754         var keybinding = d3keybinding('main')
66755             .on('⌫', function() { event.preventDefault(); })
66756             .on('←', pan([pa, 0]))
66757             .on('↑', pan([0, pa]))
66758             .on('→', pan([-pa, 0]))
66759             .on('↓', pan([0, -pa]))
66760             .on(['⇧←', uiCmd('⌘←')], pan([mapDimensions[0], 0]))
66761             .on(['⇧↑', uiCmd('⌘↑')], pan([0, mapDimensions[1]]))
66762             .on(['⇧→', uiCmd('⌘→')], pan([-mapDimensions[0], 0]))
66763             .on(['⇧↓', uiCmd('⌘↓')], pan([0, -mapDimensions[1]]));
66764
66765         d3_select(document)
66766             .call(keybinding);
66767
66768         context.enter(modeBrowse(context));
66769
66770         if (!uiInitCounter++) {
66771             if (!hash.startWalkthrough) {
66772                 context.container()
66773                     .call(uiSplash(context))
66774                     .call(uiRestore(context));
66775             }
66776
66777             context.container()
66778                 .call(uiShortcuts(context));
66779         }
66780
66781         var osm = context.connection(),
66782             auth = uiLoading(context).message(t('loading_auth')).blocking(true);
66783
66784         if (osm && auth) {
66785             osm
66786                 .on('authLoading.ui', function() {
66787                     context.container()
66788                         .call(auth);
66789                 })
66790                 .on('authDone.ui', function() {
66791                     auth.close();
66792                 });
66793         }
66794
66795         uiInitCounter++;
66796
66797         if (hash.startWalkthrough) {
66798             hash.startWalkthrough = false;
66799             context.container().call(uiIntro(context));
66800         }
66801     }
66802
66803
66804     var renderCallback;
66805
66806     function ui(node, callback) {
66807         renderCallback = callback;
66808         var container = d3_select(node);
66809         context.container(container);
66810         context.loadLocale(function(err) {
66811             if (!err) {
66812                 render(container);
66813             }
66814             if (callback) {
66815                 callback(err);
66816             }
66817         });
66818     }
66819
66820
66821     ui.restart = function(arg) {
66822         context.locale(arg);
66823         context.loadLocale(function(err) {
66824             if (!err) {
66825                 context.container().selectAll('*').remove();
66826                 render(context.container());
66827                 if (renderCallback) renderCallback();
66828             }
66829         });
66830     };
66831
66832
66833     ui.sidebar = uiSidebar(context);
66834
66835     return ui;
66836 }
66837
66838 function uiChangesetEditor(context) {
66839     var dispatch$$1 = dispatch('change'),
66840         formFields = uiFormFields(context),
66841         fieldsArr,
66842         tags,
66843         changesetId;
66844
66845
66846
66847     function changesetEditor(selection) {
66848         render(selection);
66849     }
66850
66851
66852     function render(selection) {
66853         var initial = false;
66854
66855         if (!fieldsArr) {
66856             initial = true;
66857             var presets = context.presets();
66858
66859             fieldsArr = [
66860                 uiField(context, presets.field('comment'), null, { show: true, revert: false }),
66861                 uiField(context, presets.field('source'), null, { show: false, revert: false }),
66862                 uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
66863             ];
66864
66865             fieldsArr.forEach(function(field) {
66866                 field
66867                     .on('change', function(t$$1, onInput) {
66868                         dispatch$$1.call('change', field, t$$1, onInput);
66869                     });
66870             });
66871         }
66872
66873         fieldsArr.forEach(function(field) {
66874             field
66875                 .tags(tags);
66876         });
66877
66878
66879         selection
66880             .call(formFields.fieldsArr(fieldsArr));
66881
66882
66883         if (initial) {
66884             var commentField = selection.select('#preset-input-comment'),
66885                 commentNode = commentField.node();
66886
66887             if (commentNode) {
66888                 commentNode.focus();
66889                 commentNode.select();
66890             }
66891
66892             // trigger a 'blur' event so that comment field can be cleaned
66893             // and checked for hashtags, even if retrieved from localstorage
66894             utilTriggerEvent(commentField, 'blur');
66895
66896             var osm = context.connection();
66897             if (osm) {
66898                 osm.userChangesets(function (err, changesets) {
66899                     if (err) return;
66900
66901                     var comments = changesets.map(function(changeset) {
66902                         return {
66903                             title: changeset.tags.comment,
66904                             value: changeset.tags.comment
66905                         };
66906                     });
66907
66908                     commentField
66909                         .call(d3combobox()
66910                             .container(context.container())
66911                             .caseSensitive(true)
66912                             .data(uniqBy(comments, 'title'))
66913                         );
66914                 });
66915             }
66916         }
66917
66918         // Add warning if comment mentions Google
66919         var hasGoogle = tags.comment.match(/google/i);
66920         var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning')
66921             .data(hasGoogle ? [0] : []);
66922
66923         commentWarning.exit()
66924             .transition()
66925             .duration(200)
66926             .style('opacity', 0)
66927             .remove();
66928
66929         var commentEnter = commentWarning.enter()
66930             .insert('div', '.tag-reference-body')
66931             .attr('class', 'field-warning comment-warning')
66932             .style('opacity', 0);
66933
66934         commentEnter
66935             .append('a')
66936             .attr('target', '_blank')
66937             .attr('tabindex', -1)
66938             .call(svgIcon('#icon-alert', 'inline'))
66939             .attr('href', t('commit.google_warning_link'))
66940             .append('span')
66941             .text(t('commit.google_warning'));
66942
66943         commentEnter
66944             .transition()
66945             .duration(200)
66946             .style('opacity', 1);
66947     }
66948
66949
66950     changesetEditor.tags = function(_) {
66951         if (!arguments.length) return tags;
66952         tags = _;
66953         // Don't reset fieldsArr here.
66954         return changesetEditor;
66955     };
66956
66957
66958     changesetEditor.changesetID = function(_) {
66959         if (!arguments.length) return changesetId;
66960         if (changesetId === _) return changesetEditor;
66961         changesetId = _;
66962         fieldsArr = null;
66963         return changesetEditor;
66964     };
66965
66966
66967     return utilRebind(changesetEditor, dispatch$$1, 'on');
66968 }
66969
66970 /**
66971  * This method is like `_.union` except that it accepts `iteratee` which is
66972  * invoked for each element of each `arrays` to generate the criterion by
66973  * which uniqueness is computed. Result values are chosen from the first
66974  * array in which the value occurs. The iteratee is invoked with one argument:
66975  * (value).
66976  *
66977  * @static
66978  * @memberOf _
66979  * @since 4.0.0
66980  * @category Array
66981  * @param {...Array} [arrays] The arrays to inspect.
66982  * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
66983  * @returns {Array} Returns the new array of combined values.
66984  * @example
66985  *
66986  * _.unionBy([2.1], [1.2, 2.3], Math.floor);
66987  * // => [2.1, 1.2]
66988  *
66989  * // The `_.property` iteratee shorthand.
66990  * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
66991  * // => [{ 'x': 1 }, { 'x': 2 }]
66992  */
66993 var unionBy = baseRest(function(arrays) {
66994   var iteratee = last(arrays);
66995   if (isArrayLikeObject(iteratee)) {
66996     iteratee = undefined;
66997   }
66998   return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2));
66999 });
67000
67001 function uiCommitChanges(context) {
67002     var detected = utilDetect();
67003     var _entityID;
67004
67005
67006     function commitChanges(selection$$1) {
67007         var history = context.history();
67008         var summary = history.difference().summary();
67009
67010         var container = selection$$1.selectAll('.modal-section.commit-section')
67011             .data([0]);
67012
67013         var containerEnter = container.enter()
67014             .append('div')
67015             .attr('class', 'commit-section modal-section fillL2');
67016
67017         containerEnter
67018             .append('h3')
67019             .text(t('commit.changes', { count: summary.length }));
67020
67021         containerEnter
67022             .append('ul')
67023             .attr('class', 'changeset-list');
67024
67025         container = containerEnter
67026             .merge(container);
67027
67028
67029         var items = container.select('ul').selectAll('li')
67030             .data(summary);
67031
67032         var itemsEnter = items.enter()
67033             .append('li')
67034             .attr('class', 'change-item');
67035
67036         itemsEnter
67037             .each(function(d) {
67038                 d3_select(this)
67039                     .call(svgIcon('#icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
67040             });
67041
67042         itemsEnter
67043             .append('span')
67044             .attr('class', 'change-type')
67045             .text(function(d) { return t('commit.' + d.changeType) + ' '; });
67046
67047         itemsEnter
67048             .append('strong')
67049             .attr('class', 'entity-type')
67050             .text(function(d) {
67051                 var matched = context.presets().match(d.entity, d.graph);
67052                 return (matched && matched.name()) || utilDisplayType(d.entity.id);
67053             });
67054
67055         itemsEnter
67056             .append('span')
67057             .attr('class', 'entity-name')
67058             .text(function(d) {
67059                 var name = utilDisplayName(d.entity) || '',
67060                     string = '';
67061                 if (name !== '') {
67062                     string += ':';
67063                 }
67064                 return string += ' ' + name;
67065             });
67066
67067         itemsEnter
67068             .style('opacity', 0)
67069             .transition()
67070             .style('opacity', 1);
67071
67072         items = itemsEnter
67073             .merge(items);
67074
67075         items
67076             .on('mouseover', mouseover)
67077             .on('mouseout', mouseout)
67078             .on('click', click);
67079
67080
67081         // Download changeset link
67082         var changeset = new osmChangeset().update({ id: undefined });
67083         var changes = history.changes(actionDiscardTags(history.difference()));
67084
67085         delete changeset.id;  // Export without chnageset_id
67086
67087         var data = JXON.stringify(changeset.osmChangeJXON(changes));
67088         var blob = new Blob([data], {type: 'text/xml;charset=utf-8;'});
67089         var fileName = 'changes.osc';
67090
67091         var linkEnter = container.selectAll('.download-changes')
67092             .data([0])
67093             .enter()
67094             .append('a')
67095             .attr('class', 'download-changes');
67096
67097         if (detected.download) {      // All except IE11 and Edge
67098             linkEnter                 // download the data as a file
67099                 .attr('href', window.URL.createObjectURL(blob))
67100                 .attr('download', fileName);
67101
67102         } else {                      // IE11 and Edge
67103             linkEnter                 // open data uri in a new tab
67104                 .attr('target', '_blank')
67105                 .on('click.download', function() {
67106                     navigator.msSaveBlob(blob, fileName);
67107                 });
67108         }
67109
67110         linkEnter
67111             .call(svgIcon('#icon-load', 'inline'))
67112             .append('span')
67113             .text(t('commit.download_changes'));
67114
67115
67116         function mouseover(d) {
67117             if (d.entity) {
67118                 context.surface().selectAll(
67119                     utilEntityOrMemberSelector([d.entity.id], context.graph())
67120                 ).classed('hover', true);
67121             }
67122         }
67123
67124
67125         function mouseout() {
67126             context.surface().selectAll('.hover')
67127                 .classed('hover', false);
67128         }
67129
67130
67131         function click(change) {
67132             if (change.changeType === 'deleted') {
67133                 _entityID = null;
67134             } else {
67135                 var entity = change.entity;
67136                 _entityID = change.entity.id;
67137                 context.map().zoomTo(entity);
67138                 context.surface().selectAll(utilEntityOrMemberSelector([_entityID], context.graph()))
67139                     .classed('hover', true);
67140             }
67141         }
67142     }
67143
67144
67145     commitChanges.entityID = function(_) {
67146         if (!arguments.length) return _entityID;
67147         _entityID = _;
67148         return commitChanges;
67149     };
67150
67151
67152     return commitChanges;
67153 }
67154
67155 function uiCommitWarnings(context) {
67156
67157     function commitWarnings(selection) {
67158
67159         var changes = context.history().changes();
67160         var warnings = context.history().validate(changes);
67161
67162         var container = selection.selectAll('.warning-section')
67163             .data(warnings.length ? [0] : []);
67164
67165         container.exit()
67166             .remove();
67167
67168         var containerEnter = container.enter()
67169             .append('div')
67170             .attr('class', 'modal-section warning-section fillL2');
67171
67172         containerEnter
67173             .append('h3')
67174             .text(t('commit.warnings'));
67175
67176         containerEnter
67177             .append('ul')
67178             .attr('class', 'changeset-list');
67179
67180         container = containerEnter
67181             .merge(container);
67182
67183
67184         var items = container.select('ul').selectAll('li')
67185             .data(warnings);
67186
67187         items.exit()
67188             .remove();
67189
67190         var itemsEnter = items.enter()
67191             .append('li')
67192             .attr('class', 'warning-item');
67193
67194         itemsEnter
67195             .call(svgIcon('#icon-alert', 'pre-text'));
67196
67197         itemsEnter
67198             .append('strong')
67199             .text(function(d) { return d.message; });
67200
67201         itemsEnter.filter(function(d) { return d.tooltip; })
67202             .call(tooltip()
67203                 .title(function(d) { return d.tooltip; })
67204                 .placement('top')
67205             );
67206
67207         items = itemsEnter
67208             .merge(items);
67209
67210         items
67211             .on('mouseover', mouseover)
67212             .on('mouseout', mouseout)
67213             .on('click', warningClick);
67214
67215
67216         function mouseover(d) {
67217             if (d.entity) {
67218                 context.surface().selectAll(
67219                     utilEntityOrMemberSelector([d.entity.id], context.graph())
67220                 ).classed('hover', true);
67221             }
67222         }
67223
67224
67225         function mouseout() {
67226             context.surface().selectAll('.hover')
67227                 .classed('hover', false);
67228         }
67229
67230
67231         function warningClick(d) {
67232             if (d.entity) {
67233                 context.map().zoomTo(d.entity);
67234                 context.enter(modeSelect(context, [d.entity.id]));
67235             }
67236         }
67237
67238     }
67239
67240
67241     return commitWarnings;
67242 }
67243
67244 var _changeset$1;
67245 var readOnlyTags = [
67246     /^_changesets_count$/,
67247     /^created_by$/,
67248     /^ideditor:/,
67249     /^imagery_used$/,
67250     /^host$/,
67251     /^locale$/
67252 ];
67253
67254 // treat most punctuation (except -, _, +, &) as hashtag delimiters - #4398
67255 // from https://stackoverflow.com/a/25575009
67256 var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
67257
67258
67259 function uiCommit(context) {
67260     var dispatch$$1 = dispatch('cancel', 'save');
67261     var _userDetails;
67262     var _selection;
67263
67264     var changesetEditor = uiChangesetEditor(context)
67265         .on('change', changeTags);
67266     var rawTagEditor = uiRawTagEditor(context)
67267         .on('change', changeTags);
67268     var commitChanges = uiCommitChanges(context);
67269     var commitWarnings = uiCommitWarnings(context);
67270
67271
67272     function commit(selection$$1) {
67273         _selection = selection$$1;
67274
67275         var osm = context.connection();
67276         if (!osm) return;
67277
67278         // expire stored comment and hashtags after cutoff datetime - #3947
67279         var commentDate = +context.storage('commentDate') || 0;
67280         var currDate = Date.now();
67281         var cutoff = 2 * 86400 * 1000;   // 2 days
67282         if (commentDate > currDate || currDate - commentDate > cutoff) {
67283             context.storage('comment', null);
67284             context.storage('hashtags', null);
67285         }
67286
67287         var tags;
67288         if (!_changeset$1) {
67289             var detected = utilDetect();
67290             tags = {
67291                 comment: context.storage('comment') || '',
67292                 created_by: ('iD ' + context.version).substr(0, 255),
67293                 host: detected.host.substr(0, 255),
67294                 locale: detected.locale.substr(0, 255)
67295             };
67296
67297             // call findHashtags initially - this will remove stored
67298             // hashtags if any hashtags are found in the comment - #4304
67299             findHashtags(tags, true);
67300
67301             var hashtags = context.storage('hashtags');
67302             if (hashtags) {
67303                 tags.hashtags = hashtags;
67304             }
67305
67306             _changeset$1 = new osmChangeset({ tags: tags });
67307         }
67308
67309         tags = clone(_changeset$1.tags);
67310         tags.imagery_used = context.history().imageryUsed().join(';').substr(0, 255);
67311         _changeset$1 = _changeset$1.update({ tags: tags });
67312
67313         var header = selection$$1.selectAll('.header')
67314             .data([0]);
67315
67316         header.enter()
67317             .append('div')
67318             .attr('class', 'header fillL')
67319             .append('h3')
67320             .text(t('commit.title'));
67321
67322         var body = selection$$1.selectAll('.body')
67323             .data([0]);
67324
67325         body = body.enter()
67326             .append('div')
67327             .attr('class', 'body')
67328             .merge(body);
67329
67330
67331         // Changeset Section
67332         var changesetSection = body.selectAll('.changeset-editor')
67333             .data([0]);
67334
67335         changesetSection = changesetSection.enter()
67336             .append('div')
67337             .attr('class', 'modal-section changeset-editor')
67338             .merge(changesetSection);
67339
67340         changesetSection
67341             .call(changesetEditor
67342                 .changesetID(_changeset$1.id)
67343                 .tags(tags)
67344             );
67345
67346
67347         // Warnings
67348         body.call(commitWarnings);
67349
67350
67351         // Upload Explanation
67352         var saveSection = body.selectAll('.save-section')
67353             .data([0]);
67354
67355         saveSection = saveSection.enter()
67356             .append('div')
67357             .attr('class','modal-section save-section fillL cf')
67358             .merge(saveSection);
67359
67360         var prose = saveSection.selectAll('.commit-info')
67361             .data([0]);
67362
67363         prose = prose.enter()
67364             .append('p')
67365             .attr('class', 'commit-info')
67366             .text(t('commit.upload_explanation'))
67367             .merge(prose);
67368
67369         osm.userDetails(function(err, user) {
67370             if (err) return;
67371
67372             var userLink = d3_select(document.createElement('div'));
67373
67374             _userDetails = user;
67375
67376             if (user.image_url) {
67377                 userLink
67378                     .append('img')
67379                     .attr('src', user.image_url)
67380                     .attr('class', 'icon pre-text user-icon');
67381             }
67382
67383             userLink
67384                 .append('a')
67385                 .attr('class','user-info')
67386                 .text(user.display_name)
67387                 .attr('href', osm.userURL(user.display_name))
67388                 .attr('tabindex', -1)
67389                 .attr('target', '_blank');
67390
67391             prose
67392                 .html(t('commit.upload_explanation_with_user', { user: userLink.html() }));
67393         });
67394
67395
67396         // Request Review
67397         var requestReview = saveSection.selectAll('.request-review')
67398             .data([0]);
67399
67400         // Enter
67401         var requestReviewEnter = requestReview.enter()
67402             .append('div')
67403             .attr('class', 'request-review');
67404
67405         var labelEnter = requestReviewEnter
67406             .append('label')
67407             .attr('for', 'commit-input-request-review');
67408
67409         labelEnter
67410             .append('input')
67411             .attr('type', 'checkbox')
67412             .attr('id', 'commit-input-request-review');
67413
67414         labelEnter
67415             .append('span')
67416             .text(t('commit.request_review'));
67417
67418         // Update
67419         requestReview = requestReview
67420             .merge(requestReviewEnter);
67421
67422         var requestReviewInput = requestReview.selectAll('input')
67423             .property('checked', isReviewRequested(_changeset$1.tags))
67424             .on('change', toggleRequestReview);
67425
67426
67427         // Buttons
67428         var buttonSection = saveSection.selectAll('.buttons')
67429             .data([0]);
67430
67431         // enter
67432         var buttonEnter = buttonSection.enter()
67433             .append('div')
67434             .attr('class', 'buttons fillL cf');
67435
67436         buttonEnter
67437             .append('button')
67438             .attr('class', 'secondary-action col5 button cancel-button')
67439             .append('span')
67440             .attr('class', 'label')
67441             .text(t('commit.cancel'));
67442
67443         buttonEnter
67444             .append('button')
67445             .attr('class', 'action col5 button save-button')
67446             .append('span')
67447             .attr('class', 'label')
67448             .text(t('commit.save'));
67449
67450         // update
67451         buttonSection = buttonSection
67452             .merge(buttonEnter);
67453
67454         buttonSection.selectAll('.cancel-button')
67455             .on('click.cancel', function() {
67456                 var selectedID = commitChanges.entityID();
67457                 dispatch$$1.call('cancel', this, selectedID);
67458             });
67459
67460         buttonSection.selectAll('.save-button')
67461             .attr('disabled', function() {
67462                 var n = d3_select('#preset-input-comment').node();
67463                 return (n && n.value.length) ? null : true;
67464             })
67465             .on('click.save', function() {
67466                 this.blur();    // avoid keeping focus on the button - #4641
67467                 dispatch$$1.call('save', this, _changeset$1);
67468             });
67469
67470
67471         // Raw Tag Editor
67472         var tagSection = body.selectAll('.tag-section.raw-tag-editor')
67473             .data([0]);
67474
67475         tagSection = tagSection.enter()
67476             .append('div')
67477             .attr('class', 'modal-section tag-section raw-tag-editor')
67478             .merge(tagSection);
67479
67480         var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
67481         tagSection
67482             .call(rawTagEditor
67483                 .expanded(expanded)
67484                 .readOnlyTags(readOnlyTags)
67485                 .tags(clone(_changeset$1.tags))
67486             );
67487
67488
67489         // Change summary
67490         body.call(commitChanges);
67491
67492
67493         function toggleRequestReview() {
67494             var rr = requestReviewInput.property('checked');
67495             updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
67496
67497             var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
67498             tagSection
67499                 .call(rawTagEditor
67500                     .expanded(expanded)
67501                     .readOnlyTags(readOnlyTags)
67502                     .tags(clone(_changeset$1.tags))
67503                 );
67504         }
67505     }
67506
67507
67508     function changeTags(changed, onInput) {
67509         if (changed.hasOwnProperty('comment')) {
67510             if (changed.comment === undefined) {
67511                 changed.comment = '';
67512             }
67513             if (!onInput) {
67514                 context.storage('comment', changed.comment);
67515                 context.storage('commentDate', Date.now());
67516             }
67517         }
67518
67519         updateChangeset(changed, onInput);
67520
67521         if (_selection) {
67522             _selection.call(commit);
67523         }
67524     }
67525
67526
67527     function findHashtags(tags, commentOnly) {
67528         var inComment = commentTags();
67529         var inHashTags = hashTags();
67530
67531         if (inComment !== null) {                    // when hashtags are detected in comment...
67532             context.storage('hashtags', null);       // always remove stored hashtags - #4304
67533             if (commentOnly) { inHashTags = null; }  // optionally override hashtags field
67534         }
67535         return unionBy(inComment, inHashTags, function (s) {
67536             return s.toLowerCase();
67537         });
67538
67539         // Extract hashtags from `comment`
67540         function commentTags() {
67541             return tags.comment
67542                 .replace(/http\S*/g, '')  // drop anything that looks like a URL - #4289
67543                 .match(hashtagRegex);
67544         }
67545
67546         // Extract and clean hashtags from `hashtags`
67547         function hashTags() {
67548             var t$$1 = tags.hashtags || '';
67549             return t$$1
67550                 .split(/[,;\s]+/)
67551                 .map(function (s) {
67552                     if (s[0] !== '#') { s = '#' + s; }    // prepend '#'
67553                     var matched = s.match(hashtagRegex);
67554                     return matched && matched[0];
67555                 }).filter(Boolean);                       // exclude falsey
67556         }
67557     }
67558
67559
67560     function isReviewRequested(tags) {
67561         var rr = tags.review_requested;
67562         if (rr === undefined) return false;
67563         rr = rr.trim().toLowerCase();
67564         return !(rr === '' || rr === 'no');
67565     }
67566
67567
67568     function updateChangeset(changed, onInput) {
67569         var tags = clone(_changeset$1.tags);
67570
67571         forEach(changed, function(v, k) {
67572             k = k.trim().substr(0, 255);
67573             if (readOnlyTags.indexOf(k) !== -1) return;
67574
67575             if (k !== '' && v !== undefined) {
67576                 if (onInput) {
67577                     tags[k] = v;
67578                 } else {
67579                     tags[k] = v.trim().substr(0, 255);
67580                 }
67581             } else {
67582                 delete tags[k];
67583             }
67584         });
67585
67586         if (!onInput) {
67587             // when changing the comment, override hashtags with any found in comment.
67588             var commentOnly = changed.hasOwnProperty('comment') && (changed.comment !== '');
67589             var arr = findHashtags(tags, commentOnly);
67590             if (arr.length) {
67591                 tags.hashtags = arr.join(';').substr(0, 255);
67592                 context.storage('hashtags', tags.hashtags);
67593             } else {
67594                 delete tags.hashtags;
67595                 context.storage('hashtags', null);
67596             }
67597         }
67598
67599         // always update userdetails, just in case user reauthenticates as someone else
67600         if (_userDetails && _userDetails.changesets_count !== undefined) {
67601             var changesetsCount = parseInt(_userDetails.changesets_count, 10) + 1;  // #4283
67602             tags.changesets_count = String(changesetsCount);
67603
67604             // first 100 edits - new user
67605             if (changesetsCount <= 100) {
67606                 var s;
67607                 s = context.storage('walkthrough_completed');
67608                 if (s) {
67609                     tags['ideditor:walkthrough_completed'] = s;
67610                 }
67611
67612                 s = context.storage('walkthrough_progress');
67613                 if (s) {
67614                     tags['ideditor:walkthrough_progress'] = s;
67615                 }
67616
67617                 s = context.storage('walkthrough_started');
67618                 if (s) {
67619                     tags['ideditor:walkthrough_started'] = s;
67620                 }
67621             }
67622         } else {
67623             delete tags.changesets_count;
67624         }
67625
67626         if (!isEqual(_changeset$1.tags, tags)) {
67627             _changeset$1 = _changeset$1.update({ tags: tags });
67628         }
67629     }
67630
67631
67632     commit.reset = function() {
67633         _changeset$1 = null;
67634     };
67635
67636
67637     return utilRebind(commit, dispatch$$1, 'on');
67638 }
67639
67640 function uiConfirm(selection) {
67641     var modalSelection = uiModal(selection);
67642
67643     modalSelection.select('.modal')
67644         .classed('modal-alert', true);
67645
67646     var section = modalSelection.select('.content');
67647
67648     section.append('div')
67649         .attr('class', 'modal-section header');
67650
67651     section.append('div')
67652         .attr('class', 'modal-section message-text');
67653
67654     var buttons = section.append('div')
67655         .attr('class', 'modal-section buttons cf');
67656
67657
67658     modalSelection.okButton = function() {
67659         buttons
67660             .append('button')
67661             .attr('class', 'action col4')
67662             .on('click.confirm', function() {
67663                 modalSelection.remove();
67664             })
67665             .text(t('confirm.okay'))
67666             .node()
67667             .focus();
67668
67669         return modalSelection;
67670     };
67671
67672
67673     return modalSelection;
67674 }
67675
67676 function uiConflicts(context) {
67677     var dispatch$$1 = dispatch('cancel', 'save');
67678     var keybinding = d3keybinding('conflicts');
67679     var _origChanges;
67680     var _conflictList;
67681
67682
67683     function keybindingOn() {
67684         d3_select(document)
67685             .call(keybinding.on('⎋', cancel, true));
67686     }
67687
67688     function keybindingOff() {
67689         d3_select(document)
67690             .call(keybinding.off);
67691     }
67692
67693     function tryAgain() {
67694         keybindingOff();
67695         dispatch$$1.call('save');
67696     }
67697
67698     function cancel() {
67699         keybindingOff();
67700         dispatch$$1.call('cancel');
67701     }
67702
67703
67704     function conflicts(selection$$1) {
67705         keybindingOn();
67706
67707         var headerEnter = selection$$1.selectAll('.header')
67708             .data([0])
67709             .enter()
67710             .append('div')
67711             .attr('class', 'header fillL');
67712
67713         headerEnter
67714             .append('button')
67715             .attr('class', 'fr')
67716             .on('click', cancel)
67717             .call(svgIcon('#icon-close'));
67718
67719         headerEnter
67720             .append('h3')
67721             .text(t('save.conflict.header'));
67722
67723         var bodyEnter = selection$$1.selectAll('.body')
67724             .data([0])
67725             .enter()
67726             .append('div')
67727             .attr('class', 'body fillL');
67728
67729         var conflictsHelpEnter = bodyEnter
67730             .append('div')
67731             .attr('class', 'conflicts-help')
67732             .text(t('save.conflict.help'));
67733
67734
67735         // Download changes link
67736         var detected = utilDetect();
67737         var changeset = new osmChangeset();
67738
67739         delete changeset.id;  // Export without changeset_id
67740
67741         var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
67742         var blob = new Blob([data], { type: 'text/xml;charset=utf-8;' });
67743         var fileName = 'changes.osc';
67744
67745         var linkEnter = conflictsHelpEnter.selectAll('.download-changes')
67746             .append('a')
67747             .attr('class', 'download-changes');
67748
67749         if (detected.download) {      // All except IE11 and Edge
67750             linkEnter                 // download the data as a file
67751                 .attr('href', window.URL.createObjectURL(blob))
67752                 .attr('download', fileName);
67753
67754         } else {                      // IE11 and Edge
67755             linkEnter                 // open data uri in a new tab
67756                 .attr('target', '_blank')
67757                 .on('click.download', function() {
67758                     navigator.msSaveBlob(blob, fileName);
67759                 });
67760         }
67761
67762         linkEnter
67763             .call(svgIcon('#icon-load', 'inline'))
67764             .append('span')
67765             .text(t('save.conflict.download_changes'));
67766
67767
67768         bodyEnter
67769             .append('div')
67770             .attr('class', 'conflict-container fillL3')
67771             .call(showConflict, 0);
67772
67773         bodyEnter
67774             .append('div')
67775             .attr('class', 'conflicts-done')
67776             .attr('opacity', 0)
67777             .style('display', 'none')
67778             .text(t('save.conflict.done'));
67779
67780         var buttonsEnter = bodyEnter
67781             .append('div')
67782             .attr('class','buttons col12 joined conflicts-buttons');
67783
67784         buttonsEnter
67785             .append('button')
67786             .attr('disabled', _conflictList.length > 1)
67787             .attr('class', 'action conflicts-button col6')
67788             .text(t('save.title'))
67789             .on('click.try_again', tryAgain);
67790
67791         buttonsEnter
67792             .append('button')
67793             .attr('class', 'secondary-action conflicts-button col6')
67794             .text(t('confirm.cancel'))
67795             .on('click.cancel', cancel);
67796     }
67797
67798
67799     function showConflict(selection$$1, index) {
67800         index = utilWrap(index, _conflictList.length);
67801
67802         var parent = d3_select(selection$$1.node().parentNode);
67803
67804         // enable save button if this is the last conflict being reviewed..
67805         if (index === _conflictList.length - 1) {
67806             window.setTimeout(function() {
67807                 parent.select('.conflicts-button')
67808                     .attr('disabled', null);
67809
67810                 parent.select('.conflicts-done')
67811                     .transition()
67812                     .attr('opacity', 1)
67813                     .style('display', 'block');
67814             }, 250);
67815         }
67816
67817         var conflict = selection$$1
67818             .selectAll('.conflict')
67819             .data([_conflictList[index]]);
67820
67821         conflict.exit()
67822             .remove();
67823
67824         var conflictEnter = conflict.enter()
67825             .append('div')
67826             .attr('class', 'conflict');
67827
67828         conflictEnter
67829             .append('h4')
67830             .attr('class', 'conflict-count')
67831             .text(t('save.conflict.count', { num: index + 1, total: _conflictList.length }));
67832
67833         conflictEnter
67834             .append('a')
67835             .attr('class', 'conflict-description')
67836             .attr('href', '#')
67837             .text(function(d) { return d.name; })
67838             .on('click', function(d) {
67839                 event.preventDefault();
67840                 zoomToEntity(d.id);
67841             });
67842
67843         var details = conflictEnter
67844             .append('div')
67845             .attr('class', 'conflict-detail-container');
67846
67847         details
67848             .append('ul')
67849             .attr('class', 'conflict-detail-list')
67850             .selectAll('li')
67851             .data(function(d) { return d.details || []; })
67852             .enter()
67853             .append('li')
67854             .attr('class', 'conflict-detail-item')
67855             .html(function(d) { return d; });
67856
67857         details
67858             .append('div')
67859             .attr('class', 'conflict-choices')
67860             .call(addChoices);
67861
67862         details
67863             .append('div')
67864             .attr('class', 'conflict-nav-buttons joined cf')
67865             .selectAll('button')
67866             .data(['previous', 'next'])
67867             .enter()
67868             .append('button')
67869             .text(function(d) { return t('save.conflict.' + d); })
67870             .attr('class', 'conflict-nav-button action col6')
67871             .attr('disabled', function(d, i) {
67872                 return (i === 0 && index === 0) ||
67873                     (i === 1 && index === _conflictList.length - 1) || null;
67874             })
67875             .on('click', function(d, i) {
67876                 event.preventDefault();
67877
67878                 var container = parent.selectAll('.conflict-container');
67879                 var sign = (i === 0 ? -1 : 1);
67880
67881                 container
67882                     .selectAll('.conflict')
67883                     .remove();
67884
67885                 container
67886                     .call(showConflict, index + sign);
67887             });
67888
67889     }
67890
67891
67892     function addChoices(selection$$1) {
67893         var choices = selection$$1
67894             .append('ul')
67895             .attr('class', 'layer-list')
67896             .selectAll('li')
67897             .data(function(d) { return d.choices || []; });
67898
67899         // enter
67900         var choicesEnter = choices.enter()
67901             .append('li')
67902             .attr('class', 'layer');
67903
67904         var labelEnter = choicesEnter
67905             .append('label');
67906
67907         labelEnter
67908             .append('input')
67909             .attr('type', 'radio')
67910             .attr('name', function(d) { return d.id; })
67911             .on('change', function(d, i) {
67912                 var ul = this.parentNode.parentNode.parentNode;
67913                 ul.__data__.chosen = i;
67914                 choose(ul, d);
67915             });
67916
67917         labelEnter
67918             .append('span')
67919             .text(function(d) { return d.text; });
67920
67921         // update
67922         choicesEnter
67923             .merge(choices)
67924             .each(function(d, i) {
67925                 var ul = this.parentNode;
67926                 if (ul.__data__.chosen === i) {
67927                     choose(ul, d);
67928                 }
67929             });
67930     }
67931
67932
67933     function choose(ul, datum) {
67934         if (event) event.preventDefault();
67935
67936         d3_select(ul)
67937             .selectAll('li')
67938             .classed('active', function(d) { return d === datum; })
67939             .selectAll('input')
67940             .property('checked', function(d) { return d === datum; });
67941
67942         var extent = geoExtent$$1();
67943         var entity;
67944
67945         entity = context.graph().hasEntity(datum.id);
67946         if (entity) extent._extend(entity.extent(context.graph()));
67947
67948         datum.action();
67949
67950         entity = context.graph().hasEntity(datum.id);
67951         if (entity) extent._extend(entity.extent(context.graph()));
67952
67953         zoomToEntity(datum.id, extent);
67954     }
67955
67956
67957     function zoomToEntity(id, extent) {
67958         context.surface().selectAll('.hover')
67959             .classed('hover', false);
67960
67961         var entity = context.graph().hasEntity(id);
67962         if (entity) {
67963             if (extent) {
67964                 context.map().trimmedExtent(extent);
67965             } else {
67966                 context.map().zoomTo(entity);
67967             }
67968             context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
67969                 .classed('hover', true);
67970         }
67971     }
67972
67973
67974     // The conflict list should be an array of objects like:
67975     // {
67976     //     id: id,
67977     //     name: entityName(local),
67978     //     details: merge.conflicts(),
67979     //     chosen: 1,
67980     //     choices: [
67981     //         choice(id, keepMine, forceLocal),
67982     //         choice(id, keepTheirs, forceRemote)
67983     //     ]
67984     // }
67985     conflicts.conflictList = function(_) {
67986         if (!arguments.length) return _conflictList;
67987         _conflictList = _;
67988         return conflicts;
67989     };
67990
67991
67992     conflicts.origChanges = function(_) {
67993         if (!arguments.length) return _origChanges;
67994         _origChanges = _;
67995         return conflicts;
67996     };
67997
67998
67999     return utilRebind(conflicts, dispatch$$1, 'on');
68000 }
68001
68002 function uiEditMenu(context, operations) {
68003     var menu,
68004         center = [0, 0],
68005         offset = [0, 0],
68006         tooltip;
68007
68008     var p = 8,               // top padding
68009         m = 4,               // top margin
68010         h = 15,              // height of icon
68011         vpBottomMargin = 45, // viewport bottom margin
68012         vpSideMargin = 35,   // viewport side margin
68013         buttonWidth = 44,
68014         buttonHeight = (2 * p + h),
68015         menuWidth = buttonWidth,
68016         menuHeight = (2 * m) + operations.length * buttonHeight,
68017         menuSideMargin = 10,
68018         tooltipWidth = 200,
68019         tooltipHeight = 200;  // a reasonable guess, real height depends on tooltip contents
68020
68021
68022     var editMenu = function (selection$$1) {
68023         if (!operations.length) return;
68024
68025         selection$$1.node().parentNode.focus();
68026
68027         var isRTL = textDirection === 'rtl',
68028             viewport = context.surfaceRect();
68029
68030         if (!isRTL && (center[0] + menuSideMargin + menuWidth) > (viewport.width - vpSideMargin)) {
68031             // menu is going left-to-right and near right viewport edge, go left instead
68032             isRTL = true;
68033         } else if (isRTL && (center[0] - menuSideMargin - menuWidth) < vpSideMargin) {
68034             // menu is going right-to-left and near left viewport edge, go right instead
68035             isRTL = false;
68036         }
68037
68038         offset[0] = (isRTL ? -1 * (menuSideMargin + menuWidth) : menuSideMargin);
68039
68040         if (center[1] + menuHeight > (viewport.height - vpBottomMargin)) {
68041             // menu is near bottom viewport edge, shift upwards
68042             offset[1] = -1 * (center[1] + menuHeight - viewport.height + vpBottomMargin);
68043         }
68044
68045         var origin = [ center[0] + offset[0], center[1] + offset[1] ];
68046
68047         menu = selection$$1
68048             .append('g')
68049             .attr('class', 'edit-menu')
68050             .attr('transform', 'translate(' + origin + ')')
68051             .attr('opacity', 0);
68052
68053         menu
68054             .transition()
68055             .attr('opacity', 1);
68056
68057         menu
68058             .append('rect')
68059             .attr('class', 'edit-menu-background')
68060             .attr('x', 4)
68061             .attr('rx', 4)
68062             .attr('ry', 4)
68063             .attr('width', menuWidth)
68064             .attr('height', menuHeight)
68065             .attr('stroke-linecap', 'round');
68066
68067
68068         var button = menu.selectAll('.edit-menu-item')
68069             .data(operations)
68070             .enter()
68071             .append('g')
68072             .attr('class', function (d) { return 'edit-menu-item edit-menu-item-' + d.id; })
68073             .classed('disabled', function (d) { return d.disabled(); })
68074             .attr('transform', function (d, i) {
68075                 return 'translate(' + geoVecFloor([
68076                     0,
68077                     m + i * buttonHeight
68078                 ]).join(',') + ')';
68079             });
68080
68081         button
68082             .append('rect')
68083             .attr('x', 4)
68084             .attr('width', buttonWidth)
68085             .attr('height', buttonHeight)
68086             .on('click', click)
68087             .on('mousedown', mousedown)
68088             .on('mouseover', mouseover)
68089             .on('mouseout', mouseout);
68090
68091         button
68092             .append('use')
68093             .attr('width', '20')
68094             .attr('height', '20')
68095             .attr('transform', function () {
68096                 return 'translate(' + [2 * p, 5] + ')';
68097             })
68098             .attr('xlink:href', function (d) { return '#operation-' + d.id; });
68099
68100         tooltip = d3_select(document.body)
68101             .append('div')
68102             .attr('class', 'tooltip-inner edit-menu-tooltip');
68103
68104
68105         function click(operation) {
68106             event.stopPropagation();
68107             if (operation.disabled()) return;
68108             operation();
68109             editMenu.close();
68110         }
68111
68112         function mousedown() {
68113             event.stopPropagation();  // https://github.com/openstreetmap/iD/issues/1869
68114         }
68115
68116         function mouseover(d, i) {
68117             var tipX, tipY;
68118
68119             if (!isRTL) {
68120                 tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
68121             } else {
68122                 tipX = viewport.left + origin[0] - 4 - tooltipWidth;
68123             }
68124
68125             if (tipX + tooltipWidth > viewport.right) {
68126                 // tip is going left-to-right and near right viewport edge, go left instead
68127                 tipX = viewport.left + origin[0] - 4 - tooltipWidth;
68128             } else if (tipX < viewport.left) {
68129                 // tip is going right-to-left and near left viewport edge, go right instead
68130                 tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
68131             }
68132
68133             tipY = viewport.top + origin[1] + (i * buttonHeight);
68134             if (tipY + tooltipHeight > viewport.bottom) {
68135                 // tip is near bottom viewport edge, shift upwards
68136                 tipY -= tipY + tooltipHeight - viewport.bottom;
68137             }
68138
68139             tooltip
68140                 .style('left', tipX + 'px')
68141                 .style('top', tipY + 'px')
68142                 .style('display', 'block')
68143                 .html(uiTooltipHtml(d.tooltip(), d.keys[0], d.title));
68144         }
68145
68146         function mouseout() {
68147             tooltip.style('display', 'none');
68148         }
68149     };
68150
68151
68152     editMenu.close = function () {
68153         if (menu) {
68154             menu
68155                 .style('pointer-events', 'none')
68156                 .transition()
68157                 .attr('opacity', 0)
68158                 .remove();
68159         }
68160
68161         if (tooltip) {
68162             tooltip.remove();
68163         }
68164     };
68165
68166
68167     editMenu.center = function (_) {
68168         if (!arguments.length) return center;
68169         center = _;
68170         return editMenu;
68171     };
68172
68173
68174     return editMenu;
68175 }
68176
68177 var _flashTimer;
68178
68179
68180 function uiFlash() {
68181     var _duration = 2000;
68182     var _iconName = '#icon-no';
68183     var _iconClass = 'disabled';
68184     var _text = '';
68185     var _textClass;
68186
68187
68188     function flash() {
68189         if (_flashTimer) {
68190             _flashTimer.stop();
68191         }
68192
68193         d3_select('#footer-wrap')
68194             .attr('class', 'footer-hide');
68195         d3_select('#flash-wrap')
68196             .attr('class', 'footer-show');
68197
68198         var content = d3_select('#flash-wrap').selectAll('.flash-content')
68199             .data([0]);
68200
68201         // Enter
68202         var contentEnter = content.enter()
68203             .append('div')
68204             .attr('class', 'flash-content');
68205
68206         var iconEnter = contentEnter
68207             .append('svg')
68208             .attr('class', 'flash-icon')
68209             .append('g')
68210             .attr('transform', 'translate(10,10)');
68211
68212         iconEnter
68213             .append('circle')
68214             .attr('r', 9);
68215
68216         iconEnter
68217             .append('use')
68218             .attr('transform', 'translate(-7,-7)')
68219             .attr('width', '14')
68220             .attr('height', '14');
68221
68222         contentEnter
68223             .append('div')
68224             .attr('class', 'flash-text');
68225
68226
68227         // Update
68228         content = content
68229             .merge(contentEnter);
68230
68231         content
68232             .selectAll('.flash-icon')
68233             .attr('class', 'flash-icon ' + (_iconClass || ''));
68234
68235         content
68236             .selectAll('.flash-icon use')
68237             .attr('xlink:href', _iconName);
68238
68239         content
68240             .selectAll('.flash-text')
68241             .attr('class', 'flash-text ' + (_textClass || ''))
68242             .text(_text);
68243
68244
68245         _flashTimer = d3_timeout(function() {
68246             _flashTimer = null;
68247             d3_select('#footer-wrap')
68248                 .attr('class', 'footer-show');
68249             d3_select('#flash-wrap')
68250                 .attr('class', 'footer-hide');
68251         }, _duration);
68252
68253         return content;
68254     }
68255
68256
68257     flash.duration = function(_) {
68258         if (!arguments.length) return _duration;
68259         _duration = _;
68260         return flash;
68261     };
68262
68263     flash.text = function(_) {
68264         if (!arguments.length) return _text;
68265         _text = _;
68266         return flash;
68267     };
68268
68269     flash.textClass = function(_) {
68270         if (!arguments.length) return _textClass;
68271         _textClass = _;
68272         return flash;
68273     };
68274
68275     flash.iconName = function(_) {
68276         if (!arguments.length) return _iconName;
68277         _iconName = _;
68278         return flash;
68279     };
68280
68281     flash.iconClass = function(_) {
68282         if (!arguments.length) return _iconClass;
68283         _iconClass = _;
68284         return flash;
68285     };
68286
68287     return flash;
68288 }
68289
68290 function uiLasso(context) {
68291     var group, polygon;
68292
68293     lasso.coordinates = [];
68294
68295     function lasso(selection$$1) {
68296         context.container()
68297             .classed('lasso', true);
68298
68299         group = selection$$1
68300             .append('g')
68301             .attr('class', 'lasso hide');
68302
68303         polygon = group
68304             .append('path')
68305             .attr('class', 'lasso-path');
68306
68307         group
68308             .call(uiToggle(true));
68309     }
68310
68311
68312     function draw() {
68313         if (polygon) {
68314             polygon.data([lasso.coordinates])
68315                 .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
68316         }
68317     }
68318
68319
68320     lasso.extent = function () {
68321         return lasso.coordinates.reduce(function(extent, point$$1) {
68322             return extent.extend(geoExtent$$1(point$$1));
68323         }, geoExtent$$1());
68324     };
68325
68326
68327     lasso.p = function(_) {
68328         if (!arguments.length) return lasso;
68329         lasso.coordinates.push(_);
68330         draw();
68331         return lasso;
68332     };
68333
68334
68335     lasso.close = function() {
68336         if (group) {
68337             group.call(uiToggle(false, function() {
68338                 d3_select(this).remove();
68339             }));
68340         }
68341         context.container().classed('lasso', false);
68342     };
68343
68344
68345     return lasso;
68346 }
68347
68348 function uiRadialMenu(context, operations) {
68349     var menu,
68350         center = [0, 0],
68351         tooltip;
68352
68353
68354     var radialMenu = function(selection$$1) {
68355         if (!operations.length) return;
68356
68357         selection$$1.node().parentNode.focus();
68358
68359         function click(operation) {
68360             event.stopPropagation();
68361             if (operation.disabled()) return;
68362             operation();
68363             radialMenu.close();
68364         }
68365
68366         menu = selection$$1
68367             .append('g')
68368             .attr('class', 'radial-menu')
68369             .attr('transform', 'translate(' + center + ')')
68370             .attr('opacity', 0);
68371
68372         menu
68373             .transition()
68374             .attr('opacity', 1);
68375
68376         var r = 50,
68377             a = Math.PI / 4,
68378             a0 = -Math.PI / 4,
68379             a1 = a0 + (operations.length - 1) * a;
68380
68381         menu
68382             .append('path')
68383             .attr('class', 'radial-menu-background')
68384             .attr('d', 'M' + r * Math.sin(a0) + ',' +
68385                              r * Math.cos(a0) +
68386                       ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
68387                              (r * Math.sin(a1) + 1e-3) + ',' +
68388                              (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
68389             .attr('stroke-width', 50)
68390             .attr('stroke-linecap', 'round');
68391
68392         var button = menu.selectAll()
68393             .data(operations)
68394             .enter()
68395             .append('g')
68396             .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
68397             .classed('disabled', function(d) { return d.disabled(); })
68398             .attr('transform', function(d, i) {
68399                 return 'translate(' + geoVecFloor([
68400                         r * Math.sin(a0 + i * a),
68401                         r * Math.cos(a0 + i * a)]).join(',') + ')';
68402             });
68403
68404         button
68405             .append('circle')
68406             .attr('r', 15)
68407             .on('click', click)
68408             .on('mousedown', mousedown)
68409             .on('mouseover', mouseover)
68410             .on('mouseout', mouseout);
68411
68412         button
68413             .append('use')
68414             .attr('transform', 'translate(-10,-10)')
68415             .attr('width', '20')
68416             .attr('height', '20')
68417             .attr('xlink:href', function(d) { return '#operation-' + d.id; });
68418
68419         tooltip = d3_select(document.body)
68420             .append('div')
68421             .attr('class', 'tooltip-inner radial-menu-tooltip');
68422
68423         function mousedown() {
68424             event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
68425         }
68426
68427         function mouseover(d, i) {
68428             var rect = context.surfaceRect(),
68429                 angle = a0 + i * a,
68430                 top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px',
68431                 left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px',
68432                 bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px',
68433                 right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
68434
68435             tooltip
68436                 .style('top', null)
68437                 .style('left', null)
68438                 .style('bottom', null)
68439                 .style('right', null)
68440                 .style('display', 'block')
68441                 .html(uiTooltipHtml(d.tooltip(), d.keys[0]));
68442
68443             if (i === 0) {
68444                 tooltip
68445                     .style('right', right)
68446                     .style('top', top);
68447             } else if (i >= 4) {
68448                 tooltip
68449                     .style('left', left)
68450                     .style('bottom', bottom);
68451             } else {
68452                 tooltip
68453                     .style('left', left)
68454                     .style('top', top);
68455             }
68456         }
68457
68458         function mouseout() {
68459             tooltip.style('display', 'none');
68460         }
68461     };
68462
68463
68464     radialMenu.close = function() {
68465         if (menu) {
68466             menu
68467                 .style('pointer-events', 'none')
68468                 .transition()
68469                 .attr('opacity', 0)
68470                 .remove();
68471         }
68472
68473         if (tooltip) {
68474             tooltip.remove();
68475         }
68476     };
68477
68478
68479     radialMenu.center = function(_) {
68480         if (!arguments.length) return center;
68481         center = _;
68482         return radialMenu;
68483     };
68484
68485
68486     return radialMenu;
68487 }
68488
68489 function uiSelectionList(context, selectedIDs) {
68490
68491     function selectEntity(entity) {
68492         context.enter(modeSelect(context, [entity.id]));
68493     }
68494
68495
68496     function deselectEntity(entity) {
68497         event.stopPropagation();
68498         var index = selectedIDs.indexOf(entity.id);
68499         if (index > -1) {
68500             selectedIDs.splice(index, 1);
68501         }
68502         context.enter(modeSelect(context, selectedIDs));
68503     }
68504
68505
68506     function selectionList(selection$$1) {
68507         selection$$1.classed('selection-list-pane', true);
68508
68509         var header = selection$$1
68510             .append('div')
68511             .attr('class', 'header fillL cf');
68512
68513         header
68514             .append('h3')
68515             .text(t('inspector.multiselect'));
68516
68517         var listWrap = selection$$1
68518             .append('div')
68519             .attr('class', 'inspector-body');
68520
68521         var list = listWrap
68522             .append('div')
68523             .attr('class', 'feature-list cf');
68524
68525         context.history().on('change.selection-list', drawList);
68526         drawList();
68527
68528
68529         function drawList() {
68530             var entities = selectedIDs
68531                 .map(function(id) { return context.hasEntity(id); })
68532                 .filter(function(entity) { return entity; });
68533
68534             var items = list.selectAll('.feature-list-item')
68535                 .data(entities, osmEntity$$1.key);
68536
68537             items.exit()
68538                 .remove();
68539
68540             // Enter
68541             var enter = items.enter()
68542                 .append('div')
68543                 .attr('class', 'feature-list-item')
68544                 .on('click', selectEntity);
68545
68546             var label = enter
68547                 .append('button')
68548                 .attr('class', 'label');
68549
68550             enter
68551                 .append('button')
68552                 .attr('class', 'close')
68553                 .on('click', deselectEntity)
68554                 .call(svgIcon('#icon-close'));
68555
68556             label
68557                 .append('span')
68558                 .attr('class', 'entity-geom-icon')
68559                 .call(svgIcon('', 'pre-text'));
68560
68561             label
68562                 .append('span')
68563                 .attr('class', 'entity-type');
68564
68565             label
68566                 .append('span')
68567                 .attr('class', 'entity-name');
68568
68569             // Update
68570             items = items.merge(enter);
68571
68572             items.selectAll('.entity-geom-icon use')
68573                 .attr('href', function() {
68574                     var entity = this.parentNode.parentNode.__data__;
68575                     return '#icon-' + context.geometry(entity.id);
68576                 });
68577
68578             items.selectAll('.entity-type')
68579                 .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
68580
68581             items.selectAll('.entity-name')
68582                 .text(function(entity) { return utilDisplayName(entity); });
68583         }
68584     }
68585
68586     return selectionList;
68587 }
68588
68589 function uiSourceSwitch(context) {
68590     var keys;
68591
68592
68593     function click() {
68594         event.preventDefault();
68595
68596         var osm = context.connection();
68597         if (!osm) return;
68598
68599         if (context.inIntro()) return;
68600
68601         if (context.history().hasChanges() &&
68602             !window.confirm(t('source_switch.lose_changes'))) return;
68603
68604         var isLive = d3_select(this)
68605             .classed('live');
68606
68607         isLive = !isLive;
68608         context.enter(modeBrowse(context));
68609         context.history().clearSaved();          // remove saved history
68610         context.flush();                         // remove stored data
68611
68612         d3_select(this)
68613             .text(isLive ? t('source_switch.live') : t('source_switch.dev'))
68614             .classed('live', isLive);
68615
68616         osm.switch(isLive ? keys[0] : keys[1]);  // switch connection (warning: dispatches 'change' event)
68617     }
68618
68619     var sourceSwitch = function(selection$$1) {
68620         selection$$1
68621             .append('a')
68622             .attr('href', '#')
68623             .text(t('source_switch.live'))
68624             .classed('live', true)
68625             .attr('tabindex', -1)
68626             .on('click', click);
68627     };
68628
68629
68630     sourceSwitch.keys = function(_) {
68631         if (!arguments.length) return keys;
68632         keys = _;
68633         return sourceSwitch;
68634     };
68635
68636
68637     return sourceSwitch;
68638 }
68639
68640 function uiSuccess(context) {
68641     var dispatch$$1 = dispatch('cancel'),
68642         changeset;
68643
68644
68645     function success(selection$$1) {
68646         var header = selection$$1
68647             .append('div')
68648             .attr('class', 'header fillL');
68649
68650         header
68651             .append('button')
68652             .attr('class', 'fr')
68653             .on('click', function() { dispatch$$1.call('cancel'); })
68654             .call(svgIcon('#icon-close'));
68655
68656         header
68657             .append('h3')
68658             .text(t('success.just_edited'));
68659
68660         var body = selection$$1
68661             .append('div')
68662             .attr('class', 'body save-success fillL');
68663
68664         body
68665             .append('p')
68666             .html(t('success.help_html'));
68667
68668         body
68669             .append('a')
68670             .attr('class', 'details')
68671             .attr('target', '_blank')
68672             .attr('tabindex', -1)
68673             .call(svgIcon('#icon-out-link', 'inline'))
68674             .attr('href', t('success.help_link_url'))
68675             .append('span')
68676             .text(t('success.help_link_text'));
68677
68678         var osm = context.connection();
68679         if (!osm) return;
68680
68681         var changesetURL = osm.changesetURL(changeset.id);
68682
68683         var viewOnOsm = body
68684             .append('a')
68685             .attr('class', 'button col12 osm')
68686             .attr('target', '_blank')
68687             .attr('href', changesetURL);
68688
68689         viewOnOsm
68690             .append('svg')
68691             .attr('class', 'logo logo-osm')
68692             .append('use')
68693             .attr('xlink:href', '#logo-osm');
68694
68695         viewOnOsm
68696             .append('div')
68697             .text(t('success.view_on_osm'));
68698
68699         var message = (changeset.tags.comment || t('success.edited_osm')).substring(0, 130) +
68700             ' ' + changesetURL;
68701
68702         var sharing = [
68703             { key: 'facebook', value: 'https://facebook.com/sharer/sharer.php?u=' + encodeURIComponent(changesetURL) },
68704             { key: 'twitter', value: 'https://twitter.com/intent/tweet?source=webclient&text=' + encodeURIComponent(message) },
68705             { key: 'google', value: 'https://plus.google.com/share?url=' + encodeURIComponent(changesetURL) }
68706         ];
68707
68708         body.selectAll('.button.social')
68709             .data(sharing)
68710             .enter()
68711             .append('a')
68712             .attr('class', 'button social col4')
68713             .attr('target', '_blank')
68714             .attr('href', function(d) { return d.value; })
68715             .call(tooltip()
68716                 .title(function(d) { return t('success.' + d.key); })
68717                 .placement('bottom'))
68718             .each(function(d) { d3_select(this).call(svgIcon('#logo-' + d.key, 'social')); });
68719     }
68720
68721
68722     success.changeset = function(_) {
68723         if (!arguments.length) return changeset;
68724         changeset = _;
68725         return success;
68726     };
68727
68728
68729     return utilRebind(success, dispatch$$1, 'on');
68730 }
68731
68732 function coreHistory(context) {
68733     var imageryUsed = ['Bing'];
68734     var dispatch$$1 = dispatch('change', 'undone', 'redone');
68735     var lock = utilSessionMutex('lock');
68736     var duration = 150;
68737     var _checkpoints = {};
68738     var _stack;
68739     var _index;
68740     var _tree;
68741
68742
68743     // internal _act, accepts list of actions and eased time
68744     function _act(actions, t) {
68745         actions = Array.prototype.slice.call(actions);
68746
68747         var annotation;
68748         if (!isFunction(actions[actions.length - 1])) {
68749             annotation = actions.pop();
68750         }
68751
68752         _stack[_index].transform = context.projection.transform();
68753         _stack[_index].selectedIDs = context.selectedIDs();
68754
68755         var graph = _stack[_index].graph;
68756         for (var i = 0; i < actions.length; i++) {
68757             graph = actions[i](graph, t);
68758         }
68759
68760         return {
68761             graph: graph,
68762             annotation: annotation,
68763             imageryUsed: imageryUsed
68764         };
68765     }
68766
68767
68768     // internal _perform with eased time
68769     function _perform(args, t) {
68770         var previous = _stack[_index].graph;
68771         _stack = _stack.slice(0, _index + 1);
68772         _stack.push(_act(args, t));
68773         _index++;
68774         return change(previous);
68775     }
68776
68777
68778     // internal _replace with eased time
68779     function _replace(args, t) {
68780         var previous = _stack[_index].graph;
68781         // assert(_index == _stack.length - 1)
68782         _stack[_index] = _act(args, t);
68783         return change(previous);
68784     }
68785
68786
68787     // internal _overwrite with eased time
68788     function _overwrite(args, t) {
68789         var previous = _stack[_index].graph;
68790         if (_index > 0) {
68791             _index--;
68792             _stack.pop();
68793         }
68794         _stack = _stack.slice(0, _index + 1);
68795         _stack.push(_act(args, t));
68796         _index++;
68797         return change(previous);
68798     }
68799
68800
68801     // determine diffrence and dispatch a change event
68802     function change(previous) {
68803         var difference$$1 = coreDifference(previous, history.graph());
68804         dispatch$$1.call('change', this, difference$$1);
68805         return difference$$1;
68806     }
68807
68808
68809     // iD uses namespaced keys so multiple installations do not conflict
68810     function getKey(n) {
68811         return 'iD_' + window.location.origin + '_' + n;
68812     }
68813
68814
68815     var history = {
68816
68817         graph: function() {
68818             return _stack[_index].graph;
68819         },
68820
68821
68822         base: function() {
68823             return _stack[0].graph;
68824         },
68825
68826
68827         merge: function(entities, extent) {
68828             _stack[0].graph.rebase(entities, map$3(_stack, 'graph'), false);
68829             _tree.rebase(entities, false);
68830
68831             dispatch$$1.call('change', this, undefined, extent);
68832         },
68833
68834
68835         perform: function() {
68836             // complete any transition already in progress
68837             d3_select(document).interrupt('history.perform');
68838
68839             var transitionable = false;
68840             var action0 = arguments[0];
68841
68842             if (arguments.length === 1 ||
68843                 arguments.length === 2 && !isFunction(arguments[1])) {
68844                 transitionable = !!action0.transitionable;
68845             }
68846
68847             if (transitionable) {
68848                 var origArguments = arguments;
68849                 d3_select(document)
68850                     .transition('history.perform')
68851                     .duration(duration)
68852                     .ease(linear$1)
68853                     .tween('history.tween', function() {
68854                         return function(t) {
68855                             if (t < 1) _overwrite([action0], t);
68856                         };
68857                     })
68858                     .on('start', function() {
68859                         _perform([action0], 0);
68860                     })
68861                     .on('end interrupt', function() {
68862                         _overwrite(origArguments, 1);
68863                     });
68864
68865             } else {
68866                 return _perform(arguments);
68867             }
68868         },
68869
68870
68871         replace: function() {
68872             d3_select(document).interrupt('history.perform');
68873             return _replace(arguments, 1);
68874         },
68875
68876
68877         // Same as calling pop and then perform
68878         overwrite: function() {
68879             d3_select(document).interrupt('history.perform');
68880             return _overwrite(arguments, 1);
68881         },
68882
68883
68884         pop: function(n) {
68885             d3_select(document).interrupt('history.perform');
68886
68887             var previous = _stack[_index].graph;
68888             if (isNaN(+n) || +n < 0) {
68889                 n = 1;
68890             }
68891             while (n-- > 0 && _index > 0) {
68892                 _index--;
68893                 _stack.pop();
68894             }
68895             return change(previous);
68896         },
68897
68898
68899         // Back to the previous annotated state or _index = 0.
68900         undo: function() {
68901             d3_select(document).interrupt('history.perform');
68902
68903             var previous = _stack[_index].graph;
68904             while (_index > 0) {
68905                 _index--;
68906                 if (_stack[_index].annotation) break;
68907             }
68908
68909             dispatch$$1.call('undone', this, _stack[_index]);
68910             return change(previous);
68911         },
68912
68913
68914         // Forward to the next annotated state.
68915         redo: function() {
68916             d3_select(document).interrupt('history.perform');
68917
68918             var previous = _stack[_index].graph;
68919             var tryIndex = _index;
68920             while (tryIndex < _stack.length - 1) {
68921                 tryIndex++;
68922                 if (_stack[tryIndex].annotation) {
68923                     _index = tryIndex;
68924                     dispatch$$1.call('redone', this, _stack[_index]);
68925                     break;
68926                 }
68927             }
68928
68929             return change(previous);
68930         },
68931
68932
68933         undoAnnotation: function() {
68934             var i = _index;
68935             while (i >= 0) {
68936                 if (_stack[i].annotation) return _stack[i].annotation;
68937                 i--;
68938             }
68939         },
68940
68941
68942         redoAnnotation: function() {
68943             var i = _index + 1;
68944             while (i <= _stack.length - 1) {
68945                 if (_stack[i].annotation) return _stack[i].annotation;
68946                 i++;
68947             }
68948         },
68949
68950
68951         intersects: function(extent) {
68952             return _tree.intersects(extent, _stack[_index].graph);
68953         },
68954
68955
68956         difference: function() {
68957             var base = _stack[0].graph;
68958             var head = _stack[_index].graph;
68959             return coreDifference(base, head);
68960         },
68961
68962
68963         changes: function(action) {
68964             var base = _stack[0].graph;
68965             var head = _stack[_index].graph;
68966
68967             if (action) {
68968                 head = action(head);
68969             }
68970
68971             var difference$$1 = coreDifference(base, head);
68972
68973             return {
68974                 modified: difference$$1.modified(),
68975                 created: difference$$1.created(),
68976                 deleted: difference$$1.deleted()
68977             };
68978         },
68979
68980
68981         validate: function(changes) {
68982             return flatten(
68983                 map$3(Validations, function(fn) { return fn()(changes, _stack[_index].graph); })
68984             );
68985         },
68986
68987
68988         hasChanges: function() {
68989             return this.difference().length() > 0;
68990         },
68991
68992
68993         imageryUsed: function(sources) {
68994             if (sources) {
68995                 imageryUsed = sources;
68996                 return history;
68997             } else {
68998                 var arr = map$3(_stack.slice(1, _index + 1), 'imageryUsed');
68999                 return without(uniq(flatten(arr)), 'Custom');
69000             }
69001         },
69002
69003
69004         // save the current history state
69005         checkpoint: function(key) {
69006             _checkpoints[key] = {
69007                 stack: cloneDeep(_stack),
69008                 index: _index
69009             };
69010             return history;
69011         },
69012
69013
69014         // restore history state to a given checkpoint or reset completely
69015         reset: function(key) {
69016             if (key !== undefined && _checkpoints.hasOwnProperty(key)) {
69017                 _stack = cloneDeep(_checkpoints[key].stack);
69018                 _index = _checkpoints[key].index;
69019             } else {
69020                 _stack = [{graph: coreGraph$$1()}];
69021                 _index = 0;
69022                 _tree = coreTree(_stack[0].graph);
69023                 _checkpoints = {};
69024             }
69025             dispatch$$1.call('change');
69026             return history;
69027         },
69028
69029
69030         toIntroGraph: function() {
69031             var nextId = { n: 0, r: 0, w: 0 };
69032             var permIds = {};
69033             var graph = this.graph();
69034             var baseEntities = {};
69035
69036             // clone base entities..
69037             forEach(graph.base().entities, function(entity) {
69038                 var copy = cloneDeepWith(entity, customizer);
69039                 baseEntities[copy.id] = copy;
69040             });
69041
69042             // replace base entities with head entities..
69043             forEach(graph.entities, function(entity, id) {
69044                 if (entity) {
69045                     var copy = cloneDeepWith(entity, customizer);
69046                     baseEntities[copy.id] = copy;
69047                 } else {
69048                     delete baseEntities[id];
69049                 }
69050             });
69051
69052             // swap temporary for permanent ids..
69053             forEach(baseEntities, function(entity) {
69054                 if (Array.isArray(entity.nodes)) {
69055                     entity.nodes = entity.nodes.map(function(node) {
69056                         return permIds[node] || node;
69057                     });
69058                 }
69059                 if (Array.isArray(entity.members)) {
69060                     entity.members = entity.members.map(function(member) {
69061                         member.id = permIds[member.id] || member.id;
69062                         return member;
69063                     });
69064                 }
69065             });
69066
69067             return JSON.stringify({ dataIntroGraph: baseEntities });
69068
69069
69070             function customizer(src) {
69071                 var copy = omit(cloneDeep(src), ['type', 'user', 'v', 'version', 'visible']);
69072                 if (isEmpty(copy.tags)) {
69073                     delete copy.tags;
69074                 }
69075
69076                 if (Array.isArray(copy.loc)) {
69077                     copy.loc[0] = +copy.loc[0].toFixed(6);
69078                     copy.loc[1] = +copy.loc[1].toFixed(6);
69079                 }
69080
69081                 var match = src.id.match(/([nrw])-\d*/);  // temporary id
69082                 if (match !== null) {
69083                     var nrw = match[1], permId;
69084                     do { permId = nrw + (++nextId[nrw]); }
69085                     while (baseEntities.hasOwnProperty(permId));
69086
69087                     copy.id = permIds[src.id] = permId;
69088                 }
69089                 return copy;
69090             }
69091         },
69092
69093
69094         toJSON: function() {
69095             if (!this.hasChanges()) return;
69096
69097             var allEntities = {};
69098             var baseEntities = {};
69099             var base = _stack[0];
69100
69101             var s = _stack.map(function(i) {
69102                 var modified = [], deleted = [];
69103
69104                 forEach(i.graph.entities, function(entity, id) {
69105                     if (entity) {
69106                         var key = osmEntity$$1.key(entity);
69107                         allEntities[key] = entity;
69108                         modified.push(key);
69109                     } else {
69110                         deleted.push(id);
69111                     }
69112
69113                     // make sure that the originals of changed or deleted entities get merged
69114                     // into the base of the _stack after restoring the data from JSON.
69115                     if (id in base.graph.entities) {
69116                         baseEntities[id] = base.graph.entities[id];
69117                     }
69118                     // get originals of parent entities too
69119                     forEach(base.graph._parentWays[id], function(parentId) {
69120                         if (parentId in base.graph.entities) {
69121                             baseEntities[parentId] = base.graph.entities[parentId];
69122                         }
69123                     });
69124                 });
69125
69126                 var x = {};
69127
69128                 if (modified.length) x.modified = modified;
69129                 if (deleted.length) x.deleted = deleted;
69130                 if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
69131                 if (i.annotation) x.annotation = i.annotation;
69132
69133                 return x;
69134             });
69135
69136             return JSON.stringify({
69137                 version: 3,
69138                 entities: values$1(allEntities),
69139                 baseEntities: values$1(baseEntities),
69140                 stack: s,
69141                 nextIDs: osmEntity$$1.id.next,
69142                 index: _index
69143             });
69144         },
69145
69146
69147         fromJSON: function(json, loadChildNodes) {
69148             var h = JSON.parse(json);
69149             var loadComplete = true;
69150
69151             osmEntity$$1.id.next = h.nextIDs;
69152             _index = h.index;
69153
69154             if (h.version === 2 || h.version === 3) {
69155                 var allEntities = {};
69156
69157                 h.entities.forEach(function(entity) {
69158                     allEntities[osmEntity$$1.key(entity)] = osmEntity$$1(entity);
69159                 });
69160
69161                 if (h.version === 3) {
69162                     // This merges originals for changed entities into the base of
69163                     // the _stack even if the current _stack doesn't have them (for
69164                     // example when iD has been restarted in a different region)
69165                     var baseEntities = h.baseEntities.map(function(d) { return osmEntity$$1(d); });
69166                     _stack[0].graph.rebase(baseEntities, map$3(_stack, 'graph'), true);
69167                     _tree.rebase(baseEntities, true);
69168
69169                     // When we restore a modified way, we also need to fetch any missing
69170                     // childnodes that would normally have been downloaded with it.. #2142
69171                     if (loadChildNodes) {
69172                         var osm = context.connection();
69173                         var nodes = flatten(uniq(map$3(filter(baseEntities, { type: 'way' }), 'nodes')));
69174                         var missing = reject(nodes, function(n) { return _stack[0].graph.hasEntity(n); });
69175
69176                         if (!isEmpty(missing) && osm) {
69177                             loadComplete = false;
69178                             context.redrawEnable(false);
69179
69180                             var loading = uiLoading(context).blocking(true);
69181                             context.container().call(loading);
69182
69183                             var childNodesLoaded = function(err, result) {
69184                                 if (!err) {
69185                                     var visible = groupBy(result.data, 'visible');
69186                                     if (!isEmpty(visible.true)) {
69187                                         missing = difference(missing, map$3(visible.true, 'id'));
69188                                         _stack[0].graph.rebase(visible.true, map$3(_stack, 'graph'), true);
69189                                         _tree.rebase(visible.true, true);
69190                                     }
69191
69192                                     // fetch older versions of nodes that were deleted..
69193                                     forEach(visible.false, function(entity) {
69194                                         osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
69195                                     });
69196                                 }
69197
69198                                 if (err || isEmpty(missing)) {
69199                                     loading.close();
69200                                     context.redrawEnable(true);
69201                                     dispatch$$1.call('change');
69202                                 }
69203                             };
69204
69205                             osm.loadMultiple(missing, childNodesLoaded);
69206                         }
69207                     }
69208                 }
69209
69210                 _stack = h.stack.map(function(d) {
69211                     var entities = {}, entity;
69212
69213                     if (d.modified) {
69214                         d.modified.forEach(function(key) {
69215                             entity = allEntities[key];
69216                             entities[entity.id] = entity;
69217                         });
69218                     }
69219
69220                     if (d.deleted) {
69221                         d.deleted.forEach(function(id) {
69222                             entities[id] = undefined;
69223                         });
69224                     }
69225
69226                     return {
69227                         graph: coreGraph$$1(_stack[0].graph).load(entities),
69228                         annotation: d.annotation,
69229                         imageryUsed: d.imageryUsed
69230                     };
69231                 });
69232
69233             } else { // original version
69234                 _stack = h.stack.map(function(d) {
69235                     var entities = {};
69236
69237                     for (var i in d.entities) {
69238                         var entity = d.entities[i];
69239                         entities[i] = entity === 'undefined' ? undefined : osmEntity$$1(entity);
69240                     }
69241
69242                     d.graph = coreGraph$$1(_stack[0].graph).load(entities);
69243                     return d;
69244                 });
69245             }
69246
69247             if (loadComplete) {
69248                 dispatch$$1.call('change');
69249             }
69250
69251             return history;
69252         },
69253
69254
69255         save: function() {
69256             if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
69257             return history;
69258         },
69259
69260
69261         clearSaved: function() {
69262             context.debouncedSave.cancel();
69263             if (lock.locked()) context.storage(getKey('saved_history'), null);
69264             return history;
69265         },
69266
69267
69268         lock: function() {
69269             return lock.lock();
69270         },
69271
69272
69273         unlock: function() {
69274             lock.unlock();
69275         },
69276
69277
69278         // is iD not open in another window and it detects that
69279         // there's a history stored in localStorage that's recoverable?
69280         restorableChanges: function() {
69281             return lock.locked() && !!context.storage(getKey('saved_history'));
69282         },
69283
69284
69285         // load history from a version stored in localStorage
69286         restore: function() {
69287             if (!lock.locked()) return;
69288
69289             var json = context.storage(getKey('saved_history'));
69290             if (json) history.fromJSON(json, true);
69291         },
69292
69293
69294         _getKey: getKey
69295
69296     };
69297
69298
69299     history.reset();
69300
69301     return utilRebind(history, dispatch$$1, 'on');
69302 }
69303
69304 /** Used to store function metadata. */
69305 var metaMap = WeakMap && new WeakMap;
69306
69307 /**
69308  * The base implementation of `setData` without support for hot loop shorting.
69309  *
69310  * @private
69311  * @param {Function} func The function to associate metadata with.
69312  * @param {*} data The metadata.
69313  * @returns {Function} Returns `func`.
69314  */
69315 var baseSetData = !metaMap ? identity$8 : function(func, data) {
69316   metaMap.set(func, data);
69317   return func;
69318 };
69319
69320 /**
69321  * Creates a function that produces an instance of `Ctor` regardless of
69322  * whether it was invoked as part of a `new` expression or by `call` or `apply`.
69323  *
69324  * @private
69325  * @param {Function} Ctor The constructor to wrap.
69326  * @returns {Function} Returns the new wrapped function.
69327  */
69328 function createCtor(Ctor) {
69329   return function() {
69330     // Use a `switch` statement to work with class constructors. See
69331     // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
69332     // for more details.
69333     var args = arguments;
69334     switch (args.length) {
69335       case 0: return new Ctor;
69336       case 1: return new Ctor(args[0]);
69337       case 2: return new Ctor(args[0], args[1]);
69338       case 3: return new Ctor(args[0], args[1], args[2]);
69339       case 4: return new Ctor(args[0], args[1], args[2], args[3]);
69340       case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
69341       case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
69342       case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
69343     }
69344     var thisBinding = baseCreate(Ctor.prototype),
69345         result = Ctor.apply(thisBinding, args);
69346
69347     // Mimic the constructor's `return` behavior.
69348     // See https://es5.github.io/#x13.2.2 for more details.
69349     return isObject(result) ? result : thisBinding;
69350   };
69351 }
69352
69353 /** Used to compose bitmasks for function metadata. */
69354 var WRAP_BIND_FLAG = 1;
69355
69356 /**
69357  * Creates a function that wraps `func` to invoke it with the optional `this`
69358  * binding of `thisArg`.
69359  *
69360  * @private
69361  * @param {Function} func The function to wrap.
69362  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
69363  * @param {*} [thisArg] The `this` binding of `func`.
69364  * @returns {Function} Returns the new wrapped function.
69365  */
69366 function createBind(func, bitmask, thisArg) {
69367   var isBind = bitmask & WRAP_BIND_FLAG,
69368       Ctor = createCtor(func);
69369
69370   function wrapper() {
69371     var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
69372     return fn.apply(isBind ? thisArg : this, arguments);
69373   }
69374   return wrapper;
69375 }
69376
69377 /* Built-in method references for those with the same name as other `lodash` methods. */
69378 var nativeMax$5 = Math.max;
69379
69380 /**
69381  * Creates an array that is the composition of partially applied arguments,
69382  * placeholders, and provided arguments into a single array of arguments.
69383  *
69384  * @private
69385  * @param {Array} args The provided arguments.
69386  * @param {Array} partials The arguments to prepend to those provided.
69387  * @param {Array} holders The `partials` placeholder indexes.
69388  * @params {boolean} [isCurried] Specify composing for a curried function.
69389  * @returns {Array} Returns the new array of composed arguments.
69390  */
69391 function composeArgs(args, partials, holders, isCurried) {
69392   var argsIndex = -1,
69393       argsLength = args.length,
69394       holdersLength = holders.length,
69395       leftIndex = -1,
69396       leftLength = partials.length,
69397       rangeLength = nativeMax$5(argsLength - holdersLength, 0),
69398       result = Array(leftLength + rangeLength),
69399       isUncurried = !isCurried;
69400
69401   while (++leftIndex < leftLength) {
69402     result[leftIndex] = partials[leftIndex];
69403   }
69404   while (++argsIndex < holdersLength) {
69405     if (isUncurried || argsIndex < argsLength) {
69406       result[holders[argsIndex]] = args[argsIndex];
69407     }
69408   }
69409   while (rangeLength--) {
69410     result[leftIndex++] = args[argsIndex++];
69411   }
69412   return result;
69413 }
69414
69415 /* Built-in method references for those with the same name as other `lodash` methods. */
69416 var nativeMax$6 = Math.max;
69417
69418 /**
69419  * This function is like `composeArgs` except that the arguments composition
69420  * is tailored for `_.partialRight`.
69421  *
69422  * @private
69423  * @param {Array} args The provided arguments.
69424  * @param {Array} partials The arguments to append to those provided.
69425  * @param {Array} holders The `partials` placeholder indexes.
69426  * @params {boolean} [isCurried] Specify composing for a curried function.
69427  * @returns {Array} Returns the new array of composed arguments.
69428  */
69429 function composeArgsRight(args, partials, holders, isCurried) {
69430   var argsIndex = -1,
69431       argsLength = args.length,
69432       holdersIndex = -1,
69433       holdersLength = holders.length,
69434       rightIndex = -1,
69435       rightLength = partials.length,
69436       rangeLength = nativeMax$6(argsLength - holdersLength, 0),
69437       result = Array(rangeLength + rightLength),
69438       isUncurried = !isCurried;
69439
69440   while (++argsIndex < rangeLength) {
69441     result[argsIndex] = args[argsIndex];
69442   }
69443   var offset = argsIndex;
69444   while (++rightIndex < rightLength) {
69445     result[offset + rightIndex] = partials[rightIndex];
69446   }
69447   while (++holdersIndex < holdersLength) {
69448     if (isUncurried || argsIndex < argsLength) {
69449       result[offset + holders[holdersIndex]] = args[argsIndex++];
69450     }
69451   }
69452   return result;
69453 }
69454
69455 /**
69456  * Gets the number of `placeholder` occurrences in `array`.
69457  *
69458  * @private
69459  * @param {Array} array The array to inspect.
69460  * @param {*} placeholder The placeholder to search for.
69461  * @returns {number} Returns the placeholder count.
69462  */
69463 function countHolders(array, placeholder) {
69464   var length = array.length,
69465       result = 0;
69466
69467   while (length--) {
69468     if (array[length] === placeholder) {
69469       ++result;
69470     }
69471   }
69472   return result;
69473 }
69474
69475 /**
69476  * The function whose prototype chain sequence wrappers inherit from.
69477  *
69478  * @private
69479  */
69480 function baseLodash() {
69481   // No operation performed.
69482 }
69483
69484 /** Used as references for the maximum length and index of an array. */
69485 var MAX_ARRAY_LENGTH = 4294967295;
69486
69487 /**
69488  * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
69489  *
69490  * @private
69491  * @constructor
69492  * @param {*} value The value to wrap.
69493  */
69494 function LazyWrapper(value) {
69495   this.__wrapped__ = value;
69496   this.__actions__ = [];
69497   this.__dir__ = 1;
69498   this.__filtered__ = false;
69499   this.__iteratees__ = [];
69500   this.__takeCount__ = MAX_ARRAY_LENGTH;
69501   this.__views__ = [];
69502 }
69503
69504 // Ensure `LazyWrapper` is an instance of `baseLodash`.
69505 LazyWrapper.prototype = baseCreate(baseLodash.prototype);
69506 LazyWrapper.prototype.constructor = LazyWrapper;
69507
69508 /**
69509  * Gets metadata for `func`.
69510  *
69511  * @private
69512  * @param {Function} func The function to query.
69513  * @returns {*} Returns the metadata for `func`.
69514  */
69515 var getData = !metaMap ? noop$3 : function(func) {
69516   return metaMap.get(func);
69517 };
69518
69519 /** Used to lookup unminified function names. */
69520 var realNames = {};
69521
69522 /** Used for built-in method references. */
69523 var objectProto$20 = Object.prototype;
69524
69525 /** Used to check objects for own properties. */
69526 var hasOwnProperty$17 = objectProto$20.hasOwnProperty;
69527
69528 /**
69529  * Gets the name of `func`.
69530  *
69531  * @private
69532  * @param {Function} func The function to query.
69533  * @returns {string} Returns the function name.
69534  */
69535 function getFuncName(func) {
69536   var result = (func.name + ''),
69537       array = realNames[result],
69538       length = hasOwnProperty$17.call(realNames, result) ? array.length : 0;
69539
69540   while (length--) {
69541     var data = array[length],
69542         otherFunc = data.func;
69543     if (otherFunc == null || otherFunc == func) {
69544       return data.name;
69545     }
69546   }
69547   return result;
69548 }
69549
69550 /**
69551  * The base constructor for creating `lodash` wrapper objects.
69552  *
69553  * @private
69554  * @param {*} value The value to wrap.
69555  * @param {boolean} [chainAll] Enable explicit method chain sequences.
69556  */
69557 function LodashWrapper(value, chainAll) {
69558   this.__wrapped__ = value;
69559   this.__actions__ = [];
69560   this.__chain__ = !!chainAll;
69561   this.__index__ = 0;
69562   this.__values__ = undefined;
69563 }
69564
69565 LodashWrapper.prototype = baseCreate(baseLodash.prototype);
69566 LodashWrapper.prototype.constructor = LodashWrapper;
69567
69568 /**
69569  * Creates a clone of `wrapper`.
69570  *
69571  * @private
69572  * @param {Object} wrapper The wrapper to clone.
69573  * @returns {Object} Returns the cloned wrapper.
69574  */
69575 function wrapperClone(wrapper) {
69576   if (wrapper instanceof LazyWrapper) {
69577     return wrapper.clone();
69578   }
69579   var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
69580   result.__actions__ = copyArray(wrapper.__actions__);
69581   result.__index__  = wrapper.__index__;
69582   result.__values__ = wrapper.__values__;
69583   return result;
69584 }
69585
69586 /** Used for built-in method references. */
69587 var objectProto$21 = Object.prototype;
69588
69589 /** Used to check objects for own properties. */
69590 var hasOwnProperty$18 = objectProto$21.hasOwnProperty;
69591
69592 /**
69593  * Creates a `lodash` object which wraps `value` to enable implicit method
69594  * chain sequences. Methods that operate on and return arrays, collections,
69595  * and functions can be chained together. Methods that retrieve a single value
69596  * or may return a primitive value will automatically end the chain sequence
69597  * and return the unwrapped value. Otherwise, the value must be unwrapped
69598  * with `_#value`.
69599  *
69600  * Explicit chain sequences, which must be unwrapped with `_#value`, may be
69601  * enabled using `_.chain`.
69602  *
69603  * The execution of chained methods is lazy, that is, it's deferred until
69604  * `_#value` is implicitly or explicitly called.
69605  *
69606  * Lazy evaluation allows several methods to support shortcut fusion.
69607  * Shortcut fusion is an optimization to merge iteratee calls; this avoids
69608  * the creation of intermediate arrays and can greatly reduce the number of
69609  * iteratee executions. Sections of a chain sequence qualify for shortcut
69610  * fusion if the section is applied to an array and iteratees accept only
69611  * one argument. The heuristic for whether a section qualifies for shortcut
69612  * fusion is subject to change.
69613  *
69614  * Chaining is supported in custom builds as long as the `_#value` method is
69615  * directly or indirectly included in the build.
69616  *
69617  * In addition to lodash methods, wrappers have `Array` and `String` methods.
69618  *
69619  * The wrapper `Array` methods are:
69620  * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
69621  *
69622  * The wrapper `String` methods are:
69623  * `replace` and `split`
69624  *
69625  * The wrapper methods that support shortcut fusion are:
69626  * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
69627  * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
69628  * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
69629  *
69630  * The chainable wrapper methods are:
69631  * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
69632  * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
69633  * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
69634  * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
69635  * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
69636  * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
69637  * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
69638  * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
69639  * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
69640  * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
69641  * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
69642  * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
69643  * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
69644  * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
69645  * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
69646  * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
69647  * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
69648  * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
69649  * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
69650  * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
69651  * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
69652  * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
69653  * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
69654  * `zipObject`, `zipObjectDeep`, and `zipWith`
69655  *
69656  * The wrapper methods that are **not** chainable by default are:
69657  * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
69658  * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
69659  * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
69660  * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
69661  * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
69662  * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
69663  * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
69664  * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
69665  * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
69666  * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
69667  * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
69668  * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
69669  * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
69670  * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
69671  * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
69672  * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
69673  * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
69674  * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
69675  * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
69676  * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
69677  * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
69678  * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
69679  * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
69680  * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
69681  * `upperFirst`, `value`, and `words`
69682  *
69683  * @name _
69684  * @constructor
69685  * @category Seq
69686  * @param {*} value The value to wrap in a `lodash` instance.
69687  * @returns {Object} Returns the new `lodash` wrapper instance.
69688  * @example
69689  *
69690  * function square(n) {
69691  *   return n * n;
69692  * }
69693  *
69694  * var wrapped = _([1, 2, 3]);
69695  *
69696  * // Returns an unwrapped value.
69697  * wrapped.reduce(_.add);
69698  * // => 6
69699  *
69700  * // Returns a wrapped value.
69701  * var squares = wrapped.map(square);
69702  *
69703  * _.isArray(squares);
69704  * // => false
69705  *
69706  * _.isArray(squares.value());
69707  * // => true
69708  */
69709 function lodash(value) {
69710   if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
69711     if (value instanceof LodashWrapper) {
69712       return value;
69713     }
69714     if (hasOwnProperty$18.call(value, '__wrapped__')) {
69715       return wrapperClone(value);
69716     }
69717   }
69718   return new LodashWrapper(value);
69719 }
69720
69721 // Ensure wrappers are instances of `baseLodash`.
69722 lodash.prototype = baseLodash.prototype;
69723 lodash.prototype.constructor = lodash;
69724
69725 /**
69726  * Checks if `func` has a lazy counterpart.
69727  *
69728  * @private
69729  * @param {Function} func The function to check.
69730  * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
69731  *  else `false`.
69732  */
69733 function isLaziable(func) {
69734   var funcName = getFuncName(func),
69735       other = lodash[funcName];
69736
69737   if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
69738     return false;
69739   }
69740   if (func === other) {
69741     return true;
69742   }
69743   var data = getData(other);
69744   return !!data && func === data[0];
69745 }
69746
69747 /**
69748  * Sets metadata for `func`.
69749  *
69750  * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
69751  * period of time, it will trip its breaker and transition to an identity
69752  * function to avoid garbage collection pauses in V8. See
69753  * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
69754  * for more details.
69755  *
69756  * @private
69757  * @param {Function} func The function to associate metadata with.
69758  * @param {*} data The metadata.
69759  * @returns {Function} Returns `func`.
69760  */
69761 var setData = shortOut(baseSetData);
69762
69763 /** Used to match wrap detail comments. */
69764 var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
69765     reSplitDetails = /,? & /;
69766
69767 /**
69768  * Extracts wrapper details from the `source` body comment.
69769  *
69770  * @private
69771  * @param {string} source The source to inspect.
69772  * @returns {Array} Returns the wrapper details.
69773  */
69774 function getWrapDetails(source) {
69775   var match = source.match(reWrapDetails);
69776   return match ? match[1].split(reSplitDetails) : [];
69777 }
69778
69779 /** Used to match wrap detail comments. */
69780 var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;
69781
69782 /**
69783  * Inserts wrapper `details` in a comment at the top of the `source` body.
69784  *
69785  * @private
69786  * @param {string} source The source to modify.
69787  * @returns {Array} details The details to insert.
69788  * @returns {string} Returns the modified source.
69789  */
69790 function insertWrapDetails(source, details) {
69791   var length = details.length;
69792   if (!length) {
69793     return source;
69794   }
69795   var lastIndex = length - 1;
69796   details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
69797   details = details.join(length > 2 ? ', ' : ' ');
69798   return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
69799 }
69800
69801 /** Used to compose bitmasks for function metadata. */
69802 var WRAP_BIND_FLAG$1 = 1,
69803     WRAP_BIND_KEY_FLAG = 2,
69804     WRAP_CURRY_FLAG = 8,
69805     WRAP_CURRY_RIGHT_FLAG = 16,
69806     WRAP_PARTIAL_FLAG = 32,
69807     WRAP_PARTIAL_RIGHT_FLAG = 64,
69808     WRAP_ARY_FLAG = 128,
69809     WRAP_REARG_FLAG = 256,
69810     WRAP_FLIP_FLAG = 512;
69811
69812 /** Used to associate wrap methods with their bit flags. */
69813 var wrapFlags = [
69814   ['ary', WRAP_ARY_FLAG],
69815   ['bind', WRAP_BIND_FLAG$1],
69816   ['bindKey', WRAP_BIND_KEY_FLAG],
69817   ['curry', WRAP_CURRY_FLAG],
69818   ['curryRight', WRAP_CURRY_RIGHT_FLAG],
69819   ['flip', WRAP_FLIP_FLAG],
69820   ['partial', WRAP_PARTIAL_FLAG],
69821   ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
69822   ['rearg', WRAP_REARG_FLAG]
69823 ];
69824
69825 /**
69826  * Updates wrapper `details` based on `bitmask` flags.
69827  *
69828  * @private
69829  * @returns {Array} details The details to modify.
69830  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
69831  * @returns {Array} Returns `details`.
69832  */
69833 function updateWrapDetails(details, bitmask) {
69834   arrayEach(wrapFlags, function(pair) {
69835     var value = '_.' + pair[0];
69836     if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
69837       details.push(value);
69838     }
69839   });
69840   return details.sort();
69841 }
69842
69843 /**
69844  * Sets the `toString` method of `wrapper` to mimic the source of `reference`
69845  * with wrapper details in a comment at the top of the source body.
69846  *
69847  * @private
69848  * @param {Function} wrapper The function to modify.
69849  * @param {Function} reference The reference function.
69850  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
69851  * @returns {Function} Returns `wrapper`.
69852  */
69853 function setWrapToString(wrapper, reference, bitmask) {
69854   var source = (reference + '');
69855   return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
69856 }
69857
69858 /** Used to compose bitmasks for function metadata. */
69859 var WRAP_BIND_FLAG$2 = 1,
69860     WRAP_BIND_KEY_FLAG$1 = 2,
69861     WRAP_CURRY_BOUND_FLAG = 4,
69862     WRAP_CURRY_FLAG$1 = 8,
69863     WRAP_PARTIAL_FLAG$1 = 32,
69864     WRAP_PARTIAL_RIGHT_FLAG$1 = 64;
69865
69866 /**
69867  * Creates a function that wraps `func` to continue currying.
69868  *
69869  * @private
69870  * @param {Function} func The function to wrap.
69871  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
69872  * @param {Function} wrapFunc The function to create the `func` wrapper.
69873  * @param {*} placeholder The placeholder value.
69874  * @param {*} [thisArg] The `this` binding of `func`.
69875  * @param {Array} [partials] The arguments to prepend to those provided to
69876  *  the new function.
69877  * @param {Array} [holders] The `partials` placeholder indexes.
69878  * @param {Array} [argPos] The argument positions of the new function.
69879  * @param {number} [ary] The arity cap of `func`.
69880  * @param {number} [arity] The arity of `func`.
69881  * @returns {Function} Returns the new wrapped function.
69882  */
69883 function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
69884   var isCurry = bitmask & WRAP_CURRY_FLAG$1,
69885       newHolders = isCurry ? holders : undefined,
69886       newHoldersRight = isCurry ? undefined : holders,
69887       newPartials = isCurry ? partials : undefined,
69888       newPartialsRight = isCurry ? undefined : partials;
69889
69890   bitmask |= (isCurry ? WRAP_PARTIAL_FLAG$1 : WRAP_PARTIAL_RIGHT_FLAG$1);
69891   bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG$1 : WRAP_PARTIAL_FLAG$1);
69892
69893   if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
69894     bitmask &= ~(WRAP_BIND_FLAG$2 | WRAP_BIND_KEY_FLAG$1);
69895   }
69896   var newData = [
69897     func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
69898     newHoldersRight, argPos, ary, arity
69899   ];
69900
69901   var result = wrapFunc.apply(undefined, newData);
69902   if (isLaziable(func)) {
69903     setData(result, newData);
69904   }
69905   result.placeholder = placeholder;
69906   return setWrapToString(result, func, bitmask);
69907 }
69908
69909 /**
69910  * Gets the argument placeholder value for `func`.
69911  *
69912  * @private
69913  * @param {Function} func The function to inspect.
69914  * @returns {*} Returns the placeholder value.
69915  */
69916 function getHolder(func) {
69917   var object = func;
69918   return object.placeholder;
69919 }
69920
69921 /* Built-in method references for those with the same name as other `lodash` methods. */
69922 var nativeMin$2 = Math.min;
69923
69924 /**
69925  * Reorder `array` according to the specified indexes where the element at
69926  * the first index is assigned as the first element, the element at
69927  * the second index is assigned as the second element, and so on.
69928  *
69929  * @private
69930  * @param {Array} array The array to reorder.
69931  * @param {Array} indexes The arranged array indexes.
69932  * @returns {Array} Returns `array`.
69933  */
69934 function reorder(array, indexes) {
69935   var arrLength = array.length,
69936       length = nativeMin$2(indexes.length, arrLength),
69937       oldArray = copyArray(array);
69938
69939   while (length--) {
69940     var index = indexes[length];
69941     array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
69942   }
69943   return array;
69944 }
69945
69946 /** Used as the internal argument placeholder. */
69947 var PLACEHOLDER = '__lodash_placeholder__';
69948
69949 /**
69950  * Replaces all `placeholder` elements in `array` with an internal placeholder
69951  * and returns an array of their indexes.
69952  *
69953  * @private
69954  * @param {Array} array The array to modify.
69955  * @param {*} placeholder The placeholder to replace.
69956  * @returns {Array} Returns the new array of placeholder indexes.
69957  */
69958 function replaceHolders(array, placeholder) {
69959   var index = -1,
69960       length = array.length,
69961       resIndex = 0,
69962       result = [];
69963
69964   while (++index < length) {
69965     var value = array[index];
69966     if (value === placeholder || value === PLACEHOLDER) {
69967       array[index] = PLACEHOLDER;
69968       result[resIndex++] = index;
69969     }
69970   }
69971   return result;
69972 }
69973
69974 /** Used to compose bitmasks for function metadata. */
69975 var WRAP_BIND_FLAG$3 = 1,
69976     WRAP_BIND_KEY_FLAG$2 = 2,
69977     WRAP_CURRY_FLAG$2 = 8,
69978     WRAP_CURRY_RIGHT_FLAG$1 = 16,
69979     WRAP_ARY_FLAG$1 = 128,
69980     WRAP_FLIP_FLAG$1 = 512;
69981
69982 /**
69983  * Creates a function that wraps `func` to invoke it with optional `this`
69984  * binding of `thisArg`, partial application, and currying.
69985  *
69986  * @private
69987  * @param {Function|string} func The function or method name to wrap.
69988  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
69989  * @param {*} [thisArg] The `this` binding of `func`.
69990  * @param {Array} [partials] The arguments to prepend to those provided to
69991  *  the new function.
69992  * @param {Array} [holders] The `partials` placeholder indexes.
69993  * @param {Array} [partialsRight] The arguments to append to those provided
69994  *  to the new function.
69995  * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
69996  * @param {Array} [argPos] The argument positions of the new function.
69997  * @param {number} [ary] The arity cap of `func`.
69998  * @param {number} [arity] The arity of `func`.
69999  * @returns {Function} Returns the new wrapped function.
70000  */
70001 function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
70002   var isAry = bitmask & WRAP_ARY_FLAG$1,
70003       isBind = bitmask & WRAP_BIND_FLAG$3,
70004       isBindKey = bitmask & WRAP_BIND_KEY_FLAG$2,
70005       isCurried = bitmask & (WRAP_CURRY_FLAG$2 | WRAP_CURRY_RIGHT_FLAG$1),
70006       isFlip = bitmask & WRAP_FLIP_FLAG$1,
70007       Ctor = isBindKey ? undefined : createCtor(func);
70008
70009   function wrapper() {
70010     var length = arguments.length,
70011         args = Array(length),
70012         index = length;
70013
70014     while (index--) {
70015       args[index] = arguments[index];
70016     }
70017     if (isCurried) {
70018       var placeholder = getHolder(wrapper),
70019           holdersCount = countHolders(args, placeholder);
70020     }
70021     if (partials) {
70022       args = composeArgs(args, partials, holders, isCurried);
70023     }
70024     if (partialsRight) {
70025       args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
70026     }
70027     length -= holdersCount;
70028     if (isCurried && length < arity) {
70029       var newHolders = replaceHolders(args, placeholder);
70030       return createRecurry(
70031         func, bitmask, createHybrid, wrapper.placeholder, thisArg,
70032         args, newHolders, argPos, ary, arity - length
70033       );
70034     }
70035     var thisBinding = isBind ? thisArg : this,
70036         fn = isBindKey ? thisBinding[func] : func;
70037
70038     length = args.length;
70039     if (argPos) {
70040       args = reorder(args, argPos);
70041     } else if (isFlip && length > 1) {
70042       args.reverse();
70043     }
70044     if (isAry && ary < length) {
70045       args.length = ary;
70046     }
70047     if (this && this !== root$2 && this instanceof wrapper) {
70048       fn = Ctor || createCtor(fn);
70049     }
70050     return fn.apply(thisBinding, args);
70051   }
70052   return wrapper;
70053 }
70054
70055 /**
70056  * Creates a function that wraps `func` to enable currying.
70057  *
70058  * @private
70059  * @param {Function} func The function to wrap.
70060  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
70061  * @param {number} arity The arity of `func`.
70062  * @returns {Function} Returns the new wrapped function.
70063  */
70064 function createCurry(func, bitmask, arity) {
70065   var Ctor = createCtor(func);
70066
70067   function wrapper() {
70068     var length = arguments.length,
70069         args = Array(length),
70070         index = length,
70071         placeholder = getHolder(wrapper);
70072
70073     while (index--) {
70074       args[index] = arguments[index];
70075     }
70076     var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
70077       ? []
70078       : replaceHolders(args, placeholder);
70079
70080     length -= holders.length;
70081     if (length < arity) {
70082       return createRecurry(
70083         func, bitmask, createHybrid, wrapper.placeholder, undefined,
70084         args, holders, undefined, undefined, arity - length);
70085     }
70086     var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
70087     return apply(fn, this, args);
70088   }
70089   return wrapper;
70090 }
70091
70092 /** Used to compose bitmasks for function metadata. */
70093 var WRAP_BIND_FLAG$4 = 1;
70094
70095 /**
70096  * Creates a function that wraps `func` to invoke it with the `this` binding
70097  * of `thisArg` and `partials` prepended to the arguments it receives.
70098  *
70099  * @private
70100  * @param {Function} func The function to wrap.
70101  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
70102  * @param {*} thisArg The `this` binding of `func`.
70103  * @param {Array} partials The arguments to prepend to those provided to
70104  *  the new function.
70105  * @returns {Function} Returns the new wrapped function.
70106  */
70107 function createPartial(func, bitmask, thisArg, partials) {
70108   var isBind = bitmask & WRAP_BIND_FLAG$4,
70109       Ctor = createCtor(func);
70110
70111   function wrapper() {
70112     var argsIndex = -1,
70113         argsLength = arguments.length,
70114         leftIndex = -1,
70115         leftLength = partials.length,
70116         args = Array(leftLength + argsLength),
70117         fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
70118
70119     while (++leftIndex < leftLength) {
70120       args[leftIndex] = partials[leftIndex];
70121     }
70122     while (argsLength--) {
70123       args[leftIndex++] = arguments[++argsIndex];
70124     }
70125     return apply(fn, isBind ? thisArg : this, args);
70126   }
70127   return wrapper;
70128 }
70129
70130 /** Used as the internal argument placeholder. */
70131 var PLACEHOLDER$1 = '__lodash_placeholder__';
70132
70133 /** Used to compose bitmasks for function metadata. */
70134 var WRAP_BIND_FLAG$5 = 1,
70135     WRAP_BIND_KEY_FLAG$3 = 2,
70136     WRAP_CURRY_BOUND_FLAG$1 = 4,
70137     WRAP_CURRY_FLAG$3 = 8,
70138     WRAP_ARY_FLAG$2 = 128,
70139     WRAP_REARG_FLAG$1 = 256;
70140
70141 /* Built-in method references for those with the same name as other `lodash` methods. */
70142 var nativeMin$3 = Math.min;
70143
70144 /**
70145  * Merges the function metadata of `source` into `data`.
70146  *
70147  * Merging metadata reduces the number of wrappers used to invoke a function.
70148  * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
70149  * may be applied regardless of execution order. Methods like `_.ary` and
70150  * `_.rearg` modify function arguments, making the order in which they are
70151  * executed important, preventing the merging of metadata. However, we make
70152  * an exception for a safe combined case where curried functions have `_.ary`
70153  * and or `_.rearg` applied.
70154  *
70155  * @private
70156  * @param {Array} data The destination metadata.
70157  * @param {Array} source The source metadata.
70158  * @returns {Array} Returns `data`.
70159  */
70160 function mergeData(data, source) {
70161   var bitmask = data[1],
70162       srcBitmask = source[1],
70163       newBitmask = bitmask | srcBitmask,
70164       isCommon = newBitmask < (WRAP_BIND_FLAG$5 | WRAP_BIND_KEY_FLAG$3 | WRAP_ARY_FLAG$2);
70165
70166   var isCombo =
70167     ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_CURRY_FLAG$3)) ||
70168     ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_REARG_FLAG$1) && (data[7].length <= source[8])) ||
70169     ((srcBitmask == (WRAP_ARY_FLAG$2 | WRAP_REARG_FLAG$1)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG$3));
70170
70171   // Exit early if metadata can't be merged.
70172   if (!(isCommon || isCombo)) {
70173     return data;
70174   }
70175   // Use source `thisArg` if available.
70176   if (srcBitmask & WRAP_BIND_FLAG$5) {
70177     data[2] = source[2];
70178     // Set when currying a bound function.
70179     newBitmask |= bitmask & WRAP_BIND_FLAG$5 ? 0 : WRAP_CURRY_BOUND_FLAG$1;
70180   }
70181   // Compose partial arguments.
70182   var value = source[3];
70183   if (value) {
70184     var partials = data[3];
70185     data[3] = partials ? composeArgs(partials, value, source[4]) : value;
70186     data[4] = partials ? replaceHolders(data[3], PLACEHOLDER$1) : source[4];
70187   }
70188   // Compose partial right arguments.
70189   value = source[5];
70190   if (value) {
70191     partials = data[5];
70192     data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
70193     data[6] = partials ? replaceHolders(data[5], PLACEHOLDER$1) : source[6];
70194   }
70195   // Use source `argPos` if available.
70196   value = source[7];
70197   if (value) {
70198     data[7] = value;
70199   }
70200   // Use source `ary` if it's smaller.
70201   if (srcBitmask & WRAP_ARY_FLAG$2) {
70202     data[8] = data[8] == null ? source[8] : nativeMin$3(data[8], source[8]);
70203   }
70204   // Use source `arity` if one is not provided.
70205   if (data[9] == null) {
70206     data[9] = source[9];
70207   }
70208   // Use source `func` and merge bitmasks.
70209   data[0] = source[0];
70210   data[1] = newBitmask;
70211
70212   return data;
70213 }
70214
70215 /** Error message constants. */
70216 var FUNC_ERROR_TEXT$4 = 'Expected a function';
70217
70218 /** Used to compose bitmasks for function metadata. */
70219 var WRAP_BIND_FLAG$6 = 1,
70220     WRAP_BIND_KEY_FLAG$4 = 2,
70221     WRAP_CURRY_FLAG$4 = 8,
70222     WRAP_CURRY_RIGHT_FLAG$2 = 16,
70223     WRAP_PARTIAL_FLAG$2 = 32,
70224     WRAP_PARTIAL_RIGHT_FLAG$2 = 64;
70225
70226 /* Built-in method references for those with the same name as other `lodash` methods. */
70227 var nativeMax$7 = Math.max;
70228
70229 /**
70230  * Creates a function that either curries or invokes `func` with optional
70231  * `this` binding and partially applied arguments.
70232  *
70233  * @private
70234  * @param {Function|string} func The function or method name to wrap.
70235  * @param {number} bitmask The bitmask flags.
70236  *    1 - `_.bind`
70237  *    2 - `_.bindKey`
70238  *    4 - `_.curry` or `_.curryRight` of a bound function
70239  *    8 - `_.curry`
70240  *   16 - `_.curryRight`
70241  *   32 - `_.partial`
70242  *   64 - `_.partialRight`
70243  *  128 - `_.rearg`
70244  *  256 - `_.ary`
70245  *  512 - `_.flip`
70246  * @param {*} [thisArg] The `this` binding of `func`.
70247  * @param {Array} [partials] The arguments to be partially applied.
70248  * @param {Array} [holders] The `partials` placeholder indexes.
70249  * @param {Array} [argPos] The argument positions of the new function.
70250  * @param {number} [ary] The arity cap of `func`.
70251  * @param {number} [arity] The arity of `func`.
70252  * @returns {Function} Returns the new wrapped function.
70253  */
70254 function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
70255   var isBindKey = bitmask & WRAP_BIND_KEY_FLAG$4;
70256   if (!isBindKey && typeof func != 'function') {
70257     throw new TypeError(FUNC_ERROR_TEXT$4);
70258   }
70259   var length = partials ? partials.length : 0;
70260   if (!length) {
70261     bitmask &= ~(WRAP_PARTIAL_FLAG$2 | WRAP_PARTIAL_RIGHT_FLAG$2);
70262     partials = holders = undefined;
70263   }
70264   ary = ary === undefined ? ary : nativeMax$7(toInteger(ary), 0);
70265   arity = arity === undefined ? arity : toInteger(arity);
70266   length -= holders ? holders.length : 0;
70267
70268   if (bitmask & WRAP_PARTIAL_RIGHT_FLAG$2) {
70269     var partialsRight = partials,
70270         holdersRight = holders;
70271
70272     partials = holders = undefined;
70273   }
70274   var data = isBindKey ? undefined : getData(func);
70275
70276   var newData = [
70277     func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
70278     argPos, ary, arity
70279   ];
70280
70281   if (data) {
70282     mergeData(newData, data);
70283   }
70284   func = newData[0];
70285   bitmask = newData[1];
70286   thisArg = newData[2];
70287   partials = newData[3];
70288   holders = newData[4];
70289   arity = newData[9] = newData[9] === undefined
70290     ? (isBindKey ? 0 : func.length)
70291     : nativeMax$7(newData[9] - length, 0);
70292
70293   if (!arity && bitmask & (WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2)) {
70294     bitmask &= ~(WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2);
70295   }
70296   if (!bitmask || bitmask == WRAP_BIND_FLAG$6) {
70297     var result = createBind(func, bitmask, thisArg);
70298   } else if (bitmask == WRAP_CURRY_FLAG$4 || bitmask == WRAP_CURRY_RIGHT_FLAG$2) {
70299     result = createCurry(func, bitmask, arity);
70300   } else if ((bitmask == WRAP_PARTIAL_FLAG$2 || bitmask == (WRAP_BIND_FLAG$6 | WRAP_PARTIAL_FLAG$2)) && !holders.length) {
70301     result = createPartial(func, bitmask, thisArg, partials);
70302   } else {
70303     result = createHybrid.apply(undefined, newData);
70304   }
70305   var setter = data ? baseSetData : setData;
70306   return setWrapToString(setter(result, newData), func, bitmask);
70307 }
70308
70309 /** Used to compose bitmasks for function metadata. */
70310 var WRAP_BIND_FLAG$7 = 1,
70311     WRAP_PARTIAL_FLAG$3 = 32;
70312
70313 /**
70314  * Creates a function that invokes `func` with the `this` binding of `thisArg`
70315  * and `partials` prepended to the arguments it receives.
70316  *
70317  * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
70318  * may be used as a placeholder for partially applied arguments.
70319  *
70320  * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
70321  * property of bound functions.
70322  *
70323  * @static
70324  * @memberOf _
70325  * @since 0.1.0
70326  * @category Function
70327  * @param {Function} func The function to bind.
70328  * @param {*} thisArg The `this` binding of `func`.
70329  * @param {...*} [partials] The arguments to be partially applied.
70330  * @returns {Function} Returns the new bound function.
70331  * @example
70332  *
70333  * function greet(greeting, punctuation) {
70334  *   return greeting + ' ' + this.user + punctuation;
70335  * }
70336  *
70337  * var object = { 'user': 'fred' };
70338  *
70339  * var bound = _.bind(greet, object, 'hi');
70340  * bound('!');
70341  * // => 'hi fred!'
70342  *
70343  * // Bound with placeholders.
70344  * var bound = _.bind(greet, object, _, '!');
70345  * bound('hi');
70346  * // => 'hi fred!'
70347  */
70348 var bind$2 = baseRest(function(func, thisArg, partials) {
70349   var bitmask = WRAP_BIND_FLAG$7;
70350   if (partials.length) {
70351     var holders = replaceHolders(partials, getHolder(bind$2));
70352     bitmask |= WRAP_PARTIAL_FLAG$3;
70353   }
70354   return createWrap(func, bitmask, thisArg, partials, holders);
70355 });
70356
70357 // Assign default placeholders.
70358 bind$2.placeholder = {};
70359
70360 function presetCollection(collection) {
70361     var maxSearchResults = 50,
70362         maxSuggestionResults = 10;
70363
70364     var presets = {
70365
70366         collection: collection,
70367
70368
70369         item: function(id) {
70370             return find$1(this.collection, function(d) {
70371                 return d.id === id;
70372             });
70373         },
70374
70375
70376         matchGeometry: function(geometry) {
70377             return presetCollection(this.collection.filter(function(d) {
70378                 return d.matchGeometry(geometry);
70379             }));
70380         },
70381
70382
70383         search: function(value, geometry) {
70384             if (!value) return this;
70385
70386             function leading(a) {
70387                 var index = a.indexOf(value);
70388                 return index === 0 || a[index - 1] === ' ';
70389             }
70390
70391             function suggestionName(name) {
70392                 var nameArray = name.split(' - ');
70393                 if (nameArray.length > 1) {
70394                     name = nameArray.slice(0, nameArray.length - 1).join(' - ');
70395                 }
70396                 return name.toLowerCase();
70397             }
70398
70399
70400             value = value.toLowerCase();
70401
70402             var searchable = filter(this.collection, function(a) {
70403                     return a.searchable !== false && a.suggestion !== true;
70404                 }),
70405                 suggestions = filter(this.collection, function(a) {
70406                     return a.suggestion === true;
70407                 });
70408
70409
70410             // matches value to preset.name
70411             var leading_name = filter(searchable, function(a) {
70412                     return leading(a.name().toLowerCase());
70413                 }).sort(function(a, b) {
70414                     var aCompare = a.name().toLowerCase(),
70415                         bCompare = b.name().toLowerCase(),
70416                         i;
70417
70418                     // priority if search string matches preset name exactly - #4325
70419                     if (value === aCompare) return -1;
70420                     if (value === bCompare) return 1;
70421
70422                     // priority for higher matchScore
70423                     i = b.originalScore - a.originalScore;
70424                     if (i !== 0) return i;
70425
70426                     // priority if search string appears earlier in preset name
70427                     i = aCompare.indexOf(value) - bCompare.indexOf(value);
70428                     if (i !== 0) return i;
70429
70430                     // priority for shorter preset names
70431                     return a.name().length - b.name().length;
70432                 });
70433
70434             // matches value to preset.terms values
70435             var leading_terms = filter(searchable, function(a) {
70436                     return some(a.terms() || [], leading);
70437                 });
70438
70439             // matches value to preset.tags values
70440             var leading_tag_values = filter(searchable, function(a) {
70441                     return some(without(values$1(a.tags || {}), '*'), leading);
70442                 });
70443
70444
70445             // finds close matches to value in preset.name
70446             var similar_name = searchable.map(function(a) {
70447                     return {
70448                         preset: a,
70449                         dist: utilEditDistance(value, a.name())
70450                     };
70451                 }).filter(function(a) {
70452                     return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
70453                 }).sort(function(a, b) {
70454                     return a.dist - b.dist;
70455                 }).map(function(a) {
70456                     return a.preset;
70457                 });
70458
70459             // finds close matches to value in preset.terms
70460             var similar_terms = filter(searchable, function(a) {
70461                     return some(a.terms() || [], function(b) {
70462                         return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
70463                     });
70464                 });
70465
70466             var leading_suggestions = filter(suggestions, function(a) {
70467                     return leading(suggestionName(a.name()));
70468                 }).sort(function(a, b) {
70469                     a = suggestionName(a.name());
70470                     b = suggestionName(b.name());
70471                     var i = a.indexOf(value) - b.indexOf(value);
70472                     if (i === 0) return a.length - b.length;
70473                     else return i;
70474                 });
70475
70476             var similar_suggestions = suggestions.map(function(a) {
70477                     return {
70478                         preset: a,
70479                         dist: utilEditDistance(value, suggestionName(a.name()))
70480                     };
70481                 }).filter(function(a) {
70482                     return a.dist + Math.min(value.length - suggestionName(a.preset.name()).length, 0) < 1;
70483                 }).sort(function(a, b) {
70484                     return a.dist - b.dist;
70485                 }).map(function(a) {
70486                     return a.preset;
70487                 });
70488
70489             var other = presets.item(geometry);
70490
70491             var results = leading_name.concat(
70492                     leading_terms,
70493                     leading_tag_values,
70494                     leading_suggestions.slice(0, maxSuggestionResults + 5),
70495                     similar_name,
70496                     similar_terms,
70497                     similar_suggestions.slice(0, maxSuggestionResults)
70498                 ).slice(0, maxSearchResults - 1);
70499
70500             return presetCollection(uniq(results.concat(other)));
70501         }
70502     };
70503
70504
70505     return presets;
70506 }
70507
70508 function presetCategory(id, category, all) {
70509     category = clone(category);
70510
70511     category.id = id;
70512
70513
70514     category.members = presetCollection(category.members.map(function(id) {
70515         return all.item(id);
70516     }));
70517
70518
70519     category.matchGeometry = function(geometry) {
70520         return category.geometry.indexOf(geometry) >= 0;
70521     };
70522
70523
70524     category.matchScore = function() {
70525         return -1;
70526     };
70527
70528
70529     category.name = function() {
70530         return t('presets.categories.' + id + '.name', {'default': id});
70531     };
70532
70533
70534     category.terms = function() {
70535         return [];
70536     };
70537
70538
70539     return category;
70540 }
70541
70542 function presetField(id, field) {
70543     field = clone(field);
70544
70545     field.id = id;
70546
70547
70548     field.matchGeometry = function(geometry) {
70549         return !field.geometry || field.geometry === geometry;
70550     };
70551
70552
70553     field.t = function(scope, options) {
70554         return t('presets.fields.' + id + '.' + scope, options);
70555     };
70556
70557
70558     field.label = function() {
70559         return field.t('label', {'default': id});
70560     };
70561
70562
70563     var placeholder = field.placeholder;
70564     field.placeholder = function() {
70565         return field.t('placeholder', {'default': placeholder});
70566     };
70567
70568
70569     return field;
70570 }
70571
70572 function presetPreset(id, preset, fields) {
70573     preset = clone(preset);
70574
70575     preset.id = id;
70576     preset.fields = (preset.fields || []).map(getFields);
70577     preset.geometry = (preset.geometry || []);
70578
70579
70580     function getFields(f) {
70581         return fields[f];
70582     }
70583
70584
70585     preset.matchGeometry = function(geometry) {
70586         return preset.geometry.indexOf(geometry) >= 0;
70587     };
70588
70589
70590     preset.originalScore = preset.matchScore || 1;
70591
70592
70593     preset.matchScore = function(entity) {
70594         var tags = preset.tags,
70595             score = 0;
70596
70597         for (var t$$1 in tags) {
70598             if (entity.tags[t$$1] === tags[t$$1]) {
70599                 score += preset.originalScore;
70600             } else if (tags[t$$1] === '*' && t$$1 in entity.tags) {
70601                 score += preset.originalScore / 2;
70602             } else {
70603                 return -1;
70604             }
70605         }
70606
70607         return score;
70608     };
70609
70610
70611     preset.t = function(scope, options) {
70612         return t('presets.presets.' + id + '.' + scope, options);
70613     };
70614
70615
70616     var origName = preset.name || '';
70617     preset.name = function() {
70618         if (preset.suggestion) {
70619             id = id.split('/');
70620             id = id[0] + '/' + id[1];
70621             return origName + ' - ' + t('presets.presets.' + id + '.name');
70622         }
70623         return preset.t('name', { 'default': origName });
70624     };
70625
70626     var origTerms = (preset.terms || []).join();
70627     preset.terms = function() {
70628         return preset.t('terms', { 'default': origTerms }).toLowerCase().trim().split(/\s*,+\s*/);
70629     };
70630
70631
70632     preset.isFallback = function() {
70633         var tagCount = Object.keys(preset.tags).length;
70634         return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
70635     };
70636
70637
70638     var reference = preset.reference || {};
70639     preset.reference = function(geometry) {
70640         var key = reference.key || Object.keys(omit(preset.tags, 'name'))[0],
70641             value = reference.value || preset.tags[key];
70642
70643         if (geometry === 'relation' && key === 'type') {
70644             if (value in preset.tags) {
70645                 key = value;
70646                 value = preset.tags[key];
70647             } else {
70648                 return { rtype: value };
70649             }
70650         }
70651
70652         if (value === '*') {
70653             return { key: key };
70654         } else {
70655             return { key: key, value: value };
70656         }
70657     };
70658
70659
70660     var removeTags = preset.removeTags || preset.tags || {};
70661     preset.removeTags = function(tags, geometry) {
70662         tags = omit(tags, keys$1(removeTags));
70663
70664         for (var f in preset.fields) {
70665             var field = preset.fields[f];
70666             if (field.matchGeometry(geometry) && field.default === tags[field.key]) {
70667                 delete tags[field.key];
70668             }
70669         }
70670
70671         delete tags.area;
70672         return tags;
70673     };
70674
70675
70676     var applyTags = preset.addTags || preset.tags || {};
70677     preset.applyTags = function(tags, geometry) {
70678         var k;
70679
70680         tags = clone(tags);
70681
70682         for (k in applyTags) {
70683             if (applyTags[k] === '*') {
70684                 tags[k] = 'yes';
70685             } else {
70686                 tags[k] = applyTags[k];
70687             }
70688         }
70689
70690         // Add area=yes if necessary.
70691         // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
70692         // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
70693         // 2. chosen preset doesn't have a key in areaKeys (`railway=station`)
70694         if (!applyTags.hasOwnProperty('area')) {
70695             delete tags.area;
70696             if (geometry === 'area') {
70697                 var needsAreaTag = true;
70698                 if (preset.geometry.indexOf('line') === -1) {
70699                     for (k in applyTags) {
70700                         if (k in areaKeys) {
70701                             needsAreaTag = false;
70702                             break;
70703                         }
70704                     }
70705                 }
70706                 if (needsAreaTag) {
70707                     tags.area = 'yes';
70708                 }
70709             }
70710         }
70711
70712         for (var f in preset.fields) {
70713             var field = preset.fields[f];
70714             if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
70715                 tags[field.key] = field.default;
70716             }
70717         }
70718
70719         return tags;
70720     };
70721
70722
70723     return preset;
70724 }
70725
70726 function presetIndex() {
70727     // a presetCollection with methods for
70728     // loading new data and returning defaults
70729
70730     var all = presetCollection([]);
70731     var _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
70732     var _fields = {};
70733     var _universal = [];
70734     var _recent = presetCollection([]);
70735
70736     // Index of presets by (geometry, tag key).
70737     var _index = {
70738         point: {},
70739         vertex: {},
70740         line: {},
70741         area: {},
70742         relation: {}
70743     };
70744
70745     all.match = function(entity, resolver) {
70746         var geometry = entity.geometry(resolver);
70747         var address;
70748
70749         // Treat entities on addr:interpolation lines as points, not vertices - #3241
70750         if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
70751             geometry = 'point';
70752         }
70753
70754         var geometryMatches = _index[geometry];
70755         var best = -1;
70756         var match;
70757
70758         for (var k in entity.tags) {
70759             // If any part of an address is present,
70760             // allow fallback to "Address" preset - #4353
70761             if (k.match(/^addr:/) !== null && geometryMatches['addr:*']) {
70762                 address = geometryMatches['addr:*'][0];
70763             }
70764
70765             var keyMatches = geometryMatches[k];
70766             if (!keyMatches) continue;
70767
70768             for (var i = 0; i < keyMatches.length; i++) {
70769                 var score = keyMatches[i].matchScore(entity);
70770                 if (score > best) {
70771                     best = score;
70772                     match = keyMatches[i];
70773                 }
70774             }
70775         }
70776
70777         if (address && (!match || match.isFallback())) {
70778             match = address;
70779         }
70780
70781         return match || all.item(geometry);
70782     };
70783
70784
70785     // Because of the open nature of tagging, iD will never have a complete
70786     // list of tags used in OSM, so we want it to have logic like "assume
70787     // that a closed way with an amenity tag is an area, unless the amenity
70788     // is one of these specific types". This function computes a structure
70789     // that allows testing of such conditions, based on the presets designated
70790     // as as supporting (or not supporting) the area geometry.
70791     //
70792     // The returned object L is a whitelist/blacklist of tags. A closed way
70793     // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
70794     // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
70795     // and the subkeys form the blacklist.
70796     all.areaKeys = function() {
70797         var areaKeys = {};
70798         var ignore = ['barrier', 'highway', 'footway', 'railway', 'type'];  // probably a line..
70799         var presets = reject(all.collection, 'suggestion');
70800
70801         // whitelist
70802         presets.forEach(function(d) {
70803             for (var key in d.tags) break;
70804             if (!key) return;
70805             if (ignore.indexOf(key) !== -1) return;
70806
70807             if (d.geometry.indexOf('area') !== -1) {    // probably an area..
70808                 areaKeys[key] = areaKeys[key] || {};
70809             }
70810         });
70811
70812         // blacklist
70813         presets.forEach(function(d) {
70814             for (var key in d.tags) break;
70815             if (!key) return;
70816             if (ignore.indexOf(key) !== -1) return;
70817
70818             var value = d.tags[key];
70819             if (key in areaKeys &&                      // probably an area...
70820                 d.geometry.indexOf('line') !== -1 &&    // but sometimes a line
70821                 value !== '*') {
70822                 areaKeys[key][value] = true;
70823             }
70824         });
70825
70826         return areaKeys;
70827     };
70828
70829
70830     all.init = function() {
70831         var d = data.presets;
70832
70833         all.collection = [];
70834         _recent.collection = [];
70835         _fields = {};
70836         _universal = [];
70837         _index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
70838
70839         if (d.fields) {
70840             forEach(d.fields, function(d, id) {
70841                 _fields[id] = presetField(id, d);
70842                 if (d.universal) {
70843                     _universal.push(_fields[id]);
70844                 }
70845             });
70846         }
70847
70848         if (d.presets) {
70849             forEach(d.presets, function(d, id) {
70850                 all.collection.push(presetPreset(id, d, _fields));
70851             });
70852         }
70853
70854         if (d.categories) {
70855             forEach(d.categories, function(d, id) {
70856                 all.collection.push(presetCategory(id, d, all));
70857             });
70858         }
70859
70860         if (d.defaults) {
70861             var getItem = bind$2(all.item, all);
70862             _defaults = {
70863                 area: presetCollection(d.defaults.area.map(getItem)),
70864                 line: presetCollection(d.defaults.line.map(getItem)),
70865                 point: presetCollection(d.defaults.point.map(getItem)),
70866                 vertex: presetCollection(d.defaults.vertex.map(getItem)),
70867                 relation: presetCollection(d.defaults.relation.map(getItem))
70868             };
70869         }
70870
70871         for (var i = 0; i < all.collection.length; i++) {
70872             var preset = all.collection[i];
70873             var geometry = preset.geometry;
70874
70875             for (var j = 0; j < geometry.length; j++) {
70876                 var g = _index[geometry[j]];
70877                 for (var k in preset.tags) {
70878                     (g[k] = g[k] || []).push(preset);
70879                 }
70880             }
70881         }
70882
70883         return all;
70884     };
70885
70886     all.field = function(id) {
70887         return _fields[id];
70888     };
70889
70890     all.universal = function() {
70891         return _universal;
70892     };
70893
70894     all.defaults = function(geometry, n) {
70895         var rec = _recent.matchGeometry(geometry).collection.slice(0, 4);
70896         var def = uniq(rec.concat(_defaults[geometry].collection)).slice(0, n - 1);
70897         return presetCollection(uniq(rec.concat(def).concat(all.item(geometry))));
70898     };
70899
70900     all.choose = function(preset) {
70901         _recent = presetCollection(uniq([preset].concat(_recent.collection)));
70902         return all;
70903     };
70904
70905     return all;
70906 }
70907
70908 var areaKeys = {};
70909
70910 function setAreaKeys(value) {
70911     areaKeys = value;
70912 }
70913
70914
70915 function coreContext() {
70916     var context = {};
70917     context.version = '2.7.1';
70918
70919     // create a special translation that contains the keys in place of the strings
70920     var tkeys = cloneDeep(en);
70921     var parents = [];
70922
70923     function traverser(v, k, obj) {
70924         parents.push(k);
70925         if (isObject(v)) {
70926             forOwn(v, traverser);
70927         } else if (isString(v)) {
70928             obj[k] = parents.join('.');
70929         }
70930         parents.pop();
70931     }
70932
70933     forOwn(tkeys, traverser);
70934     addTranslation('_tkeys_', tkeys);
70935
70936     addTranslation('en', en);
70937     setLocale('en');
70938
70939     var dispatch$$1 = dispatch('enter', 'exit', 'change');
70940
70941     // https://github.com/openstreetmap/iD/issues/772
70942     // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
70943     var storage;
70944     try { storage = localStorage; } catch (e) {}  // eslint-disable-line no-empty
70945     storage = storage || (function() {
70946         var s = {};
70947         return {
70948             getItem: function(k) { return s[k]; },
70949             setItem: function(k, v) { s[k] = v; },
70950             removeItem: function(k) { delete s[k]; }
70951         };
70952     })();
70953
70954     context.storage = function(k, v) {
70955         try {
70956             if (arguments.length === 1) return storage.getItem(k);
70957             else if (v === null) storage.removeItem(k);
70958             else storage.setItem(k, v);
70959         } catch (e) {
70960             // localstorage quota exceeded
70961             /* eslint-disable no-console */
70962             if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
70963             /* eslint-enable no-console */
70964         }
70965     };
70966
70967
70968     /* Straight accessors. Avoid using these if you can. */
70969     var ui, connection, history;
70970     context.ui = function() { return ui; };
70971     context.connection = function() { return connection; };
70972     context.history = function() { return history; };
70973
70974
70975     /* Connection */
70976     context.preauth = function(options) {
70977         if (connection) {
70978             connection.switch(options);
70979         }
70980         return context;
70981     };
70982
70983     context.loadTiles = utilCallWhenIdle(function(projection, dimensions, callback) {
70984         var cid;
70985         function done(err, result) {
70986             if (connection.getConnectionId() !== cid) {
70987                 if (callback) callback({ message: 'Connection Switched', status: -1 });
70988                 return;
70989             }
70990             if (!err) history.merge(result.data, result.extent);
70991             if (callback) callback(err, result);
70992         }
70993         if (connection && context.editable()) {
70994             cid = connection.getConnectionId();
70995             connection.loadTiles(projection, dimensions, done);
70996         }
70997     });
70998
70999     context.loadEntity = function(entityId, callback) {
71000         var cid;
71001         function done(err, result) {
71002             if (connection.getConnectionId() !== cid) {
71003                 if (callback) callback({ message: 'Connection Switched', status: -1 });
71004                 return;
71005             }
71006             if (!err) history.merge(result.data, result.extent);
71007             if (callback) callback(err, result);
71008         }
71009         if (connection) {
71010             cid = connection.getConnectionId();
71011             connection.loadEntity(entityId, done);
71012         }
71013     };
71014
71015     context.zoomToEntity = function(entityId, zoomTo) {
71016         if (zoomTo !== false) {
71017             this.loadEntity(entityId, function(err, result) {
71018                 if (err) return;
71019                 var entity = find$1(result.data, function(e) { return e.id === entityId; });
71020                 if (entity) { map.zoomTo(entity); }
71021             });
71022         }
71023
71024         map.on('drawn.zoomToEntity', function() {
71025             if (!context.hasEntity(entityId)) return;
71026             map.on('drawn.zoomToEntity', null);
71027             context.on('enter.zoomToEntity', null);
71028             context.enter(modeSelect(context, [entityId]));
71029         });
71030
71031         context.on('enter.zoomToEntity', function() {
71032             if (mode.id !== 'browse') {
71033                 map.on('drawn.zoomToEntity', null);
71034                 context.on('enter.zoomToEntity', null);
71035             }
71036         });
71037     };
71038
71039     var minEditableZoom = 16;
71040     context.minEditableZoom = function(_) {
71041         if (!arguments.length) return minEditableZoom;
71042         minEditableZoom = _;
71043         if (connection) {
71044             connection.tileZoom(_);
71045         }
71046         return context;
71047     };
71048
71049
71050     /* History */
71051     var inIntro = false;
71052     context.inIntro = function(_) {
71053         if (!arguments.length) return inIntro;
71054         inIntro = _;
71055         return context;
71056     };
71057
71058     context.save = function() {
71059         // no history save, no message onbeforeunload
71060         if (inIntro || d3_select('.modal').size()) return;
71061
71062         var canSave;
71063         if (mode && mode.id === 'save') {
71064             canSave = false;
71065         } else {
71066             canSave = context.selectedIDs().every(function(id) {
71067                 var entity = context.hasEntity(id);
71068                 return entity && !entity.isDegenerate();
71069             });
71070         }
71071
71072         if (canSave) {
71073             history.save();
71074         }
71075         if (history.hasChanges()) {
71076             return t('save.unsaved_changes');
71077         }
71078     };
71079
71080
71081     /* Graph */
71082     context.hasEntity = function(id) {
71083         return history.graph().hasEntity(id);
71084     };
71085     context.entity = function(id) {
71086         return history.graph().entity(id);
71087     };
71088     context.childNodes = function(way) {
71089         return history.graph().childNodes(way);
71090     };
71091     context.geometry = function(id) {
71092         return context.entity(id).geometry(history.graph());
71093     };
71094
71095
71096     /* Modes */
71097     var mode;
71098     context.mode = function() {
71099         return mode;
71100     };
71101     context.enter = function(newMode) {
71102         if (mode) {
71103             mode.exit();
71104             dispatch$$1.call('exit', this, mode);
71105         }
71106
71107         mode = newMode;
71108         mode.enter();
71109         dispatch$$1.call('enter', this, mode);
71110     };
71111
71112     context.selectedIDs = function() {
71113         if (mode && mode.selectedIDs) {
71114             return mode.selectedIDs();
71115         } else {
71116             return [];
71117         }
71118     };
71119     context.activeID = function() {
71120         return mode && mode.activeID && mode.activeID();
71121     };
71122
71123
71124     /* Behaviors */
71125     context.install = function(behavior) {
71126         context.surface().call(behavior);
71127     };
71128     context.uninstall = function(behavior) {
71129         context.surface().call(behavior.off);
71130     };
71131
71132
71133     /* Copy/Paste */
71134     var copyIDs = [], copyGraph;
71135     context.copyGraph = function() { return copyGraph; };
71136     context.copyIDs = function(_) {
71137         if (!arguments.length) return copyIDs;
71138         copyIDs = _;
71139         copyGraph = history.graph();
71140         return context;
71141     };
71142
71143
71144     /* Background */
71145     var background;
71146     context.background = function() { return background; };
71147
71148
71149     /* Features */
71150     var features;
71151     context.features = function() { return features; };
71152     context.hasHiddenConnections = function(id) {
71153         var graph = history.graph(),
71154             entity = graph.entity(id);
71155         return features.hasHiddenConnections(entity, graph);
71156     };
71157
71158
71159     /* Presets */
71160     var presets;
71161     context.presets = function() { return presets; };
71162
71163
71164     /* Map */
71165     var map;
71166     context.map = function() { return map; };
71167     context.layers = function() { return map.layers; };
71168     context.surface = function() { return map.surface; };
71169     context.editable = function() { return map.editable(); };
71170     context.surfaceRect = function() {
71171         return map.surface.node().getBoundingClientRect();
71172     };
71173
71174
71175     /* Debug */
71176     var debugFlags = {
71177         tile: false,        // tile boundaries
71178         collision: false,   // label collision bounding boxes
71179         imagery: false,     // imagery bounding polygons
71180         imperial: false,    // imperial (not metric) bounding polygons
71181         driveLeft: false,   // driveLeft bounding polygons
71182         target: false       // touch targets
71183     };
71184     context.debugFlags = function() {
71185         return debugFlags;
71186     };
71187     context.setDebug = function(flag, val) {
71188         if (arguments.length === 1) val = true;
71189         debugFlags[flag] = val;
71190         dispatch$$1.call('change');
71191         return context;
71192     };
71193     context.getDebug = function(flag) {
71194         return flag && debugFlags[flag];
71195     };
71196
71197
71198     /* Container */
71199     var container = d3_select(document.body);
71200     context.container = function(_) {
71201         if (!arguments.length) return container;
71202         container = _;
71203         container.classed('id-container', true);
71204         return context;
71205     };
71206     var embed;
71207     context.embed = function(_) {
71208         if (!arguments.length) return embed;
71209         embed = _;
71210         return context;
71211     };
71212
71213
71214     /* Assets */
71215     var assetPath = '';
71216     context.assetPath = function(_) {
71217         if (!arguments.length) return assetPath;
71218         assetPath = _;
71219         return context;
71220     };
71221
71222     var assetMap = {};
71223     context.assetMap = function(_) {
71224         if (!arguments.length) return assetMap;
71225         assetMap = _;
71226         return context;
71227     };
71228
71229     context.asset = function(_) {
71230         var filename = assetPath + _;
71231         return assetMap[filename] || filename;
71232     };
71233
71234     context.imagePath = function(_) {
71235         return context.asset('img/' + _);
71236     };
71237
71238
71239     /* locales */
71240     // `locale` variable contains a "requested locale".
71241     // It won't become the `currentLocale` until after loadLocale() is called.
71242     var locale, localePath;
71243
71244     context.locale = function(loc, path) {
71245         if (!arguments.length) return currentLocale;
71246         locale = loc;
71247         localePath = path;
71248         return context;
71249     };
71250
71251     context.loadLocale = function(callback) {
71252         if (locale && locale !== 'en' && dataLocales.hasOwnProperty(locale)) {
71253             localePath = localePath || context.asset('locales/' + locale + '.json');
71254             d3_json(localePath, function(err, result) {
71255                 if (!err) {
71256                     addTranslation(locale, result[locale]);
71257                     setLocale(locale);
71258                     utilDetect(true);
71259                 }
71260                 if (callback) {
71261                     callback(err);
71262                 }
71263             });
71264         } else {
71265             if (locale) {
71266                 setLocale(locale);
71267                 utilDetect(true);
71268             }
71269             if (callback) {
71270                 callback();
71271             }
71272         }
71273     };
71274
71275
71276     /* reset (aka flush) */
71277     context.reset = context.flush = function() {
71278         context.debouncedSave.cancel();
71279         forEach(services, function(service) {
71280             if (service && typeof service.reset === 'function') {
71281                 service.reset(context);
71282             }
71283         });
71284         features.reset();
71285         history.reset();
71286         return context;
71287     };
71288
71289
71290     /* Init */
71291
71292     context.projection = geoRawMercator();
71293     context.curtainProjection = geoRawMercator();
71294
71295     locale = utilDetect().locale;
71296     if (locale && !dataLocales.hasOwnProperty(locale)) {
71297         locale = locale.split('-')[0];
71298     }
71299
71300     history = coreHistory(context);
71301     context.graph = history.graph;
71302     context.changes = history.changes;
71303     context.intersects = history.intersects;
71304
71305     // Debounce save, since it's a synchronous localStorage write,
71306     // and history changes can happen frequently (e.g. when dragging).
71307     context.debouncedSave = debounce(context.save, 350);
71308     function withDebouncedSave(fn) {
71309         return function() {
71310             var result = fn.apply(history, arguments);
71311             context.debouncedSave();
71312             return result;
71313         };
71314     }
71315
71316     context.perform = withDebouncedSave(history.perform);
71317     context.replace = withDebouncedSave(history.replace);
71318     context.pop = withDebouncedSave(history.pop);
71319     context.overwrite = withDebouncedSave(history.overwrite);
71320     context.undo = withDebouncedSave(history.undo);
71321     context.redo = withDebouncedSave(history.redo);
71322
71323     ui = uiInit(context);
71324
71325     connection = services.osm;
71326     background = rendererBackground(context);
71327     features = rendererFeatures(context);
71328     presets = presetIndex();
71329
71330     map = rendererMap(context);
71331     context.mouse = map.mouse;
71332     context.extent = map.extent;
71333     context.pan = map.pan;
71334     context.zoomIn = map.zoomIn;
71335     context.zoomOut = map.zoomOut;
71336     context.zoomInFurther = map.zoomInFurther;
71337     context.zoomOutFurther = map.zoomOutFurther;
71338     context.redrawEnable = map.redrawEnable;
71339
71340     forEach(services, function(service) {
71341         if (service && typeof service.init === 'function') {
71342             service.init(context);
71343         }
71344     });
71345
71346     background.init();
71347     features.init();
71348     presets.init();
71349     areaKeys = presets.areaKeys();
71350
71351
71352     return utilRebind(context, dispatch$$1, 'on');
71353 }
71354
71355 function osmWay() {
71356     if (!(this instanceof osmWay)) {
71357         return (new osmWay()).initialize(arguments);
71358     } else if (arguments.length) {
71359         this.initialize(arguments);
71360     }
71361 }
71362
71363
71364 osmEntity$$1.way = osmWay;
71365
71366 osmWay.prototype = Object.create(osmEntity$$1.prototype);
71367
71368
71369 assignIn(osmWay.prototype, {
71370     type: 'way',
71371     nodes: [],
71372
71373
71374     copy: function(resolver, copies) {
71375         if (copies[this.id])
71376             return copies[this.id];
71377
71378         var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
71379
71380         var nodes = this.nodes.map(function(id) {
71381             return resolver.entity(id).copy(resolver, copies).id;
71382         });
71383
71384         copy = copy.update({ nodes: nodes });
71385         copies[this.id] = copy;
71386
71387         return copy;
71388     },
71389
71390
71391     extent: function(resolver) {
71392         return resolver.transient(this, 'extent', function() {
71393             var extent = geoExtent$$1();
71394             for (var i = 0; i < this.nodes.length; i++) {
71395                 var node = resolver.hasEntity(this.nodes[i]);
71396                 if (node) {
71397                     extent._extend(node.extent());
71398                 }
71399             }
71400             return extent;
71401         });
71402     },
71403
71404
71405     first: function() {
71406         return this.nodes[0];
71407     },
71408
71409
71410     last: function() {
71411         return this.nodes[this.nodes.length - 1];
71412     },
71413
71414
71415     contains: function(node) {
71416         return this.nodes.indexOf(node) >= 0;
71417     },
71418
71419
71420     affix: function(node) {
71421         if (this.nodes[0] === node) return 'prefix';
71422         if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
71423     },
71424
71425
71426     layer: function() {
71427         // explicit layer tag, clamp between -10, 10..
71428         if (isFinite(this.tags.layer)) {
71429             return Math.max(-10, Math.min(+(this.tags.layer), 10));
71430         }
71431
71432         // implied layer tag..
71433         if (this.tags.covered === 'yes') return -1;
71434         if (this.tags.location === 'overground') return 1;
71435         if (this.tags.location === 'underground') return -1;
71436         if (this.tags.location === 'underwater') return -10;
71437
71438         if (this.tags.power === 'line') return 10;
71439         if (this.tags.power === 'minor_line') return 10;
71440         if (this.tags.aerialway) return 10;
71441         if (this.tags.bridge) return 1;
71442         if (this.tags.cutting) return -1;
71443         if (this.tags.tunnel) return -1;
71444         if (this.tags.waterway) return -1;
71445         if (this.tags.man_made === 'pipeline') return -10;
71446         if (this.tags.boundary) return -10;
71447         return 0;
71448     },
71449
71450
71451     isOneWay: function() {
71452         // explicit oneway tag..
71453         var values = {
71454             'yes': true,
71455             '1': true,
71456             '-1': true,
71457             'reversible': true,
71458             'alternating': true,
71459             'no': false,
71460             '0': false
71461         };
71462         if (values[this.tags.oneway] !== undefined) {
71463             return values[this.tags.oneway];
71464         }
71465
71466         // implied oneway tag..
71467         for (var key in this.tags) {
71468             if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
71469                 return true;
71470         }
71471         return false;
71472     },
71473
71474
71475     lanes: function() {
71476         return osmLanes(this);
71477     },
71478
71479
71480     isClosed: function() {
71481         return this.nodes.length > 1 && this.first() === this.last();
71482     },
71483
71484
71485     isConvex: function(resolver) {
71486         if (!this.isClosed() || this.isDegenerate()) return null;
71487
71488         var nodes = uniq(resolver.childNodes(this));
71489         var coords = map$3(nodes, 'loc');
71490         var curr = 0;
71491         var prev = 0;
71492
71493         for (var i = 0; i < coords.length; i++) {
71494             var o = coords[(i+1) % coords.length];
71495             var a = coords[i];
71496             var b = coords[(i+2) % coords.length];
71497             var res = geoVecCross(a, b, o);
71498
71499             curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
71500             if (curr === 0) {
71501                 continue;
71502             } else if (prev && curr !== prev) {
71503                 return false;
71504             }
71505             prev = curr;
71506         }
71507         return true;
71508     },
71509
71510
71511     isArea: function() {
71512         // `highway` and `railway` are typically linear features, but there
71513         // are a few exceptions that should be treated as areas, even in the
71514         // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
71515         var lineKeys = {
71516             highway: {
71517                 rest_area: true,
71518                 services: true
71519             },
71520             railway: {
71521                 roundhouse: true,
71522                 station: true,
71523                 traverser: true,
71524                 turntable: true,
71525                 wash: true
71526             }
71527         };
71528
71529         if (this.tags.area === 'yes')
71530             return true;
71531         if (!this.isClosed() || this.tags.area === 'no')
71532             return false;
71533         for (var key in this.tags) {
71534             if (key in areaKeys && !(this.tags[key] in areaKeys[key])) {
71535                 return true;
71536             }
71537             if (key in lineKeys && this.tags[key] in lineKeys[key]) {
71538                 return true;
71539             }
71540         }
71541         return false;
71542     },
71543
71544
71545     isDegenerate: function() {
71546         return uniq(this.nodes).length < (this.isArea() ? 3 : 2);
71547     },
71548
71549
71550     areAdjacent: function(n1, n2) {
71551         for (var i = 0; i < this.nodes.length; i++) {
71552             if (this.nodes[i] === n1) {
71553                 if (this.nodes[i - 1] === n2) return true;
71554                 if (this.nodes[i + 1] === n2) return true;
71555             }
71556         }
71557         return false;
71558     },
71559
71560
71561     geometry: function(graph) {
71562         return graph.transient(this, 'geometry', function() {
71563             return this.isArea() ? 'area' : 'line';
71564         });
71565     },
71566
71567
71568     // If this way is not closed, append the beginning node to the end of the nodelist to close it.
71569     close: function() {
71570         if (this.isClosed() || !this.nodes.length) return this;
71571
71572         var nodes = this.nodes.slice();
71573         nodes = nodes.filter(noRepeatNodes);
71574         nodes.push(nodes[0]);
71575         return this.update({ nodes: nodes });
71576     },
71577
71578
71579     // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
71580     unclose: function() {
71581         if (!this.isClosed()) return this;
71582
71583         var nodes = this.nodes.slice(),
71584             connector = this.first(),
71585             i = nodes.length - 1;
71586
71587         // remove trailing connectors..
71588         while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
71589             nodes.splice(i, 1);
71590             i = nodes.length - 1;
71591         }
71592
71593         nodes = nodes.filter(noRepeatNodes);
71594         return this.update({ nodes: nodes });
71595     },
71596
71597
71598     // Adds a node (id) in front of the node which is currently at position index.
71599     // If index is undefined, the node will be added to the end of the way for linear ways,
71600     //   or just before the final connecting node for circular ways.
71601     // Consecutive duplicates are eliminated including existing ones.
71602     // Circularity is always preserved when adding a node.
71603     addNode: function(id, index) {
71604         var nodes = this.nodes.slice(),
71605             isClosed = this.isClosed(),
71606             max = isClosed ? nodes.length - 1 : nodes.length;
71607
71608         if (index === undefined) {
71609             index = max;
71610         }
71611
71612         if (index < 0 || index > max) {
71613             throw new RangeError('index ' + index + ' out of range 0..' + max);
71614         }
71615
71616         // If this is a closed way, remove all connector nodes except the first one
71617         // (there may be duplicates) and adjust index if necessary..
71618         if (isClosed) {
71619             var connector = this.first();
71620
71621             // leading connectors..
71622             var i = 1;
71623             while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
71624                 nodes.splice(i, 1);
71625                 if (index > i) index--;
71626             }
71627
71628             // trailing connectors..
71629             i = nodes.length - 1;
71630             while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
71631                 nodes.splice(i, 1);
71632                 if (index > i) index--;
71633                 i = nodes.length - 1;
71634             }
71635         }
71636
71637         nodes.splice(index, 0, id);
71638         nodes = nodes.filter(noRepeatNodes);
71639
71640         // If the way was closed before, append a connector node to keep it closed..
71641         if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
71642             nodes.push(nodes[0]);
71643         }
71644
71645         return this.update({ nodes: nodes });
71646     },
71647
71648
71649     // Replaces the node which is currently at position index with the given node (id).
71650     // Consecutive duplicates are eliminated including existing ones.
71651     // Circularity is preserved when updating a node.
71652     updateNode: function(id, index) {
71653         var nodes = this.nodes.slice(),
71654             isClosed = this.isClosed(),
71655             max = nodes.length - 1;
71656
71657         if (index === undefined || index < 0 || index > max) {
71658             throw new RangeError('index ' + index + ' out of range 0..' + max);
71659         }
71660
71661         // If this is a closed way, remove all connector nodes except the first one
71662         // (there may be duplicates) and adjust index if necessary..
71663         if (isClosed) {
71664             var connector = this.first();
71665
71666             // leading connectors..
71667             var i = 1;
71668             while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
71669                 nodes.splice(i, 1);
71670                 if (index > i) index--;
71671             }
71672
71673             // trailing connectors..
71674             i = nodes.length - 1;
71675             while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
71676                 nodes.splice(i, 1);
71677                 if (index === i) index = 0;  // update leading connector instead
71678                 i = nodes.length - 1;
71679             }
71680         }
71681
71682         nodes.splice(index, 1, id);
71683         nodes = nodes.filter(noRepeatNodes);
71684
71685         // If the way was closed before, append a connector node to keep it closed..
71686         if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
71687             nodes.push(nodes[0]);
71688         }
71689
71690         return this.update({nodes: nodes});
71691     },
71692
71693
71694     // Replaces each occurrence of node id needle with replacement.
71695     // Consecutive duplicates are eliminated including existing ones.
71696     // Circularity is preserved.
71697     replaceNode: function(needle, replacement) {
71698         var nodes = this.nodes.slice(),
71699             isClosed = this.isClosed();
71700
71701         for (var i = 0; i < nodes.length; i++) {
71702             if (nodes[i] === needle) {
71703                 nodes[i] = replacement;
71704             }
71705         }
71706
71707         nodes = nodes.filter(noRepeatNodes);
71708
71709         // If the way was closed before, append a connector node to keep it closed..
71710         if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
71711             nodes.push(nodes[0]);
71712         }
71713
71714         return this.update({nodes: nodes});
71715     },
71716
71717
71718     // Removes each occurrence of node id needle with replacement.
71719     // Consecutive duplicates are eliminated including existing ones.
71720     // Circularity is preserved.
71721     removeNode: function(id) {
71722         var nodes = this.nodes.slice(),
71723             isClosed = this.isClosed();
71724
71725         nodes = nodes
71726             .filter(function(node) { return node !== id; })
71727             .filter(noRepeatNodes);
71728
71729         // If the way was closed before, append a connector node to keep it closed..
71730         if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
71731             nodes.push(nodes[0]);
71732         }
71733
71734         return this.update({nodes: nodes});
71735     },
71736
71737
71738     asJXON: function(changeset_id) {
71739         var r = {
71740             way: {
71741                 '@id': this.osmId(),
71742                 '@version': this.version || 0,
71743                 nd: map$3(this.nodes, function(id) {
71744                     return { keyAttributes: { ref: osmEntity$$1.id.toOSM(id) } };
71745                 }),
71746                 tag: map$3(this.tags, function(v, k) {
71747                     return { keyAttributes: { k: k, v: v } };
71748                 })
71749             }
71750         };
71751         if (changeset_id) {
71752             r.way['@changeset'] = changeset_id;
71753         }
71754         return r;
71755     },
71756
71757
71758     asGeoJSON: function(resolver) {
71759         return resolver.transient(this, 'GeoJSON', function() {
71760             var coordinates = map$3(resolver.childNodes(this), 'loc');
71761             if (this.isArea() && this.isClosed()) {
71762                 return {
71763                     type: 'Polygon',
71764                     coordinates: [coordinates]
71765                 };
71766             } else {
71767                 return {
71768                     type: 'LineString',
71769                     coordinates: coordinates
71770                 };
71771             }
71772         });
71773     },
71774
71775
71776     area: function(resolver) {
71777         return resolver.transient(this, 'area', function() {
71778             var nodes = resolver.childNodes(this);
71779
71780             var json = {
71781                 type: 'Polygon',
71782                 coordinates: [map$3(nodes, 'loc')]
71783             };
71784
71785             if (!this.isClosed() && nodes.length) {
71786                 json.coordinates[0].push(nodes[0].loc);
71787             }
71788
71789             var area = d3_geoArea(json);
71790
71791             // Heuristic for detecting counterclockwise winding order. Assumes
71792             // that OpenStreetMap polygons are not hemisphere-spanning.
71793             if (area > 2 * Math.PI) {
71794                 json.coordinates[0] = json.coordinates[0].reverse();
71795                 area = d3_geoArea(json);
71796             }
71797
71798             return isNaN(area) ? 0 : area;
71799         });
71800     }
71801 });
71802
71803
71804 // Filter function to eliminate consecutive duplicates.
71805 function noRepeatNodes(node, i, arr) {
71806     return i === 0 || node !== arr[i - 1];
71807 }
71808
71809 // For fixing up rendering of multipolygons with tags on the outer member.
71810 // https://github.com/openstreetmap/iD/issues/613
71811 function osmIsSimpleMultipolygonOuterMember(entity, graph) {
71812     if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
71813         return false;
71814
71815     var parents = graph.parentRelations(entity);
71816     if (parents.length !== 1)
71817         return false;
71818
71819     var parent = parents[0];
71820     if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
71821         return false;
71822
71823     var members = parent.members, member;
71824     for (var i = 0; i < members.length; i++) {
71825         member = members[i];
71826         if (member.id === entity.id && member.role && member.role !== 'outer')
71827             return false; // Not outer member
71828         if (member.id !== entity.id && (!member.role || member.role === 'outer'))
71829             return false; // Not a simple multipolygon
71830     }
71831
71832     return parent;
71833 }
71834
71835
71836 function osmSimpleMultipolygonOuterMember(entity, graph) {
71837     if (entity.type !== 'way')
71838         return false;
71839
71840     var parents = graph.parentRelations(entity);
71841     if (parents.length !== 1)
71842         return false;
71843
71844     var parent = parents[0];
71845     if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
71846         return false;
71847
71848     var members = parent.members, member, outerMember;
71849     for (var i = 0; i < members.length; i++) {
71850         member = members[i];
71851         if (!member.role || member.role === 'outer') {
71852             if (outerMember)
71853                 return false; // Not a simple multipolygon
71854             outerMember = member;
71855         }
71856     }
71857
71858     if (!outerMember)
71859         return false;
71860
71861     var outerEntity = graph.hasEntity(outerMember.id);
71862     if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
71863         return false;
71864
71865     return outerEntity;
71866 }
71867
71868
71869 // Join `toJoin` array into sequences of connecting ways.
71870
71871 // Segments which share identical start/end nodes will, as much as possible,
71872 // be connected with each other.
71873 //
71874 // The return value is a nested array. Each constituent array contains elements
71875 // of `toJoin` which have been determined to connect.
71876 //
71877 // Each consitituent array also has a `nodes` property whose value is an
71878 // ordered array of member nodes, with appropriate order reversal and
71879 // start/end coordinate de-duplication.
71880 //
71881 // Members of `toJoin` must have, at minimum, `type` and `id` properties.
71882 // Thus either an array of `osmWay`s or a relation member array may be used.
71883 //
71884 // If an member is an `osmWay`, its tags and childnodes may be reversed via
71885 // `actionReverse` in the output.
71886 //
71887 // The returned sequences array also has an `actions` array property, containing
71888 // any reversal actions that should be applied to the graph, should the calling
71889 // code attempt to actually join the given ways.
71890 //
71891 // Incomplete members (those for which `graph.hasEntity(element.id)` returns
71892 // false) and non-way members are ignored.
71893 //
71894 function osmJoinWays(toJoin, graph) {
71895     function resolve(member) {
71896         return graph.childNodes(graph.entity(member.id));
71897     }
71898
71899     function reverse(item) {
71900         var action = actionReverse(item.id, { reverseOneway: true });
71901         sequences.actions.push(action);
71902         return (item instanceof osmWay) ? action(graph).entity(item.id) : item;
71903     }
71904
71905     // make a copy containing only the items to join
71906     toJoin = toJoin.filter(function(member) {
71907         return member.type === 'way' && graph.hasEntity(member.id);
71908     });
71909
71910
71911     var sequences = [];
71912     sequences.actions = [];
71913
71914     while (toJoin.length) {
71915         // start a new sequence
71916         var item = toJoin.shift();
71917         var currWays = [item];
71918         var currNodes = resolve(item).slice();
71919         var doneSequence = false;
71920
71921         // add to it
71922         while (toJoin.length && !doneSequence) {
71923             var start = currNodes[0];
71924             var end = currNodes[currNodes.length - 1];
71925             var fn = null;
71926             var nodes = null;
71927             var i;
71928
71929             // Find the next way/member to join.
71930             for (i = 0; i < toJoin.length; i++) {
71931                 item = toJoin[i];
71932                 nodes = resolve(item);
71933
71934                 // Strongly prefer to generate a forward path that preserves the order
71935                 // of the members array. For multipolygons and most relations, member
71936                 // order does not matter - but for routes, it does. If we started this
71937                 // sequence backwards (i.e. next member way attaches to the start node
71938                 // and not the end node), reverse the initial way before continuing.
71939                 if (currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end &&
71940                     (nodes[nodes.length - 1] === start || nodes[0] === start)
71941                 ) {
71942                     currWays[0] = reverse(currWays[0]);
71943                     currNodes.reverse();
71944                     start = currNodes[0];
71945                     end = currNodes[currNodes.length - 1];
71946                 }
71947
71948                 if (nodes[0] === end) {
71949                     fn = currNodes.push;               // join to end
71950                     nodes = nodes.slice(1);
71951                     break;
71952                 } else if (nodes[nodes.length - 1] === end) {
71953                     fn = currNodes.push;               // join to end
71954                     nodes = nodes.slice(0, -1).reverse();
71955                     item = reverse(item);
71956                     break;
71957                 } else if (nodes[nodes.length - 1] === start) {
71958                     fn = currNodes.unshift;            // join to beginning
71959                     nodes = nodes.slice(0, -1);
71960                     break;
71961                 } else if (nodes[0] === start) {
71962                     fn = currNodes.unshift;            // join to beginning
71963                     nodes = nodes.slice(1).reverse();
71964                     item = reverse(item);
71965                     break;
71966                 } else {
71967                     fn = nodes = null;
71968                 }
71969             }
71970
71971             if (!nodes) {     // couldn't find a joinable way/member
71972                 doneSequence = true;
71973                 break;
71974             }
71975
71976             fn.apply(currWays, [item]);
71977             fn.apply(currNodes, nodes);
71978
71979             toJoin.splice(i, 1);
71980         }
71981
71982         currWays.nodes = currNodes;
71983         sequences.push(currWays);
71984     }
71985
71986     return sequences;
71987 }
71988
71989 function osmRelation() {
71990     if (!(this instanceof osmRelation)) {
71991         return (new osmRelation()).initialize(arguments);
71992     } else if (arguments.length) {
71993         this.initialize(arguments);
71994     }
71995 }
71996
71997
71998 osmEntity$$1.relation = osmRelation;
71999
72000 osmRelation.prototype = Object.create(osmEntity$$1.prototype);
72001
72002
72003 osmRelation.creationOrder = function(a, b) {
72004     var aId = parseInt(osmEntity$$1.id.toOSM(a.id), 10);
72005     var bId = parseInt(osmEntity$$1.id.toOSM(b.id), 10);
72006
72007     if (aId < 0 || bId < 0) return aId - bId;
72008     return bId - aId;
72009 };
72010
72011
72012 assignIn(osmRelation.prototype, {
72013     type: 'relation',
72014     members: [],
72015
72016
72017     copy: function(resolver, copies) {
72018         if (copies[this.id])
72019             return copies[this.id];
72020
72021         var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
72022
72023         var members = this.members.map(function(member) {
72024             return assignIn({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
72025         });
72026
72027         copy = copy.update({members: members});
72028         copies[this.id] = copy;
72029
72030         return copy;
72031     },
72032
72033
72034     extent: function(resolver, memo) {
72035         return resolver.transient(this, 'extent', function() {
72036             if (memo && memo[this.id]) return geoExtent$$1();
72037             memo = memo || {};
72038             memo[this.id] = true;
72039
72040             var extent = geoExtent$$1();
72041             for (var i = 0; i < this.members.length; i++) {
72042                 var member = resolver.hasEntity(this.members[i].id);
72043                 if (member) {
72044                     extent._extend(member.extent(resolver, memo));
72045                 }
72046             }
72047             return extent;
72048         });
72049     },
72050
72051
72052     geometry: function(graph) {
72053         return graph.transient(this, 'geometry', function() {
72054             return this.isMultipolygon() ? 'area' : 'relation';
72055         });
72056     },
72057
72058
72059     isDegenerate: function() {
72060         return this.members.length === 0;
72061     },
72062
72063
72064     // Return an array of members, each extended with an 'index' property whose value
72065     // is the member index.
72066     indexedMembers: function() {
72067         var result = new Array(this.members.length);
72068         for (var i = 0; i < this.members.length; i++) {
72069             result[i] = assignIn({}, this.members[i], {index: i});
72070         }
72071         return result;
72072     },
72073
72074
72075     // Return the first member with the given role. A copy of the member object
72076     // is returned, extended with an 'index' property whose value is the member index.
72077     memberByRole: function(role) {
72078         for (var i = 0; i < this.members.length; i++) {
72079             if (this.members[i].role === role) {
72080                 return assignIn({}, this.members[i], {index: i});
72081             }
72082         }
72083     },
72084
72085     // Same as memberByRole, but returns all members with the given role
72086     membersByRole: function(role) {
72087         var result = [];
72088         for (var i = 0; i < this.members.length; i++) {
72089             if (this.members[i].role === role) {
72090                 result.push(assignIn({}, this.members[i], {index: i}));
72091             }
72092         }
72093         return result;
72094     },
72095
72096     // Return the first member with the given id. A copy of the member object
72097     // is returned, extended with an 'index' property whose value is the member index.
72098     memberById: function(id) {
72099         for (var i = 0; i < this.members.length; i++) {
72100             if (this.members[i].id === id) {
72101                 return assignIn({}, this.members[i], {index: i});
72102             }
72103         }
72104     },
72105
72106
72107     // Return the first member with the given id and role. A copy of the member object
72108     // is returned, extended with an 'index' property whose value is the member index.
72109     memberByIdAndRole: function(id, role) {
72110         for (var i = 0; i < this.members.length; i++) {
72111             if (this.members[i].id === id && this.members[i].role === role) {
72112                 return assignIn({}, this.members[i], {index: i});
72113             }
72114         }
72115     },
72116
72117
72118     addMember: function(member, index) {
72119         var members = this.members.slice();
72120         members.splice(index === undefined ? members.length : index, 0, member);
72121         return this.update({members: members});
72122     },
72123
72124
72125     updateMember: function(member, index) {
72126         var members = this.members.slice();
72127         members.splice(index, 1, assignIn({}, members[index], member));
72128         return this.update({members: members});
72129     },
72130
72131
72132     removeMember: function(index) {
72133         var members = this.members.slice();
72134         members.splice(index, 1);
72135         return this.update({members: members});
72136     },
72137
72138
72139     removeMembersWithID: function(id) {
72140         var members = reject(this.members, function(m) { return m.id === id; });
72141         return this.update({members: members});
72142     },
72143
72144
72145     // Wherever a member appears with id `needle.id`, replace it with a member
72146     // with id `replacement.id`, type `replacement.type`, and the original role,
72147     // By default, adding a duplicate member (by id and role) is prevented.
72148     // Return an updated relation.
72149     replaceMember: function(needle, replacement, keepDuplicates) {
72150         if (!this.memberById(needle.id))
72151             return this;
72152
72153         var members = [];
72154
72155         for (var i = 0; i < this.members.length; i++) {
72156             var member = this.members[i];
72157             if (member.id !== needle.id) {
72158                 members.push(member);
72159             } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
72160                 members.push({id: replacement.id, type: replacement.type, role: member.role});
72161             }
72162         }
72163
72164         return this.update({members: members});
72165     },
72166
72167
72168     asJXON: function(changeset_id) {
72169         var r = {
72170             relation: {
72171                 '@id': this.osmId(),
72172                 '@version': this.version || 0,
72173                 member: map$3(this.members, function(member) {
72174                     return {
72175                         keyAttributes: {
72176                             type: member.type,
72177                             role: member.role,
72178                             ref: osmEntity$$1.id.toOSM(member.id)
72179                         }
72180                     };
72181                 }),
72182                 tag: map$3(this.tags, function(v, k) {
72183                     return { keyAttributes: { k: k, v: v } };
72184                 })
72185             }
72186         };
72187         if (changeset_id) r.relation['@changeset'] = changeset_id;
72188         return r;
72189     },
72190
72191
72192     asGeoJSON: function(resolver) {
72193         return resolver.transient(this, 'GeoJSON', function () {
72194             if (this.isMultipolygon()) {
72195                 return {
72196                     type: 'MultiPolygon',
72197                     coordinates: this.multipolygon(resolver)
72198                 };
72199             } else {
72200                 return {
72201                     type: 'FeatureCollection',
72202                     properties: this.tags,
72203                     features: this.members.map(function (member) {
72204                         return assignIn({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
72205                     })
72206                 };
72207             }
72208         });
72209     },
72210
72211
72212     area: function(resolver) {
72213         return resolver.transient(this, 'area', function() {
72214             return d3_geoArea(this.asGeoJSON(resolver));
72215         });
72216     },
72217
72218
72219     isMultipolygon: function() {
72220         return this.tags.type === 'multipolygon';
72221     },
72222
72223
72224     isComplete: function(resolver) {
72225         for (var i = 0; i < this.members.length; i++) {
72226             if (!resolver.hasEntity(this.members[i].id)) {
72227                 return false;
72228             }
72229         }
72230         return true;
72231     },
72232
72233
72234     isRestriction: function() {
72235         return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
72236     },
72237
72238
72239     isValidRestriction: function() {
72240         if (!this.isRestriction()) return false;
72241
72242         var froms = this.members.filter(function(m) { return m.role === 'from'; });
72243         var vias = this.members.filter(function(m) { return m.role === 'via'; });
72244         var tos = this.members.filter(function(m) { return m.role === 'to'; });
72245
72246         if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
72247         if (froms.some(function(m) { return m.type !== 'way'; })) return false;
72248
72249         if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
72250         if (tos.some(function(m) { return m.type !== 'way'; })) return false;
72251
72252         if (vias.length === 0) return false;
72253         if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) return false;
72254
72255         return true;
72256     },
72257
72258
72259     // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
72260     // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
72261     //
72262     // This corresponds to the structure needed for rendering a multipolygon path using a
72263     // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
72264     //
72265     // In the case of invalid geometries, this function will still return a result which
72266     // includes the nodes of all way members, but some Nds may be unclosed and some inner
72267     // rings not matched with the intended outer ring.
72268     //
72269     multipolygon: function(resolver) {
72270         var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); });
72271         var inners = this.members.filter(function(m) { return 'inner' === m.role; });
72272
72273         outers = osmJoinWays(outers, resolver);
72274         inners = osmJoinWays(inners, resolver);
72275
72276         outers = outers.map(function(outer) { return map$3(outer.nodes, 'loc'); });
72277         inners = inners.map(function(inner) { return map$3(inner.nodes, 'loc'); });
72278
72279         var result = outers.map(function(o) {
72280             // Heuristic for detecting counterclockwise winding order. Assumes
72281             // that OpenStreetMap polygons are not hemisphere-spanning.
72282             return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
72283         });
72284
72285         function findOuter(inner) {
72286             var o, outer;
72287
72288             for (o = 0; o < outers.length; o++) {
72289                 outer = outers[o];
72290                 if (geoPolygonContainsPolygon(outer, inner))
72291                     return o;
72292             }
72293
72294             for (o = 0; o < outers.length; o++) {
72295                 outer = outers[o];
72296                 if (geoPolygonIntersectsPolygon(outer, inner, false))
72297                     return o;
72298             }
72299         }
72300
72301         for (var i = 0; i < inners.length; i++) {
72302             var inner = inners[i];
72303
72304             if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
72305                 inner = inner.reverse();
72306             }
72307
72308             var o = findOuter(inners[i]);
72309             if (o !== undefined)
72310                 result[o].push(inners[i]);
72311             else
72312                 result.push([inners[i]]); // Invalid geometry
72313         }
72314
72315         return result;
72316     }
72317 });
72318
72319 function osmTurn(turn) {
72320     if (!(this instanceof osmTurn)) {
72321         return new osmTurn(turn);
72322     }
72323     assignIn(this, turn);
72324 }
72325
72326
72327 function osmIntersection(graph, startVertexId, maxDistance) {
72328     maxDistance = maxDistance || 30;    // in meters
72329     var vgraph = coreGraph$$1();           // virtual graph
72330     var i, j, k;
72331
72332
72333     function memberOfRestriction(entity) {
72334         return graph.parentRelations(entity)
72335             .some(function(r) { return r.isRestriction(); });
72336     }
72337
72338     function isRoad(way) {
72339         if (way.isArea() || way.isDegenerate()) return false;
72340         var roads = {
72341             'motorway': true,
72342             'motorway_link': true,
72343             'trunk': true,
72344             'trunk_link': true,
72345             'primary': true,
72346             'primary_link': true,
72347             'secondary': true,
72348             'secondary_link': true,
72349             'tertiary': true,
72350             'tertiary_link': true,
72351             'residential': true,
72352             'unclassified': true,
72353             'living_street': true,
72354             'service': true,
72355             'road': true,
72356             'track': true
72357         };
72358         return roads[way.tags.highway];
72359     }
72360
72361
72362     var startNode = graph.entity(startVertexId);
72363     var checkVertices = [startNode];
72364     var checkWays;
72365     var vertices = [];
72366     var vertexIds = [];
72367     var vertex;
72368     var ways = [];
72369     var wayIds = [];
72370     var way;
72371     var nodes = [];
72372     var node;
72373     var parents = [];
72374     var parent;
72375
72376     // `actions` will store whatever actions must be performed to satisfy
72377     // preconditions for adding a turn restriction to this intersection.
72378     //  - Remove any existing degenerate turn restrictions (missing from/to, etc)
72379     //  - Reverse oneways so that they are drawn in the forward direction
72380     //  - Split ways on key vertices
72381     var actions = [];
72382
72383
72384     // STEP 1:  walk the graph outwards from starting vertex to search
72385     //  for more key vertices and ways to include in the intersection..
72386
72387     while (checkVertices.length) {
72388         vertex = checkVertices.pop();
72389
72390         // check this vertex for parent ways that are roads
72391         checkWays = graph.parentWays(vertex);
72392         var hasWays = false;
72393         for (i = 0; i < checkWays.length; i++) {
72394             way = checkWays[i];
72395             if (!isRoad(way) && !memberOfRestriction(way)) continue;
72396
72397             ways.push(way);   // it's a road, or it's already in a turn restriction
72398             hasWays = true;
72399
72400             // check the way's children for more key vertices
72401             nodes = uniq(graph.childNodes(way));
72402             for (j = 0; j < nodes.length; j++) {
72403                 node = nodes[j];
72404                 if (node === vertex) continue;                                           // same thing
72405                 if (vertices.indexOf(node) !== -1) continue;                             // seen it already
72406                 if (node.loc && startNode.loc &&
72407                     geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue;   // too far from start
72408
72409                 // a key vertex will have parents that are also roads
72410                 var hasParents = false;
72411                 parents = graph.parentWays(node);
72412                 for (k = 0; k < parents.length; k++) {
72413                     parent = parents[k];
72414                     if (parent === way) continue;                 // same thing
72415                     if (ways.indexOf(parent) !== -1) continue;    // seen it already
72416                     if (!isRoad(parent)) continue;                // not a road
72417                     hasParents = true;
72418                     break;
72419                 }
72420
72421                 if (hasParents) {
72422                     checkVertices.push(node);
72423                 }
72424             }
72425         }
72426
72427         if (hasWays) {
72428             vertices.push(vertex);
72429         }
72430     }
72431
72432     vertices = uniq(vertices);
72433     ways = uniq(ways);
72434
72435
72436     // STEP 2:  Build a virtual graph containing only the entities in the intersection..
72437     // Everything done after this step should act on the virtual graph
72438     // Any actions that must be performed later to the main graph go in `actions` array
72439     ways.forEach(function(way) {
72440         graph.childNodes(way).forEach(function(node) {
72441             vgraph = vgraph.replace(node);
72442         });
72443
72444         vgraph = vgraph.replace(way);
72445
72446         graph.parentRelations(way).forEach(function(relation) {
72447             if (relation.isRestriction()) {
72448                 if (relation.isValidRestriction(graph)) {
72449                     vgraph = vgraph.replace(relation);
72450                 } else if (relation.isComplete(graph)) {
72451                     actions.push(actionDeleteRelation(relation.id));
72452                 }
72453             }
72454         });
72455     });
72456
72457
72458     // STEP 3:  Force all oneways to be drawn in the forward direction
72459     ways.forEach(function(w) {
72460         var way = vgraph.entity(w.id);
72461         if (way.tags.oneway === '-1') {
72462             var action = actionReverse(way.id, { reverseOneway: true });
72463             actions.push(action);
72464             vgraph = action(vgraph);
72465         }
72466     });
72467
72468
72469     // STEP 4:  Split ways on key vertices
72470     var origCount = osmEntity$$1.id.next.way;
72471     vertices.forEach(function(v) {
72472         // This is an odd way to do it, but we need to find all the ways that
72473         // will be split here, then split them one at a time to ensure that these
72474         // actions can be replayed on the main graph exactly in the same order.
72475         // (It is unintuitive, but the order of ways returned from graph.parentWays()
72476         // is arbitrary, depending on how the main graph and vgraph were built)
72477         var splitAll = actionSplit(v.id);
72478         if (!splitAll.disabled(vgraph)) {
72479             splitAll.ways(vgraph).forEach(function(way) {
72480                 var splitOne = actionSplit(v.id).limitWays([way.id]);
72481                 actions.push(splitOne);
72482                 vgraph = splitOne(vgraph);
72483             });
72484         }
72485     });
72486
72487     // In here is where we should also split the intersection at nearby junction.
72488     //   for https://github.com/mapbox/iD-internal/issues/31
72489     // nearbyVertices.forEach(function(v) {
72490     // });
72491
72492     // Reasons why we reset the way id count here:
72493     //  1. Continuity with way ids created by the splits so that we can replay
72494     //     these actions later if the user decides to create a turn restriction
72495     //  2. Avoids churning way ids just by hovering over a vertex
72496     //     and displaying the turn restriction editor
72497     osmEntity$$1.id.next.way = origCount;
72498
72499
72500     // STEP 5:  Update arrays to point to vgraph entities
72501     vertexIds = vertices.map(function(v) { return v.id; });
72502     vertices = [];
72503     ways = [];
72504
72505     vertexIds.forEach(function(id) {
72506         var vertex = vgraph.entity(id);
72507         var parents = vgraph.parentWays(vertex);
72508         vertices.push(vertex);
72509         ways = ways.concat(parents);
72510     });
72511
72512     vertices = uniq(vertices);
72513     ways = uniq(ways);
72514
72515     vertexIds = vertices.map(function(v) { return v.id; });
72516     wayIds = ways.map(function(w) { return w.id; });
72517
72518
72519     // STEP 6:  Update the ways with some metadata that will be useful for
72520     // walking the intersection graph later and rendering turn arrows.
72521
72522     function withMetadata(way, vertexIds) {
72523         var __oneWay = way.isOneWay();
72524
72525         // which affixes are key vertices?
72526         var __first = (vertexIds.indexOf(way.first()) !== -1);
72527         var __last = (vertexIds.indexOf(way.last()) !== -1);
72528
72529         // what roles is this way eligible for?
72530         var __via = (__first && __last);
72531         var __from = ((__first && !__oneWay) || __last);
72532         var __to = (__first || (__last && !__oneWay));
72533
72534         return way.update({
72535             __first:  __first,
72536             __last:  __last,
72537             __from:  __from,
72538             __via: __via,
72539             __to:  __to,
72540             __oneWay:  __oneWay
72541         });
72542     }
72543
72544     ways = [];
72545     wayIds.forEach(function(id) {
72546         var way = withMetadata(vgraph.entity(id), vertexIds);
72547         vgraph = vgraph.replace(way);
72548         ways.push(way);
72549     });
72550
72551
72552     // STEP 7:  Simplify - This is an iterative process where we:
72553     //  1. Find trivial vertices with only 2 parents
72554     //  2. trim off the leaf way from those vertices and remove from vgraph
72555
72556     var keepGoing;
72557     var removeWayIds = [];
72558     var removeVertexIds = [];
72559
72560     do {
72561         keepGoing = false;
72562         checkVertices = vertexIds.slice();
72563
72564         for (i = 0; i < checkVertices.length; i++) {
72565             var vertexId = checkVertices[i];
72566             vertex = vgraph.hasEntity(vertexId);
72567
72568             if (!vertex) {
72569                 if (vertexIds.indexOf(vertexId) !== -1) {
72570                     vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
72571                 }
72572                 removeVertexIds.push(vertexId);
72573                 continue;
72574             }
72575
72576             parents = vgraph.parentWays(vertex);
72577             if (parents.length < 3) {
72578                 if (vertexIds.indexOf(vertexId) !== -1) {
72579                     vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
72580                 }
72581             }
72582
72583             if (parents.length === 2) {     // vertex with 2 parents is trivial
72584                 var a = parents[0];
72585                 var b = parents[1];
72586                 var aIsLeaf = a && !a.__via;
72587                 var bIsLeaf = b && !b.__via;
72588                 var leaf, survivor;
72589
72590                 if (aIsLeaf && !bIsLeaf) {
72591                     leaf = a;
72592                     survivor = b;
72593                 } else if (!aIsLeaf && bIsLeaf) {
72594                     leaf = b;
72595                     survivor = a;
72596                 }
72597
72598                 if (leaf && survivor) {
72599                     survivor = withMetadata(survivor, vertexIds);      // update survivor way
72600                     vgraph = vgraph.replace(survivor).remove(leaf);    // update graph
72601                     removeWayIds.push(leaf.id);
72602                     keepGoing = true;
72603                 }
72604             }
72605
72606             parents = vgraph.parentWays(vertex);
72607
72608             if (parents.length < 2) {     // vertex is no longer a key vertex
72609                 if (vertexIds.indexOf(vertexId) !== -1) {
72610                     vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
72611                 }
72612                 removeVertexIds.push(vertexId);
72613                 keepGoing = true;
72614             }
72615
72616             if (parents.length < 1) {     // vertex is no longer attached to anything
72617                 vgraph = vgraph.remove(vertex);
72618             }
72619
72620         }
72621     } while (keepGoing);
72622
72623
72624     vertices = vertices
72625         .filter(function(vertex) { return removeVertexIds.indexOf(vertex.id) === -1; })
72626         .map(function(vertex) { return vgraph.entity(vertex.id); });
72627     ways = ways
72628         .filter(function(way) { return removeWayIds.indexOf(way.id) === -1; })
72629         .map(function(way) { return vgraph.entity(way.id); });
72630
72631
72632     // OK!  Here is our intersection..
72633     var intersection = {
72634         graph: vgraph,
72635         actions: actions,
72636         vertices: vertices,
72637         ways: ways,
72638     };
72639
72640
72641
72642     // Get all the valid turns through this intersection given a starting way id.
72643     // This operates on the virtual graph for everything.
72644     //
72645     // Basically, walk through all possible paths from starting way,
72646     //   honoring the existing turn restrictions as we go (watch out for loops!)
72647     //
72648     // For each path found, generate and return a `osmTurn` datastructure.
72649     //
72650     intersection.turns = function(fromWayId, maxViaWay) {
72651         if (!fromWayId) return [];
72652         if (!maxViaWay) maxViaWay = 0;
72653
72654         var vgraph = intersection.graph;
72655         var keyVertexIds = intersection.vertices.map(function(v) { return v.id; });
72656
72657         var start = vgraph.entity(fromWayId);
72658         if (!start || !(start.__from || start.__via)) return [];
72659
72660         // maxViaWay=0   from-*-to              (0 vias)
72661         // maxViaWay=1   from-*-via-*-to        (1 via max)
72662         // maxViaWay=2   from-*-via-*-via-*-to  (2 vias max)
72663         var maxPathLength = (maxViaWay * 2) + 3;
72664         var turns = [];
72665
72666         step(start);
72667         return turns;
72668
72669
72670         // traverse the intersection graph and find all the valid paths
72671         function step(entity, currPath, currRestrictions, matchedRestriction) {
72672             currPath = clone(currPath || []);
72673             if (currPath.length >= maxPathLength) return;
72674             currPath.push(entity.id);
72675             currRestrictions = clone(currRestrictions || []);
72676             var i, j;
72677
72678             if (entity.type === 'node') {
72679                 var parents = vgraph.parentWays(entity);
72680                 var nextWays = [];
72681
72682                 // which ways can we step into?
72683                 for (i = 0; i < parents.length; i++) {
72684                     var way = parents[i];
72685
72686                     // if next way is a oneway incoming to this vertex, skip
72687                     if (way.__oneWay && way.nodes[0] !== entity.id) continue;
72688
72689                     // if we have seen it before (allowing for an initial u-turn), skip
72690                     if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue;
72691
72692                     // Check all "current" restrictions (where we've already walked the `FROM`)
72693                     var restrict = undefined;
72694                     for (j = 0; j < currRestrictions.length; j++) {
72695                         var restriction = currRestrictions[j];
72696                         var f = restriction.memberByRole('from');
72697                         var v = restriction.membersByRole('via');
72698                         var t = restriction.memberByRole('to');
72699                         var isOnly = /^only_/.test(restriction.tags.restriction);
72700
72701                         // Does the current path match this turn restriction?
72702                         var matchesFrom = (f.id === fromWayId);
72703                         var matchesViaTo = false;
72704                         var isAlongOnlyPath = false;
72705
72706                         if (t.id === way.id) {     // match VIA, TO
72707                             if (v.length === 1 && v[0].type === 'node' && v[0].id === entity.id) {
72708                                 matchesViaTo = true;    // match VIA node
72709                             } else if (every(v, function(via) { return currPath.indexOf(via.id) !== -1; })) {
72710                                 matchesViaTo = true;    // match all VIA ways
72711                             }
72712
72713                         } else if (isOnly) {
72714                             for (k = 0; k < v.length; k++) {
72715                                 // way doesn't match TO, but is one of the via ways along the path of an "only"
72716                                 if (v[k].type === 'way' && v[k].id === way.id) {
72717                                     isAlongOnlyPath = true;
72718                                     break;
72719                                 }
72720                             }
72721                         }
72722
72723                         if (matchesViaTo) {
72724                             if (isOnly) {
72725                                 restrict = { id: restriction.id, direct: matchesFrom, from: f.id, only: true, end: true };
72726                             } else {
72727                                 restrict = { id: restriction.id, direct: matchesFrom, from: f.id, no: true, end: true };
72728                             }
72729                         } else {    // indirect - caused by a different nearby restriction
72730                             if (isAlongOnlyPath) {
72731                                 restrict = { id: restriction.id, direct: false, from: f.id, only: true, end: false };
72732                             } else if (isOnly) {
72733                                 restrict = { id: restriction.id, direct: false, from: f.id, no: true, end: true };
72734                             }
72735                         }
72736
72737                         // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
72738                         if (restrict && restrict.direct)
72739                             break;
72740                     }
72741
72742                     nextWays.push({ way: way, restrict: restrict });
72743                 }
72744
72745                 nextWays.forEach(function(nextWay) {
72746                     step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
72747                 });
72748
72749
72750             } else {  // entity.type === 'way'
72751                 if (currPath.length >= 3) {     // this is a "complete" path..
72752                     var turnPath = clone(currPath);
72753
72754                     // an indirect restriction - only include the partial path (starting at FROM)
72755                     if (matchedRestriction && matchedRestriction.direct === false) {
72756                         for (i = 0; i < turnPath.length; i++) {
72757                             if (turnPath[i] === matchedRestriction.from) {
72758                                 turnPath = turnPath.slice(i);
72759                                 break;
72760                             }
72761                         }
72762                     }
72763
72764                     var turn = pathToTurn(turnPath);
72765                     if (turn) {
72766                         if (matchedRestriction) {
72767                             turn.restrictionID = matchedRestriction.id;
72768                             turn.no = matchedRestriction.no;
72769                             turn.only = matchedRestriction.only;
72770                             turn.direct = matchedRestriction.direct;
72771                         }
72772                         turns.push(osmTurn(turn));
72773                     }
72774
72775                     if (currPath[0] === currPath[2]) return;   // if we made a u-turn - stop here
72776                 }
72777
72778                 if (matchedRestriction && matchedRestriction.end) return;  // don't advance any further
72779
72780                 // which nodes can we step into?
72781                 var n1 = vgraph.entity(entity.first());
72782                 var n2 = vgraph.entity(entity.last());
72783                 var dist = n1.loc && n2.loc && geoSphericalDistance(n1.loc, n2.loc);
72784                 var nextNodes = [];
72785
72786                 if (currPath.length > 1) {
72787                     if (dist > maxDistance) return;   // the next node is too far
72788                     if (!entity.__via) return;        // this way is a leaf / can't be a via
72789                 }
72790
72791                 if (!entity.__oneWay &&                     // bidirectional..
72792                     keyVertexIds.indexOf(n1.id) !== -1 &&   // key vertex..
72793                     currPath.indexOf(n1.id) === -1) {       // haven't seen it yet..
72794                     nextNodes.push(n1);                     // can advance to first node
72795                 }
72796                 if (keyVertexIds.indexOf(n2.id) !== -1 &&   // key vertex..
72797                     currPath.indexOf(n2.id) === -1) {       // haven't seen it yet..
72798                     nextNodes.push(n2);                     // can advance to last node
72799                 }
72800
72801                 nextNodes.forEach(function(nextNode) {
72802                     // gather restrictions FROM this way
72803                     var fromRestrictions = vgraph.parentRelations(entity).filter(function(r) {
72804                         if (!r.isRestriction()) return false;
72805
72806                         var f = r.memberByRole('from');
72807                         if (!f || f.id !== entity.id) return false;
72808
72809                         var isOnly = /^only_/.test(r.tags.restriction);
72810                         if (!isOnly) return true;
72811
72812                         // `only_` restrictions only matter along the direction of the VIA - #4849
72813                         var isOnlyVia = false;
72814                         var v = r.membersByRole('via');
72815                         if (v.length === 1 && v[0].type === 'node') {   // via node
72816                             isOnlyVia = (v[0].id === nextNode.id);
72817                         } else {                                        // via way(s)
72818                             for (k = 0; k < v.length; k++) {
72819                                 if (v[k].type === 'way' && vgraph.entity(v[k].id).first() === nextNode.id) {
72820                                     isOnlyVia = true;
72821                                     break;
72822                                 }
72823                             }
72824                         }
72825                         return isOnlyVia;
72826                     });
72827
72828                     step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
72829                 });
72830             }
72831         }
72832
72833
72834         // assumes path is alternating way-node-way of odd length
72835         function pathToTurn(path) {
72836             if (path.length < 3) return;
72837             var fromWayId, fromNodeId, fromVertexId;
72838             var toWayId, toNodeId, toVertexId;
72839             var viaWayIds, viaNodeId, isUturn;
72840
72841             fromWayId = path[0];
72842             toWayId = path[path.length - 1];
72843
72844             if (path.length === 3 && fromWayId === toWayId) {  // u turn
72845                 var way = vgraph.entity(fromWayId);
72846                 if (way.__oneWay) return null;
72847
72848                 isUturn = true;
72849                 viaNodeId = fromVertexId = toVertexId = path[1];
72850                 fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
72851
72852             } else {
72853                 isUturn = false;
72854                 fromVertexId = path[1];
72855                 fromNodeId = adjacentNode(fromWayId, fromVertexId);
72856                 toVertexId = path[path.length - 2];
72857                 toNodeId = adjacentNode(toWayId, toVertexId);
72858
72859                 if (path.length === 3) {
72860                     viaNodeId = path[1];
72861                 } else {
72862                     viaWayIds = path.filter(function(entityId) { return entityId[0] === 'w'; });
72863                     viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1);  // remove first, last
72864                 }
72865             }
72866
72867             return {
72868                 key:  path.join('_'),
72869                 path: path,
72870                 from: { node: fromNodeId, way:  fromWayId, vertex: fromVertexId },
72871                 via:  { node: viaNodeId,  ways: viaWayIds },
72872                 to:   { node: toNodeId,   way:  toWayId, vertex: toVertexId },
72873                 u:    isUturn
72874             };
72875
72876
72877             function adjacentNode(wayId, affixId) {
72878                 var nodes = vgraph.entity(wayId).nodes;
72879                 return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
72880             }
72881         }
72882
72883     };
72884
72885     return intersection;
72886 }
72887
72888
72889 function osmInferRestriction(graph, turn, projection) {
72890     var fromWay = graph.entity(turn.from.way);
72891     var fromNode = graph.entity(turn.from.node);
72892     var fromVertex = graph.entity(turn.from.vertex);
72893     var toWay = graph.entity(turn.to.way);
72894     var toNode = graph.entity(turn.to.node);
72895     var toVertex = graph.entity(turn.to.vertex);
72896
72897     var fromOneWay = (fromWay.tags.oneway === 'yes');
72898     var toOneWay = (toWay.tags.oneway === 'yes');
72899     var angle = (geoAngle(fromVertex, fromNode, projection) -
72900                 geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
72901
72902     while (angle < 0)
72903         angle += 360;
72904
72905     if (fromNode === toNode)
72906         return 'no_u_turn';
72907     if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
72908         return 'no_u_turn';   // wider tolerance for u-turn if both ways are oneway
72909     if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex)
72910         return 'no_u_turn';   // even wider tolerance for u-turn if there is a via way (from !== to)
72911     if (angle < 158)
72912         return 'no_right_turn';
72913     if (angle > 202)
72914         return 'no_left_turn';
72915
72916     return 'no_straight_on';
72917 }
72918
72919 function actionAddMember(relationId, member, memberIndex, insertPair) {
72920
72921     return function action(graph) {
72922         var relation = graph.entity(relationId);
72923
72924         // There are some special rules for Public Transport v2 routes.
72925         var isPTv2 = (member.role === 'stop' || member.role === 'platform');
72926
72927         if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) {
72928             // Try to perform sensible inserts based on how the ways join together
72929             graph = addWayMember(relation, graph);
72930         } else {
72931             // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
72932             // Stops and Platforms for PTv2 should be ordered first.
72933             // hack: We do not currently have the ability to place them in the exactly correct order.
72934             if (isPTv2 && isNaN(memberIndex)) {
72935                 memberIndex = 0;
72936             }
72937
72938             graph = graph.replace(relation.addMember(member, memberIndex));
72939         }
72940
72941         return graph;
72942     };
72943
72944
72945     // Add a way member into the relation "wherever it makes sense".
72946     // In this situation we were not supplied a memberIndex.
72947     function addWayMember(relation, graph) {
72948         var groups, tempWay, item, i, j, k;
72949
72950         // remove PTv2 stops and platforms before doing anything.
72951         var PTv2members = [];
72952         var members = [];
72953         for (i = 0; i < relation.members.length; i++) {
72954             var m = relation.members[i];
72955             if (m.role === 'stop' || m.role === 'platform') {
72956                 PTv2members.push(m);
72957             } else {
72958                 members.push(m);
72959             }
72960         }
72961         relation = relation.update({ members: members });
72962
72963
72964         if (insertPair) {
72965             // We're adding a member that must stay paired with an existing member.
72966             // (This feature is used by `actionSplit`)
72967             //
72968             // This is tricky because the members may exist multiple times in the
72969             // member list, and with different A-B/B-A ordering and different roles.
72970             // (e.g. a bus route that loops out and back - #4589).
72971             //
72972             // Replace the existing member with a temporary way,
72973             // so that `osmJoinWays` can treat the pair like a single way.
72974             tempWay = osmWay({ id: 'wTemp', nodes: insertPair.nodes });
72975             graph = graph.replace(tempWay);
72976             var tempMember = { id: tempWay.id, type: 'way', role: member.role };
72977             var tempRelation = relation.replaceMember({id: insertPair.originalID}, tempMember, true);
72978             groups = groupBy(tempRelation.members, function(m) { return m.type; });
72979             groups.way = groups.way || [];
72980
72981         } else {
72982             // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
72983             groups = groupBy(relation.members, function(m) { return m.type; });
72984             groups.way = groups.way || [];
72985             groups.way.push(member);
72986         }
72987
72988         members = withIndex(groups.way);
72989         var joined = osmJoinWays(members, graph);
72990
72991         // `joined` might not contain all of the way members,
72992         // But will contain only the completed (downloaded) members
72993         for (i = 0; i < joined.length; i++) {
72994             var segment = joined[i];
72995             var nodes = segment.nodes.slice();
72996             var startIndex = segment[0].index;
72997
72998             // j = array index in `members` where this segment starts
72999             for (j = 0; j < members.length; j++) {
73000                 if (members[j].index === startIndex) {
73001                     break;
73002                 }
73003             }
73004
73005             // k = each member in segment
73006             for (k = 0; k < segment.length; k++) {
73007                 item = segment[k];
73008                 var way = graph.entity(item.id);
73009
73010                 // If this is a paired item, generate members in correct order and role
73011                 if (tempWay && item.id === tempWay.id) {
73012                     if (nodes[0].id === insertPair.nodes[0]) {
73013                         item.pair = [
73014                             { id: insertPair.originalID, type: 'way', role: item.role },
73015                             { id: insertPair.insertedID, type: 'way', role: item.role }
73016                         ];
73017                     } else {
73018                         item.pair = [
73019                             { id: insertPair.insertedID, type: 'way', role: item.role },
73020                             { id: insertPair.originalID, type: 'way', role: item.role }
73021                         ];
73022                     }
73023                 }
73024
73025                 // reorder `members` if necessary
73026                 if (k > 0) {
73027                     if (j+k >= members.length || item.index !== members[j+k].index) {
73028                         moveMember(members, item.index, j+k);
73029                     }
73030                 }
73031
73032                 nodes.splice(0, way.nodes.length - 1);
73033             }
73034         }
73035
73036         if (tempWay) {
73037             graph = graph.remove(tempWay);
73038         }
73039
73040         // Final pass: skip dead items, split pairs, remove index properties
73041         var wayMembers = [];
73042         for (i = 0; i < members.length; i++) {
73043             item = members[i];
73044             if (item.index === -1) continue;
73045
73046             if (item.pair) {
73047                 wayMembers.push(item.pair[0]);
73048                 wayMembers.push(item.pair[1]);
73049             } else {
73050                 wayMembers.push(omit(item, 'index'));
73051             }
73052         }
73053
73054         // Put stops and platforms first, then nodes, ways, relations
73055         // This is recommended for Public Transport v2 routes:
73056         // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
73057         var newMembers = PTv2members.concat( (groups.node || []), wayMembers, (groups.relation || []) );
73058
73059         return graph.replace(relation.update({members: newMembers}));
73060
73061
73062         // `moveMember()` changes the `members` array in place by splicing
73063         // the item with `.index = findIndex` to where it belongs,
73064         // and marking the old position as "dead" with `.index = -1`
73065         //
73066         // j=5, k=0                jk
73067         // segment                 5 4 7 6
73068         // members       0 1 2 3 4 5 6 7 8 9        keep 5 in j+k
73069         //
73070         // j=5, k=1                j k
73071         // segment                 5 4 7 6
73072         // members       0 1 2 3 4 5 6 7 8 9        move 4 to j+k
73073         // members       0 1 2 3 x 5 4 6 7 8 9      moved
73074         //
73075         // j=5, k=2                j   k
73076         // segment                 5 4 7 6
73077         // members       0 1 2 3 x 5 4 6 7 8 9      move 7 to j+k
73078         // members       0 1 2 3 x 5 4 7 6 x 8 9    moved
73079         //
73080         // j=5, k=3                j     k
73081         // segment                 5 4 7 6
73082         // members       0 1 2 3 x 5 4 7 6 x 8 9    keep 6 in j+k
73083         //
73084         function moveMember(arr, findIndex, toIndex) {
73085             for (var i = 0; i < arr.length; i++) {
73086                 if (arr[i].index === findIndex) {
73087                     break;
73088                 }
73089             }
73090
73091             var item = clone(arr[i]);
73092             arr[i].index = -1;   // mark as dead
73093             item.index = toIndex;
73094             arr.splice(toIndex, 0, item);
73095         }
73096
73097
73098         // This is the same as `Relation.indexedMembers`,
73099         // Except we don't want to index all the members, only the ways
73100         function withIndex(arr) {
73101             var result = new Array(arr.length);
73102             for (var i = 0; i < arr.length; i++) {
73103                 result[i] = arr[i];
73104                 result[i].index = i;
73105             }
73106             return result;
73107         }
73108     }
73109
73110 }
73111
73112 function actionAddMidpoint(midpoint, node) {
73113     return function(graph) {
73114         graph = graph.replace(node.move(midpoint.loc));
73115
73116         var parents = intersection(
73117             graph.parentWays(graph.entity(midpoint.edge[0])),
73118             graph.parentWays(graph.entity(midpoint.edge[1])));
73119
73120         parents.forEach(function(way) {
73121             for (var i = 0; i < way.nodes.length - 1; i++) {
73122                 if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
73123                     graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
73124
73125                     // Add only one midpoint on doubled-back segments,
73126                     // turning them into self-intersections.
73127                     return;
73128                 }
73129             }
73130         });
73131
73132         return graph;
73133     };
73134 }
73135
73136 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
73137 function actionAddVertex(wayId, nodeId, index) {
73138     return function(graph) {
73139         return graph.replace(graph.entity(wayId).addNode(nodeId, index));
73140     };
73141 }
73142
73143 function actionChangeMember(relationId, member, memberIndex) {
73144     return function(graph) {
73145         return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
73146     };
73147 }
73148
73149 function actionChangePreset(entityId, oldPreset, newPreset) {
73150     return function(graph) {
73151         var entity = graph.entity(entityId),
73152             geometry = entity.geometry(graph),
73153             tags = entity.tags;
73154
73155         if (oldPreset) tags = oldPreset.removeTags(tags, geometry);
73156         if (newPreset) tags = newPreset.applyTags(tags, geometry);
73157
73158         return graph.replace(entity.update({tags: tags}));
73159     };
73160 }
73161
73162 function actionChangeTags(entityId, tags) {
73163     return function(graph) {
73164         var entity = graph.entity(entityId);
73165         return graph.replace(entity.update({tags: tags}));
73166     };
73167 }
73168
73169 function actionCircularize(wayId, projection, maxAngle) {
73170     maxAngle = (maxAngle || 20) * Math.PI / 180;
73171
73172
73173     var action = function(graph, t) {
73174         if (t === null || !isFinite(t)) t = 1;
73175         t = Math.min(Math.max(+t, 0), 1);
73176
73177         var way = graph.entity(wayId),
73178             origNodes = {};
73179
73180         graph.childNodes(way).forEach(function(node) {
73181             if (!origNodes[node.id]) origNodes[node.id] = node;
73182         });
73183
73184         if (!way.isConvex(graph)) {
73185             graph = action.makeConvex(graph);
73186         }
73187
73188         var nodes = uniq(graph.childNodes(way)),
73189             keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; }),
73190             points = nodes.map(function(n) { return projection(n.loc); }),
73191             keyPoints = keyNodes.map(function(n) { return projection(n.loc); }),
73192             centroid = (points.length === 2) ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points),
73193             radius = d3_median(points, function(p) { return geoVecLength(centroid, p); }),
73194             sign = d3_polygonArea(points) > 0 ? 1 : -1,
73195             ids;
73196
73197         // we need atleast two key nodes for the algorithm to work
73198         if (!keyNodes.length) {
73199             keyNodes = [nodes[0]];
73200             keyPoints = [points[0]];
73201         }
73202
73203         if (keyNodes.length === 1) {
73204             var index = nodes.indexOf(keyNodes[0]),
73205                 oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
73206
73207             keyNodes.push(nodes[oppositeIndex]);
73208             keyPoints.push(points[oppositeIndex]);
73209         }
73210
73211         // key points and nodes are those connected to the ways,
73212         // they are projected onto the circle, inbetween nodes are moved
73213         // to constant intervals between key nodes, extra inbetween nodes are
73214         // added if necessary.
73215         for (var i = 0; i < keyPoints.length; i++) {
73216             var nextKeyNodeIndex = (i + 1) % keyNodes.length,
73217                 startNode = keyNodes[i],
73218                 endNode = keyNodes[nextKeyNodeIndex],
73219                 startNodeIndex = nodes.indexOf(startNode),
73220                 endNodeIndex = nodes.indexOf(endNode),
73221                 numberNewPoints = -1,
73222                 indexRange = endNodeIndex - startNodeIndex,
73223                 nearNodes = {},
73224                 inBetweenNodes = [],
73225                 startAngle, endAngle, totalAngle, eachAngle,
73226                 angle, loc, node, origNode, j;
73227
73228             if (indexRange < 0) {
73229                 indexRange += nodes.length;
73230             }
73231
73232             // position this key node
73233             var distance = geoVecLength(centroid, keyPoints[i]);
73234             if (distance === 0) { distance = 1e-4; }
73235             keyPoints[i] = [
73236                 centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
73237                 centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
73238             ];
73239             loc = projection.invert(keyPoints[i]);
73240             node = keyNodes[i];
73241             origNode = origNodes[node.id];
73242             node = node.move(geoVecInterp(origNode.loc, loc, t));
73243             graph = graph.replace(node);
73244
73245             // figure out the between delta angle we want to match to
73246             startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
73247             endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
73248             totalAngle = endAngle - startAngle;
73249
73250             // detects looping around -pi/pi
73251             if (totalAngle * sign > 0) {
73252                 totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
73253             }
73254
73255             do {
73256                 numberNewPoints++;
73257                 eachAngle = totalAngle / (indexRange + numberNewPoints);
73258             } while (Math.abs(eachAngle) > maxAngle);
73259
73260
73261             // move existing nodes
73262             for (j = 1; j < indexRange; j++) {
73263                 angle = startAngle + j * eachAngle;
73264                 loc = projection.invert([
73265                     centroid[0] + Math.cos(angle) * radius,
73266                     centroid[1] + Math.sin(angle) * radius
73267                 ]);
73268
73269                 node = nodes[(j + startNodeIndex) % nodes.length];
73270                 origNode = origNodes[node.id];
73271                 nearNodes[node.id] = angle;
73272
73273                 node = node.move(geoVecInterp(origNode.loc, loc, t));
73274                 graph = graph.replace(node);
73275             }
73276
73277             // add new inbetween nodes if necessary
73278             for (j = 0; j < numberNewPoints; j++) {
73279                 angle = startAngle + (indexRange + j) * eachAngle;
73280                 loc = projection.invert([
73281                     centroid[0] + Math.cos(angle) * radius,
73282                     centroid[1] + Math.sin(angle) * radius
73283                 ]);
73284
73285                 // choose a nearnode to use as the original
73286                 var min$$1 = Infinity;
73287                 for (var nodeId in nearNodes) {
73288                     var nearAngle = nearNodes[nodeId],
73289                         dist = Math.abs(nearAngle - angle);
73290                     if (dist < min$$1) {
73291                         dist = min$$1;
73292                         origNode = origNodes[nodeId];
73293                     }
73294                 }
73295
73296                 node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
73297                 graph = graph.replace(node);
73298
73299                 nodes.splice(endNodeIndex + j, 0, node);
73300                 inBetweenNodes.push(node.id);
73301             }
73302
73303             // Check for other ways that share these keyNodes..
73304             // If keyNodes are adjacent in both ways,
73305             // we can add inBetween nodes to that shared way too..
73306             if (indexRange === 1 && inBetweenNodes.length) {
73307                 var startIndex1 = way.nodes.lastIndexOf(startNode.id),
73308                     endIndex1 = way.nodes.lastIndexOf(endNode.id),
73309                     wayDirection1 = (endIndex1 - startIndex1);
73310                 if (wayDirection1 < -1) { wayDirection1 = 1; }
73311
73312                 /* eslint-disable no-loop-func */
73313                 forEach(without(graph.parentWays(keyNodes[i]), way), function(sharedWay) {
73314                     if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
73315                         var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id),
73316                             endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id),
73317                             wayDirection2 = (endIndex2 - startIndex2),
73318                             insertAt = endIndex2;
73319                         if (wayDirection2 < -1) { wayDirection2 = 1; }
73320
73321                         if (wayDirection1 !== wayDirection2) {
73322                             inBetweenNodes.reverse();
73323                             insertAt = startIndex2;
73324                         }
73325                         for (j = 0; j < inBetweenNodes.length; j++) {
73326                             sharedWay = sharedWay.addNode(inBetweenNodes[j], insertAt + j);
73327                         }
73328                         graph = graph.replace(sharedWay);
73329                     }
73330                 });
73331                 /* eslint-enable no-loop-func */
73332             }
73333
73334         }
73335
73336         // update the way to have all the new nodes
73337         ids = nodes.map(function(n) { return n.id; });
73338         ids.push(ids[0]);
73339
73340         way = way.update({nodes: ids});
73341         graph = graph.replace(way);
73342
73343         return graph;
73344     };
73345
73346
73347     action.makeConvex = function(graph) {
73348         var way = graph.entity(wayId),
73349             nodes = uniq(graph.childNodes(way)),
73350             points = nodes.map(function(n) { return projection(n.loc); }),
73351             sign = d3_polygonArea(points) > 0 ? 1 : -1,
73352             hull = d3_polygonHull(points);
73353
73354         // D3 convex hulls go counterclockwise..
73355         if (sign === -1) {
73356             nodes.reverse();
73357             points.reverse();
73358         }
73359
73360         for (var i = 0; i < hull.length - 1; i++) {
73361             var startIndex = points.indexOf(hull[i]),
73362                 endIndex = points.indexOf(hull[i+1]),
73363                 indexRange = (endIndex - startIndex);
73364
73365             if (indexRange < 0) {
73366                 indexRange += nodes.length;
73367             }
73368
73369             // move interior nodes to the surface of the convex hull..
73370             for (var j = 1; j < indexRange; j++) {
73371                 var point = geoVecInterp(hull[i], hull[i+1], j / indexRange),
73372                     node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
73373                 graph = graph.replace(node);
73374             }
73375         }
73376         return graph;
73377     };
73378
73379
73380     action.disabled = function(graph) {
73381         if (!graph.entity(wayId).isClosed())
73382             return 'not_closed';
73383     };
73384
73385
73386     action.transitionable = true;
73387
73388
73389     return action;
73390 }
73391
73392 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
73393 function actionDeleteWay(wayId) {
73394
73395
73396     function canDeleteNode(node, graph) {
73397         return !graph.parentWays(node).length &&
73398             !graph.parentRelations(node).length &&
73399             !node.hasInterestingTags();
73400     }
73401
73402
73403     var action = function(graph) {
73404         var way = graph.entity(wayId);
73405
73406         graph.parentRelations(way)
73407             .forEach(function(parent) {
73408                 parent = parent.removeMembersWithID(wayId);
73409                 graph = graph.replace(parent);
73410
73411                 if (parent.isDegenerate()) {
73412                     graph = actionDeleteRelation(parent.id)(graph);
73413                 }
73414             });
73415
73416         uniq(way.nodes).forEach(function(nodeId) {
73417             graph = graph.replace(way.removeNode(nodeId));
73418
73419             var node = graph.entity(nodeId);
73420             if (canDeleteNode(node, graph)) {
73421                 graph = graph.remove(node);
73422             }
73423         });
73424
73425         return graph.remove(way);
73426     };
73427
73428
73429     return action;
73430 }
73431
73432 function actionDeleteMultiple(ids) {
73433     var actions = {
73434         way: actionDeleteWay,
73435         node: actionDeleteNode,
73436         relation: actionDeleteRelation
73437     };
73438
73439
73440     var action = function(graph) {
73441         ids.forEach(function(id) {
73442             if (graph.hasEntity(id)) { // It may have been deleted aready.
73443                 graph = actions[graph.entity(id).type](id)(graph);
73444             }
73445         });
73446
73447         return graph;
73448     };
73449
73450
73451     return action;
73452 }
73453
73454 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
73455 function actionDeleteRelation(relationId) {
73456
73457
73458     function canDeleteEntity(entity, graph) {
73459         return !graph.parentWays(entity).length &&
73460             !graph.parentRelations(entity).length &&
73461             !entity.hasInterestingTags();
73462     }
73463
73464
73465     var action = function(graph) {
73466         var relation = graph.entity(relationId);
73467
73468         graph.parentRelations(relation)
73469             .forEach(function(parent) {
73470                 parent = parent.removeMembersWithID(relationId);
73471                 graph = graph.replace(parent);
73472
73473                 if (parent.isDegenerate()) {
73474                     graph = actionDeleteRelation(parent.id)(graph);
73475                 }
73476             });
73477
73478         uniq(map$3(relation.members, 'id')).forEach(function(memberId) {
73479             graph = graph.replace(relation.removeMembersWithID(memberId));
73480
73481             var entity = graph.entity(memberId);
73482             if (canDeleteEntity(entity, graph)) {
73483                 graph = actionDeleteMultiple([memberId])(graph);
73484             }
73485         });
73486
73487         return graph.remove(relation);
73488     };
73489
73490
73491     return action;
73492 }
73493
73494 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
73495 function actionDeleteNode(nodeId) {
73496     var action = function(graph) {
73497         var node = graph.entity(nodeId);
73498
73499         graph.parentWays(node)
73500             .forEach(function(parent) {
73501                 parent = parent.removeNode(nodeId);
73502                 graph = graph.replace(parent);
73503
73504                 if (parent.isDegenerate()) {
73505                     graph = actionDeleteWay(parent.id)(graph);
73506                 }
73507             });
73508
73509         graph.parentRelations(node)
73510             .forEach(function(parent) {
73511                 parent = parent.removeMembersWithID(nodeId);
73512                 graph = graph.replace(parent);
73513
73514                 if (parent.isDegenerate()) {
73515                     graph = actionDeleteRelation(parent.id)(graph);
73516                 }
73517             });
73518
73519         return graph.remove(node);
73520     };
73521
73522
73523     return action;
73524 }
73525
73526 // Connect the ways at the given nodes.
73527 //
73528 // The last node will survive. All other nodes will be replaced with
73529 // the surviving node in parent ways, and then removed.
73530 //
73531 // Tags and relation memberships of of non-surviving nodes are merged
73532 // to the survivor.
73533 //
73534 // This is the inverse of `iD.actionDisconnect`.
73535 //
73536 // Reference:
73537 //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
73538 //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
73539 //
73540 function actionConnect(nodeIds) {
73541     return function(graph) {
73542         var last = nodeIds[nodeIds.length - 1];
73543         var survivor = graph.entity(last);
73544
73545         for (var i = 0; i < nodeIds.length - 1; i++) {
73546             var node = graph.entity(nodeIds[i]);
73547
73548             /* eslint-disable no-loop-func */
73549             graph.parentWays(node).forEach(function(parent) {
73550                 if (!parent.areAdjacent(node.id, survivor.id)) {
73551                     graph = graph.replace(parent.replaceNode(node.id, survivor.id));
73552                 }
73553             });
73554
73555             graph.parentRelations(node).forEach(function(parent) {
73556                 graph = graph.replace(parent.replaceMember(node, survivor));
73557             });
73558             /* eslint-enable no-loop-func */
73559
73560             survivor = survivor.mergeTags(node.tags);
73561             graph = actionDeleteNode(node.id)(graph);
73562         }
73563
73564         graph = graph.replace(survivor);
73565
73566         return graph;
73567     };
73568 }
73569
73570 function actionCopyEntities(ids, fromGraph) {
73571     var copies = {};
73572
73573
73574     var action = function(graph) {
73575         ids.forEach(function(id) {
73576             fromGraph.entity(id).copy(fromGraph, copies);
73577         });
73578
73579         for (var id in copies) {
73580             graph = graph.replace(copies[id]);
73581         }
73582
73583         return graph;
73584     };
73585
73586
73587     action.copies = function() {
73588         return copies;
73589     };
73590
73591
73592     return action;
73593 }
73594
73595 function actionDeleteMember(relationId, memberIndex) {
73596     return function(graph) {
73597         var relation = graph.entity(relationId)
73598             .removeMember(memberIndex);
73599
73600         graph = graph.replace(relation);
73601
73602         if (relation.isDegenerate())
73603             graph = actionDeleteRelation(relation.id)(graph);
73604
73605         return graph;
73606     };
73607 }
73608
73609 function actionDeprecateTags(entityId) {
73610
73611     return function(graph) {
73612         var entity = graph.entity(entityId),
73613             newtags = clone(entity.tags),
73614             change = false,
73615             rule;
73616
73617         // This handles dataDeprecated tags with a single condition
73618         for (var i = 0; i < dataDeprecated.length; i++) {
73619
73620             rule = dataDeprecated[i];
73621             var match = toPairs(rule.old)[0],
73622                 replacements = rule.replace ? toPairs(rule.replace) : null;
73623
73624             if (entity.tags[match[0]] && match[1] === '*') {
73625
73626                 var value = entity.tags[match[0]];
73627                 if (replacements && !newtags[replacements[0][0]]) {
73628                     newtags[replacements[0][0]] = value;
73629                 }
73630                 delete newtags[match[0]];
73631                 change = true;
73632
73633             } else if (entity.tags[match[0]] === match[1]) {
73634                 newtags = assign({}, rule.replace || {}, omit(newtags, match[0]));
73635                 change = true;
73636             }
73637         }
73638
73639         if (change) {
73640             return graph.replace(entity.update({tags: newtags}));
73641         } else {
73642             return graph;
73643         }
73644     };
73645 }
73646
73647 function actionDiscardTags(difference) {
73648
73649     return function(graph) {
73650         function discardTags(entity) {
73651             var tags = {};
73652             var keys = Object.keys(entity.tags);
73653             var discarded = false;
73654
73655             for (var i = 0; i < keys.length; i++) {
73656                 var k = keys[i];
73657                 if (dataDiscarded[k] || !entity.tags[k]) {
73658                     discarded = true;
73659                 } else {
73660                     tags[k] = entity.tags[k];
73661                 }
73662             }
73663
73664             if (discarded) {
73665                 graph = graph.replace(entity.update({ tags: tags }));
73666             }
73667         }
73668
73669         difference.modified().forEach(discardTags);
73670         difference.created().forEach(discardTags);
73671
73672         return graph;
73673     };
73674 }
73675
73676 // Disconect the ways at the given node.
73677 //
73678 // Optionally, disconnect only the given ways.
73679 //
73680 // For testing convenience, accepts an ID to assign to the (first) new node.
73681 // Normally, this will be undefined and the way will automatically
73682 // be assigned a new ID.
73683 //
73684 // This is the inverse of `iD.actionConnect`.
73685 //
73686 // Reference:
73687 //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
73688 //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
73689 //
73690 function actionDisconnect(nodeId, newNodeId) {
73691     var wayIds;
73692
73693
73694     var action = function(graph) {
73695         var node = graph.entity(nodeId),
73696             connections = action.connections(graph);
73697
73698         connections.forEach(function(connection) {
73699             var way = graph.entity(connection.wayID),
73700                 newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
73701
73702             graph = graph.replace(newNode);
73703             if (connection.index === 0 && way.isArea()) {
73704                 // replace shared node with shared node..
73705                 graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
73706             } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
73707                 // replace closing node with new new node..
73708                 graph = graph.replace(way.unclose().addNode(newNode.id));
73709             } else {
73710                 // replace shared node with multiple new nodes..
73711                 graph = graph.replace(way.updateNode(newNode.id, connection.index));
73712             }
73713         });
73714
73715         return graph;
73716     };
73717
73718
73719     action.connections = function(graph) {
73720         var candidates = [],
73721             keeping = false,
73722             parentWays = graph.parentWays(graph.entity(nodeId));
73723
73724         parentWays.forEach(function(way) {
73725             if (wayIds && wayIds.indexOf(way.id) === -1) {
73726                 keeping = true;
73727                 return;
73728             }
73729             if (way.isArea() && (way.nodes[0] === nodeId)) {
73730                 candidates.push({ wayID: way.id, index: 0 });
73731             } else {
73732                 way.nodes.forEach(function(waynode, index) {
73733                     if (waynode === nodeId) {
73734                         candidates.push({ wayID: way.id, index: index });
73735                     }
73736                 });
73737             }
73738         });
73739
73740         return keeping ? candidates : candidates.slice(1);
73741     };
73742
73743
73744     action.disabled = function(graph) {
73745         var connections = action.connections(graph);
73746         if (connections.length === 0 || (wayIds && wayIds.length !== connections.length))
73747             return 'not_connected';
73748
73749         var parentWays = graph.parentWays(graph.entity(nodeId)),
73750             seenRelationIds = {},
73751             sharedRelation;
73752
73753         parentWays.forEach(function(way) {
73754             if (wayIds && wayIds.indexOf(way.id) === -1)
73755                 return;
73756
73757             var relations = graph.parentRelations(way);
73758             relations.forEach(function(relation) {
73759                 if (relation.id in seenRelationIds) {
73760                     sharedRelation = relation;
73761                 } else {
73762                     seenRelationIds[relation.id] = true;
73763                 }
73764             });
73765         });
73766
73767         if (sharedRelation)
73768             return 'relation';
73769     };
73770
73771
73772     action.limitWays = function(_) {
73773         if (!arguments.length) return wayIds;
73774         wayIds = _;
73775         return action;
73776     };
73777
73778
73779     return action;
73780 }
73781
73782 // Join ways at the end node they share.
73783 //
73784 // This is the inverse of `iD.actionSplit`.
73785 //
73786 // Reference:
73787 //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
73788 //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
73789 //
73790 function actionJoin(ids) {
73791
73792     function groupEntitiesByGeometry(graph) {
73793         var entities = ids.map(function(id) { return graph.entity(id); });
73794         return assignIn({line: []}, groupBy(entities, function(entity) { return entity.geometry(graph); }));
73795     }
73796
73797
73798     var action = function(graph) {
73799         var ways = ids.map(graph.entity, graph);
73800         var survivorID = ways[0].id;
73801
73802         // Prefer to keep an existing way.
73803         for (var i = 0; i < ways.length; i++) {
73804             if (!ways[i].isNew()) {
73805                 survivorID = ways[i].id;
73806                 break;
73807             }
73808         }
73809
73810         var sequences = osmJoinWays(ways, graph);
73811         var joined = sequences[0];
73812
73813         // We might need to reverse some of these ways before joining them.  #4688
73814         // `joined.actions` property will contain any actions we need to apply.
73815         graph = sequences.actions.reduce(function(g, action) { return action(g); }, graph);
73816
73817         var survivor = graph.entity(survivorID);
73818         survivor = survivor.update({ nodes: joined.nodes.map(function(n) { return n.id; }) });
73819         graph = graph.replace(survivor);
73820
73821         joined.forEach(function(way) {
73822             if (way.id === survivorID) return;
73823
73824             graph.parentRelations(way).forEach(function(parent) {
73825                 graph = graph.replace(parent.replaceMember(way, survivor));
73826             });
73827
73828             survivor = survivor.mergeTags(way.tags);
73829
73830             graph = graph.replace(survivor);
73831             graph = actionDeleteWay(way.id)(graph);
73832         });
73833
73834         return graph;
73835     };
73836
73837
73838     action.disabled = function(graph) {
73839         var geometries = groupEntitiesByGeometry(graph);
73840         if (ids.length < 2 || ids.length !== geometries.line.length)
73841             return 'not_eligible';
73842
73843         var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
73844         if (joined.length > 1)
73845             return 'not_adjacent';
73846
73847         var nodeIds = joined[0].nodes.map(function(n) { return n.id; }).slice(1, -1);
73848         var relation;
73849         var tags = {};
73850         var conflicting = false;
73851
73852         joined[0].forEach(function(way) {
73853             var parents = graph.parentRelations(way);
73854             parents.forEach(function(parent) {
73855                 if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; }))
73856                     relation = parent;
73857             });
73858
73859             for (var k in way.tags) {
73860                 if (!(k in tags)) {
73861                     tags[k] = way.tags[k];
73862                 } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
73863                     conflicting = true;
73864                 }
73865             }
73866         });
73867
73868         if (relation)
73869             return 'restriction';
73870
73871         if (conflicting)
73872             return 'conflicting_tags';
73873     };
73874
73875
73876     return action;
73877 }
73878
73879 function actionMerge(ids) {
73880
73881     function groupEntitiesByGeometry(graph) {
73882         var entities = ids.map(function(id) { return graph.entity(id); });
73883         return assignIn({point: [], area: [], line: [], relation: []},
73884             groupBy(entities, function(entity) { return entity.geometry(graph); }));
73885     }
73886
73887
73888     var action = function(graph) {
73889         var geometries = groupEntitiesByGeometry(graph),
73890             target = geometries.area[0] || geometries.line[0],
73891             points = geometries.point;
73892
73893         points.forEach(function(point) {
73894             target = target.mergeTags(point.tags);
73895             graph = graph.replace(target);
73896
73897             graph.parentRelations(point).forEach(function(parent) {
73898                 graph = graph.replace(parent.replaceMember(point, target));
73899             });
73900
73901             var nodes = uniq(graph.childNodes(target)),
73902                 removeNode = point;
73903
73904             for (var i = 0; i < nodes.length; i++) {
73905                 var node = nodes[i];
73906                 if (graph.parentWays(node).length > 1 ||
73907                     graph.parentRelations(node).length ||
73908                     node.hasInterestingTags()) {
73909                     continue;
73910                 }
73911
73912                 // Found an uninteresting child node on the target way.
73913                 // Move orig point into its place to preserve point's history. #3683
73914                 graph = graph.replace(point.update({ tags: {}, loc: node.loc }));
73915                 target = target.replaceNode(node.id, point.id);
73916                 graph = graph.replace(target);
73917                 removeNode = node;
73918                 break;
73919             }
73920
73921             graph = graph.remove(removeNode);
73922         });
73923
73924         return graph;
73925     };
73926
73927
73928     action.disabled = function(graph) {
73929         var geometries = groupEntitiesByGeometry(graph);
73930         if (geometries.point.length === 0 ||
73931             (geometries.area.length + geometries.line.length) !== 1 ||
73932             geometries.relation.length !== 0)
73933             return 'not_eligible';
73934     };
73935
73936
73937     return action;
73938 }
73939
73940 function actionMergePolygon(ids, newRelationId) {
73941
73942     function groupEntities(graph) {
73943         var entities = ids.map(function (id) { return graph.entity(id); });
73944         return assignIn({
73945                 closedWay: [],
73946                 multipolygon: [],
73947                 other: []
73948             }, groupBy(entities, function(entity) {
73949                 if (entity.type === 'way' && entity.isClosed()) {
73950                     return 'closedWay';
73951                 } else if (entity.type === 'relation' && entity.isMultipolygon()) {
73952                     return 'multipolygon';
73953                 } else {
73954                     return 'other';
73955                 }
73956             }));
73957     }
73958
73959
73960     var action = function(graph) {
73961         var entities = groupEntities(graph);
73962
73963         // An array representing all the polygons that are part of the multipolygon.
73964         //
73965         // Each element is itself an array of objects with an id property, and has a
73966         // locs property which is an array of the locations forming the polygon.
73967         var polygons = entities.multipolygon.reduce(function(polygons, m) {
73968             return polygons.concat(osmJoinWays(m.members, graph));
73969         }, []).concat(entities.closedWay.map(function(d) {
73970             var member = [{id: d.id}];
73971             member.nodes = graph.childNodes(d);
73972             return member;
73973         }));
73974
73975         // contained is an array of arrays of boolean values,
73976         // where contained[j][k] is true iff the jth way is
73977         // contained by the kth way.
73978         var contained = polygons.map(function(w, i) {
73979             return polygons.map(function(d, n) {
73980                 if (i === n) return null;
73981                 return geoPolygonContainsPolygon(
73982                     map$3(d.nodes, 'loc'),
73983                     map$3(w.nodes, 'loc'));
73984             });
73985         });
73986
73987         // Sort all polygons as either outer or inner ways
73988         var members = [],
73989             outer = true;
73990
73991         while (polygons.length) {
73992             extractUncontained(polygons);
73993             polygons = polygons.filter(isContained);
73994             contained = contained.filter(isContained).map(filterContained);
73995         }
73996
73997         function isContained(d, i) {
73998             return some(contained[i]);
73999         }
74000
74001         function filterContained(d) {
74002             return d.filter(isContained);
74003         }
74004
74005         function extractUncontained(polygons) {
74006             polygons.forEach(function(d, i) {
74007                 if (!isContained(d, i)) {
74008                     d.forEach(function(member) {
74009                         members.push({
74010                             type: 'way',
74011                             id: member.id,
74012                             role: outer ? 'outer' : 'inner'
74013                         });
74014                     });
74015                 }
74016             });
74017             outer = !outer;
74018         }
74019
74020         // Move all tags to one relation
74021         var relation = entities.multipolygon[0] ||
74022             osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
74023
74024         entities.multipolygon.slice(1).forEach(function(m) {
74025             relation = relation.mergeTags(m.tags);
74026             graph = graph.remove(m);
74027         });
74028
74029         entities.closedWay.forEach(function(way) {
74030             function isThisOuter(m) {
74031                 return m.id === way.id && m.role !== 'inner';
74032             }
74033             if (members.some(isThisOuter)) {
74034                 relation = relation.mergeTags(way.tags);
74035                 graph = graph.replace(way.update({ tags: {} }));
74036             }
74037         });
74038
74039         return graph.replace(relation.update({
74040             members: members,
74041             tags: omit(relation.tags, 'area')
74042         }));
74043     };
74044
74045
74046     action.disabled = function(graph) {
74047         var entities = groupEntities(graph);
74048         if (entities.other.length > 0 ||
74049             entities.closedWay.length + entities.multipolygon.length < 2)
74050             return 'not_eligible';
74051         if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
74052             return 'incomplete_relation';
74053     };
74054
74055
74056     return action;
74057 }
74058
74059 // Text diff algorithm following Hunt and McIlroy 1976.
74060 // J. W. Hunt and M. D. McIlroy, An algorithm for differential file
74061 // comparison, Bell Telephone Laboratories CSTR #41 (1976)
74062 // http://www.cs.dartmouth.edu/~doug/
74063 //
74064 // Expects two arrays of strings.
74065 function LCS(file1, file2) {
74066   var equivalenceClasses;
74067   var file2indices;
74068   var newCandidate;
74069   var candidates;
74070   var line;
74071   var c, i, j, jX, r, s;
74072
74073   equivalenceClasses = {};
74074   for (j = 0; j < file2.length; j++) {
74075     line = file2[j];
74076     if (equivalenceClasses[line]) {
74077       equivalenceClasses[line].push(j);
74078     } else {
74079       equivalenceClasses[line] = [j];
74080     }
74081   }
74082
74083   candidates = [
74084     { file1index: -1, file2index: -1, chain: null }
74085   ];
74086
74087   for (i = 0; i < file1.length; i++) {
74088     line = file1[i];
74089     file2indices = equivalenceClasses[line] || [];
74090
74091     r = 0;
74092     c = candidates[0];
74093
74094     for (jX = 0; jX < file2indices.length; jX++) {
74095       j = file2indices[jX];
74096
74097       for (s = r; s < candidates.length; s++) {
74098         if ((candidates[s].file2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].file2index > j))) {
74099           break;
74100         }
74101       }
74102
74103       if (s < candidates.length) {
74104         newCandidate = { file1index: i, file2index: j, chain: candidates[s] };
74105         if (r === candidates.length) {
74106           candidates.push(c);
74107         } else {
74108           candidates[r] = c;
74109         }
74110         r = s + 1;
74111         c = newCandidate;
74112         if (r === candidates.length) {
74113           break; // no point in examining further (j)s
74114         }
74115       }
74116     }
74117
74118     candidates[r] = c;
74119   }
74120
74121   // At this point, we know the LCS: it's in the reverse of the
74122   // linked-list through .chain of candidates[candidates.length - 1].
74123
74124   return candidates[candidates.length - 1];
74125 }
74126
74127
74128 // We apply the LCS to give a simple representation of the
74129 // offsets and lengths of mismatched chunks in the input
74130 // files. This is used by diff3MergeIndices below.
74131 function diffIndices(file1, file2) {
74132   var result = [];
74133   var tail1 = file1.length;
74134   var tail2 = file2.length;
74135
74136   for (var candidate = LCS(file1, file2);
74137      candidate !== null;
74138      candidate = candidate.chain)
74139   {
74140     var mismatchLength1 = tail1 - candidate.file1index - 1;
74141     var mismatchLength2 = tail2 - candidate.file2index - 1;
74142     tail1 = candidate.file1index;
74143     tail2 = candidate.file2index;
74144
74145     if (mismatchLength1 || mismatchLength2) {
74146       result.push({
74147         file1: [tail1 + 1, mismatchLength1],
74148         file2: [tail2 + 1, mismatchLength2]
74149       });
74150     }
74151   }
74152
74153   result.reverse();
74154   return result;
74155 }
74156
74157
74158 // Given three files, A, O, and B, where both A and B are
74159 // independently derived from O, returns a fairly complicated
74160 // internal representation of merge decisions it's taken. The
74161 // interested reader may wish to consult
74162 //
74163 // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
74164 // 'A Formal Investigation of ' In Arvind and Prasad,
74165 // editors, Foundations of Software Technology and Theoretical
74166 // Computer Science (FSTTCS), December 2007.
74167 //
74168 // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
74169 function diff3MergeIndices(a, o, b) {
74170   var i;
74171   var m1 = diffIndices(o, a);
74172   var m2 = diffIndices(o, b);
74173
74174   var hunks = [];
74175   function addHunk(h, side) {
74176     hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
74177   }
74178   for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); }
74179   for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); }
74180   hunks.sort(function (x, y) { return x[0] - y[0]; });
74181
74182   var result = [];
74183   var commonOffset = 0;
74184   function copyCommon(targetOffset) {
74185     if (targetOffset > commonOffset) {
74186       result.push([1, commonOffset, targetOffset - commonOffset]);
74187       commonOffset = targetOffset;
74188     }
74189   }
74190
74191   for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) {
74192     var firstHunkIndex = hunkIndex;
74193     var hunk = hunks[hunkIndex];
74194     var regionLhs = hunk[0];
74195     var regionRhs = regionLhs + hunk[2];
74196     while (hunkIndex < hunks.length - 1) {
74197       var maybeOverlapping = hunks[hunkIndex + 1];
74198       var maybeLhs = maybeOverlapping[0];
74199       if (maybeLhs > regionRhs) {
74200         break;
74201       }
74202       regionRhs = Math.max(regionRhs, maybeLhs + maybeOverlapping[2]);
74203       hunkIndex++;
74204     }
74205
74206     copyCommon(regionLhs);
74207     if (firstHunkIndex === hunkIndex) {
74208       // The 'overlap' was only one hunk long, meaning that
74209       // there's no conflict here. Either a and o were the
74210       // same, or b and o were the same.
74211       if (hunk[4] > 0) {
74212         result.push([hunk[1], hunk[3], hunk[4]]);
74213       }
74214     } else {
74215       // A proper conflict. Determine the extents of the
74216       // regions involved from a, o and b. Effectively merge
74217       // all the hunks on the left into one giant hunk, and
74218       // do the same for the right; then, correct for skew
74219       // in the regions of o that each side changed, and
74220       // report appropriate spans for the three sides.
74221       var regions = {
74222         0: [a.length, -1, o.length, -1],
74223         2: [b.length, -1, o.length, -1]
74224       };
74225       for (i = firstHunkIndex; i <= hunkIndex; i++) {
74226         hunk = hunks[i];
74227         var side = hunk[1];
74228         var r = regions[side];
74229         var oLhs = hunk[0];
74230         var oRhs = oLhs + hunk[2];
74231         var abLhs = hunk[3];
74232         var abRhs = abLhs + hunk[4];
74233         r[0] = Math.min(abLhs, r[0]);
74234         r[1] = Math.max(abRhs, r[1]);
74235         r[2] = Math.min(oLhs, r[2]);
74236         r[3] = Math.max(oRhs, r[3]);
74237       }
74238       var aLhs = regions[0][0] + (regionLhs - regions[0][2]);
74239       var aRhs = regions[0][1] + (regionRhs - regions[0][3]);
74240       var bLhs = regions[2][0] + (regionLhs - regions[2][2]);
74241       var bRhs = regions[2][1] + (regionRhs - regions[2][3]);
74242       result.push([-1,
74243                    aLhs,      aRhs      - aLhs,
74244                    regionLhs, regionRhs - regionLhs,
74245                    bLhs,      bRhs      - bLhs]);
74246     }
74247     commonOffset = regionRhs;
74248   }
74249
74250   copyCommon(o.length);
74251   return result;
74252 }
74253
74254
74255 // Applies the output of diff3MergeIndices to actually
74256 // construct the merged file; the returned result alternates
74257 // between 'ok' and 'conflict' blocks.
74258 function diff3Merge(a, o, b, excludeFalseConflicts) {
74259   var result = [];
74260   var files = [a, o, b];
74261   var indices = diff3MergeIndices(a, o, b);
74262
74263   var okLines = [];
74264   function flushOk() {
74265     if (okLines.length) {
74266       result.push({ok: okLines});
74267     }
74268     okLines = [];
74269   }
74270   function pushOk(xs) {
74271     for (var j = 0; j < xs.length; j++) {
74272       okLines.push(xs[j]);
74273     }
74274   }
74275
74276   function isTrueConflict(rec) {
74277     if (rec[2] !== rec[6]) return true;
74278     var aoff = rec[1];
74279     var boff = rec[5];
74280     for (var j = 0; j < rec[2]; j++) {
74281       if (a[j + aoff] !== b[j + boff]) {
74282         return true;
74283       }
74284     }
74285     return false;
74286   }
74287
74288   for (var i = 0; i < indices.length; i++) {
74289     var x = indices[i];
74290     var side = x[0];
74291     if (side === -1) {
74292       if (excludeFalseConflicts && !isTrueConflict(x)) {
74293         pushOk(files[0].slice(x[1], x[1] + x[2]));
74294       } else {
74295         flushOk();
74296         result.push({
74297           conflict: {
74298             a: a.slice(x[1], x[1] + x[2]),
74299             aIndex: x[1],
74300             o: o.slice(x[3], x[3] + x[4]),
74301             oIndex: x[3],
74302             b: b.slice(x[5], x[5] + x[6]),
74303             bIndex: x[5]
74304           }
74305         });
74306       }
74307     } else {
74308       pushOk(files[side].slice(x[1], x[1] + x[2]));
74309     }
74310   }
74311
74312   flushOk();
74313   return result;
74314 }
74315
74316 function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
74317     var _option = 'safe';  // 'safe', 'force_local', 'force_remote'
74318     var _conflicts = [];
74319
74320
74321     function user(d) {
74322         return isFunction(formatUser) ? formatUser(d) : d;
74323     }
74324
74325
74326     function mergeLocation(remote, target) {
74327         function pointEqual(a, b) {
74328             var epsilon = 1e-6;
74329             return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon);
74330         }
74331
74332         if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) {
74333             return target;
74334         }
74335         if (_option === 'force_remote') {
74336             return target.update({loc: remote.loc});
74337         }
74338
74339         _conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
74340         return target;
74341     }
74342
74343
74344     function mergeNodes(base, remote, target) {
74345         if (_option === 'force_local' || isEqual(target.nodes, remote.nodes)) {
74346             return target;
74347         }
74348         if (_option === 'force_remote') {
74349             return target.update({nodes: remote.nodes});
74350         }
74351
74352         var ccount = _conflicts.length;
74353         var o = base.nodes || [];
74354         var a = target.nodes || [];
74355         var b = remote.nodes || [];
74356         var nodes = [];
74357         var hunks = diff3Merge(a, o, b, true);
74358
74359         for (var i = 0; i < hunks.length; i++) {
74360             var hunk = hunks[i];
74361             if (hunk.ok) {
74362                 nodes.push.apply(nodes, hunk.ok);
74363             } else {
74364                 // for all conflicts, we can assume c.a !== c.b
74365                 // because `diff3Merge` called with `true` option to exclude false conflicts..
74366                 var c = hunk.conflict;
74367                 if (isEqual(c.o, c.a)) {  // only changed remotely
74368                     nodes.push.apply(nodes, c.b);
74369                 } else if (isEqual(c.o, c.b)) {  // only changed locally
74370                     nodes.push.apply(nodes, c.a);
74371                 } else {       // changed both locally and remotely
74372                     _conflicts.push(t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) }));
74373                     break;
74374                 }
74375             }
74376         }
74377
74378         return (_conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
74379     }
74380
74381
74382     function mergeChildren(targetWay, children, updates, graph) {
74383         function isUsed(node, targetWay) {
74384             var parentWays = map$3(graph.parentWays(node), 'id');
74385             return node.hasInterestingTags() ||
74386                 without(parentWays, targetWay.id).length > 0 ||
74387                 graph.parentRelations(node).length > 0;
74388         }
74389
74390         var ccount = _conflicts.length;
74391
74392         for (var i = 0; i < children.length; i++) {
74393             var id = children[i];
74394             var node = graph.hasEntity(id);
74395
74396             // remove unused childNodes..
74397             if (targetWay.nodes.indexOf(id) === -1) {
74398                 if (node && !isUsed(node, targetWay)) {
74399                     updates.removeIds.push(id);
74400                 }
74401                 continue;
74402             }
74403
74404             // restore used childNodes..
74405             var local = localGraph.hasEntity(id);
74406             var remote = remoteGraph.hasEntity(id);
74407             var target;
74408
74409             if (_option === 'force_remote' && remote && remote.visible) {
74410                 updates.replacements.push(remote);
74411
74412             } else if (_option === 'force_local' && local) {
74413                 target = osmEntity$$1(local);
74414                 if (remote) {
74415                     target = target.update({ version: remote.version });
74416                 }
74417                 updates.replacements.push(target);
74418
74419             } else if (_option === 'safe' && local && remote && local.version !== remote.version) {
74420                 target = osmEntity$$1(local, { version: remote.version });
74421                 if (remote.visible) {
74422                     target = mergeLocation(remote, target);
74423                 } else {
74424                     _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
74425                 }
74426
74427                 if (_conflicts.length !== ccount) break;
74428                 updates.replacements.push(target);
74429             }
74430         }
74431
74432         return targetWay;
74433     }
74434
74435
74436     function updateChildren(updates, graph) {
74437         for (var i = 0; i < updates.replacements.length; i++) {
74438             graph = graph.replace(updates.replacements[i]);
74439         }
74440         if (updates.removeIds.length) {
74441             graph = actionDeleteMultiple(updates.removeIds)(graph);
74442         }
74443         return graph;
74444     }
74445
74446
74447     function mergeMembers(remote, target) {
74448         if (_option === 'force_local' || isEqual(target.members, remote.members)) {
74449             return target;
74450         }
74451         if (_option === 'force_remote') {
74452             return target.update({members: remote.members});
74453         }
74454
74455         _conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
74456         return target;
74457     }
74458
74459
74460     function mergeTags(base, remote, target) {
74461         function ignoreKey(k) {
74462             return dataDiscarded[k];
74463         }
74464
74465         if (_option === 'force_local' || isEqual(target.tags, remote.tags)) {
74466             return target;
74467         }
74468         if (_option === 'force_remote') {
74469             return target.update({tags: remote.tags});
74470         }
74471
74472         var ccount = _conflicts.length;
74473         var o = base.tags || {};
74474         var a = target.tags || {};
74475         var b = remote.tags || {};
74476         var keys = reject(union(keys$1(o), keys$1(a), keys$1(b)), ignoreKey);
74477         var tags = clone(a);
74478         var changed = false;
74479
74480         for (var i = 0; i < keys.length; i++) {
74481             var k = keys[i];
74482
74483             if (o[k] !== b[k] && a[k] !== b[k]) {    // changed remotely..
74484                 if (o[k] !== a[k]) {      // changed locally..
74485                     _conflicts.push(t('merge_remote_changes.conflict.tags',
74486                         { tag: k, local: a[k], remote: b[k], user: user(remote.user) }));
74487
74488                 } else {                  // unchanged locally, accept remote change..
74489                     if (b.hasOwnProperty(k)) {
74490                         tags[k] = b[k];
74491                     } else {
74492                         delete tags[k];
74493                     }
74494                     changed = true;
74495                 }
74496             }
74497         }
74498
74499         return (changed && _conflicts.length === ccount) ? target.update({tags: tags}) : target;
74500     }
74501
74502
74503     //  `graph.base()` is the common ancestor of the two graphs.
74504     //  `localGraph` contains user's edits up to saving
74505     //  `remoteGraph` contains remote edits to modified nodes
74506     //  `graph` must be a descendent of `localGraph` and may include
74507     //      some conflict resolution actions performed on it.
74508     //
74509     //                  --- ... --- `localGraph` -- ... -- `graph`
74510     //                 /
74511     //  `graph.base()` --- ... --- `remoteGraph`
74512     //
74513     var action = function(graph) {
74514         var updates = { replacements: [], removeIds: [] };
74515         var base = graph.base().entities[id];
74516         var local = localGraph.entity(id);
74517         var remote = remoteGraph.entity(id);
74518         var target = osmEntity$$1(local, { version: remote.version });
74519
74520         // delete/undelete
74521         if (!remote.visible) {
74522             if (_option === 'force_remote') {
74523                 return actionDeleteMultiple([id])(graph);
74524
74525             } else if (_option === 'force_local') {
74526                 if (target.type === 'way') {
74527                     target = mergeChildren(target, uniq(local.nodes), updates, graph);
74528                     graph = updateChildren(updates, graph);
74529                 }
74530                 return graph.replace(target);
74531
74532             } else {
74533                 _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
74534                 return graph;  // do nothing
74535             }
74536         }
74537
74538         // merge
74539         if (target.type === 'node') {
74540             target = mergeLocation(remote, target);
74541
74542         } else if (target.type === 'way') {
74543             // pull in any child nodes that may not be present locally..
74544             graph.rebase(remoteGraph.childNodes(remote), [graph], false);
74545             target = mergeNodes(base, remote, target);
74546             target = mergeChildren(target, union(local.nodes, remote.nodes), updates, graph);
74547
74548         } else if (target.type === 'relation') {
74549             target = mergeMembers(remote, target);
74550         }
74551
74552         target = mergeTags(base, remote, target);
74553
74554         if (!_conflicts.length) {
74555             graph = updateChildren(updates, graph).replace(target);
74556         }
74557
74558         return graph;
74559     };
74560
74561
74562     action.withOption = function(opt) {
74563         _option = opt;
74564         return action;
74565     };
74566
74567
74568     action.conflicts = function() {
74569         return _conflicts;
74570     };
74571
74572
74573     return action;
74574 }
74575
74576 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
74577 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
74578 function actionMove(moveIds, tryDelta, projection, cache) {
74579     var _delta = tryDelta;
74580
74581     function setupCache(graph) {
74582         function canMove(nodeId) {
74583             // Allow movement of any node that is in the selectedIDs list..
74584             if (moveIds.indexOf(nodeId) !== -1) return true;
74585
74586             // Allow movement of a vertex where 2 ways meet..
74587             var parents = map$3(graph.parentWays(graph.entity(nodeId)), 'id');
74588             if (parents.length < 3) return true;
74589
74590             // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
74591             var parentsMoving = every(parents, function(id) { return cache.moving[id]; });
74592             if (!parentsMoving) delete cache.moving[nodeId];
74593
74594             return parentsMoving;
74595         }
74596
74597         function cacheEntities(ids) {
74598             for (var i = 0; i < ids.length; i++) {
74599                 var id = ids[i];
74600                 if (cache.moving[id]) continue;
74601                 cache.moving[id] = true;
74602
74603                 var entity = graph.hasEntity(id);
74604                 if (!entity) continue;
74605
74606                 if (entity.type === 'node') {
74607                     cache.nodes.push(id);
74608                     cache.startLoc[id] = entity.loc;
74609                 } else if (entity.type === 'way') {
74610                     cache.ways.push(id);
74611                     cacheEntities(entity.nodes);
74612                 } else {
74613                     cacheEntities(entity.members.map(function(member) {
74614                         return member.id;
74615                     }));
74616                 }
74617             }
74618         }
74619
74620         function cacheIntersections(ids) {
74621             function isEndpoint(way, id) {
74622                 return !way.isClosed() && !!way.affix(id);
74623             }
74624
74625             for (var i = 0; i < ids.length; i++) {
74626                 var id = ids[i];
74627
74628                 // consider only intersections with 1 moved and 1 unmoved way.
74629                 var childNodes = graph.childNodes(graph.entity(id));
74630                 for (var j = 0; j < childNodes.length; j++) {
74631                     var node = childNodes[j];
74632                     var parents = graph.parentWays(node);
74633                     if (parents.length !== 2) continue;
74634
74635                     var moved = graph.entity(id);
74636                     var unmoved = null;
74637                     for (var k = 0; k < parents.length; k++) {
74638                         var way = parents[k];
74639                         if (!cache.moving[way.id]) {
74640                             unmoved = way;
74641                             break;
74642                         }
74643                     }
74644                     if (!unmoved) continue;
74645
74646                     // exclude ways that are overly connected..
74647                     if (intersection(moved.nodes, unmoved.nodes).length > 2) continue;
74648                     if (moved.isArea() || unmoved.isArea()) continue;
74649
74650                     cache.intersections.push({
74651                         nodeId: node.id,
74652                         movedId: moved.id,
74653                         unmovedId: unmoved.id,
74654                         movedIsEP: isEndpoint(moved, node.id),
74655                         unmovedIsEP: isEndpoint(unmoved, node.id)
74656                     });
74657                 }
74658             }
74659         }
74660
74661
74662         if (!cache) {
74663             cache = {};
74664         }
74665         if (!cache.ok) {
74666             cache.moving = {};
74667             cache.intersections = [];
74668             cache.replacedVertex = {};
74669             cache.startLoc = {};
74670             cache.nodes = [];
74671             cache.ways = [];
74672
74673             cacheEntities(moveIds);
74674             cacheIntersections(cache.ways);
74675             cache.nodes = filter(cache.nodes, canMove);
74676
74677             cache.ok = true;
74678         }
74679     }
74680
74681
74682     // Place a vertex where the moved vertex used to be, to preserve way shape..
74683     //
74684     //  Start:
74685     //      b ---- e
74686     //     / \
74687     //    /   \
74688     //   /     \
74689     //  a       c
74690     //
74691     //      *               node '*' added to preserve shape
74692     //     / \
74693     //    /   b ---- e      way `b,e` moved here:
74694     //   /     \
74695     //  a       c
74696     //
74697     //
74698     function replaceMovedVertex(nodeId, wayId, graph, delta) {
74699         var way = graph.entity(wayId);
74700         var moved = graph.entity(nodeId);
74701         var movedIndex = way.nodes.indexOf(nodeId);
74702         var len, prevIndex, nextIndex;
74703
74704         if (way.isClosed()) {
74705             len = way.nodes.length - 1;
74706             prevIndex = (movedIndex + len - 1) % len;
74707             nextIndex = (movedIndex + len + 1) % len;
74708         } else {
74709             len = way.nodes.length;
74710             prevIndex = movedIndex - 1;
74711             nextIndex = movedIndex + 1;
74712         }
74713
74714         var prev = graph.hasEntity(way.nodes[prevIndex]);
74715         var next = graph.hasEntity(way.nodes[nextIndex]);
74716
74717         // Don't add orig vertex at endpoint..
74718         if (!prev || !next) return graph;
74719
74720         var key = wayId + '_' + nodeId;
74721         var orig = cache.replacedVertex[key];
74722         if (!orig) {
74723             orig = osmNode();
74724             cache.replacedVertex[key] = orig;
74725             cache.startLoc[orig.id] = cache.startLoc[nodeId];
74726         }
74727
74728         var start, end;
74729         if (delta) {
74730             start = projection(cache.startLoc[nodeId]);
74731             end = projection.invert(geoVecAdd(start, delta));
74732         } else {
74733             end = cache.startLoc[nodeId];
74734         }
74735         orig = orig.move(end);
74736
74737         var angle = Math.abs(geoAngle(orig, prev, projection) -
74738                 geoAngle(orig, next, projection)) * 180 / Math.PI;
74739
74740         // Don't add orig vertex if it would just make a straight line..
74741         if (angle > 175 && angle < 185) return graph;
74742
74743         // moving forward or backward along way?
74744         var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
74745         var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection);
74746         var d1 = geoPathLength(p1);
74747         var d2 = geoPathLength(p2);
74748         var insertAt = (d1 <= d2) ? movedIndex : nextIndex;
74749
74750         // moving around closed loop?
74751         if (way.isClosed() && insertAt === 0) insertAt = len;
74752
74753         way = way.addNode(orig.id, insertAt);
74754         return graph.replace(orig).replace(way);
74755     }
74756
74757
74758     // Remove duplicate vertex that might have been added by
74759     // replaceMovedVertex.  This is done after the unzorro checks.
74760     function removeDuplicateVertices(wayId, graph) {
74761         var way = graph.entity(wayId);
74762         var epsilon = 1e-6;
74763         var prev, curr;
74764
74765         function isInteresting(node, graph) {
74766             return graph.parentWays(node).length > 1 ||
74767                 graph.parentRelations(node).length ||
74768                 node.hasInterestingTags();
74769         }
74770
74771         for (var i = 0; i < way.nodes.length; i++) {
74772             curr = graph.entity(way.nodes[i]);
74773
74774             if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) {
74775                 if (!isInteresting(prev, graph)) {
74776                     way = way.removeNode(prev.id);
74777                     graph = graph.replace(way).remove(prev);
74778                 } else if (!isInteresting(curr, graph)) {
74779                     way = way.removeNode(curr.id);
74780                     graph = graph.replace(way).remove(curr);
74781                 }
74782             }
74783
74784             prev = curr;
74785         }
74786
74787         return graph;
74788     }
74789
74790
74791     // Reorder nodes around intersections that have moved..
74792     //
74793     //  Start:                way1.nodes: b,e         (moving)
74794     //  a - b - c ----- d     way2.nodes: a,b,c,d     (static)
74795     //      |                 vertex: b
74796     //      e                 isEP1: true,  isEP2, false
74797     //
74798     //  way1 `b,e` moved here:
74799     //  a ----- c = b - d
74800     //              |
74801     //              e
74802     //
74803     //  reorder nodes         way1.nodes: b,e
74804     //  a ----- c - b - d     way2.nodes: a,c,b,d
74805     //              |
74806     //              e
74807     //
74808     function unZorroIntersection(intersection$$1, graph) {
74809         var vertex = graph.entity(intersection$$1.nodeId);
74810         var way1 = graph.entity(intersection$$1.movedId);
74811         var way2 = graph.entity(intersection$$1.unmovedId);
74812         var isEP1 = intersection$$1.movedIsEP;
74813         var isEP2 = intersection$$1.unmovedIsEP;
74814
74815         // don't move the vertex if it is the endpoint of both ways.
74816         if (isEP1 && isEP2) return graph;
74817
74818         var nodes1 = without(graph.childNodes(way1), vertex);
74819         var nodes2 = without(graph.childNodes(way2), vertex);
74820
74821         if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
74822         if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
74823
74824         var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
74825         var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
74826         var loc;
74827
74828         // snap vertex to nearest edge (or some point between them)..
74829         if (!isEP1 && !isEP2) {
74830             var epsilon = 1e-6, maxIter = 10;
74831             for (var i = 0; i < maxIter; i++) {
74832                 loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
74833                 edge1 = geoChooseEdge(nodes1, projection(loc), projection);
74834                 edge2 = geoChooseEdge(nodes2, projection(loc), projection);
74835                 if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
74836             }
74837         } else if (!isEP1) {
74838             loc = edge1.loc;
74839         } else {
74840             loc = edge2.loc;
74841         }
74842
74843         graph = graph.replace(vertex.move(loc));
74844
74845         // if zorro happened, reorder nodes..
74846         if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
74847             way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
74848             graph = graph.replace(way1);
74849         }
74850         if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
74851             way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
74852             graph = graph.replace(way2);
74853         }
74854
74855         return graph;
74856     }
74857
74858
74859     function cleanupIntersections(graph) {
74860         for (var i = 0; i < cache.intersections.length; i++) {
74861             var obj = cache.intersections[i];
74862             graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
74863             graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
74864             graph = unZorroIntersection(obj, graph);
74865             graph = removeDuplicateVertices(obj.movedId, graph);
74866             graph = removeDuplicateVertices(obj.unmovedId, graph);
74867         }
74868
74869         return graph;
74870     }
74871
74872
74873     // check if moving way endpoint can cross an unmoved way, if so limit delta..
74874     function limitDelta(graph) {
74875         function moveNode(loc) {
74876             return geoVecAdd(projection(loc), _delta);
74877         }
74878
74879         for (var i = 0; i < cache.intersections.length; i++) {
74880             var obj = cache.intersections[i];
74881
74882             // Don't limit movement if this is vertex joins 2 endpoints..
74883             if (obj.movedIsEP && obj.unmovedIsEP) continue;
74884             // Don't limit movement if this vertex is not an endpoint anyway..
74885             if (!obj.movedIsEP) continue;
74886
74887             var node = graph.entity(obj.nodeId);
74888             var start = projection(node.loc);
74889             var end = geoVecAdd(start, _delta);
74890             var movedNodes = graph.childNodes(graph.entity(obj.movedId));
74891             var movedPath = map$3(map$3(movedNodes, 'loc'), moveNode);
74892             var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
74893             var unmovedPath = map$3(map$3(unmovedNodes, 'loc'), projection);
74894             var hits = geoPathIntersections(movedPath, unmovedPath);
74895
74896             for (var j = 0; i < hits.length; i++) {
74897                 if (isEqual(hits[j], end)) continue;
74898                 var edge = geoChooseEdge(unmovedNodes, end, projection);
74899                 _delta = geoVecSubtract(projection(edge.loc), start);
74900             }
74901         }
74902     }
74903
74904
74905     var action = function(graph) {
74906         if (_delta[0] === 0 && _delta[1] === 0) return graph;
74907
74908         setupCache(graph);
74909
74910         if (cache.intersections.length) {
74911             limitDelta(graph);
74912         }
74913
74914         for (var i = 0; i < cache.nodes.length; i++) {
74915             var node = graph.entity(cache.nodes[i]);
74916             var start = projection(node.loc);
74917             var end = geoVecAdd(start, _delta);
74918             graph = graph.replace(node.move(projection.invert(end)));
74919         }
74920
74921         if (cache.intersections.length) {
74922             graph = cleanupIntersections(graph);
74923         }
74924
74925         return graph;
74926     };
74927
74928
74929     action.delta = function() {
74930         return _delta;
74931     };
74932
74933
74934     return action;
74935 }
74936
74937 function actionMoveNode(nodeID, toLoc) {
74938
74939     var action = function(graph, t) {
74940         if (t === null || !isFinite(t)) t = 1;
74941         t = Math.min(Math.max(+t, 0), 1);
74942
74943         var node = graph.entity(nodeID);
74944         return graph.replace(
74945             node.move(geoVecInterp(node.loc, toLoc, t))
74946         );
74947     };
74948
74949     action.transitionable = true;
74950
74951     return action;
74952 }
74953
74954 function actionNoop() {
74955     return function(graph) {
74956         return graph;
74957     };
74958 }
74959
74960 /*
74961  * Based on https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/potlatch2/tools/Quadrilateralise.as
74962  */
74963 function actionOrthogonalize(wayId, projection) {
74964     var threshold = 12, // degrees within right or straight to alter
74965         lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180),
74966         upperThreshold = Math.cos(threshold * Math.PI / 180);
74967
74968
74969     var action = function(graph, t) {
74970         if (t === null || !isFinite(t)) t = 1;
74971         t = Math.min(Math.max(+t, 0), 1);
74972
74973         var way = graph.entity(wayId),
74974             nodes = graph.childNodes(way),
74975             points = uniq(nodes).map(function(n) { return projection(n.loc); }),
74976             corner = {i: 0, dotp: 1},
74977             epsilon = 1e-4,
74978             node, loc, score, motions, i, j;
74979
74980         if (points.length === 3) {   // move only one vertex for right triangle
74981             for (i = 0; i < 1000; i++) {
74982                 motions = points.map(calcMotion);
74983                 points[corner.i] = addPoints(points[corner.i], motions[corner.i]);
74984                 score = corner.dotp;
74985                 if (score < epsilon) {
74986                     break;
74987                 }
74988             }
74989
74990             node = graph.entity(nodes[corner.i].id);
74991             loc = projection.invert(points[corner.i]);
74992             graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
74993
74994         } else {
74995             var best,
74996                 originalPoints = clone(points);
74997             score = Infinity;
74998
74999             for (i = 0; i < 1000; i++) {
75000                 motions = points.map(calcMotion);
75001                 for (j = 0; j < motions.length; j++) {
75002                     points[j] = addPoints(points[j],motions[j]);
75003                 }
75004                 var newScore = squareness(points);
75005                 if (newScore < score) {
75006                     best = clone(points);
75007                     score = newScore;
75008                 }
75009                 if (score < epsilon) {
75010                     break;
75011                 }
75012             }
75013
75014             points = best;
75015
75016             for (i = 0; i < points.length; i++) {
75017                 // only move the points that actually moved
75018                 if (originalPoints[i][0] !== points[i][0] || originalPoints[i][1] !== points[i][1]) {
75019                     loc = projection.invert(points[i]);
75020                     node = graph.entity(nodes[i].id);
75021                     graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
75022                 }
75023             }
75024
75025             // remove empty nodes on straight sections
75026             for (i = 0; t === 1 && i < points.length; i++) {
75027                 node = graph.entity(nodes[i].id);
75028
75029                 if (graph.parentWays(node).length > 1 ||
75030                     graph.parentRelations(node).length ||
75031                     node.hasInterestingTags()) {
75032                     continue;
75033                 }
75034
75035                 var dotp = normalizedDotProduct(i, points);
75036                 if (dotp < -1 + epsilon) {
75037                     graph = actionDeleteNode(node.id)(graph);
75038                 }
75039             }
75040         }
75041
75042         return graph;
75043
75044
75045         function calcMotion(b, i, array) {
75046             var a = array[(i - 1 + array.length) % array.length],
75047                 c = array[(i + 1) % array.length],
75048                 p = subtractPoints(a, b),
75049                 q = subtractPoints(c, b),
75050                 scale, dotp;
75051
75052             scale = 2 * Math.min(geoVecLength(p, [0, 0]), geoVecLength(q, [0, 0]));
75053             p = normalizePoint(p, 1.0);
75054             q = normalizePoint(q, 1.0);
75055
75056             dotp = filterDotProduct(p[0] * q[0] + p[1] * q[1]);
75057
75058             // nasty hack to deal with almost-straight segments (angle is closer to 180 than to 90/270).
75059             if (array.length > 3) {
75060                 if (dotp < -0.707106781186547) {
75061                     dotp += 1.0;
75062                 }
75063             } else if (dotp && Math.abs(dotp) < corner.dotp) {
75064                 corner.i = i;
75065                 corner.dotp = Math.abs(dotp);
75066             }
75067
75068             return normalizePoint(addPoints(p, q), 0.1 * dotp * scale);
75069         }
75070     };
75071
75072
75073     function squareness(points) {
75074         return points.reduce(function(sum, val, i, array) {
75075             var dotp = normalizedDotProduct(i, array);
75076
75077             dotp = filterDotProduct(dotp);
75078             return sum + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
75079         }, 0);
75080     }
75081
75082
75083     function normalizedDotProduct(i, points) {
75084         var a = points[(i - 1 + points.length) % points.length],
75085             b = points[i],
75086             c = points[(i + 1) % points.length],
75087             p = subtractPoints(a, b),
75088             q = subtractPoints(c, b);
75089
75090         p = normalizePoint(p, 1.0);
75091         q = normalizePoint(q, 1.0);
75092
75093         return p[0] * q[0] + p[1] * q[1];
75094     }
75095
75096
75097     function subtractPoints(a, b) {
75098         return [a[0] - b[0], a[1] - b[1]];
75099     }
75100
75101
75102     function addPoints(a, b) {
75103         return [a[0] + b[0], a[1] + b[1]];
75104     }
75105
75106
75107     function normalizePoint(point, scale) {
75108         var vector = [0, 0];
75109         var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
75110         if (length !== 0) {
75111             vector[0] = point[0] / length;
75112             vector[1] = point[1] / length;
75113         }
75114
75115         vector[0] *= scale;
75116         vector[1] *= scale;
75117
75118         return vector;
75119     }
75120
75121
75122     function filterDotProduct(dotp) {
75123         if (lowerThreshold > Math.abs(dotp) || Math.abs(dotp) > upperThreshold) {
75124             return dotp;
75125         }
75126
75127         return 0;
75128     }
75129
75130
75131     action.disabled = function(graph) {
75132         var way = graph.entity(wayId),
75133             nodes = graph.childNodes(way),
75134             points = uniq(nodes).map(function(n) { return projection(n.loc); });
75135
75136         if (squareness(points)) {
75137             return false;
75138         }
75139
75140         return 'not_squarish';
75141     };
75142
75143
75144     action.transitionable = true;
75145
75146
75147     return action;
75148 }
75149
75150 // `actionRestrictTurn` creates a turn restriction relation.
75151 //
75152 // `turn` must be an `osmTurn` object
75153 // see osm/intersection.js, pathToTurn()
75154 //
75155 // This specifies a restriction of type `restriction` when traveling from
75156 // `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`.
75157 // (The action does not check that these entities form a valid intersection.)
75158 //
75159 // From, to, and via ways should be split before calling this action.
75160 // (old versions of the code would split the ways here, but we no longer do it)
75161 //
75162 // For testing convenience, accepts a restrictionID to assign to the new
75163 // relation. Normally, this will be undefined and the relation will
75164 // automatically be assigned a new ID.
75165 //
75166 function actionRestrictTurn(turn, restrictionType, restrictionID) {
75167
75168     return function(graph) {
75169         var fromWay = graph.entity(turn.from.way);
75170         var toWay = graph.entity(turn.to.way);
75171         var viaNode = turn.via.node && graph.entity(turn.via.node);
75172         var viaWays = turn.via.ways && turn.via.ways.map(function(id) { return graph.entity(id); });
75173         var members = [];
75174
75175         members.push({ id: fromWay.id, type: 'way',  role: 'from' });
75176
75177         if (viaNode) {
75178             members.push({ id: viaNode.id,  type: 'node', role: 'via' });
75179         } else if (viaWays) {
75180             viaWays.forEach(function(viaWay) {
75181                 members.push({ id: viaWay.id,  type: 'way', role: 'via' });
75182             });
75183         }
75184
75185         members.push({ id: toWay.id, type: 'way',  role: 'to' });
75186
75187         return graph.replace(osmRelation({
75188             id: restrictionID,
75189             tags: {
75190                 type: 'restriction',
75191                 restriction: restrictionType
75192             },
75193             members: members
75194         }));
75195     };
75196 }
75197
75198 function actionRevert(id) {
75199     var action = function(graph) {
75200         var entity = graph.hasEntity(id),
75201             base = graph.base().entities[id];
75202
75203         if (entity && !base) {    // entity will be removed..
75204             if (entity.type === 'node') {
75205                 graph.parentWays(entity)
75206                     .forEach(function(parent) {
75207                         parent = parent.removeNode(id);
75208                         graph = graph.replace(parent);
75209
75210                         if (parent.isDegenerate()) {
75211                             graph = actionDeleteWay(parent.id)(graph);
75212                         }
75213                     });
75214             }
75215
75216             graph.parentRelations(entity)
75217                 .forEach(function(parent) {
75218                     parent = parent.removeMembersWithID(id);
75219                     graph = graph.replace(parent);
75220
75221                     if (parent.isDegenerate()) {
75222                         graph = actionDeleteRelation(parent.id)(graph);
75223                     }
75224                 });
75225         }
75226
75227         return graph.revert(id);
75228     };
75229
75230     return action;
75231 }
75232
75233 function actionRotate(rotateIds, pivot, angle, projection) {
75234
75235     var action = function(graph) {
75236         return graph.update(function(graph) {
75237             utilGetAllNodes(rotateIds, graph).forEach(function(node) {
75238                 var point = geoRotate([projection(node.loc)], angle, pivot)[0];
75239                 graph = graph.replace(node.move(projection.invert(point)));
75240             });
75241         });
75242     };
75243
75244     return action;
75245 }
75246
75247 /* Built-in method references for those with the same name as other `lodash` methods. */
75248 var nativeMax$8 = Math.max;
75249
75250 /**
75251  * Gets the index at which the first occurrence of `value` is found in `array`
75252  * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
75253  * for equality comparisons. If `fromIndex` is negative, it's used as the
75254  * offset from the end of `array`.
75255  *
75256  * @static
75257  * @memberOf _
75258  * @since 0.1.0
75259  * @category Array
75260  * @param {Array} array The array to inspect.
75261  * @param {*} value The value to search for.
75262  * @param {number} [fromIndex=0] The index to search from.
75263  * @returns {number} Returns the index of the matched value, else `-1`.
75264  * @example
75265  *
75266  * _.indexOf([1, 2, 1, 2], 2);
75267  * // => 1
75268  *
75269  * // Search from the `fromIndex`.
75270  * _.indexOf([1, 2, 1, 2], 2, 2);
75271  * // => 3
75272  */
75273 function indexOf(array, value, fromIndex) {
75274   var length = array == null ? 0 : array.length;
75275   if (!length) {
75276     return -1;
75277   }
75278   var index = fromIndex == null ? 0 : toInteger(fromIndex);
75279   if (index < 0) {
75280     index = nativeMax$8(length + index, 0);
75281   }
75282   return baseIndexOf(array, value, index);
75283 }
75284
75285 // Split a way at the given node.
75286 //
75287 // Optionally, split only the given ways, if multiple ways share
75288 // the given node.
75289 //
75290 // This is the inverse of `iD.actionJoin`.
75291 //
75292 // For testing convenience, accepts an ID to assign to the new way.
75293 // Normally, this will be undefined and the way will automatically
75294 // be assigned a new ID.
75295 //
75296 // Reference:
75297 //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
75298 //
75299 function actionSplit(nodeId, newWayIds) {
75300     var _wayIDs;
75301
75302     // If the way is closed, we need to search for a partner node
75303     // to split the way at.
75304     //
75305     // The following looks for a node that is both far away from
75306     // the initial node in terms of way segment length and nearby
75307     // in terms of beeline-distance. This assures that areas get
75308     // split on the most "natural" points (independent of the number
75309     // of nodes).
75310     // For example: bone-shaped areas get split across their waist
75311     // line, circles across the diameter.
75312     function splitArea(nodes, idxA, graph) {
75313         var lengths = new Array(nodes.length);
75314         var length;
75315         var i;
75316         var best = 0;
75317         var idxB;
75318
75319         function wrap(index) {
75320             return utilWrap(index, nodes.length);
75321         }
75322
75323         function dist(nA, nB) {
75324             var locA = graph.entity(nA).loc;
75325             var locB = graph.entity(nB).loc;
75326             var epsilon = 1e-6;
75327             return (locA && locB) ? geoSphericalDistance(locA, locB) : epsilon;
75328         }
75329
75330         // calculate lengths
75331         length = 0;
75332         for (i = wrap(idxA+1); i !== idxA; i = wrap(i+1)) {
75333             length += dist(nodes[i], nodes[wrap(i-1)]);
75334             lengths[i] = length;
75335         }
75336
75337         length = 0;
75338         for (i = wrap(idxA-1); i !== idxA; i = wrap(i-1)) {
75339             length += dist(nodes[i], nodes[wrap(i+1)]);
75340             if (length < lengths[i])
75341                 lengths[i] = length;
75342         }
75343
75344         // determine best opposite node to split
75345         for (i = 0; i < nodes.length; i++) {
75346             var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
75347             if (cost > best) {
75348                 idxB = i;
75349                 best = cost;
75350             }
75351         }
75352
75353         return idxB;
75354     }
75355
75356
75357     function split(graph, wayA, newWayId) {
75358         var wayB = osmWay({id: newWayId, tags: wayA.tags});   // `wayB` is the NEW way
75359         var origNodes = wayA.nodes.slice();
75360         var nodesA;
75361         var nodesB;
75362         var isArea = wayA.isArea();
75363         var isOuter = osmIsSimpleMultipolygonOuterMember(wayA, graph);
75364
75365         if (wayA.isClosed()) {
75366             var nodes = wayA.nodes.slice(0, -1);
75367             var idxA = indexOf(nodes, nodeId);
75368             var idxB = splitArea(nodes, idxA, graph);
75369
75370             if (idxB < idxA) {
75371                 nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
75372                 nodesB = nodes.slice(idxB, idxA + 1);
75373             } else {
75374                 nodesA = nodes.slice(idxA, idxB + 1);
75375                 nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
75376             }
75377         } else {
75378             var idx = indexOf(wayA.nodes, nodeId, 1);
75379             nodesA = wayA.nodes.slice(0, idx + 1);
75380             nodesB = wayA.nodes.slice(idx);
75381         }
75382
75383         wayA = wayA.update({nodes: nodesA});
75384         wayB = wayB.update({nodes: nodesB});
75385
75386         graph = graph.replace(wayA);
75387         graph = graph.replace(wayB);
75388
75389         graph.parentRelations(wayA).forEach(function(relation) {
75390             var member;
75391
75392             // Turn restrictions - make sure:
75393             // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation
75394             //    (whichever one is connected to the VIA node/ways)
75395             // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way
75396             if (relation.isRestriction()) {
75397                 var f = relation.memberByRole('from');
75398                 var v = relation.membersByRole('via');
75399                 var t = relation.memberByRole('to');
75400                 var i;
75401
75402                 // 1. split a FROM/TO
75403                 if (f.id === wayA.id || t.id === wayA.id) {
75404                     var keepB = false;
75405                     if (v.length === 1 && v[0].type === 'node') {   // check via node
75406                         keepB = wayB.contains(v[0].id);
75407                     } else {                                        // check via way(s)
75408                         for (i = 0; i < v.length; i++) {
75409                             if (v[i].type === 'way') {
75410                                 var wayVia = graph.hasEntity(v[i].id);
75411                                 if (wayVia && intersection(wayB.nodes, wayVia.nodes).length) {
75412                                     keepB = true;
75413                                     break;
75414                                 }
75415                             }
75416                         }
75417                     }
75418
75419                     if (keepB) {
75420                         relation = relation.replaceMember(wayA, wayB);
75421                         graph = graph.replace(relation);
75422                     }
75423
75424                 // 2. split a VIA
75425                 } else {
75426                     for (i = 0; i < v.length; i++) {
75427                         if (v[i].type === 'way' && v[i].id === wayA.id) {
75428                             member = {
75429                                 id: wayB.id,
75430                                 type: 'way',
75431                                 role: 'via'
75432                             };
75433                             graph = actionAddMember(relation.id, member, v[i].index + 1)(graph);
75434                             break;
75435                         }
75436                     }
75437                 }
75438
75439             // All other relations (Routes, Multipolygons, etc):
75440             // 1. Both `wayA` and `wayB` remain in the relation
75441             // 2. But must be inserted as a pair (see `actionAddMember` for details)
75442             } else {
75443                 if (relation === isOuter) {
75444                     graph = graph.replace(relation.mergeTags(wayA.tags));
75445                     graph = graph.replace(wayA.update({tags: {}}));
75446                     graph = graph.replace(wayB.update({tags: {}}));
75447                 }
75448
75449                 member = {
75450                     id: wayB.id,
75451                     type: 'way',
75452                     role: relation.memberById(wayA.id).role
75453                 };
75454
75455                 var insertPair = {
75456                     originalID: wayA.id,
75457                     insertedID: wayB.id,
75458                     nodes: origNodes
75459                 };
75460
75461                 graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
75462             }
75463         });
75464
75465         if (!isOuter && isArea) {
75466             var multipolygon = osmRelation({
75467                 tags: assignIn({}, wayA.tags, {type: 'multipolygon'}),
75468                 members: [
75469                     {id: wayA.id, role: 'outer', type: 'way'},
75470                     {id: wayB.id, role: 'outer', type: 'way'}
75471                 ]
75472             });
75473
75474             graph = graph.replace(multipolygon);
75475             graph = graph.replace(wayA.update({tags: {}}));
75476             graph = graph.replace(wayB.update({tags: {}}));
75477         }
75478
75479         return graph;
75480     }
75481
75482
75483     var action = function(graph) {
75484         var candidates = action.ways(graph);
75485         for (var i = 0; i < candidates.length; i++) {
75486             graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
75487         }
75488         return graph;
75489     };
75490
75491
75492     action.ways = function(graph) {
75493         var node = graph.entity(nodeId);
75494         var parents = graph.parentWays(node);
75495         var hasLines = some(parents, function(parent) { return parent.geometry(graph) === 'line'; });
75496
75497         return parents.filter(function(parent) {
75498             if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
75499                 return false;
75500
75501             if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line')
75502                 return false;
75503
75504             if (parent.isClosed()) {
75505                 return true;
75506             }
75507
75508             for (var i = 1; i < parent.nodes.length - 1; i++) {
75509                 if (parent.nodes[i] === nodeId) {
75510                     return true;
75511                 }
75512             }
75513
75514             return false;
75515         });
75516     };
75517
75518
75519     action.disabled = function(graph) {
75520         var candidates = action.ways(graph);
75521         if (candidates.length === 0 || (_wayIDs && _wayIDs.length !== candidates.length))
75522             return 'not_eligible';
75523     };
75524
75525
75526     action.limitWays = function(_) {
75527         if (!arguments.length) return _wayIDs;
75528         _wayIDs = _;
75529         return action;
75530     };
75531
75532
75533     return action;
75534 }
75535
75536 /*
75537  * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
75538  */
75539 function actionStraighten(wayId, projection) {
75540
75541     function positionAlongWay(n, s, e) {
75542         return ((n[0] - s[0]) * (e[0] - s[0]) + (n[1] - s[1]) * (e[1] - s[1])) /
75543                 (Math.pow(e[0] - s[0], 2) + Math.pow(e[1] - s[1], 2));
75544     }
75545
75546
75547     var action = function(graph, t) {
75548         if (t === null || !isFinite(t)) t = 1;
75549         t = Math.min(Math.max(+t, 0), 1);
75550
75551         var way = graph.entity(wayId),
75552             nodes = graph.childNodes(way),
75553             points = nodes.map(function(n) { return projection(n.loc); }),
75554             startPoint = points[0],
75555             endPoint = points[points.length-1],
75556             toDelete = [],
75557             i;
75558
75559         for (i = 1; i < points.length-1; i++) {
75560             var node = nodes[i],
75561                 point = points[i];
75562
75563             if (t < 1 || graph.parentWays(node).length > 1 ||
75564                 graph.parentRelations(node).length ||
75565                 node.hasInterestingTags()) {
75566
75567                 var u = positionAlongWay(point, startPoint, endPoint),
75568                     p = [
75569                         startPoint[0] + u * (endPoint[0] - startPoint[0]),
75570                         startPoint[1] + u * (endPoint[1] - startPoint[1])
75571                     ],
75572                     loc2 = projection.invert(p);
75573
75574                 graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
75575
75576             } else {
75577                 // safe to delete
75578                 if (toDelete.indexOf(node) === -1) {
75579                     toDelete.push(node);
75580                 }
75581             }
75582         }
75583
75584         for (i = 0; i < toDelete.length; i++) {
75585             graph = actionDeleteNode(toDelete[i].id)(graph);
75586         }
75587
75588         return graph;
75589     };
75590
75591
75592     action.disabled = function(graph) {
75593         // check way isn't too bendy
75594         var way = graph.entity(wayId),
75595             nodes = graph.childNodes(way),
75596             points = nodes.map(function(n) { return projection(n.loc); }),
75597             startPoint = points[0],
75598             endPoint = points[points.length-1],
75599             threshold = 0.2 * geoVecLength(startPoint, endPoint),
75600             i;
75601
75602         if (threshold === 0) {
75603             return 'too_bendy';
75604         }
75605
75606         for (i = 1; i < points.length-1; i++) {
75607             var point = points[i],
75608                 u = positionAlongWay(point, startPoint, endPoint),
75609                 p0 = startPoint[0] + u * (endPoint[0] - startPoint[0]),
75610                 p1 = startPoint[1] + u * (endPoint[1] - startPoint[1]),
75611                 dist = Math.sqrt(Math.pow(p0 - point[0], 2) + Math.pow(p1 - point[1], 2));
75612
75613             // to bendy if point is off by 20% of total start/end distance in projected space
75614             if (isNaN(dist) || dist > threshold) {
75615                 return 'too_bendy';
75616             }
75617         }
75618     };
75619
75620
75621     action.transitionable = true;
75622
75623
75624     return action;
75625 }
75626
75627 // `actionUnrestrictTurn` deletes a turn restriction relation.
75628 //
75629 // `turn` must be an `osmTurn` object with a `restrictionID` property.
75630 // see osm/intersection.js, pathToTurn()
75631 //
75632 function actionUnrestrictTurn(turn) {
75633     return function(graph) {
75634         return actionDeleteRelation(turn.restrictionID)(graph);
75635     };
75636 }
75637
75638 /* Reflect the given area around its axis of symmetry */
75639 function actionReflect(reflectIds, projection) {
75640     var useLongAxis = true;
75641
75642
75643     // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
75644     // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
75645     function getSmallestSurroundingRectangle(graph, nodes) {
75646         var points = nodes.map(function(n) { return projection(n.loc); }),
75647             hull = d3_polygonHull(points),
75648             centroid = d3_polygonCentroid(hull),
75649             minArea = Infinity,
75650             ssrExtent = [],
75651             ssrAngle = 0,
75652             c1 = hull[0];
75653
75654         for (var i = 0; i <= hull.length - 1; i++) {
75655             var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1],
75656                 angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]),
75657                 poly = geoRotate(hull, -angle, centroid),
75658                 extent = poly.reduce(function(extent, point) {
75659                         return extent.extend(geoExtent$$1(point));
75660                     }, geoExtent$$1()),
75661                 area = extent.area();
75662
75663             if (area < minArea) {
75664                 minArea = area;
75665                 ssrExtent = extent;
75666                 ssrAngle = angle;
75667             }
75668             c1 = c2;
75669         }
75670
75671         return {
75672             poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
75673             angle: ssrAngle
75674         };
75675     }
75676
75677
75678     var action = function(graph, t) {
75679         if (t === null || !isFinite(t)) t = 1;
75680         t = Math.min(Math.max(+t, 0), 1);
75681
75682         var nodes = utilGetAllNodes(reflectIds, graph),
75683             ssr = getSmallestSurroundingRectangle(graph, nodes);
75684
75685         // Choose line pq = axis of symmetry.
75686         // The shape's surrounding rectangle has 2 axes of symmetry.
75687         // Reflect across the longer axis by default.
75688         var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ],
75689             q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ],
75690             p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ],
75691             q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ],
75692             p, q;
75693
75694         var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
75695         if ((useLongAxis && isLong) || (!useLongAxis && !isLong)) {
75696             p = p1;
75697             q = q1;
75698         } else {
75699             p = p2;
75700             q = q2;
75701         }
75702
75703         // reflect c across pq
75704         // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
75705         var dx = q[0] - p[0];
75706         var dy = q[1] - p[1];
75707         var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
75708         var b = 2 * dx * dy / (dx * dx + dy * dy);
75709         for (var i = 0; i < nodes.length; i++) {
75710             var node = nodes[i];
75711             var c = projection(node.loc);
75712             var c2 = [
75713                 a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
75714                 b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
75715             ];
75716             var loc2 = projection.invert(c2);
75717             node = node.move(geoVecInterp(node.loc, loc2, t));
75718             graph = graph.replace(node);
75719         }
75720
75721         return graph;
75722     };
75723
75724
75725     action.useLongAxis = function(_) {
75726         if (!arguments.length) return useLongAxis;
75727         useLongAxis = _;
75728         return action;
75729     };
75730
75731
75732     action.transitionable = true;
75733
75734
75735     return action;
75736 }
75737
75738
75739
75740 var index$4 = Object.freeze({
75741         d3combobox: d3combobox,
75742         d3geoTile: d3geoTile,
75743         d3keybinding: d3keybinding
75744 });
75745
75746 var Connection = services.osm;
75747
75748 var debug = false;
75749
75750
75751 var iD = Object.freeze({
75752         Connection: Connection,
75753         debug: debug,
75754         lib: index$4,
75755         d3: index$3,
75756         Context: coreContext,
75757         setAreaKeys: setAreaKeys,
75758         Difference: coreDifference,
75759         Graph: coreGraph$$1,
75760         History: coreHistory,
75761         Tree: coreTree,
75762         geoCross: geoVecCross,
75763         geoInterp: geoVecInterp,
75764         geoRoundCoordinates: geoVecFloor,
75765         geoEuclideanDistance: geoVecLength,
75766         Entity: osmEntity$$1,
75767         Node: osmNode,
75768         Relation: osmRelation,
75769         Way: osmWay,
75770         BackgroundSource: rendererBackgroundSource,
75771         Background: rendererBackground,
75772         Features: rendererFeatures,
75773         Map: rendererMap,
75774         TileLayer: rendererTileLayer,
75775         Detect: utilDetect,
75776         uiPreset: uiPresetEditor,
75777         actionAddEntity: actionAddEntity,
75778         actionAddMember: actionAddMember,
75779         actionAddMidpoint: actionAddMidpoint,
75780         actionAddVertex: actionAddVertex,
75781         actionChangeMember: actionChangeMember,
75782         actionChangePreset: actionChangePreset,
75783         actionChangeTags: actionChangeTags,
75784         actionCircularize: actionCircularize,
75785         actionConnect: actionConnect,
75786         actionCopyEntities: actionCopyEntities,
75787         actionDeleteMember: actionDeleteMember,
75788         actionDeleteMultiple: actionDeleteMultiple,
75789         actionDeleteNode: actionDeleteNode,
75790         actionDeleteRelation: actionDeleteRelation,
75791         actionDeleteWay: actionDeleteWay,
75792         actionDeprecateTags: actionDeprecateTags,
75793         actionDiscardTags: actionDiscardTags,
75794         actionDisconnect: actionDisconnect,
75795         actionJoin: actionJoin,
75796         actionMerge: actionMerge,
75797         actionMergePolygon: actionMergePolygon,
75798         actionMergeRemoteChanges: actionMergeRemoteChanges,
75799         actionMove: actionMove,
75800         actionMoveNode: actionMoveNode,
75801         actionNoop: actionNoop,
75802         actionOrthogonalize: actionOrthogonalize,
75803         actionRestrictTurn: actionRestrictTurn,
75804         actionReverse: actionReverse,
75805         actionRevert: actionRevert,
75806         actionRotate: actionRotate,
75807         actionSplit: actionSplit,
75808         actionStraighten: actionStraighten,
75809         actionUnrestrictTurn: actionUnrestrictTurn,
75810         actionReflect: actionReflect,
75811         behaviorAddWay: behaviorAddWay,
75812         behaviorBreathe: behaviorBreathe,
75813         behaviorCopy: behaviorCopy,
75814         behaviorDrag: behaviorDrag,
75815         behaviorDrawWay: behaviorDrawWay,
75816         behaviorDraw: behaviorDraw,
75817         behaviorEdit: behaviorEdit,
75818         behaviorHash: behaviorHash,
75819         behaviorHover: behaviorHover,
75820         behaviorLasso: behaviorLasso,
75821         behaviorOperation: behaviorOperation,
75822         behaviorPaste: behaviorPaste,
75823         behaviorSelect: behaviorSelect,
75824         behaviorTail: behaviorTail,
75825         coreContext: coreContext,
75826         coreDifference: coreDifference,
75827         coreGraph: coreGraph$$1,
75828         coreHistory: coreHistory,
75829         coreTree: coreTree,
75830         dataFeatureIcons: dataFeatureIcons,
75831         data: data,
75832         dataWikipedia: wikipedia$2,
75833         dataSuggestions: dataSuggestions,
75834         dataAddressFormats: dataAddressFormats,
75835         dataDeprecated: dataDeprecated,
75836         dataDiscarded: dataDiscarded,
75837         dataLocales: dataLocales,
75838         dataPhoneFormats: dataPhoneFormats,
75839         dataShortcuts: dataShortcuts,
75840         dataImperial: dataImperial,
75841         dataDriveLeft: dataDriveLeft,
75842         dataEn: en,
75843         geoExtent: geoExtent$$1,
75844         geoLatToMeters: geoLatToMeters,
75845         geoLonToMeters: geoLonToMeters,
75846         geoMetersToLat: geoMetersToLat,
75847         geoMetersToLon: geoMetersToLon,
75848         geoMetersToOffset: geoMetersToOffset,
75849         geoOffsetToMeters: geoOffsetToMeters,
75850         geoScaleToZoom: geoScaleToZoom,
75851         geoSphericalDistance: geoSphericalDistance,
75852         geoZoomToScale: geoZoomToScale,
75853         geoAngle: geoAngle,
75854         geoChooseEdge: geoChooseEdge,
75855         geoEdgeEqual: geoEdgeEqual,
75856         geoHasLineIntersections: geoHasLineIntersections,
75857         geoHasSelfIntersections: geoHasSelfIntersections,
75858         geoRotate: geoRotate,
75859         geoLineIntersection: geoLineIntersection,
75860         geoPathHasIntersections: geoPathHasIntersections,
75861         geoPathIntersections: geoPathIntersections,
75862         geoPathLength: geoPathLength,
75863         geoPointInPolygon: geoPointInPolygon,
75864         geoPolygonContainsPolygon: geoPolygonContainsPolygon,
75865         geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
75866         geoViewportEdge: geoViewportEdge,
75867         geoRawMercator: geoRawMercator,
75868         geoVecAdd: geoVecAdd,
75869         geoVecAngle: geoVecAngle,
75870         geoVecCross: geoVecCross,
75871         geoVecDot: geoVecDot,
75872         geoVecEqual: geoVecEqual,
75873         geoVecFloor: geoVecFloor,
75874         geoVecInterp: geoVecInterp,
75875         geoVecLength: geoVecLength,
75876         geoVecSubtract: geoVecSubtract,
75877         geoVecScale: geoVecScale,
75878         modeAddArea: modeAddArea$$1,
75879         modeAddLine: modeAddLine$$1,
75880         modeAddPoint: modeAddPoint$$1,
75881         modeBrowse: modeBrowse,
75882         modeDragNode: modeDragNode$$1,
75883         modeDrawArea: modeDrawArea,
75884         modeDrawLine: modeDrawLine,
75885         modeMove: modeMove$$1,
75886         modeRotate: modeRotate$$1,
75887         modeSave: modeSave$$1,
75888         modeSelect: modeSelect,
75889         operationCircularize: operationCircularize,
75890         operationContinue: operationContinue,
75891         operationDelete: operationDelete,
75892         operationDisconnect: operationDisconnect,
75893         operationMerge: operationMerge,
75894         operationMove: operationMove,
75895         operationOrthogonalize: operationOrthogonalize,
75896         operationReflectShort: operationReflectShort,
75897         operationReflectLong: operationReflectLong,
75898         operationReverse: operationReverse,
75899         operationRotate: operationRotate,
75900         operationSplit: operationSplit,
75901         operationStraighten: operationStraighten,
75902         osmChangeset: osmChangeset,
75903         osmEntity: osmEntity$$1,
75904         osmNode: osmNode,
75905         osmRelation: osmRelation,
75906         osmWay: osmWay,
75907         osmIntersection: osmIntersection,
75908         osmTurn: osmTurn,
75909         osmInferRestriction: osmInferRestriction,
75910         osmLanes: osmLanes,
75911         osmIsSimpleMultipolygonOuterMember: osmIsSimpleMultipolygonOuterMember,
75912         osmSimpleMultipolygonOuterMember: osmSimpleMultipolygonOuterMember,
75913         osmJoinWays: osmJoinWays,
75914         osmOneWayTags: osmOneWayTags,
75915         osmPavedTags: osmPavedTags,
75916         osmIsInterestingTag: osmIsInterestingTag,
75917         presetCategory: presetCategory,
75918         presetCollection: presetCollection,
75919         presetField: presetField,
75920         presetPreset: presetPreset,
75921         presetIndex: presetIndex,
75922         rendererBackgroundSource: rendererBackgroundSource,
75923         rendererBackground: rendererBackground,
75924         rendererFeatures: rendererFeatures,
75925         rendererMap: rendererMap,
75926         rendererTileLayer: rendererTileLayer,
75927         services: services,
75928         serviceMapillary: serviceMapillary,
75929         serviceNominatim: serviceNominatim,
75930         serviceOpenstreetcam: serviceOpenstreetcam,
75931         serviceOsm: serviceOsm,
75932         serviceTaginfo: serviceTaginfo,
75933         serviceWikidata: serviceWikidata,
75934         serviceWikipedia: serviceWikipedia,
75935         svgAreas: svgAreas$$1,
75936         svgDebug: svgDebug$$1,
75937         svgDefs: svgDefs,
75938         svgGpx: svgGpx$$1,
75939         svgIcon: svgIcon,
75940         svgLabels: svgLabels,
75941         svgLayers: svgLayers,
75942         svgLines: svgLines$$1,
75943         svgMapillaryImages: svgMapillaryImages$$1,
75944         svgMapillarySigns: svgMapillarySigns,
75945         svgMidpoints: svgMidpoints$$1,
75946         svgOneWaySegments: svgOneWaySegments,
75947         svgOpenstreetcamImages: svgOpenstreetcamImages$$1,
75948         svgOsm: svgOsm,
75949         svgPassiveVertex: svgPassiveVertex,
75950         svgPath: svgPath,
75951         svgPointTransform: svgPointTransform,
75952         svgPoints: svgPoints$$1,
75953         svgRelationMemberTags: svgRelationMemberTags,
75954         svgSegmentWay: svgSegmentWay,
75955         svgTagClasses: svgTagClasses,
75956         svgTurns: svgTurns,
75957         svgVertices: svgVertices$$1,
75958         uiFields: uiFields,
75959         uiFieldDefaultCheck: uiFieldCheck,
75960         uiFieldOnewayCheck: uiFieldCheck,
75961         uiFieldCheck: uiFieldCheck,
75962         uiFieldMultiCombo: uiFieldCombo,
75963         uiFieldNetworkCombo: uiFieldCombo,
75964         uiFieldSemiCombo: uiFieldCombo,
75965         uiFieldTypeCombo: uiFieldCombo,
75966         uiFieldCombo: uiFieldCombo,
75967         uiFieldUrl: uiFieldText,
75968         uiFieldNumber: uiFieldText,
75969         uiFieldTel: uiFieldText,
75970         uiFieldEmail: uiFieldText,
75971         uiFieldText: uiFieldText,
75972         uiFieldAccess: uiFieldAccess,
75973         uiFieldAddress: uiFieldAddress,
75974         uiFieldCycleway: uiFieldCycleway,
75975         uiFieldLanes: uiFieldLanes,
75976         uiFieldLocalized: uiFieldLocalized,
75977         uiFieldMaxspeed: uiFieldMaxspeed,
75978         uiFieldStructureRadio: uiFieldRadio,
75979         uiFieldRadio: uiFieldRadio,
75980         uiFieldRestrictions: uiFieldRestrictions,
75981         uiFieldTextarea: uiFieldTextarea,
75982         uiFieldWikipedia: uiFieldWikipedia,
75983         uiIntro: uiIntro,
75984         uiInfoPanels: uiInfoPanels,
75985         uiPanelBackground: uiPanelBackground,
75986         uiPanelHistory: uiPanelHistory,
75987         uiPanelLocation: uiPanelLocation,
75988         uiPanelMeasurement: uiPanelMeasurement,
75989         uiInit: uiInit,
75990         uiAccount: uiAccount,
75991         uiAttribution: uiAttribution,
75992         uiBackground: uiBackground,
75993         uiBackgroundDisplayOptions: uiBackgroundDisplayOptions,
75994         uiBackgroundOffset: uiBackgroundOffset,
75995         uiChangesetEditor: uiChangesetEditor,
75996         uiCmd: uiCmd,
75997         uiCommit: uiCommit,
75998         uiCommitChanges: uiCommitChanges,
75999         uiCommitWarnings: uiCommitWarnings,
76000         uiConfirm: uiConfirm,
76001         uiConflicts: uiConflicts,
76002         uiContributors: uiContributors,
76003         uiCurtain: uiCurtain,
76004         uiDisclosure: uiDisclosure,
76005         uiEditMenu: uiEditMenu,
76006         uiEntityEditor: uiEntityEditor,
76007         uiFeatureInfo: uiFeatureInfo,
76008         uiFeatureList: uiFeatureList,
76009         uiField: uiField,
76010         uiFieldHelp: uiFieldHelp,
76011         uiFlash: uiFlash,
76012         uiFormFields: uiFormFields,
76013         uiFullScreen: uiFullScreen,
76014         uiGeolocate: uiGeolocate,
76015         uiHelp: uiHelp,
76016         uiInfo: uiInfo,
76017         uiInspector: uiInspector,
76018         uiLasso: uiLasso,
76019         uiLoading: uiLoading,
76020         uiMapData: uiMapData,
76021         uiMapInMap: uiMapInMap,
76022         uiModal: uiModal,
76023         uiModes: uiModes,
76024         uiNotice: uiNotice,
76025         uiPresetEditor: uiPresetEditor,
76026         uiPresetIcon: uiPresetIcon,
76027         uiPresetList: uiPresetList,
76028         uiRadialMenu: uiRadialMenu,
76029         uiRawMemberEditor: uiRawMemberEditor,
76030         uiRawMembershipEditor: uiRawMembershipEditor,
76031         uiRawTagEditor: uiRawTagEditor,
76032         uiRestore: uiRestore,
76033         uiSave: uiSave,
76034         uiScale: uiScale,
76035         uiSelectionList: uiSelectionList,
76036         uiSidebar: uiSidebar,
76037         uiSourceSwitch: uiSourceSwitch,
76038         uiSpinner: uiSpinner,
76039         uiSplash: uiSplash,
76040         uiStatus: uiStatus,
76041         uiSuccess: uiSuccess,
76042         uiTagReference: uiTagReference,
76043         uiToggle: uiToggle,
76044         uiTooltipHtml: uiTooltipHtml,
76045         uiUndoRedo: uiUndoRedo,
76046         uiVersion: uiVersion,
76047         uiViewOnOSM: uiViewOnOSM,
76048         uiZoom: uiZoom,
76049         utilAsyncMap: utilAsyncMap,
76050         utilCallWhenIdle: utilCallWhenIdle,
76051         utilDisplayName: utilDisplayName,
76052         utilDisplayNameForPath: utilDisplayNameForPath,
76053         utilDisplayType: utilDisplayType,
76054         utilEditDistance: utilEditDistance,
76055         utilEntitySelector: utilEntitySelector,
76056         utilEntityOrMemberSelector: utilEntityOrMemberSelector,
76057         utilFastMouse: utilFastMouse,
76058         utilFunctor: utilFunctor,
76059         utilGetAllNodes: utilGetAllNodes,
76060         utilGetPrototypeOf: utilGetPrototypeOf,
76061         utilGetSetValue: utilGetSetValue,
76062         utilIdleWorker: utilIdleWorker,
76063         utilNoAuto: utilNoAuto,
76064         utilPrefixCSSProperty: utilPrefixCSSProperty,
76065         utilPrefixDOMProperty: utilPrefixDOMProperty,
76066         utilQsString: utilQsString,
76067         utilRebind: utilRebind,
76068         utilSetTransform: utilSetTransform,
76069         utilSessionMutex: utilSessionMutex,
76070         utilStringQs: utilStringQs,
76071         utilSuggestNames: utilSuggestNames,
76072         utilTagText: utilTagText,
76073         utilTriggerEvent: utilTriggerEvent,
76074         utilWrap: utilWrap,
76075         d3combobox: d3combobox,
76076         d3geoTile: d3geoTile,
76077         d3keybinding: d3keybinding,
76078         validationDeprecatedTag: validationDeprecatedTag,
76079         validationDisconnectedHighway: validationDisconnectedHighway,
76080         validationManyDeletions: validationManyDeletions,
76081         validationMissingTag: validationMissingTag,
76082         validationOldMultipolygon: validationOldMultipolygon,
76083         validationTagSuggestsArea: validationTagSuggestsArea
76084 });
76085
76086 window.iD = iD;
76087
76088 }());
76089 //# sourceMappingURL=iD.js.map