]> git.openstreetmap.org Git - rails.git/blob - vendor/assets/iD/iD.js
32f5a40da3b995b3db01f6d2e76db648c346bfa8
[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 = /*#__PURE__*/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 = /*#__PURE__*/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":{"rtl":false},"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 = {"icons":{"information":"info","remove":"remove","undo":"undo"},"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."},"relation":"These features can't be connected because they have conflicting relation roles.","restriction":"These features can't be connected because it would damage a \"{relation}\" relation."},"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","no_history":"No History (New Feature)","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":{"just_edited":"You just edited OpenStreetMap!","thank_you":"Thank you for improving the map.","thank_you_location":"Thank you for improving the map around {where}.","help_html":"Your changes should appear on OpenStreetMap within a few minutes. It may take longer for maps elsewhere to receive updates.","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","view_on_osm":"View Changes on OSM","changeset_id":"Your changeset #: {changeset_id}","like_osm":"Like OpenStreetMap? Connect with others:","more":"More","events":"Events","languages":"Languages: {languages}","missing":"Is something missing from this list?","tell_us":"Tell us!"},"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"},"distance":{"label":"Total Distance"},"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"},"faces":{"label":"Faces"},"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..."},"horse_dressage":{"label":"Dressage Riding","options":{"undefined":"No","equestrian":"Yes"}},"horse_riding":{"label":"Horseback Riding","options":{"undefined":"No","horse_riding":"Yes"}},"horse_scale":{"label":"Horseback Riding Difficulty","placeholder":"Difficult, Dangerous...","options":{"common":"Easy: No problems or difficulties. (default)","demanding":"Use with caution: Uneven way, occasional difficult passages.","difficult":"Difficult: Way narrow and exposed. May contain obstacles to step over and narrow passages.","critical":"Borderline: Passable only for experienced riders and horses. Major obstacles. Bridges should be examined carefully.","dangerous":"Dangerous: Passable only for very experienced riders and horses and only in good weather. Dismount.","impossible":"Impassable: Way or bridge not passable for horses. Too narrow, insuffient support, obstacles like ladders. Danger of life."}},"horse_stables":{"label":"Riding Stable","options":{"undefined":"No","stables":"Yes"}},"iata":{"label":"IATA"},"icao":{"label":"ICAO"},"incline_steps":{"label":"Incline","options":{"up":"Up","down":"Down"}},"incline":{"label":"Incline"},"indoor":{"label":"Indoor"},"industrial":{"label":"Type"},"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..."},"maxspeed/advisory":{"label":"Advisory 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"},"usage_rail":{"label":"Usage Type","options":{"main":"Main","branch":"Branch","industrial":"Industrial","military":"Military","test":"Test","tourism":"Tourism"}},"vending":{"label":"Types 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":""},"advertising/column":{"name":"Advertising Column","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"},"allotments/plot":{"name":"Community Garden Plot","terms":""},"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/monastery":{"name":"Monastery Grounds","terms":"abbey,basilica,bethel,cathedral,chancel,chantry,chapel,church,fold,house of God,house of prayer,house of worship,minster,mission,monastery,mosque,oratory,parish,sacellum,sanctuary,shrine,synagogue,tabernacle,temple"},"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/coffee":{"name":"Coffee Vending Machine","terms":"coffee"},"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/electronics":{"name":"Electronics Vending Machine","terms":"cable,charger,earbud,headphone,phone,tablet"},"amenity/vending_machine/elongated_coin":{"name":"Flat Coin Vending Machine","terms":"coin,crush,elongated,flatten,penny,souvenir"},"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/food":{"name":"Food Vending Machine","terms":"food"},"amenity/vending_machine/fuel":{"name":"Gas Pump","terms":"petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel"},"amenity/vending_machine/ice_cream":{"name":"Ice Cream Vending Machine","terms":"chocolate,ice cream,frozen,popsicle,vanilla"},"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/stamps":{"name":"Postage Vending Machine","terms":"mail,postage,stamp"},"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/maze":{"name":"Maze","terms":"theme park,amusement ride,labyrinth"},"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/laboratory":{"name":"Medical Laboratory","terms":"medical_laboratory,medical_lab,blood_check"},"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/passing_place":{"name":"Passing Place","terms":"turnout, pullout"},"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":"dedicatory,epitaph,remember,remembrance,memory,monument,stolperstein"},"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/beach_resort":{"name":"Beach Resort","terms":""},"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/outdoor_seating":{"name":"Outdoor Seating Area","terms":"al fresco,beer garden,dining,cafe,restaurant,pub,bar,patio"},"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/antenna":{"name":"Antenna","terms":"broadcast,cell phone,cell,communication,mobile phone,radio,television,transmission,tv"},"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/observatory":{"name":"Observatory","terms":"astronomical,meteorological"},"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/mud":{"name":"Mud","terms":"wetland"},"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_grooming":{"name":"Pet Grooming Store","terms":"dog"},"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/trail_riding_station":{"name":"Trail Riding Station","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":"Only Left Turn","terms":""},"type/restriction/only_right_turn":{"name":"Only Right Turn","terms":""},"type/restriction/only_straight_on":{"name":"Only Straight On","terms":""},"type/restriction/only_u_turn":{"name":"Only U-turn","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 13 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 13 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"},"US_Forest_Service_roads_overlay":{"name":"U.S. Forest Roads Overlay"},"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 government 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. Data by OpenStreetMap, under ODbL"},"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"}},"community":{"osm-mg-facebook":{"name":"OpenStreetMap Madagascar Facebook Group","description":"Malagasy Facebook group for people interested in OpenStreetMap."},"talk-mg":{"name":"Talk-mg Mailing List","description":"Place for OpenStreetMap contributors, communities and users in Madagascar to share and discuss."},"OSM-BGD-facebook":{"name":"OpenStreetMap Bangladesh","description":"Improve OpenStreetMap in Bangladesh","extendedDescription":"Mapping in Bangladesh? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-India-facebook":{"name":"OpenStreetMap India - Participatory neighborhood mapping","description":"Improve OpenStreetMap in India","extendedDescription":"Mapping in India? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-india-mailinglist":{"name":"OpenStreetMap India Mailinglist","description":"Talk-in is the official Mailinglist for Indian Community"},"OSM-india-twitter":{"name":"OpenStreetMap India Twitter","description":"We are just a tweet away: {url}"},"OSM-IDN-facebook":{"name":"OpenStreetMap Indonesia","description":"Improve OpenStreetMap in Indonesia","extendedDescription":"Mapping in Indonesia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-japan-facebook":{"name":"OpenStreetMap Japan Community","description":"Mappers and OpenStreetMap users in Japan"},"OSM-japan-mailinglist":{"name":"OpenStreetMap Japan Mailinglist","description":"Talk-ja is an Official Mailinglist for Japanese Community"},"OSM-japan-twitter":{"name":"OpenStreetMap Japan Twitter","description":"Hashtag on Twitter: {url}"},"OSM-MNG-facebook":{"name":"OpenStreetMap Mongolia","description":"Improve OpenStreetMap in Mongolia","extendedDescription":"Mapping in Mongolia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-Nepal-facebook":{"name":"OpenStreetMap Nepal","description":"Improve OpenStreetMap in Nepal","extendedDescription":"Mapping in Nepal? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-PH-facebook":{"name":"OpenStreetMap PH Facebook","description":"Welcome to OpenStreetMap Philippines, where we encourage all fellow Filipinos to contribute to the OpenStreetMap project."},"OSM-PH-mailinglist":{"name":"Talk-ph Mailing List","description":"A mailing list to discuss OpenStreetMap in the Philippines"},"OSM-PH-slack":{"name":"OpenStreetMap PH Slack","description":"All are welcome! Sign up at {signupUrl}"},"OSM-PH-telegram":{"name":"OpenStreetMap PH Telegram","description":"Un-official, Telegram local community of OpenStreetMap contributors and friends in the Philippines"},"OSM-RU-forum":{"name":"OpenStreetMap RU forum","description":"OpenStreetMap Russia web forum"},"OSM-RU-telegram":{"name":"OpenStreetMap RU telegram","description":"OpenStreetMap Russia telegram chat"},"OSM-LKA-facebook":{"name":"OpenStreetMap Sri Lanka","description":"Improve OpenStreetMap in Sri Lanka","extendedDescription":"Mapping in Sri Lanka? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-TW-facebook":{"name":"OpenStreetMap Taiwan Community","description":"Facebook Group for Mappers and OpenStreetMap users to discuss matters about Taiwan."},"OSM-TW-mailinglist":{"name":"OpenStreetMap Taiwan Mailinglist","description":"Talk-tw is an Official Mailinglist for the Communities to dicuss matters about Taiwan"},"at-mailinglist":{"name":"Talk-at Mailing List","description":"Talk-at is the official mailing list for the Austrian OSM community"},"at-twitter":{"name":"OpenStreetMap Austria Twitter","description":"OpenStreetMap Austria On Twitter: {url}"},"osm-at":{"name":"OpenStreetMap Austria","description":"The platform for information on OpenStreetMap in Austria"},"be-facebook":{"name":"OpenStreetMap BE Community","description":"Mappers and OpenStreetMap facebook in Belgium"},"be-forum":{"name":"OpenStreetMap BE forum","description":"OpenStreetMap Belgium web forum"},"be-irc":{"name":"OpenStreetMap Belgium IRC","description":"Join #osmbe on irc.oftc.net (port 6667)","extendedDescription":"Join #osmbe on irc.oftc.net (port 6667), it is bridged with the matrix chat channel"},"be-mailinglist":{"name":"Talk-be Mailing List","description":"Talk-be is the official mailing list for Belgian OSM community"},"be-matrix":{"name":"OpenStreetMap BE Riot channel","description":"All mappers are welcome! Sign up at {signupUrl}","extendedDescription":"Multiple channels exists, for beginners to thematic channels, landuse and dev talk"},"be-twitter":{"name":"OpenStreetMap Belgium Twitter","description":"OSM Belgium On Twitter: {url}"},"byosm":{"name":"OpenStreetMap Belarus","description":"OpenStreetMap Belarus telegram chat"},"talk-cz-mailinglist":{"name":"Talk-cz Mailing List","description":"Talk-cz is the official mailing list for Czech community"},"de-forum":{"name":"OpenStreetMap DE forum","description":"OpenStreetMap Germany web forum"},"de-irc":{"name":"OpenStreetMap Germany IRC","description":"Join #osm-de on irc.oftc.net (port 6667)"},"de-mailinglist":{"name":"Talk-de Mailing List","description":"Talk-de is the official mailing list for the German OSM community"},"osm-de":{"name":"OpenStreetMap Germany","description":"The platform for information on OpenStreetMap in Germany"},"OSM-ES-telegram":{"name":"@OSMes on Telegram","description":"OpenStreetMap Spain Telegram chat"},"OSM-Rome-meetup":{"name":"Incontro Mappatori Romani","description":"Improve OpenStreetMap in the Rome area","extendedDescription":"We aim to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Lazio."},"talk-it-lazio":{"name":"OpenStreetMap IT Lazio","description":"All are welcome! Sign up at {signupUrl}","extendedDescription":"Mailinglist for Rome and Lazio area."},"OSM-CA-Slack":{"name":"OSM-CA Slack","description":"All are welcome! Sign up at {signupUrl}."},"OSM-Vancouver-meetup":{"name":"OpenStreetMap Vancouver","description":"Mappers and OpenStreetMap users in the Vancouver, BC area"},"Bay-Area-OpenStreetMappers":{"name":"Bay Area OpenStreetMappers","description":"Improve OpenStreetMap in the Bay Area","extendedDescription":"This group is about growing the OpenStreetMap community here in the Bay Area. Our events are open to everyone, from open source enthusiasts, cyclists, GIS professionals, geocachers, and beyond. Anyone and everyone who is interested in maps, map making and free map data is welcome to join our group as well as attend our events."},"Central-Pennsylvania-OSM":{"name":"Central Pennsylvania OSM","description":"Online mapping community based out of State College, PA"},"Code-for-San-Jose-Slack":{"name":"Code for San Jose Slack","description":"All are welcome! Sign up at {signupUrl}, then join the #osm channel."},"Dallas-Fort-Worth-OSM":{"name":"Dallas-Fort Worth OSM","description":"The OpenStreetMap user group for Dallas-Fort Worth","extendedDescription":"Dallas, Fort Worth, and all the cities in between are abounding with creative and tech-savvy people. The vision for this usergroup is to find new ways to use the amazing resource of OSM."},"GeoPhilly":{"name":"GeoPhilly","description":"Meetup for map enthusiasts in the Philadelphia area","extendedDescription":"GeoPhilly unites developers, geographers, data geeks, open source enthusiasts, civic hackers and map addicts in our shared love of maps and the stories they tell. If you use maps as part of your work or just want to learn more, this is the meetup for you!  Our events aim to be open, friendly, educational and social and range from happy hours to lightning talks or even workshops. Come create a diverse, inspiring geospatial community in the Philadelphia with us!"},"MapMinnesota":{"name":"MapMinnesota","description":"Mappers and OpenStreetMap enthusiasts in the Twin Cities area","extendedDescription":"Connecting OpenStreetMap enthusiasts in Minnesota and the Twin Cities!"},"Mapping-DC-meetup":{"name":"Mapping DC","description":"Improve OpenStreetMap in the DC area","extendedDescription":"We are a group of volunteer mappers who aim to improve the OpenStreetMap in the DC area. We also aim to teach others about the OSM ecosystem, data analytics, cartography, and GIS. We gather every other month at meetups to focus on one area of our city."},"Maptime-ME-meetup":{"name":"MaptimeME","description":"Mappers and OpenStreetMap users, around Portland, ME","extendedDescription":"Maptime is, rather literally, time for mapmaking.  Our mission is to open the doors of cartographic possibility to anyone interested by creating a time and space for collaborative learning, exploration, and map creation using mapping tools and technologies."},"OpenCleveland-meetup":{"name":"Open Cleveland","description":"Improve OpenStreetMap in the Cleveland area","extendedDescription":"Open Geo Cleveland aims to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Northeast Ohio. We're also a maptime chapter =)"},"OSM-Boston":{"name":"OpenStreetMap Boston","description":"Mappers and OpenStreetMap users in the Boston area","extendedDescription":"OpenStreetMap is the free and open, wiki-style map of the world, with hundreds of thousands of contributions every day from people like you. Editing the map is simple, and fun! Join us both indoors and outdoors in our effort to create the best map of the Boston area and the rest of the world!"},"OSM-Central-Salish-Sea":{"name":"OpenStreetMap Central Salish Sea","description":"Mappers and OpenStreetMap users around Mount Vernon, WA","extendedDescription":"OpenStreetMap is an map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more. We meet all the time to talk maps, make maps and have fun!"},"OSM-Chattanooga":{"name":"OSM Chattanooga","description":"The OpenStreetMap user group for Chattanooga"},"OSM-Colorado":{"name":"OpenStreetMap Colorado","description":"Mappers and OpenStreetMap users in the state of Colorado, USA","extendedDescription":"OpenStreetMap (OSM) Colorado is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties."},"OSM-NYC":{"name":"OpenStreetMap NYC","description":"Mappers and OpenStreetMap users, developers and enthusiasts in the New York Metropolitan area"},"OSM-Portland":{"name":"OpenStreetMap Portland","description":"Mappers and OpenStreetMap users in the Portland area","extendedDescription":"OpenStreetMap (OSM) is a map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more, and come join us at a meetup to talk maps, contribute to OSM, and have fun!"},"OSM-Seattle":{"name":"OpenStreetMap Seattle","description":"Mappers and OpenStreetMap users in the Seattle area"},"OSM-SoCal":{"name":"OpenStreetMap Southern California","description":"Let's have some fun, contribute something to Los Angeles, and learn about mapping!","extendedDescription":"OpenStreetMap (OSM) Southern California is for anyone interested in mapping to get together to work with OpenStreetMap.  OpenStreetMap, the Wikipedia of maps, is a free open-source map of the world being created by more than 1,000,000 volunteers around the globe.  Everyone is welcome.  If you don't know OpenStreetMap, we'll teach you. If you have an idea for a mapping project or even a field trip that the group can do, great!"},"OSM-South-Bay":{"name":"OSM South Bay","description":"Map Nights hosted by Code for San Jose","extendedDescription":"Code for San Jose, the local Code for America brigade, hosts monthly Map Nights on Thursday nights in downtown San José. Meet fellow South Bay mappers, help out with local mapping projects, and hear about other civic tech projects. Programming and GIS skills are not required."},"OSM-Tampa-Bay":{"name":"OpenStreetMap Tampa Bay","description":"Mappers and OpenStreetMap users in the Tampa Bay area","extendedDescription":"OSM Tampa Bay group for local residents to get together and build out the definitive map of Tampa Bay with OpenStreetMap, the free and editable map of the world.  If you're into maps, data, open source, GPS, hiking, cycling, et cetera, you'll love working with OpenStreetMap -- so join in! We'll get together and map and talk about new topics once-a-month or so."},"OSM-US-Slack":{"name":"OpenStreetMap US Slack","description":"All are welcome! Sign up at {signupUrl}"},"OSM-US":{"name":"OpenStreetMap US","description":"We help grow and improve OpenStreetMap in the United States.","extendedDescription":"We support OpenStreetMap by holding annual conferences, providing community resources, building partnerships, and by spreading the word. Join OpenStreetMap US here: {signupUrl}"},"OSM-Utah":{"name":"OpenStreetMap Utah","description":"Mappers and OpenStreetMap users in the Salt Lake City area","extendedDescription":"Activities may include things like Learn To Map workshops, mapping parties and outdoor data collection. The events will take place in the SLC area, at least initially.  We are looking for seasoned mappers as well as people new to OSM. Join and let's do some mapping!"},"OSM-Wyoming":{"name":"OpenStreetMap Wyoming","description":"Mappers and OpenStreetMap users in the state of Wyoming","extendedDescription":"OpenStreetMap (OSM) Wyoming is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties."},"PHXGeo-meetup":{"name":"PHXGeo Meetup","description":"Mappers and OpenStreetMap users in the Phoenix, AZ area","extendedDescription":"This is a meetup group for those in the Phoenix area who like maps, GIS, OpenStreetMap, cartography and anything in between."},"PHXGeo-twitter":{"name":"PHXGeo Twitter","description":"Follow us on Twitter at {url}"},"Western-Slope-facebook":{"name":"Western Slope OSM Facebook","description":"Mappers and OpenStreetMap users around Grand Junction, CO"},"Western-Slope-meetup":{"name":"Western Slope OSM Meetup","description":"Mappers and OpenStreetMap users around Grand Junction, CO","extendedDescription":"The goal of this group is to introduce OpenStreetMap to the community, develop a community of mappers, create the most amazing geodata possible using whatever method we can and finally strategize in order to get this data out into our community. Imagine accurate trail signage! Imagine further development of bike paths! Imagine anything you want, that's the joy of OpenStreetMap!"},"Maptime-Australia-Slack":{"name":"Maptime Australia Slack","description":"Sign up at {signupUrl}"},"talk-au":{"name":"Talk-au Mailing List","description":"Place for Aussie mappers to chat"},"OSM-AR-facebook":{"name":"OpenStreetMap Argentina Facebook","description":"Join the OpenStreetMap Argentina community on Facebook","extendedDescription":"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-AR-forum":{"name":"OpenStreetMap Argentina web forum","description":"Join the OpenStreetMap Argentina web forum","extendedDescription":"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-AR-irc":{"name":"OpenStreetMap Argentina IRC","description":"Join #osm-ar on irc.oftc.net (port 6667)"},"OSM-AR-mailinglist":{"name":"Talk-ar Mailing List","description":"A mailing list to discuss OpenStreetMap in Argentina"},"OSM-AR-telegram":{"name":"OpenStreetMap Argentina Telegram","description":"Join the OpenStreetMap Argentina community on Telegram","extendedDescription":"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-AR-twitter":{"name":"OpenStreetMap Argentina Twitter","description":"Follow us on Twitter at {url}"},"Bahia-telegram":{"name":"OpenStreetMap Bahia Telegram Group","description":"Join the OpenStreetMap Bahia community on Telegram","extendedDescription":"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-br-mailinglist":{"name":"Talk-br Mailing List","description":"A mailing list to discuss OpenStreetMap in Brazil"},"OSM-br-telegram":{"name":"OpenStreetMap Brasil Telegram","description":"Join the OpenStreetMap Brasil community on Telegram","extendedDescription":"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-br-twitter":{"name":"OpenStreetMap Brasil Twitter","description":"Follow us on Twitter at {url}"},"OSM-CL-facebook":{"name":"OpenStreetMap Chile Facebook","description":"Join the OpenStreetMap Chile community on Facebook","extendedDescription":"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-CL-mailinglist":{"name":"Talk-cl Mailing List","description":"A mailing list to discuss OpenStreetMap in Chile"},"OSM-CL-telegram":{"name":"OpenStreetMap Chile Telegram","description":"Join the OpenStreetMap Chile community on Telegram","extendedDescription":"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-CL-twitter":{"name":"OpenStreetMap Chile Twitter","description":"Follow us on Twitter at {url}"},"OSM-Reddit":{"name":"OpenStreetMap on Reddit","description":"/r/openstreetmap/ is a great place to learn more about OpenStreetMap.  Ask us anything!"}}};
23643
23644   var features$2 = {"madagascar":{"type":"Feature","id":"madagascar","properties":{},"geometry":{"type":"Polygon","coordinates":[[[51,-15],[47.5,-26],[42,-26],[43.5,-16],[49.5,-11],[51,-15]]]}},"BGD":{"type":"Feature","id":"BGD","properties":{"name":"Bangladesh"},"geometry":{"type":"Polygon","coordinates":[[[92.67272,22.04124],[92.65226,21.32405],[92.30323,21.47548],[92.36855,20.67088],[92.08289,21.1922],[92.02522,21.70157],[91.83489,22.18294],[91.41709,22.76502],[90.49601,22.80502],[90.58696,22.39279],[90.27297,21.83637],[89.84747,22.03915],[89.70205,21.85712],[89.41886,21.96618],[89.03196,22.05571],[88.87631,22.87915],[88.52977,23.63114],[88.69994,24.23372],[88.08442,24.50166],[88.30637,24.86608],[88.93155,25.23869],[88.20979,25.76807],[88.56305,26.44653],[89.35509,26.01441],[89.83248,25.96508],[89.92069,25.26975],[90.87221,25.1326],[91.7996,25.14743],[92.3762,24.97669],[91.91509,24.13041],[91.46773,24.07264],[91.15896,23.50353],[91.70647,22.98526],[91.86993,23.62435],[92.14603,23.6275],[92.67272,22.04124]]]}},"india_full":{"type":"Feature","id":"india_full","properties":{"name":"India"},"geometry":{"type":"MultiPolygon","coordinates":[[[[77.83745,35.49401],[78.91227,34.32194],[78.81109,33.5062],[79.20889,32.99439],[79.17613,32.48378],[78.45845,32.61816],[78.73889,31.51591],[79.72137,30.88272],[81.11126,30.18348],[80.47672,29.72987],[80.08843,28.79447],[81.0572,28.41609],[81.99999,27.92548],[83.30425,27.36451],[84.67502,27.2349],[85.25178,26.7262],[86.02439,26.63098],[87.22747,26.3979],[88.06024,26.41462],[88.1748,26.8104],[88.04313,27.44582],[88.12044,27.87654],[88.73033,28.08686],[88.81425,27.29932],[88.83564,27.09897],[89.74453,26.7194],[90.37328,26.87572],[91.21751,26.80865],[92.03348,26.83831],[92.10371,27.45261],[91.69666,27.77174],[92.50312,27.89688],[93.41335,28.64063],[94.56599,29.27744],[95.4048,29.03172],[96.11768,29.4528],[96.58659,28.83098],[96.24883,28.41103],[97.32711,28.26158],[97.40256,27.88254],[97.05199,27.69906],[97.134,27.08377],[96.41937,27.26459],[95.12477,26.57357],[95.15515,26.00131],[94.60325,25.16249],[94.55266,24.67524],[94.10674,23.85074],[93.32519,24.07856],[93.28633,23.04366],[93.06029,22.70311],[93.16613,22.27846],[92.67272,22.04124],[92.14603,23.6275],[91.86993,23.62435],[91.70647,22.98526],[91.15896,23.50353],[91.46773,24.07264],[91.91509,24.13041],[92.3762,24.97669],[91.7996,25.14743],[90.87221,25.1326],[89.92069,25.26975],[89.83248,25.96508],[89.35509,26.01441],[88.56305,26.44653],[88.20979,25.76807],[88.93155,25.23869],[88.30637,24.86608],[88.08442,24.50166],[88.69994,24.23372],[88.52977,23.63114],[88.87631,22.87915],[89.03196,22.05571],[88.88877,21.69059],[88.2085,21.70317],[86.9757,21.49556],[87.03317,20.74331],[86.49935,20.15164],[85.06027,19.47858],[83.94101,18.30201],[83.18922,17.67122],[82.19279,17.01664],[82.19124,16.55666],[81.69272,16.31022],[80.792,15.95197],[80.3249,15.89918],[80.02507,15.13641],[80.23327,13.83577],[80.28629,13.00626],[79.86255,12.05621],[79.858,10.35727],[79.34051,10.30885],[78.88535,9.54614],[79.18972,9.21654],[78.27794,8.93305],[77.94116,8.25296],[77.5399,7.96554],[76.59298,8.89928],[76.13006,10.29963],[75.74647,11.30825],[75.3961,11.78125],[74.86482,12.74194],[74.61672,13.99258],[74.44386,14.61722],[73.5342,15.99065],[73.11991,17.92857],[72.82091,19.20823],[72.82448,20.4195],[72.63053,21.35601],[71.17527,20.75744],[70.47046,20.87733],[69.16413,22.0893],[69.64493,22.45078],[69.3496,22.84318],[68.17664,23.69196],[68.8426,24.35913],[71.04324,24.35652],[70.8447,25.2151],[70.28287,25.72223],[70.16893,26.49187],[69.51439,26.94097],[70.6165,27.9892],[71.77767,27.91318],[72.82375,28.96159],[73.45064,29.97641],[74.42138,30.97981],[74.40593,31.69264],[75.25864,32.2711],[74.45156,32.7649],[74.10429,33.44147],[73.74995,34.3177],[74.2402,34.74889],[75.75706,34.50492],[76.87172,34.65354],[77.83745,35.49401]]]]}},"IDN":{"type":"Feature","id":"IDN","properties":{"name":"Indonesia"},"geometry":{"type":"MultiPolygon","coordinates":[[[[120.71561,-10.23958],[120.29501,-10.25865],[118.96781,-9.55797],[119.90031,-9.36134],[120.42576,-9.66592],[120.7755,-9.96968],[120.71561,-10.23958]]],[[[124.43595,-10.14],[123.57998,-10.35999],[123.45999,-10.24],[123.55001,-9.90002],[123.98001,-9.29003],[124.96868,-8.89279],[125.07002,-9.08999],[125.08852,-9.39317],[124.43595,-10.14]]],[[[117.90002,-8.09568],[118.26062,-8.36238],[118.87846,-8.28068],[119.12651,-8.70583],[117.9704,-8.90664],[117.27773,-9.0409],[116.74014,-9.03294],[117.08374,-8.45716],[117.63202,-8.4493],[117.90002,-8.09568]]],[[[122.90354,-8.09423],[122.75698,-8.64981],[121.25449,-8.93367],[119.92439,-8.81042],[119.92093,-8.44486],[120.71509,-8.23696],[121.34167,-8.53674],[122.00736,-8.46062],[122.90354,-8.09423]]],[[[108.62348,-6.77767],[110.53923,-6.87736],[110.75958,-6.46519],[112.61481,-6.94604],[112.97877,-7.59421],[114.47894,-7.77653],[115.70553,-8.37081],[114.56451,-8.75182],[113.46473,-8.34895],[112.55967,-8.37618],[111.52206,-8.30213],[110.58615,-8.12261],[109.42767,-7.74066],[108.69366,-7.6416],[108.27776,-7.76666],[106.4541,-7.3549],[106.28062,-6.9249],[105.36549,-6.85142],[106.05165,-5.89592],[107.26501,-5.95498],[108.07209,-6.34576],[108.48685,-6.42199],[108.62348,-6.77767]]],[[[134.72462,-6.2144],[134.21013,-6.89524],[134.11278,-6.14247],[134.29034,-5.78306],[134.49963,-5.44504],[134.727,-5.73758],[134.72462,-6.2144]]],[[[127.24922,-3.45906],[126.87492,-3.79098],[126.1838,-3.60738],[125.98903,-3.17727],[127.00065,-3.12932],[127.24922,-3.45906]]],[[[130.47134,-3.09376],[130.83484,-3.85847],[129.99055,-3.4463],[129.15525,-3.36264],[128.59068,-3.42868],[127.89889,-3.39344],[128.13588,-2.84365],[129.371,-2.80215],[130.47134,-3.09376]]],[[[134.14337,-1.15187],[134.42263,-2.76918],[135.4576,-3.36775],[136.29331,-2.30704],[137.44074,-1.70351],[138.32973,-1.70269],[139.18492,-2.0513],[139.92668,-2.40905],[141.00021,-2.60015],[141.01706,-5.85902],[141.03385,-9.11789],[140.14342,-8.29717],[139.12777,-8.09604],[138.88148,-8.38093],[137.61447,-8.41168],[138.0391,-7.59788],[138.66862,-7.32022],[138.40791,-6.23285],[137.92784,-5.39337],[135.98925,-4.54654],[135.1646,-4.46293],[133.66288,-3.53885],[133.36771,-4.02482],[132.98396,-4.11298],[132.75694,-3.74628],[132.75379,-3.31179],[131.9898,-2.82055],[133.06685,-2.46042],[133.78003,-2.47985],[133.69621,-2.21454],[132.23237,-2.21253],[131.83622,-1.61716],[130.94284,-1.43252],[130.51956,-0.93772],[131.86754,-0.69546],[132.38012,-0.36954],[133.98555,-0.78021],[134.14337,-1.15187]]],[[[125.2405,1.41984],[124.43703,0.42788],[123.68551,0.23559],[122.72308,0.43114],[121.05673,0.38122],[120.18308,0.23725],[120.04087,-0.51966],[120.93591,-1.40891],[121.47582,-0.95596],[123.34056,-0.61567],[123.2584,-1.07621],[122.82272,-0.93095],[122.38853,-1.51686],[121.50827,-1.90448],[122.45457,-3.18606],[122.2719,-3.5295],[123.17096,-4.68369],[123.16233,-5.3406],[122.62851,-5.63459],[122.23639,-5.28293],[122.71957,-4.46417],[121.73823,-4.85133],[121.48946,-4.57455],[121.61917,-4.18848],[120.89818,-3.6021],[120.97239,-2.62764],[120.30545,-2.9316],[120.39005,-4.09758],[120.43072,-5.52824],[119.79654,-5.6734],[119.36691,-5.37988],[119.65361,-4.45942],[119.49883,-3.49441],[119.07834,-3.48702],[118.76777,-2.802],[119.18097,-2.1471],[119.32339,-1.35315],[119.826,0.15425],[120.0357,0.56648],[120.88578,1.30922],[121.66682,1.01394],[122.92757,0.87519],[124.07752,0.9171],[125.06599,1.64326],[125.2405,1.41984]]],[[[128.68825,1.13239],[128.63595,0.25849],[128.12017,0.35641],[127.96803,-0.25208],[128.38,-0.78],[128.10002,-0.9],[127.69648,-0.2666],[127.39949,1.01172],[127.60051,1.81069],[127.93238,2.1746],[128.00416,1.62853],[128.59456,1.54081],[128.68825,1.13239]]],[[[117.87563,1.82764],[118.99675,0.90222],[117.81186,0.78424],[117.47834,0.10247],[117.52164,-0.80372],[116.56005,-1.48766],[116.5338,-2.48352],[116.14808,-4.01273],[116.00086,-3.65704],[114.8648,-4.10698],[114.46865,-3.4957],[113.75567,-3.43917],[113.25699,-3.11878],[112.06813,-3.47839],[111.70329,-2.99444],[111.04824,-3.04943],[110.22385,-2.93403],[110.07094,-1.59287],[109.57195,-1.31491],[109.09187,-0.45951],[108.95266,0.41537],[109.06914,1.34193],[109.66326,2.00647],[109.83023,1.33814],[110.51406,0.77313],[111.15914,0.97648],[111.79755,0.90444],[112.38025,1.41012],[112.85981,1.49779],[113.80585,1.21755],[114.62135,1.43069],[115.13404,2.82148],[115.51908,3.16924],[115.86552,4.30656],[117.01521,4.30609],[117.88204,4.13755],[117.31323,3.23443],[118.04833,2.28769],[117.87563,1.82764]]],[[[105.81766,-5.85236],[104.71038,-5.87329],[103.86821,-5.03732],[102.58426,-4.22026],[102.15617,-3.61415],[101.39911,-2.79978],[100.9025,-2.05026],[100.14198,-0.65035],[99.26374,0.18314],[98.97001,1.04288],[98.60135,1.82351],[97.6996,2.45318],[97.17694,3.30879],[96.42402,3.86886],[95.38088,4.97078],[95.29303,5.47982],[95.93686,5.43951],[97.48488,5.24632],[98.36917,4.26837],[99.14256,3.59035],[99.694,3.17433],[100.64143,2.09938],[101.65801,2.0837],[102.49827,1.3987],[103.07684,0.56136],[103.8384,0.10454],[103.43765,-0.71195],[104.01079,-1.05921],[104.36999,-1.08484],[104.53949,-1.78237],[104.88789,-2.34043],[105.62211,-2.42884],[106.10859,-3.06178],[105.85745,-4.30553],[105.81766,-5.85236]]]]}},"japan":{"type":"Feature","id":"japan","properties":{},"geometry":{"type":"Polygon","coordinates":[[[141.11938,45.69083],[142.28497,45.56863],[145.39307,44.48867],[145.57983,44.11125],[145.27222,43.79291],[145.47821,43.46289],[145.68695,43.4589],[145.91217,43.39108],[145.44903,42.69934],[143.91094,41.8376],[142.48272,39.3181],[142.1751,38.15265],[141.38409,35.69383],[140.94463,35.21056],[140.55908,32.1198],[139.38457,31.87843],[138.98907,33.1752],[138.01025,34.29807],[135.99976,33.17434],[133.53882,32.71336],[132.48516,32.06483],[131.56128,31.04352],[131.03497,29.53613],[129.94629,27.50827],[127.78301,25.4442],[126.47461,25.42343],[125.86487,24.52713],[124.92657,23.88678],[123.37921,23.82053],[122.67883,24.31456],[122.7293,24.64795],[124.67834,25.02588],[125.36602,25.52354],[126.24493,26.35342],[127.56329,27.13828],[128.57403,28.73003],[128.74981,31.46703],[128.36426,32.62087],[128.92559,33.76174],[129.21021,34.62417],[129.56177,34.84086],[136.69739,37.9312],[139.1209,38.85762],[139.04297,42.04929],[140.13165,43.58114],[140.5711,45.64549],[141.11938,45.69083]]]}},"MNG":{"type":"Feature","id":"MNG","properties":{"name":"Mongolia"},"geometry":{"type":"Polygon","coordinates":[[[87.75126,49.2972],[88.80557,49.47052],[90.71367,50.33181],[92.23471,50.80217],[93.10422,50.49529],[94.14757,50.48054],[94.81595,50.01343],[95.81403,49.97747],[97.25973,49.72606],[98.23176,50.4224],[97.82574,51.011],[98.86149,52.04737],[99.98173,51.63401],[100.88948,51.51686],[102.06522,51.25992],[102.25591,50.51056],[103.67655,50.08997],[104.62155,50.27533],[105.88659,50.40602],[106.8888,50.2743],[107.86818,49.79371],[108.47517,49.28255],[109.40245,49.29296],[110.66201,49.13013],[111.58123,49.37797],[112.89774,49.54357],[114.36246,50.2483],[114.96211,50.14025],[115.4857,49.80518],[116.6788,49.88853],[116.1918,49.1346],[115.48528,48.13538],[115.74284,47.72655],[116.30895,47.85341],[117.29551,47.69771],[118.06414,48.06673],[118.86657,47.74706],[119.77282,47.04806],[119.66327,46.69268],[118.87433,46.80541],[117.4217,46.67273],[116.71787,46.3882],[115.9851,45.72724],[114.46033,45.33982],[113.46391,44.80889],[112.43606,45.01165],[111.87331,45.10208],[111.34838,44.45744],[111.66774,44.07318],[111.82959,43.74312],[111.12968,43.40683],[110.4121,42.87123],[109.2436,42.51945],[107.74477,42.48152],[106.12932,42.13433],[104.96499,41.59741],[104.52228,41.90835],[103.31228,41.90747],[101.83304,42.51487],[100.84587,42.6638],[99.51582,42.52469],[97.45176,42.74889],[96.3494,42.72563],[95.76246,43.31945],[95.30688,44.24133],[94.68893,44.35233],[93.48073,44.97547],[92.13389,45.11508],[90.94554,45.28607],[90.58577,45.71972],[90.97081,46.88815],[90.28083,47.69355],[88.8543,48.06908],[88.01383,48.59946],[87.75126,49.2972]]]}},"NPL":{"type":"Feature","id":"NPL","properties":{"name":"Nepal"},"geometry":{"type":"Polygon","coordinates":[[[88.12044,27.87654],[88.04313,27.44582],[88.1748,26.8104],[88.06024,26.41462],[87.22747,26.3979],[86.02439,26.63098],[85.25178,26.7262],[84.67502,27.2349],[83.30425,27.36451],[81.99999,27.92548],[81.0572,28.41609],[80.08843,28.79447],[80.47672,29.72987],[81.11126,30.18348],[81.5258,30.42272],[82.32751,30.11527],[83.33711,29.46373],[83.89899,29.32023],[84.23458,28.83989],[85.01164,28.64277],[85.82332,28.20358],[86.95452,27.97426],[88.12044,27.87654]]]}},"philippines":{"type":"Feature","id":"philippines","properties":{},"geometry":{"type":"Polygon","coordinates":[[[114.93896,8.23324],[122.01416,21.71868],[127.6062,7.39515],[125.50781,5.14566],[118.89954,4.41761],[119.49829,5.28789],[117.53174,7.39515],[114.93896,8.23324]]]}},"russia":{"type":"Feature","id":"russia","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[22.7311,54.32754],[20.89224,54.31253],[19.66064,54.42608],[19.88848,54.86616],[21.26845,55.19048],[22.31572,55.0153],[22.75776,54.85657],[22.65105,54.58274],[22.7311,54.32754]]],[[[-180,83],[-169,66.5],[-171,64],[-180,64],[-180,83]]],[[[180,83],[180,64.97971],[179.99281,64.97433],[178.7072,64.53493],[177.41128,64.60821],[178.313,64.07593],[178.90825,63.25197],[179.37034,62.98262],[179.48636,62.56894],[179.22825,62.3041],[177.3643,62.5219],[174.56929,61.76915],[173.68013,61.65261],[172.15,60.95],[170.6985,60.33618],[170.33085,59.88177],[168.90046,60.57355],[166.29498,59.78855],[165.84,60.16],[164.87674,59.7316],[163.53929,59.86871],[163.21711,59.21101],[162.01733,58.24328],[162.05297,57.83912],[163.19191,57.61503],[163.05794,56.15924],[162.12958,56.12219],[161.70146,55.28568],[162.11749,54.85514],[160.36877,54.34433],[160.02173,53.20257],[158.53094,52.95868],[158.23118,51.94269],[156.78979,51.01105],[156.42,51.7],[155.99182,53.15895],[155.43366,55.38103],[155.91442,56.76792],[156.75815,57.3647],[156.81035,57.83204],[158.36433,58.05575],[160.15064,59.31477],[161.87204,60.343],[163.66969,61.1409],[164.47355,62.55061],[163.25842,62.46627],[162.65791,61.6425],[160.12148,60.54423],[159.30232,61.77396],[156.72068,61.43442],[154.21806,59.75818],[155.04375,59.14495],[152.81185,58.88385],[151.26573,58.78089],[151.33815,59.50396],[149.78371,59.65573],[148.54481,59.16448],[145.48722,59.33637],[142.19782,59.03998],[138.95848,57.08805],[135.12619,54.72959],[136.70171,54.60355],[137.19342,53.97732],[138.1647,53.75501],[138.80463,54.25455],[139.90151,54.18968],[141.34531,53.08957],[141.37923,52.23877],[140.59742,51.23967],[140.51308,50.04553],[140.06193,48.44671],[138.55472,46.99965],[138.21971,46.30795],[136.86232,45.1435],[135.51535,43.989],[134.86939,43.39821],[133.53687,42.81147],[132.90627,42.79849],[132.27807,43.28456],[130.93587,42.55274],[130.78,42.22],[130.64,42.395],[130.63387,42.90302],[131.14469,42.92999],[131.28856,44.11152],[131.02519,44.96796],[131.88345,45.32116],[133.09712,45.14409],[133.76964,46.11693],[134.11235,47.21248],[134.50081,47.57845],[135.02631,48.47823],[133.3736,48.18344],[132.50669,47.78896],[130.98726,47.79013],[130.58229,48.72969],[129.39782,49.4406],[127.6574,49.76027],[127.28746,50.7398],[126.93916,51.35389],[126.5644,51.78426],[125.94635,52.7928],[125.06821,53.16105],[123.57147,53.4588],[122.24575,53.43173],[121.00308,53.2514],[120.17709,52.75389],[120.72579,52.51623],[120.7382,51.96411],[120.18208,51.64355],[119.27939,50.58292],[119.28846,50.14288],[117.87924,49.51098],[116.6788,49.88853],[115.4857,49.80518],[114.96211,50.14025],[114.36246,50.2483],[112.89774,49.54357],[111.58123,49.37797],[110.66201,49.13013],[109.40245,49.29296],[108.47517,49.28255],[107.86818,49.79371],[106.8888,50.2743],[105.88659,50.40602],[104.62158,50.27532],[103.67655,50.08997],[102.25589,50.51056],[102.06521,51.25991],[100.88948,51.51686],[99.98173,51.63401],[98.86149,52.04737],[97.82574,51.011],[98.23176,50.4224],[97.25976,49.72605],[95.81402,49.97746],[94.81595,50.01343],[94.14757,50.48054],[93.10421,50.49529],[92.23471,50.80217],[90.71367,50.33181],[88.80557,49.47052],[87.75126,49.2972],[87.35997,49.21498],[86.82936,49.82668],[85.54127,49.69286],[85.11556,50.1173],[84.41638,50.3114],[83.93511,50.88925],[83.383,51.06918],[81.94599,50.8122],[80.56845,51.38834],[80.03556,50.86475],[77.80092,53.40442],[76.52518,54.177],[76.8911,54.49052],[74.38482,53.54685],[73.42568,53.48981],[73.50852,54.03562],[72.22415,54.37665],[71.18013,54.13329],[70.86527,55.16973],[69.06817,55.38525],[68.1691,54.97039],[65.66687,54.60125],[65.17853,54.35423],[61.4366,54.00625],[60.97807,53.66499],[61.69999,52.98],[60.73999,52.71999],[60.92727,52.44755],[59.96753,51.96042],[61.588,51.27266],[61.33742,50.79907],[59.93281,50.84219],[59.64228,50.54544],[58.36332,51.06364],[56.77798,51.04355],[55.71694,50.62171],[54.53288,51.02624],[52.32872,51.71865],[50.76665,51.69276],[48.70238,50.60513],[48.57784,49.87476],[47.54948,50.4547],[46.7516,49.35601],[47.04367,49.15204],[46.46645,48.39415],[47.31524,47.71585],[48.05725,47.74377],[48.69473,47.07563],[48.59325,46.56104],[49.10116,46.39933],[48.64541,45.80629],[47.67591,45.64149],[46.68201,44.6092],[47.59094,43.66016],[47.49252,42.98658],[48.58437,41.80888],[47.98728,41.40582],[47.81567,41.15142],[47.37331,41.21973],[46.68607,41.82714],[46.40495,41.86068],[45.7764,42.09244],[45.47028,42.50278],[44.53762,42.71199],[43.93121,42.55496],[43.75599,42.74083],[42.3944,43.2203],[40.92219,43.38215],[40.07697,43.5531],[39.95501,43.435],[38.68,44.28],[37.53912,44.65721],[36.67546,45.24469],[37.40317,45.40451],[38.23295,46.24087],[37.67372,46.63657],[39.14767,47.04475],[39.1212,47.26336],[38.22354,47.10219],[38.25511,47.5464],[38.77057,47.82562],[39.73828,47.89894],[39.89562,48.23241],[39.67465,48.78382],[40.08079,49.30743],[40.06904,49.60105],[38.59499,49.92646],[38.01063,49.91566],[37.39346,50.38395],[36.62617,50.22559],[35.35612,50.5772],[35.37791,50.77394],[35.02218,51.20757],[34.22482,51.25599],[34.14198,51.56641],[34.39173,51.76888],[33.7527,52.33508],[32.71576,52.23846],[32.41206,52.28869],[32.15944,52.06125],[31.78597,52.10168],[31.54002,52.74205],[31.3052,53.074],[31.49764,53.16743],[32.30452,53.13273],[32.69364,53.35142],[32.4056,53.61805],[31.73127,53.79403],[31.79142,53.97464],[31.38447,54.15706],[30.75753,54.81177],[30.97184,55.08155],[30.87391,55.55098],[29.89629,55.78946],[29.37157,55.67009],[29.22951,55.91834],[28.17671,56.16913],[27.85528,56.75933],[27.77002,57.24426],[27.28818,57.47453],[27.71669,57.7919],[27.42015,58.72457],[28.1317,59.30083],[27.98112,59.47537],[29.1177,60.02805],[28.07,60.50352],[30.21111,61.78003],[31.13999,62.35769],[31.51609,62.86769],[30.03587,63.55281],[30.44468,64.20445],[29.54443,64.94867],[30.21765,65.80598],[29.05459,66.94429],[29.97743,67.6983],[28.44594,68.36461],[28.59193,69.06478],[35,71],[40,83],[180,83]]]]}},"LKA":{"type":"Feature","id":"LKA","properties":{"name":"Sri Lanka"},"geometry":{"type":"Polygon","coordinates":[[[81.78796,7.52306],[81.63732,6.48177],[81.21802,6.19714],[80.34836,5.96837],[79.87247,6.76346],[79.69517,8.20084],[80.1478,9.82408],[80.83882,9.26843],[81.30432,8.56421],[81.78796,7.52306]]]}},"taiwan":{"type":"Feature","id":"taiwan","properties":{},"geometry":{"type":"Polygon","coordinates":[[[119,23.5],[121.7,26],[122.5,25.5],[121.8,21.8],[120,21.5],[119,23.5]]]}},"austria":{"type":"Feature","id":"austria","properties":{},"geometry":{"type":"Polygon","coordinates":[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]]}},"belgium":{"type":"Feature","id":"belgium","properties":{},"geometry":{"type":"Polygon","coordinates":[[[3.08167,51.55146],[3.30963,51.43346],[3.36834,51.36996],[3.37761,51.35956],[3.37589,51.34841],[3.38482,51.34337],[3.38722,51.33887],[3.38688,51.33286],[3.36096,51.31527],[3.3819,51.30207],[3.37641,51.29928],[3.36782,51.29681],[3.38293,51.28726],[3.38327,51.2806],[3.37915,51.27824],[3.38121,51.27598],[3.39031,51.27416],[3.39598,51.26686],[3.40439,51.26449],[3.40937,51.25923],[3.41795,51.26127],[3.42138,51.25848],[3.4267,51.25482],[3.42894,51.24709],[3.44679,51.24279],[3.52592,51.24677],[3.51425,51.2878],[3.52927,51.28935],[3.53434,51.28474],[3.53811,51.28479],[3.54266,51.29177],[3.55717,51.29187],[3.5588,51.2959],[3.56163,51.29644],[3.56489,51.29569],[3.5727,51.29225],[3.57253,51.29107],[3.57571,51.28946],[3.57905,51.28951],[3.58206,51.28876],[3.58214,51.29247],[3.58618,51.29316],[3.58026,51.29869],[3.58987,51.30663],[3.62626,51.29413],[3.64145,51.28914],[3.64411,51.29069],[3.6581,51.29096],[3.6781,51.28345],[3.67905,51.28168],[3.69063,51.28173],[3.69424,51.27668],[3.71801,51.27217],[3.71827,51.27368],[3.72273,51.274],[3.75054,51.27061],[3.75286,51.27104],[3.75681,51.26986],[3.76342,51.26261],[3.76848,51.26106],[3.77123,51.26218],[3.77355,51.2646],[3.79698,51.25665],[3.79071,51.24553],[3.79063,51.21608],[3.80453,51.2143],[3.80796,51.21398],[3.82479,51.21086],[3.8356,51.21516],[3.85225,51.21484],[3.85895,51.21291],[3.89002,51.22473],[3.89568,51.21968],[3.89482,51.2143],[3.88298,51.20764],[3.88762,51.20301],[3.89345,51.20527],[3.89929,51.20398],[3.91542,51.20989],[3.91388,51.21764],[3.92349,51.21989],[3.93105,51.22194],[3.9374,51.21398],[3.94323,51.21721],[3.95748,51.21764],[3.96023,51.22527],[3.97654,51.22667],[3.9846,51.2357],[3.99473,51.23914],[4.00469,51.24311],[4.01636,51.24623],[4.03851,51.24687],[4.04125,51.24397],[4.05842,51.24505],[4.06082,51.24773],[4.16365,51.29391],[4.23815,51.35345],[4.22373,51.35881],[4.21686,51.36878],[4.21635,51.37435],[4.33685,51.37842],[4.34235,51.35988],[4.35093,51.35967],[4.36861,51.35795],[4.38543,51.35592],[4.39505,51.35753],[4.42114,51.36707],[4.42818,51.36642],[4.42337,51.37242],[4.42904,51.37521],[4.38852,51.40702],[4.38097,51.42137],[4.38904,51.42597],[4.39093,51.43304],[4.3935,51.43486],[4.39161,51.44416],[4.37891,51.44502],[4.37719,51.44716],[4.38131,51.45165],[4.38509,51.4508],[4.44157,51.47005],[4.46354,51.4723],[4.47487,51.47978],[4.48654,51.4786],[4.53856,51.48416],[4.55074,51.47283],[4.53238,51.44877],[4.53701,51.42522],[4.57512,51.43411],[4.63469,51.42651],[4.64087,51.42372],[4.65048,51.42747],[4.6673,51.42779],[4.66473,51.44556],[4.69236,51.45326],[4.70146,51.46845],[4.71416,51.47026],[4.71519,51.47304],[4.72781,51.48486],[4.74524,51.48988],[4.74721,51.49368],[4.74781,51.49651],[4.75047,51.49945],[4.75648,51.50196],[4.77253,51.50682],[4.79485,51.5034],[4.82025,51.49784],[4.82643,51.48609],[4.84737,51.48352],[4.84291,51.46449],[4.84909,51.46085],[4.84463,51.4478],[4.83089,51.44438],[4.83742,51.42683],[4.8563,51.41805],[4.88171,51.43325],[4.91741,51.4127],[4.93389,51.42083],[4.90162,51.44053],[4.9387,51.46192],[4.97646,51.44545],[5.02419,51.48523],[5.03225,51.48919],[5.04187,51.4878],[5.04135,51.48053],[5.04856,51.47433],[5.08032,51.47475],[5.10658,51.43047],[5.07294,51.39358],[5.11765,51.36149],[5.12074,51.35592],[5.13268,51.3475],[5.13525,51.31608],[5.1622,51.31135],[5.17241,51.31688],[5.19001,51.32069],[5.19585,51.32123],[5.19988,51.32348],[5.24331,51.30594],[5.2276,51.26841],[5.23842,51.26208],[5.26357,51.26782],[5.29584,51.26267],[5.31567,51.26449],[5.33755,51.26428],[5.34107,51.26686],[5.34399,51.27309],[5.34554,51.27668],[5.4172,51.2632],[5.43222,51.27706],[5.43806,51.27695],[5.44132,51.2827],[5.46398,51.28549],[5.47608,51.29209],[5.47608,51.29536],[5.48226,51.29923],[5.48201,51.301],[5.51625,51.29612],[5.52011,51.28957],[5.54363,51.27298],[5.55711,51.26718],[5.55874,51.2631],[5.55745,51.25316],[5.55651,51.24472],[5.56131,51.22301],[5.63667,51.20355],[5.65401,51.19812],[5.65513,51.1936],[5.65212,51.1929],[5.65753,51.1865],[5.66834,51.18671],[5.67624,51.18548],[5.67761,51.18435],[5.6856,51.18542],[5.68946,51.18623],[5.69815,51.1842],[5.70201,51.18397],[5.70165,51.18275],[5.70645,51.18248],[5.70815,51.18223],[5.70987,51.1812],[5.71431,51.1839],[5.7177,51.18475],[5.72948,51.18601],[5.73031,51.18553],[5.73274,51.18564],[5.73274,51.18615],[5.7345,51.18657],[5.73993,51.18757],[5.74576,51.19032],[5.75769,51.18618],[5.75821,51.1851],[5.76731,51.18413],[5.77821,51.1787],[5.77477,51.17337],[5.7801,51.17289],[5.78078,51.17208],[5.77992,51.17052],[5.77673,51.1702],[5.77585,51.17028],[5.77321,51.16967],[5.77274,51.16925],[5.77192,51.16924],[5.77093,51.1698],[5.76993,51.16905],[5.77059,51.16458],[5.77383,51.16453],[5.77385,51.16558],[5.77638,51.16565],[5.77701,51.16306],[5.7775,51.16298],[5.77808,51.16353],[5.77975,51.16356],[5.78025,51.15935],[5.77797,51.15803],[5.77677,51.15554],[5.77829,51.15502],[5.77907,51.15319],[5.78456,51.15421],[5.79005,51.15798],[5.79512,51.15798],[5.80095,51.15954],[5.80027,51.16094],[5.80361,51.1632],[5.80619,51.16352],[5.8134,51.16051],[5.8146,51.16325],[5.82473,51.16874],[5.83434,51.16314],[5.83589,51.15905],[5.84078,51.15819],[5.84129,51.15523],[5.8564,51.15071],[5.86258,51.14446],[5.85674,51.14037],[5.85159,51.13671],[5.84816,51.12938],[5.83374,51.12744],[5.82241,51.12249],[5.81211,51.11387],[5.82275,51.11171],[5.84026,51.10611],[5.83683,51.0936],[5.82584,51.08929],[5.80559,51.09102],[5.81142,51.07851],[5.80421,51.07031],[5.80868,51.06233],[5.797,51.05564],[5.77709,51.05693],[5.76576,51.03384],[5.78568,51.02412],[5.77263,51.01354],[5.77332,51.00555],[5.76885,50.99345],[5.7589,50.98912],[5.74654,50.97767],[5.72765,50.9647],[5.72834,50.95843],[5.73761,50.96145],[5.75306,50.96232],[5.76851,50.9541],[5.7589,50.94567],[5.73521,50.92446],[5.73177,50.91061],[5.7177,50.90563],[5.70362,50.9078],[5.70122,50.89545],[5.68954,50.88224],[5.68096,50.87726],[5.67169,50.87574],[5.65453,50.87054],[5.64766,50.86274],[5.64766,50.84757],[5.65453,50.83435],[5.66448,50.82437],[5.6971,50.81353],[5.71838,50.80333],[5.72113,50.77642],[5.78018,50.79639],[5.82962,50.77294],[5.9079,50.77381],[6.00403,50.76947],[6.04248,50.76252],[6.05621,50.75123],[6.129,50.73385],[6.16745,50.69037],[6.21689,50.66252],[6.2471,50.65991],[6.28143,50.64424],[6.28693,50.62333],[6.27045,50.59631],[6.24847,50.58542],[6.24058,50.56078],[6.22719,50.5538],[6.21586,50.54965],[6.20419,50.53591],[6.21552,50.52063],[6.22993,50.50295],[6.23989,50.50513],[6.2598,50.50338],[6.27766,50.50731],[6.29139,50.50076],[6.3089,50.50513],[6.3216,50.49923],[6.35078,50.49377],[6.35765,50.48722],[6.34838,50.47936],[6.35147,50.46188],[6.37756,50.45925],[6.38065,50.44657],[6.37619,50.40786],[6.36383,50.39561],[6.35387,50.38028],[6.36246,50.37634],[6.41155,50.34415],[6.41499,50.33363],[6.40675,50.31982],[6.38718,50.31763],[6.36829,50.3025],[6.35765,50.30338],[6.33018,50.31565],[6.31645,50.31478],[6.30444,50.30601],[6.29585,50.29044],[6.29414,50.27354],[6.27628,50.26411],[6.22856,50.25511],[6.21483,50.25094],[6.20659,50.24062],[6.19869,50.23403],[6.17947,50.23139],[6.18221,50.22678],[6.17672,50.22151],[6.19251,50.21206],[6.19801,50.18437],[6.19217,50.17646],[6.15166,50.16656],[6.15509,50.15491],[6.16058,50.14633],[6.15578,50.13554],[6.14376,50.13224],[6.13243,50.12454],[6.10737,50.13378],[6.11012,50.16282],[6.09947,50.16502],[6.08677,50.15425],[6.06583,50.14875],[6.02943,50.15579],[6.01639,50.17294],[5.97931,50.16898],[5.96832,50.12542],[5.94566,50.12278],[5.90378,50.10473],[5.89073,50.06948],[5.86876,50.06243],[5.87837,50.03289],[5.83168,50.01039],[5.84404,49.99935],[5.84747,49.98214],[5.81932,49.95785],[5.78773,49.95255],[5.77263,49.91144],[5.74722,49.89994],[5.7843,49.88977],[5.7946,49.87473],[5.76645,49.86012],[5.75203,49.834],[5.76645,49.80121],[5.79941,49.79855],[5.84404,49.74977],[5.83923,49.72847],[5.87906,49.72892],[5.89622,49.70672],[5.87563,49.67963],[5.91176,49.66218],[5.90567,49.65779],[5.9073,49.65479],[5.90429,49.65213],[5.90507,49.64735],[5.90567,49.64262],[5.90876,49.63868],[5.89854,49.63362],[5.89374,49.63573],[5.88524,49.6319],[5.88799,49.62645],[5.87837,49.62],[5.87829,49.61305],[5.8776,49.60737],[5.84996,49.59675],[5.85202,49.58824],[5.86318,49.58773],[5.86524,49.58974],[5.86962,49.59013],[5.87279,49.58913],[5.87502,49.58295],[5.87073,49.58134],[5.87288,49.57961],[5.87314,49.57677],[5.87451,49.5736],[5.86387,49.56965],[5.86164,49.56603],[5.85288,49.56347],[5.85168,49.56185],[5.84661,49.5608],[5.84773,49.55896],[5.84722,49.55567],[5.84224,49.55233],[5.8267,49.54933],[5.82524,49.55066],[5.82026,49.54599],[5.81623,49.54599],[5.81245,49.54582],[5.80765,49.5486],[5.79941,49.54816],[5.78859,49.55194],[5.77263,49.56141],[5.76181,49.55963],[5.75941,49.54203],[5.7407,49.53724],[5.73521,49.53813],[5.72971,49.54225],[5.7189,49.53802],[5.70156,49.5378],[5.6904,49.54392],[5.67993,49.54348],[5.67787,49.54715],[5.66757,49.54682],[5.66002,49.5505],[5.64526,49.54437],[5.62878,49.53579],[5.6262,49.52287],[5.62346,49.5144],[5.61298,49.50292],[5.60217,49.50671],[5.59359,49.51953],[5.56904,49.52565],[5.56372,49.52409],[5.55462,49.52744],[5.54192,49.51384],[5.50329,49.50504],[5.4875,49.50526],[5.48458,49.50113],[5.47085,49.49322],[5.46209,49.49679],[5.46055,49.50738],[5.45214,49.51083],[5.44304,49.51841],[5.46158,49.52788],[5.46209,49.53735],[5.4372,49.55283],[5.45368,49.56542],[5.44458,49.56586],[5.43549,49.56887],[5.42673,49.5899],[5.42862,49.59358],[5.41523,49.59947],[5.40871,49.60748],[5.39892,49.6096],[5.39652,49.6146],[5.3742,49.62128],[5.37025,49.62105],[5.36047,49.62428],[5.34897,49.62895],[5.34279,49.61505],[5.33781,49.61427],[5.32957,49.61494],[5.32064,49.61271],[5.31378,49.6096],[5.31034,49.61071],[5.30863,49.61694],[5.30279,49.62317],[5.30245,49.62962],[5.30794,49.63851],[5.31738,49.64807],[5.33043,49.65318],[5.30708,49.67085],[5.29284,49.67607],[5.27962,49.68496],[5.2791,49.6884],[5.26829,49.69495],[5.25782,49.69295],[5.2482,49.68529],[5.24117,49.68429],[5.24134,49.68851],[5.23104,49.69007],[5.2173,49.6864],[5.21421,49.68784],[5.20666,49.69451],[5.19722,49.69062],[5.18932,49.6924],[5.17542,49.6924],[5.16306,49.69218],[5.1622,49.6995],[5.1646,49.71083],[5.15963,49.71438],[5.15327,49.71671],[5.15087,49.71249],[5.14263,49.70739],[5.14006,49.71194],[5.13147,49.71205],[5.12529,49.71105],[5.12032,49.71704],[5.12358,49.72637],[5.11723,49.73757],[5.09302,49.76297],[5.08796,49.76475],[5.08452,49.76186],[5.07963,49.76164],[5.07611,49.76109],[5.07139,49.75987],[5.06727,49.76081],[5.06144,49.76192],[5.06092,49.76624],[5.04908,49.76741],[5.00599,49.7816],[5.00547,49.7832],[5.00504,49.78719],[5.00041,49.79312],[4.99741,49.79379],[4.99603,49.79506],[4.99715,49.79672],[4.99672,49.79955],[4.9938,49.79977],[4.98539,49.79888],[4.97895,49.79972],[4.96977,49.8011],[4.96779,49.79756],[4.96179,49.79717],[4.95569,49.80027],[4.94865,49.79811],[4.94814,49.79473],[4.94368,49.79035],[4.94213,49.79035],[4.94132,49.79226],[4.93887,49.7926],[4.93286,49.78977],[4.9329,49.78825],[4.93114,49.78661],[4.92939,49.78686],[4.92102,49.78805],[4.91793,49.78708],[4.91269,49.78573],[4.90475,49.78492],[4.89947,49.78597],[4.89741,49.78836],[4.88913,49.78769],[4.88724,49.78786],[4.88244,49.79049],[4.87939,49.79249],[4.87591,49.79282],[4.87068,49.79268],[4.87188,49.78922],[4.87081,49.78839],[4.86227,49.78805],[4.85712,49.78966],[4.85201,49.79035],[4.84909,49.79368],[4.8563,49.79722],[4.86076,49.80354],[4.86214,49.81373],[4.87364,49.81883],[4.86712,49.82071],[4.86712,49.82625],[4.86506,49.83444],[4.8654,49.83964],[4.85304,49.84042],[4.84943,49.84894],[4.84789,49.86278],[4.84463,49.8703],[4.85561,49.87096],[4.87484,49.89618],[4.87347,49.90459],[4.87999,49.90879],[4.87553,49.92006],[4.85424,49.92957],[4.84325,49.94636],[4.82849,49.94724],[4.78558,49.9563],[4.78523,49.9828],[4.80995,49.99626],[4.81647,50.02671],[4.83021,50.04127],[4.81441,50.04788],[4.8127,50.06794],[4.8357,50.07014],[4.83192,50.09085],[4.84291,50.10363],[4.86626,50.10318],[4.85836,50.1164],[4.88274,50.13664],[4.87072,50.14875],[4.8278,50.14963],[4.82025,50.15579],[4.76875,50.1296],[4.75262,50.10539],[4.70352,50.08424],[4.70112,50.01502],[4.69803,49.99229],[4.63383,49.98037],[4.56963,49.96712],[4.53255,49.94857],[4.51401,49.93973],[4.44122,49.93178],[4.35745,49.94327],[4.31145,49.95564],[4.22974,49.94945],[4.18785,49.95034],[4.16725,49.96801],[4.12331,49.97286],[4.12193,50.01215],[4.14734,50.05273],[4.18167,50.05493],[4.22012,50.07301],[4.1906,50.10252],[4.18922,50.1263],[4.16382,50.1219],[4.11644,50.13158],[4.13841,50.21734],[4.20708,50.25555],[4.1827,50.27025],[4.16382,50.28298],[4.15901,50.27596],[4.17309,50.2685],[4.17309,50.25994],[4.16519,50.25401],[4.13258,50.25489],[4.1312,50.26433],[4.13017,50.27091],[4.11644,50.27464],[4.12262,50.2821],[4.1185,50.2957],[4.09653,50.30864],[4.07696,50.30579],[4.07215,50.31807],[4.05533,50.32946],[4.03679,50.33998],[4.02512,50.35291],[3.98598,50.33911],[3.95748,50.33845],[3.8974,50.32267],[3.88264,50.32377],[3.88092,50.33494],[3.85448,50.33911],[3.84933,50.34875],[3.82942,50.35028],[3.82633,50.34217],[3.80711,50.3413],[3.80608,50.35072],[3.74256,50.34393],[3.73604,50.31149],[3.72437,50.30272],[3.70583,50.29921],[3.68076,50.31894],[3.66428,50.34152],[3.65227,50.37087],[3.66634,50.39123],[3.66325,50.42143],[3.65398,50.4551],[3.62995,50.46712],[3.60832,50.49006],[3.59974,50.48657],[3.55476,50.48853],[3.49915,50.47936],[3.48198,50.48635],[3.50945,50.52085],[3.4758,50.52478],[3.45726,50.50513],[3.43735,50.49945],[3.36662,50.48416],[3.27324,50.52609],[3.25951,50.60154],[3.2341,50.65251],[3.24097,50.67862],[3.24783,50.70037],[3.19565,50.70776],[3.1311,50.77642],[3.06725,50.76296],[2.99652,50.74428],[2.95807,50.67035],[2.82898,50.68602],[2.68341,50.77816],[2.57629,50.81114],[2.5708,50.93939],[2.51862,51.05866],[2.36755,51.2516],[3.08167,51.55146]]]}},"belarus":{"type":"Feature","id":"belarus","properties":{},"geometry":{"type":"Polygon","coordinates":[[[23.19351,52.37811],[23.38715,52.57134],[23.67554,52.61806],[23.87329,52.72215],[23.75656,53.20027],[23.42148,53.83956],[23.43521,53.97467],[24.33609,53.99082],[24.73022,54.03762],[24.70825,54.16967],[24.95682,54.18253],[25.48004,54.37176],[25.63385,54.95239],[26.53748,55.24468],[26.27655,55.26973],[26.48804,55.71009],[26.89728,55.87993],[27.56195,55.82597],[27.56195,55.97226],[27.98218,56.20976],[29.64935,55.96304],[30.28107,55.89303],[30.95398,55.64815],[31.20941,54.67065],[32.47009,53.7617],[32.83539,53.3866],[32.22839,53.02635],[31.51978,53.16159],[31.84662,52.06262],[30.8139,51.93411],[30.4953,51.21032],[27.71301,51.46085],[25.85083,51.88666],[24.5874,51.81541],[23.51898,51.41634],[23.45581,51.99841],[23.15918,52.1874],[23.19351,52.37811]]]}},"czechia":{"type":"Feature","id":"czechia","properties":{},"geometry":{"type":"Polygon","coordinates":[[[14.3811,51.06902],[15.13916,51.08282],[16.42456,50.70863],[16.68823,50.32442],[16.78711,50.49246],[17.75391,50.35247],[18.58887,49.96536],[18.92944,49.51808],[18.1604,48.98022],[17.00684,48.61839],[15.13916,48.85749],[14.67773,48.55298],[13.85376,48.58206],[12.00806,50.05008],[11.92017,50.35948],[14.3811,51.06902]]]}},"germany":{"type":"Feature","id":"germany","properties":{},"geometry":{"type":"Polygon","coordinates":[[[7.05048,52.62973],[7.21252,53.20274],[6.56982,53.61858],[8.30772,55.1467],[8.6483,54.96421],[9.45305,54.83313],[9.95018,54.82838],[11.99913,54.44689],[13.3889,54.89162],[14.15245,54.47562],[14.26231,53.78037],[14.44359,53.27096],[14.36119,53.0668],[14.16344,52.97097],[14.13597,52.84508],[14.62486,52.60555],[14.5919,52.35463],[14.71825,52.24042],[14.74571,52.06516],[14.60838,51.83153],[14.74571,51.69554],[14.76768,51.54206],[14.98741,51.43261],[15.03136,51.27824],[14.94347,51.04744],[14.85558,50.88138],[14.77867,50.81548],[14.64684,50.85017],[14.5974,50.99215],[14.32823,51.07506],[14.32823,50.88138],[13.01537,50.49508],[12.48253,50.38663],[12.33421,50.18305],[12.1804,50.30952],[12.12547,50.25686],[12.22984,50.09856],[12.55394,49.92912],[12.4276,49.75199],[12.5045,49.68807],[12.77916,49.35286],[12.93297,49.36002],[13.03185,49.28841],[13.57018,48.96489],[13.80089,48.81319],[13.75694,48.52297],[13.52074,48.58842],[13.45482,48.57388],[13.40538,48.36994],[13.23509,48.28959],[12.99889,48.24571],[12.75169,48.12118],[12.9879,47.86385],[12.91649,47.71623],[13.04832,47.72362],[13.09776,47.67186],[13.0648,47.50885],[12.93846,47.47173],[12.77367,47.5793],[12.8286,47.60894],[12.70226,47.70144],[12.1859,47.70514],[12.16942,47.62005],[11.86729,47.60524],[11.63109,47.59412],[11.25755,47.40114],[10.98839,47.40486],[10.88402,47.52369],[10.67528,47.55707],[10.45006,47.54594],[10.46654,47.41973],[10.34019,47.3081],[10.19737,47.27457],[10.21385,47.38998],[10.10948,47.3751],[10.08202,47.46431],[9.84581,47.55336],[9.40636,47.55336],[9.09874,47.68388],[8.90236,47.65521],[8.85292,47.70329],[8.80348,47.74025],[8.76915,47.71993],[8.80486,47.70329],[8.79524,47.68388],[8.7307,47.69867],[8.73482,47.7227],[8.71284,47.7384],[8.7513,47.76887],[8.69637,47.76425],[8.65654,47.8067],[8.63594,47.76518],[8.61122,47.80947],[8.57002,47.79286],[8.48763,47.77902],[8.41621,47.71808],[8.41347,47.68111],[8.46428,47.65891],[8.53706,47.67001],[8.60985,47.67741],[8.63457,47.64966],[8.59886,47.64319],[8.61122,47.6219],[8.56865,47.60061],[8.56865,47.6219],[8.52745,47.64041],[8.45879,47.60801],[8.50273,47.58672],[8.38463,47.57004],[8.33107,47.57375],[8.29399,47.61542],[8.2061,47.62653],[8.10173,47.56819],[7.96852,47.5617],[7.92046,47.55429],[7.89024,47.59505],[7.8257,47.58949],[7.81197,47.56726],[7.6815,47.54038],[7.6403,47.56448],[7.69386,47.5756],[7.6815,47.59412],[7.64854,47.60061],[7.61421,47.58394],[7.50641,47.70237],[7.79205,48.60749],[8.22876,48.97481],[6.84174,49.17093],[6.37482,49.48597],[6.53961,49.80963],[6.1441,50.01833],[6.19835,50.21119],[6.41808,50.35159],[6.19835,50.63117],[6.02257,50.77034],[6.02257,51.07506],[6.24229,51.37778],[5.97862,51.81456],[6.1496,51.90022],[6.44073,51.85105],[6.828,51.95611],[6.68518,52.05587],[7.04773,52.23957],[6.99554,52.45768],[6.70166,52.48445],[6.72913,52.64973],[7.05048,52.62973]]]}},"spain":{"type":"Feature","id":"spain","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-19,29],[-13,30],[-13,29],[-14,27.8],[-19,27],[-19,29]]],[[[-8.89106,41.82289],[-10,44],[-4,44],[-1.77005,43.37605],[-1.71005,43.37569],[-1.71135,43.33125],[-1.72259,43.31318],[-1.68904,43.31291],[-1.68811,43.33413],[-1.64467,43.33372],[-1.64498,43.31332],[-1.60299,43.31295],[-1.60344,43.29266],[-1.56359,43.29212],[-1.56305,43.31338],[-1.47799,43.31284],[-1.36677,43.27614],[-1.35688,43.23815],[-1.37037,43.1713],[-1.44231,43.08336],[-1.41983,43.06036],[-1.37307,43.05117],[-1.36407,43.11159],[-1.30203,43.13522],[-1.23549,43.13325],[-1.27955,43.07744],[-1.19232,43.06496],[-1.00619,43.00778],[-0.94234,42.9749],[-0.7562,42.98213],[-0.71484,42.96108],[-0.69685,42.90314],[-0.55118,42.82207],[-0.50442,42.84845],[-0.42889,42.82009],[-0.31648,42.86558],[-0.14563,42.81086],[-0.03143,42.71249],[0.18618,42.7541],[0.30218,42.71777],[0.36422,42.74287],[0.44875,42.71447],[0.62769,42.7224],[0.64118,42.85767],[0.71492,42.88272],[0.9676,42.81811],[1.10878,42.79898],[1.17532,42.73429],[1.36326,42.74155],[1.41137,42.70939],[1.48061,42.71034],[1.4813,42.50107],[1.64436,42.50203],[1.64328,42.54245],[1.73041,42.54342],[1.73164,42.50118],[2.06386,42.50164],[2.06456,42.45902],[2.39693,42.45994],[2.39768,42.41784],[2.48048,42.41797],[2.48098,42.37594],[2.64479,42.37626],[2.64448,42.45924],[2.81133,42.45961],[2.81126,42.50104],[3.06388,42.50085],[3.06388,42.45915],[3.23078,42.45934],[5,40],[4,39],[-2.2,36.5],[-5.6,35.95],[-6,36],[-7.37535,37.15354],[-7.40832,37.16822],[-7.4481,37.39094],[-7.46963,37.40758],[-7.4647,37.45305],[-7.50197,37.51641],[-7.51916,37.52292],[-7.52196,37.57237],[-7.45013,37.66958],[-7.4249,37.75992],[-7.31666,37.83997],[-7.26833,37.98895],[-7.15368,38.01552],[-7.11771,38.05536],[-7.0143,38.02438],[-6.99632,38.10756],[-6.96147,38.20125],[-7.08062,38.15708],[-7.34027,38.44024],[-7.26383,38.73807],[-7.04352,38.87297],[-7.06151,38.90796],[-6.96934,39.01983],[-7.00081,39.08879],[-7.15368,39.09577],[-7.15255,39.16029],[-7.24472,39.19689],[-7.25596,39.28133],[-7.33689,39.35351],[-7.3279,39.45599],[-7.51449,39.58865],[-7.55271,39.67954],[-7.05027,39.67522],[-6.99519,39.81954],[-6.92213,39.87909],[-6.88616,40.02299],[-7.04128,40.13479],[-7.01767,40.26615],[-6.8086,40.34501],[-6.86818,40.44516],[-6.85356,40.60664],[-6.83783,40.87576],[-6.9536,41.03704],[-6.80186,41.03959],[-6.76814,41.13871],[-6.64112,41.26556],[-6.56244,41.26303],[-6.21737,41.5791],[-6.31628,41.64465],[-6.51523,41.64129],[-6.58717,41.68832],[-6.54783,41.85597],[-6.62988,41.91121],[-7.13345,41.94048],[-7.16829,41.87188],[-7.42569,41.78477],[-7.95398,41.84593],[-8.13045,41.78058],[-8.25185,41.90786],[-8.12933,42.03488],[-8.24848,42.1008],[-8.36762,42.05575],[-8.60704,42.03405],[-8.89106,41.82289]]]]}},"IT_Lazio":{"type":"Feature","id":"IT_Lazio","properties":{},"geometry":{"type":"Polygon","coordinates":[[[13.23814,42.1301],[13.19363,42.15923],[13.17062,42.15169],[13.12434,42.17797],[13.08798,42.17886],[13.08575,42.14318],[13.0317,42.12309],[13.01946,42.07634],[13.05545,42.01736],[13.10194,42.00898],[13.10589,42.02698],[13.36437,41.92475],[13.384,41.90419],[13.35751,41.8694],[13.38052,41.81709],[13.4169,41.83467],[13.50508,41.8016],[13.52044,41.77297],[13.57182,41.7543],[13.66214,41.81144],[13.70555,41.78747],[13.72956,41.7989],[13.7629,41.7488],[13.81162,41.75426],[13.85645,41.73124],[13.89541,41.73405],[13.98311,41.66238],[14.01182,41.60835],[13.99895,41.57448],[14.02596,41.55567],[14.00526,41.53875],[14.0275,41.52321],[13.97291,41.49404],[13.99278,41.48208],[13.9779,41.46249],[13.90257,41.42273],[13.86123,41.41763],[13.8886,41.40081],[13.8688,41.36272],[13.88974,41.29748],[13.82898,41.28154],[13.83083,41.2502],[13.77126,41.24136],[13.45667,40.77769],[11.52381,41.03693],[11.44922,42.37798],[11.48889,42.43937],[11.61771,42.43604],[11.61626,42.48862],[11.56011,42.51595],[11.58852,42.54226],[11.57917,42.56803],[11.61401,42.55723],[11.64337,42.56635],[11.71111,42.61091],[11.73597,42.60666],[11.74975,42.63965],[11.80478,42.644],[11.77554,42.70951],[11.80156,42.70719],[11.81949,42.74543],[11.74602,42.78576],[11.77424,42.82107],[11.80685,42.79485],[11.8137,42.82267],[11.84851,42.84008],[11.90558,42.8325],[11.92743,42.78092],[11.97948,42.76459],[11.96293,42.72669],[11.9301,42.71295],[11.94133,42.6833],[12.03,42.64324],[12.10666,42.66464],[12.12406,42.64929],[12.16101,42.67691],[12.20434,42.66046],[12.24292,42.62906],[12.22819,42.61077],[12.24626,42.60256],[12.23866,42.57218],[12.27504,42.55991],[12.26676,42.53347],[12.29027,42.51904],[12.27477,42.50921],[12.30735,42.4973],[12.29041,42.49164],[12.32537,42.49476],[12.35123,42.47365],[12.39017,42.49819],[12.41905,42.49765],[12.41244,42.46756],[12.43038,42.45802],[12.41368,42.45517],[12.41365,42.4256],[12.4636,42.42909],[12.44469,42.39882],[12.51169,42.40311],[12.52874,42.36445],[12.60642,42.40245],[12.61481,42.46511],[12.64109,42.4678],[12.6495,42.44331],[12.67465,42.44242],[12.74156,42.47053],[12.71114,42.50079],[12.89273,42.5635],[12.88052,42.60935],[13.00524,42.61622],[13.02522,42.64],[13.06423,42.62427],[13.13,42.66053],[13.14645,42.64714],[13.17506,42.66707],[13.19025,42.73363],[13.25415,42.72145],[13.2645,42.74019],[13.28589,42.74049],[13.35851,42.69533],[13.35059,42.66968],[13.37022,42.6507],[13.4092,42.64383],[13.39493,42.59223],[13.29421,42.5705],[13.28454,42.58349],[13.24686,42.57367],[13.19228,42.58849],[13.15673,42.54102],[13.17934,42.48031],[13.11708,42.44489],[13.19508,42.39017],[13.15427,42.35797],[13.22737,42.32031],[13.23563,42.27871],[13.28229,42.23874],[13.33653,42.22338],[13.34238,42.19939],[13.3808,42.18142],[13.34871,42.17689],[13.35488,42.16769],[13.32819,42.16483],[13.30621,42.13923],[13.23814,42.1301]]]}},"IT_Roma_Capitale":{"type":"Feature","id":"IT_Roma_Capitale","properties":{},"geometry":{"type":"Polygon","coordinates":[[[11.6,42.16],[12.28,42.2],[12.52,42.31],[13.27,41.92],[13.15,41.58],[12.6,41.16],[11.6,42.16]]]}},"canada_full":{"type":"Feature","id":"canada_full","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-140.99854,69.64945],[-120.9375,78.7335],[-91.05469,82.7432],[-75.58594,83.40004],[-63.45703,83.15311],[-59.32617,82.37915],[-63.76465,81.42049],[-67.19238,80.79583],[-73.21289,78.85307],[-74.9707,76.33114],[-61.34766,70.75797],[-50.1416,46.67959],[-65.98389,42.85181],[-66.95892,44.48769],[-66.9397,44.81692],[-67.13745,45.15493],[-67.26379,45.18591],[-67.31873,45.1278],[-67.43958,45.21881],[-67.44507,45.58329],[-67.79114,45.67164],[-67.78015,47.07012],[-68.19763,47.35743],[-68.39539,47.35743],[-68.37891,47.29413],[-68.90625,47.17478],[-69.06006,47.23449],[-69.08203,47.43552],[-69.22485,47.46524],[-70.00488,46.70974],[-70.05981,46.41514],[-70.18066,46.36209],[-70.3125,46.21025],[-70.24658,46.14178],[-70.3125,45.97406],[-70.26855,45.91294],[-70.42236,45.80583],[-70.42236,45.72152],[-70.71899,45.49865],[-70.62012,45.38302],[-70.80688,45.4293],[-70.85083,45.22848],[-71.00464,45.3367],[-71.1145,45.25169],[-71.26831,45.29035],[-71.41113,45.24395],[-71.5155,45.0153],[-74.81689,45.0153],[-75.31128,44.84808],[-75.7782,44.51218],[-75.82214,44.4377],[-76.43188,44.09942],[-76.79993,43.63011],[-78.68683,43.63806],[-79.19495,43.45292],[-79.07204,43.26521],[-79.05693,43.25671],[-79.04594,43.13807],[-79.06998,43.12103],[-79.06311,43.11652],[-79.05693,43.10951],[-79.07616,43.08393],[-79.07684,43.07691],[-79.01505,43.06839],[-78.99719,43.05785],[-79.02672,43.02071],[-79.01779,42.98456],[-78.98003,42.97099],[-78.96423,42.95843],[-78.93402,42.95542],[-78.91136,42.93883],[-78.90518,42.90011],[-78.93127,42.82361],[-80.07935,42.38289],[-81.27686,42.20818],[-82.39197,41.68112],[-82.68311,41.67701],[-83.07861,41.86547],[-83.15552,42.03909],[-83.12531,42.12064],[-83.13904,42.23462],[-83.07587,42.31185],[-82.98523,42.33418],[-82.81219,42.37478],[-82.63916,42.56117],[-82.59521,42.54903],[-82.52655,42.61375],[-82.41669,43.00063],[-82.13379,43.59631],[-82.51831,45.34442],[-83.59772,45.82114],[-83.43567,45.99696],[-83.57162,46.10847],[-83.65402,46.12275],[-83.76663,46.10466],[-83.82843,46.11989],[-83.89984,46.06084],[-83.95615,46.05989],[-83.974,46.1018],[-84.00833,46.11609],[-84.00696,46.14559],[-84.07974,46.18934],[-84.10995,46.24065],[-84.0976,46.25585],[-84.11545,46.26724],[-84.12094,46.31564],[-84.10309,46.32038],[-84.13467,46.36115],[-84.14841,46.42082],[-84.10995,46.50359],[-84.12781,46.531],[-84.14085,46.53241],[-84.17313,46.52722],[-84.19373,46.54092],[-84.226,46.53525],[-84.26582,46.49603],[-84.2926,46.49225],[-84.34135,46.50595],[-84.37225,46.50879],[-84.44023,46.49036],[-84.47662,46.45489],[-84.55353,46.45867],[-84.76776,46.62492],[-84.84741,46.88272],[-88.38501,48.31243],[-89.32983,47.96786],[-93.21899,48.64743],[-93.80127,48.5166],[-93.83423,48.63291],[-94.6637,48.75257],[-94.8175,49.32691],[-95.15259,49.38595],[-95.15533,49.00184],[-123.31879,49.00004],[-122.99469,48.7761],[-123.2666,48.69096],[-123.11279,48.37815],[-123.44238,48.22467],[-124.7168,48.49477],[-128.49609,48.74895],[-131.2207,53.61858],[-130.75928,54.73731],[-129.99023,55.27912],[-130.07813,56.10881],[-131.74805,56.63206],[-135.53833,59.80063],[-137.47192,58.90465],[-138.67493,59.78958],[-138.6969,59.90822],[-139.20227,60.09772],[-139.08142,60.35141],[-139.71863,60.33239],[-139.98779,60.18523],[-140.46021,60.30791],[-140.52063,60.22618],[-141.01501,60.30519],[-140.99854,69.64945]]]}},"ottawa_gatineau":{"type":"Feature","id":"ottawa_gatineau","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-76.23413,45.50827],[-76.12839,45.55829],[-75.26184,45.58041],[-75.13412,45.39652],[-75.42938,45.32512],[-75.35385,45.17816],[-75.82489,44.93564],[-76.34537,45.36855],[-76.23413,45.50827]]]}},"vancouver_metro":{"type":"Feature","id":"vancouver_metro","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-123.32,49],[-123.45,49.38],[-123.26,49.47],[-122.24,49.27],[-122.2,49],[-123.32,49]]]}},"boston":{"type":"Feature","id":"boston","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-70.5,41.91],[-71,41.91],[-71.42,42.05],[-71.57,42.18],[-71.64,42.4],[-71.57,42.52],[-71.35,42.64],[-71.1,42.7],[-70.5,42.7],[-70.5,41.91]]]}},"central_pa":{"type":"Feature","id":"central_pa","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-78.7,41.5],[-77,41.5],[-76,40],[-76,39.72],[-79.3,39.72],[-78.7,41.5]]]}},"chattanooga":{"type":"Feature","id":"chattanooga","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-85.634,34.743],[-85.634,35.282],[-84.933,35.282],[-84.933,34.743],[-85.634,34.743]]]}},"cleveland":{"type":"Feature","id":"cleveland","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-82.5,41.5],[-80.95,42],[-80.95,41],[-82.5,41],[-82.5,41.5]]]}},"colorado":{"type":"Feature","id":"colorado","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-109.05,37],[-109.05,41],[-102.05,41],[-102.05,37],[-109.05,37]]]}},"dc_metro":{"type":"Feature","id":"dc_metro","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-77.04437,38.70266],[-77.27783,38.69409],[-77.57172,38.91668],[-77.61017,39.1258],[-77.27509,39.21523],[-77.08694,39.21204],[-76.87546,39.05119],[-76.69968,38.97863],[-76.71066,38.77657],[-76.84662,38.7048],[-77.04437,38.70266]]]}},"dfw_metro":{"type":"Feature","id":"dfw_metro","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-97.75,32.25],[-97.75,33.4],[-96,33.4],[-96,32.25],[-97.75,32.25]]]}},"grand_junction_co":{"type":"Feature","id":"grand_junction_co","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-109,39.4],[-108.1,39.4],[-107.8,39.16],[-107.8,38.7],[-108.1,38.5],[-109,39],[-109,39.4]]]}},"la_metro":{"type":"Feature","id":"la_metro","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-118.5,33.7],[-118.68,34.23],[-118.5,34.35],[-118,34.2],[-117.3,34.2],[-117.2,34.1],[-117.37,33.9],[-117.74,33.5],[-118.5,33.7]]]}},"minneapolis_st_paul_metro":{"type":"Feature","id":"minneapolis_st_paul_metro","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-93.801,44.578],[-93.801,45.348],[-92.666,45.348],[-92.666,44.578],[-93.801,44.578]]]}},"mt_vernon_wa":{"type":"Feature","id":"mt_vernon_wa","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-123.3,49],[-122,49],[-122,48],[-123.2,48.4],[-123.3,49]]]}},"nyc_metro":{"type":"Feature","id":"nyc_metro","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-74.73,40.64],[-73.95,41.38],[-73.6,40.95],[-73.25,41],[-73.25,40.6],[-74.43,40.43],[-74.73,40.64]]]}},"philly_metro":{"type":"Feature","id":"philly_metro","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-75.7,40.3],[-75.3,40.4],[-74.7,40.3],[-74.45,40.1],[-74.9,39.55],[-75.5,39.55],[-75.8,39.7218],[-76.23,39.7211],[-75.7,40.3]]]}},"phoenix":{"type":"Feature","id":"phoenix","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-113,32.7],[-113,34],[-111.1,34],[-111.1,32.7],[-113,32.7]]]}},"portland_me":{"type":"Feature","id":"portland_me","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-70.5,42.9],[-71,43.3],[-71,44.2],[-69.6,44.5],[-69,44],[-70.5,42.9]]]}},"portland_or":{"type":"Feature","id":"portland_or","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-124.4,44.8],[-124.4,46.3],[-121.5,46.3],[-121.5,44.8],[-124.4,44.8]]]}},"salt_lake_city":{"type":"Feature","id":"salt_lake_city","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-112.6,40.75],[-112.3,41.4],[-111.5,41.4],[-111.1,40.3],[-112,39.75],[-112.6,40.75]]]}},"seattle":{"type":"Feature","id":"seattle","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-122.15,47.26],[-122.33,47.26],[-122.54,47.33],[-122.52,47.46],[-122.45,47.55],[-122.45,47.8],[-121.2,47.8],[-121.43,47.38],[-121.43,47.14],[-121.94,47.14],[-122,47.17],[-122,47.17],[-122.1,47.19],[-122.15,47.26]]]}},"sf_bay_area":{"type":"Feature","id":"sf_bay_area","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-123.5,38.5],[-122.8,38.8],[-121.7,38.2],[-121.5,36.9],[-123,36.9],[-123.5,38.5]]]}},"south_sf_bay_area":{"type":"Feature","id":"south_sf_bay_area","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-121.4566,37.48249],[-121.21628,37.17673],[-121.20529,36.95757],[-121.49368,36.95757],[-121.5596,36.8928],[-121.98257,37.12419],[-122.27234,37.39635],[-122.13501,37.48903],[-121.4566,37.48249]]]}},"st_louis":{"type":"Feature","id":"st_louis","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-90.28,39.1],[-89.57,39.05],[-89.57,38.18],[-90.58,38],[-91.37,38.2],[-91.37,38.75],[-90.28,39.1]]]}},"tampa_bay":{"type":"Feature","id":"tampa_bay","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-83,28.2],[-82.2,28.2],[-82.2,27.55],[-83,27.55],[-83,28.2]]]}},"usa_full":{"type":"Feature","id":"usa_full","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-124.76179,48.41301],[-123.22752,48.18499],[-123.32289,49.00429],[-96.01312,49.00605],[-95.11054,49.412],[-93.99811,49.00671],[-89.43531,47.98378],[-88.34922,48.29633],[-87.50645,48.01427],[-83.2814,46.13885],[-82.17616,43.58854],[-82.66248,41.68895],[-79.00601,42.80053],[-79.15798,43.44626],[-78.76239,43.62496],[-76.90231,43.80246],[-75.07988,44.98029],[-72.02225,45.00598],[-71.41227,45.25488],[-70.46149,46.21766],[-69.25051,47.51223],[-67.75966,47.099],[-66.94528,44.71049],[-69.84893,43.26199],[-69.87974,40.99205],[-72.00202,40.99125],[-74.02112,39.57279],[-75.41474,35.05319],[-80.02453,32.01613],[-79.89011,26.85507],[-80.02,24.0071],[-84.01601,24.00527],[-84.01656,25.01258],[-81.99666,25.01349],[-81.9972,25.98268],[-84.01879,28.99618],[-86.02775,30.00475],[-88.01625,30.00389],[-88.01567,28.99443],[-90.90285,28.85645],[-93.74053,29.47421],[-95.55633,28.58761],[-96.80617,27.79782],[-96.95553,25.98216],[-97.43502,25.8266],[-98.01091,25.9928],[-99.23511,26.4476],[-100.00624,28.00822],[-101.25529,29.48105],[-102.1514,29.74757],[-102.71736,29.39206],[-103.25189,28.89087],[-104.58819,29.69979],[-105.02053,30.5361],[-106.20525,31.4467],[-106.28689,31.56133],[-106.42932,31.75206],[-106.48421,31.74645],[-106.53072,31.78209],[-108.18711,31.77551],[-108.19927,31.326],[-111.00893,31.33601],[-114.86123,32.47999],[-117.67593,32.46302],[-119.97759,33.00641],[-122.53697,36.85661],[-124.99343,40.05576],[-124.60595,45.90245],[-124.76179,48.41301]]],[[[-160.57876,22.50629],[-159.00937,22.50702],[-157.50474,21.9985],[-156.29276,21.22259],[-154.68902,19.88057],[-154.62178,18.7587],[-155.99619,18.77902],[-157.50832,20.9958],[-158.74706,21.24398],[-160.57822,21.49846],[-160.57876,22.50629]]],[[[-167.1572,68.722],[-164.9717,68.9947],[-163.0218,69.9707],[-160.4136,70.7398],[-156.1769,71.5633],[-140.9684,69.9535],[-140.9874,61.0119],[-139.1716,60.4127],[-138.0072,59.9918],[-135.123,59.7566],[-131.9759,56.9995],[-130.0071,57.0001],[-130.0044,54.0043],[-133.9948,54.0032],[-138.515,57.9986],[-138.516,58.9953],[-151.5013,58.992],[-151.5003,57.9988],[-151.9963,55.9992],[-158.0191,55.0028],[-159.0076,55.0025],[-162.4025,53.9567],[-171.4689,51.8215],[-177.9993,51.2554],[-178.0001,52.2446],[-173.8197,59.7401],[-172.5143,63.8767],[-169.0075,64.9988],[-169.0087,66.0015],[-168.0022,66.0018],[-164.8554,67.0255],[-167.1572,68.722]]],[[[-68.2,17.8],[-67.9,18.67],[-65.33,18.57],[-64.64,18.36],[-64.32,17.38],[-68.2,17.8]]],[[[146.2,15.4],[144.8,12.9],[144.2,13.2],[145.7,15.6],[146.2,15.4]]],[[[180,52.2],[180,51],[172,52.5],[172,53.5],[180,52.2]]]]}},"wyoming":{"type":"Feature","id":"wyoming","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-111.05,41],[-111.05,45],[-104.05,45],[-104.05,41],[-111.05,41]]]}},"australia_full":{"type":"Feature","id":"australia_full","properties":{},"geometry":{"type":"Polygon","coordinates":[[[146.07422,-44.43378],[131.66016,-44.65302],[124.54102,-41.44273],[116.45508,-39.36828],[108.80859,-39.16414],[103.18359,-27.60567],[95.27344,-24.04646],[96.30615,-11.15685],[106.25977,-9.92557],[116.47705,-13.98738],[122.77222,-11.65224],[126.43066,-11.48002],[129.26514,-9.92557],[134.89014,-9.92557],[139.46045,-10.14193],[141.55334,-9.99861],[141.7868,-9.77132],[142.229,-9.67115],[142.72614,-9.552],[143.30017,-9.39216],[144.24774,-9.24851],[144.44824,-9.59533],[149.5459,-12.68321],[154.90723,-18.02053],[156.42334,-21.55528],[158.02734,-24.68695],[160.0708,-26.03704],[167.34375,-26.6671],[170.354,-29.11378],[168.2666,-30.63791],[160.15869,-34.03445],[152.18262,-38.41056],[149.94141,-43.51669],[146.07422,-44.43378]]]}},"argentina":{"type":"Feature","id":"argentina","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-65.5,-55.2],[-66.45,-55.25],[-66.95992,-54.89681],[-67.56244,-54.87001],[-68.63335,-54.8695],[-68.63401,-52.63637],[-68.25,-53.1],[-67.75,-53.85],[-66.45,-54.45],[-65.05,-54.7],[-65.5,-55.2]]],[[[-64.96489,-22.07586],[-64.37702,-22.79809],[-63.98684,-21.99364],[-62.84647,-22.03498],[-62.68506,-22.24903],[-60.84656,-23.88071],[-60.02897,-24.0328],[-58.80713,-24.77146],[-57.77722,-25.16234],[-57.63366,-25.60366],[-58.61817,-27.12372],[-57.60976,-27.3959],[-56.4867,-27.5485],[-55.69585,-27.38784],[-54.7888,-26.62179],[-54.62529,-25.73925],[-54.13005,-25.54764],[-53.62835,-26.12486],[-53.64874,-26.92347],[-54.49072,-27.47476],[-55.16229,-27.88191],[-56.2909,-28.85276],[-57.62513,-30.21629],[-57.87494,-31.01656],[-58.14244,-32.0445],[-58.13265,-33.04057],[-58.34961,-33.26319],[-58.42707,-33.90945],[-58.49544,-34.43149],[-57.22583,-35.28803],[-57.36236,-35.97739],[-56.73749,-36.41313],[-56.78829,-36.90157],[-57.74916,-38.18387],[-59.23186,-38.72022],[-61.23745,-38.92842],[-62.33596,-38.82771],[-62.12576,-39.4241],[-62.33053,-40.17259],[-62.14599,-40.6769],[-62.7458,-41.02876],[-63.77049,-41.16679],[-64.73209,-40.80268],[-65.11804,-41.06432],[-64.97856,-42.058],[-64.30341,-42.35902],[-63.75595,-42.04369],[-63.45806,-42.56314],[-64.3788,-42.87356],[-65.1818,-43.49538],[-65.32882,-44.50137],[-65.56527,-45.03679],[-66.50997,-45.03963],[-67.29379,-45.5519],[-67.58055,-46.30177],[-66.59707,-47.03393],[-65.64103,-47.23613],[-65.98509,-48.13329],[-67.16618,-48.69734],[-67.81609,-49.86967],[-68.72875,-50.26422],[-69.13854,-50.73251],[-68.81556,-51.7711],[-68.15,-52.34998],[-68.57155,-52.29944],[-69.49836,-52.14276],[-71.9148,-52.00902],[-72.3294,-51.42596],[-72.30997,-50.67701],[-72.97575,-50.74145],[-73.32805,-50.37879],[-73.41544,-49.31844],[-72.64825,-48.87862],[-72.33116,-48.24424],[-72.44736,-47.73853],[-71.91726,-46.88484],[-71.55201,-45.56073],[-71.65932,-44.97369],[-71.22278,-44.78424],[-71.3298,-44.40752],[-71.79362,-44.20717],[-71.46406,-43.78761],[-71.91542,-43.40857],[-72.1489,-42.25489],[-71.7468,-42.05139],[-71.91573,-40.83234],[-71.68076,-39.80816],[-71.41352,-38.91602],[-70.81466,-38.553],[-71.11862,-37.57683],[-71.12188,-36.65812],[-70.36477,-36.00509],[-70.38805,-35.16969],[-69.81731,-34.19357],[-69.81478,-33.27389],[-70.0744,-33.09121],[-70.53507,-31.36501],[-69.91901,-30.33634],[-70.01355,-29.36792],[-69.65613,-28.45914],[-69.00123,-27.52121],[-68.29554,-26.89934],[-68.5948,-26.50691],[-68.386,-26.18502],[-68.41765,-24.51855],[-67.32844,-24.0253],[-66.98523,-22.98635],[-67.10667,-22.73593],[-66.27334,-21.83231],[-64.96489,-22.07586]]]]}},"bahia":{"id":"bahia","type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-46.26343,-11.52309],[-46.40625,-11.53923],[-46.51062,-11.50425],[-46.604,-11.3481],[-46.61224,-11.25653],[-46.46668,-11.1811],[-46.42822,-11.02208],[-46.32935,-10.9331],[-46.19751,-10.65521],[-45.84045,-10.47701],[-45.82672,-10.35275],[-45.74707,-10.34194],[-45.70038,-10.26087],[-45.72784,-10.15815],[-45.59326,-10.09326],[-45.41199,-10.43379],[-45.45593,-10.55262],[-45.37903,-10.72538],[-45.15381,-10.8387],[-44.90112,-10.90883],[-44.60999,-10.66601],[-44.34631,-10.54182],[-44.13757,-10.63362],[-44.05518,-10.39057],[-43.96179,-10.42839],[-43.78601,-10.15275],[-43.69263,-10.03918],[-43.69812,-9.95262],[-43.64868,-9.82274],[-43.76404,-9.76861],[-43.8794,-9.54117],[-43.68713,-9.41655],[-43.4729,-9.24851],[-43.3081,-9.37861],[-43.04443,-9.36235],[-42.8302,-9.60617],[-42.33581,-9.31899],[-41.90735,-9.23767],[-41.7865,-9.09125],[-41.40198,-8.71136],[-41.14929,-8.70593],[-41.03943,-8.83351],[-41.01471,-8.82808],[-40.92407,-8.83894],[-40.8197,-9.07226],[-40.68237,-9.14277],[-40.66864,-9.26478],[-40.7428,-9.30002],[-40.75653,-9.42197],[-40.62744,-9.47615],[-40.53131,-9.41384],[-40.47363,-9.39758],[-40.42694,-9.34338],[-40.36102,-9.37319],[-40.29785,-9.09396],[-40.23468,-9.04243],[-40.14679,-9.10481],[-40.07813,-9.05057],[-39.98749,-9.05599],[-39.8996,-8.95833],[-39.90509,-8.82808],[-39.68262,-8.77923],[-39.70459,-8.67063],[-39.65241,-8.65977],[-39.41345,-8.50769],[-39.2926,-8.54843],[-39.23492,-8.6299],[-38.96576,-8.76837],[-38.86963,-8.76837],[-38.71307,-8.83622],[-38.68835,-8.90678],[-38.66913,-8.98275],[-38.61694,-8.96376],[-38.60596,-8.86065],[-38.5675,-8.81723],[-38.47687,-8.84708],[-38.50983,-8.94205],[-38.42194,-9.037],[-38.33679,-8.97461],[-38.28461,-9.00716],[-38.31757,-9.06684],[-38.21045,-9.36235],[-38.04565,-9.4599],[-38.02368,-9.8498],[-37.89185,-9.96885],[-37.74902,-10.31492],[-37.8479,-10.37977],[-37.78198,-10.64981],[-37.93579,-10.73617],[-38.13354,-10.6822],[-38.26538,-10.79014],[-38.02368,-11.31848],[-37.73804,-11.57691],[-37.3645,-11.48002],[-38.50159,-18.11975],[-39.65515,-18.35453],[-40.25391,-17.96828],[-40.23193,-17.79053],[-40.61646,-17.38209],[-40.51758,-16.89917],[-40.13306,-16.45716],[-39.90234,-16.04581],[-40.68237,-15.68651],[-41.08887,-15.73939],[-41.35254,-15.73939],[-41.37451,-15.49603],[-41.80298,-15.09334],[-42.04468,-15.18878],[-43.24219,-14.67925],[-43.50586,-14.78551],[-43.92334,-14.63674],[-43.7915,-14.31761],[-44.35181,-14.24309],[-44.65942,-14.38148],[-45.78003,-15.13576],[-46.10962,-15.29478],[-46.06567,-14.87047],[-45.92285,-14.38148],[-46.24146,-14.14723],[-46.32935,-13.11158],[-46.38428,-12.02858],[-46.26343,-11.52309]]]}},"brazil":{"type":"Feature","id":"brazil","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-51.56433,4.29711],[-28.4491,1.04914],[-37.67761,-21.04862],[-52.94861,-34.05721],[-53.56384,-33.71063],[-53.58581,-33.23409],[-53.16833,-32.81036],[-54.11316,-32.08723],[-55.73914,-30.85036],[-56.11267,-31.18931],[-56.11267,-30.90694],[-57.0575,-30.14988],[-57.23328,-30.32073],[-57.73865,-30.26381],[-55.98083,-28.5411],[-54.94812,-27.68839],[-53.80554,-27.18136],[-53.7616,-26.73089],[-53.87146,-26.00249],[-54.20105,-25.88394],[-54.6405,-25.88394],[-54.28894,-24.13171],[-55.43701,-24.18685],[-55.87647,-22.3704],[-58.07373,-22.08564],[-58.24402,-20.06109],[-57.71668,-17.98396],[-58.43628,-17.18278],[-58.50769,-16.38866],[-60.1831,-16.29905],[-60.26001,-15.14637],[-60.49072,-14.09396],[-60.94116,-13.63531],[-61.85303,-13.5926],[-63.58887,-12.56529],[-64.22058,-12.55992],[-65.20386,-11.8996],[-65.4126,-9.74154],[-66.82983,-10.1203],[-68.17566,-10.92501],[-70.6366,-11.18379],[-70.6366,-9.62783],[-71.42761,-9.97426],[-72.74597,-9.88769],[-73.97644,-7.10634],[-72.70752,-4.67498],[-70.15869,-4.23686],[-69.67529,-1.03266],[-70.19714,1.75205],[-67.56042,1.83989],[-66.94519,0.69761],[-63.78113,1.83989],[-64.84131,4.36832],[-63.25378,3.59566],[-60.24353,5.20584],[-60.03479,4.98698],[-59.57886,3.81493],[-59.89746,3.26118],[-60.05676,2.76199],[-59.9469,2.2626],[-59.77661,2.23515],[-59.77661,1.75754],[-58.64502,1.55987],[-55.87647,2.61384],[-53.10791,2.35041],[-51.56433,4.29711]]]}},"chile":{"type":"Feature","id":"chile","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-110,-28],[-110,-26],[-109,-26],[-109,-28],[-110,-28]],[[-69.46999,-17.50394],[-69.67049,-17.66692],[-69.80164,-17.65253],[-69.83047,-17.71337],[-69.82704,-17.75196],[-69.80919,-17.8023],[-69.75494,-17.98135],[-69.82018,-18.1191],[-69.86618,-18.17325],[-69.96918,-18.26065],[-70.19165,-18.33106],[-72.5,-18.3],[-78,-53],[-68,-58],[-65.80412,-55.20392],[-67.30412,-54.90395],[-68.60412,-54.90395],[-68.60412,-52.65417],[-68.42212,-52.39063],[-68.42268,-52.33665],[-68.57786,-52.32931],[-68.58833,-52.31016],[-68.84205,-52.28181],[-69.19421,-52.15445],[-69.49016,-52.15561],[-70.00412,-52.00423],[-71.92097,-52.00391],[-71.95221,-51.97896],[-72.04212,-51.96756],[-71.93324,-51.91854],[-72.03255,-51.8118],[-72.32412,-51.60426],[-72.34531,-50.65403],[-73.32687,-50.52827],[-73.51742,-49.89065],[-72.98733,-48.99351],[-72.68005,-48.89271],[-72.53174,-48.77746],[-72.56195,-48.50569],[-72.24472,-48.34986],[-72.46788,-47.7451],[-72.0504,-47.34557],[-71.87325,-47.12505],[-71.9426,-46.81204],[-71.64974,-46.68289],[-71.82037,-46.1256],[-71.64459,-46.00936],[-71.75291,-45.55168],[-71.47104,-45.49829],[-71.54383,-45.40436],[-71.3895,-45.35287],[-71.33354,-45.28286],[-71.41148,-45.19486],[-71.56494,-44.98326],[-72.03323,-44.88409],[-72.03495,-44.76989],[-71.24908,-44.80425],[-71.07056,-44.47985],[-71.81213,-44.30714],[-71.58417,-43.64303],[-71.8856,-43.45765],[-71.72596,-43.19066],[-72.14344,-42.90363],[-72.04765,-42.54322],[-72.04182,-42.40546],[-72.17194,-42.14686],[-71.73051,-42.11516],[-71.92612,-40.72332],[-71.80252,-40.42081],[-71.70639,-40.425],[-71.66794,-40.30571],[-71.77643,-40.268],[-71.39465,-38.92843],[-70.90816,-38.67251],[-71.189,-37.74167],[-71.04858,-36.49087],[-70.95932,-36.50246],[-70.37876,-36.04743],[-70.43884,-35.32549],[-70.58441,-35.27646],[-70.53875,-35.20551],[-70.3791,-35.17241],[-69.87854,-34.15614],[-69.8703,-33.57458],[-69.78207,-33.33282],[-69.86721,-33.28663],[-69.99561,-33.3268],[-70.08453,-33.03716],[-70.3125,-32.12562],[-70.22736,-31.93934],[-70.46185,-31.84548],[-70.53102,-31.3724],[-70.07904,-30.38828],[-69.88678,-30.35747],[-69.81262,-30.14869],[-69.93347,-30.10118],[-69.94308,-29.24087],[-68.78609,-27.10803],[-68.56567,-27.17525],[-68.25256,-26.96492],[-68.57666,-26.49147],[-68.5437,-26.27987],[-68.37067,-26.17639],[-68.48328,-25.15399],[-68.32397,-25.09928],[-68.5437,-24.79047],[-68.46405,-24.62829],[-68.24432,-24.39338],[-67.32216,-24.03768],[-66.98639,-23.00012],[-67.17728,-22.81416],[-67.55768,-22.89642],[-67.81586,-22.86099],[-68.19489,-21.27018],[-68.405,-20.93964],[-68.53546,-20.8524],[-68.47504,-20.64949],[-68.72772,-20.46948],[-68.73322,-20.38454],[-68.67279,-20.34591],[-68.76549,-20.08237],[-68.56842,-20.05658],[-68.52997,-19.85262],[-68.68309,-19.72793],[-68.40225,-19.41091],[-68.92548,-18.97253],[-69.11087,-18.1328],[-69.06143,-18.06231],[-69.29352,-17.96698],[-69.30931,-17.9121],[-69.30794,-17.83956],[-69.34708,-17.7343],[-69.47205,-17.61065],[-69.46999,-17.50394]]]]}}};
23645
23646   var resources = {"osm-mg-facebook":{"id":"osm-mg-facebook","featureId":"madagascar","type":"facebook","name":"OpenStreetMap Madagascar Facebook Group","countryCodes":["mg"],"languageCodes":["mg","fr"],"description":"Malagasy Facebook group for people interested in OpenStreetMap.","url":"https://www.facebook.com/groups/1601381123461284/","contacts":[{"name":"Brice Ramamonjy","email":"rafaby21@gmail.com"},{"name":"Dolly Andriatsiferana","email":"privatemajory@gmail.com"}]},"talk-mg":{"id":"talk-mg","featureId":"madagascar","type":"mailinglist","countryCodes":["mg"],"languageCodes":["mg","fr"],"name":"Talk-mg Mailing List","description":"Place for OpenStreetMap contributors, communities and users in Madagascar to share and discuss.","url":"https://lists.openstreetmap.org/listinfo/talk-mg","contacts":[{"name":"Brice Ramamonjy","email":"rafaby21@gmail.com"},{"name":"Dolly Andriatsiferana","email":"privatemajory@gmail.com"}]},"OSM-BGD-facebook":{"id":"OSM-BGD-facebook","featureId":"BGD","type":"facebook","name":"OpenStreetMap Bangladesh","description":"Improve OpenStreetMap in Bangladesh","extendedDescription":"Mapping in Bangladesh? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!","url":"https://www.facebook.com/groups/osmbd/","contacts":[{"name":"Ahasanul Hoque","email":"hoque.ahasan@gmail.com"}]},"OSM-India-facebook":{"id":"OSM-India-facebook","featureId":"india_full","type":"facebook","name":"OpenStreetMap India - Participatory neighborhood mapping","description":"Improve OpenStreetMap in India","extendedDescription":"Mapping in India? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!","url":"https://www.facebook.com/groups/mappingindia/","contacts":[{"name":"Jinal Foflia","email":"fofliajinal@gmail.com"},{"name":"Arun Ganesh","email":"arun.planemad@gmail.com"}]},"OSM-india-mailinglist":{"id":"OSM-india-mailinglist","featureId":"india_full","type":"mailinglist","name":"OpenStreetMap India Mailinglist","description":"Talk-in is the official Mailinglist for Indian Community","url":"https://lists.openstreetmap.org/listinfo/talk-in","contacts":[{"name":"Arun Ganesh","email":"arun.planemad@gmail.com"}]},"OSM-india-twitter":{"id":"OSM-india-twitter","featureId":"india_full","type":"twitter","name":"OpenStreetMap India Twitter","description":"We are just a tweet away: {url}","url":"https://twitter.com/osm_in","contacts":[{"name":"Jinal Foflia","email":"fofliajinal@gmail.com"}]},"OSM-IDN-facebook":{"id":"OSM-IDN-facebook","featureId":"IDN","type":"facebook","name":"OpenStreetMap Indonesia","description":"Improve OpenStreetMap in Indonesia","extendedDescription":"Mapping in Indonesia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!","url":"https://www.facebook.com/groups/osm.id/","contacts":[{"name":"Yantisa Akhadi","email":"yantisa.akhadi@hotosm.org"}]},"OSM-japan-facebook":{"id":"OSM-japan-facebook","featureId":"japan","type":"facebook","name":"OpenStreetMap Japan Community","countryCodes":["jp"],"languageCodes":["jp"],"description":"Mappers and OpenStreetMap users in Japan","url":"https://www.facebook.com/groups/osmjapan/","contacts":[{"name":"Satoshi IIDA","email":"nyampire@gmail.com"}]},"OSM-japan-mailinglist":{"id":"OSM-japan-mailinglist","featureId":"japan","type":"mailinglist","name":"OpenStreetMap Japan Mailinglist","countryCodes":["jp"],"languageCodes":["jp"],"description":"Talk-ja is an Official Mailinglist for Japanese Community","url":"https://lists.openstreetmap.org/listinfo/talk-ja","contacts":[{"name":"OSMF Japan","email":"info@osmf.jp"}]},"OSM-japan-twitter":{"id":"OSM-japan-twitter","featureId":"japan","type":"twitter","name":"OpenStreetMap Japan Twitter","countryCodes":["jp"],"languageCodes":["jp"],"description":"Hashtag on Twitter: {url}","url":"https://twitter.com/hashtag/osmjp","contacts":[{"name":"Satoshi IIDA","email":"nyampire@gmail.com"}]},"OSM-MNG-facebook":{"id":"OSM-MNG-facebook","featureId":"MNG","type":"facebook","name":"OpenStreetMap Mongolia","description":"Improve OpenStreetMap in Mongolia","extendedDescription":"Mapping in Mongolia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!","url":"https://www.facebook.com/groups/OSM.Mongolia/","contacts":[{"name":" ","email":"talk-mn@openstreetmap.org"}]},"OSM-Nepal-facebook":{"id":"OSM-Nepal-facebook","featureId":"NPL","type":"facebook","name":"OpenStreetMap Nepal","description":"Improve OpenStreetMap in Nepal","extendedDescription":"Mapping in Nepal? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!","url":"https://www.facebook.com/groups/mapkathmandu/","contacts":[{"name":"Kshitiz Khanal","email":"khanal1990@gmail.com"}]},"OSM-PH-facebook":{"id":"OSM-PH-facebook","featureId":"philippines","type":"facebook","countryCodes":["ph"],"name":"OpenStreetMap PH Facebook","description":"Welcome to OpenStreetMap Philippines, where we encourage all fellow Filipinos to contribute to the OpenStreetMap project.","url":"https://www.facebook.com/OSMPH/","contacts":[{"name":"Maning Sambale","email":"emmanuel.sambale@gmail.com"},{"name":"OSM PH Group","email":"osm.pilipinas@gmail.com"}]},"OSM-PH-mailinglist":{"id":"OSM-PH-mailinglist","featureId":"philippines","type":"mailinglist","countryCodes":["ph"],"name":"Talk-ph Mailing List","description":"A mailing list to discuss OpenStreetMap in the Philippines","url":"https://lists.openstreetmap.org/pipermail/talk-ph/","contacts":[{"name":"Maning Sambale","email":"emmanuel.sambale@gmail.com"},{"name":"OSM PH Group","email":"osm.pilipinas@gmail.com"}]},"OSM-PH-slack":{"id":"OSM-PH-slack","featureId":"philippines","type":"slack","countryCodes":["ph"],"name":"OpenStreetMap PH Slack","description":"All are welcome! Sign up at {signupUrl}","signupUrl":"https://osmph-chat.herokuapp.com/","url":"https://osmph.slack.com","contacts":[{"name":"Maning Sambale","email":"emmanuel.sambale@gmail.com"},{"name":"OSM PH Group","email":"osm.pilipinas@gmail.com"}]},"OSM-PH-telegram":{"id":"OSM-PH-telegram","featureId":"philippines","type":"telegram","countryCodes":["ph"],"name":"OpenStreetMap PH Telegram","description":"Un-official, Telegram local community of OpenStreetMap contributors and friends in the Philippines","url":"https://t.me/osmph","contacts":[{"name":"Maning Sambale","email":"emmanuel.sambale@gmail.com"},{"name":"OSM PH Group","email":"osm.pilipinas@gmail.com"}]},"OSM-RU-forum":{"id":"OSM-RU-forum","type":"forum","featureId":"russia","countryCodes":["ru"],"languageCodes":["ru"],"name":"OpenStreetMap RU forum","description":"OpenStreetMap Russia web forum","url":"https://forum.openstreetmap.org/viewforum.php?id=21","contacts":[{"name":"Ilya Zverev","email":"ilya@zverev.info"}]},"OSM-RU-telegram":{"id":"OSM-RU-telegram","type":"telegram","featureId":"russia","countryCodes":["ru"],"languageCodes":["ru"],"name":"OpenStreetMap RU telegram","description":"OpenStreetMap Russia telegram chat","url":"https://t.me/ruosm","contacts":[{"name":"Ilya Zverev","email":"ilya@zverev.info"}]},"OSM-LKA-facebook":{"id":"OSM-LKA-facebook","featureId":"LKA","type":"facebook","name":"OpenStreetMap Sri Lanka","description":"Improve OpenStreetMap in Sri Lanka","extendedDescription":"Mapping in Sri Lanka? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!","url":"https://www.facebook.com/groups/142058222659672/","contacts":[{"name":"Karan Suthakaran","email":"karansuthakaran@yahoo.com"}]},"OSM-TW-facebook":{"id":"OSM-TW-facebook","featureId":"taiwan","type":"facebook","name":"OpenStreetMap Taiwan Community","countryCodes":["tw"],"languageCodes":["zh-tw"],"description":"Facebook Group for Mappers and OpenStreetMap users to discuss matters about Taiwan.","url":"https://www.facebook.com/groups/OpenStreetMap.TW/","contacts":[{"name":"Nobody 沒有人 (Public mail)","email":"hiboard@openstreetmap.tw"}]},"OSM-TW-mailinglist":{"id":"OSM-TW-mailinglist","featureId":"taiwan","type":"mailinglist","name":"OpenStreetMap Taiwan Mailinglist","countryCodes":["tw"],"languageCodes":["zh-tw","en"],"description":"Talk-tw is an Official Mailinglist for the Communities to dicuss matters about Taiwan","url":"https://lists.openstreetmap.org/listinfo/talk-tw","contacts":[{"name":"Nobody 沒有人 (Public email)","email":"hiboard@openstreetmap.tw"}]},"at-mailinglist":{"id":"at-mailinglist","featureId":"austria","type":"mailinglist","name":"Talk-at Mailing List","countryCodes":["at"],"languageCodes":["de"],"description":"Talk-at is the official mailing list for the Austrian OSM community","url":"https://lists.openstreetmap.org/listinfo/talk-at","contacts":[{"name":"AT community","email":"info@openstreetmap.at"}]},"at-twitter":{"id":"at-twitter","featureId":"austria","type":"twitter","name":"OpenStreetMap Austria Twitter","countryCodes":["at"],"languageCodes":["de"],"description":"OpenStreetMap Austria On Twitter: {url}","url":"https://twitter.com/osm_at","contacts":[{"name":"AT Community","email":"info@openstreetmap.at"}]},"osm-at":{"id":"osm-at","featureId":"austria","type":"group","countryCodes":["at"],"languageCodes":["de"],"name":"OpenStreetMap Austria","description":"The platform for information on OpenStreetMap in Austria","url":"https://www.openstreetmap.at/","contacts":[{"name":"AT community","email":"info@openstreetmap.at"}]},"be-facebook":{"id":"be-facebook","featureId":"belgium","type":"facebook","name":"OpenStreetMap BE Community","countryCodes":["be"],"languageCodes":["en","nl","fr","de"],"description":"Mappers and OpenStreetMap facebook in Belgium","url":"https://www.facebook.com/groups/1419016881706058/","contacts":[{"name":"BE community","email":"community@osm.be"}]},"be-forum":{"id":"be-forum","type":"forum","featureId":"belgium","countryCodes":["be"],"languageCodes":["en","nl","fr","de"],"name":"OpenStreetMap BE forum","description":"OpenStreetMap Belgium web forum","url":"https://forum.openstreetmap.org/viewforum.php?id=29","contacts":[{"name":"BE community","email":"community@osm.be"}]},"be-irc":{"id":"be-irc","featureId":"belgium","type":"irc","name":"OpenStreetMap Belgium IRC","countryCodes":["be"],"languageCodes":["en","nl","fr","de"],"description":"Join #osmbe on irc.oftc.net (port 6667)","extendedDescription":"Join #osmbe on irc.oftc.net (port 6667), it is bridged with the matrix chat channel","url":"http://en.irc2go.com/webchat/?net=OFTC&room=osmbe","contacts":[{"name":"BE community","email":"community@osm.be"}]},"be-mailinglist":{"id":"be-mailinglist","featureId":"belgium","type":"mailinglist","name":"Talk-be Mailing List","countryCodes":["be"],"languageCodes":["en","nl","fr","de"],"description":"Talk-be is the official mailing list for Belgian OSM community","url":"https://lists.openstreetmap.org/listinfo/talk-be","contacts":[{"name":"BE community","email":"community@osm.be"}]},"be-matrix":{"id":"be-matrix","featureId":"be_full","type":"matrix","countryCodes":["be"],"languageCodes":["en","nl","fr","de"],"name":"OpenStreetMap BE Riot channel","description":"All mappers are welcome! Sign up at {signupUrl}","extendedDescription":"Multiple channels exists, for beginners to thematic channels, landuse and dev talk","signupUrl":"https://riot.im/app/#/register","url":"https://riot.im","contacts":[{"name":"BE community","email":"community@osm.be"}]},"be-twitter":{"id":"be-twitter","featureId":"belgium","type":"twitter","name":"OpenStreetMap Belgium Twitter","countryCodes":["be"],"languageCodes":["en","nl","fr","de"],"description":"OSM Belgium On Twitter: {url}","url":"https://twitter.com/osm_be","contacts":[{"name":"BE community","email":"community@osm.be"}]},"byosm":{"id":"byosm","type":"telegram","featureId":"belarus","languageCodes":["ru","be","en"],"name":"OpenStreetMap Belarus","description":"OpenStreetMap Belarus telegram chat","url":"https://t.me/byosm","contacts":[{"name":"Darafei Praliaskouski","email":"me@komzpa.net"}]},"talk-cz-mailinglist":{"id":"talk-cz-mailinglist","featureId":"czechia","type":"mailinglist","name":"Talk-cz Mailing List","countryCodes":["cz"],"languageCodes":["cs","sk","en"],"description":"Talk-cz is the official mailing list for Czech community","url":"https://lists.openstreetmap.org/listinfo/talk-cz","contacts":[{"name":"osmcz","email":"dev@openstreetmap.cz"}]},"de-forum":{"id":"de-forum","featureId":"germany","type":"forum","countryCodes":["de"],"languageCodes":["de"],"name":"OpenStreetMap DE forum","description":"OpenStreetMap Germany web forum","url":"https://forum.openstreetmap.org/viewforum.php?id=14","contacts":[{"name":"FOSSGIS e.V.","email":"info@fossgis.de"}]},"de-irc":{"id":"de-irc","featureId":"germany","type":"irc","name":"OpenStreetMap Germany IRC","countryCodes":["de"],"languageCodes":["de"],"description":"Join #osm-de on irc.oftc.net (port 6667)","url":"http://de.irc2go.com/webchat/?net=OFTC&room=osm-de","contacts":[{"name":"FOSSGIS e.V.","email":"info@fossgis.de"}]},"de-mailinglist":{"id":"de-mailinglist","featureId":"germany","type":"mailinglist","name":"Talk-de Mailing List","countryCodes":["de"],"languageCodes":["de"],"description":"Talk-de is the official mailing list for the German OSM community","url":"https://lists.openstreetmap.org/listinfo/talk-de","contacts":[{"name":"FOSSGIS e.V.","email":"info@fossgis.de"}]},"osm-de":{"id":"osm-de","featureId":"germany","type":"group","countryCodes":["de"],"languageCodes":["de"],"name":"OpenStreetMap Germany","description":"The platform for information on OpenStreetMap in Germany","url":"https://www.openstreetmap.de/","contacts":[{"name":"FOSSGIS e.V.","email":"info@fossgis.de"}]},"OSM-ES-telegram":{"id":"OSM-ES-telegram","type":"telegram","featureId":"spain","languageCodes":["es"],"name":"@OSMes on Telegram","description":"OpenStreetMap Spain Telegram chat","url":"https://t.me/OSMes","contacts":[{"name":"Jorge Sanz","email":"sanchi2@gmail.com"}]},"OSM-Rome-meetup":{"id":"OSM-Rome-meetup","featureId":"IT_Roma_Capitale","type":"group","name":"Incontro Mappatori Romani","countryCodes":["it"],"languageCodes":["it"],"description":"Improve OpenStreetMap in the Rome area","extendedDescription":"We aim to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Lazio.","url":"https://wiki.openstreetmap.org/wiki/Rome/Incontro","contacts":[{"name":"Martin Koppenhoefer","email":"dieterdreist@gmail.com"}]},"talk-it-lazio":{"id":"talk-it-lazio","featureId":"IT_Lazio","type":"mailinglist","countryCodes":["it"],"languageCodes":["it"],"name":"OpenStreetMap IT Lazio","description":"All are welcome! Sign up at {signupUrl}","extendedDescription":"Mailinglist for Rome and Lazio area.","signupUrl":"https://lists.openstreetmap.org/listinfo/talk-it-lazio","url":"https://lists.openstreetmap.org/listinfo/talk-it-lazio","contacts":[{"name":"Martin Koppenhoefer","email":"dieterdreist@gmail.com"}]},"OSM-CA-Slack":{"id":"OSM-CA-Slack","featureId":"canada_full","type":"slack","countryCodes":["ca"],"languageCodes":["en","fr"],"name":"OSM-CA Slack","description":"All are welcome! Sign up at {signupUrl}.","signupUrl":"https://slackinviteosmcanada.herokuapp.com/","url":"https://osm-ca.slack.com/","contacts":[{"name":"Denis Carriere","email":"carriere.denis@gmail.com"}]},"OSM-Vancouver-meetup":{"id":"OSM-Vancouver-meetup","featureId":"vancouver_metro","type":"meetup","name":"OpenStreetMap Vancouver","countryCodes":["ca"],"languageCodes":["en"],"description":"Mappers and OpenStreetMap users in the Vancouver, BC area","url":"https://www.meetup.com/OpenStreetMap-Vancouver/","contacts":[{"name":"Paul Norman","email":"penorman@mac.com"},{"name":"Peter Chin","email":"bpchin@gmail.com"}],"events":[{"name":"April Metrotown Mappy Hour","description":"Mappy Hour is the time and place for discussion of OpenStreetMap, from surveying data to consuming data. Beginners welcome. Bring your questions.","when":"2018-04-27 18:30","where":"Firefighters' Public House, 6515 Bonsor Avenue, Burnaby, BC","url":"https://www.meetup.com/OpenStreetMap-Vancouver/events/qzsbsmyxgbkc/"}]},"Bay-Area-OpenStreetMappers":{"id":"Bay-Area-OpenStreetMappers","featureId":"sf_bay_area","type":"meetup","name":"Bay Area OpenStreetMappers","countryCodes":["us"],"languageCodes":["en"],"description":"Improve OpenStreetMap in the Bay Area","extendedDescription":"This group is about growing the OpenStreetMap community here in the Bay Area. Our events are open to everyone, from open source enthusiasts, cyclists, GIS professionals, geocachers, and beyond. Anyone and everyone who is interested in maps, map making and free map data is welcome to join our group as well as attend our events.","url":"https://www.meetup.com/Bay-Area-OpenStreetMappers/","contacts":[{"name":"Ben Discoe","email":"bdiscoe@gmail.com"}]},"Central-Pennsylvania-OSM":{"id":"Central-Pennsylvania-OSM","featureId":"central_pa","type":"facebook","name":"Central Pennsylvania OSM","countryCodes":["us"],"languageCodes":["en"],"description":"Online mapping community based out of State College, PA","url":"https://www.facebook.com/CentralPennsylvaniaOSM","contacts":[{"name":"Sterling Quinn","email":"sdq107@psu.edu"}]},"Code-for-San-Jose-Slack":{"id":"Code-for-San-Jose-Slack","featureId":"south_sf_bay_area","type":"slack","countryCodes":["us"],"languageCodes":["en"],"name":"Code for San Jose Slack","description":"All are welcome! Sign up at {signupUrl}, then join the #osm channel.","signupUrl":"https://slackin-c4sj.herokuapp.com/","url":"https://codeforsanjose.slack.com/","contacts":[{"name":"OSM Bay Area mailing list","email":"talk-us-sfbay@openstreetmap.org"}]},"Dallas-Fort-Worth-OSM":{"id":"Dallas-Fort-Worth-OSM","featureId":"dfw_metro","type":"group","name":"Dallas-Fort Worth OSM","countryCodes":["us"],"languageCodes":["en"],"description":"The OpenStreetMap user group for Dallas-Fort Worth","extendedDescription":"Dallas, Fort Worth, and all the cities in between are abounding with creative and tech-savvy people. The vision for this usergroup is to find new ways to use the amazing resource of OSM.","url":"http://dfwosm.org/","contacts":[{"name":"Andrew Matheny","email":"andrewdmatheny@gmail.com"}]},"GeoPhilly":{"id":"GeoPhilly","featureId":"philly_metro","type":"meetup","name":"GeoPhilly","countryCodes":["us"],"languageCodes":["en"],"description":"Meetup for map enthusiasts in the Philadelphia area","extendedDescription":"GeoPhilly unites developers, geographers, data geeks, open source enthusiasts, civic hackers and map addicts in our shared love of maps and the stories they tell. If you use maps as part of your work or just want to learn more, this is the meetup for you!  Our events aim to be open, friendly, educational and social and range from happy hours to lightning talks or even workshops. Come create a diverse, inspiring geospatial community in the Philadelphia with us!","url":"https://www.meetup.com/GeoPhilly/","contacts":[{"name":"Dan Ford","email":"dford@azavea.com"}]},"MapMinnesota":{"id":"MapMinnesota","featureId":"minneapolis_st_paul_metro","type":"meetup","name":"MapMinnesota","countryCodes":["us"],"languageCodes":["en"],"description":"Mappers and OpenStreetMap enthusiasts in the Twin Cities area","extendedDescription":"Connecting OpenStreetMap enthusiasts in Minnesota and the Twin Cities!","url":"https://www.meetup.com/Map-Minnesota/","contacts":[{"name":"Ian Dees","email":"ian.dees@gmail.com"}]},"Mapping-DC-meetup":{"id":"Mapping-DC-meetup","featureId":"dc_metro","type":"meetup","name":"Mapping DC","countryCodes":["us"],"languageCodes":["en"],"description":"Improve OpenStreetMap in the DC area","extendedDescription":"We are a group of volunteer mappers who aim to improve the OpenStreetMap in the DC area. We also aim to teach others about the OSM ecosystem, data analytics, cartography, and GIS. We gather every other month at meetups to focus on one area of our city.","url":"https://mappingdc.org/","contacts":[{"name":"Brian DeRocher","email":"brian@derocher.org"}],"events":[{"name":"April Meetup","description":"Meets every other month on the 2nd Tuesday","when":"2018-04-10 18:00","where":"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC","url":"https://www.meetup.com/MappingDC/events/qqvnvhyxgbnb/"},{"name":"June Meetup","description":"Meets every other month on the 2nd Tuesday","when":"2018-06-12 18:00","where":"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC","url":"https://www.meetup.com/MappingDC/events/qqvnvhyxjbqb/"},{"name":"August Meetup","description":"Meets every other month on the 2nd Tuesday","when":"2018-08-14 18:00","where":"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC","url":"https://www.meetup.com/MappingDC/events/qqvnvhyxlbsb/"},{"name":"October Meetup","description":"Meets every other month on the 2nd Tuesday","when":"2018-10-09 18:00","where":"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC","url":"https://www.meetup.com/MappingDC/events/qqvnvhyxnbmb/"}]},"Maptime-ME-meetup":{"id":"Maptime-ME-meetup","featureId":"portland_me","type":"meetup","name":"MaptimeME","countryCodes":["us"],"languageCodes":["en"],"description":"Mappers and OpenStreetMap users, around Portland, ME","extendedDescription":"Maptime is, rather literally, time for mapmaking.  Our mission is to open the doors of cartographic possibility to anyone interested by creating a time and space for collaborative learning, exploration, and map creation using mapping tools and technologies.","url":"https://www.meetup.com/MaptimeME/","contacts":[{"name":"Malcolm Toon","email":"malcolm@foreflight.com"}]},"OpenCleveland-meetup":{"id":"OpenCleveland-meetup","featureId":"cleveland","type":"meetup","name":"Open Cleveland","countryCodes":["us"],"languageCodes":["en"],"description":"Improve OpenStreetMap in the Cleveland area","extendedDescription":"Open Geo Cleveland aims to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Northeast Ohio. We're also a maptime chapter =)","url":"https://www.meetup.com/open-cleveland/","contacts":[{"name":"Will Skora","email":"skorasaurus@gmail.com"},{"name":"Anastasia Diamond-Ortiz","email":"anastasia.diamond@gmail.com"}],"events":[{"name":"Wednesday Meetup / Hack Night","description":"Meets weekly - programming experience is not necessary!","when":"2018-04-18 18:00","where":"The Tech Hive, 6815 Euclid Ave, Cleveland, OH","url":"https://www.meetup.com/open-cleveland/events/lcjdnpyxgbxb/"},{"name":"Wednesday Meetup / Hack Night","description":"Meets weekly - programming experience is not necessary!","when":"2018-04-25 18:00","where":"The Tech Hive, 6815 Euclid Ave, Cleveland, OH","url":"https://www.meetup.com/open-cleveland/events/lcjdnpyxgbhc/"},{"name":"Wednesday Meetup / Hack Night","description":"Meets weekly - programming experience is not necessary!","when":"2018-05-02 18:00","where":"The Tech Hive, 6815 Euclid Ave, Cleveland, OH","url":"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbdb/"},{"name":"Wednesday Meetup / Hack Night","description":"Meets weekly - programming experience is not necessary!","when":"2018-05-09 18:00","where":"The Tech Hive, 6815 Euclid Ave, Cleveland, OH","url":"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbmb/"},{"name":"Wednesday Meetup / Hack Night","description":"Meets weekly - programming experience is not necessary!","when":"2018-05-16 18:00","where":"The Tech Hive, 6815 Euclid Ave, Cleveland, OH","url":"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbvb/"},{"name":"Wednesday Meetup / Hack Night","description":"Meets weekly - programming experience is not necessary!","when":"2018-05-23 18:00","where":"The Tech Hive, 6815 Euclid Ave, Cleveland, OH","url":"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbfc/"},{"name":"Wednesday Meetup / Hack Night","description":"Meets weekly - programming experience is not necessary!","when":"2018-05-30 18:00","where":"The Tech Hive, 6815 Euclid Ave, Cleveland, OH","url":"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbnc/"}]},"OSM-Boston":{"id":"OSM-Boston","featureId":"boston_metro","type":"meetup","name":"OpenStreetMap Boston","countryCodes":["us"],"languageCodes":["en"],"description":"Mappers and OpenStreetMap users in the Boston area","extendedDescription":"OpenStreetMap is the free and open, wiki-style map of the world, with hundreds of thousands of contributions every day from people like you. Editing the map is simple, and fun! Join us both indoors and outdoors in our effort to create the best map of the Boston area and the rest of the world!","url":"https://www.meetup.com/OpenStreetMap-Boston/","contacts":[{"name":"Lars Ahlzen","email":"lars@ahlzen.com"}]},"OSM-Central-Salish-Sea":{"id":"OSM-Central-Salish-Sea","featureId":"mt_vernon_wa","type":"meetup","name":"OpenStreetMap Central Salish Sea","countryCodes":["us"],"languageCodes":["en"],"description":"Mappers and OpenStreetMap users around Mount Vernon, WA","extendedDescription":"OpenStreetMap is an map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more. We meet all the time to talk maps, make maps and have fun!","url":"https://www.meetup.com/OpenStreetMap-Central-Salish-Sea/","contacts":[{"name":"Clifford Snow","email":"clifford@snowandsnow.us"}]},"OSM-Chattanooga":{"id":"OSM-Chattanooga","featureId":"chattanooga","type":"facebook","name":"OSM Chattanooga","countryCodes":["us"],"languageCodes":["en"],"description":"The OpenStreetMap user group for Chattanooga","url":"https://www.facebook.com/groups/123483951073256","contacts":[{"name":"Jenny Park","email":"tennessee@tpl.org"},{"name":"Randal Hale","email":"rjhale@northrivergeographic.com"}]},"OSM-Colorado":{"id":"OSM-Colorado","featureId":"colorado","type":"meetup","name":"OpenStreetMap Colorado","countryCodes":["us"],"languageCodes":["en"],"description":"Mappers and OpenStreetMap users in the state of Colorado, USA","extendedDescription":"OpenStreetMap (OSM) Colorado is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties.","url":"https://www.meetup.com/OSM-Colorado/","contacts":[{"name":"Russell Deffner","email":"russdeffner@gmail.com"}]},"OSM-NYC":{"id":"OSM-NYC","featureId":"nyc_metro","type":"meetup","name":"OpenStreetMap NYC","countryCodes":["us"],"languageCodes":["en"],"description":"Mappers and OpenStreetMap users, developers and enthusiasts in the New York Metropolitan area","url":"https://www.meetup.com/osm-nyc/","contacts":[{"name":"Jeff Ferzoco","email":"jferzoco@carto.com"}]},"OSM-Portland":{"id":"OSM-Portland","featureId":"portland_or","type":"meetup","name":"OpenStreetMap Portland","countryCodes":["us"],"languageCodes":["en"],"description":"Mappers and OpenStreetMap users in the Portland area","extendedDescription":"OpenStreetMap (OSM) is a map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more, and come join us at a meetup to talk maps, contribute to OSM, and have fun!","url":"https://www.meetup.com/OpenStreetMap-Portland/","contacts":[{"name":"Madeline Steele","email":"madeline.steele@gmail.com"}]},"OSM-Seattle":{"id":"OSM-Seattle","featureId":"seattle","type":"meetup","name":"OpenStreetMap Seattle","countryCodes":["us"],"languageCodes":["en"],"description":"Mappers and OpenStreetMap users in the Seattle area","url":"https://www.meetup.com/OpenStreetMap-Seattle/","contacts":[{"name":"Clifford Snow","email":"clifford@snowandsnow.us"},{"name":"Chase Stephens","email":"seattlefyi@gmail.com"},{"name":"Paul McCombs","email":"pablo@imperium.org"}]},"OSM-SoCal":{"id":"OSM-SoCal","featureId":"la_metro","type":"meetup","name":"OpenStreetMap Southern California","countryCodes":["us"],"languageCodes":["en"],"description":"Let's have some fun, contribute something to Los Angeles, and learn about mapping!","extendedDescription":"OpenStreetMap (OSM) Southern California is for anyone interested in mapping to get together to work with OpenStreetMap.  OpenStreetMap, the Wikipedia of maps, is a free open-source map of the world being created by more than 1,000,000 volunteers around the globe.  Everyone is welcome.  If you don't know OpenStreetMap, we'll teach you. If you have an idea for a mapping project or even a field trip that the group can do, great!","url":"https://www.meetup.com/OSM-Southern-California/","contacts":[{"name":"Charlotte Wolter","email":"techlady@techlady.com"}]},"OSM-South-Bay":{"id":"OSM-South-Bay","featureId":"south_sf_bay_area","type":"meetup","name":"OSM South Bay","countryCodes":["us"],"languageCodes":["en"],"description":"Map Nights hosted by Code for San Jose","extendedDescription":"Code for San Jose, the local Code for America brigade, hosts monthly Map Nights on Thursday nights in downtown San José. Meet fellow South Bay mappers, help out with local mapping projects, and hear about other civic tech projects. Programming and GIS skills are not required.","url":"https://www.meetup.com/Code-for-San-Jose/","contacts":[{"name":"OSM Bay Area mailing list","email":"talk-us-sfbay@openstreetmap.org"}]},"OSM-Tampa-Bay":{"id":"OSM-Tampa-Bay","featureId":"tampa_bay","type":"meetup","name":"OpenStreetMap Tampa Bay","countryCodes":["us"],"languageCodes":["en"],"description":"Mappers and OpenStreetMap users in the Tampa Bay area","extendedDescription":"OSM Tampa Bay group for local residents to get together and build out the definitive map of Tampa Bay with OpenStreetMap, the free and editable map of the world.  If you're into maps, data, open source, GPS, hiking, cycling, et cetera, you'll love working with OpenStreetMap -- so join in! We'll get together and map and talk about new topics once-a-month or so.","url":"https://www.meetup.com/osmtampabay/","contacts":[{"name":"Coleman McCormick","email":"cmccormick@gmail.com"}]},"OSM-US-Slack":{"id":"OSM-US-Slack","featureId":"usa_full","type":"slack","countryCodes":["us"],"languageCodes":["en"],"name":"OpenStreetMap US Slack","description":"All are welcome! Sign up at {signupUrl}","signupUrl":"https://osmus-slack.herokuapp.com/","url":"https://osmus.slack.com","contacts":[{"name":"Ian Dees","email":"ian@openstreetmap.us"},{"name":"Clifford Snow","email":"clifford@snowandsnow.us"}]},"OSM-US":{"id":"OSM-US","featureId":"usa_full","type":"group","countryCodes":["us"],"languageCodes":["en"],"name":"OpenStreetMap US","description":"We help grow and improve OpenStreetMap in the United States.","extendedDescription":"We support OpenStreetMap by holding annual conferences, providing community resources, building partnerships, and by spreading the word. Join OpenStreetMap US here: {signupUrl}","signupUrl":"https://www.openstreetmap.us/join","url":"https://www.openstreetmap.us/","contacts":[{"name":"Ian Dees","email":"ian@openstreetmap.us"},{"name":"Bryan Housel","email":"bryan@openstreetmap.us"}]},"OSM-Utah":{"id":"OSM-Utah","featureId":"salt_lake_city","type":"meetup","name":"OpenStreetMap Utah","countryCodes":["us"],"languageCodes":["en"],"description":"Mappers and OpenStreetMap users in the Salt Lake City area","extendedDescription":"Activities may include things like Learn To Map workshops, mapping parties and outdoor data collection. The events will take place in the SLC area, at least initially.  We are looking for seasoned mappers as well as people new to OSM. Join and let's do some mapping!","url":"https://www.meetup.com/OpenStreetMap-Utah/","contacts":[{"name":"Martijn van Exel","email":"m@rtijn.org"}]},"OSM-Wyoming":{"id":"OSM-Wyoming","featureId":"wyoming","type":"meetup","name":"OpenStreetMap Wyoming","countryCodes":["us"],"languageCodes":["en"],"description":"Mappers and OpenStreetMap users in the state of Wyoming","extendedDescription":"OpenStreetMap (OSM) Wyoming is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties.","url":"https://www.meetup.com/OSM-Wyoming/","contacts":[{"name":"Russell Deffner","email":"russdeffner@gmail.com"}]},"PHXGeo-meetup":{"id":"PHXGeo-meetup","featureId":"phoenix","type":"meetup","name":"PHXGeo Meetup","countryCodes":["us"],"languageCodes":["en"],"description":"Mappers and OpenStreetMap users in the Phoenix, AZ area","extendedDescription":"This is a meetup group for those in the Phoenix area who like maps, GIS, OpenStreetMap, cartography and anything in between.","url":"https://www.meetup.com/PHXGeo/","contacts":[{"name":"Ryan Arp","email":"ryan@arpconsultinggroup.com"}]},"PHXGeo-twitter":{"id":"PHXGeo-twitter","featureId":"phoenix","type":"twitter","name":"PHXGeo Twitter","countryCodes":["us"],"languageCodes":["en"],"description":"Follow us on Twitter at {url}","url":"https://twitter.com/phxgeo","contacts":[{"name":"Ryan Arp","email":"ryan@arpconsultinggroup.com"}]},"Western-Slope-facebook":{"id":"Western-Slope-facebook","featureId":"grand_junction_co","type":"facebook","name":"Western Slope OSM Facebook","countryCodes":["us"],"languageCodes":["en"],"description":"Mappers and OpenStreetMap users around Grand Junction, CO","url":"https://www.facebook.com/wsosm/","contacts":[{"name":"Aaron Young","email":"aaron@kaartgroup.com"}]},"Western-Slope-meetup":{"id":"Western-Slope-meetup","featureId":"grand_junction_co","type":"meetup","name":"Western Slope OSM Meetup","countryCodes":["us"],"languageCodes":["en"],"description":"Mappers and OpenStreetMap users around Grand Junction, CO","extendedDescription":"The goal of this group is to introduce OpenStreetMap to the community, develop a community of mappers, create the most amazing geodata possible using whatever method we can and finally strategize in order to get this data out into our community. Imagine accurate trail signage! Imagine further development of bike paths! Imagine anything you want, that's the joy of OpenStreetMap!","url":"https://www.meetup.com/Western-Slope-OpenStreetMap/","contacts":[{"name":"Aaron Young","email":"aaron@kaartgroup.com"}]},"Maptime-Australia-Slack":{"id":"Maptime-Australia-Slack","featureId":"australia_full","type":"slack","countryCodes":["au"],"languageCodes":["en"],"name":"Maptime Australia Slack","description":"Sign up at {signupUrl}","signupUrl":"https://bit.ly/maptimeau","url":"https://maptimeaustralia.slack.com","contacts":[{"name":"David Dean","email":"ddean@ieee.org"},{"name":"Philip Mallis","email":"philip.mallis@unimelb.edu.au"},{"name":"Edoardo Neerhut","email":"ed@mapillary.com"}]},"talk-au":{"id":"talk-au","featureId":"australia_full","type":"mailinglist","countryCodes":["au"],"languageCodes":["en"],"name":"Talk-au Mailing List","description":"Place for Aussie mappers to chat","url":"https://lists.openstreetmap.org/listinfo/talk-au","contacts":[{"name":"Ben Kelley","email":"ben.kelley@gmail.com"},{"name":"Steve Bennett","email":"stevagewp@gmail.com"},{"name":"Ian Sergeant","email":"inas66+osm@gmail.com"}]},"OSM-AR-facebook":{"id":"OSM-AR-facebook","featureId":"argentina","type":"facebook","name":"OpenStreetMap Argentina Facebook","countryCodes":["ar"],"languageCodes":["es"],"description":"Join the OpenStreetMap Argentina community on Facebook","extendedDescription":"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!","url":"https://www.facebook.com/OpenStreetMapArgentina/","contacts":[{"name":"OpenStreetMap Argentina","email":"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-forum":{"id":"OSM-AR-forum","featureId":"argentina","type":"forum","name":"OpenStreetMap Argentina web forum","countryCodes":["ar"],"languageCodes":["es"],"description":"Join the OpenStreetMap Argentina web forum","extendedDescription":"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!","url":"https://forum.openstreetmap.org/viewforum.php?id=49","contacts":[{"name":"OpenStreetMap Argentina","email":"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-irc":{"id":"OSM-AR-irc","featureId":"argentina","type":"irc","name":"OpenStreetMap Argentina IRC","countryCodes":["ar"],"languageCodes":["es"],"description":"Join #osm-ar on irc.oftc.net (port 6667)","url":"http://irc2go.com/webchat/?net=OFTC&room=osm-ar","contacts":[{"name":"OpenStreetMap Argentina","email":"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-mailinglist":{"id":"OSM-AR-mailinglist","featureId":"argentina","type":"mailinglist","name":"Talk-ar Mailing List","countryCodes":["ar"],"languageCodes":["es"],"description":"A mailing list to discuss OpenStreetMap in Argentina","url":"https://lists.openstreetmap.org/pipermail/talk-ar/","contacts":[{"name":"OpenStreetMap Argentina","email":"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-telegram":{"id":"OSM-AR-telegram","featureId":"argentina","type":"telegram","name":"OpenStreetMap Argentina Telegram","countryCodes":["ar"],"languageCodes":["es"],"description":"Join the OpenStreetMap Argentina community on Telegram","extendedDescription":"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!","url":"https://telegram.me/osm_ar","contacts":[{"name":"OpenStreetMap Argentina","email":"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-twitter":{"id":"OSM-AR-twitter","featureId":"argentina","type":"twitter","name":"OpenStreetMap Argentina Twitter","countryCodes":["ar"],"languageCodes":["es"],"description":"Follow us on Twitter at {url}","url":"https://twitter.com/OpenStreetMapAr","contacts":[{"name":"OpenStreetMap Argentina","email":"openstreetmap.org.ar@gmail.com"}]},"Bahia-telegram":{"id":"Bahia-telegram","featureId":"bahia","type":"telegram","name":"OpenStreetMap Bahia Telegram Group","countryCodes":["br"],"languageCodes":["pt"],"description":"Join the OpenStreetMap Bahia community on Telegram","extendedDescription":"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!","url":"https://t.me/OSMBA","contacts":[{"name":"Wille Marcel","email":"wille@wille.blog.br"}]},"OSM-br-mailinglist":{"id":"OSM-br-mailinglist","featureId":"brazil","type":"mailinglist","name":"Talk-br Mailing List","countryCodes":["br"],"languageCodes":["pt"],"description":"A mailing list to discuss OpenStreetMap in Brazil","url":"https://lists.openstreetmap.org/pipermail/talk-br/","contacts":[{"name":"Arlindo Pereira","email":"nighto@gmail.com"}]},"OSM-br-telegram":{"id":"OSM-br-telegram","featureId":"brazil","type":"telegram","name":"OpenStreetMap Brasil Telegram","countryCodes":["br"],"languageCodes":["pt"],"description":"Join the OpenStreetMap Brasil community on Telegram","extendedDescription":"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!","url":"https://t.me/OSMBrasil_Comunidade","contacts":[{"name":"Vitor George","email":"vitor.george@gmail.com"}]},"OSM-br-twitter":{"id":"OSM-br-twitter","featureId":"brazil","type":"twitter","name":"OpenStreetMap Brasil Twitter","countryCodes":["br"],"languageCodes":["pt"],"description":"Follow us on Twitter at {url}","url":"https://twitter.com/OpenStreetMapBR","contacts":[{"name":"Wille Marcel","email":"wille@wille.blog.br"}]},"OSM-CL-facebook":{"id":"OSM-CL-facebook","featureId":"chile","type":"facebook","name":"OpenStreetMap Chile Facebook","countryCodes":["cl"],"languageCodes":["es"],"description":"Join the OpenStreetMap Chile community on Facebook","extendedDescription":"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!","url":"https://www.facebook.com/OpenStreetMap-Chile-145127198882915/","contacts":[{"name":"Julio Costa","email":"julio.costa@openstreetmap.cl"}]},"OSM-CL-mailinglist":{"id":"OSM-CL-mailinglist","featureId":"chile","type":"mailinglist","name":"Talk-cl Mailing List","countryCodes":["cl"],"languageCodes":["es"],"description":"A mailing list to discuss OpenStreetMap in Chile","url":"https://lists.openstreetmap.org/pipermail/talk-cl/","contacts":[{"name":"Julio Costa","email":"julio.costa@openstreetmap.cl"}]},"OSM-CL-telegram":{"id":"OSM-CL-telegram","featureId":"chile","type":"telegram","name":"OpenStreetMap Chile Telegram","countryCodes":["cl"],"languageCodes":["es"],"description":"Join the OpenStreetMap Chile community on Telegram","extendedDescription":"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!","url":"https://t.me/OSMcl","contacts":[{"name":"Julio Costa","email":"julio.costa@openstreetmap.cl"}]},"OSM-CL-twitter":{"id":"OSM-CL-twitter","featureId":"chile","type":"twitter","name":"OpenStreetMap Chile Twitter","countryCodes":["cl"],"languageCodes":["es"],"description":"Follow us on Twitter at {url}","url":"https://twitter.com/osmCL","contacts":[{"name":"Julio Costa","email":"julio.costa@openstreetmap.cl"}]},"OSM-Reddit":{"id":"OSM-Reddit","type":"reddit","languageCodes":["en"],"name":"OpenStreetMap on Reddit","description":"/r/openstreetmap/ is a great place to learn more about OpenStreetMap.  Ask us anything!","url":"https://www.reddit.com/r/openstreetmap/","contacts":[{"name":"Serge Wroclawski","email":"emacsen@gmail.com"}]}};
23647
23648   var dataImagery = [{"id":"sjcgis.org-Aerials_2013_WM","name":"2013 aerial imagery for San Juan County WA","type":"tms","template":"https://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":"https://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":"ACT2017","name":"ACTmapi Imagery 2017","type":"wms","template":"https://data.actmapi.act.gov.au/arcgis/services/actmapi/imagery2017mga/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:4326","endDate":"2017-05-01T00:00:00.000Z","startDate":"2017-05-01T00:00:00.000Z","scaleExtent":[0,21],"polygon":[[[149.085,-35.1171],[149.1509,-35.1157],[149.1509,-35.1335],[149.1736,-35.1335],[149.1739,-35.1512],[149.1957,-35.1512],[149.1962,-35.1689],[149.2177,-35.1683],[149.2192,-35.2048],[149.241,-35.2043],[149.2419,-35.2223],[149.2632,-35.2222],[149.2644,-35.2575],[149.3085,-35.2571],[149.309,-35.2751],[149.3531,-35.2742],[149.3536,-35.2921],[149.3974,-35.2917],[149.3988,-35.3452],[149.3777,-35.3457],[149.3772,-35.3641],[149.3341,-35.3648],[149.3385,-35.5451],[149.1624,-35.5487],[149.1727,-35.9271],[149.0175,-35.9294],[149.0172,-35.9113],[148.9506,-35.9125],[148.9499,-35.8946],[148.9277,-35.8949],[148.9272,-35.8768],[148.9053,-35.8768],[148.9042,-35.8586],[148.8826,-35.859],[148.8805,-35.7695],[148.8361,-35.7698],[148.8359,-35.7521],[148.8138,-35.7524],[148.8131,-35.7343],[148.7909,-35.7347],[148.7911,-35.7167],[148.7688,-35.7167],[148.7617,-35.3924],[148.7839,-35.3921],[148.7822,-35.3022],[148.8041,-35.302],[148.8033,-35.2836],[148.8474,-35.2832],[148.8469,-35.2652],[148.8689,-35.2643],[148.8687,-35.2466],[148.9128,-35.246],[148.9123,-35.2282],[148.9341,-35.228],[148.9329,-35.1919],[148.999,-35.1904],[148.9986,-35.1724],[149.0206,-35.172],[149.0204,-35.154],[149.0637,-35.1532],[149.0635,-35.1355],[149.0857,-35.1348],[149.085,-35.1171]]],"terms_url":"https://actmapi-actgov.opendata.arcgis.com/datasets/884456bde6fd46d68e0c05479f55d548","terms_text":"© Jacobs Group (Australia) Pty Ltd and Australian Capital Territory","best":true},{"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":"https://tiles.craig.fr/osm/wmts/1.0.0/ortho_2013/webmercator/{zoom}/{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":"https://tiles.craig.fr/ortho/wmts/1.0.0/ortho_2016/webmercator/{zoom}/{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":"https://{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/FR:WikiProject_France/WikiProject_Base_Adresses_Nationale_Ouverte_(BANO)#Licence_du_r.C3.A9sultat","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":"https://basemap.at","terms_text":"basemap.at","description":"Basemap of Austria, based on government 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":"https://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":"https://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":"https://{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":"https://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":"https://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":"https://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":"https://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":"https://www.bing.com/maps","scaleExtent":[0,22],"default":true,"description":"Satellite and aerial imagery.","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEkAAABJCAYAAABxcwvcAAAGsklEQVR4Xu2aa2wUZRSG393Z3VKhW0AjQgvhjhRMxVoFSkTSVhJEGqUkECkXQSyoiBCJicYYo+GPiAS1MQREMI2GhGI0UQilJJSCFcWqoDYol0ChEG6lLdu9et5vu01ZWpg0nZ3dMM9msrAz03SenHO+c76tDe+tDMHittijP7C4FUuSDixJOrAk6cCSpANLkg4sSTqwJOnAkqQDS5IOLEk6MEySzWaDLfrDBMUwSaFAgKag2e0JL8sQSYyi+1PcSlSguQmhUFB9bpfPeSSaNEMkiRWsHP8kKua/jFdycjHA3RsI+BH0eeXwKYmUlSjYDNlPEkmbC+ZgYWa2+u81zw3sO/kvvvrzF1SfOYXTVy6pa+Byhd/jHGMiSfAx1YJB+OVI7ZGMggfHYnvhfFQteg2fF8zGQ2kDYfP7kQjJZ5gkplSkaDNWghIxAalNaSmpWPLIBOQNGYWQ3we7/S6W1B5qYA3SbHYlyxcMwCOCEoWYSGoPZTntWkIV7phLSkQsSTqwJOnAkqQD0yWxfMd7CTddkp8dt6x0Dlnx4rWxNF2S25Wkmkp/03U1CLOXirdtFtMkUQSH3mF97sXXsxagKDsHfZJ7IuBpRkiG4JCMM21du8k9lWmSFPLwJ69eRlb/dGx9di6qZa77UoTljhiNlKQeSlbgRrMSZmYDapqkEGuRw4krDdew/qf96rPhfe/DvMxs7JlbjCNLVuH9/GcwZdRY9JSU9DU1hLdZEO7aY7kvZZokhRKlYfeJWpxvbFBzHXcNyDAR9takPOwtWordz7+ENU/PwmODhqqoCu9LeZVoh6SjZnCEmS7JJVFSW3caFSePh6Oj9XkpgML4PnHgYLyZk4vyomIcfnEVVoq8Ef0GwOlwwN/ciIAIMxJzJaE17ewObPqtGiF5cXUjLNaMElrjvhS3WXqJ0KwB6VibPwPHildjR+ECLMvJQ8YD6YamnumSmGJwOlFx4jhqzteJjFBYXCt8eK5wlEeJPMd7KHD6yAx8Om0m9kiEPTl4ONDiUdd2N93/E7sAo4Y1ZrNEE+sL95vai2q7jq/Wok0YYR6/H/17udGvZ4oYDxgSUfEhSaWcHduP1eD3+jq4NEdbb8Q0u1VXGEYNIyqykWfUgBMXktR6JkX4vCzzeVs/w+Lvv8Ef9efUOdWB33T1rYTbgTtd1XXiQpJCokESCRebGrGpuhKPblqHeTtLsfu/f3CZDSUvib4nRsSPJFCCrG7SYDqTkuGVxnFb1V68XfEDmlubyI7qVCyIK0msMSzGPk8T+qWkYt3MItV9p7tT1fm7bixpT2TM4JyWpGkonjAFh15YjhWPT4abM1z0DVGoNsJATJWkpnx+zSTpxGN6xsMon7cUJdMKMbh3X/XwfHUWPzzPIyzZuEcx7iffAdUcBgLwttxARv80lMr0XzZ7EXIGDlHLfuThO1u1mJY875LI+1nGmqMX6lRTakRQmSbpmteDVGkA1zxVgIMLX8WcseNUz0NBFNhR/Yl8E0xYv7jNsvzHMkzasgFH68/C5nSp+7sbUyRx9JgzZhwqFq9Qg6tbVrO2h+8kbfjw1EZ5LdJlf1hVgclbPsGGyj3w+qXTdjCKDAgjmCSJo8fUYaMwTib5yKTfUeQQPnYkush3tUcxYfN6vCERdPrqJTiS71G1zShBxBRJhAU5Mqh2tD3Lh2bEqQFXBLHuPLf9C8wo3YgjZ0/B5nLBLtGjJEff3M0YJimyMnUGC3Jn0cOiHF75bLggHfjru3Yif2sJymoOS1o5VO2J7AbEAsMkce+HIu4kqz3qWjlYlNlllxyuQtbGtfj4QLkq9EwtLl9GplZHdLsklTryEDv+qkF903U4tfD3abdLi/b9Du9n3cnbVoJl35bizNUrsLt6wGbXbvszjMSQPwdUc5b0QGnSEK6eOAXzM7ORqjpnRsHN4wVTK7JRduxiPd7dtwtlf9fA7/NCEznUEuvIicYQSYTRE+Iej9+H7EFDsXpSLgpHZ6pz0bLONTZgQ/V+OSrR2NwIOFzQtPAcFw8YJomovoYNYksL/4GpIzLwzhP5mChdNQnK0r7x10P46OA+1J47CyQlqesZOYb9Ul3AUEkRmE5B1hOvV4IkCYuzxmPGyDH4oLIcB07Ugr+Gw8Vu2fzU6oiYSCKRblmlEP9eku+aQ+1I8vNYLeddodtXt86gAkYKvyKySzRp7JRlICXxLIjETFJ7KIURFY+p1RGmSEo0LEk6sCTpwJKkA0uSDixJOrAk6cCSpANLkg4sSTqwJOnAkqQDS5IOLEk6sCTp4H8Lf75Du1VW7QAAAABJRU5ErkJggiAgICAgICAgICAgICAgICAgICAgICAg"},{"id":"Bonvillars-2013","name":"Bonvillars Orthophoto 2013","type":"tms","template":"http://osmdata.asitvd.ch/tiles/bonvillars2013/{zoom}/{x}/{y}.png","endDate":"2013-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[14,20],"polygon":[[[6.6671318,46.8335837],[6.6631287,46.838326],[6.6721281,46.8419075],[6.6749,46.8422559],[6.6784318,46.8380735],[6.6671318,46.8335837]]],"terms_url":"http://osmdata.asitvd.ch/","terms_text":"Bonvillars - Orthophoto technique 2013"},{"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","endDate":"2015-01-01T00:00:00.000Z","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","endDate":"2017-03-01T00:00:00.000Z","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":"canaan_drone_red_cross_201712","name":"Canaan - American Red Cross, Dec-2017","type":"tms","template":"https://tiles.openaerialmap.org/5ac65a9f91b5310010e0d489/0/5ac65a9f91b5310010e0d48a/{zoom}/{x}/{y}.png","endDate":"2017-12-20T00:00:00.000Z","startDate":"2017-12-11T00:00:00.000Z","polygon":[[[-72.26733684539795,18.63561150166432],[-72.26360321044922,18.637299102898723],[-72.26115703582762,18.64140620693752],[-72.25982666015625,18.645879177561056],[-72.25811004638672,18.64742435821355],[-72.24502086639404,18.64795296941909],[-72.23433494567871,18.648074956386637],[-72.22733974456787,18.648196943266544],[-72.2195291519165,18.654377497115863],[-72.21609592437743,18.654458818692795],[-72.21583843231201,18.662224849717205],[-72.21725463867188,18.66738845367857],[-72.21888542175293,18.67019381039462],[-72.22309112548828,18.669583954186887],[-72.22343444824219,18.673121089658242],[-72.225022315979,18.67320240224967],[-72.22545146942139,18.676088973977365],[-72.2328758239746,18.675967007152448],[-72.23339080810547,18.678772221921143],[-72.23673820495605,18.67856894704893],[-72.23854064941406,18.679747937913884],[-72.23999977111816,18.68129281008022],[-72.2446346282959,18.682065240881936],[-72.24682331085205,18.681699353046348],[-72.24605083465576,18.676983394678427],[-72.25094318389893,18.676983394678427],[-72.25510597229004,18.679016151445964],[-72.25961208343506,18.678975496549533],[-72.26081371307373,18.677430603259076],[-72.27038383483887,18.677105360771996],[-72.27900981903076,18.67682077308383],[-72.28373050689697,18.678934841643372],[-72.28613376617432,18.681536735976945],[-72.2966480255127,18.681780661522538],[-72.30184078216553,18.68568342249539],[-72.30119705200195,18.688244560524797],[-72.30802059173584,18.693244766020335],[-72.30947971343994,18.693082160033953],[-72.31698989868164,18.69682205821522],[-72.32806205749512,18.705277175644323],[-72.33840465545654,18.69901717736881],[-72.34012126922607,18.696659455664193],[-72.33960628509521,18.694261049897648],[-72.33376979827881,18.683569438127616],[-72.33134508132935,18.681922951261985],[-72.32550859451294,18.680926920576777],[-72.32027292251587,18.677410275621916],[-72.31626033782959,18.67476766203316],[-72.3116683959961,18.672003037571464],[-72.30799913406372,18.669949868174736],[-72.30533838272095,18.669258696645926],[-72.3006820678711,18.664989633593734],[-72.29795694351196,18.664786342196592],[-72.2960901260376,18.661289692031172],[-72.29315042495728,18.659988594501545],[-72.2951889038086,18.654967077665706],[-72.28413820266724,18.649620117055733],[-72.2780442237854,18.64522857097433],[-72.27486848831177,18.642117823780783],[-72.27351665496826,18.640572594843363],[-72.27059841156006,18.639007019609803],[-72.26733684539795,18.63561150166432]]],"terms_url":"http://americanredcross.github.io/","terms_text":"American Red Cross","description":"Drone imagery collected December 2017 for Canaan, Haiti by American Red Cross in coordination with the Haitian Red Cross."},{"id":"Geneve-SITG-2011","name":"Canton de Génève 5cm (SITG 2011)","type":"wms","template":"https://ge.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.182206,46.2261804],[6.1834782,46.227722],[6.1892864,46.2332924],[6.1919574,46.2385834],[6.1925342,46.2423928],[6.190614,46.2439668],[6.1904559,46.2465408],[6.1925579,46.2504535],[6.1918625,46.2526174],[6.1932454,46.2559996],[6.1928661,46.257759],[6.1954344,46.2618129],[6.1978999,46.2645391],[6.2004523,46.2656918],[6.2091685,46.2663364],[6.2171577,46.2738801],[6.2204608,46.2789542],[6.2275017,46.2864907],[6.2343293,46.2895488],[6.2364313,46.2932018],[6.240738,46.297739],[6.2395843,46.3039573],[6.2412991,46.3052948],[6.2432035,46.3045305],[6.2451317,46.3049236],[6.2462696,46.3037171],[6.2498335,46.3026962],[6.2503156,46.3014024],[6.2493752,46.3001795],[6.2514614,46.2964723],[6.2506316,46.2945122],[6.2522279,46.2938242],[6.2542904,46.2906955],[6.2523069,46.2873481],[6.2503156,46.2867966],[6.2497387,46.2857426],[6.2463644,46.2843337],[6.2432272,46.284279],[6.2398451,46.2809804],[6.2393393,46.2762725],[6.2437172,46.2735579],[6.2511281,46.2625819],[6.2624442,46.2553044],[6.2630131,46.2545722],[6.2620016,46.2521461],[6.2673594,46.2488674],[6.2773162,46.2521133],[6.277253,46.2529767],[6.2831955,46.2550312],[6.2823104,46.2556759],[6.2827846,46.2567687],[6.2886797,46.2604621],[6.2915403,46.2643957],[6.2945748,46.2655648],[6.2972931,46.2648874],[6.2978305,46.2630955],[6.2954124,46.2582658],[6.2966293,46.2566048],[6.302398,46.2557961],[6.3067758,46.2575336],[6.3109956,46.2566594],[6.3076767,46.2518401],[6.3104583,46.2505724],[6.3101106,46.2474903],[6.3115646,46.2438616],[6.2960604,46.225012],[6.2901179,46.2224096],[6.2777271,46.2149299],[6.2670749,46.2127645],[6.2566755,46.2092647],[6.2508911,46.2057429],[6.2507646,46.2045616],[6.2495003,46.2040365],[6.2464342,46.2045397],[6.2425147,46.2036427],[6.23594,46.2054147],[6.2334745,46.2050866],[6.2288912,46.2017176],[6.2232332,46.2000549],[6.2235492,46.1988078],[6.2225694,46.1979108],[6.2193452,46.1976483],[6.2168797,46.1944757],[6.2125941,46.1918913],[6.2072745,46.191373],[6.2058776,46.1890752],[6.2034006,46.1880582],[6.2028159,46.1864225],[6.2003504,46.1850438],[6.1990544,46.1829648],[6.1961543,46.1828772],[6.1885049,46.179671],[6.1875092,46.1753867],[6.1898176,46.1658394],[6.1748034,46.1569398],[6.1687976,46.1562391],[6.1582876,46.1519474],[6.1543365,46.151411],[6.1495161,46.1493307],[6.1480463,46.1474803],[6.148315,46.1461882],[6.1456124,46.1441734],[6.1424357,46.144929],[6.1376785,46.1421695],[6.1369199,46.1407131],[6.1307404,46.1394647],[6.1259832,46.1396618],[6.1201355,46.1418082],[6.1076974,46.1420272],[6.1053741,46.1431332],[6.097456,46.1432536],[6.0915135,46.1509511],[6.0747608,46.1479511],[6.0718843,46.1490789],[6.0529505,46.1504584],[6.0497264,46.1468014],[6.0486201,46.1415344],[6.045712,46.1391581],[6.0428672,46.140056],[6.040133,46.138939],[6.0378256,46.1371649],[6.0364664,46.1338137],[6.0353127,46.1334413],[6.0300024,46.1381615],[6.0207883,46.1402422],[6.016932,46.1419067],[6.0128228,46.1411949],[6.0081447,46.1417096],[6.0036404,46.1408773],[5.9933833,46.1431989],[5.9872827,46.1417096],[5.9846434,46.1423228],[5.9830945,46.1371211],[5.9760299,46.131897],[5.9731377,46.1308127],[5.9703719,46.1310756],[5.9653619,46.1288192],[5.961632,46.1297612],[5.9573016,46.1276692],[5.9557527,46.1283592],[5.9548361,46.132138],[5.9588978,46.1355331],[5.964461,46.1373839],[5.9651722,46.1384462],[5.9631018,46.1424104],[5.9638288,46.1465605],[5.971573,46.1558012],[5.9788431,46.1672076],[5.9802181,46.1735447],[5.983221,46.1750659],[5.9853704,46.1747814],[5.9875356,46.1730632],[5.9902856,46.1795528],[5.9936045,46.1820258],[5.989764,46.186917],[5.9828733,46.188219],[5.9806765,46.1903963],[5.9628173,46.196304],[5.9622484,46.1971902],[5.9646507,46.2002203],[5.9716363,46.2030206],[5.9698504,46.2038301],[5.967938,46.2067505],[5.9722684,46.2141766],[5.9736434,46.2156311],[5.9789696,46.2182119],[6.0085714,46.2444351],[6.0142164,46.2485522],[6.0659287,46.2834493],[6.1151124,46.315115],[6.125733,46.3184334],[6.1297158,46.3156826],[6.129779,46.3140671],[6.1360376,46.308958],[6.1417904,46.3055517],[6.1539283,46.3001361],[6.1715661,46.2950695],[6.17125,46.2922302],[6.1727673,46.286289],[6.1701753,46.2853279],[6.168342,46.28109],[6.1720087,46.2755409],[6.1721983,46.2730065],[6.1691006,46.26785],[6.167457,46.2621684],[6.1653076,46.2619499],[6.1645489,46.2627366],[6.1594283,46.2589777],[6.1553191,46.2521587],[6.1538651,46.252115],[6.1527272,46.2503664],[6.1531065,46.2476997],[6.1549398,46.2459072],[6.152095,46.2387805],[6.1521713,46.2327333],[6.150338,46.2265889],[6.154542,46.2219091],[6.1548264,46.2204438],[6.1529615,46.217382],[6.1540046,46.2135544],[6.1571023,46.2109734],[6.1626339,46.2104265],[6.1638666,46.2097047],[6.1691137,46.2119139],[6.1686712,46.2131825],[6.1707258,46.2147792],[6.1747085,46.2160259],[6.182206,46.2261804]],[[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_url":"http://ge.ch/sitg/donnees/conditions-d-utilisation/open-data","terms_text":"Orthophotos du SITG 2011"},{"id":"Canvec","name":"Canvec - English","type":"wms","template":"https://maps.geogratis.gc.ca/wms/canvec_en?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=canvec&STYLES=&SRS={proj}&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":"Canvec_French","name":"Canvec - French","type":"wms","template":"https://maps.geogratis.gc.ca/wms/canvec_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=canvec&STYLES=&SRS={proj}&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":"Cartoriviera-2012","name":"Cartoriviera - Orthophoto 2012","type":"tms","template":"http://osmdata.asitvd.ch/tiles/cartoriviera2012/{zoom}/{x}/{y}.png","endDate":"2012-01-01T00:00:00.000Z","startDate":"2012-01-01T00:00:00.000Z","scaleExtent":[14,20],"polygon":[[[7.0223485,46.428558],[7.0224002,46.4204487],[7.0217584,46.4195527],[7.0222539,46.4195415],[7.0216122,46.4174862],[7.0224164,46.4174022],[7.0224245,46.4168141],[7.0211329,46.4144283],[7.0216447,46.4125856],[7.021604,46.4118799],[7.0191751,46.4105524],[7.0189557,46.4100427],[7.0175666,46.4082615],[7.0142603,46.406962],[7.0094754,46.4069452],[7.0095161,46.4045084],[7.0036833,46.4015338],[6.9705244,46.4013942],[6.9705607,46.3935365],[6.9650691,46.3833298],[6.8937941,46.382997],[6.8932656,46.3920944],[6.8968041,46.4000018],[6.8967811,46.4009684],[6.8939549,46.4010001],[6.8976772,46.4088811],[6.8924614,46.4138556],[6.8923695,46.4180692],[6.894897,46.4193048],[6.892852,46.419479],[6.8939549,46.423122],[6.8922546,46.4233913],[6.8921857,46.428016],[6.8874294,46.4280001],[6.8765153,46.4316268],[6.8662445,46.4363299],[6.8400276,46.4459092],[6.8350416,46.4493447],[6.8269996,46.4520359],[6.8269536,46.4537931],[6.819532,46.4565474],[6.8036089,46.4599347],[6.7877547,46.4625304],[6.7869737,46.5245979],[6.8260407,46.5247994],[6.8260866,46.5266175],[6.8390687,46.5266965],[6.8388849,46.5500567],[6.9065755,46.5504201],[6.9119981,46.5430086],[6.9108263,46.5398319],[6.9097923,46.5351219],[6.9093098,46.5351693],[6.9086664,46.5337309],[6.9119521,46.5329722],[6.9133537,46.5360386],[6.9267954,46.5336361],[6.9272319,46.5349006],[6.9371351,46.5331144],[6.9369053,46.5327035],[6.9402829,46.5319605],[6.9416386,46.5347741],[6.9430861,46.5345528],[6.9434538,46.5352799],[6.9564129,46.530032],[6.956321,46.5273289],[6.9511051,46.5272498],[6.9530122,46.5261116],[6.9434078,46.5260484],[6.9434308,46.5254634],[7.0162912,46.5256848],[7.021576,46.5221118],[7.0219571,46.4735486],[7.0709902,46.4736751],[7.0740232,46.4719028],[7.0738322,46.4325972],[7.0594696,46.4323285],[7.0527757,46.4287898],[7.0223485,46.428558]]],"terms_url":"https://map.cartoriviera.ch/?baselayer_ref=orthos_2012_mobile&baselayer_opacity=100","terms_text":"Cartoriviera"},{"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":"https://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]]],"overlay":true},{"id":"Czech_CUZK-KM-tms","name":"Czech CUZK:KM tiles proxy","type":"tms","template":"https://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":"https://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":"https://poloha.net/","terms_text":"Czech RUIAN"},{"id":"Czech_RUIAN-parcely","name":"Czech RUIAN parcely","type":"tms","template":"https://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":"https://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":"wms","template":"https://firstmap.delaware.gov/arcgis/services/DE_Imagery/DE_Imagery_2012/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":"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":"Delaware2017Orthophotography","name":"Delaware 2017 Orthophotography","type":"wms","template":"https://firstmap.delaware.gov/arcgis/services/DE_Imagery/DE_Imagery_2017/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":"2017-01-01T00:00:00.000Z","startDate":"2017-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_2017/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","overlay":true},{"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,iVBORw0KGgoAAAANSUhEUgAAAMQAAADECAYAAADApo5rAAAgAElEQVR4nMy9a7Bl2VEm9uU5595bt6puvd9dVa1+6k3rgRCSQLKMEDCBAHsEGptAGE948Bgz88Nhw0w4bBzjmBl7HDE2EzM4PGZgAIMNNkYEDKDBIARIAoQeLSG1uumu7uqq7nq/bt1b9738Y6/M/DL32vdWYzw6u6PrnLP2Wrkyc2V+meux95WFd31fAQR6FdRfRYuF7ujvAhSpdQsgUusLSikQ6e6hfkcpKOJ9AIBo/VBaINRfqd8jd17Lf8HqgspCy8pm6K0Km4pNCYUqimQukHrs/mn1kcuoi979QNsGo02rRNVXjTGf3e9ePRoj2bZe/Oz1a+0j41omLR53+vwqyzBqDoR9casohe6WTmrroPiHVKcA3BkgYgMsXN9csXT3itBNN+lKDp37CUSZLahKIPrGp1FGIQYLeaBIdWhSQnGmjIoqXukYYIQr4IoXCfVPl8oQnaEow/qBUoZl0KZhHKoM3QAL3S9WjwGro+P1CtHLn8a7lhMfYgXFxqtU+mx83m0JKpsWGUadSZCFEdNqHGrodk+otoj9dmSQrhK5paKx+5WQkmpLikjqG2agQrwpkmQEQHHe2AZL11c22FJxxepKsahVTCvFBpadjEe4pHtqyPpbqtu5casuitdXPs2r6XNABuOwqB7EeFMDLUX5T9G4Wg3zqarOZd0n91VcBi1HB2gWu4WjqttXMGiZPhlGqKFGUFCKCyAiHpoCDyV0CL1vdat5mGEWQ0o1GTKrDvOLO5wyZ3XFfN946OxCjK7dFa/p5WpYETn0rnQj6b/pm1LreCjkky6Dyizqt8Y3NJDaIIoAUgqhktQ2xXkWgXDvso0M4nX0vusZNeIqx8S/RnCAxpiN1cdd6Qn15WMSy9lQAv8SywKETJkMk5hjVRhns0ioChLUWfLymJu5ZCWTMWQWiFDmKNRAnaT+o4KZaTBzAsCpIJp48Win6Z71UarlKiB4lLDhU4dlRDNnrTWlmMyayypN0xWlj2Te1BOXlV55loGCB1AEnnGqx1XaharTgMd8Xex3Yd2bIgsNIkd3Zlvp+fxS4dZl6I/rNMkwcu+IA9NLkY2MG4Xxqy0FYaA6BZFwxjQRkxgzDHlpzAOuEGOOIqlOjxUx5HUfLarnwEPEMUIym8go0zQIhdsb/Ft/wTlrbsCmnl2CuShlWIYuChVjS5iizduU7443Q0YNYdXZu2o+mKZ7YVmE+CpG3/otfSlQXIZSaXCEmDYZRoZVRf9hB+w80OYTNFg296Q2yrCFd2png671henVT8rVJd9TmpQWmYqkjbU6Go5Z8b4k/LKQa23E5dGvqkDTDzwkB9rcR5WNUjPWSXFzCXqSUjq5t5FB5xYEZZZmaWTLE0udbzEGampDawrk28XLRdOSKoP4yo5Uw7ZITuUC1R8h+BTKYKtMKkkpahQgb4rLjm4QnYGqpxvcWhsaPpvEqNc7dGqELKpFSih4IspCRkT2ZVZH1IhIpVBkMqJdiFXa6mxhibhEgCqmJ5gzMYqXGgVsUqd9WB4pKFJCVGFJTIaqVNVZUwYwcKH+Fr8tcOmMp84xi8lF4FV1qfM+BzafT6LWs/FnHmiQOHXuutE2KoMvVkyTDKMSDN4N33cB1IPcpW0gCQn4N4qia/XsoqHKL7M581oPaW4c7mgWlUqxfsycKFTHeYaVOu8WSqSmZVrbhikglcGOMSz24askhfrs2nB+avMY0g3zWSyOaAPPi/uxkgyFFV89t6gMjmqdsYlYWqxjY3pQjy/eq42H9ekg5cjqJQrVtjonJcmPYEM2J5syGUYRo/qmFASAV+N1cSgSFL4PsrPCTcElTFZv6GpXCDpmbtFhlIYqMfCMzoEUDTxgEYxBEUNqyiaOOEazGMq7IzJzTK/v0DbxE6mG4sut+VI0DMg6IIONiVYW3aPxSMLqdYMszrJryhkm3hQ9LdoTYLJh6Vexwff83xYTGFegwDBdMozisPiASs9SYzWhQVPyERWJxwaDlnblcsDnC7nfZI0c/qIRuw8VQ66WECHOOF3h+s4k79h0BbTsB5UzqjnL7OimDFbdpVUM5mBIhhYIUG91jNjJ8yyk2DiE4RbltY+ongsGwRAm10a+OOFk5NMqwygyuY0TmIwlerkEetYDCxrNqLImbQQw9Gv3Hipq2NXvITwCKGqw3LqDXRRDsk4IM2jaLbfAbJM6Rxb3Tv9lfIU7ceIehyajq0vOSdiQDApMEXQKdFM0c6a0HECkjkMySbMXDvV8n1d6SC8+cTK9NuNgBbEyhTKMAAR0yrt5bOh+fqREaIeGP0Vm6Q94ECcJV0os5VyzytIJ5hl//xSU/6tteMXfB6nUsOwrRVJ14ImMt2N9eE+KVjqgJEN1Nkc1501qOqD27BtuQm2K67UgGlWSgcvVSHgu6I7E+XgloTNKINSzjnuLJUzH2WmOMKcKTRkqSEyhDJPKghOtlX0y7MR0ct1tu9OGCC8poMTJqtIA7ECf1hfycFUSlBNykpBiwI1KlIdKz42sJnSlqkngxk8TNRRXjq4C2dyuis9Xgdkv2NhNbwWkbFqxA+lSvF8bDLYLEK/meEMyIPZJ48TpikCoHf2GL5Z0KYeYg3fD6vf4CnagSGv5ry5FU59hMk1gS4qdFhkmmiJ4B13rEoh42NKczp0BPriiNWB1IWREDSYy/dI1NCq+XOdKcxRxLWuZGxn3VZXFDieaNhVXoonEjuIDqW3jwIRRNd2oUUBTA9aMpD6MHsU06q+r05ehN80Lk7ioK0/FGJ2ZHnenoMjjg6BzIZ2bBnjcuD7zZW3b0eWrLcOo1I51EIq4Y5TCDWH/x3CoaFaoAoECexYZta1G8ESp1ChSnBaZMBSS2U+L1SeH5rbkqFFvDWcoZJwqOzm+NstoZgfPDNW5K4kIWmnyGR2PBLX/kvodkqHE76IRmnL5YCwl9uX0qQ316X0orOvvalwl0Tb5uu/OB3oOzuM0TTJMzJDrgHW8q3cxQXY8CUKyxxeUcFjPxjVHhhbipggTCEgXxzR6ZMTkf912I6VSFcHHVTzb0xUjR6EYJt1xWmkjy6e5a754taSjI2ZF8QiN1yWw68sgPAg+dlL54fSMQ2Bh/iTYh6vcEIpQXulqDKzMBTWpjJnxMA5VR0L1p0SGUVjXr0ZJm8gKvh1fZNwaGbRO1IdE5uBe3ZtwgYRtas/BQFR1hOjR6xEmyZkOO5A5jRq4Cql1FdmpXx8TdT93Q04PRPlKl9HT9Eg6hMoRx/pv6KKX+lX5ewsTia9sK1wQ+lJ65rwNGRRxVX5C8yBDQwdBNp0fTZEMI5+EOsfOrA5AqeWOZiV80vhz7s36qRZVQA4n1huCYyK3C/rkc3UdTa5j6V9r74F0o6mWsiyqwNin7266VzqPHDqJrvhCxaCfD5T3mjRAtvCXCmIZg3oT72wYLcsDbPyCEWZeqzUWBSIzAGfE7K3Rl+tNpk6GkU4EAfXQevCKiOlqfqE1ehWMHSmuDFX9FAqKhdA2y6TGWb3bEKCzL6vTob/fK+m3nXy1eVB0MQdyGgE9MUmIzwos6bvzTu21TOrxNfOHfqQyPgY81lPVTqghGdhYfKmbeVZhQYPQl6krCK1DX7pnEOYEKqNUYpryhlUdIXouT9z0nS4ZRqUaQuibBSNezMq1I3o8zQzMmGX0zIwkQzUjU8VGYYLnp/xMuB/Wv02WJbZlhWnqh9SWUsJOLHcudlTSq7djnjhFrPcTplg9k0sSbcg2MqheiKSlLamepEmnokkYJ74dx9ZWdUrdrymBUlsfPQajjUyjDCPPodnAkbxYx6pGEsVSRgcgGD0vKVrHAlrGdJwtBou8LR8PSjgjOnFFdR4x46WmVR/eXidofOSsOMlqs+ogQn11ii1Eu1iY8s/urJOOJaVt6lyVX2G+jF4ylDTRHpTBQ4mnGyZ/to40nhV4er6pdAmEijpy/S2apjqxRneJttlmNvLpkmGkDGjeTOAXPiv29dmixE/YWC3C6OS0sxZFWkZNLevSbw6vsO9k2jBjJmczUOI0g0jYRDilN0pSKq8qktLU1a9uIsby1whEOpGKgJL5B3yiXWhlSu/RDwcEFd3ptGTwianSIR6pbdz3MYoISQrpP0d0j4wlTn5LvMdAp+mvH8UGRcw4vtMiw0jqAEk1om7JVIeluoE2AJ1R4vFmcOPwXu8xoheNHooCInasVxT1a8QIKzcmoLj1JxTwaEVr/6QY0jvpz4TrnBLFxoAn1CYD1K4L0Sr0DEXplmNpYqf9AtJ41qLmtpoOEK8UfJsyFK5Ao2uRjuVXsGJoSemnRd00fnEJXaJRMqrniybL4b6O+xTKMPKQxSZvFkffNa0q4GdfC+gTBNrFBzEwD0UNr1MfCqtlvoPMwUIdSesrWxpZzEGoXzVcR5Dq6IRaira2Np4XDkpdkoWQPLobXWz5Lk7soyOaMwt9NyeJ0ckjriZeMihDb9OQZeD5DhTcQDpNR28YKUrUUbhYPYy8yjvivaa3aLsplGESYAjKIFm1OUUnQVe9cwodYAhoj6gyKR2tOJjuqRL6Ux6Ll9gEUoKee5uAhMwdAhNNZY77LtqONeSbakX7oPDMRyvCBqOpwXWoBh/2F1QXLR0oLeXBb7j2ZUgGBzGmxX1wvZ4e69h0m1yk/WoCvGcUj6TY4JEKq7FqyiiIdYmG/RYnMS0y+MZcHYnOMWtoV19wCHAES14WpzbulTx54V1dUyDrM+XGcYUGFiqE7nsIlfCKF4cRNC5R9dc6XT8BqTMf1Fblstq0mlHUEYKiCVqKn6lFGPhKl6KK7CBD1FMCNdJ/0AdTEJcb7MBE3iISAZeWR4rKfyppoHnxwqmTYWTVhb1PjZWbDoyLtVXGggc5AylF4HsepFibEtpUqKTyaJgx4YYjTXXcODllXXnMZBeNS50g1GLmqW0htri/KkOvWYrMgTnlIoFPlqEHwaaugjQE/bHbLo3I/Aw5JBuojk+jGrfvrUROmQwjHizDLhGfqWcmaweWsqWOdKy7ex4JIrPRadz2KCIAPYVsf5G3MT27GySgPF7MsIMzs1wKFiyPokgH9dVXnYe0xeQfNtGMqBd0NSB6lsFCTykRmgldUSftnlmW2FblilbbY9159Dp5JznS074rR5YmUkpVpk+GiaU7EpevSs3hLa9VJvUbAajnA95JXiLzTS06chuciaAQ/bmHy196xmQQbLLAJruJbeO3lQbZ1xKL2JDtd2Y5kbJ8Wagwy2aWQQ7UAoPET4gOpXWT6SQttpJnpaOG1Uo7LK2h/lTHNvbUyLEzGCA4onPfUyLDSOoSoR67tYsMWgBbetXVFHVIB8pmTEqCed+mo0rY7ZcMT6lm+dWhk8N1VZIismFltAi3KZplvnPkUpmDszjS9M7daEN1RpIxfOf+e/f7MvSuHs8llvMKFw8EA1RJ9cN9GgyVOfdpPJMiVU9KPwHwtMhgz1T31t8pl+UVraIELM1wx+z6VCeKhtmtODkjfsbJETLn3bWUFBIjFkcBTifiUpySLCa8v7GyrixVBTt6kFDZESyVjKtQOsiuq+Kf8HEYBI5kG8YXO31DBq4fELLUPRXTiwth53rI2YbAoYTvRN/KxAGtqMwtRyAa+j28WnI6ZBgVtXjx5c2wTAp3LIsQqN5tRwzMghEkpN8MEF0jPz3rfYl3wiRp8qU2oqtL5hPVUPRepm6IzeG3OqIeAbC+WAoybr5v+xXhUVoHHMeN6Jw5jQS19Rk5bE4SJtJZBgJEPUtmTiQqG92nurrzHiJrMOaOZ4HLEPZKbFGjFqlta66vv3WsGCjD9+mSYeSTwaLwH84A+WDwD/UuX/ktwYI8ghiCZ0RzK3aDtifwJTJODNguehXIJ1pQTzFZbU+lKkaRwXfOWTAyTFYc8lyoIQPTUTLkpMYvXyWVKaspP95WBtMDkxG3RENCEsxoIfKl/h1AMSM98x/R3dpQ2uLgEA20ycOUyDCyAGHeFVFL2TdWFJqqE+QdVN9ijx3ZikKt23qAhyJiaktHd/VhCiNVopUab4kYrQKECSzT4r7ZUVRxvNLBY9jHD6sfIDAPQBqgFhkLBYMylL7uMkiYHCCDdecKvFi+rf9XfbJT9mQtbjucPzMdTgHDK2amS4aRepTzUpHJA4a3ScR6E3k2mEqH1+/dJwzCqePqSNy8oomFR+Yk8ZatU+h7trQwea7/G29NqwQpNtZTcZx4od3yGD1CXUFPBmG+8tWSgVILNzquS0wGI/BBD/oGnB4ciLrhChoN9bxIGJ6TgcSde9fldMkw4pTDowXgB4zgKJyXswKyqjLEfpqSgsJUcBeiM8bYzq2HvVUFSBAk6TfxY2RKUkQSQYyFDOE9pgJbmd14yM+bFNLFkM+1+OqQdECGnIZZCpn4FlJnKu+fHnUG7IAkMRwWHlywaLBZhbn+gMzTIEO3U615NwoxI2TjbojBZhIqUwjoyV9SoUWb0k1/g/Fk+k3kMDZjGy3XlaPqxxDEoxBm2wWmg6rxcLKUaPX7oAiokUnbSN3crLoXk82PnvQUY8qiY/IiO8rg7VWxcTLeHARKU/LqjOrV5Jfcno7fSywP85xalFIQ02VzafqrLMOoupEnGgXwZa4Y612ubLnsvbWtGkr67OrSQS4A/uggSc1OXK1BI5f7nRtHXNkofhYLdTxsblOYTZMZVNY/8yJNJOrGWnXEh9Iqz1VhFjirEcRz+j6oLoA6DkfXhgzspUX1qTzQ2CnvOvDqXToWDYSNfWjfrvLQQuh/Lub5nQFX8aCu6DpFMozsL3gqkfAjrKJbWaQCtV9CUjZ+ekbb0NStNxpn7Mr2IFLqIxX6zcNjb66wMN8RN8geLHX3I/gUioyRryy+fudTluavqY4PrETHVSStHpSf5WjLoJbFXaR2dDssNBhYcIUkl2IFg4Hpg1GoUFuXwdLWLEPob7pkGPHNXjiPEFsdmB7sIBE6XhxJGWW1zyBZNYieIL3Y6Chb2DmgfTCK+KOb3gcp0pSUFMh6ykiXVNFL5/hSxIOjWS+UpwbSE5d1RKjYkMEm1tq35mbqnKD+C53b0fEgtAzyljrONUo1ZWD0Ntm1P7pX8rJ1ROtpk2FkD1FUVFKj5/r8Q9GeD0VZiOtxxZ+NSyOH0tD+w71i/bqDM2wXBEMEbE7Eodj3NRCNsGXYpIPsIHl+DfCAaQdep3kgL3Tkn81B20YGizShWUJbvc8gwaz0nM2dTp2xy/Wpk2CEhPAlK9SQjOZaDpp23m2KZBjxfQD2HKz2JkW3n+p3YVruOBYAijqIxNQhyZmPJbgTqkEJ2YLuQDf0NbBKUYICB/TdNG7c1xXjI4cYBHmZ5QAbDVQLObMWbyNDqQgc0FJlqIah38NCAUqilx7cIb0rOxne/BxXR7szm7hRanUVbIsnq/6g1XTJMOpNSETozX3xpKuegAVNTIM8OmFS6YQNPFpA79yQLgeUAl6CtajYq6sMdL8La5J9zWQurhUjlTyWvvPgNaMBj7jxTcNT+zGwoDHvGOI+QTfrPeW7lEEZnLYWCoIe2Q1DaPN6hesVgzJLny3a1ojrWCLGp4534I/SYZtcSycDR/Bpk2ESxgHKt1uUljmw5eMS8Lpq5DQhFPUcuuydqBw2mSSFQJtIpuhiP4lPb0+/RFenYpiNEzZHYT5saAQp4tncKIFIEAB9HdpgWIiVrBbYkfH0eK7TSP0Ui9EU9fisFh+zr7qgMTKg0TEjz9WJe++wJhmc/7kEehpOXAZjV5QCjQd59DTJMCoiYW7byeKRQZ9VJV7JoPTgFC2FshakDq4RrrymP5Log0zr7wUWZv12MVRBQT0tqf/3nanniLUPjVy9B5LYUVgfZJUWZun/EL1IUYVpW//0q1R61pWfPA4MDMhg/XC0Cs5OTw1SdM+TyVL1FZ5TKToZJZ6FAIfmd5pHM99NGeKLkCKfUyLDKCjXWQUnS0UZJvn8ZCKi1yeF8F/q7ISqTIV8EMGa3UkIUVkIQ1AVipDY0i3d4whsU3iufHUeHerASXY8sNEqP/5uHpqAE5xTWhnb0shI6MaaSh6QIRkYnWmlIJgd6aEYSOnNrm04GmM4QjoVI03znFrRuuXnalyG5pyMZJ02GUaWtgSOg0UYAkuwXlAuaJybBoSplK6kt3zGvlgrWmsp5CwJPah/NYze3kIpMfIZi65cD6FkyJUvo+0e7H3mNrmfojKgEXXyEqAPSMt2WlfYM+EUTPlVVLVxc3bcWFwGm0sR+DB7irYuX1/XjuTZSULFXptpk6H7+xCS+kj0bE6gPznH3elqGT8LxUbvXbnBJuNS+fgzf7c2vRtEt9WY7D/MIXSwwNEg1u9dxGQ8/kw0Ut/SEmw7GXIdGsTm+Z4Buj1aua6kgh7thm5aHYb7A31+lWWoZ5mk37ZGBAH8fI5ZZAPLCqInZaVIHxE03bJq4nR0ky8YHD9uamhANDV6iNcNPLEMneDhXj7dG1CiFQkSOaMnhFitq6T/h8qH6lhISZ8ptS0DiBhPEmxfp3meSOsWqltiu4DIOUoy31MmQ3d0QyJvHWPwyCC6/+DWoRtpsT4o1A3FLWdMArMS6nCkUOZKoWcwFMBT6BOG2awIlcmQiKIAWilWLmgolsUiffhDV8k5JP0PKqfv/LjooAy9VSd+ei894iqx3HhSEEn+a1rkFIhTVdMjrRJSNhD5o5Q8dCJTJ4O9l8n5rwY5AG9qxGE7nI23MmDg5jI0nKSfTlhksN/FFMe2bO3DBKt3sxmZO290BPA+ksxJrmi09IBLi746nCAsDOx4tdKFIRnIEWn1PVTRFI1XbYykvmAipzyFnnwmskENJStFDdZaBgRucB+/TIkMtlOt8xld+rNXwMONVjuQXF58a96cApRugVdq/IENV0oxzo21sPpVggaNVtGmSfHKz+CAMDz7+ZhCfXTtVG5SnGq4PubqJyi5L4mpHcKXZjpV8g+mNSBDDxjS6HCEiZtaSpfRN3ZvGiL75NU0f7dv1bMZLK8IMRG4AYogczMtMoxCWKY3aWRUir4Ub9qafqClN3XrnY6YO0/xbyWke4qytthjYU7ApDIChzdsZ3Qt9BkmVvREV8vYggLExiIiV+6LB0mNoh0xJNlBAIMBGRgYepfRct7D3kztg3dzDY1zfqD8FC6i6GdddZXSUKrQQQe2ejRlMozoOB2UPR7fHBUKw14spBDEX4WMprpEjym6b/MF91xbbWoZnHKoLAi1oWXgoJjC7ROsULXQTwPS1P87A6AHi7TcJvrUlg09d5SNQiF2SIa8UsLOyZNCs5+E1NQuGG++1Cgk3y6RDwsJjHguQ3x0tzEPnQIZRuAOdFVJq5rHuRdLdf94jJeF8+MYPMvvHXVgpFbjUSOGb7LEpbzUjuobf/W/YDQWYViBDT4k3S+JRsspSR47IsD9CfqTdTMS/p14DDg1IAMqaATVkjHmCWsDcfubioSabIyBFjPMekD/oj5DZOQJ8xTJ4KddOXSIGzpPZEXLKxO8TR5PfLqB8GZNb23fGE1oaQNfFUZKbMzLo0FZe61LqBA2+9AwPpoLwdt2MsRB8zCgfXLo0DQxh4cUYbVAfboketZ8QAbA/o6CAxfP50rsg4U3HZdYbmzpuCVQBAKKN7A4ysZ1mBYZ6zTJMFIi9clmvymehXFOrl4eUD84np8s9MN5yZh6Rk1LaFxHyZvx5a35fl0WOKRE1VF1IzLkO+KEFLOcRm2lDhQMPDHBkdRoFOvbAxohfiBBgKH1sY0MUHQV7wOUOiQdFPhvT1EZhb1/G30RhAmO+H1jg4ytUB1fDSrOByN1iBDTIUN9c5+Ews7+tFMfM7aFkAKZcw6sN3NRAMdin/FZgELAoF+ov14kQZhQRfQv8Tsty4W5S7jvz2Ko0YpGsjTYQRZDsDq49of7GMG0n6QTcqawJKw0WzJA7aXKIFSoxGwxI93TdCQMo9IpJoIpgfzdHFnIAcz4VReK9PDHCUj1maVpkWEU6NUOunuMSuQU6mgl/SZGfQlMgvMIE9I+SupLUVC92FCE+kS6tB4J2clPCmODU4O2uQ7xr8CeQ28IWR09jmqdLDxA0fHYiIvRhB2DMefUtmE+MiCDsk23HBAqoGlBKfZL7SU4GhSX6aEd5V95DYNOjxwnnoQGQcE5bt6hd02LDHVjjislgyPgDVmCxApWR9iYK+2A2J0xhIN5GTIKIy7YPkh5JTbolcHbV74MJeBlIa0D8SuUxjEd0wNN3uH8NnlACgCipwNKiAZhNS5EiG1kqMoJ8z9VPjoDcbDQZ0OKO2HvT/4ouDAKq2YqOIkbe5in8XcGlIDMDW+YIhlGoCsgedfMaOmR8K6tDpojMz8zUYqYUKIMJ4O2VSXusSgWpCMADYdpT+JB6BJJ9xE1V0BFIDdye8DEcSnwwIYb6XBHSaeUAjKSGm/aRp2V+MkyqO96uaJgalDQjU4SwfXI9dCoJ4Gqv9jY9ocZEa2NITm1zdFt2mSYpGbqP7UCISBAE2RRkHSWS56wVkqKnFo/5cCo5YrUliIU9efqjmoc1N7QXdubAYPaWMfejhyOZfDl2u5XRGcfAG/o/bEM7sk6Qq7H2ZkJ9szvwu5ds9g1N4tdszOYnUwwOzPBaCwYjwJGYWNjE+ubm1hb38Dq6jrura1j6d4KFpdWsLG5GfVp6VfUc6k89PRpoOPgIqEdbEGjO/NWaMC0H9ZHGl8CNNNv/Wa0s018lWWYlIryMUWR+uyDBCQNTqGVzUkqNzRBNgWExyWpPdlO76ivsD87j2ZmMejYXMAcgJSl69zCfamm9Cg7O0vlzZ0J/pRfRXDlpXfmiAZHRLBv724cP7wfxw/tx9GD+3Dy6EGcPn4Yxw/tx7FD+3Fo317sX9iN/Xt3Y25mBrMzY0qdgOWVNSzdW8Htu8u4fmsRV27ewYXLN/D8S1dw8coNvHT1Ji5cuY5rNxexubkJc9IG6LCTmj7JgS2iV7KCoAIAACAASURBVB2oYal90bE7T4fpOx/lsYd1qo34imUPMxOvkZd/4zLsfdeHLbiQL8IP70kz7cvOHRA6NTC8TOhRyEj1d6c/RliiQ5PgZirauhKjtixsYQsRaTTKhZDAaK/ao3K6PRoJzp48gtc/cgaPnT2Bhx44jjPHD+P08UM4eeQg9u2ZDwPJ+zosp17haAj9LgW4fnsRL7x8Fc9duIKnnr+IJ595AX/8xWdx685dOOAwaKVPICrS9JH0m9tU2iGlS2qygc3loH45umhGwOVfBRlk4V0fpiBAiGn0C6UN6TGMYLcaUeC5PN8zhKUb7rbGYzA0oK/MjO5wdGo5I3kjNBqG28EZaFAyz+at3Lj7MR6P8ODJI/j6r3kcb3/Do3j07AmcPnYYxw7tw+5dc1V1ET25fxN1B0cZai8iWLq3ipev3sTT51/G7/3pl/Cbn/gczl28Qipgvesw96zYPxuo47UJGJDGK9VseESjfm7t9A3h/w3JIAvv+nBx4s5yvrhZZIGDUGJLo4b06wywuKOqeqhjsvEmYGOgMrqwg7RCzsA48qrU/PwcvvUdb8Jf+cY344nHH8Th/QvYv3c3ZibjQUPOBs9XdoTtIsVQm61ScHtxGecvXcNv/OFn8bO/9nG8ePl6xZN6CM5S4ipUAoy88hbycdYPkCJB/g4Dku4OWViKEHG+Z0qzMSvW5v9fGWqEiA9ihGO2wYu6zpv2QxHO+gopUk1VdAWK65NDo3q9T40d4XT1Slj5QcjOsz31YqUysYwAKVKxtshhxqMR5nfN4uEHjuM73/u1+ND734ljB/djZjLGaCRxIAau7VKkncq0vNVP6/fG5iZeunoTP/l//w5+9tc/jpt3lrC1teUyqYY5MrPOSA0Y1GWqn0Gr9YlS3+aSaIbyRr9AGq+/fBlsDmHi0LyhKLWC6DCcf3VuHUBB7+mAhs2PAaMxupw7Bp5SYBwwulC34bWGVA0gag9swczMBKePH8YTjz2ID37z1+Pf+trXYd+e3YP9b5WC5XurWF5Zw73VNayur2N9fQPrG5vY3Nqq41gwGo0wHo0wOzPB3OwM5udmsXd+Drvn52y1qSVnC8CGHEivT3z+K/iHP/UR/OmXn8Pi0r0eLQMVS1EKJCILoW9SbQI+vhmzhTgm8WgPT3xbGYWCWD+P+MuUQRbe+WENSKFG6LKUupFRzYkDB/OqdTHUKRHP34fK0PiO9r0mOmcmGBG0Ye67tpuZmeDRMyfwjq95HP/Ov/02fN0bHsP83GzPIDc2t3D99iIuXbuFKzdu4/L123j+pat46eoNvHz9Fq7fWsStxSXcuXsPK2vr2CrdxuRcdYQDC3tw7NB+nDh8AK86dRSvOnUUZ44fxgPHD+HBk0dDnzmNGrpa6dWl67fwz3/5d/BL//qTOH/pGspWhTx7e51RjspS8Kv3THNCOuf0Q42jVOMWpjk0NH1Dh1umy2vOwznEX54MXcrkHLgXVqE8ykUUyBGj8SI6kiudVcrGTLQH07eck21ztRyxE0uRIwKNTqK0zWQ8wmNnT+J9b38j3vf2N+IdX/M45mZnOlXWwdjcKjh38TK+8Mx5PPPiJTz74iWcu3gFL16+jsvXb2Nza6sOqLj6ydHDipnyaf2PceroATx65iSeePxBvPV1D+Mtr3kYp44dhCA6wk6rVXnecmfpHn7zDz+Hf/ZLv4Unnz6Pjc1NbDfPy7qJem4vYoTFjWTn3c+G8de+JBuSB+qQ6TCImpb/EmToJtWJ78yurdX2cva2UnwuFFFqO0QLMvLEqVWhWZAhvk28Nf9hMiePHsR3v+/r8a3vfBPe+NhZWyYFgK2tgpev3cQffu4pfPILz+Arz7+E51+6iis3bmNtfQNu3cLCpDSsfrMBasjg4Rbj0Rinjx/C6x4+jfe+7Q34wLvfgpNHD/UcY7srg8zq+gb++IvP4L/957+MP/7in3fzCqAPSjx+5lhWUMXNluogGRxf0yC1tpbNAGbk0QBLpVU31uj1kwTzfyky0KS6VjBeQtyAu0M1dAFjH9WtocvCGjOfoEIVELSZlBK9D70osZ0ftICoNyBdpZEI/uo3vR1/44Pvw+MPnsL+vbut6dZWwWeeOodf/b1P49kXL2EyGWN+bhazMzNY2D2HmZkJNje3sLh8D9duLuLFy9fwzPlLWFpejaGoxWwzYvbLRiLYv7Abj589iR/4zvfiQ+9/Z5jIA20HGUqxNja38PQLL+GH/sFP4k+/9Fy7X/2itqF2YmKk1ZzGJDbMDXPUCJNgpHFNWYMSbNlEa5L8F5RBFt75fV13Tafrp0mWbljwYzQgL4crI55NYg9XZiUpp4E6Gk5b9bEDraDI2n+tOzszwRsfPYv//Pu/A+9+y2uxe34uoO+txSV8+dxFjEcjPPTAMczNTDAajcwYdUe2VHm3tgq2trawsrqOL527gI99+s/wrz/1JJ67eAX3VtY8lRLeRaUJp90D6dRlEAC75mbxTW9/I/7e3/wQHjx5BJPJuBephybeXAYAz128gu/9u/8TvnzuooFprBdMQG0IoGHs3SNVN8A70WzxqcPPu9+ASNxLslSJMpJWuv1KZLCUycg3vI/2ru2bSh3cIgFFW2BULVUCNFnvXQyozTmE9g7oHzgcCAm98pnJGA+fPo7v+eZ34Ps/8B4cO7Q/IO2wctvLniyv0tBrdW0dn3ryafzMr/8+PvH5r+DStVudYzSvFC0BhOU7uh49cwI/8gPfiW9955vCDjj3v90ycKmT1s98+Rz+03/4k/jScxeo36jP3jywkSol7uOEWwZ4sQaZULJikXbV1oQx2Ncrk2E8d/aJH+tuCd3XyQ1beOeNlgeKE9FORGJ7neToPN2VUw07CBKVUZSuFuv3hlY6e5EgvIfLyijB1aEDC/j2b3wLfvQHvgsffN/XY+/uXY72acBaZVreQlytz/fGoxEePHUU3/7ut+LR0yewvLKKa7cWcW91NcqeE2nOvZMMgODGnbv49Jeeg4jg0TMnsXvXbBiPIV6VX/199OACjh7ch888dQ637y4bDx7FdOxKHA8ethAFKmwGJFe+ksNXsOOIyRmCITjfB0fRWD/y9cplMIfo2rulK/2eoREdpSK1vjuP/nYmwiD1jIlWAKpQjCw8iDDFMj30eHShI9Ovf+QM/ta/9234oQ99C1770OlgwEo7G8/a+gaWllewvLKGra2Cydg34vjiti0nGo1GeOTMCXz9Gx/Dnvk5vHjpOm4tLpsxdYsIrJPSBwX9rIh7d3kFf/bsi9jc2sIbHj2D+bnZZqTIcvHneDzGyaMHsbq+ji88cx6ra+s07Ix89Z9WxNFqbJSA20ArfaAUyCe2DgpFCJihZbU+20Y2bOLplcoge9/1YTrl7KFZiu49sAN5wpSdWZsbhTpgzhDcwNsZgNfJ93JG1cqwBrIuvTe/axZ/5RvejO//wHvwDW96DcZj3/jiiefa+gaeu3gFT527iOcuXsFLV2/g5p0lrK6vo2wVTCZj7J3fhRNHDuB1D5/G217/KM6eONx0qtal9xaX7uGjn3oS//1PfwRfeeElbG01ji6wXKQXB0q/eWj/An7wg+/Df/Z9H8DMZNzjY2gjj/l67sJl/J1/8vP46Cef9JQu9NtaJOEUBcjGYbOAEElq9CuAsIBiHXkDjSCmGonGF/gB4goU2d19yjDpjLjUkAR/BqAnaxTcwSoyn49V8CDElIeYM8H7/TgRroOe0uywRzim3dU5fmQ//sa/+z78tW95J04dPYTRKKJmKQVfPncRv/WJz+H3P/sULl65gTtL97C4vIJ7K6vY2NwKChYRzM/NYP/e3Thx5CDe/ZbX4nu/7Rvw6ledMnbz+j+XAcC+vbvx7e9+K/btmcff/kc/hYuXb9DgkLwWqt0INHr62Auu317ET/zSR/HQA8fwofe/c7DfIScBgAdPHcWHv/09+LNnL+D8pWuuR+WKkY9Qmz/8e7UpHj7L+CSIpjJA55jqLNq3RhDEVE/nrTDeiqeYIRLdvww+qQ4cgwinAaKzSCkyordEHATevj77Qet3ITQISqbvaixaPh6N8IZHTuO//I/+Kt7zta/H3Iw/D7WxuYVbi0v4vT/9Ev63f/X7+PzTL+Du8gpW1zfMQLbLu0Eyzc5McOb4Yfwn3/Mt+J73v2PwiHc3HtEIN7e28Nt/9AV879/9J1hbX6/jMiCk8mAIFysUAU4fO4Rf+Ad/G088/uC2c4fWZ6eXTfwX/+PP4Wd+7eNY29iMOg1RQNmrWYOBXFcqPQHiOSU7hZGE7D0SUO/nyTk48hi9hORQgL9/GWwOYcXqupa7SuycvFeXZbsJc2RSEjM0JAE5OGJp1CxUbnTEnpOq9+MhsI5lH+Ddu2bxgfe8Ff/07/x1vOW1D2My7k6grq6t49kXL+MXfvMP8KM//vP4F7/yuzh38QqWV9a6J9BQHMFMc9oHo7Ub9+bWFm7eXsLvfvqLWFlbxxOPP4g9837sO0/YGaFHoxEeOX0cm1ub3SaZOQ8hSAA1RULiSXVeCpbureL5l6/im77uDdi9a645z8m/ed4zrvz8qz/4LG4tLpsOGEwLj7fEHWAR7oO92eeV5jBSgTfJECIlCCDMJ6TSgNkkPyUH4cUIvCIZfJVJFH39OIHlqVVZ3bJsDLeBYUY2gYW53sTQ0D9utaty8nqzIYSoYApHLKAP6qmjB/G93/aN+Ps//O/jyMF9ALq5wVdeeAkf+b1P47/+iV/EL/32p3D91iKFKphCu76IuD1qV+tayIavdADYKgV/+qXnMDs7wdvf+BjGo1ETpbP+AOCxsyfx2aeexwsvX4sRwRyfQ25d7zPU8M8tFNy6s4y9e3bhra99uDf5z6thmZdSCg4fWMDl67fxqSefqRYe01MIz3dSCFPNkJGXSoMNO+g6yWDpr9ldxAZzCrbwBB5qL8bnfcoQIoS/EsVRnNE9e5p1KpJWikrfeBGI1FSJFaS8SRVXqJwhKAumX7v+X/vQA/hbf+3b8B9/9/sNpV++dgu/8rt/gh//hd/Az/76x3Hp+q3EDynUcj6JitTbKme9L2mkCgq+8Mx5vPHRB/HomROmpyGnUAPdNTeD3bvm8PHPfBkrK2vQKG1zMhFyClqWzqNTBCtr67i3soY3v+YhHD+8f9t+W1GrlIIHjh/G//HRT2B1dc3pk65rQk56IzbC6xXdjmpHrnMbyr4MsT+OGrwiFfkyPrRqKLw/GcazZ574MdeXe6kwKbZBNpYwyJyTspB6mweRBiN0EB0kC8cPAZlDVdqj8Qhve/2j+JH/4Dvxgfe8FXt378LG5ib+4HNfwT/+uV/Hz/767+NLz13A5qZuiFlCGs9MBcCIkSPPw+y5c/1eeVtb38DVW3fw/nd8DfbM72ou6ea5xWg0wt7du/Dsi5fwlRdeMn1pNOhFiGTk2bZuLS7jxJH9ePNrHsIM7WSHyD4QtUQEC7vn8fmnX8BTz79kwBdiAUf9CgQRkf2TT0KDnTibCMtA/YVnJMQNuAjZn84j2LeYzn3KMJ4788SPcZixNWFowqMUnFQ3Ln4swxzIBhru0RVRCw8Gh8LAGFmc5SN+3x0oDuZ4PMa73vQa/L2/+SG884lXY37XHNbWN/Dj//tv4B/99K/ij77w51hc7p4BiMck9DPvk+jg+X3jMa83G4YQPQB3l1fwyOkTeP0jZzB0ZYPcM78LtxaX8AefewrrG5vdWFg/bkThbA/xyyt2axsbEABve90jOHpwXz9SN/jgaDESwWQyxq987NM2HgE0tNBSOG0v4CgQeXV9mS63kUEIBHryAnGCrPXIwGHzWhqnHWQYuYeQIWpHpf4oXSN7UxocnS2lqgauxiHKCssQwlgEiELG5AqSVEvZdF5FBO/92tfjn/7of4i3vu5hzEzGOHfxCv76f/MT+B/+5a/i2QuX62QZxm9mIEwCTcleVmwUOTfWsoRKVV83F5fw23/8JDY2Nl1PZHit/H1mMsYTjz+I17zqFIoNRN+QQ5rGMoiOV1f2J196Fl+sm3YAkFe7hvjQ8jc+9iBe//Dp2Fd1SN8DIH0ofYoC5iQ8lCzSdjIYb9Q3G5ECRTU8yXRzJLoPGbrdKeqjgDbkROz1KzaprQwURnBzktpex5Jva1gtyowOkHlfbeOfKrwvgypqdD92zc3gO979Vvzc3/9hPHjyKO6trOEjH/s0PvQj/xi/+rFPY/neGsmWFElXVE5kqUKVjkYiRUZAI1FEsLm5hecuXMFzFy83c3aWiw3zsbMn8dqHTlekSvw0ZXAdaYqlBrC0vILf/8xTuHnnblhezZty/Ju/H9q3B9/wltdAB9PtncBCUdB4SuNZ1eSpcd/gt5PB9evgU8wAsy6inkr45/5kmACIa7jEiwrjWxGFwlREb8tRMwFKR3wZTMOgp02dQxMi2hvVuF3XbynAvj3z+K73fh3+qx/8IObnZnHlxm38/G/8If6X/+u3cfHqDeN9POqOJkzG3eOak/EY4/GoLsN2uXu33NgtgWo/o9Goe/HtwFXQPSnH8uvjoVtbW9jcKhiPRrh8/TYeO3sy1At0Urp2YGEPHjlzArvn57B0T8866QA0+BHSjemumFF96ovP4Pqtuzi8f6Fp+EPzChHB3vldePOrH8LMZIL1jQ0aLR8HUSQ2oIJH99bR9/BiJq2/vQyhndlFcWMPqRrJYt1XMJOyowyTYny62ZX6r62oaDoEn0DGJyFooAw0+4jo3qoi6e6yKyWTnZ1MsGtuBrvmZrF71yzm52axZ34O73zi1fjBD34zjh3ch43NLZx76Squ3LyNb3r7GzA7M8FkPMbszAQzkzFmZ2YwOzPB7GSM2dlJfVPeDEYjsTdkTMYjTCZjzTgxmYx7b9Hja6tOnu33VsH65ga2tgo2N7ewvrGJPfNzOHPiSGiXI0SeXAPAQ6eO4uC+vVhaXonoVyNj0+BCPVfgsy9ewsUrN/DY2ZO2Q5+voZO94/HIHmd97uIVQ0YDsVb/wSR4nlj/oWHubHlnGQBa+HCD4Y5C8HR6zKz2v70Mky73klCpJGq9yAdaK2YlBFmkn03UupPxCAt75nFg7x7s2zuP/Xt3Y2FP97lvzzz27ZnH3t27sGd+zl73ODc7g12z7hgPnjyKIwcW0G1uCV7zqlN4/MPfgcl4hJnJGOPxuHmmJ//mlZ+h3duh7zu1B/pG3/qdaZ062r3QLM5X4AgYUBgIA6RXrbu+voEnnzmPb3jzazAj48DXTvoQERw5sICHTx/HcxevOGhrBlnISFPKqRhnLKUjDMb2fciAQk5F9VwGW96h/rq2eYVrJxnCu125P95BbPHrIlGgK4CMBAu7d+HowX04dmgfjh06gOOH9uHoof04dnAfjhxYwMKe+e6dprMzmJvp3ms6OzOpr3Lsvs/MjDEzHlsas90xivFohAMLezB0DR20Yzr3m1e3aA0ZfMv4duJHRHDk4D7bQ2nyjLih6WkDaEgU5ASfe/p5bGxuYnam9yrfkCJlOUUEBxb24Mzxw1o5ZiqBExobA0vSQwDNjsmYZWwvg4T9IOWZ+xX2t65cv+f5xjYymIaMUK0UcjGdfUvX7cxkjGOH9uPsySM4c/wwzhw/3IXWE0dw/PB+7J3fFXL1yXhk38fjLjffbhmwtYmVr53u57o7bYy9EuTfbud5J4dp8Z7bHNi7G7tmZ2LIFgdTJwRHYwBsX/4cQcFTz18M850hPlrLrwcW9uDsySOYjEfY2ip2HCd1FxjrltSLPwNjgsL3j1KavJMMMWPRJf8IC6kTZoj4gftVrirARFOODqkdoXfNzuDgwh686oGjeNWp43jo1FGcPXkED548ipNHDmB2ZrJjemDKafweyltNrFSWDa6F6kOhP/++n4gx9LvVT67XcpydUjFuNzc7g8lkHEMz3JACbUF6ETN8wGvRs+cvY70eWmxFhBa46L3JeITv//b34G2vfwTnLl7F8y9dxbMXLuH8pWu4dWepeyv5+gbW1jewsraONe2ndq5THmXGncF5vR8ZisntfuTpkf8IizrUj0WpMC+gtL/Wn7z3a1+PwwcWcPrYITxw7BBOHz+M08cP48yJwzi0b29zgIcMaicDZlpDAzB0DQ3ekLFu53D3K8PQvfuJYENXlqNlmDOTMcZSJ/T1nJUvcCQ+C1kD2Dbc2lbW1nDt1iIOH1gIfOwEQnodObgP7z74Onzjm11nW6Xg9t1lXLxyAy9euo4XL1/H8xev4MKV67h5ZwmLy/ewuLSCxaV7uL20jJXV9ZiGsCnehwy9NKtQWp9DS/3p8QT0ehvNl2DpE+VWmPzLv/dD3RsmtjFgWPv2IO5kfFw+ZEhDqy9D9bcb0KE5wU5OkXloyTfE63ZX5qulKy7b2NzqTr3aDDClSiHWx5vOSuT38o3bvec1WjLsFN31Govg0L69OLRvL97wyBmru7VVcGtxCZeu38Kla7fw8rWb3buqbtzGtZuLuHbrDq7dWsSVG3dwa3HJeb0PGcJNjTYmg6dDfTpULgQuWk4OMhlyhmzA2Ui3SxWyoltovNPKzv2kTPy7xfeQwfHvITocaTLPuT7T2e7aLr1kvtbWN7rddYsC6AGqcOznJVjli8cBwG0zvj4/2+k51891sq7HY8HhAws4tH+vHVsppWB1bR3Xb9/F9VuLuH57EVdvLnbOcuk6Xrx8DRcud1Hm9t17KOk9UaYCRf0QZDr5exHT6qR5Rj6EahGo+02T6riTOZT7Dxla/p7bDA3CTpEgXztFnJ2Q/H6ixJCxb5d3D0XS3H/upyX30soq1jf0xWce6v1JM4I10wenVH2ad5b8LFfms+Xo243vTo6Uo7RINy964NghnDp60O5tbG7hztIy7ty91z2huHQPL1+7iaeefwlPnbuIr7zwEs6/fA0ra+uqxdq2ZjthbtAV6n7FUHbmtl9Ijx59zCGyIQylLa9kPrFT6tNCmFZakem26AwNTL7WNzaxurqOLRSs1ZcQbxVgeWWVHs6J1+bmFpZXVu0FZXyNRLB71xzinpdgftcsxqPuZQRzsxOMR6NtUVd5L6VLOe6trvOow/JnLrMg4cuc/gwwrK6ge0IwZwCtyf0QKA6loUPtW/1wO5FuM/Tw/oWwi765tYWVtXWsrq5jZW0dtxeX8PT5S3jymRfwmS8/h89+5XncvH3X9VGq3CSrRQX2HNJHbVGZqf/UexNmcMgpwlDvEAVy9FCF6Juvu2MNW9jcLPZ9a6vQvYLNzU0srazi7vIKFpdXcHf5Hu4ur2Dp3hqWV1Zwt74BY3llFYtLK1heXcPK6hpW19a7z/UN3Ftdw8raOlZWut8ra+sum2UXldeMIr3ftLTBk7lUv0mP2s7vmsVkNMbs7BhzM91G4/zcbPcsxPwc5ma6TcfFpXv2x05aaI8ez5w4138KgkHkB4XuN7L+Rept157LWvUm4zH2zncvcgCAB44dwuseOYPveu/bAHSAdv7SVXzmy+fwmafO4bNPncOFyzewvLJqY94d8c/gwU6Zogrtm0xaqZFeGUXyvdW1dayub/jn6jpW17ult7X1DaxtbGJtfR13l1dwa3EZt+8u487dZQuPd5bv4e6SGz1/bm2RAMq45s4BHXv6jsbYMW88c4g1JwbiI4hu4XD06crtfUC1mr331vLY6E0FWr/g3spaJ8Ny7MYndeg7F8d/Bh8ba9YNqQwsn+DQ/r1h7IZSvu0i8P2mta1rp1Rzp371+8xkjEdOn8DDDxzHd3/zOwAAl67dwpPPvIAvPHMeXzp3ERcuX8eNO3dx4/Zd3LyzhI3NzToOPMaw77bJzCkTMwDA0Hfp3gru3lvB0vIqFu+tVKRexfK9FdxZ6nK/29XIby8u1+W2zqiXlleweG8Fm5tbPmBsc8aYl9mkyX5zxAG6P3hIdbINBroRxYUJ50STjVnrJf+wolq31MHqoXX4Y45RyDDuLd4tndWIFKMTy6CH7F1ZtW9dfyE8OFLTEga2oblgjvhL91bx9PmXsbK6hoXd81jYM4+F3buwZ/cuzG2zHzVEL/c31G4oTcsynDhyACeOHMD73/EENje3cPXWHTz74mU88+LLePr5l3H+Ujdpv3DlBq7fWrTXiZpy1OhKweSzT53D9epJN+/cxc3FJdxedBS/W52gS1/umUOsrK13qwFZmIH0w+zNxq4OaEn12AgEvmFDuZ6kNi1lRi0C8SQtaqiMWB6QGoD9DTuzs2TN4s3cv1iQyhchUFz37vjKewymAlCfLRlQ+uCgOk3R7uihfT3D3W7Sz2WXrt/C//x/fhRfevYCFupZM3WKfXt248C+PTi4sAeH9u/FwYU9OLCwBwf3dZ+75+fCqeGhifzQ2LXmotvJMB6PcOLwARw/tB/vetOrsbm5hSs3buPFuor1wstX8ecvXsKXn7uIZy9c7pZ+TX+CyQ//d//C/tLNvfqp+TYPtCNkh0T6+J7eMsbyoLKP5IHrlZkaYsoAOOrGao6CLW2qEYUUq58aSeYF0ab8KIsbrw0OSq0X4d6QjOmaw0lMA82xHFQiiwMymLMR6706wMzMGPvTXzxqrSYNIfTS8gqev3gVTz79gvdUnXMyHmHXXHcKeb6eRub/9y/sxqmjB3HqyEGcOHIAJ+3zQO8PUjJvOaLcT5rXkmE8HlkE+bo3PIq19Q3cvHMXV27cweUbt/HM+ZdtLvLshcuYPPn0+QoqES+FJhqsbQ/UA2icr6YhDhhwrd+etLJzUH1Btt50T9Rja5nE+4AjLzt+M5WRHhk6t+nshkFRRJfEm2rX+ZZ+h7FtUwaNSBkwvO6pIwftDeHefXsPpHUtr3ZAaWouzuL6xiY2Nldwd2nF+SHHH4lgRg9wTsbd90l3LP/owX148NRRnD1+GKdPHMHZekLiwZNH7WhQyzH+IjJo+cxkjOOHD+DYof14A87gG978GnzP+9+BpXuruHTtFiaWtRRf1iuaUpQSUmyzaRo3ixfxjQAAIABJREFU71+Nygv9XU3dZy9MQvrGT8yHteLmKwp3+E5lsW8dWDVSlbm7achPRmVSGkk3ZJ/z9j02/LkAVh3pUtMj1UXvD8WYWFkGvYEAGGYcteDxV53CZNx/tqO1qtjSv6bJlhGwzhKPqGOKKsNWKd0S6upaL+159sJl/NEXnrG6CgqTyRhnTxzBI6eP49EzJ/Dw6eN49MxxPHjyKHbNzWCmOpR+smxDMgztr8zNTDA3sxeH9y/gzPHDvA/hw6UpgaOYvu5ePCcWGuyA0LTioYxIiio0mPkYeXA2TT9UYSW+/a0fDkwYqstpkW9u6byaJ54aJ01hltZ4WtRLZdBfXRKbF7B+SvdG9KpPm2/xokFI/2pqWus3ZTD+NToUVyPx/+jZE/aOqE6N2+8xuRq7OjcXl2xjzzfElUYfkX2cq/6IH6kIIDRG2NLHhQXAFja3NvH0Cy/hmfMvB3DTP3559sSR7v962vqBY4ewsHsX9u7unqNZ2L3L5i7ZCXu8JmeZqFYLGaYasw1HUlJPeRzdG5Mlcy6ztr4K2dFyHX43kRmxstukh16EsJSHw1pehrNopmmImGN2/HF/Ka3hUFHUiI35Ss9cpt9ceTbStX6cwPVkCBFWn39nLy8Fr37wFMbj+Cqa7XLzXH7j9l3cvrvkPChYBVBh4ycZlB8FsBBd718GQLC+sYnnLlzBuQuXHagAzM7O4NSRg3jgeHc49czxwzh19CCOHNiHowcXcGj/Ag7v34uD+/ZgZuILq61oUh8hFe8X1WvTpI/MJCC8DyAqAlBZVjIQF0oyUhWvFCavEIQcnD8ZsVqeoQZV+cvOwOgfUyyE9NBQO0dEUq5oH50lxzQP6PUddAJSNB3ayc+79+ZiQn1TlFaNz++aw+MPntw2rWhdOi4ra+u4dvMOVtc2+ilzYMdcnXQKFNPBMA7tJEPIOtCvs7a+gedfvornX75qdMajMQ7u24Pjhw/4w2oH9+P4kf04deQQTh/vjpEcP3QAc7MTk3li3kwdSOjUPwoLY4ZIvGsYNAOXlB5FZfqKSuxLHdTuFQRn6oFrdlCl0vqbTyxrcEgtQ7U976WHotUwLZ6K85nCSCMKKaBWtA7zGO3H+Q7LvT0ZAjsIY1kN6aEHjuHYwf1RL9I/umGt0qT17vIKrty8XfvhQdcP5c15YmDK0QJZl1GlTRkskS1qh93SewAp00X3ZWNzE9dudidrVW+j0Qi75+ewf+9uHFjYg/17d+PIgQWcPXkEj545gUdPH69HN2wuQGGPeLI0kW+kCvZ8h6ZalvoV30vQ6lVAdbyewRUKoyyvAi2ykXaV2oZbP4lWnuOE+QKK/ZGOkMax7HWAt412zAN8sAvUAIs7otJj5wwRYhsZQiqm95yH1z18Gvv2ztvYMK/6PadSnFLdubuMl6/dAlmJzeNEFBTY6RNiAvwn/XrgYExvI4MEA9CU3pSCuACCIGv9AaBgq2xhcanbU7tw5UaVoXs4TpeM4zPV2RmQjc64rUZCp1YDotZ0B2nFhgzaBpel0ElWcoYeyjIyVT7CODDZzL6RJDQ2unEeI6Ts3nPMmuYY+qV7WqQ71tQHavRsmga16e3FJBkUrNwx1WDqmIjgTa9+VXjeRctb3/U3G+O124v1XJXza9mgHaWmsbRI4M7cS69NgJ1lcAQA+I9RMr2wqNGjp/XiONgq9VaXFq6sreNmWcKIw154k0bgGjUXFEsVAvRph6XUkJiE5xDISjOBnI4oP6VUbWkOqf3U8nqv1N/FQlm9Vw0qDgClAyA0Np7Y+Ao8/LszGB/VEGIGlp2mgP4IQmBD38xnLBYVraYIhbQ/IEP3J6cQh8LsouDE4f143cOneyd0+eLUKciH7tU6V2/ewYXL16uhueydVorx7gAAu6O+oiXGG/3NkZ1kIHRKWy26vFtl6NVzeyk6DvchQ91VVxOnQWclATaw+pC4MmNOot8buaLPEYQEd8P1e0KoLoGegTD3UcO8fap35TlLQq+Od17ZoI+MdMYLyUQ278unhFSEdIaeJqeSc7nMF2s7IT2UbWSIcyR40K2g8vpHzuDsiSPB6PkzO0JO91bX1vDn5y9heWUt8FwbOI6Tgau+LA1Vsya9iYKnYEcZHAi7fhyvGHw8TbdxKWruyrfclwyjbgGDI4GPmr2WEoCuiXsa43Qtn/bKwTGYuKK2GnKeKJozEt8qtAeGiLqwNmmtWX8T6quCmNXCfLJsJX3PUQIl0kcXS7r77DgUzYo6COuF+lGnKj6UQzJwxDBIq2M/Ho3w+kfO4IFjB3tzB54zdF1K7zcA3L23iiefOe86rvKajYS3DSONmY5H3jOpsguB6oAMzIuNS0nlqjLWN4GqgeJ9yjBSm+zstASCYvHHOQlKC06hCqgEegPcFzbMNANbEo3EtFWIL1eQKrK1ps65KAGYGwlo0w1sfL3OrUOPqr5ZFmTIjlkVapNpLSM8UHWYM9HNIRmCxsRrlFJw7NB+vPGxs9i9a8544bEbWnplvheX7+GzT51ToaCbs6IvJO4hI+tL+wqwHe8FC+7LwEBFOG1dsBshfDd0DWB/PzKMNH2IhsaRwRGkQ6fIhpNyoQhM/R55LTNoTQWInVJZL73Sf4oZd3/+k5XkCMhRSRIPbiDMs94X+BvJGaEdnXQ+FBYjWBbhMSKAqOXRzolGSwYCKuekq/PomeN486tfZfc4Slj9bdKnrVJw7sIVPP/yVWjEEusXidHsFGbZSYZk0UpvQAZWgdC/+pXLSt/oEhjfnwwj3fSye+YAyl004LhrG3M65UztpKdwZYQHgCa+xYRoISz7ixpDXU9H6Rl7aJ+912RTfTkDOvkrlrbQmJXSTcqonoV+7iOMuVhbcyiWQ+tlmxr6TTJYpAECIMzNTPDE4w/ikdPHuxoS9x2Gdqf52trcwv/zx1+sf0qg81Y7cSDxyEaMcmzcpV0HBXa0fkAGjRLBFgqXw8a+k5H74zZSJ9L3J8Oo71geHYrob2ebJzMhVqTQUNKIsjN2dkSQKkQ3h/JqcGZnGkprOxFaopN68KJQtAiwS3k8Iz9ttNhGm8lEBwy1L6nRlK0z0dNVJCsLwOK89TKkHDW3kcEnri5DQcGBfXvwxOOvsjebuyo8wuT9hlxvZX0dv/XJz9NUJxp3S5zed5FoBZwCivPQkkGjhPPmNhjmPgE8HRQ1awDwimRovA9ald8NqJhnwTw2CFzHXcObejCnWb77KrVuRHNLXSoRS8tq9GDlQLIh8P/Urw52I5e39EXbG7k+X4Y2lfcQDXj+o11pWsS5USGabCKFNuGgEV5hhhxqQAaPqDwsgl2zMzha/9jk0NWaO7CTfOXcS/jzF18OVuOGmHRkTgYDJaXpsrFTe9mQDA2O3cisM71D9etYFbWzBEY7yWB/MIUn1DpGPJnjXNcGw8KPh0pbPXIOXEadsErrnt9XRDD5ya5cERLpsQ6rI/TSAmOthL6lkHzGlxhdtmveuOtM1vkUU35yRFdjdCKw/ORo2k/LMEiGgMYqcyXFfzUor8pxCtU8RiGCj/zen0Q/DIMARCOOiY+rUdwUeqkI7VU0ZGhdeQUxsGagLL3br0SGkZWXdAISDrxxvZfpO1KHkEsiY6B+MAAzbPZ0CQ5QkhCc92uY8s0Zdkrqk1Mc66c4X3n+QXOVbqC8vKA6EvHgrGj/VYNFzSTqI8ggAgjJEAx5exks1aqGvryyiguXrweDbx3VyJc6yp2le/joJ58kXfAYlF676Nhtc+63kmBNWYZ+OzpuYv+ShTVwKGQa9ynDKDqdo5c1LLRuS/870LJxpb7UUFoCcghlCNbONVJomiWRv4jilIsTHVeEuG2bWG5YXa3YOGaHHj2JYp0fOw+O6dkRAAnL0nVWZOlF1bOlQsXlM3p9GfhytQhuLS7js1953l883EgZWt9VJ3/4uadw8coNQ3WXAT5WKkO+xO+GYjLY3j5SQwaOOmHH2r51+jENWpVC9eQVy2DPf/v5cw11aoidUYqktImEN2nqvSAYTeRcWFQDSKMr8HydL4l1TAP0PcwrOBJWxzOHIhkrzHtwqgJ6qKdIo/dMhg7hnFXqm+ZMHRkfUO1HFxCcx1q3+KKFB7m2DNpvTs83NjfxR194Bn/wuafQsj1OmfLkenF5BT/9qx/r/mqr+jrLZ18jwvPVO8JiHaso+V5fBgYDyVEnoHzUFTuT9fkKZBgZmqoxJvTUfwutAESiXtUnwVSFo0PKAdWDC71tTm1fJ6i8fEaEGtGifrYmxMEoCGaF6CbZObQ627QCp/WtTuQvKj/zpewK0VKemE7sqykDUopRZXjq3EX81Ec+hqfPv2TzCb56x2oALC7dwz/7xd/CJ598uvtbEAQ6wbEkF3AGEE/SBq4TYDGWt2Swytl/xP4Z6EPi71cgw3ju7BM/1t2n80AV+UQiU+YenNL0+CRm4IOsyBqX2pQiRQXhk6USaRppUlKOEgES4pKpt1UZ6F79HlbG7N1KXl+q4/vEnzYFqV4XfMT4cLlMUTZgvCKl49T5Ox+xaMhg6gjZOHT179zFy7h+6y5OHD6AE4cPhEcqQeOxtVXw4uXr+Jlf+zh+6iO/i6s3F+l+jEw2NpR26DKzL4EXlMaL29xRLOjtKEOI9hGnK510ZF0i5r9SGcazZ77mx/pr1dy3H+y29WEVrpTGA/GBnY6eEfBjEkrRjJEQ0pboLO/mdiQQnEzPadjgA8oQErvlwVMdgwSiVT+qLIEXNQIy1vhXacjZrJ4DgsoaJsCge8RRTwaI69SONzt4bdVI8eVzF7C4dA+j0cj+Xp+I4O69FTx74TI++qnP43/95d/BL370E7h6azH0SaLqiBILOn7phLMIgVwETVUJO8p2MnTqKaCz5M6bDjnpN/wRxb+ADLLwrg97QsBGWb0cTKzhgUrYdwzj3TAlKOyd3ie5I8AGC/+Zy7O9Oy1xmNX6itq9VAvu1MWNLm8Y2Z+BSnriyNHRQd0EUjrMIzOK/n0g9k31WGCWwV72RlWHVpD2zM/h8bMncfLoQezdvQsjEaysruPyjdt49sIlXLlxp9emf20jA3xsG2xvQ/H+ZeiXF4sSodP/DzLI3nd+uKiXSB1U1DdGlAB12hrJ4xInNPi8fNsa5DD5MsPYRjI2Hq5nhtTx7nU9tjUjQsdE/MlDqjQkaa034jB0i/WobYg4mR929pL6ENdLkkEdQuc7OSVxMoXK+3W0Jt/PV8xWdrK+lNtoi+2caEpkGFlupWlHcYOgPUc73h2ioKKh/rQJTFemO5F9VIbdDzwJyFWJtADdiweKl1taBfhEzstMHvZeyzOJX7oHDcPMl0j8ZJGL0mT5WVYSoNemhE/7rsZRx8L7a8hQYH7CV4g6SrPq24/hlNAmIC031fo5khePlP25qZ9gsPZ+M2DAtMkw8omvHpKDDXLRmrpJVo2Ppedfzc0ejgAmfcmVTPpS0spwANtOk72d10Y603O0nObAfMD5FpWpVLm9n6T6rp7ZqCSbTyPCY2RdOWgoRZ9DSKg7JIMBSolyMbfS6y8QNB5baYeBQ3b02rxPsy9fhPmke2DqZBjxLrReBsRkKLb2zl6llWu4S1YDMy77qZBejUDblu6en4Hi5Vak3JEmm9oWzpMhSCmk26wMktl4pwHIiK4R0groJvGpfYRJWzXkjAHB2EkOu6cyWJ0hGTTi1YhjAKfNIkgVe0CJ+2s4oMneL7dzVsKVUkMCwG54lS9ptJkeGUZsEJwkOappaNF2FHREU4xangcZtggXmcroUBt4OJS+MwbQJXr9oARdzXHspTZkfeG4MDHnswodPKGoRo4Z2vltllezMgMP/nSJ4Gd6lQ5HnWEZQscqe/Rm78VSXpalYZyBZAk+b+lLzzG5OUeHsIAe09Te9dWXYeRnxfkWD5yGiwpQtLKRiTVkIwGDVPETMA/vpV0kt+bO2UEs3DZ5qM5BYbYAPqGvCgtTBNa19dWgX2K7JArUyTsHJxoc4fS3tHZ+yaMaMiRm0DcMbePR0wWjZrnPHg2B60iavbeb+zh7BNeigcjyVZZhZA+sFH3YBoij7J5qUSI7bzBOQuA8H9D7QgNdKqImA++jKDlWsX+cRc35M09UZkvDAHTDplRjj7vBjGaxr4D0pCc+qOe1SVEqbuCTz4glkChVfyZbX4augA2E+eFrCJGBlkeHVJNoOLj7KYPW5e3FPvI5OeHUaIpkGHnK45MSe7WistUwlmFeXSjJqFeYeYpKkuvAkbkVEUH3+Xcjj7TDd+A0TPpNaorCq1D+qXGTdqR77Hjfvoxod8mQpXv3VJXR9J9407+/YWnZgAz9yUk9n9TjcOjqt2+BMHcZVvu4ZYoCnnXwuDjie/n0yDDqA3E9xcnHFhCF5By+F/okO2U/n4uM0m8yRvfkUgMJG6pGssw59VfpSeXRAbh4XU4srZl7oL7KxCrxKww5eBAa5eClSO+beCpWmjAnvgy9tpEhCE6A1Vt14+jDbVmJQY4h2soPDRIvRgyUc8rUzJSmSIZRH+z0aAZ15GEkZkvFQ2F4loIdJYeuxHDmW5m3rEpXn8jTSpH4FpcqVLcCRsqx5ckqAuX84Z2p6njGAB/LVnqUd3LkEpATikVXIceMO9qdcxdqVitFvgzBhmXwts5PSaPfpSY0jmGyxGQUcDxy+x9q6WTyY+muBj8bSYsCzqzrhXL4/sR6emQYmYOQcbgxeJ+F7nX0S2SG0qSAZBziszNoWLRQSwZKUOu5XnRKdx4xJdxXmK20+6dMnV+jwxGnR7w4+oQFCHJKks9JSjLqjo+SdToIpwj6ccJVV4F4HqcGzYygzcsxW6uKeGkvPa5tnKw7gW7YlimUYWQHs2gC2f0U9+aS7EGSddSfnkrRKc2wkqRtiyPngMfb7jN5dukZJykqfzJaqYeR43j+LlE7pCyWU11TyztkUf4k6YT4VDpCO8wZxer9cO4/TnDaMqSXSLcdKJup81hCUTYV7TLS7J89S22SVca6hh4QpKM2UyLDyCaAhGoWtdWrq12bQwf6bipuk25kVp3bNKJFXCHKB9zo1CyovvZTFRnStJQLFnpE1pd2OsH07SIWqUhxhctKFD7jYWG+VGm1rPmcQP5kUGmBYJaBnN9eJbrttSOEwgBAuwkAwydw+238+1A/UlNaspYpk2Hkh+L8hqgRBEsmYyCn6qVHhraApjO9E7mZDzVgRszIpwkTbrBuOWRzNeMnnpnnpT6xRhLaSFVeId2oE0qgDQpWZPQilrPynxf2JUcKa9SnpU4ZNLIM9V7J/ISmTMRXu3rPtKkzcmBlfhpPrTUW1Y1YbyndWGg4/BTJMPLB6AtnL/yundFH/eFOwKsoXWrug2pr6dxLBhKOFDm8VAYcgVUa1l5sZ4oxhvt89jqngGPyAQYYPhBRJ+Gqssq2ilM3pHmDReS4gBDbJhn0HqWhyp8al+MJuWvpq98E1ZdahzRDAv+2QdpUAFwGSXQk6WMKZRjp5JiXVwv8vKt2K/U/fdS01MGueKhD2+vb1u7tVjXk4J1uhsW15cZS21jgaOSEdLPjtyrY5kDk9IUjmTmR9+yrSTFSeSxhmYLXeuWKhj6YfVm7moYgDQOjgW3JoHpJ9UX7MwNk+FWLK15U25q5FWpnLQaiQSvnb1atvAY1TZ8Mo0Lhmu+pA9dxJaE0lVD6tOWkS4QmLLsMG664ExYVg+rzfEJpVdpstqGNKcLr2nKfVa/OXVxn1jfDjdCufTEx3cs5pbPoxQ5Z6VOaVFjvjBxAGqZ+2aAMpIP4PfEY6jAd5bPEtnQ7PNuMHZ43UBwhWqEmp8VgutMjg0WIGF7IK9A9UdYZCB/m00+NHYnxEn92/JPVUUrTY01XXRKtojQkF6KBVKLg4yRKHqwSx8eBpy4jFopwDf3QIMRxrjOErCceRIoUEgioCsQdcxsZ+srrX1E1HImpr9C5ddQzSl15LLbMLNZHWrk2WmysDgzTKcNI/+Qup0w6kewMxjfqWnwra4yiKm+Qga2D6hjzbNQhIhWrFx80UufSB4eIweI0CURq18X7yqgf9eMRxin0v/NtUn4+PCbWJ0dJoZsS6Vk72UaGoCzXRY7oTJPz8HzFAauglG7yCqAxMXRUolMwPxseMMHITo8MI5vsMnBXBpSvYuV0GK3S7wZJHOXcfvu6oY6CcZtxZqOQpAmmp07AkYQjG9NmRxOqJ+keOUtuG8INaZ1lCJEqy0eOkHQReSR+cvssQy+0UIqoPGT1bYfG2yI1Oy+SQQ01vI/Op0yGkWJZv/9quGZjxFhGf/7FyMWD3HuegNux0NnbqNRWsTrjCs8dIJXB67mjMZ/Jbf11GgiC6rJrP1eMUSkpe7i/ThqnqW29fS8dHpLBFNO/WnPdXv/tW7X9tgR27OM+mnsfUyTDyHKtXkbgnuqhWqB/UcgdO4U3wF5UYHMPEQtzQ0YeURscluBHLPiVNAiRgXcTzJmFf+lddRzqmxkr4C2K+qFPfUGzgEQXJkNRGYJeOCrRfaNSXJdofbZl4J+hot7OixP5fhaiAPpXfuIDPdSwRSxfZaDcbqd7UyTDyGy6xNwtrrnX/9TwhDNkQi/O7UTHPjtCsf6sNqFlYcfQlIjyQDu3xDKaE6V0g/rxA2POo5FgpUt9eo11ojYYDLfYBqbzofG2epVFLD7Z2v3T26dQApbfOgAMyWBOJ6y3TgZzzPqdj9X4+LWBkN+20t9ENCEgZAeFv4S5l/atPbolCwPHlMgwKsoYI3fp0LeYkVUjpLxfghYQDCdczC8bgCElQruwEgX+SuWFfppOVdHqSPpViAePKODfgEU+fe5bakTU5xFC+0pc9zNURYVDS0CvtMMQutd1LBu9yqIbzaAMKndWeon9BTMIE1KKioUYsy7UuTMltgPlk7CWh88c3HvMupgmGUZ+uyJxPezn3ldXmUKaZDxUBdCsXbysJwl5Ru+YRagXVKYe2peJwkQ8KdtwVCYn+koT7Y6MMfNrRdnT4Ue9A9s+QMZXdv4knySerYwHtSGDB2d3mn5dQmNKN4kSySD1e0VPbpuNtuHh0rvHqzmpPYHCNMlgDwj5J0UGSlWK9B6D91QmpFDJc5MCwmSyxHuxjMOnCuk04+50oseRzOYR3taOzRty1MhgPBYbmJzvhoUndQApoW04tsL8soxGW0zXxlKhz21kMI9VGYTq9v3X9BjvV4sUP30A8Pur3LRMa73VNuILfKuPLv5cQyyfFhlGvPrJ3sfnZYxudtzgbKkD4QpKx+nzA0XZd1TwwDS/GS/xF5mk7/l+YtvzTD3OrTx2zm/pSuWHWGPBPatUvjj9IX55/AokGjojo0YmH/tBGQIjVq30avicqCGDkabTvazf1C/z3Z8gS39MVTai1V4B+urLMLIxyGHdEnTUQXdDgTLFzpRzn9IoS6L3lki9IUkJNxJNnZJGQtwytovfKxF19DxVNGydJHuIVbRnRYfgxtHABYFOyp2Os6X0uG+xl8RRbLUIUoZlYGUG3fWPOEt2cKptB90kPeSTwJEswnTROgLhiyA+pp7uiP0OIz0lMtgjpIbY8AeEzNtoMHSVKfiOcafeGG/oIb2wgSYShGsHCY0KVb3CivKcQkTSyV49d099atBUxw/KLvXV9d0cysqMx65zRhxhGXJqkMjXaG68ijk1Db7mWNRID1cOykBlgDuu/1Fyr6JL4FRUAaAkGUrQLe/1BJtlYGrEq3gpcjIM9g/0TYMM9gipnbMvjq0a/jWtKghtA7Phh9lrCfeLMaJIR+FTktIs0hUimw2PQhQz6CxQqKTwSeVhqY8iRH5bnK5tW58JvdzAC2zDwuErKqm4bv25AR0hqPK6n7r61ZIh9A2jSSHVVNOEHU7vlI7Ee3xwktmIz4oM6QI12+WTywJ7g+MUymCvoTE1K2IHhE+MS/qtdRJzIapYLTfEsJipEhsaI7ZNAJqYolyfBKayMHD0vSPbNzSxZdgqYxhEOsKiiOad+sA7tQbfJTp5SAPEfIrl78tQNSTOQRSD9F5S1NK6xI85KYFBCfe3RUIirpNnH/+Ox5gu8inUaZFhxMQ19+sMVKB5NvtrHo+wmx0koe9sq5xLsiezzWRbEnVEQkvVhgDIzmAhqdTB6fkq7Ub7SlmIOGTc4diKtlH0Vk9uIYiSUx4LfWeaNrJebH1W5lsyeF+esxu4qPxA1HUoZ3oMZE48qCQgZ+038xNcodIiHmMqGQFqGmTo/iwvR3Nul4zfUL0o02R42og0YdEfjUuRlzqwsJmUYZs7ahw0qdZjHbbbXNMeT8NKz4Yg8F3mzJykMnW60hdEeOhLqm8RINNpKUM7zn3D+m7JED5hovedJl09FhppGBPnf6O1Zrqe2DR5HWJsimQILyrrP93mZHSeoTN1oxzy/xIZY2NiSRh586AnZ9Bowmv25oyDSkhtmB/ro708GAT2H1BnD8c8ihoB/F4ICyURtUbkyH1c8T5y2yjD4HPLqPdS1OKoblPbUs+ahXrOEO/0lsRPUVswFbgd9PdvSuRtSmWoq0zFBTLmnctufGvn1ZBtkqROot89QfQ5hKU0HkGMSY6tnJ9ZyiJ2G7kPXaWy1aoS2+g/hfowRdO8g/0k1XVeSKYc9gt9N5kI6tgvRcm5XJZB1XZCegi+lWTwP+rooqsMAoqkBeDHWXn+pqPJRqlvLCygKEg8VyKw6Sq/OKDqy1fk9GEp51X0r7IKpk6GLkLwhM5GoO5MGxp6CtQL/SL2F4aCZOAyuLcWmCFH1CZn7IVMMcDtbepYm7RRJCkKFFcQs1qYT5atpO8MGLWwt8gAikzipS67OgjrhfpRpyo+lEMycEg1SDNAYSCKffC6u7DDa101ahfZjbvQbnA+0h/GTMdDghq6evVeAI/pkGGkNlk4nDCK2US2BEYYGYOQ2lFvgPvCxnSL2ZJoJKatQny5glSRfpCM6Tn8EIBZvW5DzGu68fU6tw49qtI0ejibAAAPLklEQVT+QfDDvIMrMNQ0LXcy5AzT0zy/OSRD0Jh4DU8DyNCC3qMJ9mWEj40LBd1dF15MCDSYlvIVYDveCxY8HTKMNH2IhsaRAfATl36aKXUdhCIw9XvktcygNRUXXg3fynrplf5TzLjz/KevJNrhpKgkiQd3KOZZ7wt8+ZUR2tFJKs/hUBvLIjxGBBC1PNo50WjJQEDlnOhmoTcXMC1mV0gdSXsByLq+xPpFYjQ7hVl2kiFZtHU+PTJ0f1IrhTXfnVWi3oHmdYqvDvYuoNoJb7xZKlQAn+gQc6a/Tml9hGV/UWPQlx+UnrH3DtPxp8mm+nIGdJKnR1SMpPItJdSz0M99hDEXa2sOxXJovWxTQ79JBos0QAAERdigx8LlML0BCmJO2NsI/A/q0MqdDK3zR73HozmI5Xr6YMpkGPUdi3aJRX872zyZCbEihYZwvoi7ELUjglQhutoX3Vex1bsLtQtb9lIP6RWKFgF2KY9n5KfX3GuUFJOJHtjRvgSIRy369ApbuUaXrAxNMStwhvmcxHotGeLhNTYqOhIjzqeQXlVvvDmGql9ewYl/W8+qNMXpfZd0XolTQB3zKZNhxALYLYV4MxBJ+S0JXMddw5t6MKdZth1fnUaIceXTVyHicprWZweJSuT/qV9Fg0YuXz3b2xu5Pl+GNpX3EA14/qNdaVqk8hqPGeKVXy8S4is41IAMBgzEei9t0DKhe0Qvr7roWFv6HCavaohJRzofs4ip5ArJJj3WzGGmSIaRFuQDUCV0VEKua4Nh4cdDpa0eOQcuo05YpXXP79uJSL1HduWKkEiPdVgdoXcS01groW8pJJ/xJUaX7Zp3rTuTdT7FlJ8c0dUYnQgsPzma9tMyDJIhoLHK3G9RVcLEEzQaoEnvdk8IBgMrjomPq5F2gXupSAkp0rTIMLJyerO0phyKUXG9l+k7UodlMBIZA/WDAZhhs6dLcICShOC8X8OUP3zCTkl9copj/RTnK88/aK7SDZSXF8CfIixe1rGi/VcNFjWTqI8ggwi6Z4cdAUMqsI0MlmqJIObw/s1X1Yzh6JfJh0OUtu+Rql/s2G1z7reSYE3TIkPYqealVGtYaN2W/negZeNKfamhtATkEMoQrJ1rpNA0SyJ/EcUpFyc6rghhe69iuWF1tWLjmB169CSKdX7sPDimZ0cAJCxL11mRpRdVz5YKFZfP6PVl4MvV4o4nUKPIYNXRlp6sheqproVk0H9IhnyJ3w3FZLC9faQpkmHiUaNSFI8DOhcofL8hvEkj8WvrWQdeDSrWl/fd2ktwQcmJeFakfFIKZ80CD37Dj434RBqsNK8I88gWzeA0kY7/dOVIvS8gWYkey+9Bri2D9tvTFzlS2Ak2Nm2EQj9uiMR/CQ3pa8oWuIvWGCo9oBFFpkeGkaFpNcaMnvpvoRWAwBjx75NgqsLRIeWAapT6MJL1qEjI0SX8pRk67Be14RCqyJBy8xBXhegm2Tm0FlKoZ1MaAbRO5C90+v82dyYLEtsgEBX9//9MDlYVDyRPcov70tO2xCYo0GJPTrkkbgFPyUQ6nddVhzVKjDl+Vz8DX1LtaXFxh/yY17cL4M/S5kp/NZ/8mg6/CqQ4oqs9tQTU9PrvDcjbeLog2PTmc9KmWB2Dm2xvKHS5mtWnvrBkyr4MHAsR1V6TbLwKRjk5WhZ70CvH/MKlEJEpuBTbQYIrUhynWmN/0cE/O3xq9a9xmjGafTycXcnFJR6Ct9lrE8b8Uxlf9JvbO1Csxed0+M0I08pA8S53laOGFM9rFUlqDz37XkLebaxY5aAyqsoe193JvLfa0qcM1VYMbC3dHI2zeF4yjZ0Z9uL1MfdvDt3DewSb20nf0pXjoINqbbf7poNsCnvwhHKAVr1qRDaWaCVbHEa9gTPgXWis/1PozEVaJ3gF5PiaDj/WbtpRTgsRQKutb5cEJc4ZHEa7ll1Wja+cnenx+K3gW4sBk2ZQ9I/SwsyBICtWHbDbQS1BBwhLltyBqQzolB6xn61eGxwe5fSKmKTh+dm8iXyct3ke5AZ3HTj5rmdXJvyGZe43Rjk603vLtBScTfj4Ze0p0Ede5s8m/DUdfhpc+9UlO5tQTx24rswitK3BCwptNF24v3EghiIHn2j853HfZPZhxshG4f4D5ZNLTtCIPhqrbRQWw0IefxXdPpHM835DvQ0Kl//HduLt8nzr6R/NCfdIuNSrPtzslO6v3qtQr1+FiZBN9pr6NLe4BslXdPjFduZCTKWdaAOm493K+CVpzzCMUq9QtbKkDHPsXgakI59Y63kJVSKPhv+uiVxdsz5EDZdfkLdZRYftIBcn7JRT+mPwuKPd+8SlT7Zv/60susei+F10EDiMKGmlu2guOdoMxmo2TzA3J83EUIWrglVNSj9WAubnm+cU7kM6/Co96ZDc8iCnWmqTLJDOtjYtmUytVqFGwS6QD7Ixq8zE0JU9UaBv8GTr5785P8kaGGU3yuGDfUSjxvHRw/66AwiJHE3TCY9yGU0xb6ll6p5p3nQwoGTXi9LGwa8RtIwFiqv3vc21dveT5qlfSxHT9mt9ToffPJO+aW8QroERAgejSo2VD49sNTY+dHRaS7hcRtBqTTxn1dsJRykrs9DIROcFBMmEbacxoLNlxwBMRFeG9AXc5CRr82iTtu3Ix8se6ETQw/ekg9u86aCMtzOOAU7dOkil50/kdwlA635e92pZsNHoCAB8hldyxaXPd3T40SHaHN22V2pRPySdwHl+OtGqtmHm6DrRYXeodBhnMDbQBb0zKS2t5hT2og+8rx0XhnA1o9LgBbIaArP1q9vU13PgRwgpMCTecy0q2bLOuw6NsXTv0VxcXPJSl4tzNpLZYt7lyxGY7M7sIIkAgrdB+4gOvzorzlscOKWLDVDa2V0nsYtuULBp1b/XcoQfZRf0Vu08A8Tp9irDDg6k2VyrJvTbYG2KQFub14V+9n5DlaUgfwIcNOaEPxTAkxgi6qLDEGadjqE+lT1LMXSbPA8ascpGc2nzr+41zpXBdekls/zPOvy8BJnacFurj3JFqrPEDN7mnEDgOR/Q/cBA50bU4eC3pYhWikwUUM0/ZcI1b3St5ZWM3M7el2yJZp1XQ3rYiQf1qjUMJXWbnDwjNkAit/2s26nDc4EOQnn4eUPktW4R3UpN0Chwr1MGt0/1D3/Nc3J8XuFLOvjNfUazFELCGS7O8i5rKRUT9ZLCIyvFbLMKmW8ZceE+f1/qSB++WyzD4uyySxSuQtW38qaOep82aCVeS8fPxXLk8P92MOpLX/LabwVxWfaiwzk52c+jHBK+fc7+NxAmy7bax54jC1TVwXEpxK/r39HhdwLxPsW5NzrOg2ZATv69eJ+/z3quC4rfcMaK5NyJhI6qTDYlB79NL7aMBcBZbVlYultFoF5l4kZ4sq5lIqDRTF5Ceq+gyLfnhHnIxc3INx2a4gCsY9WN2Yd9acSmxxttyYNB4mLEy3WWTNdK6UM6/E6wCwAW0WgHBvllpUKeJ9EANsGO33e5JbyrKp8VqkjLjBZnMtizAgbjeHlyq4CaP5itFHgWgMeyRQ91JzNXLARhOLsGArOCYdtq6XmKsrmzFuSuTHnXofqWPDlG/ylNMI5tskQyApzK3N793fapXeUyQ52NxKJACVt2QQ1/Tqy/o4Pf/k3nKGconol7D/3swqBMakjGFD+DQWnRqRYOCqjlufZmAwdP2Aj/Kc1u2ucp05LXdJhxDuJZ6NMWIBCU0K9IxnDqR47jwOQrnK5mnyK8bdWIz3G60JwIev0UZqtpRF09yuPdp8hWEGjDNj+ow88HszCBfH7WyU6P8wIVSrh/VinVn6nu7eR425FfIt67z4jsPJwThprfRCtFGAKn6vfo1oGxqKdCU9cfZJF8MWwCOUUnsMM8UWzfD6639wnOXYd25Hy9BNB005Ix26XpKmLZafba/tJneGVva/RYsfqJ4q/o8PMEEKjmrK2o3n7tgG70y1XKJ8vJ3Jx9LtmirxCxxltLKbfNvbBKJUO2Mm3UgokjyrW08yimt4s4U8FwyWvZlZ94mJRLRtvXrs8JzG+Cyg0Epw4Ifr9K9M/Pv0LoMgCITQOYeYar96m/3/jELmnhLR/T4eeNDoSa3ox9rDZN5EuOaQ60XUvlDB4YO/URb6PtumYMplzfoG2ZstnM8oyn6rDUF+4UrY8O8SVsoyCMRnshWcHpo06kBuY2teSItAaeLp0maEwd9r2c8rSuJFKrXXM3ycHIxEp55lNu2fB5fNRnXM61jGojqXxFh18NxqmcnpXPzQxf+0cFAVdRntK8BtVr6eQygYSZYqaXLUAhsLSh9Xo/G8YCn3IezJFwrN9aBgw+8ESbtM/WNf40nMIQ8wZn5L6A0PsOHXQPZajkk3MVniBc8zS/FdVLrVuZEU1+b5BeDbBKhxh0Ytjjgzr8NDnm8qqe/6otdD18EX7UNPdgbzzU0B686+k33dqO3KKz3DDLWuUsu48Tx6UmxM1H3m1gz4EQ9MlM5iAqzrWa1DMVjzfXnRa11XijYQ3mqevT0ghycTAM7E0H2WW0D/GzAxJ+5XFZl3Zfu1uin3u8ZINbzX9tumVtZvqeDr9EuuY9BfAeVyilUkL0seWkJUIry5Ch40YFYUoNtOd8QrQ2bbpt62NDVFsv97n5Du4sm5k34Sawa59Ws6KcJZ2zFwNy00eZlLQ7kWOtMUzntVcdYIP+95CxtSEdyZm9L24XygpgCjznp6Y/db+1ZFm8SPc7OjhD9PSCqFjp//6YCoQmm3LHEDz7z0d+eB1KmkM0rboMWikaMS+uC1KFwKdI5Bys7ONTwLOXERMZ7mIfDEIf5z1DmHbiICJTRCMgE0QF5h86nMY7P900zMTg1Zib0eGUWnlMLzOHeYyVa9OisxYwfFOHn/7zCksmTSQfh6mNupvcEo0oKn2bDvQOtLHwdOqWkdLt+oNGCi49OAQBs2gCRDbrLF4T9bt9KsMUhfNv3obx5+GxME9mycDN6PTcL/7QoRmrbDEzOmmyDp+fPmAblMZNrgBaiLejEo+B+Wx4wwST/Y4OP092CdxbAMmVvo7DaJv+M0hRKFf+e9oGjJpz2zmnU8SwBOkpCJhJmNlIm4EWaBfjHoJl9m3pBlanDi1TTf0QCMMWXUbIM/tPHY7UghJRMkzz/YXGfyI1g3cNh3rr+B+Yf0yHfwAjBO4Lyccm/wAAAABJRU5ErkJggg=="},{"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 13 and higher.","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMQAAADECAYAAADApo5rAAAgAElEQVR4nMy9a7Bl2VEm9uU5595bt6puvd9dVa1+6k3rgRCSQLKMEDCBAHsEGptAGE948Bgz88Nhw0w4bBzjmBl7HDE2EzM4PGZgAIMNNkYEDKDBIARIAoQeLSG1uumu7uqq7nq/bt1b9738Y6/M/DL32vdWYzw6u6PrnLP2Wrkyc2V+meux95WFd31fAQR6FdRfRYuF7ujvAhSpdQsgUusLSikQ6e6hfkcpKOJ9AIBo/VBaINRfqd8jd17Lf8HqgspCy8pm6K0Km4pNCYUqimQukHrs/mn1kcuoi979QNsGo02rRNVXjTGf3e9ePRoj2bZe/Oz1a+0j41omLR53+vwqyzBqDoR9casohe6WTmrroPiHVKcA3BkgYgMsXN9csXT3itBNN+lKDp37CUSZLahKIPrGp1FGIQYLeaBIdWhSQnGmjIoqXukYYIQr4IoXCfVPl8oQnaEow/qBUoZl0KZhHKoM3QAL3S9WjwGro+P1CtHLn8a7lhMfYgXFxqtU+mx83m0JKpsWGUadSZCFEdNqHGrodk+otoj9dmSQrhK5paKx+5WQkmpLikjqG2agQrwpkmQEQHHe2AZL11c22FJxxepKsahVTCvFBpadjEe4pHtqyPpbqtu5casuitdXPs2r6XNABuOwqB7EeFMDLUX5T9G4Wg3zqarOZd0n91VcBi1HB2gWu4WjqttXMGiZPhlGqKFGUFCKCyAiHpoCDyV0CL1vdat5mGEWQ0o1GTKrDvOLO5wyZ3XFfN946OxCjK7dFa/p5WpYETn0rnQj6b/pm1LreCjkky6Dyizqt8Y3NJDaIIoAUgqhktQ2xXkWgXDvso0M4nX0vusZNeIqx8S/RnCAxpiN1cdd6Qn15WMSy9lQAv8SywKETJkMk5hjVRhns0ioChLUWfLymJu5ZCWTMWQWiFDmKNRAnaT+o4KZaTBzAsCpIJp48Win6Z71UarlKiB4lLDhU4dlRDNnrTWlmMyayypN0xWlj2Te1BOXlV55loGCB1AEnnGqx1XaharTgMd8Xex3Yd2bIgsNIkd3Zlvp+fxS4dZl6I/rNMkwcu+IA9NLkY2MG4Xxqy0FYaA6BZFwxjQRkxgzDHlpzAOuEGOOIqlOjxUx5HUfLarnwEPEMUIym8go0zQIhdsb/Ft/wTlrbsCmnl2CuShlWIYuChVjS5iizduU7443Q0YNYdXZu2o+mKZ7YVmE+CpG3/otfSlQXIZSaXCEmDYZRoZVRf9hB+w80OYTNFg296Q2yrCFd2png671henVT8rVJd9TmpQWmYqkjbU6Go5Z8b4k/LKQa23E5dGvqkDTDzwkB9rcR5WNUjPWSXFzCXqSUjq5t5FB5xYEZZZmaWTLE0udbzEGampDawrk28XLRdOSKoP4yo5Uw7ZITuUC1R8h+BTKYKtMKkkpahQgb4rLjm4QnYGqpxvcWhsaPpvEqNc7dGqELKpFSih4IspCRkT2ZVZH1IhIpVBkMqJdiFXa6mxhibhEgCqmJ5gzMYqXGgVsUqd9WB4pKFJCVGFJTIaqVNVZUwYwcKH+Fr8tcOmMp84xi8lF4FV1qfM+BzafT6LWs/FnHmiQOHXuutE2KoMvVkyTDKMSDN4N33cB1IPcpW0gCQn4N4qia/XsoqHKL7M581oPaW4c7mgWlUqxfsycKFTHeYaVOu8WSqSmZVrbhikglcGOMSz24askhfrs2nB+avMY0g3zWSyOaAPPi/uxkgyFFV89t6gMjmqdsYlYWqxjY3pQjy/eq42H9ekg5cjqJQrVtjonJcmPYEM2J5syGUYRo/qmFASAV+N1cSgSFL4PsrPCTcElTFZv6GpXCDpmbtFhlIYqMfCMzoEUDTxgEYxBEUNqyiaOOEazGMq7IzJzTK/v0DbxE6mG4sut+VI0DMg6IIONiVYW3aPxSMLqdYMszrJryhkm3hQ9LdoTYLJh6Vexwff83xYTGFegwDBdMozisPiASs9SYzWhQVPyERWJxwaDlnblcsDnC7nfZI0c/qIRuw8VQ66WECHOOF3h+s4k79h0BbTsB5UzqjnL7OimDFbdpVUM5mBIhhYIUG91jNjJ8yyk2DiE4RbltY+ongsGwRAm10a+OOFk5NMqwygyuY0TmIwlerkEetYDCxrNqLImbQQw9Gv3Hipq2NXvITwCKGqw3LqDXRRDsk4IM2jaLbfAbJM6Rxb3Tv9lfIU7ceIehyajq0vOSdiQDApMEXQKdFM0c6a0HECkjkMySbMXDvV8n1d6SC8+cTK9NuNgBbEyhTKMAAR0yrt5bOh+fqREaIeGP0Vm6Q94ECcJV0os5VyzytIJ5hl//xSU/6tteMXfB6nUsOwrRVJ14ImMt2N9eE+KVjqgJEN1Nkc1501qOqD27BtuQm2K67UgGlWSgcvVSHgu6I7E+XgloTNKINSzjnuLJUzH2WmOMKcKTRkqSEyhDJPKghOtlX0y7MR0ct1tu9OGCC8poMTJqtIA7ECf1hfycFUSlBNykpBiwI1KlIdKz42sJnSlqkngxk8TNRRXjq4C2dyuis9Xgdkv2NhNbwWkbFqxA+lSvF8bDLYLEK/meEMyIPZJ48TpikCoHf2GL5Z0KYeYg3fD6vf4CnagSGv5ry5FU59hMk1gS4qdFhkmmiJ4B13rEoh42NKczp0BPriiNWB1IWREDSYy/dI1NCq+XOdKcxRxLWuZGxn3VZXFDieaNhVXoonEjuIDqW3jwIRRNd2oUUBTA9aMpD6MHsU06q+r05ehN80Lk7ioK0/FGJ2ZHnenoMjjg6BzIZ2bBnjcuD7zZW3b0eWrLcOo1I51EIq4Y5TCDWH/x3CoaFaoAoECexYZta1G8ESp1ChSnBaZMBSS2U+L1SeH5rbkqFFvDWcoZJwqOzm+NstoZgfPDNW5K4kIWmnyGR2PBLX/kvodkqHE76IRmnL5YCwl9uX0qQ316X0orOvvalwl0Tb5uu/OB3oOzuM0TTJMzJDrgHW8q3cxQXY8CUKyxxeUcFjPxjVHhhbipggTCEgXxzR6ZMTkf912I6VSFcHHVTzb0xUjR6EYJt1xWmkjy6e5a754taSjI2ZF8QiN1yWw68sgPAg+dlL54fSMQ2Bh/iTYh6vcEIpQXulqDKzMBTWpjJnxMA5VR0L1p0SGUVjXr0ZJm8gKvh1fZNwaGbRO1IdE5uBe3ZtwgYRtas/BQFR1hOjR6xEmyZkOO5A5jRq4Cql1FdmpXx8TdT93Q04PRPlKl9HT9Eg6hMoRx/pv6KKX+lX5ewsTia9sK1wQ+lJ65rwNGRRxVX5C8yBDQwdBNp0fTZEMI5+EOsfOrA5AqeWOZiV80vhz7s36qRZVQA4n1huCYyK3C/rkc3UdTa5j6V9r74F0o6mWsiyqwNin7266VzqPHDqJrvhCxaCfD5T3mjRAtvCXCmIZg3oT72wYLcsDbPyCEWZeqzUWBSIzAGfE7K3Rl+tNpk6GkU4EAfXQevCKiOlqfqE1ehWMHSmuDFX9FAqKhdA2y6TGWb3bEKCzL6vTob/fK+m3nXy1eVB0MQdyGgE9MUmIzwos6bvzTu21TOrxNfOHfqQyPgY81lPVTqghGdhYfKmbeVZhQYPQl6krCK1DX7pnEOYEKqNUYpryhlUdIXouT9z0nS4ZRqUaQuibBSNezMq1I3o8zQzMmGX0zIwkQzUjU8VGYYLnp/xMuB/Wv02WJbZlhWnqh9SWUsJOLHcudlTSq7djnjhFrPcTplg9k0sSbcg2MqheiKSlLamepEmnokkYJ74dx9ZWdUrdrymBUlsfPQajjUyjDCPPodnAkbxYx6pGEsVSRgcgGD0vKVrHAlrGdJwtBou8LR8PSjgjOnFFdR4x46WmVR/eXidofOSsOMlqs+ogQn11ii1Eu1iY8s/urJOOJaVt6lyVX2G+jF4ylDTRHpTBQ4mnGyZ/to40nhV4er6pdAmEijpy/S2apjqxRneJttlmNvLpkmGkDGjeTOAXPiv29dmixE/YWC3C6OS0sxZFWkZNLevSbw6vsO9k2jBjJmczUOI0g0jYRDilN0pSKq8qktLU1a9uIsby1whEOpGKgJL5B3yiXWhlSu/RDwcEFd3ptGTwianSIR6pbdz3MYoISQrpP0d0j4wlTn5LvMdAp+mvH8UGRcw4vtMiw0jqAEk1om7JVIeluoE2AJ1R4vFmcOPwXu8xoheNHooCInasVxT1a8QIKzcmoLj1JxTwaEVr/6QY0jvpz4TrnBLFxoAn1CYD1K4L0Sr0DEXplmNpYqf9AtJ41qLmtpoOEK8UfJsyFK5Ao2uRjuVXsGJoSemnRd00fnEJXaJRMqrniybL4b6O+xTKMPKQxSZvFkffNa0q4GdfC+gTBNrFBzEwD0UNr1MfCqtlvoPMwUIdSesrWxpZzEGoXzVcR5Dq6IRaira2Np4XDkpdkoWQPLobXWz5Lk7soyOaMwt9NyeJ0ckjriZeMihDb9OQZeD5DhTcQDpNR28YKUrUUbhYPYy8yjvivaa3aLsplGESYAjKIFm1OUUnQVe9cwodYAhoj6gyKR2tOJjuqRL6Ux6Ll9gEUoKee5uAhMwdAhNNZY77LtqONeSbakX7oPDMRyvCBqOpwXWoBh/2F1QXLR0oLeXBb7j2ZUgGBzGmxX1wvZ4e69h0m1yk/WoCvGcUj6TY4JEKq7FqyiiIdYmG/RYnMS0y+MZcHYnOMWtoV19wCHAES14WpzbulTx54V1dUyDrM+XGcYUGFiqE7nsIlfCKF4cRNC5R9dc6XT8BqTMf1Fblstq0mlHUEYKiCVqKn6lFGPhKl6KK7CBD1FMCNdJ/0AdTEJcb7MBE3iISAZeWR4rKfyppoHnxwqmTYWTVhb1PjZWbDoyLtVXGggc5AylF4HsepFibEtpUqKTyaJgx4YYjTXXcODllXXnMZBeNS50g1GLmqW0htri/KkOvWYrMgTnlIoFPlqEHwaaugjQE/bHbLo3I/Aw5JBuojk+jGrfvrUROmQwjHizDLhGfqWcmaweWsqWOdKy7ex4JIrPRadz2KCIAPYVsf5G3MT27GySgPF7MsIMzs1wKFiyPokgH9dVXnYe0xeQfNtGMqBd0NSB6lsFCTykRmgldUSftnlmW2FblilbbY9159Dp5JznS074rR5YmUkpVpk+GiaU7EpevSs3hLa9VJvUbAajnA95JXiLzTS06chuciaAQ/bmHy196xmQQbLLAJruJbeO3lQbZ1xKL2JDtd2Y5kbJ8Wagwy2aWQQ7UAoPET4gOpXWT6SQttpJnpaOG1Uo7LK2h/lTHNvbUyLEzGCA4onPfUyLDSOoSoR67tYsMWgBbetXVFHVIB8pmTEqCed+mo0rY7ZcMT6lm+dWhk8N1VZIismFltAi3KZplvnPkUpmDszjS9M7daEN1RpIxfOf+e/f7MvSuHs8llvMKFw8EA1RJ9cN9GgyVOfdpPJMiVU9KPwHwtMhgz1T31t8pl+UVraIELM1wx+z6VCeKhtmtODkjfsbJETLn3bWUFBIjFkcBTifiUpySLCa8v7GyrixVBTt6kFDZESyVjKtQOsiuq+Kf8HEYBI5kG8YXO31DBq4fELLUPRXTiwth53rI2YbAoYTvRN/KxAGtqMwtRyAa+j28WnI6ZBgVtXjx5c2wTAp3LIsQqN5tRwzMghEkpN8MEF0jPz3rfYl3wiRp8qU2oqtL5hPVUPRepm6IzeG3OqIeAbC+WAoybr5v+xXhUVoHHMeN6Jw5jQS19Rk5bE4SJtJZBgJEPUtmTiQqG92nurrzHiJrMOaOZ4HLEPZKbFGjFqlta66vv3WsGCjD9+mSYeSTwaLwH84A+WDwD/UuX/ktwYI8ghiCZ0RzK3aDtifwJTJODNguehXIJ1pQTzFZbU+lKkaRwXfOWTAyTFYc8lyoIQPTUTLkpMYvXyWVKaspP95WBtMDkxG3RENCEsxoIfKl/h1AMSM98x/R3dpQ2uLgEA20ycOUyDCyAGHeFVFL2TdWFJqqE+QdVN9ijx3ZikKt23qAhyJiaktHd/VhCiNVopUab4kYrQKECSzT4r7ZUVRxvNLBY9jHD6sfIDAPQBqgFhkLBYMylL7uMkiYHCCDdecKvFi+rf9XfbJT9mQtbjucPzMdTgHDK2amS4aRepTzUpHJA4a3ScR6E3k2mEqH1+/dJwzCqePqSNy8oomFR+Yk8ZatU+h7trQwea7/G29NqwQpNtZTcZx4od3yGD1CXUFPBmG+8tWSgVILNzquS0wGI/BBD/oGnB4ciLrhChoN9bxIGJ6TgcSde9fldMkw4pTDowXgB4zgKJyXswKyqjLEfpqSgsJUcBeiM8bYzq2HvVUFSBAk6TfxY2RKUkQSQYyFDOE9pgJbmd14yM+bFNLFkM+1+OqQdECGnIZZCpn4FlJnKu+fHnUG7IAkMRwWHlywaLBZhbn+gMzTIEO3U615NwoxI2TjbojBZhIqUwjoyV9SoUWb0k1/g/Fk+k3kMDZjGy3XlaPqxxDEoxBm2wWmg6rxcLKUaPX7oAiokUnbSN3crLoXk82PnvQUY8qiY/IiO8rg7VWxcTLeHARKU/LqjOrV5Jfcno7fSywP85xalFIQ02VzafqrLMOoupEnGgXwZa4Y612ubLnsvbWtGkr67OrSQS4A/uggSc1OXK1BI5f7nRtHXNkofhYLdTxsblOYTZMZVNY/8yJNJOrGWnXEh9Iqz1VhFjirEcRz+j6oLoA6DkfXhgzspUX1qTzQ2CnvOvDqXToWDYSNfWjfrvLQQuh/Lub5nQFX8aCu6DpFMozsL3gqkfAjrKJbWaQCtV9CUjZ+ekbb0NStNxpn7Mr2IFLqIxX6zcNjb66wMN8RN8geLHX3I/gUioyRryy+fudTluavqY4PrETHVSStHpSf5WjLoJbFXaR2dDssNBhYcIUkl2IFg4Hpg1GoUFuXwdLWLEPob7pkGPHNXjiPEFsdmB7sIBE6XhxJGWW1zyBZNYieIL3Y6Chb2DmgfTCK+KOb3gcp0pSUFMh6ykiXVNFL5/hSxIOjWS+UpwbSE5d1RKjYkMEm1tq35mbqnKD+C53b0fEgtAzyljrONUo1ZWD0Ntm1P7pX8rJ1ROtpk2FkD1FUVFKj5/r8Q9GeD0VZiOtxxZ+NSyOH0tD+w71i/bqDM2wXBEMEbE7Eodj3NRCNsGXYpIPsIHl+DfCAaQdep3kgL3Tkn81B20YGizShWUJbvc8gwaz0nM2dTp2xy/Wpk2CEhPAlK9SQjOZaDpp23m2KZBjxfQD2HKz2JkW3n+p3YVruOBYAijqIxNQhyZmPJbgTqkEJ2YLuQDf0NbBKUYICB/TdNG7c1xXjI4cYBHmZ5QAbDVQLObMWbyNDqQgc0FJlqIah38NCAUqilx7cIb0rOxne/BxXR7szm7hRanUVbIsnq/6g1XTJMOpNSETozX3xpKuegAVNTIM8OmFS6YQNPFpA79yQLgeUAl6CtajYq6sMdL8La5J9zWQurhUjlTyWvvPgNaMBj7jxTcNT+zGwoDHvGOI+QTfrPeW7lEEZnLYWCoIe2Q1DaPN6hesVgzJLny3a1ojrWCLGp4534I/SYZtcSycDR/Bpk2ESxgHKt1uUljmw5eMS8Lpq5DQhFPUcuuydqBw2mSSFQJtIpuhiP4lPb0+/RFenYpiNEzZHYT5saAQp4tncKIFIEAB9HdpgWIiVrBbYkfH0eK7TSP0Ui9EU9fisFh+zr7qgMTKg0TEjz9WJe++wJhmc/7kEehpOXAZjV5QCjQd59DTJMCoiYW7byeKRQZ9VJV7JoPTgFC2FshakDq4RrrymP5Log0zr7wUWZv12MVRBQT0tqf/3nanniLUPjVy9B5LYUVgfZJUWZun/EL1IUYVpW//0q1R61pWfPA4MDMhg/XC0Cs5OTw1SdM+TyVL1FZ5TKToZJZ6FAIfmd5pHM99NGeKLkCKfUyLDKCjXWQUnS0UZJvn8ZCKi1yeF8F/q7ISqTIV8EMGa3UkIUVkIQ1AVipDY0i3d4whsU3iufHUeHerASXY8sNEqP/5uHpqAE5xTWhnb0shI6MaaSh6QIRkYnWmlIJgd6aEYSOnNrm04GmM4QjoVI03znFrRuuXnalyG5pyMZJ02GUaWtgSOg0UYAkuwXlAuaJybBoSplK6kt3zGvlgrWmsp5CwJPah/NYze3kIpMfIZi65cD6FkyJUvo+0e7H3mNrmfojKgEXXyEqAPSMt2WlfYM+EUTPlVVLVxc3bcWFwGm0sR+DB7irYuX1/XjuTZSULFXptpk6H7+xCS+kj0bE6gPznH3elqGT8LxUbvXbnBJuNS+fgzf7c2vRtEt9WY7D/MIXSwwNEg1u9dxGQ8/kw0Ut/SEmw7GXIdGsTm+Z4Buj1aua6kgh7thm5aHYb7A31+lWWoZ5mk37ZGBAH8fI5ZZAPLCqInZaVIHxE03bJq4nR0ky8YHD9uamhANDV6iNcNPLEMneDhXj7dG1CiFQkSOaMnhFitq6T/h8qH6lhISZ8ptS0DiBhPEmxfp3meSOsWqltiu4DIOUoy31MmQ3d0QyJvHWPwyCC6/+DWoRtpsT4o1A3FLWdMArMS6nCkUOZKoWcwFMBT6BOG2awIlcmQiKIAWilWLmgolsUiffhDV8k5JP0PKqfv/LjooAy9VSd+ei894iqx3HhSEEn+a1rkFIhTVdMjrRJSNhD5o5Q8dCJTJ4O9l8n5rwY5AG9qxGE7nI23MmDg5jI0nKSfTlhksN/FFMe2bO3DBKt3sxmZO290BPA+ksxJrmi09IBLi746nCAsDOx4tdKFIRnIEWn1PVTRFI1XbYykvmAipzyFnnwmskENJStFDdZaBgRucB+/TIkMtlOt8xld+rNXwMONVjuQXF58a96cApRugVdq/IENV0oxzo21sPpVggaNVtGmSfHKz+CAMDz7+ZhCfXTtVG5SnGq4PubqJyi5L4mpHcKXZjpV8g+mNSBDDxjS6HCEiZtaSpfRN3ZvGiL75NU0f7dv1bMZLK8IMRG4AYogczMtMoxCWKY3aWRUir4Ub9qafqClN3XrnY6YO0/xbyWke4qytthjYU7ApDIChzdsZ3Qt9BkmVvREV8vYggLExiIiV+6LB0mNoh0xJNlBAIMBGRgYepfRct7D3kztg3dzDY1zfqD8FC6i6GdddZXSUKrQQQe2ejRlMozoOB2UPR7fHBUKw14spBDEX4WMprpEjym6b/MF91xbbWoZnHKoLAi1oWXgoJjC7ROsULXQTwPS1P87A6AHi7TcJvrUlg09d5SNQiF2SIa8UsLOyZNCs5+E1NQuGG++1Cgk3y6RDwsJjHguQ3x0tzEPnQIZRuAOdFVJq5rHuRdLdf94jJeF8+MYPMvvHXVgpFbjUSOGb7LEpbzUjuobf/W/YDQWYViBDT4k3S+JRsspSR47IsD9CfqTdTMS/p14DDg1IAMqaATVkjHmCWsDcfubioSabIyBFjPMekD/oj5DZOQJ8xTJ4KddOXSIGzpPZEXLKxO8TR5PfLqB8GZNb23fGE1oaQNfFUZKbMzLo0FZe61LqBA2+9AwPpoLwdt2MsRB8zCgfXLo0DQxh4cUYbVAfboketZ8QAbA/o6CAxfP50rsg4U3HZdYbmzpuCVQBAKKN7A4ysZ1mBYZ6zTJMFIi9clmvymehXFOrl4eUD84np8s9MN5yZh6Rk1LaFxHyZvx5a35fl0WOKRE1VF1IzLkO+KEFLOcRm2lDhQMPDHBkdRoFOvbAxohfiBBgKH1sY0MUHQV7wOUOiQdFPhvT1EZhb1/G30RhAmO+H1jg4ytUB1fDSrOByN1iBDTIUN9c5+Ews7+tFMfM7aFkAKZcw6sN3NRAMdin/FZgELAoF+ov14kQZhQRfQv8Tsty4W5S7jvz2Ko0YpGsjTYQRZDsDq49of7GMG0n6QTcqawJKw0WzJA7aXKIFSoxGwxI93TdCQMo9IpJoIpgfzdHFnIAcz4VReK9PDHCUj1maVpkWEU6NUOunuMSuQU6mgl/SZGfQlMgvMIE9I+SupLUVC92FCE+kS6tB4J2clPCmODU4O2uQ7xr8CeQ28IWR09jmqdLDxA0fHYiIvRhB2DMefUtmE+MiCDsk23HBAqoGlBKfZL7SU4GhSX6aEd5V95DYNOjxwnnoQGQcE5bt6hd02LDHVjjislgyPgDVmCxApWR9iYK+2A2J0xhIN5GTIKIy7YPkh5JTbolcHbV74MJeBlIa0D8SuUxjEd0wNN3uH8NnlACgCipwNKiAZhNS5EiG1kqMoJ8z9VPjoDcbDQZ0OKO2HvT/4ouDAKq2YqOIkbe5in8XcGlIDMDW+YIhlGoCsgedfMaOmR8K6tDpojMz8zUYqYUKIMJ4O2VSXusSgWpCMADYdpT+JB6BJJ9xE1V0BFIDdye8DEcSnwwIYb6XBHSaeUAjKSGm/aRp2V+MkyqO96uaJgalDQjU4SwfXI9dCoJ4Gqv9jY9ocZEa2NITm1zdFt2mSYpGbqP7UCISBAE2RRkHSWS56wVkqKnFo/5cCo5YrUliIU9efqjmoc1N7QXdubAYPaWMfejhyOZfDl2u5XRGcfAG/o/bEM7sk6Qq7H2ZkJ9szvwu5ds9g1N4tdszOYnUwwOzPBaCwYjwJGYWNjE+ubm1hb38Dq6jrura1j6d4KFpdWsLG5GfVp6VfUc6k89PRpoOPgIqEdbEGjO/NWaMC0H9ZHGl8CNNNv/Wa0s018lWWYlIryMUWR+uyDBCQNTqGVzUkqNzRBNgWExyWpPdlO76ivsD87j2ZmMejYXMAcgJSl69zCfamm9Cg7O0vlzZ0J/pRfRXDlpXfmiAZHRLBv724cP7wfxw/tx9GD+3Dy6EGcPn4Yxw/tx7FD+3Fo317sX9iN/Xt3Y25mBrMzY0qdgOWVNSzdW8Htu8u4fmsRV27ewYXLN/D8S1dw8coNvHT1Ji5cuY5rNxexubkJc9IG6LCTmj7JgS2iV7KCoAIAACAASURBVB2oYal90bE7T4fpOx/lsYd1qo34imUPMxOvkZd/4zLsfdeHLbiQL8IP70kz7cvOHRA6NTC8TOhRyEj1d6c/RliiQ5PgZirauhKjtixsYQsRaTTKhZDAaK/ao3K6PRoJzp48gtc/cgaPnT2Bhx44jjPHD+P08UM4eeQg9u2ZDwPJ+zosp17haAj9LgW4fnsRL7x8Fc9duIKnnr+IJ595AX/8xWdx685dOOAwaKVPICrS9JH0m9tU2iGlS2qygc3loH45umhGwOVfBRlk4V0fpiBAiGn0C6UN6TGMYLcaUeC5PN8zhKUb7rbGYzA0oK/MjO5wdGo5I3kjNBqG28EZaFAyz+at3Lj7MR6P8ODJI/j6r3kcb3/Do3j07AmcPnYYxw7tw+5dc1V1ET25fxN1B0cZai8iWLq3ipev3sTT51/G7/3pl/Cbn/gczl28Qipgvesw96zYPxuo47UJGJDGK9VseESjfm7t9A3h/w3JIAvv+nBx4s5yvrhZZIGDUGJLo4b06wywuKOqeqhjsvEmYGOgMrqwg7RCzsA48qrU/PwcvvUdb8Jf+cY344nHH8Th/QvYv3c3ZibjQUPOBs9XdoTtIsVQm61ScHtxGecvXcNv/OFn8bO/9nG8ePl6xZN6CM5S4ipUAoy88hbycdYPkCJB/g4Dku4OWViKEHG+Z0qzMSvW5v9fGWqEiA9ihGO2wYu6zpv2QxHO+gopUk1VdAWK65NDo3q9T40d4XT1Slj5QcjOsz31YqUysYwAKVKxtshhxqMR5nfN4uEHjuM73/u1+ND734ljB/djZjLGaCRxIAau7VKkncq0vNVP6/fG5iZeunoTP/l//w5+9tc/jpt3lrC1teUyqYY5MrPOSA0Y1GWqn0Gr9YlS3+aSaIbyRr9AGq+/fBlsDmHi0LyhKLWC6DCcf3VuHUBB7+mAhs2PAaMxupw7Bp5SYBwwulC34bWGVA0gag9swczMBKePH8YTjz2ID37z1+Pf+trXYd+e3YP9b5WC5XurWF5Zw73VNayur2N9fQPrG5vY3Nqq41gwGo0wHo0wOzPB3OwM5udmsXd+Drvn52y1qSVnC8CGHEivT3z+K/iHP/UR/OmXn8Pi0r0eLQMVS1EKJCILoW9SbQI+vhmzhTgm8WgPT3xbGYWCWD+P+MuUQRbe+WENSKFG6LKUupFRzYkDB/OqdTHUKRHP34fK0PiO9r0mOmcmGBG0Ye67tpuZmeDRMyfwjq95HP/Ov/02fN0bHsP83GzPIDc2t3D99iIuXbuFKzdu4/L123j+pat46eoNvHz9Fq7fWsStxSXcuXsPK2vr2CrdxuRcdYQDC3tw7NB+nDh8AK86dRSvOnUUZ44fxgPHD+HBk0dDnzmNGrpa6dWl67fwz3/5d/BL//qTOH/pGspWhTx7e51RjspS8Kv3THNCOuf0Q42jVOMWpjk0NH1Dh1umy2vOwznEX54MXcrkHLgXVqE8ykUUyBGj8SI6kiudVcrGTLQH07eck21ztRyxE0uRIwKNTqK0zWQ8wmNnT+J9b38j3vf2N+IdX/M45mZnOlXWwdjcKjh38TK+8Mx5PPPiJTz74iWcu3gFL16+jsvXb2Nza6sOqLj6ydHDipnyaf2PceroATx65iSeePxBvPV1D+Mtr3kYp44dhCA6wk6rVXnecmfpHn7zDz+Hf/ZLv4Unnz6Pjc1NbDfPy7qJem4vYoTFjWTn3c+G8de+JBuSB+qQ6TCImpb/EmToJtWJ78yurdX2cva2UnwuFFFqO0QLMvLEqVWhWZAhvk28Nf9hMiePHsR3v+/r8a3vfBPe+NhZWyYFgK2tgpev3cQffu4pfPILz+Arz7+E51+6iis3bmNtfQNu3cLCpDSsfrMBasjg4Rbj0Rinjx/C6x4+jfe+7Q34wLvfgpNHD/UcY7srg8zq+gb++IvP4L/957+MP/7in3fzCqAPSjx+5lhWUMXNluogGRxf0yC1tpbNAGbk0QBLpVU31uj1kwTzfyky0KS6VjBeQtyAu0M1dAFjH9WtocvCGjOfoEIVELSZlBK9D70osZ0ftICoNyBdpZEI/uo3vR1/44Pvw+MPnsL+vbut6dZWwWeeOodf/b1P49kXL2EyGWN+bhazMzNY2D2HmZkJNje3sLh8D9duLuLFy9fwzPlLWFpejaGoxWwzYvbLRiLYv7Abj589iR/4zvfiQ+9/Z5jIA20HGUqxNja38PQLL+GH/sFP4k+/9Fy7X/2itqF2YmKk1ZzGJDbMDXPUCJNgpHFNWYMSbNlEa5L8F5RBFt75fV13Tafrp0mWbljwYzQgL4crI55NYg9XZiUpp4E6Gk5b9bEDraDI2n+tOzszwRsfPYv//Pu/A+9+y2uxe34uoO+txSV8+dxFjEcjPPTAMczNTDAajcwYdUe2VHm3tgq2trawsrqOL527gI99+s/wrz/1JJ67eAX3VtY8lRLeRaUJp90D6dRlEAC75mbxTW9/I/7e3/wQHjx5BJPJuBephybeXAYAz128gu/9u/8TvnzuooFprBdMQG0IoGHs3SNVN8A70WzxqcPPu9+ASNxLslSJMpJWuv1KZLCUycg3vI/2ru2bSh3cIgFFW2BULVUCNFnvXQyozTmE9g7oHzgcCAm98pnJGA+fPo7v+eZ34Ps/8B4cO7Q/IO2wctvLniyv0tBrdW0dn3ryafzMr/8+PvH5r+DStVudYzSvFC0BhOU7uh49cwI/8gPfiW9955vCDjj3v90ycKmT1s98+Rz+03/4k/jScxeo36jP3jywkSol7uOEWwZ4sQaZULJikXbV1oQx2Ncrk2E8d/aJH+tuCd3XyQ1beOeNlgeKE9FORGJ7neToPN2VUw07CBKVUZSuFuv3hlY6e5EgvIfLyijB1aEDC/j2b3wLfvQHvgsffN/XY+/uXY72acBaZVreQlytz/fGoxEePHUU3/7ut+LR0yewvLKKa7cWcW91NcqeE2nOvZMMgODGnbv49Jeeg4jg0TMnsXvXbBiPIV6VX/199OACjh7ch888dQ637y4bDx7FdOxKHA8ethAFKmwGJFe+ksNXsOOIyRmCITjfB0fRWD/y9cplMIfo2rulK/2eoREdpSK1vjuP/nYmwiD1jIlWAKpQjCw8iDDFMj30eHShI9Ovf+QM/ta/9234oQ99C1770OlgwEo7G8/a+gaWllewvLKGra2Cydg34vjiti0nGo1GeOTMCXz9Gx/Dnvk5vHjpOm4tLpsxdYsIrJPSBwX9rIh7d3kFf/bsi9jc2sIbHj2D+bnZZqTIcvHneDzGyaMHsbq+ji88cx6ra+s07Ix89Z9WxNFqbJSA20ArfaAUyCe2DgpFCJihZbU+20Y2bOLplcoge9/1YTrl7KFZiu49sAN5wpSdWZsbhTpgzhDcwNsZgNfJ93JG1cqwBrIuvTe/axZ/5RvejO//wHvwDW96DcZj3/jiiefa+gaeu3gFT527iOcuXsFLV2/g5p0lrK6vo2wVTCZj7J3fhRNHDuB1D5/G217/KM6eONx0qtal9xaX7uGjn3oS//1PfwRfeeElbG01ji6wXKQXB0q/eWj/An7wg+/Df/Z9H8DMZNzjY2gjj/l67sJl/J1/8vP46Cef9JQu9NtaJOEUBcjGYbOAEElq9CuAsIBiHXkDjSCmGonGF/gB4goU2d19yjDpjLjUkAR/BqAnaxTcwSoyn49V8CDElIeYM8H7/TgRroOe0uywRzim3dU5fmQ//sa/+z78tW95J04dPYTRKKJmKQVfPncRv/WJz+H3P/sULl65gTtL97C4vIJ7K6vY2NwKChYRzM/NYP/e3Thx5CDe/ZbX4nu/7Rvw6ledMnbz+j+XAcC+vbvx7e9+K/btmcff/kc/hYuXb9DgkLwWqt0INHr62Auu317ET/zSR/HQA8fwofe/c7DfIScBgAdPHcWHv/09+LNnL+D8pWuuR+WKkY9Qmz/8e7UpHj7L+CSIpjJA55jqLNq3RhDEVE/nrTDeiqeYIRLdvww+qQ4cgwinAaKzSCkyordEHATevj77Qet3ITQISqbvaixaPh6N8IZHTuO//I/+Kt7zta/H3Iw/D7WxuYVbi0v4vT/9Ev63f/X7+PzTL+Du8gpW1zfMQLbLu0Eyzc5McOb4Yfwn3/Mt+J73v2PwiHc3HtEIN7e28Nt/9AV879/9J1hbX6/jMiCk8mAIFysUAU4fO4Rf+Ad/G088/uC2c4fWZ6eXTfwX/+PP4Wd+7eNY29iMOg1RQNmrWYOBXFcqPQHiOSU7hZGE7D0SUO/nyTk48hi9hORQgL9/GWwOYcXqupa7SuycvFeXZbsJc2RSEjM0JAE5OGJp1CxUbnTEnpOq9+MhsI5lH+Ddu2bxgfe8Ff/07/x1vOW1D2My7k6grq6t49kXL+MXfvMP8KM//vP4F7/yuzh38QqWV9a6J9BQHMFMc9oHo7Ub9+bWFm7eXsLvfvqLWFlbxxOPP4g9837sO0/YGaFHoxEeOX0cm1ub3SaZOQ8hSAA1RULiSXVeCpbureL5l6/im77uDdi9a645z8m/ed4zrvz8qz/4LG4tLpsOGEwLj7fEHWAR7oO92eeV5jBSgTfJECIlCCDMJ6TSgNkkPyUH4cUIvCIZfJVJFH39OIHlqVVZ3bJsDLeBYUY2gYW53sTQ0D9utaty8nqzIYSoYApHLKAP6qmjB/G93/aN+Ps//O/jyMF9ALq5wVdeeAkf+b1P47/+iV/EL/32p3D91iKFKphCu76IuD1qV+tayIavdADYKgV/+qXnMDs7wdvf+BjGo1ETpbP+AOCxsyfx2aeexwsvX4sRwRyfQ25d7zPU8M8tFNy6s4y9e3bhra99uDf5z6thmZdSCg4fWMDl67fxqSefqRYe01MIz3dSCFPNkJGXSoMNO+g6yWDpr9ldxAZzCrbwBB5qL8bnfcoQIoS/EsVRnNE9e5p1KpJWikrfeBGI1FSJFaS8SRVXqJwhKAumX7v+X/vQA/hbf+3b8B9/9/sNpV++dgu/8rt/gh//hd/Az/76x3Hp+q3EDynUcj6JitTbKme9L2mkCgq+8Mx5vPHRB/HomROmpyGnUAPdNTeD3bvm8PHPfBkrK2vQKG1zMhFyClqWzqNTBCtr67i3soY3v+YhHD+8f9t+W1GrlIIHjh/G//HRT2B1dc3pk65rQk56IzbC6xXdjmpHrnMbyr4MsT+OGrwiFfkyPrRqKLw/GcazZ574MdeXe6kwKbZBNpYwyJyTspB6mweRBiN0EB0kC8cPAZlDVdqj8Qhve/2j+JH/4Dvxgfe8FXt378LG5ib+4HNfwT/+uV/Hz/767+NLz13A5qZuiFlCGs9MBcCIkSPPw+y5c/1eeVtb38DVW3fw/nd8DfbM72ou6ea5xWg0wt7du/Dsi5fwlRdeMn1pNOhFiGTk2bZuLS7jxJH9ePNrHsIM7WSHyD4QtUQEC7vn8fmnX8BTz79kwBdiAUf9CgQRkf2TT0KDnTibCMtA/YVnJMQNuAjZn84j2LeYzn3KMJ4788SPcZixNWFowqMUnFQ3Ln4swxzIBhru0RVRCw8Gh8LAGFmc5SN+3x0oDuZ4PMa73vQa/L2/+SG884lXY37XHNbWN/Dj//tv4B/99K/ij77w51hc7p4BiMck9DPvk+jg+X3jMa83G4YQPQB3l1fwyOkTeP0jZzB0ZYPcM78LtxaX8AefewrrG5vdWFg/bkThbA/xyyt2axsbEABve90jOHpwXz9SN/jgaDESwWQyxq987NM2HgE0tNBSOG0v4CgQeXV9mS63kUEIBHryAnGCrPXIwGHzWhqnHWQYuYeQIWpHpf4oXSN7UxocnS2lqgauxiHKCssQwlgEiELG5AqSVEvZdF5FBO/92tfjn/7of4i3vu5hzEzGOHfxCv76f/MT+B/+5a/i2QuX62QZxm9mIEwCTcleVmwUOTfWsoRKVV83F5fw23/8JDY2Nl1PZHit/H1mMsYTjz+I17zqFIoNRN+QQ5rGMoiOV1f2J196Fl+sm3YAkFe7hvjQ8jc+9iBe//Dp2Fd1SN8DIH0ofYoC5iQ8lCzSdjIYb9Q3G5ECRTU8yXRzJLoPGbrdKeqjgDbkROz1KzaprQwURnBzktpex5Jva1gtyowOkHlfbeOfKrwvgypqdD92zc3gO979Vvzc3/9hPHjyKO6trOEjH/s0PvQj/xi/+rFPY/neGsmWFElXVE5kqUKVjkYiRUZAI1FEsLm5hecuXMFzFy83c3aWiw3zsbMn8dqHTlekSvw0ZXAdaYqlBrC0vILf/8xTuHnnblhezZty/Ju/H9q3B9/wltdAB9PtncBCUdB4SuNZ1eSpcd/gt5PB9evgU8wAsy6inkr45/5kmACIa7jEiwrjWxGFwlREb8tRMwFKR3wZTMOgp02dQxMi2hvVuF3XbynAvj3z+K73fh3+qx/8IObnZnHlxm38/G/8If6X/+u3cfHqDeN9POqOJkzG3eOak/EY4/GoLsN2uXu33NgtgWo/o9Goe/HtwFXQPSnH8uvjoVtbW9jcKhiPRrh8/TYeO3sy1At0Urp2YGEPHjlzArvn57B0T8866QA0+BHSjemumFF96ovP4Pqtuzi8f6Fp+EPzChHB3vldePOrH8LMZIL1jQ0aLR8HUSQ2oIJH99bR9/BiJq2/vQyhndlFcWMPqRrJYt1XMJOyowyTYny62ZX6r62oaDoEn0DGJyFooAw0+4jo3qoi6e6yKyWTnZ1MsGtuBrvmZrF71yzm52axZ34O73zi1fjBD34zjh3ch43NLZx76Squ3LyNb3r7GzA7M8FkPMbszAQzkzFmZ2YwOzPB7GSM2dlJfVPeDEYjsTdkTMYjTCZjzTgxmYx7b9Hja6tOnu33VsH65ga2tgo2N7ewvrGJPfNzOHPiSGiXI0SeXAPAQ6eO4uC+vVhaXonoVyNj0+BCPVfgsy9ewsUrN/DY2ZO2Q5+voZO94/HIHmd97uIVQ0YDsVb/wSR4nlj/oWHubHlnGQBa+HCD4Y5C8HR6zKz2v70Mky73klCpJGq9yAdaK2YlBFmkn03UupPxCAt75nFg7x7s2zuP/Xt3Y2FP97lvzzz27ZnH3t27sGd+zl73ODc7g12z7hgPnjyKIwcW0G1uCV7zqlN4/MPfgcl4hJnJGOPxuHmmJ//mlZ+h3duh7zu1B/pG3/qdaZ062r3QLM5X4AgYUBgIA6RXrbu+voEnnzmPb3jzazAj48DXTvoQERw5sICHTx/HcxevOGhrBlnISFPKqRhnLKUjDMb2fciAQk5F9VwGW96h/rq2eYVrJxnCu125P95BbPHrIlGgK4CMBAu7d+HowX04dmgfjh06gOOH9uHoof04dnAfjhxYwMKe+e6dprMzmJvp3ms6OzOpr3Lsvs/MjDEzHlsas90xivFohAMLezB0DR20Yzr3m1e3aA0ZfMv4duJHRHDk4D7bQ2nyjLih6WkDaEgU5ASfe/p5bGxuYnam9yrfkCJlOUUEBxb24Mzxw1o5ZiqBExobA0vSQwDNjsmYZWwvg4T9IOWZ+xX2t65cv+f5xjYymIaMUK0UcjGdfUvX7cxkjGOH9uPsySM4c/wwzhw/3IXWE0dw/PB+7J3fFXL1yXhk38fjLjffbhmwtYmVr53u57o7bYy9EuTfbud5J4dp8Z7bHNi7G7tmZ2LIFgdTJwRHYwBsX/4cQcFTz18M850hPlrLrwcW9uDsySOYjEfY2ip2HCd1FxjrltSLPwNjgsL3j1KavJMMMWPRJf8IC6kTZoj4gftVrirARFOODqkdoXfNzuDgwh686oGjeNWp43jo1FGcPXkED548ipNHDmB2ZrJjemDKafweyltNrFSWDa6F6kOhP/++n4gx9LvVT67XcpydUjFuNzc7g8lkHEMz3JACbUF6ETN8wGvRs+cvY70eWmxFhBa46L3JeITv//b34G2vfwTnLl7F8y9dxbMXLuH8pWu4dWepeyv5+gbW1jewsraONe2ndq5THmXGncF5vR8ZisntfuTpkf8IizrUj0WpMC+gtL/Wn7z3a1+PwwcWcPrYITxw7BBOHz+M08cP48yJwzi0b29zgIcMaicDZlpDAzB0DQ3ekLFu53D3K8PQvfuJYENXlqNlmDOTMcZSJ/T1nJUvcCQ+C1kD2Dbc2lbW1nDt1iIOH1gIfOwEQnodObgP7z74Onzjm11nW6Xg9t1lXLxyAy9euo4XL1/H8xev4MKV67h5ZwmLy/ewuLSCxaV7uL20jJXV9ZiGsCnehwy9NKtQWp9DS/3p8QT0ehvNl2DpE+VWmPzLv/dD3RsmtjFgWPv2IO5kfFw+ZEhDqy9D9bcb0KE5wU5OkXloyTfE63ZX5qulKy7b2NzqTr3aDDClSiHWx5vOSuT38o3bvec1WjLsFN31Govg0L69OLRvL97wyBmru7VVcGtxCZeu38Kla7fw8rWb3buqbtzGtZuLuHbrDq7dWsSVG3dwa3HJeb0PGcJNjTYmg6dDfTpULgQuWk4OMhlyhmzA2Ui3SxWyoltovNPKzv2kTPy7xfeQwfHvITocaTLPuT7T2e7aLr1kvtbWN7rddYsC6AGqcOznJVjli8cBwG0zvj4/2+k51891sq7HY8HhAws4tH+vHVsppWB1bR3Xb9/F9VuLuH57EVdvLnbOcuk6Xrx8DRcud1Hm9t17KOk9UaYCRf0QZDr5exHT6qR5Rj6EahGo+02T6riTOZT7Dxla/p7bDA3CTpEgXztFnJ2Q/H6ixJCxb5d3D0XS3H/upyX30soq1jf0xWce6v1JM4I10wenVH2ad5b8LFfms+Xo243vTo6Uo7RINy964NghnDp60O5tbG7hztIy7ty91z2huHQPL1+7iaeefwlPnbuIr7zwEs6/fA0ra+uqxdq2ZjthbtAV6n7FUHbmtl9Ijx59zCGyIQylLa9kPrFT6tNCmFZakem26AwNTL7WNzaxurqOLRSs1ZcQbxVgeWWVHs6J1+bmFpZXVu0FZXyNRLB71xzinpdgftcsxqPuZQRzsxOMR6NtUVd5L6VLOe6trvOow/JnLrMg4cuc/gwwrK6ge0IwZwCtyf0QKA6loUPtW/1wO5FuM/Tw/oWwi765tYWVtXWsrq5jZW0dtxeX8PT5S3jymRfwmS8/h89+5XncvH3X9VGq3CSrRQX2HNJHbVGZqf/UexNmcMgpwlDvEAVy9FCF6Juvu2MNW9jcLPZ9a6vQvYLNzU0srazi7vIKFpdXcHf5Hu4ur2Dp3hqWV1Zwt74BY3llFYtLK1heXcPK6hpW19a7z/UN3Ftdw8raOlZWut8ra+sum2UXldeMIr3ftLTBk7lUv0mP2s7vmsVkNMbs7BhzM91G4/zcbPcsxPwc5ma6TcfFpXv2x05aaI8ez5w4138KgkHkB4XuN7L+Rept157LWvUm4zH2zncvcgCAB44dwuseOYPveu/bAHSAdv7SVXzmy+fwmafO4bNPncOFyzewvLJqY94d8c/gwU6Zogrtm0xaqZFeGUXyvdW1dayub/jn6jpW17ult7X1DaxtbGJtfR13l1dwa3EZt+8u487dZQuPd5bv4e6SGz1/bm2RAMq45s4BHXv6jsbYMW88c4g1JwbiI4hu4XD06crtfUC1mr331vLY6E0FWr/g3spaJ8Ny7MYndeg7F8d/Bh8ba9YNqQwsn+DQ/r1h7IZSvu0i8P2mta1rp1Rzp371+8xkjEdOn8DDDxzHd3/zOwAAl67dwpPPvIAvPHMeXzp3ERcuX8eNO3dx4/Zd3LyzhI3NzToOPMaw77bJzCkTMwDA0Hfp3gru3lvB0vIqFu+tVKRexfK9FdxZ6nK/29XIby8u1+W2zqiXlleweG8Fm5tbPmBsc8aYl9mkyX5zxAG6P3hIdbINBroRxYUJ50STjVnrJf+wolq31MHqoXX4Y45RyDDuLd4tndWIFKMTy6CH7F1ZtW9dfyE8OFLTEga2oblgjvhL91bx9PmXsbK6hoXd81jYM4+F3buwZ/cuzG2zHzVEL/c31G4oTcsynDhyACeOHMD73/EENje3cPXWHTz74mU88+LLePr5l3H+Ujdpv3DlBq7fWrTXiZpy1OhKweSzT53D9epJN+/cxc3FJdxedBS/W52gS1/umUOsrK13qwFZmIH0w+zNxq4OaEn12AgEvmFDuZ6kNi1lRi0C8SQtaqiMWB6QGoD9DTuzs2TN4s3cv1iQyhchUFz37vjKewymAlCfLRlQ+uCgOk3R7uihfT3D3W7Sz2WXrt/C//x/fhRfevYCFupZM3WKfXt248C+PTi4sAeH9u/FwYU9OLCwBwf3dZ+75+fCqeGhifzQ2LXmotvJMB6PcOLwARw/tB/vetOrsbm5hSs3buPFuor1wstX8ecvXsKXn7uIZy9c7pZ+TX+CyQ//d//C/tLNvfqp+TYPtCNkh0T6+J7eMsbyoLKP5IHrlZkaYsoAOOrGao6CLW2qEYUUq58aSeYF0ab8KIsbrw0OSq0X4d6QjOmaw0lMA82xHFQiiwMymLMR6706wMzMGPvTXzxqrSYNIfTS8gqev3gVTz79gvdUnXMyHmHXXHcKeb6eRub/9y/sxqmjB3HqyEGcOHIAJ+3zQO8PUjJvOaLcT5rXkmE8HlkE+bo3PIq19Q3cvHMXV27cweUbt/HM+ZdtLvLshcuYPPn0+QoqES+FJhqsbQ/UA2icr6YhDhhwrd+etLJzUH1Btt50T9Rja5nE+4AjLzt+M5WRHhk6t+nshkFRRJfEm2rX+ZZ+h7FtUwaNSBkwvO6pIwftDeHefXsPpHUtr3ZAaWouzuL6xiY2Nldwd2nF+SHHH4lgRg9wTsbd90l3LP/owX148NRRnD1+GKdPHMHZekLiwZNH7WhQyzH+IjJo+cxkjOOHD+DYof14A87gG978GnzP+9+BpXuruHTtFiaWtRRf1iuaUpQSUmyzaRo3ixfxjQAAIABJREFU71+Nygv9XU3dZy9MQvrGT8yHteLmKwp3+E5lsW8dWDVSlbm7achPRmVSGkk3ZJ/z9j02/LkAVh3pUtMj1UXvD8WYWFkGvYEAGGYcteDxV53CZNx/tqO1qtjSv6bJlhGwzhKPqGOKKsNWKd0S6upaL+159sJl/NEXnrG6CgqTyRhnTxzBI6eP49EzJ/Dw6eN49MxxPHjyKHbNzWCmOpR+smxDMgztr8zNTDA3sxeH9y/gzPHDvA/hw6UpgaOYvu5ePCcWGuyA0LTioYxIiio0mPkYeXA2TT9UYSW+/a0fDkwYqstpkW9u6byaJ54aJ01hltZ4WtRLZdBfXRKbF7B+SvdG9KpPm2/xokFI/2pqWus3ZTD+NToUVyPx/+jZE/aOqE6N2+8xuRq7OjcXl2xjzzfElUYfkX2cq/6IH6kIIDRG2NLHhQXAFja3NvH0Cy/hmfMvB3DTP3559sSR7v962vqBY4ewsHsX9u7unqNZ2L3L5i7ZCXu8JmeZqFYLGaYasw1HUlJPeRzdG5Mlcy6ztr4K2dFyHX43kRmxstukh16EsJSHw1pehrNopmmImGN2/HF/Ka3hUFHUiI35Ss9cpt9ceTbStX6cwPVkCBFWn39nLy8Fr37wFMbj+Cqa7XLzXH7j9l3cvrvkPChYBVBh4ycZlB8FsBBd718GQLC+sYnnLlzBuQuXHagAzM7O4NSRg3jgeHc49czxwzh19CCOHNiHowcXcGj/Ag7v34uD+/ZgZuILq61oUh8hFe8X1WvTpI/MJCC8DyAqAlBZVjIQF0oyUhWvFCavEIQcnD8ZsVqeoQZV+cvOwOgfUyyE9NBQO0dEUq5oH50lxzQP6PUddAJSNB3ayc+79+ZiQn1TlFaNz++aw+MPntw2rWhdOi4ra+u4dvMOVtc2+ilzYMdcnXQKFNPBMA7tJEPIOtCvs7a+gedfvornX75qdMajMQ7u24Pjhw/4w2oH9+P4kf04deQQTh/vjpEcP3QAc7MTk3li3kwdSOjUPwoLY4ZIvGsYNAOXlB5FZfqKSuxLHdTuFQRn6oFrdlCl0vqbTyxrcEgtQ7U976WHotUwLZ6K85nCSCMKKaBWtA7zGO3H+Q7LvT0ZAjsIY1kN6aEHjuHYwf1RL9I/umGt0qT17vIKrty8XfvhQdcP5c15YmDK0QJZl1GlTRkskS1qh93SewAp00X3ZWNzE9dudidrVW+j0Qi75+ewf+9uHFjYg/17d+PIgQWcPXkEj545gUdPH69HN2wuQGGPeLI0kW+kCvZ8h6ZalvoV30vQ6lVAdbyewRUKoyyvAi2ykXaV2oZbP4lWnuOE+QKK/ZGOkMax7HWAt412zAN8sAvUAIs7otJj5wwRYhsZQiqm95yH1z18Gvv2ztvYMK/6PadSnFLdubuMl6/dAlmJzeNEFBTY6RNiAvwn/XrgYExvI4MEA9CU3pSCuACCIGv9AaBgq2xhcanbU7tw5UaVoXs4TpeM4zPV2RmQjc64rUZCp1YDotZ0B2nFhgzaBpel0ElWcoYeyjIyVT7CODDZzL6RJDQ2unEeI6Ts3nPMmuYY+qV7WqQ71tQHavRsmga16e3FJBkUrNwx1WDqmIjgTa9+VXjeRctb3/U3G+O124v1XJXza9mgHaWmsbRI4M7cS69NgJ1lcAQA+I9RMr2wqNGjp/XiONgq9VaXFq6sreNmWcKIw154k0bgGjUXFEsVAvRph6XUkJiE5xDISjOBnI4oP6VUbWkOqf3U8nqv1N/FQlm9Vw0qDgClAyA0Np7Y+Ao8/LszGB/VEGIGlp2mgP4IQmBD38xnLBYVraYIhbQ/IEP3J6cQh8LsouDE4f143cOneyd0+eLUKciH7tU6V2/ewYXL16uhueydVorx7gAAu6O+oiXGG/3NkZ1kIHRKWy26vFtl6NVzeyk6DvchQ91VVxOnQWclATaw+pC4MmNOot8buaLPEYQEd8P1e0KoLoGegTD3UcO8fap35TlLQq+Od17ZoI+MdMYLyUQ278unhFSEdIaeJqeSc7nMF2s7IT2UbWSIcyR40K2g8vpHzuDsiSPB6PkzO0JO91bX1vDn5y9heWUt8FwbOI6Tgau+LA1Vsya9iYKnYEcZHAi7fhyvGHw8TbdxKWruyrfclwyjbgGDI4GPmr2WEoCuiXsa43Qtn/bKwTGYuKK2GnKeKJozEt8qtAeGiLqwNmmtWX8T6quCmNXCfLJsJX3PUQIl0kcXS7r77DgUzYo6COuF+lGnKj6UQzJwxDBIq2M/Ho3w+kfO4IFjB3tzB54zdF1K7zcA3L23iiefOe86rvKajYS3DSONmY5H3jOpsguB6oAMzIuNS0nlqjLWN4GqgeJ9yjBSm+zstASCYvHHOQlKC06hCqgEegPcFzbMNANbEo3EtFWIL1eQKrK1ps65KAGYGwlo0w1sfL3OrUOPqr5ZFmTIjlkVapNpLSM8UHWYM9HNIRmCxsRrlFJw7NB+vPGxs9i9a8544bEbWnplvheX7+GzT51ToaCbs6IvJO4hI+tL+wqwHe8FC+7LwEBFOG1dsBshfDd0DWB/PzKMNH2IhsaRwRGkQ6fIhpNyoQhM/R55LTNoTQWInVJZL73Sf4oZd3/+k5XkCMhRSRIPbiDMs94X+BvJGaEdnXQ+FBYjWBbhMSKAqOXRzolGSwYCKuekq/PomeN486tfZfc4Slj9bdKnrVJw7sIVPP/yVWjEEusXidHsFGbZSYZk0UpvQAZWgdC/+pXLSt/oEhjfnwwj3fSye+YAyl004LhrG3M65UztpKdwZYQHgCa+xYRoISz7ixpDXU9H6Rl7aJ+912RTfTkDOvkrlrbQmJXSTcqonoV+7iOMuVhbcyiWQ+tlmxr6TTJYpAECIMzNTPDE4w/ikdPHuxoS9x2Gdqf52trcwv/zx1+sf0qg81Y7cSDxyEaMcmzcpV0HBXa0fkAGjRLBFgqXw8a+k5H74zZSJ9L3J8Oo71geHYrob2ebJzMhVqTQUNKIsjN2dkSQKkQ3h/JqcGZnGkprOxFaopN68KJQtAiwS3k8Iz9ttNhGm8lEBwy1L6nRlK0z0dNVJCsLwOK89TKkHDW3kcEnri5DQcGBfXvwxOOvsjebuyo8wuT9hlxvZX0dv/XJz9NUJxp3S5zed5FoBZwCivPQkkGjhPPmNhjmPgE8HRQ1awDwimRovA9ald8NqJhnwTw2CFzHXcObejCnWb77KrVuRHNLXSoRS8tq9GDlQLIh8P/Urw52I5e39EXbG7k+X4Y2lfcQDXj+o11pWsS5USGabCKFNuGgEV5hhhxqQAaPqDwsgl2zMzha/9jk0NWaO7CTfOXcS/jzF18OVuOGmHRkTgYDJaXpsrFTe9mQDA2O3cisM71D9etYFbWzBEY7yWB/MIUn1DpGPJnjXNcGw8KPh0pbPXIOXEadsErrnt9XRDD5ya5cERLpsQ6rI/TSAmOthL6lkHzGlxhdtmveuOtM1vkUU35yRFdjdCKw/ORo2k/LMEiGgMYqcyXFfzUor8pxCtU8RiGCj/zen0Q/DIMARCOOiY+rUdwUeqkI7VU0ZGhdeQUxsGagLL3br0SGkZWXdAISDrxxvZfpO1KHkEsiY6B+MAAzbPZ0CQ5QkhCc92uY8s0Zdkrqk1Mc66c4X3n+QXOVbqC8vKA6EvHgrGj/VYNFzSTqI8ggAgjJEAx5exks1aqGvryyiguXrweDbx3VyJc6yp2le/joJ58kXfAYlF676Nhtc+63kmBNWYZ+OzpuYv+ShTVwKGQa9ynDKDqdo5c1LLRuS/870LJxpb7UUFoCcghlCNbONVJomiWRv4jilIsTHVeEuG2bWG5YXa3YOGaHHj2JYp0fOw+O6dkRAAnL0nVWZOlF1bOlQsXlM3p9GfhytQhuLS7js1953l883EgZWt9VJ3/4uadw8coNQ3WXAT5WKkO+xO+GYjLY3j5SQwaOOmHH2r51+jENWpVC9eQVy2DPf/v5cw11aoidUYqktImEN2nqvSAYTeRcWFQDSKMr8HydL4l1TAP0PcwrOBJWxzOHIhkrzHtwqgJ6qKdIo/dMhg7hnFXqm+ZMHRkfUO1HFxCcx1q3+KKFB7m2DNpvTs83NjfxR194Bn/wuafQsj1OmfLkenF5BT/9qx/r/mqr+jrLZ18jwvPVO8JiHaso+V5fBgYDyVEnoHzUFTuT9fkKZBgZmqoxJvTUfwutAESiXtUnwVSFo0PKAdWDC71tTm1fJ6i8fEaEGtGifrYmxMEoCGaF6CbZObQ627QCp/WtTuQvKj/zpewK0VKemE7sqykDUopRZXjq3EX81Ec+hqfPv2TzCb56x2oALC7dwz/7xd/CJ598uvtbEAQ6wbEkF3AGEE/SBq4TYDGWt2Swytl/xP4Z6EPi71cgw3ju7BM/1t2n80AV+UQiU+YenNL0+CRm4IOsyBqX2pQiRQXhk6USaRppUlKOEgES4pKpt1UZ6F79HlbG7N1KXl+q4/vEnzYFqV4XfMT4cLlMUTZgvCKl49T5Ox+xaMhg6gjZOHT179zFy7h+6y5OHD6AE4cPhEcqQeOxtVXw4uXr+Jlf+zh+6iO/i6s3F+l+jEw2NpR26DKzL4EXlMaL29xRLOjtKEOI9hGnK510ZF0i5r9SGcazZ77mx/pr1dy3H+y29WEVrpTGA/GBnY6eEfBjEkrRjJEQ0pboLO/mdiQQnEzPadjgA8oQErvlwVMdgwSiVT+qLIEXNQIy1vhXacjZrJ4DgsoaJsCge8RRTwaI69SONzt4bdVI8eVzF7C4dA+j0cj+Xp+I4O69FTx74TI++qnP43/95d/BL370E7h6azH0SaLqiBILOn7phLMIgVwETVUJO8p2MnTqKaCz5M6bDjnpN/wRxb+ADLLwrg97QsBGWb0cTKzhgUrYdwzj3TAlKOyd3ie5I8AGC/+Zy7O9Oy1xmNX6itq9VAvu1MWNLm8Y2Z+BSnriyNHRQd0EUjrMIzOK/n0g9k31WGCWwV72RlWHVpD2zM/h8bMncfLoQezdvQsjEaysruPyjdt49sIlXLlxp9emf20jA3xsG2xvQ/H+ZeiXF4sSodP/DzLI3nd+uKiXSB1U1DdGlAB12hrJ4xInNPi8fNsa5DD5MsPYRjI2Hq5nhtTx7nU9tjUjQsdE/MlDqjQkaa034jB0i/WobYg4mR929pL6ENdLkkEdQuc7OSVxMoXK+3W0Jt/PV8xWdrK+lNtoi+2caEpkGFlupWlHcYOgPUc73h2ioKKh/rQJTFemO5F9VIbdDzwJyFWJtADdiweKl1taBfhEzstMHvZeyzOJX7oHDcPMl0j8ZJGL0mT5WVYSoNemhE/7rsZRx8L7a8hQYH7CV4g6SrPq24/hlNAmIC031fo5khePlP25qZ9gsPZ+M2DAtMkw8omvHpKDDXLRmrpJVo2Ppedfzc0ejgAmfcmVTPpS0spwANtOk72d10Y603O0nObAfMD5FpWpVLm9n6T6rp7ZqCSbTyPCY2RdOWgoRZ9DSKg7JIMBSolyMbfS6y8QNB5baYeBQ3b02rxPsy9fhPmke2DqZBjxLrReBsRkKLb2zl6llWu4S1YDMy77qZBejUDblu6en4Hi5Vak3JEmm9oWzpMhSCmk26wMktl4pwHIiK4R0groJvGpfYRJWzXkjAHB2EkOu6cyWJ0hGTTi1YhjAKfNIkgVe0CJ+2s4oMneL7dzVsKVUkMCwG54lS9ptJkeGUZsEJwkOappaNF2FHREU4xangcZtggXmcroUBt4OJS+MwbQJXr9oARdzXHspTZkfeG4MDHnswodPKGoRo4Z2vltllezMgMP/nSJ4Gd6lQ5HnWEZQscqe/Rm78VSXpalYZyBZAk+b+lLzzG5OUeHsIAe09Te9dWXYeRnxfkWD5yGiwpQtLKRiTVkIwGDVPETMA/vpV0kt+bO2UEs3DZ5qM5BYbYAPqGvCgtTBNa19dWgX2K7JArUyTsHJxoc4fS3tHZ+yaMaMiRm0DcMbePR0wWjZrnPHg2B60iavbeb+zh7BNeigcjyVZZhZA+sFH3YBoij7J5qUSI7bzBOQuA8H9D7QgNdKqImA++jKDlWsX+cRc35M09UZkvDAHTDplRjj7vBjGaxr4D0pCc+qOe1SVEqbuCTz4glkChVfyZbX4augA2E+eFrCJGBlkeHVJNoOLj7KYPW5e3FPvI5OeHUaIpkGHnK45MSe7WistUwlmFeXSjJqFeYeYpKkuvAkbkVEUH3+Xcjj7TDd+A0TPpNaorCq1D+qXGTdqR77Hjfvoxod8mQpXv3VJXR9J9407+/YWnZgAz9yUk9n9TjcOjqt2+BMHcZVvu4ZYoCnnXwuDjie/n0yDDqA3E9xcnHFhCF5By+F/okO2U/n4uM0m8yRvfkUgMJG6pGssw59VfpSeXRAbh4XU4srZl7oL7KxCrxKww5eBAa5eClSO+beCpWmjAnvgy9tpEhCE6A1Vt14+jDbVmJQY4h2soPDRIvRgyUc8rUzJSmSIZRH+z0aAZ15GEkZkvFQ2F4loIdJYeuxHDmW5m3rEpXn8jTSpH4FpcqVLcCRsqx5ckqAuX84Z2p6njGAB/LVnqUd3LkEpATikVXIceMO9qdcxdqVitFvgzBhmXwts5PSaPfpSY0jmGyxGQUcDxy+x9q6WTyY+muBj8bSYsCzqzrhXL4/sR6emQYmYOQcbgxeJ+F7nX0S2SG0qSAZBziszNoWLRQSwZKUOu5XnRKdx4xJdxXmK20+6dMnV+jwxGnR7w4+oQFCHJKks9JSjLqjo+SdToIpwj6ccJVV4F4HqcGzYygzcsxW6uKeGkvPa5tnKw7gW7YlimUYWQHs2gC2f0U9+aS7EGSddSfnkrRKc2wkqRtiyPngMfb7jN5dukZJykqfzJaqYeR43j+LlE7pCyWU11TyztkUf4k6YT4VDpCO8wZxer9cO4/TnDaMqSXSLcdKJup81hCUTYV7TLS7J89S22SVca6hh4QpKM2UyLDyCaAhGoWtdWrq12bQwf6bipuk25kVp3bNKJFXCHKB9zo1CyovvZTFRnStJQLFnpE1pd2OsH07SIWqUhxhctKFD7jYWG+VGm1rPmcQP5kUGmBYJaBnN9eJbrttSOEwgBAuwkAwydw+238+1A/UlNaspYpk2Hkh+L8hqgRBEsmYyCn6qVHhraApjO9E7mZDzVgRszIpwkTbrBuOWRzNeMnnpnnpT6xRhLaSFVeId2oE0qgDQpWZPQilrPynxf2JUcKa9SnpU4ZNLIM9V7J/ISmTMRXu3rPtKkzcmBlfhpPrTUW1Y1YbyndWGg4/BTJMPLB6AtnL/yundFH/eFOwKsoXWrug2pr6dxLBhKOFDm8VAYcgVUa1l5sZ4oxhvt89jqngGPyAQYYPhBRJ+Gqssq2ilM3pHmDReS4gBDbJhn0HqWhyp8al+MJuWvpq98E1ZdahzRDAv+2QdpUAFwGSXQk6WMKZRjp5JiXVwv8vKt2K/U/fdS01MGueKhD2+vb1u7tVjXk4J1uhsW15cZS21jgaOSEdLPjtyrY5kDk9IUjmTmR9+yrSTFSeSxhmYLXeuWKhj6YfVm7moYgDQOjgW3JoHpJ9UX7MwNk+FWLK15U25q5FWpnLQaiQSvnb1atvAY1TZ8Mo0Lhmu+pA9dxJaE0lVD6tOWkS4QmLLsMG664ExYVg+rzfEJpVdpstqGNKcLr2nKfVa/OXVxn1jfDjdCufTEx3cs5pbPoxQ5Z6VOaVFjvjBxAGqZ+2aAMpIP4PfEY6jAd5bPEtnQ7PNuMHZ43UBwhWqEmp8VgutMjg0WIGF7IK9A9UdYZCB/m00+NHYnxEn92/JPVUUrTY01XXRKtojQkF6KBVKLg4yRKHqwSx8eBpy4jFopwDf3QIMRxrjOErCceRIoUEgioCsQdcxsZ+srrX1E1HImpr9C5ddQzSl15LLbMLNZHWrk2WmysDgzTKcNI/+Qup0w6kewMxjfqWnwra4yiKm+Qga2D6hjzbNQhIhWrFx80UufSB4eIweI0CURq18X7yqgf9eMRxin0v/NtUn4+PCbWJ0dJoZsS6Vk72UaGoCzXRY7oTJPz8HzFAauglG7yCqAxMXRUolMwPxseMMHITo8MI5vsMnBXBpSvYuV0GK3S7wZJHOXcfvu6oY6CcZtxZqOQpAmmp07AkYQjG9NmRxOqJ+keOUtuG8INaZ1lCJEqy0eOkHQReSR+cvssQy+0UIqoPGT1bYfG2yI1Oy+SQQ01vI/Op0yGkWJZv/9quGZjxFhGf/7FyMWD3HuegNux0NnbqNRWsTrjCs8dIJXB67mjMZ/Jbf11GgiC6rJrP1eMUSkpe7i/ThqnqW29fS8dHpLBFNO/WnPdXv/tW7X9tgR27OM+mnsfUyTDyHKtXkbgnuqhWqB/UcgdO4U3wF5UYHMPEQtzQ0YeURscluBHLPiVNAiRgXcTzJmFf+lddRzqmxkr4C2K+qFPfUGzgEQXJkNRGYJeOCrRfaNSXJdofbZl4J+hot7OixP5fhaiAPpXfuIDPdSwRSxfZaDcbqd7UyTDyGy6xNwtrrnX/9TwhDNkQi/O7UTHPjtCsf6sNqFlYcfQlIjyQDu3xDKaE6V0g/rxA2POo5FgpUt9eo11ojYYDLfYBqbzofG2epVFLD7Z2v3T26dQApbfOgAMyWBOJ6y3TgZzzPqdj9X4+LWBkN+20t9ENCEgZAeFv4S5l/atPbolCwPHlMgwKsoYI3fp0LeYkVUjpLxfghYQDCdczC8bgCElQruwEgX+SuWFfppOVdHqSPpViAePKODfgEU+fe5bakTU5xFC+0pc9zNURYVDS0CvtMMQutd1LBu9yqIbzaAMKndWeon9BTMIE1KKioUYsy7UuTMltgPlk7CWh88c3HvMupgmGUZ+uyJxPezn3ldXmUKaZDxUBdCsXbysJwl5Ru+YRagXVKYe2peJwkQ8KdtwVCYn+koT7Y6MMfNrRdnT4Ue9A9s+QMZXdv4knySerYwHtSGDB2d3mn5dQmNKN4kSySD1e0VPbpuNtuHh0rvHqzmpPYHCNMlgDwj5J0UGSlWK9B6D91QmpFDJc5MCwmSyxHuxjMOnCuk04+50oseRzOYR3taOzRty1MhgPBYbmJzvhoUndQApoW04tsL8soxGW0zXxlKhz21kMI9VGYTq9v3X9BjvV4sUP30A8Pur3LRMa73VNuILfKuPLv5cQyyfFhlGvPrJ3sfnZYxudtzgbKkD4QpKx+nzA0XZd1TwwDS/GS/xF5mk7/l+YtvzTD3OrTx2zm/pSuWHWGPBPatUvjj9IX55/AokGjojo0YmH/tBGQIjVq30avicqCGDkabTvazf1C/z3Z8gS39MVTai1V4B+urLMLIxyGHdEnTUQXdDgTLFzpRzn9IoS6L3lki9IUkJNxJNnZJGQtwytovfKxF19DxVNGydJHuIVbRnRYfgxtHABYFOyp2Os6X0uG+xl8RRbLUIUoZlYGUG3fWPOEt2cKptB90kPeSTwJEswnTROgLhiyA+pp7uiP0OIz0lMtgjpIbY8AeEzNtoMHSVKfiOcafeGG/oIb2wgSYShGsHCY0KVb3CivKcQkTSyV49d099atBUxw/KLvXV9d0cysqMx65zRhxhGXJqkMjXaG68ijk1Db7mWNRID1cOykBlgDuu/1Fyr6JL4FRUAaAkGUrQLe/1BJtlYGrEq3gpcjIM9g/0TYMM9gipnbMvjq0a/jWtKghtA7Phh9lrCfeLMaJIR+FTktIs0hUimw2PQhQz6CxQqKTwSeVhqY8iRH5bnK5tW58JvdzAC2zDwuErKqm4bv25AR0hqPK6n7r61ZIh9A2jSSHVVNOEHU7vlI7Ee3xwktmIz4oM6QI12+WTywJ7g+MUymCvoTE1K2IHhE+MS/qtdRJzIapYLTfEsJipEhsaI7ZNAJqYolyfBKayMHD0vSPbNzSxZdgqYxhEOsKiiOad+sA7tQbfJTp5SAPEfIrl78tQNSTOQRSD9F5S1NK6xI85KYFBCfe3RUIirpNnH/+Ox5gu8inUaZFhxMQ19+sMVKB5NvtrHo+wmx0koe9sq5xLsiezzWRbEnVEQkvVhgDIzmAhqdTB6fkq7Ub7SlmIOGTc4diKtlH0Vk9uIYiSUx4LfWeaNrJebH1W5lsyeF+esxu4qPxA1HUoZ3oMZE48qCQgZ+038xNcodIiHmMqGQFqGmTo/iwvR3Nul4zfUL0o02R42og0YdEfjUuRlzqwsJmUYZs7ahw0qdZjHbbbXNMeT8NKz4Yg8F3mzJykMnW60hdEeOhLqm8RINNpKUM7zn3D+m7JED5hovedJl09FhppGBPnf6O1Zrqe2DR5HWJsimQILyrrP93mZHSeoTN1oxzy/xIZY2NiSRh586AnZ9Bowmv25oyDSkhtmB/ro708GAT2H1BnD8c8ihoB/F4ICyURtUbkyH1c8T5y2yjD4HPLqPdS1OKoblPbUs+ahXrOEO/0lsRPUVswFbgd9PdvSuRtSmWoq0zFBTLmnctufGvn1ZBtkqROot89QfQ5hKU0HkGMSY6tnJ9ZyiJ2G7kPXaWy1aoS2+g/hfowRdO8g/0k1XVeSKYc9gt9N5kI6tgvRcm5XJZB1XZCegi+lWTwP+rooqsMAoqkBeDHWXn+pqPJRqlvLCygKEg8VyKw6Sq/OKDqy1fk9GEp51X0r7IKpk6GLkLwhM5GoO5MGxp6CtQL/SL2F4aCZOAyuLcWmCFH1CZn7IVMMcDtbepYm7RRJCkKFFcQs1qYT5atpO8MGLWwt8gAikzipS67OgjrhfpRpyo+lEMycEg1SDNAYSCKffC6u7DDa101ahfZjbvQbnA+0h/GTMdDghq6evVeAI/pkGGkNlk4nDCK2US2BEYYGYOQ2lFvgPvCxnSL2ZJoJKatQny5glSRfpCM6Tn8EIBZvW5DzGu68fU6tw49qtI0ejibAAAPLklEQVT+QfDDvIMrMNQ0LXcy5AzT0zy/OSRD0Jh4DU8DyNCC3qMJ9mWEj40LBd1dF15MCDSYlvIVYDveCxY8HTKMNH2IhsaRAfATl36aKXUdhCIw9XvktcygNRUXXg3fynrplf5TzLjz/KevJNrhpKgkiQd3KOZZ7wt8+ZUR2tFJKs/hUBvLIjxGBBC1PNo50WjJQEDlnOhmoTcXMC1mV0gdSXsByLq+xPpFYjQ7hVl2kiFZtHU+PTJ0f1IrhTXfnVWi3oHmdYqvDvYuoNoJb7xZKlQAn+gQc6a/Tml9hGV/UWPQlx+UnrH3DtPxp8mm+nIGdJKnR1SMpPItJdSz0M99hDEXa2sOxXJovWxTQ79JBos0QAAERdigx8LlML0BCmJO2NsI/A/q0MqdDK3zR73HozmI5Xr6YMpkGPUdi3aJRX872zyZCbEihYZwvoi7ELUjglQhutoX3Vex1bsLtQtb9lIP6RWKFgF2KY9n5KfX3GuUFJOJHtjRvgSIRy369ApbuUaXrAxNMStwhvmcxHotGeLhNTYqOhIjzqeQXlVvvDmGql9ewYl/W8+qNMXpfZd0XolTQB3zKZNhxALYLYV4MxBJ+S0JXMddw5t6MKdZth1fnUaIceXTVyHicprWZweJSuT/qV9Fg0YuXz3b2xu5Pl+GNpX3EA14/qNdaVqk8hqPGeKVXy8S4is41IAMBgzEei9t0DKhe0Qvr7roWFv6HCavaohJRzofs4ip5ArJJj3WzGGmSIaRFuQDUCV0VEKua4Nh4cdDpa0eOQcuo05YpXXP79uJSL1HduWKkEiPdVgdoXcS01groW8pJJ/xJUaX7Zp3rTuTdT7FlJ8c0dUYnQgsPzma9tMyDJIhoLHK3G9RVcLEEzQaoEnvdk8IBgMrjomPq5F2gXupSAkp0rTIMLJyerO0phyKUXG9l+k7UodlMBIZA/WDAZhhs6dLcICShOC8X8OUP3zCTkl9copj/RTnK88/aK7SDZSXF8CfIixe1rGi/VcNFjWTqI8ggwi6Z4cdAUMqsI0MlmqJIObw/s1X1Yzh6JfJh0OUtu+Rql/s2G1z7reSYE3TIkPYqealVGtYaN2W/negZeNKfamhtATkEMoQrJ1rpNA0SyJ/EcUpFyc6rghhe69iuWF1tWLjmB169CSKdX7sPDimZ0cAJCxL11mRpRdVz5YKFZfP6PVl4MvV4o4nUKPIYNXRlp6sheqproVk0H9IhnyJ3w3FZLC9faQpkmHiUaNSFI8DOhcofL8hvEkj8WvrWQdeDSrWl/fd2ktwQcmJeFakfFIKZ80CD37Dj434RBqsNK8I88gWzeA0kY7/dOVIvS8gWYkey+9Bri2D9tvTFzlS2Ak2Nm2EQj9uiMR/CQ3pa8oWuIvWGCo9oBFFpkeGkaFpNcaMnvpvoRWAwBjx75NgqsLRIeWAapT6MJL1qEjI0SX8pRk67Be14RCqyJBy8xBXhegm2Tm0FlKoZ1MaAbRO5C90+v82dyYLEtsgEBX9//9MDlYVDyRPcov70tO2xCYo0GJPTrkkbgFPyUQ6nddVhzVKjDl+Vz8DX1LtaXFxh/yY17cL4M/S5kp/NZ/8mg6/CqQ4oqs9tQTU9PrvDcjbeLog2PTmc9KmWB2Dm2xvKHS5mtWnvrBkyr4MHAsR1V6TbLwKRjk5WhZ70CvH/MKlEJEpuBTbQYIrUhynWmN/0cE/O3xq9a9xmjGafTycXcnFJR6Ct9lrE8b8Uxlf9JvbO1Csxed0+M0I08pA8S53laOGFM9rFUlqDz37XkLebaxY5aAyqsoe193JvLfa0qcM1VYMbC3dHI2zeF4yjZ0Z9uL1MfdvDt3DewSb20nf0pXjoINqbbf7poNsCnvwhHKAVr1qRDaWaCVbHEa9gTPgXWis/1PozEVaJ3gF5PiaDj/WbtpRTgsRQKutb5cEJc4ZHEa7ll1Wja+cnenx+K3gW4sBk2ZQ9I/SwsyBICtWHbDbQS1BBwhLltyBqQzolB6xn61eGxwe5fSKmKTh+dm8iXyct3ke5AZ3HTj5rmdXJvyGZe43Rjk603vLtBScTfj4Ze0p0Ede5s8m/DUdfhpc+9UlO5tQTx24rswitK3BCwptNF24v3EghiIHn2j853HfZPZhxshG4f4D5ZNLTtCIPhqrbRQWw0IefxXdPpHM835DvQ0Kl//HduLt8nzr6R/NCfdIuNSrPtzslO6v3qtQr1+FiZBN9pr6NLe4BslXdPjFduZCTKWdaAOm493K+CVpzzCMUq9QtbKkDHPsXgakI59Y63kJVSKPhv+uiVxdsz5EDZdfkLdZRYftIBcn7JRT+mPwuKPd+8SlT7Zv/60susei+F10EDiMKGmlu2guOdoMxmo2TzA3J83EUIWrglVNSj9WAubnm+cU7kM6/Co96ZDc8iCnWmqTLJDOtjYtmUytVqFGwS6QD7Ixq8zE0JU9UaBv8GTr5785P8kaGGU3yuGDfUSjxvHRw/66AwiJHE3TCY9yGU0xb6ll6p5p3nQwoGTXi9LGwa8RtIwFiqv3vc21dveT5qlfSxHT9mt9ToffPJO+aW8QroERAgejSo2VD49sNTY+dHRaS7hcRtBqTTxn1dsJRykrs9DIROcFBMmEbacxoLNlxwBMRFeG9AXc5CRr82iTtu3Ix8se6ETQw/ekg9u86aCMtzOOAU7dOkil50/kdwlA635e92pZsNHoCAB8hldyxaXPd3T40SHaHN22V2pRPySdwHl+OtGqtmHm6DrRYXeodBhnMDbQBb0zKS2t5hT2og+8rx0XhnA1o9LgBbIaArP1q9vU13PgRwgpMCTecy0q2bLOuw6NsXTv0VxcXPJSl4tzNpLZYt7lyxGY7M7sIIkAgrdB+4gOvzorzlscOKWLDVDa2V0nsYtuULBp1b/XcoQfZRf0Vu08A8Tp9irDDg6k2VyrJvTbYG2KQFub14V+9n5DlaUgfwIcNOaEPxTAkxgi6qLDEGadjqE+lT1LMXSbPA8ascpGc2nzr+41zpXBdekls/zPOvy8BJnacFurj3JFqrPEDN7mnEDgOR/Q/cBA50bU4eC3pYhWikwUUM0/ZcI1b3St5ZWM3M7el2yJZp1XQ3rYiQf1qjUMJXWbnDwjNkAit/2s26nDc4EOQnn4eUPktW4R3UpN0Chwr1MGt0/1D3/Nc3J8XuFLOvjNfUazFELCGS7O8i5rKRUT9ZLCIyvFbLMKmW8ZceE+f1/qSB++WyzD4uyySxSuQtW38qaOep82aCVeS8fPxXLk8P92MOpLX/LabwVxWfaiwzk52c+jHBK+fc7+NxAmy7bax54jC1TVwXEpxK/r39HhdwLxPsW5NzrOg2ZATv69eJ+/z3quC4rfcMaK5NyJhI6qTDYlB79NL7aMBcBZbVlYultFoF5l4kZ4sq5lIqDRTF5Ceq+gyLfnhHnIxc3INx2a4gCsY9WN2Yd9acSmxxttyYNB4mLEy3WWTNdK6UM6/E6wCwAW0WgHBvllpUKeJ9EANsGO33e5JbyrKp8VqkjLjBZnMtizAgbjeHlyq4CaP5itFHgWgMeyRQ91JzNXLARhOLsGArOCYdtq6XmKsrmzFuSuTHnXofqWPDlG/ylNMI5tskQyApzK3N793fapXeUyQ52NxKJACVt2QQ1/Tqy/o4Pf/k3nKGconol7D/3swqBMakjGFD+DQWnRqRYOCqjlufZmAwdP2Aj/Kc1u2ucp05LXdJhxDuJZ6NMWIBCU0K9IxnDqR47jwOQrnK5mnyK8bdWIz3G60JwIev0UZqtpRF09yuPdp8hWEGjDNj+ow88HszCBfH7WyU6P8wIVSrh/VinVn6nu7eR425FfIt67z4jsPJwThprfRCtFGAKn6vfo1oGxqKdCU9cfZJF8MWwCOUUnsMM8UWzfD6639wnOXYd25Hy9BNB005Ix26XpKmLZafba/tJneGVva/RYsfqJ4q/o8PMEEKjmrK2o3n7tgG70y1XKJ8vJ3Jx9LtmirxCxxltLKbfNvbBKJUO2Mm3UgokjyrW08yimt4s4U8FwyWvZlZ94mJRLRtvXrs8JzG+Cyg0Epw4Ifr9K9M/Pv0LoMgCITQOYeYar96m/3/jELmnhLR/T4eeNDoSa3ox9rDZN5EuOaQ60XUvlDB4YO/URb6PtumYMplzfoG2ZstnM8oyn6rDUF+4UrY8O8SVsoyCMRnshWcHpo06kBuY2teSItAaeLp0maEwd9r2c8rSuJFKrXXM3ycHIxEp55lNu2fB5fNRnXM61jGojqXxFh18NxqmcnpXPzQxf+0cFAVdRntK8BtVr6eQygYSZYqaXLUAhsLSh9Xo/G8YCn3IezJFwrN9aBgw+8ESbtM/WNf40nMIQ8wZn5L6A0PsOHXQPZajkk3MVniBc8zS/FdVLrVuZEU1+b5BeDbBKhxh0Ytjjgzr8NDnm8qqe/6otdD18EX7UNPdgbzzU0B686+k33dqO3KKz3DDLWuUsu48Tx6UmxM1H3m1gz4EQ9MlM5iAqzrWa1DMVjzfXnRa11XijYQ3mqevT0ghycTAM7E0H2WW0D/GzAxJ+5XFZl3Zfu1uin3u8ZINbzX9tumVtZvqeDr9EuuY9BfAeVyilUkL0seWkJUIry5Ch40YFYUoNtOd8QrQ2bbpt62NDVFsv97n5Du4sm5k34Sawa59Ws6KcJZ2zFwNy00eZlLQ7kWOtMUzntVcdYIP+95CxtSEdyZm9L24XygpgCjznp6Y/db+1ZFm8SPc7OjhD9PSCqFjp//6YCoQmm3LHEDz7z0d+eB1KmkM0rboMWikaMS+uC1KFwKdI5Bys7ONTwLOXERMZ7mIfDEIf5z1DmHbiICJTRCMgE0QF5h86nMY7P900zMTg1Zib0eGUWnlMLzOHeYyVa9OisxYwfFOHn/7zCksmTSQfh6mNupvcEo0oKn2bDvQOtLHwdOqWkdLt+oNGCi49OAQBs2gCRDbrLF4T9bt9KsMUhfNv3obx5+GxME9mycDN6PTcL/7QoRmrbDEzOmmyDp+fPmAblMZNrgBaiLejEo+B+Wx4wwST/Y4OP092CdxbAMmVvo7DaJv+M0hRKFf+e9oGjJpz2zmnU8SwBOkpCJhJmNlIm4EWaBfjHoJl9m3pBlanDi1TTf0QCMMWXUbIM/tPHY7UghJRMkzz/YXGfyI1g3cNh3rr+B+Yf0yHfwAjBO4Lyccm/wAAAABJRU5ErkJggg==","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,iVBORw0KGgoAAAANSUhEUgAAAMQAAADECAYAAADApo5rAAAgAElEQVR4nMy9a7Bl2VEm9uU5595bt6puvd9dVa1+6k3rgRCSQLKMEDCBAHsEGptAGE948Bgz88Nhw0w4bBzjmBl7HDE2EzM4PGZgAIMNNkYEDKDBIARIAoQeLSG1uumu7uqq7nq/bt1b9738Y6/M/DL32vdWYzw6u6PrnLP2Wrkyc2V+meux95WFd31fAQR6FdRfRYuF7ujvAhSpdQsgUusLSikQ6e6hfkcpKOJ9AIBo/VBaINRfqd8jd17Lf8HqgspCy8pm6K0Km4pNCYUqimQukHrs/mn1kcuoi979QNsGo02rRNVXjTGf3e9ePRoj2bZe/Oz1a+0j41omLR53+vwqyzBqDoR9casohe6WTmrroPiHVKcA3BkgYgMsXN9csXT3itBNN+lKDp37CUSZLahKIPrGp1FGIQYLeaBIdWhSQnGmjIoqXukYYIQr4IoXCfVPl8oQnaEow/qBUoZl0KZhHKoM3QAL3S9WjwGro+P1CtHLn8a7lhMfYgXFxqtU+mx83m0JKpsWGUadSZCFEdNqHGrodk+otoj9dmSQrhK5paKx+5WQkmpLikjqG2agQrwpkmQEQHHe2AZL11c22FJxxepKsahVTCvFBpadjEe4pHtqyPpbqtu5casuitdXPs2r6XNABuOwqB7EeFMDLUX5T9G4Wg3zqarOZd0n91VcBi1HB2gWu4WjqttXMGiZPhlGqKFGUFCKCyAiHpoCDyV0CL1vdat5mGEWQ0o1GTKrDvOLO5wyZ3XFfN946OxCjK7dFa/p5WpYETn0rnQj6b/pm1LreCjkky6Dyizqt8Y3NJDaIIoAUgqhktQ2xXkWgXDvso0M4nX0vusZNeIqx8S/RnCAxpiN1cdd6Qn15WMSy9lQAv8SywKETJkMk5hjVRhns0ioChLUWfLymJu5ZCWTMWQWiFDmKNRAnaT+o4KZaTBzAsCpIJp48Win6Z71UarlKiB4lLDhU4dlRDNnrTWlmMyayypN0xWlj2Te1BOXlV55loGCB1AEnnGqx1XaharTgMd8Xex3Yd2bIgsNIkd3Zlvp+fxS4dZl6I/rNMkwcu+IA9NLkY2MG4Xxqy0FYaA6BZFwxjQRkxgzDHlpzAOuEGOOIqlOjxUx5HUfLarnwEPEMUIym8go0zQIhdsb/Ft/wTlrbsCmnl2CuShlWIYuChVjS5iizduU7443Q0YNYdXZu2o+mKZ7YVmE+CpG3/otfSlQXIZSaXCEmDYZRoZVRf9hB+w80OYTNFg296Q2yrCFd2png671henVT8rVJd9TmpQWmYqkjbU6Go5Z8b4k/LKQa23E5dGvqkDTDzwkB9rcR5WNUjPWSXFzCXqSUjq5t5FB5xYEZZZmaWTLE0udbzEGampDawrk28XLRdOSKoP4yo5Uw7ZITuUC1R8h+BTKYKtMKkkpahQgb4rLjm4QnYGqpxvcWhsaPpvEqNc7dGqELKpFSih4IspCRkT2ZVZH1IhIpVBkMqJdiFXa6mxhibhEgCqmJ5gzMYqXGgVsUqd9WB4pKFJCVGFJTIaqVNVZUwYwcKH+Fr8tcOmMp84xi8lF4FV1qfM+BzafT6LWs/FnHmiQOHXuutE2KoMvVkyTDKMSDN4N33cB1IPcpW0gCQn4N4qia/XsoqHKL7M581oPaW4c7mgWlUqxfsycKFTHeYaVOu8WSqSmZVrbhikglcGOMSz24askhfrs2nB+avMY0g3zWSyOaAPPi/uxkgyFFV89t6gMjmqdsYlYWqxjY3pQjy/eq42H9ekg5cjqJQrVtjonJcmPYEM2J5syGUYRo/qmFASAV+N1cSgSFL4PsrPCTcElTFZv6GpXCDpmbtFhlIYqMfCMzoEUDTxgEYxBEUNqyiaOOEazGMq7IzJzTK/v0DbxE6mG4sut+VI0DMg6IIONiVYW3aPxSMLqdYMszrJryhkm3hQ9LdoTYLJh6Vexwff83xYTGFegwDBdMozisPiASs9SYzWhQVPyERWJxwaDlnblcsDnC7nfZI0c/qIRuw8VQ66WECHOOF3h+s4k79h0BbTsB5UzqjnL7OimDFbdpVUM5mBIhhYIUG91jNjJ8yyk2DiE4RbltY+ongsGwRAm10a+OOFk5NMqwygyuY0TmIwlerkEetYDCxrNqLImbQQw9Gv3Hipq2NXvITwCKGqw3LqDXRRDsk4IM2jaLbfAbJM6Rxb3Tv9lfIU7ceIehyajq0vOSdiQDApMEXQKdFM0c6a0HECkjkMySbMXDvV8n1d6SC8+cTK9NuNgBbEyhTKMAAR0yrt5bOh+fqREaIeGP0Vm6Q94ECcJV0os5VyzytIJ5hl//xSU/6tteMXfB6nUsOwrRVJ14ImMt2N9eE+KVjqgJEN1Nkc1501qOqD27BtuQm2K67UgGlWSgcvVSHgu6I7E+XgloTNKINSzjnuLJUzH2WmOMKcKTRkqSEyhDJPKghOtlX0y7MR0ct1tu9OGCC8poMTJqtIA7ECf1hfycFUSlBNykpBiwI1KlIdKz42sJnSlqkngxk8TNRRXjq4C2dyuis9Xgdkv2NhNbwWkbFqxA+lSvF8bDLYLEK/meEMyIPZJ48TpikCoHf2GL5Z0KYeYg3fD6vf4CnagSGv5ry5FU59hMk1gS4qdFhkmmiJ4B13rEoh42NKczp0BPriiNWB1IWREDSYy/dI1NCq+XOdKcxRxLWuZGxn3VZXFDieaNhVXoonEjuIDqW3jwIRRNd2oUUBTA9aMpD6MHsU06q+r05ehN80Lk7ioK0/FGJ2ZHnenoMjjg6BzIZ2bBnjcuD7zZW3b0eWrLcOo1I51EIq4Y5TCDWH/x3CoaFaoAoECexYZta1G8ESp1ChSnBaZMBSS2U+L1SeH5rbkqFFvDWcoZJwqOzm+NstoZgfPDNW5K4kIWmnyGR2PBLX/kvodkqHE76IRmnL5YCwl9uX0qQ316X0orOvvalwl0Tb5uu/OB3oOzuM0TTJMzJDrgHW8q3cxQXY8CUKyxxeUcFjPxjVHhhbipggTCEgXxzR6ZMTkf912I6VSFcHHVTzb0xUjR6EYJt1xWmkjy6e5a754taSjI2ZF8QiN1yWw68sgPAg+dlL54fSMQ2Bh/iTYh6vcEIpQXulqDKzMBTWpjJnxMA5VR0L1p0SGUVjXr0ZJm8gKvh1fZNwaGbRO1IdE5uBe3ZtwgYRtas/BQFR1hOjR6xEmyZkOO5A5jRq4Cql1FdmpXx8TdT93Q04PRPlKl9HT9Eg6hMoRx/pv6KKX+lX5ewsTia9sK1wQ+lJ65rwNGRRxVX5C8yBDQwdBNp0fTZEMI5+EOsfOrA5AqeWOZiV80vhz7s36qRZVQA4n1huCYyK3C/rkc3UdTa5j6V9r74F0o6mWsiyqwNin7266VzqPHDqJrvhCxaCfD5T3mjRAtvCXCmIZg3oT72wYLcsDbPyCEWZeqzUWBSIzAGfE7K3Rl+tNpk6GkU4EAfXQevCKiOlqfqE1ehWMHSmuDFX9FAqKhdA2y6TGWb3bEKCzL6vTob/fK+m3nXy1eVB0MQdyGgE9MUmIzwos6bvzTu21TOrxNfOHfqQyPgY81lPVTqghGdhYfKmbeVZhQYPQl6krCK1DX7pnEOYEKqNUYpryhlUdIXouT9z0nS4ZRqUaQuibBSNezMq1I3o8zQzMmGX0zIwkQzUjU8VGYYLnp/xMuB/Wv02WJbZlhWnqh9SWUsJOLHcudlTSq7djnjhFrPcTplg9k0sSbcg2MqheiKSlLamepEmnokkYJ74dx9ZWdUrdrymBUlsfPQajjUyjDCPPodnAkbxYx6pGEsVSRgcgGD0vKVrHAlrGdJwtBou8LR8PSjgjOnFFdR4x46WmVR/eXidofOSsOMlqs+ogQn11ii1Eu1iY8s/urJOOJaVt6lyVX2G+jF4ylDTRHpTBQ4mnGyZ/to40nhV4er6pdAmEijpy/S2apjqxRneJttlmNvLpkmGkDGjeTOAXPiv29dmixE/YWC3C6OS0sxZFWkZNLevSbw6vsO9k2jBjJmczUOI0g0jYRDilN0pSKq8qktLU1a9uIsby1whEOpGKgJL5B3yiXWhlSu/RDwcEFd3ptGTwianSIR6pbdz3MYoISQrpP0d0j4wlTn5LvMdAp+mvH8UGRcw4vtMiw0jqAEk1om7JVIeluoE2AJ1R4vFmcOPwXu8xoheNHooCInasVxT1a8QIKzcmoLj1JxTwaEVr/6QY0jvpz4TrnBLFxoAn1CYD1K4L0Sr0DEXplmNpYqf9AtJ41qLmtpoOEK8UfJsyFK5Ao2uRjuVXsGJoSemnRd00fnEJXaJRMqrniybL4b6O+xTKMPKQxSZvFkffNa0q4GdfC+gTBNrFBzEwD0UNr1MfCqtlvoPMwUIdSesrWxpZzEGoXzVcR5Dq6IRaira2Np4XDkpdkoWQPLobXWz5Lk7soyOaMwt9NyeJ0ckjriZeMihDb9OQZeD5DhTcQDpNR28YKUrUUbhYPYy8yjvivaa3aLsplGESYAjKIFm1OUUnQVe9cwodYAhoj6gyKR2tOJjuqRL6Ux6Ll9gEUoKee5uAhMwdAhNNZY77LtqONeSbakX7oPDMRyvCBqOpwXWoBh/2F1QXLR0oLeXBb7j2ZUgGBzGmxX1wvZ4e69h0m1yk/WoCvGcUj6TY4JEKq7FqyiiIdYmG/RYnMS0y+MZcHYnOMWtoV19wCHAES14WpzbulTx54V1dUyDrM+XGcYUGFiqE7nsIlfCKF4cRNC5R9dc6XT8BqTMf1Fblstq0mlHUEYKiCVqKn6lFGPhKl6KK7CBD1FMCNdJ/0AdTEJcb7MBE3iISAZeWR4rKfyppoHnxwqmTYWTVhb1PjZWbDoyLtVXGggc5AylF4HsepFibEtpUqKTyaJgx4YYjTXXcODllXXnMZBeNS50g1GLmqW0htri/KkOvWYrMgTnlIoFPlqEHwaaugjQE/bHbLo3I/Aw5JBuojk+jGrfvrUROmQwjHizDLhGfqWcmaweWsqWOdKy7ex4JIrPRadz2KCIAPYVsf5G3MT27GySgPF7MsIMzs1wKFiyPokgH9dVXnYe0xeQfNtGMqBd0NSB6lsFCTykRmgldUSftnlmW2FblilbbY9159Dp5JznS074rR5YmUkpVpk+GiaU7EpevSs3hLa9VJvUbAajnA95JXiLzTS06chuciaAQ/bmHy196xmQQbLLAJruJbeO3lQbZ1xKL2JDtd2Y5kbJ8Wagwy2aWQQ7UAoPET4gOpXWT6SQttpJnpaOG1Uo7LK2h/lTHNvbUyLEzGCA4onPfUyLDSOoSoR67tYsMWgBbetXVFHVIB8pmTEqCed+mo0rY7ZcMT6lm+dWhk8N1VZIismFltAi3KZplvnPkUpmDszjS9M7daEN1RpIxfOf+e/f7MvSuHs8llvMKFw8EA1RJ9cN9GgyVOfdpPJMiVU9KPwHwtMhgz1T31t8pl+UVraIELM1wx+z6VCeKhtmtODkjfsbJETLn3bWUFBIjFkcBTifiUpySLCa8v7GyrixVBTt6kFDZESyVjKtQOsiuq+Kf8HEYBI5kG8YXO31DBq4fELLUPRXTiwth53rI2YbAoYTvRN/KxAGtqMwtRyAa+j28WnI6ZBgVtXjx5c2wTAp3LIsQqN5tRwzMghEkpN8MEF0jPz3rfYl3wiRp8qU2oqtL5hPVUPRepm6IzeG3OqIeAbC+WAoybr5v+xXhUVoHHMeN6Jw5jQS19Rk5bE4SJtJZBgJEPUtmTiQqG92nurrzHiJrMOaOZ4HLEPZKbFGjFqlta66vv3WsGCjD9+mSYeSTwaLwH84A+WDwD/UuX/ktwYI8ghiCZ0RzK3aDtifwJTJODNguehXIJ1pQTzFZbU+lKkaRwXfOWTAyTFYc8lyoIQPTUTLkpMYvXyWVKaspP95WBtMDkxG3RENCEsxoIfKl/h1AMSM98x/R3dpQ2uLgEA20ycOUyDCyAGHeFVFL2TdWFJqqE+QdVN9ijx3ZikKt23qAhyJiaktHd/VhCiNVopUab4kYrQKECSzT4r7ZUVRxvNLBY9jHD6sfIDAPQBqgFhkLBYMylL7uMkiYHCCDdecKvFi+rf9XfbJT9mQtbjucPzMdTgHDK2amS4aRepTzUpHJA4a3ScR6E3k2mEqH1+/dJwzCqePqSNy8oomFR+Yk8ZatU+h7trQwea7/G29NqwQpNtZTcZx4od3yGD1CXUFPBmG+8tWSgVILNzquS0wGI/BBD/oGnB4ciLrhChoN9bxIGJ6TgcSde9fldMkw4pTDowXgB4zgKJyXswKyqjLEfpqSgsJUcBeiM8bYzq2HvVUFSBAk6TfxY2RKUkQSQYyFDOE9pgJbmd14yM+bFNLFkM+1+OqQdECGnIZZCpn4FlJnKu+fHnUG7IAkMRwWHlywaLBZhbn+gMzTIEO3U615NwoxI2TjbojBZhIqUwjoyV9SoUWb0k1/g/Fk+k3kMDZjGy3XlaPqxxDEoxBm2wWmg6rxcLKUaPX7oAiokUnbSN3crLoXk82PnvQUY8qiY/IiO8rg7VWxcTLeHARKU/LqjOrV5Jfcno7fSywP85xalFIQ02VzafqrLMOoupEnGgXwZa4Y612ubLnsvbWtGkr67OrSQS4A/uggSc1OXK1BI5f7nRtHXNkofhYLdTxsblOYTZMZVNY/8yJNJOrGWnXEh9Iqz1VhFjirEcRz+j6oLoA6DkfXhgzspUX1qTzQ2CnvOvDqXToWDYSNfWjfrvLQQuh/Lub5nQFX8aCu6DpFMozsL3gqkfAjrKJbWaQCtV9CUjZ+ekbb0NStNxpn7Mr2IFLqIxX6zcNjb66wMN8RN8geLHX3I/gUioyRryy+fudTluavqY4PrETHVSStHpSf5WjLoJbFXaR2dDssNBhYcIUkl2IFg4Hpg1GoUFuXwdLWLEPob7pkGPHNXjiPEFsdmB7sIBE6XhxJGWW1zyBZNYieIL3Y6Chb2DmgfTCK+KOb3gcp0pSUFMh6ykiXVNFL5/hSxIOjWS+UpwbSE5d1RKjYkMEm1tq35mbqnKD+C53b0fEgtAzyljrONUo1ZWD0Ntm1P7pX8rJ1ROtpk2FkD1FUVFKj5/r8Q9GeD0VZiOtxxZ+NSyOH0tD+w71i/bqDM2wXBEMEbE7Eodj3NRCNsGXYpIPsIHl+DfCAaQdep3kgL3Tkn81B20YGizShWUJbvc8gwaz0nM2dTp2xy/Wpk2CEhPAlK9SQjOZaDpp23m2KZBjxfQD2HKz2JkW3n+p3YVruOBYAijqIxNQhyZmPJbgTqkEJ2YLuQDf0NbBKUYICB/TdNG7c1xXjI4cYBHmZ5QAbDVQLObMWbyNDqQgc0FJlqIah38NCAUqilx7cIb0rOxne/BxXR7szm7hRanUVbIsnq/6g1XTJMOpNSETozX3xpKuegAVNTIM8OmFS6YQNPFpA79yQLgeUAl6CtajYq6sMdL8La5J9zWQurhUjlTyWvvPgNaMBj7jxTcNT+zGwoDHvGOI+QTfrPeW7lEEZnLYWCoIe2Q1DaPN6hesVgzJLny3a1ojrWCLGp4534I/SYZtcSycDR/Bpk2ESxgHKt1uUljmw5eMS8Lpq5DQhFPUcuuydqBw2mSSFQJtIpuhiP4lPb0+/RFenYpiNEzZHYT5saAQp4tncKIFIEAB9HdpgWIiVrBbYkfH0eK7TSP0Ui9EU9fisFh+zr7qgMTKg0TEjz9WJe++wJhmc/7kEehpOXAZjV5QCjQd59DTJMCoiYW7byeKRQZ9VJV7JoPTgFC2FshakDq4RrrymP5Log0zr7wUWZv12MVRBQT0tqf/3nanniLUPjVy9B5LYUVgfZJUWZun/EL1IUYVpW//0q1R61pWfPA4MDMhg/XC0Cs5OTw1SdM+TyVL1FZ5TKToZJZ6FAIfmd5pHM99NGeKLkCKfUyLDKCjXWQUnS0UZJvn8ZCKi1yeF8F/q7ISqTIV8EMGa3UkIUVkIQ1AVipDY0i3d4whsU3iufHUeHerASXY8sNEqP/5uHpqAE5xTWhnb0shI6MaaSh6QIRkYnWmlIJgd6aEYSOnNrm04GmM4QjoVI03znFrRuuXnalyG5pyMZJ02GUaWtgSOg0UYAkuwXlAuaJybBoSplK6kt3zGvlgrWmsp5CwJPah/NYze3kIpMfIZi65cD6FkyJUvo+0e7H3mNrmfojKgEXXyEqAPSMt2WlfYM+EUTPlVVLVxc3bcWFwGm0sR+DB7irYuX1/XjuTZSULFXptpk6H7+xCS+kj0bE6gPznH3elqGT8LxUbvXbnBJuNS+fgzf7c2vRtEt9WY7D/MIXSwwNEg1u9dxGQ8/kw0Ut/SEmw7GXIdGsTm+Z4Buj1aua6kgh7thm5aHYb7A31+lWWoZ5mk37ZGBAH8fI5ZZAPLCqInZaVIHxE03bJq4nR0ky8YHD9uamhANDV6iNcNPLEMneDhXj7dG1CiFQkSOaMnhFitq6T/h8qH6lhISZ8ptS0DiBhPEmxfp3meSOsWqltiu4DIOUoy31MmQ3d0QyJvHWPwyCC6/+DWoRtpsT4o1A3FLWdMArMS6nCkUOZKoWcwFMBT6BOG2awIlcmQiKIAWilWLmgolsUiffhDV8k5JP0PKqfv/LjooAy9VSd+ei894iqx3HhSEEn+a1rkFIhTVdMjrRJSNhD5o5Q8dCJTJ4O9l8n5rwY5AG9qxGE7nI23MmDg5jI0nKSfTlhksN/FFMe2bO3DBKt3sxmZO290BPA+ksxJrmi09IBLi746nCAsDOx4tdKFIRnIEWn1PVTRFI1XbYykvmAipzyFnnwmskENJStFDdZaBgRucB+/TIkMtlOt8xld+rNXwMONVjuQXF58a96cApRugVdq/IENV0oxzo21sPpVggaNVtGmSfHKz+CAMDz7+ZhCfXTtVG5SnGq4PubqJyi5L4mpHcKXZjpV8g+mNSBDDxjS6HCEiZtaSpfRN3ZvGiL75NU0f7dv1bMZLK8IMRG4AYogczMtMoxCWKY3aWRUir4Ub9qafqClN3XrnY6YO0/xbyWke4qytthjYU7ApDIChzdsZ3Qt9BkmVvREV8vYggLExiIiV+6LB0mNoh0xJNlBAIMBGRgYepfRct7D3kztg3dzDY1zfqD8FC6i6GdddZXSUKrQQQe2ejRlMozoOB2UPR7fHBUKw14spBDEX4WMprpEjym6b/MF91xbbWoZnHKoLAi1oWXgoJjC7ROsULXQTwPS1P87A6AHi7TcJvrUlg09d5SNQiF2SIa8UsLOyZNCs5+E1NQuGG++1Cgk3y6RDwsJjHguQ3x0tzEPnQIZRuAOdFVJq5rHuRdLdf94jJeF8+MYPMvvHXVgpFbjUSOGb7LEpbzUjuobf/W/YDQWYViBDT4k3S+JRsspSR47IsD9CfqTdTMS/p14DDg1IAMqaATVkjHmCWsDcfubioSabIyBFjPMekD/oj5DZOQJ8xTJ4KddOXSIGzpPZEXLKxO8TR5PfLqB8GZNb23fGE1oaQNfFUZKbMzLo0FZe61LqBA2+9AwPpoLwdt2MsRB8zCgfXLo0DQxh4cUYbVAfboketZ8QAbA/o6CAxfP50rsg4U3HZdYbmzpuCVQBAKKN7A4ysZ1mBYZ6zTJMFIi9clmvymehXFOrl4eUD84np8s9MN5yZh6Rk1LaFxHyZvx5a35fl0WOKRE1VF1IzLkO+KEFLOcRm2lDhQMPDHBkdRoFOvbAxohfiBBgKH1sY0MUHQV7wOUOiQdFPhvT1EZhb1/G30RhAmO+H1jg4ytUB1fDSrOByN1iBDTIUN9c5+Ews7+tFMfM7aFkAKZcw6sN3NRAMdin/FZgELAoF+ov14kQZhQRfQv8Tsty4W5S7jvz2Ko0YpGsjTYQRZDsDq49of7GMG0n6QTcqawJKw0WzJA7aXKIFSoxGwxI93TdCQMo9IpJoIpgfzdHFnIAcz4VReK9PDHCUj1maVpkWEU6NUOunuMSuQU6mgl/SZGfQlMgvMIE9I+SupLUVC92FCE+kS6tB4J2clPCmODU4O2uQ7xr8CeQ28IWR09jmqdLDxA0fHYiIvRhB2DMefUtmE+MiCDsk23HBAqoGlBKfZL7SU4GhSX6aEd5V95DYNOjxwnnoQGQcE5bt6hd02LDHVjjislgyPgDVmCxApWR9iYK+2A2J0xhIN5GTIKIy7YPkh5JTbolcHbV74MJeBlIa0D8SuUxjEd0wNN3uH8NnlACgCipwNKiAZhNS5EiG1kqMoJ8z9VPjoDcbDQZ0OKO2HvT/4ouDAKq2YqOIkbe5in8XcGlIDMDW+YIhlGoCsgedfMaOmR8K6tDpojMz8zUYqYUKIMJ4O2VSXusSgWpCMADYdpT+JB6BJJ9xE1V0BFIDdye8DEcSnwwIYb6XBHSaeUAjKSGm/aRp2V+MkyqO96uaJgalDQjU4SwfXI9dCoJ4Gqv9jY9ocZEa2NITm1zdFt2mSYpGbqP7UCISBAE2RRkHSWS56wVkqKnFo/5cCo5YrUliIU9efqjmoc1N7QXdubAYPaWMfejhyOZfDl2u5XRGcfAG/o/bEM7sk6Qq7H2ZkJ9szvwu5ds9g1N4tdszOYnUwwOzPBaCwYjwJGYWNjE+ubm1hb38Dq6jrura1j6d4KFpdWsLG5GfVp6VfUc6k89PRpoOPgIqEdbEGjO/NWaMC0H9ZHGl8CNNNv/Wa0s018lWWYlIryMUWR+uyDBCQNTqGVzUkqNzRBNgWExyWpPdlO76ivsD87j2ZmMejYXMAcgJSl69zCfamm9Cg7O0vlzZ0J/pRfRXDlpXfmiAZHRLBv724cP7wfxw/tx9GD+3Dy6EGcPn4Yxw/tx7FD+3Fo317sX9iN/Xt3Y25mBrMzY0qdgOWVNSzdW8Htu8u4fmsRV27ewYXLN/D8S1dw8coNvHT1Ji5cuY5rNxexubkJc9IG6LCTmj7JgS2iV7KCoAIAACAASURBVB2oYal90bE7T4fpOx/lsYd1qo34imUPMxOvkZd/4zLsfdeHLbiQL8IP70kz7cvOHRA6NTC8TOhRyEj1d6c/RliiQ5PgZirauhKjtixsYQsRaTTKhZDAaK/ao3K6PRoJzp48gtc/cgaPnT2Bhx44jjPHD+P08UM4eeQg9u2ZDwPJ+zosp17haAj9LgW4fnsRL7x8Fc9duIKnnr+IJ595AX/8xWdx685dOOAwaKVPICrS9JH0m9tU2iGlS2qygc3loH45umhGwOVfBRlk4V0fpiBAiGn0C6UN6TGMYLcaUeC5PN8zhKUb7rbGYzA0oK/MjO5wdGo5I3kjNBqG28EZaFAyz+at3Lj7MR6P8ODJI/j6r3kcb3/Do3j07AmcPnYYxw7tw+5dc1V1ET25fxN1B0cZai8iWLq3ipev3sTT51/G7/3pl/Cbn/gczl28Qipgvesw96zYPxuo47UJGJDGK9VseESjfm7t9A3h/w3JIAvv+nBx4s5yvrhZZIGDUGJLo4b06wywuKOqeqhjsvEmYGOgMrqwg7RCzsA48qrU/PwcvvUdb8Jf+cY344nHH8Th/QvYv3c3ZibjQUPOBs9XdoTtIsVQm61ScHtxGecvXcNv/OFn8bO/9nG8ePl6xZN6CM5S4ipUAoy88hbycdYPkCJB/g4Dku4OWViKEHG+Z0qzMSvW5v9fGWqEiA9ihGO2wYu6zpv2QxHO+gopUk1VdAWK65NDo3q9T40d4XT1Slj5QcjOsz31YqUysYwAKVKxtshhxqMR5nfN4uEHjuM73/u1+ND734ljB/djZjLGaCRxIAau7VKkncq0vNVP6/fG5iZeunoTP/l//w5+9tc/jpt3lrC1teUyqYY5MrPOSA0Y1GWqn0Gr9YlS3+aSaIbyRr9AGq+/fBlsDmHi0LyhKLWC6DCcf3VuHUBB7+mAhs2PAaMxupw7Bp5SYBwwulC34bWGVA0gag9swczMBKePH8YTjz2ID37z1+Pf+trXYd+e3YP9b5WC5XurWF5Zw73VNayur2N9fQPrG5vY3Nqq41gwGo0wHo0wOzPB3OwM5udmsXd+Drvn52y1qSVnC8CGHEivT3z+K/iHP/UR/OmXn8Pi0r0eLQMVS1EKJCILoW9SbQI+vhmzhTgm8WgPT3xbGYWCWD+P+MuUQRbe+WENSKFG6LKUupFRzYkDB/OqdTHUKRHP34fK0PiO9r0mOmcmGBG0Ye67tpuZmeDRMyfwjq95HP/Ov/02fN0bHsP83GzPIDc2t3D99iIuXbuFKzdu4/L123j+pat46eoNvHz9Fq7fWsStxSXcuXsPK2vr2CrdxuRcdYQDC3tw7NB+nDh8AK86dRSvOnUUZ44fxgPHD+HBk0dDnzmNGrpa6dWl67fwz3/5d/BL//qTOH/pGspWhTx7e51RjspS8Kv3THNCOuf0Q42jVOMWpjk0NH1Dh1umy2vOwznEX54MXcrkHLgXVqE8ykUUyBGj8SI6kiudVcrGTLQH07eck21ztRyxE0uRIwKNTqK0zWQ8wmNnT+J9b38j3vf2N+IdX/M45mZnOlXWwdjcKjh38TK+8Mx5PPPiJTz74iWcu3gFL16+jsvXb2Nza6sOqLj6ydHDipnyaf2PceroATx65iSeePxBvPV1D+Mtr3kYp44dhCA6wk6rVXnecmfpHn7zDz+Hf/ZLv4Unnz6Pjc1NbDfPy7qJem4vYoTFjWTn3c+G8de+JBuSB+qQ6TCImpb/EmToJtWJ78yurdX2cva2UnwuFFFqO0QLMvLEqVWhWZAhvk28Nf9hMiePHsR3v+/r8a3vfBPe+NhZWyYFgK2tgpev3cQffu4pfPILz+Arz7+E51+6iis3bmNtfQNu3cLCpDSsfrMBasjg4Rbj0Rinjx/C6x4+jfe+7Q34wLvfgpNHD/UcY7srg8zq+gb++IvP4L/957+MP/7in3fzCqAPSjx+5lhWUMXNluogGRxf0yC1tpbNAGbk0QBLpVU31uj1kwTzfyky0KS6VjBeQtyAu0M1dAFjH9WtocvCGjOfoEIVELSZlBK9D70osZ0ftICoNyBdpZEI/uo3vR1/44Pvw+MPnsL+vbut6dZWwWeeOodf/b1P49kXL2EyGWN+bhazMzNY2D2HmZkJNje3sLh8D9duLuLFy9fwzPlLWFpejaGoxWwzYvbLRiLYv7Abj589iR/4zvfiQ+9/Z5jIA20HGUqxNja38PQLL+GH/sFP4k+/9Fy7X/2itqF2YmKk1ZzGJDbMDXPUCJNgpHFNWYMSbNlEa5L8F5RBFt75fV13Tafrp0mWbljwYzQgL4crI55NYg9XZiUpp4E6Gk5b9bEDraDI2n+tOzszwRsfPYv//Pu/A+9+y2uxe34uoO+txSV8+dxFjEcjPPTAMczNTDAajcwYdUe2VHm3tgq2trawsrqOL527gI99+s/wrz/1JJ67eAX3VtY8lRLeRaUJp90D6dRlEAC75mbxTW9/I/7e3/wQHjx5BJPJuBephybeXAYAz128gu/9u/8TvnzuooFprBdMQG0IoGHs3SNVN8A70WzxqcPPu9+ASNxLslSJMpJWuv1KZLCUycg3vI/2ru2bSh3cIgFFW2BULVUCNFnvXQyozTmE9g7oHzgcCAm98pnJGA+fPo7v+eZ34Ps/8B4cO7Q/IO2wctvLniyv0tBrdW0dn3ryafzMr/8+PvH5r+DStVudYzSvFC0BhOU7uh49cwI/8gPfiW9955vCDjj3v90ycKmT1s98+Rz+03/4k/jScxeo36jP3jywkSol7uOEWwZ4sQaZULJikXbV1oQx2Ncrk2E8d/aJH+tuCd3XyQ1beOeNlgeKE9FORGJ7neToPN2VUw07CBKVUZSuFuv3hlY6e5EgvIfLyijB1aEDC/j2b3wLfvQHvgsffN/XY+/uXY72acBaZVreQlytz/fGoxEePHUU3/7ut+LR0yewvLKKa7cWcW91NcqeE2nOvZMMgODGnbv49Jeeg4jg0TMnsXvXbBiPIV6VX/199OACjh7ch888dQ637y4bDx7FdOxKHA8ethAFKmwGJFe+ksNXsOOIyRmCITjfB0fRWD/y9cplMIfo2rulK/2eoREdpSK1vjuP/nYmwiD1jIlWAKpQjCw8iDDFMj30eHShI9Ovf+QM/ta/9234oQ99C1770OlgwEo7G8/a+gaWllewvLKGra2Cydg34vjiti0nGo1GeOTMCXz9Gx/Dnvk5vHjpOm4tLpsxdYsIrJPSBwX9rIh7d3kFf/bsi9jc2sIbHj2D+bnZZqTIcvHneDzGyaMHsbq+ji88cx6ra+s07Ix89Z9WxNFqbJSA20ArfaAUyCe2DgpFCJihZbU+20Y2bOLplcoge9/1YTrl7KFZiu49sAN5wpSdWZsbhTpgzhDcwNsZgNfJ93JG1cqwBrIuvTe/axZ/5RvejO//wHvwDW96DcZj3/jiiefa+gaeu3gFT527iOcuXsFLV2/g5p0lrK6vo2wVTCZj7J3fhRNHDuB1D5/G217/KM6eONx0qtal9xaX7uGjn3oS//1PfwRfeeElbG01ji6wXKQXB0q/eWj/An7wg+/Df/Z9H8DMZNzjY2gjj/l67sJl/J1/8vP46Cef9JQu9NtaJOEUBcjGYbOAEElq9CuAsIBiHXkDjSCmGonGF/gB4goU2d19yjDpjLjUkAR/BqAnaxTcwSoyn49V8CDElIeYM8H7/TgRroOe0uywRzim3dU5fmQ//sa/+z78tW95J04dPYTRKKJmKQVfPncRv/WJz+H3P/sULl65gTtL97C4vIJ7K6vY2NwKChYRzM/NYP/e3Thx5CDe/ZbX4nu/7Rvw6ledMnbz+j+XAcC+vbvx7e9+K/btmcff/kc/hYuXb9DgkLwWqt0INHr62Auu317ET/zSR/HQA8fwofe/c7DfIScBgAdPHcWHv/09+LNnL+D8pWuuR+WKkY9Qmz/8e7UpHj7L+CSIpjJA55jqLNq3RhDEVE/nrTDeiqeYIRLdvww+qQ4cgwinAaKzSCkyordEHATevj77Qet3ITQISqbvaixaPh6N8IZHTuO//I/+Kt7zta/H3Iw/D7WxuYVbi0v4vT/9Ev63f/X7+PzTL+Du8gpW1zfMQLbLu0Eyzc5McOb4Yfwn3/Mt+J73v2PwiHc3HtEIN7e28Nt/9AV879/9J1hbX6/jMiCk8mAIFysUAU4fO4Rf+Ad/G088/uC2c4fWZ6eXTfwX/+PP4Wd+7eNY29iMOg1RQNmrWYOBXFcqPQHiOSU7hZGE7D0SUO/nyTk48hi9hORQgL9/GWwOYcXqupa7SuycvFeXZbsJc2RSEjM0JAE5OGJp1CxUbnTEnpOq9+MhsI5lH+Ddu2bxgfe8Ff/07/x1vOW1D2My7k6grq6t49kXL+MXfvMP8KM//vP4F7/yuzh38QqWV9a6J9BQHMFMc9oHo7Ub9+bWFm7eXsLvfvqLWFlbxxOPP4g9837sO0/YGaFHoxEeOX0cm1ub3SaZOQ8hSAA1RULiSXVeCpbureL5l6/im77uDdi9a645z8m/ed4zrvz8qz/4LG4tLpsOGEwLj7fEHWAR7oO92eeV5jBSgTfJECIlCCDMJ6TSgNkkPyUH4cUIvCIZfJVJFH39OIHlqVVZ3bJsDLeBYUY2gYW53sTQ0D9utaty8nqzIYSoYApHLKAP6qmjB/G93/aN+Ps//O/jyMF9ALq5wVdeeAkf+b1P47/+iV/EL/32p3D91iKFKphCu76IuD1qV+tayIavdADYKgV/+qXnMDs7wdvf+BjGo1ETpbP+AOCxsyfx2aeexwsvX4sRwRyfQ25d7zPU8M8tFNy6s4y9e3bhra99uDf5z6thmZdSCg4fWMDl67fxqSefqRYe01MIz3dSCFPNkJGXSoMNO+g6yWDpr9ldxAZzCrbwBB5qL8bnfcoQIoS/EsVRnNE9e5p1KpJWikrfeBGI1FSJFaS8SRVXqJwhKAumX7v+X/vQA/hbf+3b8B9/9/sNpV++dgu/8rt/gh//hd/Az/76x3Hp+q3EDynUcj6JitTbKme9L2mkCgq+8Mx5vPHRB/HomROmpyGnUAPdNTeD3bvm8PHPfBkrK2vQKG1zMhFyClqWzqNTBCtr67i3soY3v+YhHD+8f9t+W1GrlIIHjh/G//HRT2B1dc3pk65rQk56IzbC6xXdjmpHrnMbyr4MsT+OGrwiFfkyPrRqKLw/GcazZ574MdeXe6kwKbZBNpYwyJyTspB6mweRBiN0EB0kC8cPAZlDVdqj8Qhve/2j+JH/4Dvxgfe8FXt378LG5ib+4HNfwT/+uV/Hz/767+NLz13A5qZuiFlCGs9MBcCIkSPPw+y5c/1eeVtb38DVW3fw/nd8DfbM72ou6ea5xWg0wt7du/Dsi5fwlRdeMn1pNOhFiGTk2bZuLS7jxJH9ePNrHsIM7WSHyD4QtUQEC7vn8fmnX8BTz79kwBdiAUf9CgQRkf2TT0KDnTibCMtA/YVnJMQNuAjZn84j2LeYzn3KMJ4788SPcZixNWFowqMUnFQ3Ln4swxzIBhru0RVRCw8Gh8LAGFmc5SN+3x0oDuZ4PMa73vQa/L2/+SG884lXY37XHNbWN/Dj//tv4B/99K/ij77w51hc7p4BiMck9DPvk+jg+X3jMa83G4YQPQB3l1fwyOkTeP0jZzB0ZYPcM78LtxaX8AefewrrG5vdWFg/bkThbA/xyyt2axsbEABve90jOHpwXz9SN/jgaDESwWQyxq987NM2HgE0tNBSOG0v4CgQeXV9mS63kUEIBHryAnGCrPXIwGHzWhqnHWQYuYeQIWpHpf4oXSN7UxocnS2lqgauxiHKCssQwlgEiELG5AqSVEvZdF5FBO/92tfjn/7of4i3vu5hzEzGOHfxCv76f/MT+B/+5a/i2QuX62QZxm9mIEwCTcleVmwUOTfWsoRKVV83F5fw23/8JDY2Nl1PZHit/H1mMsYTjz+I17zqFIoNRN+QQ5rGMoiOV1f2J196Fl+sm3YAkFe7hvjQ8jc+9iBe//Dp2Fd1SN8DIH0ofYoC5iQ8lCzSdjIYb9Q3G5ECRTU8yXRzJLoPGbrdKeqjgDbkROz1KzaprQwURnBzktpex5Jva1gtyowOkHlfbeOfKrwvgypqdD92zc3gO979Vvzc3/9hPHjyKO6trOEjH/s0PvQj/xi/+rFPY/neGsmWFElXVE5kqUKVjkYiRUZAI1FEsLm5hecuXMFzFy83c3aWiw3zsbMn8dqHTlekSvw0ZXAdaYqlBrC0vILf/8xTuHnnblhezZty/Ju/H9q3B9/wltdAB9PtncBCUdB4SuNZ1eSpcd/gt5PB9evgU8wAsy6inkr45/5kmACIa7jEiwrjWxGFwlREb8tRMwFKR3wZTMOgp02dQxMi2hvVuF3XbynAvj3z+K73fh3+qx/8IObnZnHlxm38/G/8If6X/+u3cfHqDeN9POqOJkzG3eOak/EY4/GoLsN2uXu33NgtgWo/o9Goe/HtwFXQPSnH8uvjoVtbW9jcKhiPRrh8/TYeO3sy1At0Urp2YGEPHjlzArvn57B0T8866QA0+BHSjemumFF96ovP4Pqtuzi8f6Fp+EPzChHB3vldePOrH8LMZIL1jQ0aLR8HUSQ2oIJH99bR9/BiJq2/vQyhndlFcWMPqRrJYt1XMJOyowyTYny62ZX6r62oaDoEn0DGJyFooAw0+4jo3qoi6e6yKyWTnZ1MsGtuBrvmZrF71yzm52axZ34O73zi1fjBD34zjh3ch43NLZx76Squ3LyNb3r7GzA7M8FkPMbszAQzkzFmZ2YwOzPB7GSM2dlJfVPeDEYjsTdkTMYjTCZjzTgxmYx7b9Hja6tOnu33VsH65ga2tgo2N7ewvrGJPfNzOHPiSGiXI0SeXAPAQ6eO4uC+vVhaXonoVyNj0+BCPVfgsy9ewsUrN/DY2ZO2Q5+voZO94/HIHmd97uIVQ0YDsVb/wSR4nlj/oWHubHlnGQBa+HCD4Y5C8HR6zKz2v70Mky73klCpJGq9yAdaK2YlBFmkn03UupPxCAt75nFg7x7s2zuP/Xt3Y2FP97lvzzz27ZnH3t27sGd+zl73ODc7g12z7hgPnjyKIwcW0G1uCV7zqlN4/MPfgcl4hJnJGOPxuHmmJ//mlZ+h3duh7zu1B/pG3/qdaZ062r3QLM5X4AgYUBgIA6RXrbu+voEnnzmPb3jzazAj48DXTvoQERw5sICHTx/HcxevOGhrBlnISFPKqRhnLKUjDMb2fciAQk5F9VwGW96h/rq2eYVrJxnCu125P95BbPHrIlGgK4CMBAu7d+HowX04dmgfjh06gOOH9uHoof04dnAfjhxYwMKe+e6dprMzmJvp3ms6OzOpr3Lsvs/MjDEzHlsas90xivFohAMLezB0DR20Yzr3m1e3aA0ZfMv4duJHRHDk4D7bQ2nyjLih6WkDaEgU5ASfe/p5bGxuYnam9yrfkCJlOUUEBxb24Mzxw1o5ZiqBExobA0vSQwDNjsmYZWwvg4T9IOWZ+xX2t65cv+f5xjYymIaMUK0UcjGdfUvX7cxkjGOH9uPsySM4c/wwzhw/3IXWE0dw/PB+7J3fFXL1yXhk38fjLjffbhmwtYmVr53u57o7bYy9EuTfbud5J4dp8Z7bHNi7G7tmZ2LIFgdTJwRHYwBsX/4cQcFTz18M850hPlrLrwcW9uDsySOYjEfY2ip2HCd1FxjrltSLPwNjgsL3j1KavJMMMWPRJf8IC6kTZoj4gftVrirARFOODqkdoXfNzuDgwh686oGjeNWp43jo1FGcPXkED548ipNHDmB2ZrJjemDKafweyltNrFSWDa6F6kOhP/++n4gx9LvVT67XcpydUjFuNzc7g8lkHEMz3JACbUF6ETN8wGvRs+cvY70eWmxFhBa46L3JeITv//b34G2vfwTnLl7F8y9dxbMXLuH8pWu4dWepeyv5+gbW1jewsraONe2ndq5THmXGncF5vR8ZisntfuTpkf8IizrUj0WpMC+gtL/Wn7z3a1+PwwcWcPrYITxw7BBOHz+M08cP48yJwzi0b29zgIcMaicDZlpDAzB0DQ3ekLFu53D3K8PQvfuJYENXlqNlmDOTMcZSJ/T1nJUvcCQ+C1kD2Dbc2lbW1nDt1iIOH1gIfOwEQnodObgP7z74Onzjm11nW6Xg9t1lXLxyAy9euo4XL1/H8xev4MKV67h5ZwmLy/ewuLSCxaV7uL20jJXV9ZiGsCnehwy9NKtQWp9DS/3p8QT0ehvNl2DpE+VWmPzLv/dD3RsmtjFgWPv2IO5kfFw+ZEhDqy9D9bcb0KE5wU5OkXloyTfE63ZX5qulKy7b2NzqTr3aDDClSiHWx5vOSuT38o3bvec1WjLsFN31Govg0L69OLRvL97wyBmru7VVcGtxCZeu38Kla7fw8rWb3buqbtzGtZuLuHbrDq7dWsSVG3dwa3HJeb0PGcJNjTYmg6dDfTpULgQuWk4OMhlyhmzA2Ui3SxWyoltovNPKzv2kTPy7xfeQwfHvITocaTLPuT7T2e7aLr1kvtbWN7rddYsC6AGqcOznJVjli8cBwG0zvj4/2+k51891sq7HY8HhAws4tH+vHVsppWB1bR3Xb9/F9VuLuH57EVdvLnbOcuk6Xrx8DRcud1Hm9t17KOk9UaYCRf0QZDr5exHT6qR5Rj6EahGo+02T6riTOZT7Dxla/p7bDA3CTpEgXztFnJ2Q/H6ixJCxb5d3D0XS3H/upyX30soq1jf0xWce6v1JM4I10wenVH2ad5b8LFfms+Xo243vTo6Uo7RINy964NghnDp60O5tbG7hztIy7ty91z2huHQPL1+7iaeefwlPnbuIr7zwEs6/fA0ra+uqxdq2ZjthbtAV6n7FUHbmtl9Ijx59zCGyIQylLa9kPrFT6tNCmFZakem26AwNTL7WNzaxurqOLRSs1ZcQbxVgeWWVHs6J1+bmFpZXVu0FZXyNRLB71xzinpdgftcsxqPuZQRzsxOMR6NtUVd5L6VLOe6trvOow/JnLrMg4cuc/gwwrK6ge0IwZwCtyf0QKA6loUPtW/1wO5FuM/Tw/oWwi765tYWVtXWsrq5jZW0dtxeX8PT5S3jymRfwmS8/h89+5XncvH3X9VGq3CSrRQX2HNJHbVGZqf/UexNmcMgpwlDvEAVy9FCF6Juvu2MNW9jcLPZ9a6vQvYLNzU0srazi7vIKFpdXcHf5Hu4ur2Dp3hqWV1Zwt74BY3llFYtLK1heXcPK6hpW19a7z/UN3Ftdw8raOlZWut8ra+sum2UXldeMIr3ftLTBk7lUv0mP2s7vmsVkNMbs7BhzM91G4/zcbPcsxPwc5ma6TcfFpXv2x05aaI8ez5w4138KgkHkB4XuN7L+Rept157LWvUm4zH2zncvcgCAB44dwuseOYPveu/bAHSAdv7SVXzmy+fwmafO4bNPncOFyzewvLJqY94d8c/gwU6Zogrtm0xaqZFeGUXyvdW1dayub/jn6jpW17ult7X1DaxtbGJtfR13l1dwa3EZt+8u487dZQuPd5bv4e6SGz1/bm2RAMq45s4BHXv6jsbYMW88c4g1JwbiI4hu4XD06crtfUC1mr331vLY6E0FWr/g3spaJ8Ny7MYndeg7F8d/Bh8ba9YNqQwsn+DQ/r1h7IZSvu0i8P2mta1rp1Rzp371+8xkjEdOn8DDDxzHd3/zOwAAl67dwpPPvIAvPHMeXzp3ERcuX8eNO3dx4/Zd3LyzhI3NzToOPMaw77bJzCkTMwDA0Hfp3gru3lvB0vIqFu+tVKRexfK9FdxZ6nK/29XIby8u1+W2zqiXlleweG8Fm5tbPmBsc8aYl9mkyX5zxAG6P3hIdbINBroRxYUJ50STjVnrJf+wolq31MHqoXX4Y45RyDDuLd4tndWIFKMTy6CH7F1ZtW9dfyE8OFLTEga2oblgjvhL91bx9PmXsbK6hoXd81jYM4+F3buwZ/cuzG2zHzVEL/c31G4oTcsynDhyACeOHMD73/EENje3cPXWHTz74mU88+LLePr5l3H+Ujdpv3DlBq7fWrTXiZpy1OhKweSzT53D9epJN+/cxc3FJdxedBS/W52gS1/umUOsrK13qwFZmIH0w+zNxq4OaEn12AgEvmFDuZ6kNi1lRi0C8SQtaqiMWB6QGoD9DTuzs2TN4s3cv1iQyhchUFz37vjKewymAlCfLRlQ+uCgOk3R7uihfT3D3W7Sz2WXrt/C//x/fhRfevYCFupZM3WKfXt248C+PTi4sAeH9u/FwYU9OLCwBwf3dZ+75+fCqeGhifzQ2LXmotvJMB6PcOLwARw/tB/vetOrsbm5hSs3buPFuor1wstX8ecvXsKXn7uIZy9c7pZ+TX+CyQ//d//C/tLNvfqp+TYPtCNkh0T6+J7eMsbyoLKP5IHrlZkaYsoAOOrGao6CLW2qEYUUq58aSeYF0ab8KIsbrw0OSq0X4d6QjOmaw0lMA82xHFQiiwMymLMR6706wMzMGPvTXzxqrSYNIfTS8gqev3gVTz79gvdUnXMyHmHXXHcKeb6eRub/9y/sxqmjB3HqyEGcOHIAJ+3zQO8PUjJvOaLcT5rXkmE8HlkE+bo3PIq19Q3cvHMXV27cweUbt/HM+ZdtLvLshcuYPPn0+QoqES+FJhqsbQ/UA2icr6YhDhhwrd+etLJzUH1Btt50T9Rja5nE+4AjLzt+M5WRHhk6t+nshkFRRJfEm2rX+ZZ+h7FtUwaNSBkwvO6pIwftDeHefXsPpHUtr3ZAaWouzuL6xiY2Nldwd2nF+SHHH4lgRg9wTsbd90l3LP/owX148NRRnD1+GKdPHMHZekLiwZNH7WhQyzH+IjJo+cxkjOOHD+DYof14A87gG978GnzP+9+BpXuruHTtFiaWtRRf1iuaUpQSUmyzaRo3ixfxjQAAIABJREFU71+Nygv9XU3dZy9MQvrGT8yHteLmKwp3+E5lsW8dWDVSlbm7achPRmVSGkk3ZJ/z9j02/LkAVh3pUtMj1UXvD8WYWFkGvYEAGGYcteDxV53CZNx/tqO1qtjSv6bJlhGwzhKPqGOKKsNWKd0S6upaL+159sJl/NEXnrG6CgqTyRhnTxzBI6eP49EzJ/Dw6eN49MxxPHjyKHbNzWCmOpR+smxDMgztr8zNTDA3sxeH9y/gzPHDvA/hw6UpgaOYvu5ePCcWGuyA0LTioYxIiio0mPkYeXA2TT9UYSW+/a0fDkwYqstpkW9u6byaJ54aJ01hltZ4WtRLZdBfXRKbF7B+SvdG9KpPm2/xokFI/2pqWus3ZTD+NToUVyPx/+jZE/aOqE6N2+8xuRq7OjcXl2xjzzfElUYfkX2cq/6IH6kIIDRG2NLHhQXAFja3NvH0Cy/hmfMvB3DTP3559sSR7v962vqBY4ewsHsX9u7unqNZ2L3L5i7ZCXu8JmeZqFYLGaYasw1HUlJPeRzdG5Mlcy6ztr4K2dFyHX43kRmxstukh16EsJSHw1pehrNopmmImGN2/HF/Ka3hUFHUiI35Ss9cpt9ceTbStX6cwPVkCBFWn39nLy8Fr37wFMbj+Cqa7XLzXH7j9l3cvrvkPChYBVBh4ycZlB8FsBBd718GQLC+sYnnLlzBuQuXHagAzM7O4NSRg3jgeHc49czxwzh19CCOHNiHowcXcGj/Ag7v34uD+/ZgZuILq61oUh8hFe8X1WvTpI/MJCC8DyAqAlBZVjIQF0oyUhWvFCavEIQcnD8ZsVqeoQZV+cvOwOgfUyyE9NBQO0dEUq5oH50lxzQP6PUddAJSNB3ayc+79+ZiQn1TlFaNz++aw+MPntw2rWhdOi4ra+u4dvMOVtc2+ilzYMdcnXQKFNPBMA7tJEPIOtCvs7a+gedfvornX75qdMajMQ7u24Pjhw/4w2oH9+P4kf04deQQTh/vjpEcP3QAc7MTk3li3kwdSOjUPwoLY4ZIvGsYNAOXlB5FZfqKSuxLHdTuFQRn6oFrdlCl0vqbTyxrcEgtQ7U976WHotUwLZ6K85nCSCMKKaBWtA7zGO3H+Q7LvT0ZAjsIY1kN6aEHjuHYwf1RL9I/umGt0qT17vIKrty8XfvhQdcP5c15YmDK0QJZl1GlTRkskS1qh93SewAp00X3ZWNzE9dudidrVW+j0Qi75+ewf+9uHFjYg/17d+PIgQWcPXkEj545gUdPH69HN2wuQGGPeLI0kW+kCvZ8h6ZalvoV30vQ6lVAdbyewRUKoyyvAi2ykXaV2oZbP4lWnuOE+QKK/ZGOkMax7HWAt412zAN8sAvUAIs7otJj5wwRYhsZQiqm95yH1z18Gvv2ztvYMK/6PadSnFLdubuMl6/dAlmJzeNEFBTY6RNiAvwn/XrgYExvI4MEA9CU3pSCuACCIGv9AaBgq2xhcanbU7tw5UaVoXs4TpeM4zPV2RmQjc64rUZCp1YDotZ0B2nFhgzaBpel0ElWcoYeyjIyVT7CODDZzL6RJDQ2unEeI6Ts3nPMmuYY+qV7WqQ71tQHavRsmga16e3FJBkUrNwx1WDqmIjgTa9+VXjeRctb3/U3G+O124v1XJXza9mgHaWmsbRI4M7cS69NgJ1lcAQA+I9RMr2wqNGjp/XiONgq9VaXFq6sreNmWcKIw154k0bgGjUXFEsVAvRph6XUkJiE5xDISjOBnI4oP6VUbWkOqf3U8nqv1N/FQlm9Vw0qDgClAyA0Np7Y+Ao8/LszGB/VEGIGlp2mgP4IQmBD38xnLBYVraYIhbQ/IEP3J6cQh8LsouDE4f143cOneyd0+eLUKciH7tU6V2/ewYXL16uhueydVorx7gAAu6O+oiXGG/3NkZ1kIHRKWy26vFtl6NVzeyk6DvchQ91VVxOnQWclATaw+pC4MmNOot8buaLPEYQEd8P1e0KoLoGegTD3UcO8fap35TlLQq+Od17ZoI+MdMYLyUQ278unhFSEdIaeJqeSc7nMF2s7IT2UbWSIcyR40K2g8vpHzuDsiSPB6PkzO0JO91bX1vDn5y9heWUt8FwbOI6Tgau+LA1Vsya9iYKnYEcZHAi7fhyvGHw8TbdxKWruyrfclwyjbgGDI4GPmr2WEoCuiXsa43Qtn/bKwTGYuKK2GnKeKJozEt8qtAeGiLqwNmmtWX8T6quCmNXCfLJsJX3PUQIl0kcXS7r77DgUzYo6COuF+lGnKj6UQzJwxDBIq2M/Ho3w+kfO4IFjB3tzB54zdF1K7zcA3L23iiefOe86rvKajYS3DSONmY5H3jOpsguB6oAMzIuNS0nlqjLWN4GqgeJ9yjBSm+zstASCYvHHOQlKC06hCqgEegPcFzbMNANbEo3EtFWIL1eQKrK1ps65KAGYGwlo0w1sfL3OrUOPqr5ZFmTIjlkVapNpLSM8UHWYM9HNIRmCxsRrlFJw7NB+vPGxs9i9a8544bEbWnplvheX7+GzT51ToaCbs6IvJO4hI+tL+wqwHe8FC+7LwEBFOG1dsBshfDd0DWB/PzKMNH2IhsaRwRGkQ6fIhpNyoQhM/R55LTNoTQWInVJZL73Sf4oZd3/+k5XkCMhRSRIPbiDMs94X+BvJGaEdnXQ+FBYjWBbhMSKAqOXRzolGSwYCKuekq/PomeN486tfZfc4Slj9bdKnrVJw7sIVPP/yVWjEEusXidHsFGbZSYZk0UpvQAZWgdC/+pXLSt/oEhjfnwwj3fSye+YAyl004LhrG3M65UztpKdwZYQHgCa+xYRoISz7ixpDXU9H6Rl7aJ+912RTfTkDOvkrlrbQmJXSTcqonoV+7iOMuVhbcyiWQ+tlmxr6TTJYpAECIMzNTPDE4w/ikdPHuxoS9x2Gdqf52trcwv/zx1+sf0qg81Y7cSDxyEaMcmzcpV0HBXa0fkAGjRLBFgqXw8a+k5H74zZSJ9L3J8Oo71geHYrob2ebJzMhVqTQUNKIsjN2dkSQKkQ3h/JqcGZnGkprOxFaopN68KJQtAiwS3k8Iz9ttNhGm8lEBwy1L6nRlK0z0dNVJCsLwOK89TKkHDW3kcEnri5DQcGBfXvwxOOvsjebuyo8wuT9hlxvZX0dv/XJz9NUJxp3S5zed5FoBZwCivPQkkGjhPPmNhjmPgE8HRQ1awDwimRovA9ald8NqJhnwTw2CFzHXcObejCnWb77KrVuRHNLXSoRS8tq9GDlQLIh8P/Urw52I5e39EXbG7k+X4Y2lfcQDXj+o11pWsS5USGabCKFNuGgEV5hhhxqQAaPqDwsgl2zMzha/9jk0NWaO7CTfOXcS/jzF18OVuOGmHRkTgYDJaXpsrFTe9mQDA2O3cisM71D9etYFbWzBEY7yWB/MIUn1DpGPJnjXNcGw8KPh0pbPXIOXEadsErrnt9XRDD5ya5cERLpsQ6rI/TSAmOthL6lkHzGlxhdtmveuOtM1vkUU35yRFdjdCKw/ORo2k/LMEiGgMYqcyXFfzUor8pxCtU8RiGCj/zen0Q/DIMARCOOiY+rUdwUeqkI7VU0ZGhdeQUxsGagLL3br0SGkZWXdAISDrxxvZfpO1KHkEsiY6B+MAAzbPZ0CQ5QkhCc92uY8s0Zdkrqk1Mc66c4X3n+QXOVbqC8vKA6EvHgrGj/VYNFzSTqI8ggAgjJEAx5exks1aqGvryyiguXrweDbx3VyJc6yp2le/joJ58kXfAYlF676Nhtc+63kmBNWYZ+OzpuYv+ShTVwKGQa9ynDKDqdo5c1LLRuS/870LJxpb7UUFoCcghlCNbONVJomiWRv4jilIsTHVeEuG2bWG5YXa3YOGaHHj2JYp0fOw+O6dkRAAnL0nVWZOlF1bOlQsXlM3p9GfhytQhuLS7js1953l883EgZWt9VJ3/4uadw8coNQ3WXAT5WKkO+xO+GYjLY3j5SQwaOOmHH2r51+jENWpVC9eQVy2DPf/v5cw11aoidUYqktImEN2nqvSAYTeRcWFQDSKMr8HydL4l1TAP0PcwrOBJWxzOHIhkrzHtwqgJ6qKdIo/dMhg7hnFXqm+ZMHRkfUO1HFxCcx1q3+KKFB7m2DNpvTs83NjfxR194Bn/wuafQsj1OmfLkenF5BT/9qx/r/mqr+jrLZ18jwvPVO8JiHaso+V5fBgYDyVEnoHzUFTuT9fkKZBgZmqoxJvTUfwutAESiXtUnwVSFo0PKAdWDC71tTm1fJ6i8fEaEGtGifrYmxMEoCGaF6CbZObQ627QCp/WtTuQvKj/zpewK0VKemE7sqykDUopRZXjq3EX81Ec+hqfPv2TzCb56x2oALC7dwz/7xd/CJ598uvtbEAQ6wbEkF3AGEE/SBq4TYDGWt2Swytl/xP4Z6EPi71cgw3ju7BM/1t2n80AV+UQiU+YenNL0+CRm4IOsyBqX2pQiRQXhk6USaRppUlKOEgES4pKpt1UZ6F79HlbG7N1KXl+q4/vEnzYFqV4XfMT4cLlMUTZgvCKl49T5Ox+xaMhg6gjZOHT179zFy7h+6y5OHD6AE4cPhEcqQeOxtVXw4uXr+Jlf+zh+6iO/i6s3F+l+jEw2NpR26DKzL4EXlMaL29xRLOjtKEOI9hGnK510ZF0i5r9SGcazZ77mx/pr1dy3H+y29WEVrpTGA/GBnY6eEfBjEkrRjJEQ0pboLO/mdiQQnEzPadjgA8oQErvlwVMdgwSiVT+qLIEXNQIy1vhXacjZrJ4DgsoaJsCge8RRTwaI69SONzt4bdVI8eVzF7C4dA+j0cj+Xp+I4O69FTx74TI++qnP43/95d/BL370E7h6azH0SaLqiBILOn7phLMIgVwETVUJO8p2MnTqKaCz5M6bDjnpN/wRxb+ADLLwrg97QsBGWb0cTKzhgUrYdwzj3TAlKOyd3ie5I8AGC/+Zy7O9Oy1xmNX6itq9VAvu1MWNLm8Y2Z+BSnriyNHRQd0EUjrMIzOK/n0g9k31WGCWwV72RlWHVpD2zM/h8bMncfLoQezdvQsjEaysruPyjdt49sIlXLlxp9emf20jA3xsG2xvQ/H+ZeiXF4sSodP/DzLI3nd+uKiXSB1U1DdGlAB12hrJ4xInNPi8fNsa5DD5MsPYRjI2Hq5nhtTx7nU9tjUjQsdE/MlDqjQkaa034jB0i/WobYg4mR929pL6ENdLkkEdQuc7OSVxMoXK+3W0Jt/PV8xWdrK+lNtoi+2caEpkGFlupWlHcYOgPUc73h2ioKKh/rQJTFemO5F9VIbdDzwJyFWJtADdiweKl1taBfhEzstMHvZeyzOJX7oHDcPMl0j8ZJGL0mT5WVYSoNemhE/7rsZRx8L7a8hQYH7CV4g6SrPq24/hlNAmIC031fo5khePlP25qZ9gsPZ+M2DAtMkw8omvHpKDDXLRmrpJVo2Ppedfzc0ejgAmfcmVTPpS0spwANtOk72d10Y603O0nObAfMD5FpWpVLm9n6T6rp7ZqCSbTyPCY2RdOWgoRZ9DSKg7JIMBSolyMbfS6y8QNB5baYeBQ3b02rxPsy9fhPmke2DqZBjxLrReBsRkKLb2zl6llWu4S1YDMy77qZBejUDblu6en4Hi5Vak3JEmm9oWzpMhSCmk26wMktl4pwHIiK4R0groJvGpfYRJWzXkjAHB2EkOu6cyWJ0hGTTi1YhjAKfNIkgVe0CJ+2s4oMneL7dzVsKVUkMCwG54lS9ptJkeGUZsEJwkOappaNF2FHREU4xangcZtggXmcroUBt4OJS+MwbQJXr9oARdzXHspTZkfeG4MDHnswodPKGoRo4Z2vltllezMgMP/nSJ4Gd6lQ5HnWEZQscqe/Rm78VSXpalYZyBZAk+b+lLzzG5OUeHsIAe09Te9dWXYeRnxfkWD5yGiwpQtLKRiTVkIwGDVPETMA/vpV0kt+bO2UEs3DZ5qM5BYbYAPqGvCgtTBNa19dWgX2K7JArUyTsHJxoc4fS3tHZ+yaMaMiRm0DcMbePR0wWjZrnPHg2B60iavbeb+zh7BNeigcjyVZZhZA+sFH3YBoij7J5qUSI7bzBOQuA8H9D7QgNdKqImA++jKDlWsX+cRc35M09UZkvDAHTDplRjj7vBjGaxr4D0pCc+qOe1SVEqbuCTz4glkChVfyZbX4augA2E+eFrCJGBlkeHVJNoOLj7KYPW5e3FPvI5OeHUaIpkGHnK45MSe7WistUwlmFeXSjJqFeYeYpKkuvAkbkVEUH3+Xcjj7TDd+A0TPpNaorCq1D+qXGTdqR77Hjfvoxod8mQpXv3VJXR9J9407+/YWnZgAz9yUk9n9TjcOjqt2+BMHcZVvu4ZYoCnnXwuDjie/n0yDDqA3E9xcnHFhCF5By+F/okO2U/n4uM0m8yRvfkUgMJG6pGssw59VfpSeXRAbh4XU4srZl7oL7KxCrxKww5eBAa5eClSO+beCpWmjAnvgy9tpEhCE6A1Vt14+jDbVmJQY4h2soPDRIvRgyUc8rUzJSmSIZRH+z0aAZ15GEkZkvFQ2F4loIdJYeuxHDmW5m3rEpXn8jTSpH4FpcqVLcCRsqx5ckqAuX84Z2p6njGAB/LVnqUd3LkEpATikVXIceMO9qdcxdqVitFvgzBhmXwts5PSaPfpSY0jmGyxGQUcDxy+x9q6WTyY+muBj8bSYsCzqzrhXL4/sR6emQYmYOQcbgxeJ+F7nX0S2SG0qSAZBziszNoWLRQSwZKUOu5XnRKdx4xJdxXmK20+6dMnV+jwxGnR7w4+oQFCHJKks9JSjLqjo+SdToIpwj6ccJVV4F4HqcGzYygzcsxW6uKeGkvPa5tnKw7gW7YlimUYWQHs2gC2f0U9+aS7EGSddSfnkrRKc2wkqRtiyPngMfb7jN5dukZJykqfzJaqYeR43j+LlE7pCyWU11TyztkUf4k6YT4VDpCO8wZxer9cO4/TnDaMqSXSLcdKJup81hCUTYV7TLS7J89S22SVca6hh4QpKM2UyLDyCaAhGoWtdWrq12bQwf6bipuk25kVp3bNKJFXCHKB9zo1CyovvZTFRnStJQLFnpE1pd2OsH07SIWqUhxhctKFD7jYWG+VGm1rPmcQP5kUGmBYJaBnN9eJbrttSOEwgBAuwkAwydw+238+1A/UlNaspYpk2Hkh+L8hqgRBEsmYyCn6qVHhraApjO9E7mZDzVgRszIpwkTbrBuOWRzNeMnnpnnpT6xRhLaSFVeId2oE0qgDQpWZPQilrPynxf2JUcKa9SnpU4ZNLIM9V7J/ISmTMRXu3rPtKkzcmBlfhpPrTUW1Y1YbyndWGg4/BTJMPLB6AtnL/yundFH/eFOwKsoXWrug2pr6dxLBhKOFDm8VAYcgVUa1l5sZ4oxhvt89jqngGPyAQYYPhBRJ+Gqssq2ilM3pHmDReS4gBDbJhn0HqWhyp8al+MJuWvpq98E1ZdahzRDAv+2QdpUAFwGSXQk6WMKZRjp5JiXVwv8vKt2K/U/fdS01MGueKhD2+vb1u7tVjXk4J1uhsW15cZS21jgaOSEdLPjtyrY5kDk9IUjmTmR9+yrSTFSeSxhmYLXeuWKhj6YfVm7moYgDQOjgW3JoHpJ9UX7MwNk+FWLK15U25q5FWpnLQaiQSvnb1atvAY1TZ8Mo0Lhmu+pA9dxJaE0lVD6tOWkS4QmLLsMG664ExYVg+rzfEJpVdpstqGNKcLr2nKfVa/OXVxn1jfDjdCufTEx3cs5pbPoxQ5Z6VOaVFjvjBxAGqZ+2aAMpIP4PfEY6jAd5bPEtnQ7PNuMHZ43UBwhWqEmp8VgutMjg0WIGF7IK9A9UdYZCB/m00+NHYnxEn92/JPVUUrTY01XXRKtojQkF6KBVKLg4yRKHqwSx8eBpy4jFopwDf3QIMRxrjOErCceRIoUEgioCsQdcxsZ+srrX1E1HImpr9C5ddQzSl15LLbMLNZHWrk2WmysDgzTKcNI/+Qup0w6kewMxjfqWnwra4yiKm+Qga2D6hjzbNQhIhWrFx80UufSB4eIweI0CURq18X7yqgf9eMRxin0v/NtUn4+PCbWJ0dJoZsS6Vk72UaGoCzXRY7oTJPz8HzFAauglG7yCqAxMXRUolMwPxseMMHITo8MI5vsMnBXBpSvYuV0GK3S7wZJHOXcfvu6oY6CcZtxZqOQpAmmp07AkYQjG9NmRxOqJ+keOUtuG8INaZ1lCJEqy0eOkHQReSR+cvssQy+0UIqoPGT1bYfG2yI1Oy+SQQ01vI/Op0yGkWJZv/9quGZjxFhGf/7FyMWD3HuegNux0NnbqNRWsTrjCs8dIJXB67mjMZ/Jbf11GgiC6rJrP1eMUSkpe7i/ThqnqW29fS8dHpLBFNO/WnPdXv/tW7X9tgR27OM+mnsfUyTDyHKtXkbgnuqhWqB/UcgdO4U3wF5UYHMPEQtzQ0YeURscluBHLPiVNAiRgXcTzJmFf+lddRzqmxkr4C2K+qFPfUGzgEQXJkNRGYJeOCrRfaNSXJdofbZl4J+hot7OixP5fhaiAPpXfuIDPdSwRSxfZaDcbqd7UyTDyGy6xNwtrrnX/9TwhDNkQi/O7UTHPjtCsf6sNqFlYcfQlIjyQDu3xDKaE6V0g/rxA2POo5FgpUt9eo11ojYYDLfYBqbzofG2epVFLD7Z2v3T26dQApbfOgAMyWBOJ6y3TgZzzPqdj9X4+LWBkN+20t9ENCEgZAeFv4S5l/atPbolCwPHlMgwKsoYI3fp0LeYkVUjpLxfghYQDCdczC8bgCElQruwEgX+SuWFfppOVdHqSPpViAePKODfgEU+fe5bakTU5xFC+0pc9zNURYVDS0CvtMMQutd1LBu9yqIbzaAMKndWeon9BTMIE1KKioUYsy7UuTMltgPlk7CWh88c3HvMupgmGUZ+uyJxPezn3ldXmUKaZDxUBdCsXbysJwl5Ru+YRagXVKYe2peJwkQ8KdtwVCYn+koT7Y6MMfNrRdnT4Ue9A9s+QMZXdv4knySerYwHtSGDB2d3mn5dQmNKN4kSySD1e0VPbpuNtuHh0rvHqzmpPYHCNMlgDwj5J0UGSlWK9B6D91QmpFDJc5MCwmSyxHuxjMOnCuk04+50oseRzOYR3taOzRty1MhgPBYbmJzvhoUndQApoW04tsL8soxGW0zXxlKhz21kMI9VGYTq9v3X9BjvV4sUP30A8Pur3LRMa73VNuILfKuPLv5cQyyfFhlGvPrJ3sfnZYxudtzgbKkD4QpKx+nzA0XZd1TwwDS/GS/xF5mk7/l+YtvzTD3OrTx2zm/pSuWHWGPBPatUvjj9IX55/AokGjojo0YmH/tBGQIjVq30avicqCGDkabTvazf1C/z3Z8gS39MVTai1V4B+urLMLIxyGHdEnTUQXdDgTLFzpRzn9IoS6L3lki9IUkJNxJNnZJGQtwytovfKxF19DxVNGydJHuIVbRnRYfgxtHABYFOyp2Os6X0uG+xl8RRbLUIUoZlYGUG3fWPOEt2cKptB90kPeSTwJEswnTROgLhiyA+pp7uiP0OIz0lMtgjpIbY8AeEzNtoMHSVKfiOcafeGG/oIb2wgSYShGsHCY0KVb3CivKcQkTSyV49d099atBUxw/KLvXV9d0cysqMx65zRhxhGXJqkMjXaG68ijk1Db7mWNRID1cOykBlgDuu/1Fyr6JL4FRUAaAkGUrQLe/1BJtlYGrEq3gpcjIM9g/0TYMM9gipnbMvjq0a/jWtKghtA7Phh9lrCfeLMaJIR+FTktIs0hUimw2PQhQz6CxQqKTwSeVhqY8iRH5bnK5tW58JvdzAC2zDwuErKqm4bv25AR0hqPK6n7r61ZIh9A2jSSHVVNOEHU7vlI7Ee3xwktmIz4oM6QI12+WTywJ7g+MUymCvoTE1K2IHhE+MS/qtdRJzIapYLTfEsJipEhsaI7ZNAJqYolyfBKayMHD0vSPbNzSxZdgqYxhEOsKiiOad+sA7tQbfJTp5SAPEfIrl78tQNSTOQRSD9F5S1NK6xI85KYFBCfe3RUIirpNnH/+Ox5gu8inUaZFhxMQ19+sMVKB5NvtrHo+wmx0koe9sq5xLsiezzWRbEnVEQkvVhgDIzmAhqdTB6fkq7Ub7SlmIOGTc4diKtlH0Vk9uIYiSUx4LfWeaNrJebH1W5lsyeF+esxu4qPxA1HUoZ3oMZE48qCQgZ+038xNcodIiHmMqGQFqGmTo/iwvR3Nul4zfUL0o02R42og0YdEfjUuRlzqwsJmUYZs7ahw0qdZjHbbbXNMeT8NKz4Yg8F3mzJykMnW60hdEeOhLqm8RINNpKUM7zn3D+m7JED5hovedJl09FhppGBPnf6O1Zrqe2DR5HWJsimQILyrrP93mZHSeoTN1oxzy/xIZY2NiSRh586AnZ9Bowmv25oyDSkhtmB/ro708GAT2H1BnD8c8ihoB/F4ICyURtUbkyH1c8T5y2yjD4HPLqPdS1OKoblPbUs+ahXrOEO/0lsRPUVswFbgd9PdvSuRtSmWoq0zFBTLmnctufGvn1ZBtkqROot89QfQ5hKU0HkGMSY6tnJ9ZyiJ2G7kPXaWy1aoS2+g/hfowRdO8g/0k1XVeSKYc9gt9N5kI6tgvRcm5XJZB1XZCegi+lWTwP+rooqsMAoqkBeDHWXn+pqPJRqlvLCygKEg8VyKw6Sq/OKDqy1fk9GEp51X0r7IKpk6GLkLwhM5GoO5MGxp6CtQL/SL2F4aCZOAyuLcWmCFH1CZn7IVMMcDtbepYm7RRJCkKFFcQs1qYT5atpO8MGLWwt8gAikzipS67OgjrhfpRpyo+lEMycEg1SDNAYSCKffC6u7DDa101ahfZjbvQbnA+0h/GTMdDghq6evVeAI/pkGGkNlk4nDCK2US2BEYYGYOQ2lFvgPvCxnSL2ZJoJKatQny5glSRfpCM6Tn8EIBZvW5DzGu68fU6tw49qtI0ejibAAAPLklEQVT+QfDDvIMrMNQ0LXcy5AzT0zy/OSRD0Jh4DU8DyNCC3qMJ9mWEj40LBd1dF15MCDSYlvIVYDveCxY8HTKMNH2IhsaRAfATl36aKXUdhCIw9XvktcygNRUXXg3fynrplf5TzLjz/KevJNrhpKgkiQd3KOZZ7wt8+ZUR2tFJKs/hUBvLIjxGBBC1PNo50WjJQEDlnOhmoTcXMC1mV0gdSXsByLq+xPpFYjQ7hVl2kiFZtHU+PTJ0f1IrhTXfnVWi3oHmdYqvDvYuoNoJb7xZKlQAn+gQc6a/Tml9hGV/UWPQlx+UnrH3DtPxp8mm+nIGdJKnR1SMpPItJdSz0M99hDEXa2sOxXJovWxTQ79JBos0QAAERdigx8LlML0BCmJO2NsI/A/q0MqdDK3zR73HozmI5Xr6YMpkGPUdi3aJRX872zyZCbEihYZwvoi7ELUjglQhutoX3Vex1bsLtQtb9lIP6RWKFgF2KY9n5KfX3GuUFJOJHtjRvgSIRy369ApbuUaXrAxNMStwhvmcxHotGeLhNTYqOhIjzqeQXlVvvDmGql9ewYl/W8+qNMXpfZd0XolTQB3zKZNhxALYLYV4MxBJ+S0JXMddw5t6MKdZth1fnUaIceXTVyHicprWZweJSuT/qV9Fg0YuXz3b2xu5Pl+GNpX3EA14/qNdaVqk8hqPGeKVXy8S4is41IAMBgzEei9t0DKhe0Qvr7roWFv6HCavaohJRzofs4ip5ArJJj3WzGGmSIaRFuQDUCV0VEKua4Nh4cdDpa0eOQcuo05YpXXP79uJSL1HduWKkEiPdVgdoXcS01groW8pJJ/xJUaX7Zp3rTuTdT7FlJ8c0dUYnQgsPzma9tMyDJIhoLHK3G9RVcLEEzQaoEnvdk8IBgMrjomPq5F2gXupSAkp0rTIMLJyerO0phyKUXG9l+k7UodlMBIZA/WDAZhhs6dLcICShOC8X8OUP3zCTkl9copj/RTnK88/aK7SDZSXF8CfIixe1rGi/VcNFjWTqI8ggwi6Z4cdAUMqsI0MlmqJIObw/s1X1Yzh6JfJh0OUtu+Rql/s2G1z7reSYE3TIkPYqealVGtYaN2W/negZeNKfamhtATkEMoQrJ1rpNA0SyJ/EcUpFyc6rghhe69iuWF1tWLjmB169CSKdX7sPDimZ0cAJCxL11mRpRdVz5YKFZfP6PVl4MvV4o4nUKPIYNXRlp6sheqproVk0H9IhnyJ3w3FZLC9faQpkmHiUaNSFI8DOhcofL8hvEkj8WvrWQdeDSrWl/fd2ktwQcmJeFakfFIKZ80CD37Dj434RBqsNK8I88gWzeA0kY7/dOVIvS8gWYkey+9Bri2D9tvTFzlS2Ak2Nm2EQj9uiMR/CQ3pa8oWuIvWGCo9oBFFpkeGkaFpNcaMnvpvoRWAwBjx75NgqsLRIeWAapT6MJL1qEjI0SX8pRk67Be14RCqyJBy8xBXhegm2Tm0FlKoZ1MaAbRO5C90+v82dyYLEtsgEBX9//9MDlYVDyRPcov70tO2xCYo0GJPTrkkbgFPyUQ6nddVhzVKjDl+Vz8DX1LtaXFxh/yY17cL4M/S5kp/NZ/8mg6/CqQ4oqs9tQTU9PrvDcjbeLog2PTmc9KmWB2Dm2xvKHS5mtWnvrBkyr4MHAsR1V6TbLwKRjk5WhZ70CvH/MKlEJEpuBTbQYIrUhynWmN/0cE/O3xq9a9xmjGafTycXcnFJR6Ct9lrE8b8Uxlf9JvbO1Csxed0+M0I08pA8S53laOGFM9rFUlqDz37XkLebaxY5aAyqsoe193JvLfa0qcM1VYMbC3dHI2zeF4yjZ0Z9uL1MfdvDt3DewSb20nf0pXjoINqbbf7poNsCnvwhHKAVr1qRDaWaCVbHEa9gTPgXWis/1PozEVaJ3gF5PiaDj/WbtpRTgsRQKutb5cEJc4ZHEa7ll1Wja+cnenx+K3gW4sBk2ZQ9I/SwsyBICtWHbDbQS1BBwhLltyBqQzolB6xn61eGxwe5fSKmKTh+dm8iXyct3ke5AZ3HTj5rmdXJvyGZe43Rjk603vLtBScTfj4Ze0p0Ede5s8m/DUdfhpc+9UlO5tQTx24rswitK3BCwptNF24v3EghiIHn2j853HfZPZhxshG4f4D5ZNLTtCIPhqrbRQWw0IefxXdPpHM835DvQ0Kl//HduLt8nzr6R/NCfdIuNSrPtzslO6v3qtQr1+FiZBN9pr6NLe4BslXdPjFduZCTKWdaAOm493K+CVpzzCMUq9QtbKkDHPsXgakI59Y63kJVSKPhv+uiVxdsz5EDZdfkLdZRYftIBcn7JRT+mPwuKPd+8SlT7Zv/60susei+F10EDiMKGmlu2guOdoMxmo2TzA3J83EUIWrglVNSj9WAubnm+cU7kM6/Co96ZDc8iCnWmqTLJDOtjYtmUytVqFGwS6QD7Ixq8zE0JU9UaBv8GTr5785P8kaGGU3yuGDfUSjxvHRw/66AwiJHE3TCY9yGU0xb6ll6p5p3nQwoGTXi9LGwa8RtIwFiqv3vc21dveT5qlfSxHT9mt9ToffPJO+aW8QroERAgejSo2VD49sNTY+dHRaS7hcRtBqTTxn1dsJRykrs9DIROcFBMmEbacxoLNlxwBMRFeG9AXc5CRr82iTtu3Ix8se6ETQw/ekg9u86aCMtzOOAU7dOkil50/kdwlA635e92pZsNHoCAB8hldyxaXPd3T40SHaHN22V2pRPySdwHl+OtGqtmHm6DrRYXeodBhnMDbQBb0zKS2t5hT2og+8rx0XhnA1o9LgBbIaArP1q9vU13PgRwgpMCTecy0q2bLOuw6NsXTv0VxcXPJSl4tzNpLZYt7lyxGY7M7sIIkAgrdB+4gOvzorzlscOKWLDVDa2V0nsYtuULBp1b/XcoQfZRf0Vu08A8Tp9irDDg6k2VyrJvTbYG2KQFub14V+9n5DlaUgfwIcNOaEPxTAkxgi6qLDEGadjqE+lT1LMXSbPA8ascpGc2nzr+41zpXBdekls/zPOvy8BJnacFurj3JFqrPEDN7mnEDgOR/Q/cBA50bU4eC3pYhWikwUUM0/ZcI1b3St5ZWM3M7el2yJZp1XQ3rYiQf1qjUMJXWbnDwjNkAit/2s26nDc4EOQnn4eUPktW4R3UpN0Chwr1MGt0/1D3/Nc3J8XuFLOvjNfUazFELCGS7O8i5rKRUT9ZLCIyvFbLMKmW8ZceE+f1/qSB++WyzD4uyySxSuQtW38qaOep82aCVeS8fPxXLk8P92MOpLX/LabwVxWfaiwzk52c+jHBK+fc7+NxAmy7bax54jC1TVwXEpxK/r39HhdwLxPsW5NzrOg2ZATv69eJ+/z3quC4rfcMaK5NyJhI6qTDYlB79NL7aMBcBZbVlYultFoF5l4kZ4sq5lIqDRTF5Ceq+gyLfnhHnIxc3INx2a4gCsY9WN2Yd9acSmxxttyYNB4mLEy3WWTNdK6UM6/E6wCwAW0WgHBvllpUKeJ9EANsGO33e5JbyrKp8VqkjLjBZnMtizAgbjeHlyq4CaP5itFHgWgMeyRQ91JzNXLARhOLsGArOCYdtq6XmKsrmzFuSuTHnXofqWPDlG/ylNMI5tskQyApzK3N793fapXeUyQ52NxKJACVt2QQ1/Tqy/o4Pf/k3nKGconol7D/3swqBMakjGFD+DQWnRqRYOCqjlufZmAwdP2Aj/Kc1u2ucp05LXdJhxDuJZ6NMWIBCU0K9IxnDqR47jwOQrnK5mnyK8bdWIz3G60JwIev0UZqtpRF09yuPdp8hWEGjDNj+ow88HszCBfH7WyU6P8wIVSrh/VinVn6nu7eR425FfIt67z4jsPJwThprfRCtFGAKn6vfo1oGxqKdCU9cfZJF8MWwCOUUnsMM8UWzfD6639wnOXYd25Hy9BNB005Ix26XpKmLZafba/tJneGVva/RYsfqJ4q/o8PMEEKjmrK2o3n7tgG70y1XKJ8vJ3Jx9LtmirxCxxltLKbfNvbBKJUO2Mm3UgokjyrW08yimt4s4U8FwyWvZlZ94mJRLRtvXrs8JzG+Cyg0Epw4Ifr9K9M/Pv0LoMgCITQOYeYar96m/3/jELmnhLR/T4eeNDoSa3ox9rDZN5EuOaQ60XUvlDB4YO/URb6PtumYMplzfoG2ZstnM8oyn6rDUF+4UrY8O8SVsoyCMRnshWcHpo06kBuY2teSItAaeLp0maEwd9r2c8rSuJFKrXXM3ycHIxEp55lNu2fB5fNRnXM61jGojqXxFh18NxqmcnpXPzQxf+0cFAVdRntK8BtVr6eQygYSZYqaXLUAhsLSh9Xo/G8YCn3IezJFwrN9aBgw+8ESbtM/WNf40nMIQ8wZn5L6A0PsOHXQPZajkk3MVniBc8zS/FdVLrVuZEU1+b5BeDbBKhxh0Ytjjgzr8NDnm8qqe/6otdD18EX7UNPdgbzzU0B686+k33dqO3KKz3DDLWuUsu48Tx6UmxM1H3m1gz4EQ9MlM5iAqzrWa1DMVjzfXnRa11XijYQ3mqevT0ghycTAM7E0H2WW0D/GzAxJ+5XFZl3Zfu1uin3u8ZINbzX9tumVtZvqeDr9EuuY9BfAeVyilUkL0seWkJUIry5Ch40YFYUoNtOd8QrQ2bbpt62NDVFsv97n5Du4sm5k34Sawa59Ws6KcJZ2zFwNy00eZlLQ7kWOtMUzntVcdYIP+95CxtSEdyZm9L24XygpgCjznp6Y/db+1ZFm8SPc7OjhD9PSCqFjp//6YCoQmm3LHEDz7z0d+eB1KmkM0rboMWikaMS+uC1KFwKdI5Bys7ONTwLOXERMZ7mIfDEIf5z1DmHbiICJTRCMgE0QF5h86nMY7P900zMTg1Zib0eGUWnlMLzOHeYyVa9OisxYwfFOHn/7zCksmTSQfh6mNupvcEo0oKn2bDvQOtLHwdOqWkdLt+oNGCi49OAQBs2gCRDbrLF4T9bt9KsMUhfNv3obx5+GxME9mycDN6PTcL/7QoRmrbDEzOmmyDp+fPmAblMZNrgBaiLejEo+B+Wx4wwST/Y4OP092CdxbAMmVvo7DaJv+M0hRKFf+e9oGjJpz2zmnU8SwBOkpCJhJmNlIm4EWaBfjHoJl9m3pBlanDi1TTf0QCMMWXUbIM/tPHY7UghJRMkzz/YXGfyI1g3cNh3rr+B+Yf0yHfwAjBO4Lyccm/wAAAABJRU5ErkJggg=="},{"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 13 and higher.","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMQAAADECAYAAADApo5rAAAgAElEQVR4nMy9a7Bl2VEm9uU5595bt6puvd9dVa1+6k3rgRCSQLKMEDCBAHsEGptAGE948Bgz88Nhw0w4bBzjmBl7HDE2EzM4PGZgAIMNNkYEDKDBIARIAoQeLSG1uumu7uqq7nq/bt1b9738Y6/M/DL32vdWYzw6u6PrnLP2Wrkyc2V+meux95WFd31fAQR6FdRfRYuF7ujvAhSpdQsgUusLSikQ6e6hfkcpKOJ9AIBo/VBaINRfqd8jd17Lf8HqgspCy8pm6K0Km4pNCYUqimQukHrs/mn1kcuoi979QNsGo02rRNVXjTGf3e9ePRoj2bZe/Oz1a+0j41omLR53+vwqyzBqDoR9casohe6WTmrroPiHVKcA3BkgYgMsXN9csXT3itBNN+lKDp37CUSZLahKIPrGp1FGIQYLeaBIdWhSQnGmjIoqXukYYIQr4IoXCfVPl8oQnaEow/qBUoZl0KZhHKoM3QAL3S9WjwGro+P1CtHLn8a7lhMfYgXFxqtU+mx83m0JKpsWGUadSZCFEdNqHGrodk+otoj9dmSQrhK5paKx+5WQkmpLikjqG2agQrwpkmQEQHHe2AZL11c22FJxxepKsahVTCvFBpadjEe4pHtqyPpbqtu5casuitdXPs2r6XNABuOwqB7EeFMDLUX5T9G4Wg3zqarOZd0n91VcBi1HB2gWu4WjqttXMGiZPhlGqKFGUFCKCyAiHpoCDyV0CL1vdat5mGEWQ0o1GTKrDvOLO5wyZ3XFfN946OxCjK7dFa/p5WpYETn0rnQj6b/pm1LreCjkky6Dyizqt8Y3NJDaIIoAUgqhktQ2xXkWgXDvso0M4nX0vusZNeIqx8S/RnCAxpiN1cdd6Qn15WMSy9lQAv8SywKETJkMk5hjVRhns0ioChLUWfLymJu5ZCWTMWQWiFDmKNRAnaT+o4KZaTBzAsCpIJp48Win6Z71UarlKiB4lLDhU4dlRDNnrTWlmMyayypN0xWlj2Te1BOXlV55loGCB1AEnnGqx1XaharTgMd8Xex3Yd2bIgsNIkd3Zlvp+fxS4dZl6I/rNMkwcu+IA9NLkY2MG4Xxqy0FYaA6BZFwxjQRkxgzDHlpzAOuEGOOIqlOjxUx5HUfLarnwEPEMUIym8go0zQIhdsb/Ft/wTlrbsCmnl2CuShlWIYuChVjS5iizduU7443Q0YNYdXZu2o+mKZ7YVmE+CpG3/otfSlQXIZSaXCEmDYZRoZVRf9hB+w80OYTNFg296Q2yrCFd2png671henVT8rVJd9TmpQWmYqkjbU6Go5Z8b4k/LKQa23E5dGvqkDTDzwkB9rcR5WNUjPWSXFzCXqSUjq5t5FB5xYEZZZmaWTLE0udbzEGampDawrk28XLRdOSKoP4yo5Uw7ZITuUC1R8h+BTKYKtMKkkpahQgb4rLjm4QnYGqpxvcWhsaPpvEqNc7dGqELKpFSih4IspCRkT2ZVZH1IhIpVBkMqJdiFXa6mxhibhEgCqmJ5gzMYqXGgVsUqd9WB4pKFJCVGFJTIaqVNVZUwYwcKH+Fr8tcOmMp84xi8lF4FV1qfM+BzafT6LWs/FnHmiQOHXuutE2KoMvVkyTDKMSDN4N33cB1IPcpW0gCQn4N4qia/XsoqHKL7M581oPaW4c7mgWlUqxfsycKFTHeYaVOu8WSqSmZVrbhikglcGOMSz24askhfrs2nB+avMY0g3zWSyOaAPPi/uxkgyFFV89t6gMjmqdsYlYWqxjY3pQjy/eq42H9ekg5cjqJQrVtjonJcmPYEM2J5syGUYRo/qmFASAV+N1cSgSFL4PsrPCTcElTFZv6GpXCDpmbtFhlIYqMfCMzoEUDTxgEYxBEUNqyiaOOEazGMq7IzJzTK/v0DbxE6mG4sut+VI0DMg6IIONiVYW3aPxSMLqdYMszrJryhkm3hQ9LdoTYLJh6Vexwff83xYTGFegwDBdMozisPiASs9SYzWhQVPyERWJxwaDlnblcsDnC7nfZI0c/qIRuw8VQ66WECHOOF3h+s4k79h0BbTsB5UzqjnL7OimDFbdpVUM5mBIhhYIUG91jNjJ8yyk2DiE4RbltY+ongsGwRAm10a+OOFk5NMqwygyuY0TmIwlerkEetYDCxrNqLImbQQw9Gv3Hipq2NXvITwCKGqw3LqDXRRDsk4IM2jaLbfAbJM6Rxb3Tv9lfIU7ceIehyajq0vOSdiQDApMEXQKdFM0c6a0HECkjkMySbMXDvV8n1d6SC8+cTK9NuNgBbEyhTKMAAR0yrt5bOh+fqREaIeGP0Vm6Q94ECcJV0os5VyzytIJ5hl//xSU/6tteMXfB6nUsOwrRVJ14ImMt2N9eE+KVjqgJEN1Nkc1501qOqD27BtuQm2K67UgGlWSgcvVSHgu6I7E+XgloTNKINSzjnuLJUzH2WmOMKcKTRkqSEyhDJPKghOtlX0y7MR0ct1tu9OGCC8poMTJqtIA7ECf1hfycFUSlBNykpBiwI1KlIdKz42sJnSlqkngxk8TNRRXjq4C2dyuis9Xgdkv2NhNbwWkbFqxA+lSvF8bDLYLEK/meEMyIPZJ48TpikCoHf2GL5Z0KYeYg3fD6vf4CnagSGv5ry5FU59hMk1gS4qdFhkmmiJ4B13rEoh42NKczp0BPriiNWB1IWREDSYy/dI1NCq+XOdKcxRxLWuZGxn3VZXFDieaNhVXoonEjuIDqW3jwIRRNd2oUUBTA9aMpD6MHsU06q+r05ehN80Lk7ioK0/FGJ2ZHnenoMjjg6BzIZ2bBnjcuD7zZW3b0eWrLcOo1I51EIq4Y5TCDWH/x3CoaFaoAoECexYZta1G8ESp1ChSnBaZMBSS2U+L1SeH5rbkqFFvDWcoZJwqOzm+NstoZgfPDNW5K4kIWmnyGR2PBLX/kvodkqHE76IRmnL5YCwl9uX0qQ316X0orOvvalwl0Tb5uu/OB3oOzuM0TTJMzJDrgHW8q3cxQXY8CUKyxxeUcFjPxjVHhhbipggTCEgXxzR6ZMTkf912I6VSFcHHVTzb0xUjR6EYJt1xWmkjy6e5a754taSjI2ZF8QiN1yWw68sgPAg+dlL54fSMQ2Bh/iTYh6vcEIpQXulqDKzMBTWpjJnxMA5VR0L1p0SGUVjXr0ZJm8gKvh1fZNwaGbRO1IdE5uBe3ZtwgYRtas/BQFR1hOjR6xEmyZkOO5A5jRq4Cql1FdmpXx8TdT93Q04PRPlKl9HT9Eg6hMoRx/pv6KKX+lX5ewsTia9sK1wQ+lJ65rwNGRRxVX5C8yBDQwdBNp0fTZEMI5+EOsfOrA5AqeWOZiV80vhz7s36qRZVQA4n1huCYyK3C/rkc3UdTa5j6V9r74F0o6mWsiyqwNin7266VzqPHDqJrvhCxaCfD5T3mjRAtvCXCmIZg3oT72wYLcsDbPyCEWZeqzUWBSIzAGfE7K3Rl+tNpk6GkU4EAfXQevCKiOlqfqE1ehWMHSmuDFX9FAqKhdA2y6TGWb3bEKCzL6vTob/fK+m3nXy1eVB0MQdyGgE9MUmIzwos6bvzTu21TOrxNfOHfqQyPgY81lPVTqghGdhYfKmbeVZhQYPQl6krCK1DX7pnEOYEKqNUYpryhlUdIXouT9z0nS4ZRqUaQuibBSNezMq1I3o8zQzMmGX0zIwkQzUjU8VGYYLnp/xMuB/Wv02WJbZlhWnqh9SWUsJOLHcudlTSq7djnjhFrPcTplg9k0sSbcg2MqheiKSlLamepEmnokkYJ74dx9ZWdUrdrymBUlsfPQajjUyjDCPPodnAkbxYx6pGEsVSRgcgGD0vKVrHAlrGdJwtBou8LR8PSjgjOnFFdR4x46WmVR/eXidofOSsOMlqs+ogQn11ii1Eu1iY8s/urJOOJaVt6lyVX2G+jF4ylDTRHpTBQ4mnGyZ/to40nhV4er6pdAmEijpy/S2apjqxRneJttlmNvLpkmGkDGjeTOAXPiv29dmixE/YWC3C6OS0sxZFWkZNLevSbw6vsO9k2jBjJmczUOI0g0jYRDilN0pSKq8qktLU1a9uIsby1whEOpGKgJL5B3yiXWhlSu/RDwcEFd3ptGTwianSIR6pbdz3MYoISQrpP0d0j4wlTn5LvMdAp+mvH8UGRcw4vtMiw0jqAEk1om7JVIeluoE2AJ1R4vFmcOPwXu8xoheNHooCInasVxT1a8QIKzcmoLj1JxTwaEVr/6QY0jvpz4TrnBLFxoAn1CYD1K4L0Sr0DEXplmNpYqf9AtJ41qLmtpoOEK8UfJsyFK5Ao2uRjuVXsGJoSemnRd00fnEJXaJRMqrniybL4b6O+xTKMPKQxSZvFkffNa0q4GdfC+gTBNrFBzEwD0UNr1MfCqtlvoPMwUIdSesrWxpZzEGoXzVcR5Dq6IRaira2Np4XDkpdkoWQPLobXWz5Lk7soyOaMwt9NyeJ0ckjriZeMihDb9OQZeD5DhTcQDpNR28YKUrUUbhYPYy8yjvivaa3aLsplGESYAjKIFm1OUUnQVe9cwodYAhoj6gyKR2tOJjuqRL6Ux6Ll9gEUoKee5uAhMwdAhNNZY77LtqONeSbakX7oPDMRyvCBqOpwXWoBh/2F1QXLR0oLeXBb7j2ZUgGBzGmxX1wvZ4e69h0m1yk/WoCvGcUj6TY4JEKq7FqyiiIdYmG/RYnMS0y+MZcHYnOMWtoV19wCHAES14WpzbulTx54V1dUyDrM+XGcYUGFiqE7nsIlfCKF4cRNC5R9dc6XT8BqTMf1Fblstq0mlHUEYKiCVqKn6lFGPhKl6KK7CBD1FMCNdJ/0AdTEJcb7MBE3iISAZeWR4rKfyppoHnxwqmTYWTVhb1PjZWbDoyLtVXGggc5AylF4HsepFibEtpUqKTyaJgx4YYjTXXcODllXXnMZBeNS50g1GLmqW0htri/KkOvWYrMgTnlIoFPlqEHwaaugjQE/bHbLo3I/Aw5JBuojk+jGrfvrUROmQwjHizDLhGfqWcmaweWsqWOdKy7ex4JIrPRadz2KCIAPYVsf5G3MT27GySgPF7MsIMzs1wKFiyPokgH9dVXnYe0xeQfNtGMqBd0NSB6lsFCTykRmgldUSftnlmW2FblilbbY9159Dp5JznS074rR5YmUkpVpk+GiaU7EpevSs3hLa9VJvUbAajnA95JXiLzTS06chuciaAQ/bmHy196xmQQbLLAJruJbeO3lQbZ1xKL2JDtd2Y5kbJ8Wagwy2aWQQ7UAoPET4gOpXWT6SQttpJnpaOG1Uo7LK2h/lTHNvbUyLEzGCA4onPfUyLDSOoSoR67tYsMWgBbetXVFHVIB8pmTEqCed+mo0rY7ZcMT6lm+dWhk8N1VZIismFltAi3KZplvnPkUpmDszjS9M7daEN1RpIxfOf+e/f7MvSuHs8llvMKFw8EA1RJ9cN9GgyVOfdpPJMiVU9KPwHwtMhgz1T31t8pl+UVraIELM1wx+z6VCeKhtmtODkjfsbJETLn3bWUFBIjFkcBTifiUpySLCa8v7GyrixVBTt6kFDZESyVjKtQOsiuq+Kf8HEYBI5kG8YXO31DBq4fELLUPRXTiwth53rI2YbAoYTvRN/KxAGtqMwtRyAa+j28WnI6ZBgVtXjx5c2wTAp3LIsQqN5tRwzMghEkpN8MEF0jPz3rfYl3wiRp8qU2oqtL5hPVUPRepm6IzeG3OqIeAbC+WAoybr5v+xXhUVoHHMeN6Jw5jQS19Rk5bE4SJtJZBgJEPUtmTiQqG92nurrzHiJrMOaOZ4HLEPZKbFGjFqlta66vv3WsGCjD9+mSYeSTwaLwH84A+WDwD/UuX/ktwYI8ghiCZ0RzK3aDtifwJTJODNguehXIJ1pQTzFZbU+lKkaRwXfOWTAyTFYc8lyoIQPTUTLkpMYvXyWVKaspP95WBtMDkxG3RENCEsxoIfKl/h1AMSM98x/R3dpQ2uLgEA20ycOUyDCyAGHeFVFL2TdWFJqqE+QdVN9ijx3ZikKt23qAhyJiaktHd/VhCiNVopUab4kYrQKECSzT4r7ZUVRxvNLBY9jHD6sfIDAPQBqgFhkLBYMylL7uMkiYHCCDdecKvFi+rf9XfbJT9mQtbjucPzMdTgHDK2amS4aRepTzUpHJA4a3ScR6E3k2mEqH1+/dJwzCqePqSNy8oomFR+Yk8ZatU+h7trQwea7/G29NqwQpNtZTcZx4od3yGD1CXUFPBmG+8tWSgVILNzquS0wGI/BBD/oGnB4ciLrhChoN9bxIGJ6TgcSde9fldMkw4pTDowXgB4zgKJyXswKyqjLEfpqSgsJUcBeiM8bYzq2HvVUFSBAk6TfxY2RKUkQSQYyFDOE9pgJbmd14yM+bFNLFkM+1+OqQdECGnIZZCpn4FlJnKu+fHnUG7IAkMRwWHlywaLBZhbn+gMzTIEO3U615NwoxI2TjbojBZhIqUwjoyV9SoUWb0k1/g/Fk+k3kMDZjGy3XlaPqxxDEoxBm2wWmg6rxcLKUaPX7oAiokUnbSN3crLoXk82PnvQUY8qiY/IiO8rg7VWxcTLeHARKU/LqjOrV5Jfcno7fSywP85xalFIQ02VzafqrLMOoupEnGgXwZa4Y612ubLnsvbWtGkr67OrSQS4A/uggSc1OXK1BI5f7nRtHXNkofhYLdTxsblOYTZMZVNY/8yJNJOrGWnXEh9Iqz1VhFjirEcRz+j6oLoA6DkfXhgzspUX1qTzQ2CnvOvDqXToWDYSNfWjfrvLQQuh/Lub5nQFX8aCu6DpFMozsL3gqkfAjrKJbWaQCtV9CUjZ+ekbb0NStNxpn7Mr2IFLqIxX6zcNjb66wMN8RN8geLHX3I/gUioyRryy+fudTluavqY4PrETHVSStHpSf5WjLoJbFXaR2dDssNBhYcIUkl2IFg4Hpg1GoUFuXwdLWLEPob7pkGPHNXjiPEFsdmB7sIBE6XhxJGWW1zyBZNYieIL3Y6Chb2DmgfTCK+KOb3gcp0pSUFMh6ykiXVNFL5/hSxIOjWS+UpwbSE5d1RKjYkMEm1tq35mbqnKD+C53b0fEgtAzyljrONUo1ZWD0Ntm1P7pX8rJ1ROtpk2FkD1FUVFKj5/r8Q9GeD0VZiOtxxZ+NSyOH0tD+w71i/bqDM2wXBEMEbE7Eodj3NRCNsGXYpIPsIHl+DfCAaQdep3kgL3Tkn81B20YGizShWUJbvc8gwaz0nM2dTp2xy/Wpk2CEhPAlK9SQjOZaDpp23m2KZBjxfQD2HKz2JkW3n+p3YVruOBYAijqIxNQhyZmPJbgTqkEJ2YLuQDf0NbBKUYICB/TdNG7c1xXjI4cYBHmZ5QAbDVQLObMWbyNDqQgc0FJlqIah38NCAUqilx7cIb0rOxne/BxXR7szm7hRanUVbIsnq/6g1XTJMOpNSETozX3xpKuegAVNTIM8OmFS6YQNPFpA79yQLgeUAl6CtajYq6sMdL8La5J9zWQurhUjlTyWvvPgNaMBj7jxTcNT+zGwoDHvGOI+QTfrPeW7lEEZnLYWCoIe2Q1DaPN6hesVgzJLny3a1ojrWCLGp4534I/SYZtcSycDR/Bpk2ESxgHKt1uUljmw5eMS8Lpq5DQhFPUcuuydqBw2mSSFQJtIpuhiP4lPb0+/RFenYpiNEzZHYT5saAQp4tncKIFIEAB9HdpgWIiVrBbYkfH0eK7TSP0Ui9EU9fisFh+zr7qgMTKg0TEjz9WJe++wJhmc/7kEehpOXAZjV5QCjQd59DTJMCoiYW7byeKRQZ9VJV7JoPTgFC2FshakDq4RrrymP5Log0zr7wUWZv12MVRBQT0tqf/3nanniLUPjVy9B5LYUVgfZJUWZun/EL1IUYVpW//0q1R61pWfPA4MDMhg/XC0Cs5OTw1SdM+TyVL1FZ5TKToZJZ6FAIfmd5pHM99NGeKLkCKfUyLDKCjXWQUnS0UZJvn8ZCKi1yeF8F/q7ISqTIV8EMGa3UkIUVkIQ1AVipDY0i3d4whsU3iufHUeHerASXY8sNEqP/5uHpqAE5xTWhnb0shI6MaaSh6QIRkYnWmlIJgd6aEYSOnNrm04GmM4QjoVI03znFrRuuXnalyG5pyMZJ02GUaWtgSOg0UYAkuwXlAuaJybBoSplK6kt3zGvlgrWmsp5CwJPah/NYze3kIpMfIZi65cD6FkyJUvo+0e7H3mNrmfojKgEXXyEqAPSMt2WlfYM+EUTPlVVLVxc3bcWFwGm0sR+DB7irYuX1/XjuTZSULFXptpk6H7+xCS+kj0bE6gPznH3elqGT8LxUbvXbnBJuNS+fgzf7c2vRtEt9WY7D/MIXSwwNEg1u9dxGQ8/kw0Ut/SEmw7GXIdGsTm+Z4Buj1aua6kgh7thm5aHYb7A31+lWWoZ5mk37ZGBAH8fI5ZZAPLCqInZaVIHxE03bJq4nR0ky8YHD9uamhANDV6iNcNPLEMneDhXj7dG1CiFQkSOaMnhFitq6T/h8qH6lhISZ8ptS0DiBhPEmxfp3meSOsWqltiu4DIOUoy31MmQ3d0QyJvHWPwyCC6/+DWoRtpsT4o1A3FLWdMArMS6nCkUOZKoWcwFMBT6BOG2awIlcmQiKIAWilWLmgolsUiffhDV8k5JP0PKqfv/LjooAy9VSd+ei894iqx3HhSEEn+a1rkFIhTVdMjrRJSNhD5o5Q8dCJTJ4O9l8n5rwY5AG9qxGE7nI23MmDg5jI0nKSfTlhksN/FFMe2bO3DBKt3sxmZO290BPA+ksxJrmi09IBLi746nCAsDOx4tdKFIRnIEWn1PVTRFI1XbYykvmAipzyFnnwmskENJStFDdZaBgRucB+/TIkMtlOt8xld+rNXwMONVjuQXF58a96cApRugVdq/IENV0oxzo21sPpVggaNVtGmSfHKz+CAMDz7+ZhCfXTtVG5SnGq4PubqJyi5L4mpHcKXZjpV8g+mNSBDDxjS6HCEiZtaSpfRN3ZvGiL75NU0f7dv1bMZLK8IMRG4AYogczMtMoxCWKY3aWRUir4Ub9qafqClN3XrnY6YO0/xbyWke4qytthjYU7ApDIChzdsZ3Qt9BkmVvREV8vYggLExiIiV+6LB0mNoh0xJNlBAIMBGRgYepfRct7D3kztg3dzDY1zfqD8FC6i6GdddZXSUKrQQQe2ejRlMozoOB2UPR7fHBUKw14spBDEX4WMprpEjym6b/MF91xbbWoZnHKoLAi1oWXgoJjC7ROsULXQTwPS1P87A6AHi7TcJvrUlg09d5SNQiF2SIa8UsLOyZNCs5+E1NQuGG++1Cgk3y6RDwsJjHguQ3x0tzEPnQIZRuAOdFVJq5rHuRdLdf94jJeF8+MYPMvvHXVgpFbjUSOGb7LEpbzUjuobf/W/YDQWYViBDT4k3S+JRsspSR47IsD9CfqTdTMS/p14DDg1IAMqaATVkjHmCWsDcfubioSabIyBFjPMekD/oj5DZOQJ8xTJ4KddOXSIGzpPZEXLKxO8TR5PfLqB8GZNb23fGE1oaQNfFUZKbMzLo0FZe61LqBA2+9AwPpoLwdt2MsRB8zCgfXLo0DQxh4cUYbVAfboketZ8QAbA/o6CAxfP50rsg4U3HZdYbmzpuCVQBAKKN7A4ysZ1mBYZ6zTJMFIi9clmvymehXFOrl4eUD84np8s9MN5yZh6Rk1LaFxHyZvx5a35fl0WOKRE1VF1IzLkO+KEFLOcRm2lDhQMPDHBkdRoFOvbAxohfiBBgKH1sY0MUHQV7wOUOiQdFPhvT1EZhb1/G30RhAmO+H1jg4ytUB1fDSrOByN1iBDTIUN9c5+Ews7+tFMfM7aFkAKZcw6sN3NRAMdin/FZgELAoF+ov14kQZhQRfQv8Tsty4W5S7jvz2Ko0YpGsjTYQRZDsDq49of7GMG0n6QTcqawJKw0WzJA7aXKIFSoxGwxI93TdCQMo9IpJoIpgfzdHFnIAcz4VReK9PDHCUj1maVpkWEU6NUOunuMSuQU6mgl/SZGfQlMgvMIE9I+SupLUVC92FCE+kS6tB4J2clPCmODU4O2uQ7xr8CeQ28IWR09jmqdLDxA0fHYiIvRhB2DMefUtmE+MiCDsk23HBAqoGlBKfZL7SU4GhSX6aEd5V95DYNOjxwnnoQGQcE5bt6hd02LDHVjjislgyPgDVmCxApWR9iYK+2A2J0xhIN5GTIKIy7YPkh5JTbolcHbV74MJeBlIa0D8SuUxjEd0wNN3uH8NnlACgCipwNKiAZhNS5EiG1kqMoJ8z9VPjoDcbDQZ0OKO2HvT/4ouDAKq2YqOIkbe5in8XcGlIDMDW+YIhlGoCsgedfMaOmR8K6tDpojMz8zUYqYUKIMJ4O2VSXusSgWpCMADYdpT+JB6BJJ9xE1V0BFIDdye8DEcSnwwIYb6XBHSaeUAjKSGm/aRp2V+MkyqO96uaJgalDQjU4SwfXI9dCoJ4Gqv9jY9ocZEa2NITm1zdFt2mSYpGbqP7UCISBAE2RRkHSWS56wVkqKnFo/5cCo5YrUliIU9efqjmoc1N7QXdubAYPaWMfejhyOZfDl2u5XRGcfAG/o/bEM7sk6Qq7H2ZkJ9szvwu5ds9g1N4tdszOYnUwwOzPBaCwYjwJGYWNjE+ubm1hb38Dq6jrura1j6d4KFpdWsLG5GfVp6VfUc6k89PRpoOPgIqEdbEGjO/NWaMC0H9ZHGl8CNNNv/Wa0s018lWWYlIryMUWR+uyDBCQNTqGVzUkqNzRBNgWExyWpPdlO76ivsD87j2ZmMejYXMAcgJSl69zCfamm9Cg7O0vlzZ0J/pRfRXDlpXfmiAZHRLBv724cP7wfxw/tx9GD+3Dy6EGcPn4Yxw/tx7FD+3Fo317sX9iN/Xt3Y25mBrMzY0qdgOWVNSzdW8Htu8u4fmsRV27ewYXLN/D8S1dw8coNvHT1Ji5cuY5rNxexubkJc9IG6LCTmj7JgS2iV7KCoAIAACAASURBVB2oYal90bE7T4fpOx/lsYd1qo34imUPMxOvkZd/4zLsfdeHLbiQL8IP70kz7cvOHRA6NTC8TOhRyEj1d6c/RliiQ5PgZirauhKjtixsYQsRaTTKhZDAaK/ao3K6PRoJzp48gtc/cgaPnT2Bhx44jjPHD+P08UM4eeQg9u2ZDwPJ+zosp17haAj9LgW4fnsRL7x8Fc9duIKnnr+IJ595AX/8xWdx685dOOAwaKVPICrS9JH0m9tU2iGlS2qygc3loH45umhGwOVfBRlk4V0fpiBAiGn0C6UN6TGMYLcaUeC5PN8zhKUb7rbGYzA0oK/MjO5wdGo5I3kjNBqG28EZaFAyz+at3Lj7MR6P8ODJI/j6r3kcb3/Do3j07AmcPnYYxw7tw+5dc1V1ET25fxN1B0cZai8iWLq3ipev3sTT51/G7/3pl/Cbn/gczl28Qipgvesw96zYPxuo47UJGJDGK9VseESjfm7t9A3h/w3JIAvv+nBx4s5yvrhZZIGDUGJLo4b06wywuKOqeqhjsvEmYGOgMrqwg7RCzsA48qrU/PwcvvUdb8Jf+cY344nHH8Th/QvYv3c3ZibjQUPOBs9XdoTtIsVQm61ScHtxGecvXcNv/OFn8bO/9nG8ePl6xZN6CM5S4ipUAoy88hbycdYPkCJB/g4Dku4OWViKEHG+Z0qzMSvW5v9fGWqEiA9ihGO2wYu6zpv2QxHO+gopUk1VdAWK65NDo3q9T40d4XT1Slj5QcjOsz31YqUysYwAKVKxtshhxqMR5nfN4uEHjuM73/u1+ND734ljB/djZjLGaCRxIAau7VKkncq0vNVP6/fG5iZeunoTP/l//w5+9tc/jpt3lrC1teUyqYY5MrPOSA0Y1GWqn0Gr9YlS3+aSaIbyRr9AGq+/fBlsDmHi0LyhKLWC6DCcf3VuHUBB7+mAhs2PAaMxupw7Bp5SYBwwulC34bWGVA0gag9swczMBKePH8YTjz2ID37z1+Pf+trXYd+e3YP9b5WC5XurWF5Zw73VNayur2N9fQPrG5vY3Nqq41gwGo0wHo0wOzPB3OwM5udmsXd+Drvn52y1qSVnC8CGHEivT3z+K/iHP/UR/OmXn8Pi0r0eLQMVS1EKJCILoW9SbQI+vhmzhTgm8WgPT3xbGYWCWD+P+MuUQRbe+WENSKFG6LKUupFRzYkDB/OqdTHUKRHP34fK0PiO9r0mOmcmGBG0Ye67tpuZmeDRMyfwjq95HP/Ov/02fN0bHsP83GzPIDc2t3D99iIuXbuFKzdu4/L123j+pat46eoNvHz9Fq7fWsStxSXcuXsPK2vr2CrdxuRcdYQDC3tw7NB+nDh8AK86dRSvOnUUZ44fxgPHD+HBk0dDnzmNGrpa6dWl67fwz3/5d/BL//qTOH/pGspWhTx7e51RjspS8Kv3THNCOuf0Q42jVOMWpjk0NH1Dh1umy2vOwznEX54MXcrkHLgXVqE8ykUUyBGj8SI6kiudVcrGTLQH07eck21ztRyxE0uRIwKNTqK0zWQ8wmNnT+J9b38j3vf2N+IdX/M45mZnOlXWwdjcKjh38TK+8Mx5PPPiJTz74iWcu3gFL16+jsvXb2Nza6sOqLj6ydHDipnyaf2PceroATx65iSeePxBvPV1D+Mtr3kYp44dhCA6wk6rVXnecmfpHn7zDz+Hf/ZLv4Unnz6Pjc1NbDfPy7qJem4vYoTFjWTn3c+G8de+JBuSB+qQ6TCImpb/EmToJtWJ78yurdX2cva2UnwuFFFqO0QLMvLEqVWhWZAhvk28Nf9hMiePHsR3v+/r8a3vfBPe+NhZWyYFgK2tgpev3cQffu4pfPILz+Arz7+E51+6iis3bmNtfQNu3cLCpDSsfrMBasjg4Rbj0Rinjx/C6x4+jfe+7Q34wLvfgpNHD/UcY7srg8zq+gb++IvP4L/957+MP/7in3fzCqAPSjx+5lhWUMXNluogGRxf0yC1tpbNAGbk0QBLpVU31uj1kwTzfyky0KS6VjBeQtyAu0M1dAFjH9WtocvCGjOfoEIVELSZlBK9D70osZ0ftICoNyBdpZEI/uo3vR1/44Pvw+MPnsL+vbut6dZWwWeeOodf/b1P49kXL2EyGWN+bhazMzNY2D2HmZkJNje3sLh8D9duLuLFy9fwzPlLWFpejaGoxWwzYvbLRiLYv7Abj589iR/4zvfiQ+9/Z5jIA20HGUqxNja38PQLL+GH/sFP4k+/9Fy7X/2itqF2YmKk1ZzGJDbMDXPUCJNgpHFNWYMSbNlEa5L8F5RBFt75fV13Tafrp0mWbljwYzQgL4crI55NYg9XZiUpp4E6Gk5b9bEDraDI2n+tOzszwRsfPYv//Pu/A+9+y2uxe34uoO+txSV8+dxFjEcjPPTAMczNTDAajcwYdUe2VHm3tgq2trawsrqOL527gI99+s/wrz/1JJ67eAX3VtY8lRLeRaUJp90D6dRlEAC75mbxTW9/I/7e3/wQHjx5BJPJuBephybeXAYAz128gu/9u/8TvnzuooFprBdMQG0IoGHs3SNVN8A70WzxqcPPu9+ASNxLslSJMpJWuv1KZLCUycg3vI/2ru2bSh3cIgFFW2BULVUCNFnvXQyozTmE9g7oHzgcCAm98pnJGA+fPo7v+eZ34Ps/8B4cO7Q/IO2wctvLniyv0tBrdW0dn3ryafzMr/8+PvH5r+DStVudYzSvFC0BhOU7uh49cwI/8gPfiW9955vCDjj3v90ycKmT1s98+Rz+03/4k/jScxeo36jP3jywkSol7uOEWwZ4sQaZULJikXbV1oQx2Ncrk2E8d/aJH+tuCd3XyQ1beOeNlgeKE9FORGJ7neToPN2VUw07CBKVUZSuFuv3hlY6e5EgvIfLyijB1aEDC/j2b3wLfvQHvgsffN/XY+/uXY72acBaZVreQlytz/fGoxEePHUU3/7ut+LR0yewvLKKa7cWcW91NcqeE2nOvZMMgODGnbv49Jeeg4jg0TMnsXvXbBiPIV6VX/199OACjh7ch888dQ637y4bDx7FdOxKHA8ethAFKmwGJFe+ksNXsOOIyRmCITjfB0fRWD/y9cplMIfo2rulK/2eoREdpSK1vjuP/nYmwiD1jIlWAKpQjCw8iDDFMj30eHShI9Ovf+QM/ta/9234oQ99C1770OlgwEo7G8/a+gaWllewvLKGra2Cydg34vjiti0nGo1GeOTMCXz9Gx/Dnvk5vHjpOm4tLpsxdYsIrJPSBwX9rIh7d3kFf/bsi9jc2sIbHj2D+bnZZqTIcvHneDzGyaMHsbq+ji88cx6ra+s07Ix89Z9WxNFqbJSA20ArfaAUyCe2DgpFCJihZbU+20Y2bOLplcoge9/1YTrl7KFZiu49sAN5wpSdWZsbhTpgzhDcwNsZgNfJ93JG1cqwBrIuvTe/axZ/5RvejO//wHvwDW96DcZj3/jiiefa+gaeu3gFT527iOcuXsFLV2/g5p0lrK6vo2wVTCZj7J3fhRNHDuB1D5/G217/KM6eONx0qtal9xaX7uGjn3oS//1PfwRfeeElbG01ji6wXKQXB0q/eWj/An7wg+/Df/Z9H8DMZNzjY2gjj/l67sJl/J1/8vP46Cef9JQu9NtaJOEUBcjGYbOAEElq9CuAsIBiHXkDjSCmGonGF/gB4goU2d19yjDpjLjUkAR/BqAnaxTcwSoyn49V8CDElIeYM8H7/TgRroOe0uywRzim3dU5fmQ//sa/+z78tW95J04dPYTRKKJmKQVfPncRv/WJz+H3P/sULl65gTtL97C4vIJ7K6vY2NwKChYRzM/NYP/e3Thx5CDe/ZbX4nu/7Rvw6ledMnbz+j+XAcC+vbvx7e9+K/btmcff/kc/hYuXb9DgkLwWqt0INHr62Auu317ET/zSR/HQA8fwofe/c7DfIScBgAdPHcWHv/09+LNnL+D8pWuuR+WKkY9Qmz/8e7UpHj7L+CSIpjJA55jqLNq3RhDEVE/nrTDeiqeYIRLdvww+qQ4cgwinAaKzSCkyordEHATevj77Qet3ITQISqbvaixaPh6N8IZHTuO//I/+Kt7zta/H3Iw/D7WxuYVbi0v4vT/9Ev63f/X7+PzTL+Du8gpW1zfMQLbLu0Eyzc5McOb4Yfwn3/Mt+J73v2PwiHc3HtEIN7e28Nt/9AV879/9J1hbX6/jMiCk8mAIFysUAU4fO4Rf+Ad/G088/uC2c4fWZ6eXTfwX/+PP4Wd+7eNY29iMOg1RQNmrWYOBXFcqPQHiOSU7hZGE7D0SUO/nyTk48hi9hORQgL9/GWwOYcXqupa7SuycvFeXZbsJc2RSEjM0JAE5OGJp1CxUbnTEnpOq9+MhsI5lH+Ddu2bxgfe8Ff/07/x1vOW1D2My7k6grq6t49kXL+MXfvMP8KM//vP4F7/yuzh38QqWV9a6J9BQHMFMc9oHo7Ub9+bWFm7eXsLvfvqLWFlbxxOPP4g9837sO0/YGaFHoxEeOX0cm1ub3SaZOQ8hSAA1RULiSXVeCpbureL5l6/im77uDdi9a645z8m/ed4zrvz8qz/4LG4tLpsOGEwLj7fEHWAR7oO92eeV5jBSgTfJECIlCCDMJ6TSgNkkPyUH4cUIvCIZfJVJFH39OIHlqVVZ3bJsDLeBYUY2gYW53sTQ0D9utaty8nqzIYSoYApHLKAP6qmjB/G93/aN+Ps//O/jyMF9ALq5wVdeeAkf+b1P47/+iV/EL/32p3D91iKFKphCu76IuD1qV+tayIavdADYKgV/+qXnMDs7wdvf+BjGo1ETpbP+AOCxsyfx2aeexwsvX4sRwRyfQ25d7zPU8M8tFNy6s4y9e3bhra99uDf5z6thmZdSCg4fWMDl67fxqSefqRYe01MIz3dSCFPNkJGXSoMNO+g6yWDpr9ldxAZzCrbwBB5qL8bnfcoQIoS/EsVRnNE9e5p1KpJWikrfeBGI1FSJFaS8SRVXqJwhKAumX7v+X/vQA/hbf+3b8B9/9/sNpV++dgu/8rt/gh//hd/Az/76x3Hp+q3EDynUcj6JitTbKme9L2mkCgq+8Mx5vPHRB/HomROmpyGnUAPdNTeD3bvm8PHPfBkrK2vQKG1zMhFyClqWzqNTBCtr67i3soY3v+YhHD+8f9t+W1GrlIIHjh/G//HRT2B1dc3pk65rQk56IzbC6xXdjmpHrnMbyr4MsT+OGrwiFfkyPrRqKLw/GcazZ574MdeXe6kwKbZBNpYwyJyTspB6mweRBiN0EB0kC8cPAZlDVdqj8Qhve/2j+JH/4Dvxgfe8FXt378LG5ib+4HNfwT/+uV/Hz/767+NLz13A5qZuiFlCGs9MBcCIkSPPw+y5c/1eeVtb38DVW3fw/nd8DfbM72ou6ea5xWg0wt7du/Dsi5fwlRdeMn1pNOhFiGTk2bZuLS7jxJH9ePNrHsIM7WSHyD4QtUQEC7vn8fmnX8BTz79kwBdiAUf9CgQRkf2TT0KDnTibCMtA/YVnJMQNuAjZn84j2LeYzn3KMJ4788SPcZixNWFowqMUnFQ3Ln4swxzIBhru0RVRCw8Gh8LAGFmc5SN+3x0oDuZ4PMa73vQa/L2/+SG884lXY37XHNbWN/Dj//tv4B/99K/ij77w51hc7p4BiMck9DPvk+jg+X3jMa83G4YQPQB3l1fwyOkTeP0jZzB0ZYPcM78LtxaX8AefewrrG5vdWFg/bkThbA/xyyt2axsbEABve90jOHpwXz9SN/jgaDESwWQyxq987NM2HgE0tNBSOG0v4CgQeXV9mS63kUEIBHryAnGCrPXIwGHzWhqnHWQYuYeQIWpHpf4oXSN7UxocnS2lqgauxiHKCssQwlgEiELG5AqSVEvZdF5FBO/92tfjn/7of4i3vu5hzEzGOHfxCv76f/MT+B/+5a/i2QuX62QZxm9mIEwCTcleVmwUOTfWsoRKVV83F5fw23/8JDY2Nl1PZHit/H1mMsYTjz+I17zqFIoNRN+QQ5rGMoiOV1f2J196Fl+sm3YAkFe7hvjQ8jc+9iBe//Dp2Fd1SN8DIH0ofYoC5iQ8lCzSdjIYb9Q3G5ECRTU8yXRzJLoPGbrdKeqjgDbkROz1KzaprQwURnBzktpex5Jva1gtyowOkHlfbeOfKrwvgypqdD92zc3gO979Vvzc3/9hPHjyKO6trOEjH/s0PvQj/xi/+rFPY/neGsmWFElXVE5kqUKVjkYiRUZAI1FEsLm5hecuXMFzFy83c3aWiw3zsbMn8dqHTlekSvw0ZXAdaYqlBrC0vILf/8xTuHnnblhezZty/Ju/H9q3B9/wltdAB9PtncBCUdB4SuNZ1eSpcd/gt5PB9evgU8wAsy6inkr45/5kmACIa7jEiwrjWxGFwlREb8tRMwFKR3wZTMOgp02dQxMi2hvVuF3XbynAvj3z+K73fh3+qx/8IObnZnHlxm38/G/8If6X/+u3cfHqDeN9POqOJkzG3eOak/EY4/GoLsN2uXu33NgtgWo/o9Goe/HtwFXQPSnH8uvjoVtbW9jcKhiPRrh8/TYeO3sy1At0Urp2YGEPHjlzArvn57B0T8866QA0+BHSjemumFF96ovP4Pqtuzi8f6Fp+EPzChHB3vldePOrH8LMZIL1jQ0aLR8HUSQ2oIJH99bR9/BiJq2/vQyhndlFcWMPqRrJYt1XMJOyowyTYny62ZX6r62oaDoEn0DGJyFooAw0+4jo3qoi6e6yKyWTnZ1MsGtuBrvmZrF71yzm52axZ34O73zi1fjBD34zjh3ch43NLZx76Squ3LyNb3r7GzA7M8FkPMbszAQzkzFmZ2YwOzPB7GSM2dlJfVPeDEYjsTdkTMYjTCZjzTgxmYx7b9Hja6tOnu33VsH65ga2tgo2N7ewvrGJPfNzOHPiSGiXI0SeXAPAQ6eO4uC+vVhaXonoVyNj0+BCPVfgsy9ewsUrN/DY2ZO2Q5+voZO94/HIHmd97uIVQ0YDsVb/wSR4nlj/oWHubHlnGQBa+HCD4Y5C8HR6zKz2v70Mky73klCpJGq9yAdaK2YlBFmkn03UupPxCAt75nFg7x7s2zuP/Xt3Y2FP97lvzzz27ZnH3t27sGd+zl73ODc7g12z7hgPnjyKIwcW0G1uCV7zqlN4/MPfgcl4hJnJGOPxuHmmJ//mlZ+h3duh7zu1B/pG3/qdaZ062r3QLM5X4AgYUBgIA6RXrbu+voEnnzmPb3jzazAj48DXTvoQERw5sICHTx/HcxevOGhrBlnISFPKqRhnLKUjDMb2fciAQk5F9VwGW96h/rq2eYVrJxnCu125P95BbPHrIlGgK4CMBAu7d+HowX04dmgfjh06gOOH9uHoof04dnAfjhxYwMKe+e6dprMzmJvp3ms6OzOpr3Lsvs/MjDEzHlsas90xivFohAMLezB0DR20Yzr3m1e3aA0ZfMv4duJHRHDk4D7bQ2nyjLih6WkDaEgU5ASfe/p5bGxuYnam9yrfkCJlOUUEBxb24Mzxw1o5ZiqBExobA0vSQwDNjsmYZWwvg4T9IOWZ+xX2t65cv+f5xjYymIaMUK0UcjGdfUvX7cxkjGOH9uPsySM4c/wwzhw/3IXWE0dw/PB+7J3fFXL1yXhk38fjLjffbhmwtYmVr53u57o7bYy9EuTfbud5J4dp8Z7bHNi7G7tmZ2LIFgdTJwRHYwBsX/4cQcFTz18M850hPlrLrwcW9uDsySOYjEfY2ip2HCd1FxjrltSLPwNjgsL3j1KavJMMMWPRJf8IC6kTZoj4gftVrirARFOODqkdoXfNzuDgwh686oGjeNWp43jo1FGcPXkED548ipNHDmB2ZrJjemDKafweyltNrFSWDa6F6kOhP/++n4gx9LvVT67XcpydUjFuNzc7g8lkHEMz3JACbUF6ETN8wGvRs+cvY70eWmxFhBa46L3JeITv//b34G2vfwTnLl7F8y9dxbMXLuH8pWu4dWepeyv5+gbW1jewsraONe2ndq5THmXGncF5vR8ZisntfuTpkf8IizrUj0WpMC+gtL/Wn7z3a1+PwwcWcPrYITxw7BBOHz+M08cP48yJwzi0b29zgIcMaicDZlpDAzB0DQ3ekLFu53D3K8PQvfuJYENXlqNlmDOTMcZSJ/T1nJUvcCQ+C1kD2Dbc2lbW1nDt1iIOH1gIfOwEQnodObgP7z74Onzjm11nW6Xg9t1lXLxyAy9euo4XL1/H8xev4MKV67h5ZwmLy/ewuLSCxaV7uL20jJXV9ZiGsCnehwy9NKtQWp9DS/3p8QT0ehvNl2DpE+VWmPzLv/dD3RsmtjFgWPv2IO5kfFw+ZEhDqy9D9bcb0KE5wU5OkXloyTfE63ZX5qulKy7b2NzqTr3aDDClSiHWx5vOSuT38o3bvec1WjLsFN31Govg0L69OLRvL97wyBmru7VVcGtxCZeu38Kla7fw8rWb3buqbtzGtZuLuHbrDq7dWsSVG3dwa3HJeb0PGcJNjTYmg6dDfTpULgQuWk4OMhlyhmzA2Ui3SxWyoltovNPKzv2kTPy7xfeQwfHvITocaTLPuT7T2e7aLr1kvtbWN7rddYsC6AGqcOznJVjli8cBwG0zvj4/2+k51891sq7HY8HhAws4tH+vHVsppWB1bR3Xb9/F9VuLuH57EVdvLnbOcuk6Xrx8DRcud1Hm9t17KOk9UaYCRf0QZDr5exHT6qR5Rj6EahGo+02T6riTOZT7Dxla/p7bDA3CTpEgXztFnJ2Q/H6ixJCxb5d3D0XS3H/upyX30soq1jf0xWce6v1JM4I10wenVH2ad5b8LFfms+Xo243vTo6Uo7RINy964NghnDp60O5tbG7hztIy7ty91z2huHQPL1+7iaeefwlPnbuIr7zwEs6/fA0ra+uqxdq2ZjthbtAV6n7FUHbmtl9Ijx59zCGyIQylLa9kPrFT6tNCmFZakem26AwNTL7WNzaxurqOLRSs1ZcQbxVgeWWVHs6J1+bmFpZXVu0FZXyNRLB71xzinpdgftcsxqPuZQRzsxOMR6NtUVd5L6VLOe6trvOow/JnLrMg4cuc/gwwrK6ge0IwZwCtyf0QKA6loUPtW/1wO5FuM/Tw/oWwi765tYWVtXWsrq5jZW0dtxeX8PT5S3jymRfwmS8/h89+5XncvH3X9VGq3CSrRQX2HNJHbVGZqf/UexNmcMgpwlDvEAVy9FCF6Juvu2MNW9jcLPZ9a6vQvYLNzU0srazi7vIKFpdXcHf5Hu4ur2Dp3hqWV1Zwt74BY3llFYtLK1heXcPK6hpW19a7z/UN3Ftdw8raOlZWut8ra+sum2UXldeMIr3ftLTBk7lUv0mP2s7vmsVkNMbs7BhzM91G4/zcbPcsxPwc5ma6TcfFpXv2x05aaI8ez5w4138KgkHkB4XuN7L+Rept157LWvUm4zH2zncvcgCAB44dwuseOYPveu/bAHSAdv7SVXzmy+fwmafO4bNPncOFyzewvLJqY94d8c/gwU6Zogrtm0xaqZFeGUXyvdW1dayub/jn6jpW17ult7X1DaxtbGJtfR13l1dwa3EZt+8u487dZQuPd5bv4e6SGz1/bm2RAMq45s4BHXv6jsbYMW88c4g1JwbiI4hu4XD06crtfUC1mr331vLY6E0FWr/g3spaJ8Ny7MYndeg7F8d/Bh8ba9YNqQwsn+DQ/r1h7IZSvu0i8P2mta1rp1Rzp371+8xkjEdOn8DDDxzHd3/zOwAAl67dwpPPvIAvPHMeXzp3ERcuX8eNO3dx4/Zd3LyzhI3NzToOPMaw77bJzCkTMwDA0Hfp3gru3lvB0vIqFu+tVKRexfK9FdxZ6nK/29XIby8u1+W2zqiXlleweG8Fm5tbPmBsc8aYl9mkyX5zxAG6P3hIdbINBroRxYUJ50STjVnrJf+wolq31MHqoXX4Y45RyDDuLd4tndWIFKMTy6CH7F1ZtW9dfyE8OFLTEga2oblgjvhL91bx9PmXsbK6hoXd81jYM4+F3buwZ/cuzG2zHzVEL/c31G4oTcsynDhyACeOHMD73/EENje3cPXWHTz74mU88+LLePr5l3H+Ujdpv3DlBq7fWrTXiZpy1OhKweSzT53D9epJN+/cxc3FJdxedBS/W52gS1/umUOsrK13qwFZmIH0w+zNxq4OaEn12AgEvmFDuZ6kNi1lRi0C8SQtaqiMWB6QGoD9DTuzs2TN4s3cv1iQyhchUFz37vjKewymAlCfLRlQ+uCgOk3R7uihfT3D3W7Sz2WXrt/C//x/fhRfevYCFupZM3WKfXt248C+PTi4sAeH9u/FwYU9OLCwBwf3dZ+75+fCqeGhifzQ2LXmotvJMB6PcOLwARw/tB/vetOrsbm5hSs3buPFuor1wstX8ecvXsKXn7uIZy9c7pZ+TX+CyQ//d//C/tLNvfqp+TYPtCNkh0T6+J7eMsbyoLKP5IHrlZkaYsoAOOrGao6CLW2qEYUUq58aSeYF0ab8KIsbrw0OSq0X4d6QjOmaw0lMA82xHFQiiwMymLMR6706wMzMGPvTXzxqrSYNIfTS8gqev3gVTz79gvdUnXMyHmHXXHcKeb6eRub/9y/sxqmjB3HqyEGcOHIAJ+3zQO8PUjJvOaLcT5rXkmE8HlkE+bo3PIq19Q3cvHMXV27cweUbt/HM+ZdtLvLshcuYPPn0+QoqES+FJhqsbQ/UA2icr6YhDhhwrd+etLJzUH1Btt50T9Rja5nE+4AjLzt+M5WRHhk6t+nshkFRRJfEm2rX+ZZ+h7FtUwaNSBkwvO6pIwftDeHefXsPpHUtr3ZAaWouzuL6xiY2Nldwd2nF+SHHH4lgRg9wTsbd90l3LP/owX148NRRnD1+GKdPHMHZekLiwZNH7WhQyzH+IjJo+cxkjOOHD+DYof14A87gG978GnzP+9+BpXuruHTtFiaWtRRf1iuaUpQSUmyzaRo3ixfxjQAAIABJREFU71+Nygv9XU3dZy9MQvrGT8yHteLmKwp3+E5lsW8dWDVSlbm7achPRmVSGkk3ZJ/z9j02/LkAVh3pUtMj1UXvD8WYWFkGvYEAGGYcteDxV53CZNx/tqO1qtjSv6bJlhGwzhKPqGOKKsNWKd0S6upaL+159sJl/NEXnrG6CgqTyRhnTxzBI6eP49EzJ/Dw6eN49MxxPHjyKHbNzWCmOpR+smxDMgztr8zNTDA3sxeH9y/gzPHDvA/hw6UpgaOYvu5ePCcWGuyA0LTioYxIiio0mPkYeXA2TT9UYSW+/a0fDkwYqstpkW9u6byaJ54aJ01hltZ4WtRLZdBfXRKbF7B+SvdG9KpPm2/xokFI/2pqWus3ZTD+NToUVyPx/+jZE/aOqE6N2+8xuRq7OjcXl2xjzzfElUYfkX2cq/6IH6kIIDRG2NLHhQXAFja3NvH0Cy/hmfMvB3DTP3559sSR7v962vqBY4ewsHsX9u7unqNZ2L3L5i7ZCXu8JmeZqFYLGaYasw1HUlJPeRzdG5Mlcy6ztr4K2dFyHX43kRmxstukh16EsJSHw1pehrNopmmImGN2/HF/Ka3hUFHUiI35Ss9cpt9ceTbStX6cwPVkCBFWn39nLy8Fr37wFMbj+Cqa7XLzXH7j9l3cvrvkPChYBVBh4ycZlB8FsBBd718GQLC+sYnnLlzBuQuXHagAzM7O4NSRg3jgeHc49czxwzh19CCOHNiHowcXcGj/Ag7v34uD+/ZgZuILq61oUh8hFe8X1WvTpI/MJCC8DyAqAlBZVjIQF0oyUhWvFCavEIQcnD8ZsVqeoQZV+cvOwOgfUyyE9NBQO0dEUq5oH50lxzQP6PUddAJSNB3ayc+79+ZiQn1TlFaNz++aw+MPntw2rWhdOi4ra+u4dvMOVtc2+ilzYMdcnXQKFNPBMA7tJEPIOtCvs7a+gedfvornX75qdMajMQ7u24Pjhw/4w2oH9+P4kf04deQQTh/vjpEcP3QAc7MTk3li3kwdSOjUPwoLY4ZIvGsYNAOXlB5FZfqKSuxLHdTuFQRn6oFrdlCl0vqbTyxrcEgtQ7U976WHotUwLZ6K85nCSCMKKaBWtA7zGO3H+Q7LvT0ZAjsIY1kN6aEHjuHYwf1RL9I/umGt0qT17vIKrty8XfvhQdcP5c15YmDK0QJZl1GlTRkskS1qh93SewAp00X3ZWNzE9dudidrVW+j0Qi75+ewf+9uHFjYg/17d+PIgQWcPXkEj545gUdPH69HN2wuQGGPeLI0kW+kCvZ8h6ZalvoV30vQ6lVAdbyewRUKoyyvAi2ykXaV2oZbP4lWnuOE+QKK/ZGOkMax7HWAt412zAN8sAvUAIs7otJj5wwRYhsZQiqm95yH1z18Gvv2ztvYMK/6PadSnFLdubuMl6/dAlmJzeNEFBTY6RNiAvwn/XrgYExvI4MEA9CU3pSCuACCIGv9AaBgq2xhcanbU7tw5UaVoXs4TpeM4zPV2RmQjc64rUZCp1YDotZ0B2nFhgzaBpel0ElWcoYeyjIyVT7CODDZzL6RJDQ2unEeI6Ts3nPMmuYY+qV7WqQ71tQHavRsmga16e3FJBkUrNwx1WDqmIjgTa9+VXjeRctb3/U3G+O124v1XJXza9mgHaWmsbRI4M7cS69NgJ1lcAQA+I9RMr2wqNGjp/XiONgq9VaXFq6sreNmWcKIw154k0bgGjUXFEsVAvRph6XUkJiE5xDISjOBnI4oP6VUbWkOqf3U8nqv1N/FQlm9Vw0qDgClAyA0Np7Y+Ao8/LszGB/VEGIGlp2mgP4IQmBD38xnLBYVraYIhbQ/IEP3J6cQh8LsouDE4f143cOneyd0+eLUKciH7tU6V2/ewYXL16uhueydVorx7gAAu6O+oiXGG/3NkZ1kIHRKWy26vFtl6NVzeyk6DvchQ91VVxOnQWclATaw+pC4MmNOot8buaLPEYQEd8P1e0KoLoGegTD3UcO8fap35TlLQq+Od17ZoI+MdMYLyUQ278unhFSEdIaeJqeSc7nMF2s7IT2UbWSIcyR40K2g8vpHzuDsiSPB6PkzO0JO91bX1vDn5y9heWUt8FwbOI6Tgau+LA1Vsya9iYKnYEcZHAi7fhyvGHw8TbdxKWruyrfclwyjbgGDI4GPmr2WEoCuiXsa43Qtn/bKwTGYuKK2GnKeKJozEt8qtAeGiLqwNmmtWX8T6quCmNXCfLJsJX3PUQIl0kcXS7r77DgUzYo6COuF+lGnKj6UQzJwxDBIq2M/Ho3w+kfO4IFjB3tzB54zdF1K7zcA3L23iiefOe86rvKajYS3DSONmY5H3jOpsguB6oAMzIuNS0nlqjLWN4GqgeJ9yjBSm+zstASCYvHHOQlKC06hCqgEegPcFzbMNANbEo3EtFWIL1eQKrK1ps65KAGYGwlo0w1sfL3OrUOPqr5ZFmTIjlkVapNpLSM8UHWYM9HNIRmCxsRrlFJw7NB+vPGxs9i9a8544bEbWnplvheX7+GzT51ToaCbs6IvJO4hI+tL+wqwHe8FC+7LwEBFOG1dsBshfDd0DWB/PzKMNH2IhsaRwRGkQ6fIhpNyoQhM/R55LTNoTQWInVJZL73Sf4oZd3/+k5XkCMhRSRIPbiDMs94X+BvJGaEdnXQ+FBYjWBbhMSKAqOXRzolGSwYCKuekq/PomeN486tfZfc4Slj9bdKnrVJw7sIVPP/yVWjEEusXidHsFGbZSYZk0UpvQAZWgdC/+pXLSt/oEhjfnwwj3fSye+YAyl004LhrG3M65UztpKdwZYQHgCa+xYRoISz7ixpDXU9H6Rl7aJ+912RTfTkDOvkrlrbQmJXSTcqonoV+7iOMuVhbcyiWQ+tlmxr6TTJYpAECIMzNTPDE4w/ikdPHuxoS9x2Gdqf52trcwv/zx1+sf0qg81Y7cSDxyEaMcmzcpV0HBXa0fkAGjRLBFgqXw8a+k5H74zZSJ9L3J8Oo71geHYrob2ebJzMhVqTQUNKIsjN2dkSQKkQ3h/JqcGZnGkprOxFaopN68KJQtAiwS3k8Iz9ttNhGm8lEBwy1L6nRlK0z0dNVJCsLwOK89TKkHDW3kcEnri5DQcGBfXvwxOOvsjebuyo8wuT9hlxvZX0dv/XJz9NUJxp3S5zed5FoBZwCivPQkkGjhPPmNhjmPgE8HRQ1awDwimRovA9ald8NqJhnwTw2CFzHXcObejCnWb77KrVuRHNLXSoRS8tq9GDlQLIh8P/Urw52I5e39EXbG7k+X4Y2lfcQDXj+o11pWsS5USGabCKFNuGgEV5hhhxqQAaPqDwsgl2zMzha/9jk0NWaO7CTfOXcS/jzF18OVuOGmHRkTgYDJaXpsrFTe9mQDA2O3cisM71D9etYFbWzBEY7yWB/MIUn1DpGPJnjXNcGw8KPh0pbPXIOXEadsErrnt9XRDD5ya5cERLpsQ6rI/TSAmOthL6lkHzGlxhdtmveuOtM1vkUU35yRFdjdCKw/ORo2k/LMEiGgMYqcyXFfzUor8pxCtU8RiGCj/zen0Q/DIMARCOOiY+rUdwUeqkI7VU0ZGhdeQUxsGagLL3br0SGkZWXdAISDrxxvZfpO1KHkEsiY6B+MAAzbPZ0CQ5QkhCc92uY8s0Zdkrqk1Mc66c4X3n+QXOVbqC8vKA6EvHgrGj/VYNFzSTqI8ggAgjJEAx5exks1aqGvryyiguXrweDbx3VyJc6yp2le/joJ58kXfAYlF676Nhtc+63kmBNWYZ+OzpuYv+ShTVwKGQa9ynDKDqdo5c1LLRuS/870LJxpb7UUFoCcghlCNbONVJomiWRv4jilIsTHVeEuG2bWG5YXa3YOGaHHj2JYp0fOw+O6dkRAAnL0nVWZOlF1bOlQsXlM3p9GfhytQhuLS7js1953l883EgZWt9VJ3/4uadw8coNQ3WXAT5WKkO+xO+GYjLY3j5SQwaOOmHH2r51+jENWpVC9eQVy2DPf/v5cw11aoidUYqktImEN2nqvSAYTeRcWFQDSKMr8HydL4l1TAP0PcwrOBJWxzOHIhkrzHtwqgJ6qKdIo/dMhg7hnFXqm+ZMHRkfUO1HFxCcx1q3+KKFB7m2DNpvTs83NjfxR194Bn/wuafQsj1OmfLkenF5BT/9qx/r/mqr+jrLZ18jwvPVO8JiHaso+V5fBgYDyVEnoHzUFTuT9fkKZBgZmqoxJvTUfwutAESiXtUnwVSFo0PKAdWDC71tTm1fJ6i8fEaEGtGifrYmxMEoCGaF6CbZObQ627QCp/WtTuQvKj/zpewK0VKemE7sqykDUopRZXjq3EX81Ec+hqfPv2TzCb56x2oALC7dwz/7xd/CJ598uvtbEAQ6wbEkF3AGEE/SBq4TYDGWt2Swytl/xP4Z6EPi71cgw3ju7BM/1t2n80AV+UQiU+YenNL0+CRm4IOsyBqX2pQiRQXhk6USaRppUlKOEgES4pKpt1UZ6F79HlbG7N1KXl+q4/vEnzYFqV4XfMT4cLlMUTZgvCKl49T5Ox+xaMhg6gjZOHT179zFy7h+6y5OHD6AE4cPhEcqQeOxtVXw4uXr+Jlf+zh+6iO/i6s3F+l+jEw2NpR26DKzL4EXlMaL29xRLOjtKEOI9hGnK510ZF0i5r9SGcazZ77mx/pr1dy3H+y29WEVrpTGA/GBnY6eEfBjEkrRjJEQ0pboLO/mdiQQnEzPadjgA8oQErvlwVMdgwSiVT+qLIEXNQIy1vhXacjZrJ4DgsoaJsCge8RRTwaI69SONzt4bdVI8eVzF7C4dA+j0cj+Xp+I4O69FTx74TI++qnP43/95d/BL370E7h6azH0SaLqiBILOn7phLMIgVwETVUJO8p2MnTqKaCz5M6bDjnpN/wRxb+ADLLwrg97QsBGWb0cTKzhgUrYdwzj3TAlKOyd3ie5I8AGC/+Zy7O9Oy1xmNX6itq9VAvu1MWNLm8Y2Z+BSnriyNHRQd0EUjrMIzOK/n0g9k31WGCWwV72RlWHVpD2zM/h8bMncfLoQezdvQsjEaysruPyjdt49sIlXLlxp9emf20jA3xsG2xvQ/H+ZeiXF4sSodP/DzLI3nd+uKiXSB1U1DdGlAB12hrJ4xInNPi8fNsa5DD5MsPYRjI2Hq5nhtTx7nU9tjUjQsdE/MlDqjQkaa034jB0i/WobYg4mR929pL6ENdLkkEdQuc7OSVxMoXK+3W0Jt/PV8xWdrK+lNtoi+2caEpkGFlupWlHcYOgPUc73h2ioKKh/rQJTFemO5F9VIbdDzwJyFWJtADdiweKl1taBfhEzstMHvZeyzOJX7oHDcPMl0j8ZJGL0mT5WVYSoNemhE/7rsZRx8L7a8hQYH7CV4g6SrPq24/hlNAmIC031fo5khePlP25qZ9gsPZ+M2DAtMkw8omvHpKDDXLRmrpJVo2Ppedfzc0ejgAmfcmVTPpS0spwANtOk72d10Y603O0nObAfMD5FpWpVLm9n6T6rp7ZqCSbTyPCY2RdOWgoRZ9DSKg7JIMBSolyMbfS6y8QNB5baYeBQ3b02rxPsy9fhPmke2DqZBjxLrReBsRkKLb2zl6llWu4S1YDMy77qZBejUDblu6en4Hi5Vak3JEmm9oWzpMhSCmk26wMktl4pwHIiK4R0groJvGpfYRJWzXkjAHB2EkOu6cyWJ0hGTTi1YhjAKfNIkgVe0CJ+2s4oMneL7dzVsKVUkMCwG54lS9ptJkeGUZsEJwkOappaNF2FHREU4xangcZtggXmcroUBt4OJS+MwbQJXr9oARdzXHspTZkfeG4MDHnswodPKGoRo4Z2vltllezMgMP/nSJ4Gd6lQ5HnWEZQscqe/Rm78VSXpalYZyBZAk+b+lLzzG5OUeHsIAe09Te9dWXYeRnxfkWD5yGiwpQtLKRiTVkIwGDVPETMA/vpV0kt+bO2UEs3DZ5qM5BYbYAPqGvCgtTBNa19dWgX2K7JArUyTsHJxoc4fS3tHZ+yaMaMiRm0DcMbePR0wWjZrnPHg2B60iavbeb+zh7BNeigcjyVZZhZA+sFH3YBoij7J5qUSI7bzBOQuA8H9D7QgNdKqImA++jKDlWsX+cRc35M09UZkvDAHTDplRjj7vBjGaxr4D0pCc+qOe1SVEqbuCTz4glkChVfyZbX4augA2E+eFrCJGBlkeHVJNoOLj7KYPW5e3FPvI5OeHUaIpkGHnK45MSe7WistUwlmFeXSjJqFeYeYpKkuvAkbkVEUH3+Xcjj7TDd+A0TPpNaorCq1D+qXGTdqR77Hjfvoxod8mQpXv3VJXR9J9407+/YWnZgAz9yUk9n9TjcOjqt2+BMHcZVvu4ZYoCnnXwuDjie/n0yDDqA3E9xcnHFhCF5By+F/okO2U/n4uM0m8yRvfkUgMJG6pGssw59VfpSeXRAbh4XU4srZl7oL7KxCrxKww5eBAa5eClSO+beCpWmjAnvgy9tpEhCE6A1Vt14+jDbVmJQY4h2soPDRIvRgyUc8rUzJSmSIZRH+z0aAZ15GEkZkvFQ2F4loIdJYeuxHDmW5m3rEpXn8jTSpH4FpcqVLcCRsqx5ckqAuX84Z2p6njGAB/LVnqUd3LkEpATikVXIceMO9qdcxdqVitFvgzBhmXwts5PSaPfpSY0jmGyxGQUcDxy+x9q6WTyY+muBj8bSYsCzqzrhXL4/sR6emQYmYOQcbgxeJ+F7nX0S2SG0qSAZBziszNoWLRQSwZKUOu5XnRKdx4xJdxXmK20+6dMnV+jwxGnR7w4+oQFCHJKks9JSjLqjo+SdToIpwj6ccJVV4F4HqcGzYygzcsxW6uKeGkvPa5tnKw7gW7YlimUYWQHs2gC2f0U9+aS7EGSddSfnkrRKc2wkqRtiyPngMfb7jN5dukZJykqfzJaqYeR43j+LlE7pCyWU11TyztkUf4k6YT4VDpCO8wZxer9cO4/TnDaMqSXSLcdKJup81hCUTYV7TLS7J89S22SVca6hh4QpKM2UyLDyCaAhGoWtdWrq12bQwf6bipuk25kVp3bNKJFXCHKB9zo1CyovvZTFRnStJQLFnpE1pd2OsH07SIWqUhxhctKFD7jYWG+VGm1rPmcQP5kUGmBYJaBnN9eJbrttSOEwgBAuwkAwydw+238+1A/UlNaspYpk2Hkh+L8hqgRBEsmYyCn6qVHhraApjO9E7mZDzVgRszIpwkTbrBuOWRzNeMnnpnnpT6xRhLaSFVeId2oE0qgDQpWZPQilrPynxf2JUcKa9SnpU4ZNLIM9V7J/ISmTMRXu3rPtKkzcmBlfhpPrTUW1Y1YbyndWGg4/BTJMPLB6AtnL/yundFH/eFOwKsoXWrug2pr6dxLBhKOFDm8VAYcgVUa1l5sZ4oxhvt89jqngGPyAQYYPhBRJ+Gqssq2ilM3pHmDReS4gBDbJhn0HqWhyp8al+MJuWvpq98E1ZdahzRDAv+2QdpUAFwGSXQk6WMKZRjp5JiXVwv8vKt2K/U/fdS01MGueKhD2+vb1u7tVjXk4J1uhsW15cZS21jgaOSEdLPjtyrY5kDk9IUjmTmR9+yrSTFSeSxhmYLXeuWKhj6YfVm7moYgDQOjgW3JoHpJ9UX7MwNk+FWLK15U25q5FWpnLQaiQSvnb1atvAY1TZ8Mo0Lhmu+pA9dxJaE0lVD6tOWkS4QmLLsMG664ExYVg+rzfEJpVdpstqGNKcLr2nKfVa/OXVxn1jfDjdCufTEx3cs5pbPoxQ5Z6VOaVFjvjBxAGqZ+2aAMpIP4PfEY6jAd5bPEtnQ7PNuMHZ43UBwhWqEmp8VgutMjg0WIGF7IK9A9UdYZCB/m00+NHYnxEn92/JPVUUrTY01XXRKtojQkF6KBVKLg4yRKHqwSx8eBpy4jFopwDf3QIMRxrjOErCceRIoUEgioCsQdcxsZ+srrX1E1HImpr9C5ddQzSl15LLbMLNZHWrk2WmysDgzTKcNI/+Qup0w6kewMxjfqWnwra4yiKm+Qga2D6hjzbNQhIhWrFx80UufSB4eIweI0CURq18X7yqgf9eMRxin0v/NtUn4+PCbWJ0dJoZsS6Vk72UaGoCzXRY7oTJPz8HzFAauglG7yCqAxMXRUolMwPxseMMHITo8MI5vsMnBXBpSvYuV0GK3S7wZJHOXcfvu6oY6CcZtxZqOQpAmmp07AkYQjG9NmRxOqJ+keOUtuG8INaZ1lCJEqy0eOkHQReSR+cvssQy+0UIqoPGT1bYfG2yI1Oy+SQQ01vI/Op0yGkWJZv/9quGZjxFhGf/7FyMWD3HuegNux0NnbqNRWsTrjCs8dIJXB67mjMZ/Jbf11GgiC6rJrP1eMUSkpe7i/ThqnqW29fS8dHpLBFNO/WnPdXv/tW7X9tgR27OM+mnsfUyTDyHKtXkbgnuqhWqB/UcgdO4U3wF5UYHMPEQtzQ0YeURscluBHLPiVNAiRgXcTzJmFf+lddRzqmxkr4C2K+qFPfUGzgEQXJkNRGYJeOCrRfaNSXJdofbZl4J+hot7OixP5fhaiAPpXfuIDPdSwRSxfZaDcbqd7UyTDyGy6xNwtrrnX/9TwhDNkQi/O7UTHPjtCsf6sNqFlYcfQlIjyQDu3xDKaE6V0g/rxA2POo5FgpUt9eo11ojYYDLfYBqbzofG2epVFLD7Z2v3T26dQApbfOgAMyWBOJ6y3TgZzzPqdj9X4+LWBkN+20t9ENCEgZAeFv4S5l/atPbolCwPHlMgwKsoYI3fp0LeYkVUjpLxfghYQDCdczC8bgCElQruwEgX+SuWFfppOVdHqSPpViAePKODfgEU+fe5bakTU5xFC+0pc9zNURYVDS0CvtMMQutd1LBu9yqIbzaAMKndWeon9BTMIE1KKioUYsy7UuTMltgPlk7CWh88c3HvMupgmGUZ+uyJxPezn3ldXmUKaZDxUBdCsXbysJwl5Ru+YRagXVKYe2peJwkQ8KdtwVCYn+koT7Y6MMfNrRdnT4Ue9A9s+QMZXdv4knySerYwHtSGDB2d3mn5dQmNKN4kSySD1e0VPbpuNtuHh0rvHqzmpPYHCNMlgDwj5J0UGSlWK9B6D91QmpFDJc5MCwmSyxHuxjMOnCuk04+50oseRzOYR3taOzRty1MhgPBYbmJzvhoUndQApoW04tsL8soxGW0zXxlKhz21kMI9VGYTq9v3X9BjvV4sUP30A8Pur3LRMa73VNuILfKuPLv5cQyyfFhlGvPrJ3sfnZYxudtzgbKkD4QpKx+nzA0XZd1TwwDS/GS/xF5mk7/l+YtvzTD3OrTx2zm/pSuWHWGPBPatUvjj9IX55/AokGjojo0YmH/tBGQIjVq30avicqCGDkabTvazf1C/z3Z8gS39MVTai1V4B+urLMLIxyGHdEnTUQXdDgTLFzpRzn9IoS6L3lki9IUkJNxJNnZJGQtwytovfKxF19DxVNGydJHuIVbRnRYfgxtHABYFOyp2Os6X0uG+xl8RRbLUIUoZlYGUG3fWPOEt2cKptB90kPeSTwJEswnTROgLhiyA+pp7uiP0OIz0lMtgjpIbY8AeEzNtoMHSVKfiOcafeGG/oIb2wgSYShGsHCY0KVb3CivKcQkTSyV49d099atBUxw/KLvXV9d0cysqMx65zRhxhGXJqkMjXaG68ijk1Db7mWNRID1cOykBlgDuu/1Fyr6JL4FRUAaAkGUrQLe/1BJtlYGrEq3gpcjIM9g/0TYMM9gipnbMvjq0a/jWtKghtA7Phh9lrCfeLMaJIR+FTktIs0hUimw2PQhQz6CxQqKTwSeVhqY8iRH5bnK5tW58JvdzAC2zDwuErKqm4bv25AR0hqPK6n7r61ZIh9A2jSSHVVNOEHU7vlI7Ee3xwktmIz4oM6QI12+WTywJ7g+MUymCvoTE1K2IHhE+MS/qtdRJzIapYLTfEsJipEhsaI7ZNAJqYolyfBKayMHD0vSPbNzSxZdgqYxhEOsKiiOad+sA7tQbfJTp5SAPEfIrl78tQNSTOQRSD9F5S1NK6xI85KYFBCfe3RUIirpNnH/+Ox5gu8inUaZFhxMQ19+sMVKB5NvtrHo+wmx0koe9sq5xLsiezzWRbEnVEQkvVhgDIzmAhqdTB6fkq7Ub7SlmIOGTc4diKtlH0Vk9uIYiSUx4LfWeaNrJebH1W5lsyeF+esxu4qPxA1HUoZ3oMZE48qCQgZ+038xNcodIiHmMqGQFqGmTo/iwvR3Nul4zfUL0o02R42og0YdEfjUuRlzqwsJmUYZs7ahw0qdZjHbbbXNMeT8NKz4Yg8F3mzJykMnW60hdEeOhLqm8RINNpKUM7zn3D+m7JED5hovedJl09FhppGBPnf6O1Zrqe2DR5HWJsimQILyrrP93mZHSeoTN1oxzy/xIZY2NiSRh586AnZ9Bowmv25oyDSkhtmB/ro708GAT2H1BnD8c8ihoB/F4ICyURtUbkyH1c8T5y2yjD4HPLqPdS1OKoblPbUs+ahXrOEO/0lsRPUVswFbgd9PdvSuRtSmWoq0zFBTLmnctufGvn1ZBtkqROot89QfQ5hKU0HkGMSY6tnJ9ZyiJ2G7kPXaWy1aoS2+g/hfowRdO8g/0k1XVeSKYc9gt9N5kI6tgvRcm5XJZB1XZCegi+lWTwP+rooqsMAoqkBeDHWXn+pqPJRqlvLCygKEg8VyKw6Sq/OKDqy1fk9GEp51X0r7IKpk6GLkLwhM5GoO5MGxp6CtQL/SL2F4aCZOAyuLcWmCFH1CZn7IVMMcDtbepYm7RRJCkKFFcQs1qYT5atpO8MGLWwt8gAikzipS67OgjrhfpRpyo+lEMycEg1SDNAYSCKffC6u7DDa101ahfZjbvQbnA+0h/GTMdDghq6evVeAI/pkGGkNlk4nDCK2US2BEYYGYOQ2lFvgPvCxnSL2ZJoJKatQny5glSRfpCM6Tn8EIBZvW5DzGu68fU6tw49qtI0ejibAAAPLklEQVT+QfDDvIMrMNQ0LXcy5AzT0zy/OSRD0Jh4DU8DyNCC3qMJ9mWEj40LBd1dF15MCDSYlvIVYDveCxY8HTKMNH2IhsaRAfATl36aKXUdhCIw9XvktcygNRUXXg3fynrplf5TzLjz/KevJNrhpKgkiQd3KOZZ7wt8+ZUR2tFJKs/hUBvLIjxGBBC1PNo50WjJQEDlnOhmoTcXMC1mV0gdSXsByLq+xPpFYjQ7hVl2kiFZtHU+PTJ0f1IrhTXfnVWi3oHmdYqvDvYuoNoJb7xZKlQAn+gQc6a/Tml9hGV/UWPQlx+UnrH3DtPxp8mm+nIGdJKnR1SMpPItJdSz0M99hDEXa2sOxXJovWxTQ79JBos0QAAERdigx8LlML0BCmJO2NsI/A/q0MqdDK3zR73HozmI5Xr6YMpkGPUdi3aJRX872zyZCbEihYZwvoi7ELUjglQhutoX3Vex1bsLtQtb9lIP6RWKFgF2KY9n5KfX3GuUFJOJHtjRvgSIRy369ApbuUaXrAxNMStwhvmcxHotGeLhNTYqOhIjzqeQXlVvvDmGql9ewYl/W8+qNMXpfZd0XolTQB3zKZNhxALYLYV4MxBJ+S0JXMddw5t6MKdZth1fnUaIceXTVyHicprWZweJSuT/qV9Fg0YuXz3b2xu5Pl+GNpX3EA14/qNdaVqk8hqPGeKVXy8S4is41IAMBgzEei9t0DKhe0Qvr7roWFv6HCavaohJRzofs4ip5ArJJj3WzGGmSIaRFuQDUCV0VEKua4Nh4cdDpa0eOQcuo05YpXXP79uJSL1HduWKkEiPdVgdoXcS01groW8pJJ/xJUaX7Zp3rTuTdT7FlJ8c0dUYnQgsPzma9tMyDJIhoLHK3G9RVcLEEzQaoEnvdk8IBgMrjomPq5F2gXupSAkp0rTIMLJyerO0phyKUXG9l+k7UodlMBIZA/WDAZhhs6dLcICShOC8X8OUP3zCTkl9copj/RTnK88/aK7SDZSXF8CfIixe1rGi/VcNFjWTqI8ggwi6Z4cdAUMqsI0MlmqJIObw/s1X1Yzh6JfJh0OUtu+Rql/s2G1z7reSYE3TIkPYqealVGtYaN2W/negZeNKfamhtATkEMoQrJ1rpNA0SyJ/EcUpFyc6rghhe69iuWF1tWLjmB169CSKdX7sPDimZ0cAJCxL11mRpRdVz5YKFZfP6PVl4MvV4o4nUKPIYNXRlp6sheqproVk0H9IhnyJ3w3FZLC9faQpkmHiUaNSFI8DOhcofL8hvEkj8WvrWQdeDSrWl/fd2ktwQcmJeFakfFIKZ80CD37Dj434RBqsNK8I88gWzeA0kY7/dOVIvS8gWYkey+9Bri2D9tvTFzlS2Ak2Nm2EQj9uiMR/CQ3pa8oWuIvWGCo9oBFFpkeGkaFpNcaMnvpvoRWAwBjx75NgqsLRIeWAapT6MJL1qEjI0SX8pRk67Be14RCqyJBy8xBXhegm2Tm0FlKoZ1MaAbRO5C90+v82dyYLEtsgEBX9//9MDlYVDyRPcov70tO2xCYo0GJPTrkkbgFPyUQ6nddVhzVKjDl+Vz8DX1LtaXFxh/yY17cL4M/S5kp/NZ/8mg6/CqQ4oqs9tQTU9PrvDcjbeLog2PTmc9KmWB2Dm2xvKHS5mtWnvrBkyr4MHAsR1V6TbLwKRjk5WhZ70CvH/MKlEJEpuBTbQYIrUhynWmN/0cE/O3xq9a9xmjGafTycXcnFJR6Ct9lrE8b8Uxlf9JvbO1Csxed0+M0I08pA8S53laOGFM9rFUlqDz37XkLebaxY5aAyqsoe193JvLfa0qcM1VYMbC3dHI2zeF4yjZ0Z9uL1MfdvDt3DewSb20nf0pXjoINqbbf7poNsCnvwhHKAVr1qRDaWaCVbHEa9gTPgXWis/1PozEVaJ3gF5PiaDj/WbtpRTgsRQKutb5cEJc4ZHEa7ll1Wja+cnenx+K3gW4sBk2ZQ9I/SwsyBICtWHbDbQS1BBwhLltyBqQzolB6xn61eGxwe5fSKmKTh+dm8iXyct3ke5AZ3HTj5rmdXJvyGZe43Rjk603vLtBScTfj4Ze0p0Ede5s8m/DUdfhpc+9UlO5tQTx24rswitK3BCwptNF24v3EghiIHn2j853HfZPZhxshG4f4D5ZNLTtCIPhqrbRQWw0IefxXdPpHM835DvQ0Kl//HduLt8nzr6R/NCfdIuNSrPtzslO6v3qtQr1+FiZBN9pr6NLe4BslXdPjFduZCTKWdaAOm493K+CVpzzCMUq9QtbKkDHPsXgakI59Y63kJVSKPhv+uiVxdsz5EDZdfkLdZRYftIBcn7JRT+mPwuKPd+8SlT7Zv/60susei+F10EDiMKGmlu2guOdoMxmo2TzA3J83EUIWrglVNSj9WAubnm+cU7kM6/Co96ZDc8iCnWmqTLJDOtjYtmUytVqFGwS6QD7Ixq8zE0JU9UaBv8GTr5785P8kaGGU3yuGDfUSjxvHRw/66AwiJHE3TCY9yGU0xb6ll6p5p3nQwoGTXi9LGwa8RtIwFiqv3vc21dveT5qlfSxHT9mt9ToffPJO+aW8QroERAgejSo2VD49sNTY+dHRaS7hcRtBqTTxn1dsJRykrs9DIROcFBMmEbacxoLNlxwBMRFeG9AXc5CRr82iTtu3Ix8se6ETQw/ekg9u86aCMtzOOAU7dOkil50/kdwlA635e92pZsNHoCAB8hldyxaXPd3T40SHaHN22V2pRPySdwHl+OtGqtmHm6DrRYXeodBhnMDbQBb0zKS2t5hT2og+8rx0XhnA1o9LgBbIaArP1q9vU13PgRwgpMCTecy0q2bLOuw6NsXTv0VxcXPJSl4tzNpLZYt7lyxGY7M7sIIkAgrdB+4gOvzorzlscOKWLDVDa2V0nsYtuULBp1b/XcoQfZRf0Vu08A8Tp9irDDg6k2VyrJvTbYG2KQFub14V+9n5DlaUgfwIcNOaEPxTAkxgi6qLDEGadjqE+lT1LMXSbPA8ascpGc2nzr+41zpXBdekls/zPOvy8BJnacFurj3JFqrPEDN7mnEDgOR/Q/cBA50bU4eC3pYhWikwUUM0/ZcI1b3St5ZWM3M7el2yJZp1XQ3rYiQf1qjUMJXWbnDwjNkAit/2s26nDc4EOQnn4eUPktW4R3UpN0Chwr1MGt0/1D3/Nc3J8XuFLOvjNfUazFELCGS7O8i5rKRUT9ZLCIyvFbLMKmW8ZceE+f1/qSB++WyzD4uyySxSuQtW38qaOep82aCVeS8fPxXLk8P92MOpLX/LabwVxWfaiwzk52c+jHBK+fc7+NxAmy7bax54jC1TVwXEpxK/r39HhdwLxPsW5NzrOg2ZATv69eJ+/z3quC4rfcMaK5NyJhI6qTDYlB79NL7aMBcBZbVlYultFoF5l4kZ4sq5lIqDRTF5Ceq+gyLfnhHnIxc3INx2a4gCsY9WN2Yd9acSmxxttyYNB4mLEy3WWTNdK6UM6/E6wCwAW0WgHBvllpUKeJ9EANsGO33e5JbyrKp8VqkjLjBZnMtizAgbjeHlyq4CaP5itFHgWgMeyRQ91JzNXLARhOLsGArOCYdtq6XmKsrmzFuSuTHnXofqWPDlG/ylNMI5tskQyApzK3N793fapXeUyQ52NxKJACVt2QQ1/Tqy/o4Pf/k3nKGconol7D/3swqBMakjGFD+DQWnRqRYOCqjlufZmAwdP2Aj/Kc1u2ucp05LXdJhxDuJZ6NMWIBCU0K9IxnDqR47jwOQrnK5mnyK8bdWIz3G60JwIev0UZqtpRF09yuPdp8hWEGjDNj+ow88HszCBfH7WyU6P8wIVSrh/VinVn6nu7eR425FfIt67z4jsPJwThprfRCtFGAKn6vfo1oGxqKdCU9cfZJF8MWwCOUUnsMM8UWzfD6639wnOXYd25Hy9BNB005Ix26XpKmLZafba/tJneGVva/RYsfqJ4q/o8PMEEKjmrK2o3n7tgG70y1XKJ8vJ3Jx9LtmirxCxxltLKbfNvbBKJUO2Mm3UgokjyrW08yimt4s4U8FwyWvZlZ94mJRLRtvXrs8JzG+Cyg0Epw4Ifr9K9M/Pv0LoMgCITQOYeYar96m/3/jELmnhLR/T4eeNDoSa3ox9rDZN5EuOaQ60XUvlDB4YO/URb6PtumYMplzfoG2ZstnM8oyn6rDUF+4UrY8O8SVsoyCMRnshWcHpo06kBuY2teSItAaeLp0maEwd9r2c8rSuJFKrXXM3ycHIxEp55lNu2fB5fNRnXM61jGojqXxFh18NxqmcnpXPzQxf+0cFAVdRntK8BtVr6eQygYSZYqaXLUAhsLSh9Xo/G8YCn3IezJFwrN9aBgw+8ESbtM/WNf40nMIQ8wZn5L6A0PsOHXQPZajkk3MVniBc8zS/FdVLrVuZEU1+b5BeDbBKhxh0Ytjjgzr8NDnm8qqe/6otdD18EX7UNPdgbzzU0B686+k33dqO3KKz3DDLWuUsu48Tx6UmxM1H3m1gz4EQ9MlM5iAqzrWa1DMVjzfXnRa11XijYQ3mqevT0ghycTAM7E0H2WW0D/GzAxJ+5XFZl3Zfu1uin3u8ZINbzX9tumVtZvqeDr9EuuY9BfAeVyilUkL0seWkJUIry5Ch40YFYUoNtOd8QrQ2bbpt62NDVFsv97n5Du4sm5k34Sawa59Ws6KcJZ2zFwNy00eZlLQ7kWOtMUzntVcdYIP+95CxtSEdyZm9L24XygpgCjznp6Y/db+1ZFm8SPc7OjhD9PSCqFjp//6YCoQmm3LHEDz7z0d+eB1KmkM0rboMWikaMS+uC1KFwKdI5Bys7ONTwLOXERMZ7mIfDEIf5z1DmHbiICJTRCMgE0QF5h86nMY7P900zMTg1Zib0eGUWnlMLzOHeYyVa9OisxYwfFOHn/7zCksmTSQfh6mNupvcEo0oKn2bDvQOtLHwdOqWkdLt+oNGCi49OAQBs2gCRDbrLF4T9bt9KsMUhfNv3obx5+GxME9mycDN6PTcL/7QoRmrbDEzOmmyDp+fPmAblMZNrgBaiLejEo+B+Wx4wwST/Y4OP092CdxbAMmVvo7DaJv+M0hRKFf+e9oGjJpz2zmnU8SwBOkpCJhJmNlIm4EWaBfjHoJl9m3pBlanDi1TTf0QCMMWXUbIM/tPHY7UghJRMkzz/YXGfyI1g3cNh3rr+B+Yf0yHfwAjBO4Lyccm/wAAAABJRU5ErkJggg==","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/jpeg&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/jpeg&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/jpeg&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,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAXEYAAFxGAHswbAIAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAAP5klEQVRYCcVYCXRUVbbd772aU6lUqiojIQEykUBCEoYgIEIYTaKAyNChaUVaW/9yQNeXxpb+jf3boXEAJwYRtYXYjoAiIGEIKEISIRCGIJCJjCSppJKqpOaq+88tCCvYSNu//1r/rDrv3Tfdu98Z9jmvBPz7ItIUXAVSdk1pBx/f/H8IByJOmjRJxhjj45sKv/bpp59Kt7rnpg/+myelVatWcWv1Fz0dpJNOI72LdCZpGml/keiA68++UP+b+49/6QN9LuxzWxhNMpl06sOPPJo6ZvSokJCQYDcZzaxUqdq1QUGX0tMziwyG4POCIHT1W5Cvx4HyeXg4/FP5JQD7JuSTxZIuffiR/1gwbdq05NGjRiJIo2JV1TUeCKJXpZD5nfYe9Np7WWtrG3M47E1mc/eJ8jOX9nxc+MN+4HRbP0QyGnv7Hd90yBe/lfBJ+qz22/nzF76Xn58/a+UfVphGjhwJMpvP3O3AsJRkmRwOeWTSOEWXV6fwMJUySGdShhqMYYbQoHSNwje3pb74rlZzD39BbtFmUj8pn/+WlryVBQNvuHjx4qAtW7a8/sabbyz99aIClJYc86SmjRR7vGqx6IcGlDW48fmFOnh2vwLRNBCh0x5Boj4Eg9UCG2xSsaERSjY4TJRClC6h8kw5nnr0d7Zms+3jtLS0l86cOVNDALnwEOKA/0F+DmAAXF5eXuiuXbv+vrVw64xFBYv4BP517xTKtlWF4IA4AOjoBowM2mAN7DY7/PvepTvIIJOWUDooASd5UJAwKFzDfpca4ssdEQy92if7csd2PP7444003wrSwmuobgryZi4OxBxRhOKFF174uPCjj3IXFRR4HB6fuGFvhfTYjiOo1doxeJgPyQmViIwsI1AV8HXooPSroTq0FsHMA6O3GybLOWh6a9BQ2ywc2F4tblj1vnjb7XG+e+bc5Z8xbYr+Um3NPS2NjX4/Y98SSO5qDvIGl/8UILdowNSfffbZK+s3rP/NkvuXeLtd3dLKopfEVdb1GKarxmDtUej036P1/Ba0nyyF42wZ/JcZfDIN3Jn5sBW/BytTwJI0HjZfCIZF9OCOnE9hHLUfrz7+odjZ2SOmpiZ6QjQhUtH+oskpKSl+s9nMQXK5was3HNDFgPVoP3fZU8s+f+kvL8EvZ76nDzwjvW1fi3zZ7aj9vgVVRe0Ii+mGLjwRqgG/ArRZ8Mii4KKYd0COnprT8B98Dd1Tn8eQSANyM76AJuQAnH49rB1efLDiMHAH8Ma4td59HxyU7Sz+ClkjshaWV5R/0g8DDa+aNDCgTQDcM888Y6Txqntnz4VSrfS8efxt6W3LWkyuyUHZunq0HnAjPqUHWfOfRlLuJkSnFsAUlQpDCMWXSga95IZu8HB0x84Ctn+EqYl7YNSvhtupInVBMgDzV0wF3IA6RS1bX7jO/eyKZ0Hgnn/ooYeiaG3OGtc9e31AJ7k1WX1L42Pdlq5FS+57wFcvb5QVHFiIhL2JMJdfwojZ8UiZfg5Oy0xExD2FIMVAyH0+KAQGiZ6WKIKcXglOJiF9iALC+Q0YkrET6vDJcLh88DAGl4cWodoja5Sw6eyHWDJliTQ9e7qn+Lti084vd3Je3E/KJeDdPoA8OHnsheXn5725YM58U5Oz2V90Zp9Y8dxJAhWJYQuGIGqInUDNQuvJOJhM8QiLDCWH+iCXSQSQwUvAjGorJgzch5FpXyE4shele0QMGqODoBIJIFcBbkoDrcmICztrYdFbMX/MvUiMSRS3FG5JmH3n7B0/Vv3YSVg4NpqRhAq/VFdXxwHm/3757x8elT2aLZyzUGxh9cL4ZZkYMCocwYoOqDwi1OJz6GljUAoWxAwZSrP4oZDLIJNrIFcISI4shF7zJ9hsSjidIko+aYI2WkkrSbDbffAJBJKS1R8ih0kZjj2n9mBmVq6QGZfh/77sex0lTR3hKCHl2Pyc7zhA/6FDh/hwQmxcLMrLyjlYcdTSUdAYXZB7aqGSXYDo/wwaZSJi4trRfPoojFMIniYU7ZYudF5pQGvtKbRZPkJ7UyS6LTaIcguUwQxfrbyAxBlGMJG8ppAg1yuhGBgErTIUqAZ2V+4Vxk7NZvct+A2+O/QdbzrWkHJ3E4sSEALHAcmyMrKe1hv1g1pbW1lreKeoHWFHsNwDJUuA5H8OgmcMQrVyhBl0qK8ogcFgQFNVJfYXrsPFI3vhcfZCE+1CTLobg8fqMWRCOCJS9Wi/bEXmfQmIzA6jrNdCCFLAanaht8aBztIOlMsu474x85hKUomb39usmD59+hfV1dVWwiRxCwaCkfaRnS0dsXm5ebCgGy+OfhGxd+bCLiyhhRMoQ0MRplcHEsFuMaPh4lmU7ipEZs5sjJo8E5qYEfBqeiDT/hfNaIfHF0zR6UOwSg5jvBZdbU5ExeugCVJCFiNQBhvR6/IjPSkUp/9Ugv2TD2J0fBaSk5NNRUVFMYSngVTsDzB09PgxusSERHxTtQ/oBRw1efBIGTAoKQmUMtjMLTi9Yydqju6hYJcwJvdXyH/wabhlKrRbGTodx2B1lID5M+GjjPXymkAVz5huQF1ZB4KHGeGiJHHRBbdfgE8uQRGnA+4BDPF6ISIqAtER0UEXLlyIoCcDwrO3z4I6QYCmp6cXFm+3AKIx6/keCm6qEH47qo4VofCJ2aivrcE9z67D4j++jo4rLTBbumGzO9HT00MUoiUAJrjFg/CItUR1LXASDWlidehp6iWSdsMn9mWyAKeHIkspJ26igLNTAgZpEB5m4sA0AXSUxYEkuXag7HVaJK+HwWOLB+jnLy9BZ1Uy6o7vRHPZXsz4z9cwNHMsVMFaiD43mFqHsyePI/62aXDQscMVgV7nn+GTTpBz6b2lVohiNcRwDYLigmFpdkAfEQSX3w8PNRVuWl4lcwFB5K0WApZOIDUEGJTo16Q/QHd7u9nn9ToQ7B1MZltNjcly/Pjf2xE95zFMef5zGKMGwEZM63R3QKsNRtSIcagsPYyQlLGwkzV6vQJ6PLeh25kBS48DbrcZEaZdUOkPQW4MRSfFvSLJQNYVKHQkeP0ivQwBkhuItogRCLjVZiXE6LiGT+AA+7qH7rKyUw7qhtVa4ja8/i2vRlBPXISoyQ/Bo9TC3NlDNKOEiiZ1MuI/KnFXqt5BfV0tJUkyurqaYWltRMflalgaa2FrsKLOVwtD9Ck42hRwdctgb3VA1KsgmHQQicgVYVOBzgcRFS5nXq8HtbWXqYcLNLQcY8DFfQDNdMLS1NRi6Ki7xK9BtuBlOI7sht19CipVL2SyNrjECPh8UXA4wyAGGxAx7k6cK94BfexQ1BRthbX6PKTht9PiSZBnxlEyEa3FzUZ0+AY0fdoEYYgJQogMvU1OsNpqyF0JwDfEKCvvgrmtDScrzjTS4k2kXAJEzTmQSwtpVX1dVfzYiTMxfOVQnPV3Irz8r3CYFwMpqfB6u6ikuSFpTBClWPQ2p6G70YG6nesgpIyDMXsuomcnw6MORa9PRt0Lg0Cz2+VDoDPYoI5/DpIpCKp0ApnSTZXlXsguzgO+O8KqL51H65VWjqOc1MY/V0koCK66mBM2l6OHDx9GmFEnLE0fwKCpgWmOhPovB8LWRVZjw+EQMylrw1F9oALFv30VQvA6DKKPTW1KHoJGTIdbS1WEiq3dSRZyuyD4HHB2SejqGQBG34Lc7b12geK1C2pPMuqVlI3zspGaOkysr7/MMRzgGwIXwMQBXhedTv3N5vc/dDTUXRSnZJoYHAZYk6Kg7WqA+YwZThlxHVWFU69V4twBqrsvZiNh0QwMuDsNjrK30VRzCV0ONyUHfeQRZ/FEpj6HapSXmoUW+PUiqNGGgxJKRat22EOQSDS0YUa039zeKhwr+eEinT54DVDAs32WC5xzubzc96Pi4mKHzpw+0Ss1K6SvW4MQm2pHw/42MOZD7bsV0I2PImCDoY6iHs9LJKYNh89rQ9e35NKhw2gKmpaSCNThwC/RFymFRcRxeDzt8FYRyEQ9wuVudDdFY0XaWEwZofVt3rRRKizctp4Y8Wv+5wCV30Bu9FmQHwTAJiQkrF3xzEpP1YUz8gdzE3ywjEON+ATCOhiuvFqBsAeyoZ8RR64mt/VKsLltsLr06I1eBZw/B3b5JNGGgooUtxzZSU4Zq6B4JGbwyNVg1BdGUhWqpwIwPS4MS/OSvArRL3/vg61No9MS3yccIIBkezI+SR9APg6YtKqq6jCN31616i8IVbv9RfcOZL7nv4A2biLC02bB1nmCAFHZIw6y+wRq8T2wdMXBQg0FCubD/y2tYSNCIE5Dex11K1T6KvbCu+84fAebEXyZesrSdmDHCczQqplGcgolZSf4+mt/uPoZyjEFsPCTN7h43rx5UmVlJdu4cWPJy6+8khMWFhGbNyXLEz9MK31oHoHexDTEvVmJzoFVcMUMJLrxUr11EegcuHti6Ls4HGi9TJY8BJhpX/ENmNdOrg4jzgxBbEwXWlvrYDE1YtOs9zEyOtXzwZa/yZctW3aQsDxB6iO9bj0a31Rk/OysWbP4H0DNm9/dxLx+5tpd2sLw6GGGhe+xOEM8S1gxjhk/ymXyD8cw2cufMCyjmLn7WYakadw1DJMeZXjqG6b7wyEW/8fjbMCarxjeymTIBdtZvpdYhLkqz1byeznvpZByCax9dXh1e4MFr13g5pVRR3GF/t4o37BxY36EyRA8Z0a2e3FmlGBzKoTDOjM63/oSjmgJ0QMHw1ujguKTnYgIsUM34T4Ykscj/MoJ4r1xaBfVsJitsHWokRc6AHMjU9j9ufe7T506pczIyrDRWgWkpXxNUt6k3iA3A8hv4CCllpaWmjvuGPfduvWbxlOdjpiQnSrMnzjcMzUtSdCOpqbzQB1qS78V3Bc9cGfMgnXQFFjlOnTJjOjYVgrriVKkT7gNs4YE4835Q9mScVne02XlOFZSKi9YVMBZmYMr4muRcvf+g3B//5zwazxgfU8++eSANWvWvETjX7+/+R3k5EyDIjTI99a763BuezHaosciKONuYVhYCHrsZEVtEOINPhzdtpoNSh2P5Y8vhc/VJRYXFwtz713A1zuYnp7+xOnTp8/SmK9xNSz4lf+F9I+LfHp+t9EUbl++7Gk2ecJktmv3LrZ161Y2r+ABdrSsgtU1trPq2kbW0trOtm3bzrIzItmaV//KcnKmchC8jD28e/duamMDwi13KyPd+uK1Sfjuuguu1chsOkddAMbmTMpJ1BtCDARGN/G2NPnw9NGwWq240tzs73X7u48dK+F/tfEY+3r58uX7V69ezeOOy/U5rx7efHtL9D95hLuC3//TWOHteRhCkiLQfZH/K0EsHXAZb5sa8iZMqN915IiFxn3CgXFrXue6vgv/V3sOki/C9ZcKf4aHCn/Jf0n+FQvebGL+fJ9l+Zhbpk/6jvm5n1q9755/uv8fW8aYEPr77KEAAAAASUVORK5CYII="},{"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,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAXEYAAFxGAHswbAIAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAAP5klEQVRYCcVYCXRUVbbd772aU6lUqiojIQEykUBCEoYgIEIYTaKAyNChaUVaW/9yQNeXxpb+jf3boXEAJwYRtYXYjoAiIGEIKEISIRCGIJCJjCSppJKqpOaq+88tCCvYSNu//1r/rDrv3Tfdu98Z9jmvBPz7ItIUXAVSdk1pBx/f/H8IByJOmjRJxhjj45sKv/bpp59Kt7rnpg/+myelVatWcWv1Fz0dpJNOI72LdCZpGml/keiA68++UP+b+49/6QN9LuxzWxhNMpl06sOPPJo6ZvSokJCQYDcZzaxUqdq1QUGX0tMziwyG4POCIHT1W5Cvx4HyeXg4/FP5JQD7JuSTxZIuffiR/1gwbdq05NGjRiJIo2JV1TUeCKJXpZD5nfYe9Np7WWtrG3M47E1mc/eJ8jOX9nxc+MN+4HRbP0QyGnv7Hd90yBe/lfBJ+qz22/nzF76Xn58/a+UfVphGjhwJMpvP3O3AsJRkmRwOeWTSOEWXV6fwMJUySGdShhqMYYbQoHSNwje3pb74rlZzD39BbtFmUj8pn/+WlryVBQNvuHjx4qAtW7a8/sabbyz99aIClJYc86SmjRR7vGqx6IcGlDW48fmFOnh2vwLRNBCh0x5Boj4Eg9UCG2xSsaERSjY4TJRClC6h8kw5nnr0d7Zms+3jtLS0l86cOVNDALnwEOKA/0F+DmAAXF5eXuiuXbv+vrVw64xFBYv4BP517xTKtlWF4IA4AOjoBowM2mAN7DY7/PvepTvIIJOWUDooASd5UJAwKFzDfpca4ssdEQy92if7csd2PP7444003wrSwmuobgryZi4OxBxRhOKFF174uPCjj3IXFRR4HB6fuGFvhfTYjiOo1doxeJgPyQmViIwsI1AV8HXooPSroTq0FsHMA6O3GybLOWh6a9BQ2ywc2F4tblj1vnjb7XG+e+bc5Z8xbYr+Um3NPS2NjX4/Y98SSO5qDvIGl/8UILdowNSfffbZK+s3rP/NkvuXeLtd3dLKopfEVdb1GKarxmDtUej036P1/Ba0nyyF42wZ/JcZfDIN3Jn5sBW/BytTwJI0HjZfCIZF9OCOnE9hHLUfrz7+odjZ2SOmpiZ6QjQhUtH+oskpKSl+s9nMQXK5was3HNDFgPVoP3fZU8s+f+kvL8EvZ76nDzwjvW1fi3zZ7aj9vgVVRe0Ii+mGLjwRqgG/ArRZ8Mii4KKYd0COnprT8B98Dd1Tn8eQSANyM76AJuQAnH49rB1efLDiMHAH8Ma4td59HxyU7Sz+ClkjshaWV5R/0g8DDa+aNDCgTQDcM888Y6Txqntnz4VSrfS8efxt6W3LWkyuyUHZunq0HnAjPqUHWfOfRlLuJkSnFsAUlQpDCMWXSga95IZu8HB0x84Ctn+EqYl7YNSvhtupInVBMgDzV0wF3IA6RS1bX7jO/eyKZ0Hgnn/ooYeiaG3OGtc9e31AJ7k1WX1L42Pdlq5FS+57wFcvb5QVHFiIhL2JMJdfwojZ8UiZfg5Oy0xExD2FIMVAyH0+KAQGiZ6WKIKcXglOJiF9iALC+Q0YkrET6vDJcLh88DAGl4cWodoja5Sw6eyHWDJliTQ9e7qn+Lti084vd3Je3E/KJeDdPoA8OHnsheXn5725YM58U5Oz2V90Zp9Y8dxJAhWJYQuGIGqInUDNQuvJOJhM8QiLDCWH+iCXSQSQwUvAjGorJgzch5FpXyE4shele0QMGqODoBIJIFcBbkoDrcmICztrYdFbMX/MvUiMSRS3FG5JmH3n7B0/Vv3YSVg4NpqRhAq/VFdXxwHm/3757x8elT2aLZyzUGxh9cL4ZZkYMCocwYoOqDwi1OJz6GljUAoWxAwZSrP4oZDLIJNrIFcISI4shF7zJ9hsSjidIko+aYI2WkkrSbDbffAJBJKS1R8ih0kZjj2n9mBmVq6QGZfh/77sex0lTR3hKCHl2Pyc7zhA/6FDh/hwQmxcLMrLyjlYcdTSUdAYXZB7aqGSXYDo/wwaZSJi4trRfPoojFMIniYU7ZYudF5pQGvtKbRZPkJ7UyS6LTaIcguUwQxfrbyAxBlGMJG8ppAg1yuhGBgErTIUqAZ2V+4Vxk7NZvct+A2+O/QdbzrWkHJ3E4sSEALHAcmyMrKe1hv1g1pbW1lreKeoHWFHsNwDJUuA5H8OgmcMQrVyhBl0qK8ogcFgQFNVJfYXrsPFI3vhcfZCE+1CTLobg8fqMWRCOCJS9Wi/bEXmfQmIzA6jrNdCCFLAanaht8aBztIOlMsu474x85hKUomb39usmD59+hfV1dVWwiRxCwaCkfaRnS0dsXm5ebCgGy+OfhGxd+bCLiyhhRMoQ0MRplcHEsFuMaPh4lmU7ipEZs5sjJo8E5qYEfBqeiDT/hfNaIfHF0zR6UOwSg5jvBZdbU5ExeugCVJCFiNQBhvR6/IjPSkUp/9Ugv2TD2J0fBaSk5NNRUVFMYSngVTsDzB09PgxusSERHxTtQ/oBRw1efBIGTAoKQmUMtjMLTi9Yydqju6hYJcwJvdXyH/wabhlKrRbGTodx2B1lID5M+GjjPXymkAVz5huQF1ZB4KHGeGiJHHRBbdfgE8uQRGnA+4BDPF6ISIqAtER0UEXLlyIoCcDwrO3z4I6QYCmp6cXFm+3AKIx6/keCm6qEH47qo4VofCJ2aivrcE9z67D4j++jo4rLTBbumGzO9HT00MUoiUAJrjFg/CItUR1LXASDWlidehp6iWSdsMn9mWyAKeHIkspJ26igLNTAgZpEB5m4sA0AXSUxYEkuXag7HVaJK+HwWOLB+jnLy9BZ1Uy6o7vRHPZXsz4z9cwNHMsVMFaiD43mFqHsyePI/62aXDQscMVgV7nn+GTTpBz6b2lVohiNcRwDYLigmFpdkAfEQSX3w8PNRVuWl4lcwFB5K0WApZOIDUEGJTo16Q/QHd7u9nn9ToQ7B1MZltNjcly/Pjf2xE95zFMef5zGKMGwEZM63R3QKsNRtSIcagsPYyQlLGwkzV6vQJ6PLeh25kBS48DbrcZEaZdUOkPQW4MRSfFvSLJQNYVKHQkeP0ivQwBkhuItogRCLjVZiXE6LiGT+AA+7qH7rKyUw7qhtVa4ja8/i2vRlBPXISoyQ/Bo9TC3NlDNKOEiiZ1MuI/KnFXqt5BfV0tJUkyurqaYWltRMflalgaa2FrsKLOVwtD9Ck42hRwdctgb3VA1KsgmHQQicgVYVOBzgcRFS5nXq8HtbWXqYcLNLQcY8DFfQDNdMLS1NRi6Ki7xK9BtuBlOI7sht19CipVL2SyNrjECPh8UXA4wyAGGxAx7k6cK94BfexQ1BRthbX6PKTht9PiSZBnxlEyEa3FzUZ0+AY0fdoEYYgJQogMvU1OsNpqyF0JwDfEKCvvgrmtDScrzjTS4k2kXAJEzTmQSwtpVX1dVfzYiTMxfOVQnPV3Irz8r3CYFwMpqfB6u6ikuSFpTBClWPQ2p6G70YG6nesgpIyDMXsuomcnw6MORa9PRt0Lg0Cz2+VDoDPYoI5/DpIpCKp0ApnSTZXlXsguzgO+O8KqL51H65VWjqOc1MY/V0koCK66mBM2l6OHDx9GmFEnLE0fwKCpgWmOhPovB8LWRVZjw+EQMylrw1F9oALFv30VQvA6DKKPTW1KHoJGTIdbS1WEiq3dSRZyuyD4HHB2SejqGQBG34Lc7b12geK1C2pPMuqVlI3zspGaOkysr7/MMRzgGwIXwMQBXhedTv3N5vc/dDTUXRSnZJoYHAZYk6Kg7WqA+YwZThlxHVWFU69V4twBqrsvZiNh0QwMuDsNjrK30VRzCV0ONyUHfeQRZ/FEpj6HapSXmoUW+PUiqNGGgxJKRat22EOQSDS0YUa039zeKhwr+eEinT54DVDAs32WC5xzubzc96Pi4mKHzpw+0Ss1K6SvW4MQm2pHw/42MOZD7bsV0I2PImCDoY6iHs9LJKYNh89rQ9e35NKhw2gKmpaSCNThwC/RFymFRcRxeDzt8FYRyEQ9wuVudDdFY0XaWEwZofVt3rRRKizctp4Y8Wv+5wCV30Bu9FmQHwTAJiQkrF3xzEpP1YUz8gdzE3ywjEON+ATCOhiuvFqBsAeyoZ8RR64mt/VKsLltsLr06I1eBZw/B3b5JNGGgooUtxzZSU4Zq6B4JGbwyNVg1BdGUhWqpwIwPS4MS/OSvArRL3/vg61No9MS3yccIIBkezI+SR9APg6YtKqq6jCN31616i8IVbv9RfcOZL7nv4A2biLC02bB1nmCAFHZIw6y+wRq8T2wdMXBQg0FCubD/y2tYSNCIE5Dex11K1T6KvbCu+84fAebEXyZesrSdmDHCczQqplGcgolZSf4+mt/uPoZyjEFsPCTN7h43rx5UmVlJdu4cWPJy6+8khMWFhGbNyXLEz9MK31oHoHexDTEvVmJzoFVcMUMJLrxUr11EegcuHti6Ls4HGi9TJY8BJhpX/ENmNdOrg4jzgxBbEwXWlvrYDE1YtOs9zEyOtXzwZa/yZctW3aQsDxB6iO9bj0a31Rk/OysWbP4H0DNm9/dxLx+5tpd2sLw6GGGhe+xOEM8S1gxjhk/ymXyD8cw2cufMCyjmLn7WYakadw1DJMeZXjqG6b7wyEW/8fjbMCarxjeymTIBdtZvpdYhLkqz1byeznvpZByCax9dXh1e4MFr13g5pVRR3GF/t4o37BxY36EyRA8Z0a2e3FmlGBzKoTDOjM63/oSjmgJ0QMHw1ujguKTnYgIsUM34T4Ykscj/MoJ4r1xaBfVsJitsHWokRc6AHMjU9j9ufe7T506pczIyrDRWgWkpXxNUt6k3iA3A8hv4CCllpaWmjvuGPfduvWbxlOdjpiQnSrMnzjcMzUtSdCOpqbzQB1qS78V3Bc9cGfMgnXQFFjlOnTJjOjYVgrriVKkT7gNs4YE4835Q9mScVne02XlOFZSKi9YVMBZmYMr4muRcvf+g3B//5zwazxgfU8++eSANWvWvETjX7+/+R3k5EyDIjTI99a763BuezHaosciKONuYVhYCHrsZEVtEOINPhzdtpoNSh2P5Y8vhc/VJRYXFwtz713A1zuYnp7+xOnTp8/SmK9xNSz4lf+F9I+LfHp+t9EUbl++7Gk2ecJktmv3LrZ161Y2r+ABdrSsgtU1trPq2kbW0trOtm3bzrIzItmaV//KcnKmchC8jD28e/duamMDwi13KyPd+uK1Sfjuuguu1chsOkddAMbmTMpJ1BtCDARGN/G2NPnw9NGwWq240tzs73X7u48dK+F/tfEY+3r58uX7V69ezeOOy/U5rx7efHtL9D95hLuC3//TWOHteRhCkiLQfZH/K0EsHXAZb5sa8iZMqN915IiFxn3CgXFrXue6vgv/V3sOki/C9ZcKf4aHCn/Jf0n+FQvebGL+fJ9l+Zhbpk/6jvm5n1q9755/uv8fW8aYEPr77KEAAAAASUVORK5CYII="},{"id":"maaamet.ee-pohi_vr2","name":"Estonia Basemap (Maaamet)","type":"wms","template":"https://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":"https://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":"https://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":"https://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":"Fiez-2013","name":"Fiez Orthophoto 2013","type":"tms","template":"http://osmdata.asitvd.ch/tiles/fiez2013/{zoom}/{x}/{y}.png ","endDate":"2013-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[14,20],"polygon":[[[6.6231344,46.8233863],[6.6289909,46.8248413],[6.6288194,46.8267356],[6.6253097,46.8327384],[6.623822,46.8331744],[6.618386,46.8319393],[6.6231344,46.8233863]]],"terms_url":"http://osmdata.asitvd.ch/","terms_text":"Fiez - Orthophoto technique 2013"},{"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":"https://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":"https://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":"https://{switch:a,b,c,d}.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":"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{"id":"Freemap.sk-Cyclo","name":"Freemap.sk Cyclo","type":"tms","template":"https://{switch:a,b,c,d}.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":"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{"id":"Freemap.sk-Hiking","name":"Freemap.sk Hiking","type":"tms","template":"https://{switch:a,b,c,d}.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":"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{"id":"Freemap.sk-Ski","name":"Freemap.sk Ski","type":"tms","template":"https://{switch:a,b,c,d}.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":"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{"id":"Geobase_Hydrography","name":"Geobase Hydrography - English","type":"wms","template":"https://maps.geogratis.gc.ca/wms/hydro_network_en?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=nhn:nhn&STYLES=&SRS={proj}&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]]],"overlay":true},{"id":"Geobase_Hydrography_French","name":"Geobase Hydrography - French","type":"wms","template":"https://maps.geogratis.gc.ca/wms/hydro_network_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=nhn:nhn&STYLES=&SRS={proj}&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]]],"overlay":true},{"id":"Geobase_Roads","name":"Geobase Roads - English","type":"wms","template":"https://maps.geogratis.gc.ca/wms/roads_en?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=roads.road_segment.label&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","scaleExtent":[11,20],"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_French","name":"Geobase Roads - French","type":"wms","template":"https://maps.geogratis.gc.ca/wms/roads_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=roads.road_segment.label&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","scaleExtent":[11,20],"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_url":"http://geoimage.at","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":"https://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":"https://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":"https://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":"https://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":"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]]],"terms_text":"IBGE","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAOsSURBVHja7JXbb1RVFIe/fTmn05lepp0OpTcuUgQEElGgGGJSNYhggpdoTEz8m3w1xsQHE00MJj5oDGKCRI2IqKEKlpZCaSmXXubWmc6Zc/bFhwGp3N540LiTX7KTvbLWyvp+WVt473mUR/KIz7+/gJ64uNisJAW1lcbGUz9f+MQ6l5dCGID7EWpEMYcO7GB6tsifE9cItGo+CEEYaLyXl/p620+O7Nn2rp67sQCAUpLFpeXRYsWOKCUBcZ/UgqgRs2tnP5l0K2Pnx/GEJLYZ7RHU6hYwjy+V5l+KomStbElpmlKUl6NXpRQ0xV0SJCZhaKCdwwd2cHmmQJI4lAQpQAiQwqOkQEmJVprr89UjOt+TQylJobA8Wig0Xpby/liiKGawv503jjyFFJJiuY6Q4sFwpcAYl9JJnECguDq39EpinAoCif97QALnHEli2Lq5hxdHt5JpDZoJBDj3YLjOQyqUVb1UKCGlYH6xuk+pW7A8GOexJiHdqtn39AbW9nbw2Re/sbLS4Jk9mxgayHL23HUS41FyNaWmMax1ZPPtZ8Xv49eZXygdPnXmypcCiRAQhpqOtpB1g53sH9lMpVLno09P47xCSIjjhNcO7ySKYn4du4oxDucFUkqkFAgB1lp271p/SOdzbUT12tvbhntIZwLyXW309+XIdWcIAg3A+OQNEguplmarRinmbpQ5+NwT7N61EZMYKrWYUjmiUlmhutKgNaXG1g92H9dz1wrpqculkSg21OqOhcWIPy40reu9ZdvmXrq6Mgg8znkQAmsM+e4MADOzi/wyNsNSsU6tmhAbSxwbtgznfspkWqwulupHLs0UhtVd7nG3WMxcneSFZx/j4PNbOPHdRZx17N+7jlx3mo+PnmZ2roTzAqUkUkqEkKRSOh7s73nfuwB9c6H4phASpf5ZQN2++ICp6SLvvLWXTRvW4L1nemaRz786R62WEIYaLe7Y1VhHbz79Q0tKnqnWq8hCKXpSqYf5GeoNgzGObGeaiambHDsxQSN2tLQEiFXJPeC9p7M99bWUEikkMtSi5B/mZ+fpzraiteLHM1N8c3ISrTVKins3lfekU6rSu6btaBwnWGuQA33ZD7x3WNuE6P1tNbsx1tK/toMrs0uc+H6KIAyA1XF3lCSWgb7ssaGB/MVcVwc93Z3o7duH3yuWl7Pl5fh1JYKs815a571A4Lynoz0k35Ph+LfnybSG97BavQnDQIZdXZkPy8sNrG2ORfz/Zf73C/w1AJZ/tYbRRy7/AAAAAElFTkSuQmCC"},{"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":[[[-69.947926,-4.231683],[-69.456589,-1.491186],[-69.397303,-1.36508],[-69.429886,-1.221726],[-69.395234,-1.125548],[-69.442921,-1.033507],[-69.418606,-0.998273],[-69.527996,-0.925137],[-69.525765,-0.868067],[-69.624907,-0.746671],[-69.561785,-0.636925],[-69.607832,-0.500798],[-69.844601,-0.337321],[-69.920535,-0.325734],[-70.043228,-0.189979],[-70.043018,0.563585],[-69.802724,0.571624],[-69.671096,0.667593],[-69.605289,0.61328],[-69.597007,0.654202],[-69.480024,0.735768],[-69.352767,0.61416],[-69.289139,0.649971],[-69.294839,0.603894],[-69.199748,0.605905],[-69.194253,0.649818],[-69.115633,0.64484],[-69.190008,0.740563],[-69.148809,0.767511],[-69.135763,0.872042],[-69.188462,0.913236],[-69.164602,0.941556],[-69.216787,0.972451],[-69.197732,0.999741],[-69.244939,1.056552],[-69.37641,1.087938],[-69.423124,1.04265],[-69.609891,1.098258],[-69.677182,1.069939],[-69.709626,1.118167],[-69.842658,1.072719],[-69.839717,1.718929],[-69.782358,1.692438],[-69.534643,1.776907],[-69.391089,1.72935],[-68.164499,1.729447],[-68.192071,1.7797],[-68.239542,1.770444],[-68.226881,1.829184],[-68.285547,1.830839],[-68.19583,2.034791],[-68.180335,1.976705],[-68.144166,1.978541],[-68.090429,1.897741],[-67.901623,1.811652],[-67.769425,2.009237],[-67.550949,2.047692],[-67.495186,2.163124],[-67.394044,2.228938],[-67.326716,2.063872],[-67.33083,1.941575],[-67.228307,1.841269],[-67.153836,1.831497],[-67.159221,1.675037],[-67.08017,1.385457],[-67.139231,1.320017],[-67.086753,1.167036],[-66.851191,1.228959],[-66.31032,0.744944],[-66.197375,0.781614],[-66.077833,0.761742],[-66.07024,0.8123],[-65.967121,0.81511],[-65.883691,0.941589],[-65.772612,0.958591],[-65.742103,1.001253],[-65.588935,1.004706],[-65.49624,0.87415],[-65.606227,0.707483],[-65.541158,0.648807],[-65.444985,0.689212],[-65.392132,0.756917],[-65.411977,0.824145],[-65.327341,0.93596],[-65.213022,0.902817],[-65.1749,0.94131],[-65.158308,1.124604],[-65.072322,1.153032],[-65.063171,1.11205],[-65.013614,1.109051],[-64.974445,1.202878],[-64.904386,1.251532],[-64.869656,1.227132],[-64.800533,1.315271],[-64.744461,1.225695],[-64.578896,1.340406],[-64.526079,1.443222],[-64.435855,1.470064],[-64.393901,1.529006],[-64.351112,1.529209],[-64.347774,1.495083],[-64.410191,1.40301],[-64.337907,1.361341],[-64.313597,1.456166],[-64.197073,1.520713],[-64.073497,1.64902],[-64.057812,1.928986],[-63.972189,1.991942],[-63.835555,1.966443],[-63.711552,2.046453],[-63.665009,2.018614],[-63.626795,2.112221],[-63.564739,2.135707],[-63.440594,2.125998],[-63.367416,2.268644],[-63.370884,2.411207],[-63.421234,2.451019],[-63.460358,2.396839],[-63.563976,2.445727],[-63.768047,2.439943],[-63.843575,2.491598],[-64.019142,2.461352],[-64.057297,2.497522],[-63.980331,2.723703],[-64.077088,2.872615],[-64.071556,2.921416],[-64.123489,2.990477],[-64.15754,2.982431],[-64.145917,3.034593],[-64.226417,3.12356],[-64.197945,3.201207],[-64.2444,3.430363],[-64.17437,3.568408],[-64.280998,3.709279],[-64.543565,3.857134],[-64.722389,4.117745],[-64.802033,4.174225],[-64.811229,4.270475],[-64.69522,4.253229],[-64.623,4.135],[-64.556502,4.105295],[-64.164,4.127],[-63.964,3.868],[-63.928,3.925],[-63.85,3.95],[-63.682,3.908],[-63.676,4.019],[-63.591,3.886],[-63.497,3.84],[-63.489,3.874],[-63.434,3.865],[-63.428,3.977],[-63.204,3.952],[-63.226,3.836],[-63.103,3.794],[-63.059,3.748],[-63.081,3.694],[-62.96,3.608],[-62.835,3.739],[-62.743,3.674],[-62.729,3.805],[-62.788,3.894],[-62.753,4.032],[-62.555,4.019],[-62.552,4.109],[-62.437,4.183],[-62.143085,4.077683],[-62.071,4.126],[-62.076,4.154],[-61.982,4.181],[-61.931749,4.120087],[-61.922129,4.161264],[-61.824,4.164],[-61.802,4.229],[-61.724,4.27],[-61.56,4.252],[-61.508,4.322],[-61.513,4.406],[-61.288,4.458],[-61.323,4.535],[-61.217,4.536],[-61.145587,4.480164],[-61.095,4.522],[-60.994,4.519],[-60.932,4.587],[-60.949,4.653],[-60.899,4.717],[-60.751,4.756],[-60.591,4.927],[-60.661,5.164],[-60.731972,5.212034],[-60.434,5.182],[-60.208247,5.283457],[-60.172,5.227],[-60.135,5.249],[-60.094,5.14],[-59.969842,5.063345],[-60.025235,4.706496],[-60.0705,4.616881],[-60.157246,4.572475],[-60.161141,4.517726],[-59.795027,4.46554],[-59.669479,4.376295],[-59.731895,4.285869],[-59.730691,4.180764],[-59.618177,4.13166],[-59.654059,4.069432],[-59.584169,3.968513],[-59.515301,3.944925],[-59.592788,3.885385],[-59.596307,3.793864],[-59.665547,3.781259],[-59.668415,3.702775],[-59.867279,3.577762],[-59.80205,3.501565],[-59.840796,3.431736],[-59.804878,3.35695],[-59.907,3.212],[-59.989438,2.881854],[-59.99,2.686],[-59.895,2.482],[-59.898724,2.362451],[-59.723148,2.276137],[-59.751,1.859],[-59.677,1.839],[-59.663,1.871],[-59.69,1.757],[-59.539,1.723],[-59.381,1.507],[-59.329,1.514],[-59.327,1.464],[-59.284,1.45],[-59.253,1.389],[-58.978,1.302],[-58.918,1.317],[-58.886,1.261],[-58.912,1.239],[-58.825116,1.171272],[-58.739558,1.199901],[-58.694563,1.297323],[-58.496224,1.267963],[-58.457871,1.371452],[-58.505113,1.403166],[-58.508726,1.462946],[-58.385587,1.469988],[-58.394723,1.526512],[-58.322366,1.597015],[-58.236003,1.546687],[-58.160643,1.560114],[-58.129425,1.498895],[-58.004228,1.503026],[-57.990093,1.658439],[-57.852056,1.66782],[-57.774307,1.729727],[-57.70509,1.730931],[-57.650421,1.682369],[-57.537597,1.700495],[-57.501869,1.786088],[-57.43776,1.826814],[-57.433428,1.905976],[-57.367678,1.923722],[-57.369119,1.956381],[-57.307117,1.996652],[-57.229228,1.937587],[-57.086676,2.026442],[-57.014207,1.914893],[-56.919708,1.93036],[-56.79793,1.853358],[-56.720956,1.925815],[-56.621453,1.945878],[-56.57976,1.90588],[-56.451258,1.956144],[-56.244042,1.87808],[-56.170899,1.900481],[-56.117621,1.850973],[-55.956377,1.845094],[-55.903854,1.888028],[-55.93635,1.986466],[-55.903103,2.041078],[-56.003072,2.167602],[-56.055046,2.184641],[-56.04288,2.227783],[-56.138873,2.265745],[-56.090122,2.372277],[-56.021814,2.342469],[-55.970516,2.529313],[-55.766629,2.455237],[-55.710278,2.399167],[-55.499712,2.443237],[-55.385327,2.41836],[-55.320185,2.515368],[-55.234736,2.50338],[-55.123404,2.567624],[-55.103017,2.52564],[-54.954239,2.583595],[-54.868459,2.439886],[-54.689167,2.453889],[-54.688611,2.324722],[-54.546667,2.318333],[-54.537778,2.265556],[-54.468611,2.213056],[-54.249167,2.146667],[-54.180556,2.1725],[-54.110833,2.112222],[-54.061389,2.191667],[-53.940833,2.219167],[-53.931944,2.271944],[-53.886667,2.267778],[-53.745,2.373889],[-53.733889,2.312222],[-53.529722,2.249167],[-53.458611,2.2575],[-53.328333,2.353333],[-53.216667,2.253333],[-53.278992,2.186027],[-53.118611,2.2225],[-52.994722,2.175278],[-52.909722,2.195833],[-52.847222,2.285556],[-52.675278,2.373889],[-52.594444,2.473889],[-52.540278,2.570278],[-52.564167,2.639444],[-52.439444,2.877778],[-52.395833,2.902222],[-52.331869,3.169382],[-52.214722,3.268333],[-51.971035,3.706957],[-51.921484,3.724219],[-51.921996,3.779202],[-51.797307,3.888877],[-51.777827,3.974056],[-51.658667,4.052762],[-51.613251,4.174366],[-51.63716,4.508337],[-51.494269,4.674258],[-51.11466,4.422859],[-50.942317,4.201651],[-50.854746,3.924906],[-50.855072,3.455726],[-50.753311,2.940571],[-50.299077,2.330792],[-49.738958,1.79143],[-48.237464,-0.074493],[-44.847277,-1.072461],[-43.546018,-2.047048],[-43.243891,-2.12403],[-42.781893,-2.330531],[-41.780839,-2.518594],[-41.508497,-2.684862],[-40.663653,-2.638294],[-40.50396,-2.575305],[-39.890697,-2.653276],[-39.151869,-3.044437],[-38.571513,-3.480465],[-38.343063,-3.54434],[-38.214209,-3.741026],[-38.125548,-3.805438],[-37.901824,-4.072646],[-37.779343,-4.180457],[-37.634014,-4.244541],[-37.51218,-4.415347],[-37.221221,-4.510451],[-37.078742,-4.713553],[-36.917155,-4.713724],[-36.622994,-4.858153],[-36.189692,-4.885051],[-35.936272,-4.833268],[-35.56471,-4.907577],[-35.336767,-4.99239],[-35.176587,-5.124974],[-34.794686,-6.335828],[-34.715871,-6.746155],[-34.623062,-6.903232],[-34.599531,-7.111326],[-34.643743,-7.987355],[-34.814973,-8.624717],[-35.025304,-9.137609],[-35.558478,-9.812613],[-35.696634,-9.900261],[-35.964008,-10.312805],[-36.061552,-10.37447],[-36.26639,-10.645931],[-36.61764,-10.810823],[-36.787254,-10.95151],[-36.99511,-11.296022],[-37.113685,-11.412607],[-37.460024,-12.10275],[-37.896682,-12.758442],[-38.221464,-13.097172],[-38.611462,-13.265369],[-38.853373,-14.655076],[-38.743882,-15.600892],[-38.664562,-15.747405],[-38.646967,-15.883266],[-38.801305,-16.248384],[-38.929333,-16.807754],[-38.531928,-17.800259],[-38.491713,-18.004604],[-38.536609,-18.09683],[-38.670528,-18.168548],[-39.352877,-18.108916],[-39.467501,-18.303591],[-39.545286,-18.785483],[-39.492274,-19.401339],[-39.634771,-19.744027],[-39.863532,-19.886808],[-40.178273,-20.754256],[-40.814417,-21.676723],[-40.769483,-21.877862],[-40.814417,-22.097019],[-41.508604,-22.526375],[-41.596664,-22.836265],[-41.792922,-23.088229],[-41.914838,-23.185266],[-43.196028,-23.267026],[-44.077347,-23.405007],[-45.13508,-24.120141],[-46.613678,-24.675116],[-47.853759,-25.470117],[-48.280105,-26.230365],[-48.348968,-26.750814],[-48.110759,-27.282079],[-48.211478,-27.855916],[-48.407125,-28.432546],[-48.686152,-28.760155],[-48.915601,-28.863052],[-49.157895,-29.028715],[-49.527482,-29.42005],[-49.82565,-29.865594],[-50.173442,-30.642824],[-50.604413,-31.241346],[-51.187855,-31.776463],[-51.742115,-32.105387],[-51.892358,-32.295963],[-52.061165,-32.385044],[-52.270865,-32.92102],[-52.459864,-33.253686],[-52.615046,-33.422913],[-53.18109,-33.868906],[-53.430525,-33.739471],[-53.439511,-33.693469],[-53.532282,-33.688801],[-53.518189,-33.153425],[-53.444381,-33.052961],[-53.244678,-32.934886],[-53.310078,-32.918753],[-53.294539,-32.899314],[-53.184956,-32.850431],[-53.145689,-32.792023],[-53.085802,-32.78835],[-53.075583,-32.740881],[-53.249925,-32.604096],[-53.391374,-32.585728],[-53.464232,-32.484461],[-53.58321,-32.451918],[-53.745987,-32.07848],[-53.833752,-32.05524],[-53.849776,-32.000642],[-53.960733,-31.955318],[-53.969722,-31.917655],[-54.100193,-31.928245],[-54.454896,-31.652948],[-54.452798,-31.599585],[-54.586765,-31.456563],[-54.836702,-31.442003],[-54.886225,-31.377302],[-54.940871,-31.380685],[-55.007233,-31.266919],[-55.074459,-31.332155],[-55.240034,-31.260616],[-55.291184,-31.142264],[-55.340373,-31.131436],[-55.349811,-31.039216],[-55.423057,-31.018229],[-55.577415,-30.833089],[-55.658342,-30.863997],[-55.66621,-30.953954],[-55.723,-30.943],[-55.727,-30.979],[-55.882,-31.077],[-56.009887,-31.082667],[-56.022407,-30.785651],[-56.125077,-30.73871],[-56.170739,-30.615174],[-56.260953,-30.585086],[-56.291926,-30.519674],[-56.381765,-30.499556],[-56.461264,-30.384864],[-56.547059,-30.359455],[-56.541147,-30.312907],[-56.618695,-30.300545],[-56.64628,-30.203457],[-56.776617,-30.163303],[-56.807771,-30.103006],[-57.071128,-30.086714],[-57.220813,-30.289278],[-57.313034,-30.257847],[-57.392294,-30.304737],[-57.465741,-30.265891],[-57.52431,-30.285693],[-57.560874,-30.211343],[-57.647439,-30.194834],[-57.480465,-30.123146],[-57.337128,-29.992845],[-57.294,-29.831],[-57.121,-29.765],[-56.898876,-29.531786],[-56.819054,-29.488163],[-56.766182,-29.377679],[-56.701637,-29.359128],[-56.593147,-29.125164],[-56.418,-29.075],[-56.407753,-28.974798],[-56.29995,-28.896138],[-56.296517,-28.802705],[-56.178585,-28.759223],[-56.009843,-28.607182],[-56.012491,-28.508726],[-55.883574,-28.479231],[-55.877394,-28.361586],[-55.751566,-28.370951],[-55.694329,-28.422043],[-55.670468,-28.332177],[-55.774151,-28.27414],[-55.775696,-28.244807],[-55.631672,-28.177189],[-55.607468,-28.116039],[-55.559574,-28.165234],[-55.495201,-28.076818],[-55.446106,-28.097869],[-55.368,-28.029],[-55.382994,-27.979479],[-55.343,-27.972],[-55.327065,-27.926637],[-55.265742,-27.929692],[-55.196,-27.856],[-55.133,-27.897],[-55.106,-27.846],[-55.035,-27.858],[-55.081,-27.779],[-54.936,-27.772],[-54.906169,-27.638708],[-54.85,-27.624],[-54.814,-27.533],[-54.775,-27.586],[-54.679261,-27.573936],[-54.677088,-27.508003],[-54.621,-27.541],[-54.574,-27.453],[-54.524598,-27.505902],[-54.444,-27.472],[-54.470814,-27.426739],[-54.41,-27.405],[-54.354662,-27.465284],[-54.340674,-27.403105],[-54.284845,-27.448195],[-54.261,-27.397],[-54.217363,-27.386035],[-54.172,-27.254],[-54.156185,-27.29619],[-54.088718,-27.301488],[-54.010264,-27.19978],[-53.962194,-27.196984],[-53.951948,-27.151693],[-53.798789,-27.146289],[-53.802327,-27.040278],[-53.760874,-27.065428],[-53.785853,-27.026738],[-53.747302,-27.032184],[-53.709196,-26.934136],[-53.671251,-26.942224],[-53.696837,-26.860147],[-53.660588,-26.858139],[-53.758143,-26.72045],[-53.720498,-26.650994],[-53.758643,-26.641128],[-53.637393,-26.249682],[-53.742,-26.108],[-53.734086,-26.043331],[-53.836191,-25.971657],[-53.822137,-25.793767],[-53.891125,-25.622859],[-53.948952,-25.611703],[-53.956385,-25.646285],[-54.01,-25.567],[-54.075917,-25.557657],[-54.098,-25.619],[-54.099,-25.495],[-54.206,-25.541],[-54.178,-25.584],[-54.23,-25.562],[-54.25,-25.597],[-54.28,-25.556],[-54.383946,-25.597471],[-54.432884,-25.69756],[-54.492703,-25.618096],[-54.593535,-25.592753],[-54.619413,-25.453118],[-54.429502,-25.159149],[-54.435485,-24.947695],[-54.324373,-24.660587],[-54.327141,-24.470729],[-54.25877,-24.363771],[-54.345365,-24.147047],[-54.28223,-24.073356],[-54.43984,-23.904464],[-54.669779,-23.812615],[-54.705325,-23.86452],[-54.89,-23.898],[-54.924,-23.959],[-55.062233,-23.993353],[-55.107,-23.961],[-55.229072,-24.013828],[-55.304152,-23.965042],[-55.345417,-23.994583],[-55.414227,-23.964505],[-55.441667,-23.700843],[-55.473056,-23.648343],[-55.53989,-23.624997],[-55.52356,-23.197334],[-55.541986,-23.1561],[-55.596348,-23.149926],[-55.665778,-22.852742],[-55.61432,-22.655211],[-55.723635,-22.551661],[-55.743017,-22.392661],[-55.789394,-22.384601],[-55.84304,-22.287251],[-56.209831,-22.278052],[-56.364855,-22.169491],[-56.39404,-22.074341],[-56.507114,-22.095609],[-56.637053,-22.263407],[-56.703442,-22.216928],[-56.720261,-22.264792],[-56.793443,-22.242379],[-56.842854,-22.301554],[-56.88343,-22.247555],[-56.996705,-22.222459],[-57.374403,-22.232043],[-57.580396,-22.175344],[-57.610596,-22.09462],[-57.707512,-22.091108],[-57.801829,-22.150722],[-57.993842,-22.090233],[-58.009461,-22.040379],[-57.912806,-21.88266],[-57.966028,-21.850453],[-57.908658,-21.773548],[-57.947143,-21.744133],[-57.883287,-21.689028],[-57.934365,-21.650365],[-57.913865,-21.590213],[-57.967953,-21.524324],[-57.853501,-21.331091],[-57.920188,-21.276551],[-57.850665,-21.224075],[-57.868337,-21.044168],[-57.819191,-20.940665],[-57.928365,-20.900364],[-57.855199,-20.834026],[-57.898631,-20.78872],[-57.961828,-20.7916],[-57.934779,-20.745653],[-57.867316,-20.732649],[-57.924136,-20.66392],[-57.988482,-20.698787],[-57.998465,-20.435512],[-58.093394,-20.355544],[-58.09596,-20.254451],[-58.162164,-20.259525],[-58.121521,-20.19246],[-58.169322,-20.1694],[-57.953465,-20.020944],[-57.902481,-20.042071],[-57.857957,-19.970298],[-58.131,-19.758],[-57.784,-19.033],[-57.694,-19.011],[-57.719,-18.899],[-57.766,-18.899],[-57.557,-18.24],[-57.453,-18.231],[-57.574,-18.131],[-57.723019,-17.83074],[-57.684723,-17.830599],[-57.709906,-17.727016],[-57.783,-17.639],[-57.736963,-17.558303],[-57.883,-17.449],[-57.996,-17.515],[-58.06,-17.45],[-58.116,-17.451],[-58.151,-17.384],[-58.263,-17.344],[-58.396,-17.181],[-58.423,-16.989],[-58.474,-16.935],[-58.47,-16.703],[-58.436,-16.592],[-58.333,-16.49],[-58.322265,-16.265589],[-58.388,-16.261],[-58.430595,-16.322642],[-60.173354,-16.266724],[-60.238,-15.473],[-60.57543,-15.096769],[-60.244,-15.096],[-60.272,-14.62],[-60.321,-14.608],[-60.492,-14.188],[-60.479,-14.097],[-60.380664,-13.988799],[-60.45062,-13.936404],[-60.455989,-13.854216],[-60.490682,-13.857824],[-60.46776,-13.794461],[-60.767546,-13.683292],[-60.876785,-13.621487],[-60.918574,-13.543337],[-61.005601,-13.551996],[-61.012902,-13.489245],[-61.093796,-13.490807],[-61.103141,-13.530561],[-61.181554,-13.505573],[-61.192359,-13.536949],[-61.299537,-13.477175],[-61.465268,-13.554268],[-61.579274,-13.487115],[-61.852,-13.538],[-61.892,-13.431],[-61.969683,-13.407588],[-61.975924,-13.366952],[-62.114977,-13.259315],[-62.115,-13.163],[-62.152539,-13.159928],[-62.167025,-13.113456],[-62.19,-13.153],[-62.214,-13.111],[-62.272687,-13.156875],[-62.391781,-13.134711],[-62.453,-13.064],[-62.612,-13.041],[-62.65,-12.965],[-62.729,-13.02],[-62.779,-13.009],[-62.896724,-12.853898],[-63.011336,-12.836021],[-63.081863,-12.723233],[-63.061627,-12.685844],[-63.157261,-12.613801],[-63.246214,-12.662218],[-63.237129,-12.690429],[-63.301251,-12.681378],[-63.440517,-12.608],[-63.436267,-12.565261],[-63.506408,-12.565622],[-63.552952,-12.505978],[-63.784795,-12.428713],[-63.889567,-12.447451],[-63.899486,-12.502039],[-63.951444,-12.531792],[-64.134642,-12.477322],[-64.167805,-12.515028],[-64.175041,-12.466751],[-64.229451,-12.454185],[-64.290176,-12.503129],[-64.294518,-12.458196],[-64.410575,-12.444359],[-64.512166,-12.355099],[-64.512561,-12.225624],[-64.704064,-12.182697],[-64.707187,-12.086838],[-64.754865,-12.157621],[-64.768801,-12.09356],[-64.837475,-12.117855],[-64.809537,-12.056328],[-64.840774,-12.010268],[-65.035483,-11.994084],[-65.013981,-11.903028],[-65.072696,-11.865867],[-65.086718,-11.708204],[-65.189531,-11.723525],[-65.182161,-11.756092],[-65.259304,-11.710531],[-65.211777,-11.528565],[-65.3074,-11.499572],[-65.332765,-11.339862],[-65.29053,-11.322751],[-65.343466,-11.308197],[-65.358345,-11.268339],[-65.35938,-11.220675],[-65.312945,-11.195782],[-65.353869,-11.184194],[-65.361772,-11.140313],[-65.282689,-11.090091],[-65.300713,-11.031416],[-65.250529,-10.985063],[-65.274764,-10.87302],[-65.353755,-10.788812],[-65.34667,-10.681551],[-65.405689,-10.639345],[-65.430109,-10.485047],[-65.288,-10.219],[-65.333,-9.965],[-65.285884,-9.844131],[-65.39313,-9.686832],[-65.443942,-9.669572],[-65.488301,-9.71015],[-65.556107,-9.844976],[-65.627003,-9.838042],[-65.66963,-9.781288],[-65.710231,-9.808573],[-65.683947,-9.749925],[-65.743201,-9.782964],[-65.770134,-9.734417],[-65.794374,-9.792952],[-65.799619,-9.756631],[-65.865323,-9.795327],[-65.871843,-9.753068],[-65.919756,-9.753138],[-65.982222,-9.810112],[-66.151,-9.785],[-66.426,-9.899],[-66.435,-9.866],[-66.619945,-9.893535],[-66.637012,-9.949831],[-66.875097,-10.08268],[-66.952801,-10.188858],[-66.996826,-10.200173],[-67.015368,-10.259191],[-67.17745,-10.339232],[-67.315446,-10.319324],[-67.311553,-10.377158],[-67.407166,-10.373864],[-67.443611,-10.45492],[-67.579247,-10.502796],[-67.640275,-10.598069],[-67.676308,-10.604839],[-67.708251,-10.710828],[-67.863861,-10.64067],[-68.032891,-10.654856],[-68.104561,-10.714264],[-68.103333,-10.775413],[-68.278194,-10.989261],[-68.715757,-11.144833],[-68.757668,-11.000789],[-68.911804,-11.02192],[-69.414529,-10.925752],[-69.736528,-10.974451],[-69.769028,-10.929722],[-69.934418,-10.921903],[-70.158691,-11.040958],[-70.306724,-11.069832],[-70.436752,-11.039233],[-70.530334,-10.934652],[-70.621025,-10.999821],[-70.623383,-9.820545],[-70.536629,-9.76584],[-70.599722,-9.562644],[-70.55282,-9.57093],[-70.56894,-9.531274],[-70.505061,-9.505566],[-70.496654,-9.424887],[-70.595806,-9.442496],[-70.663203,-9.526011],[-70.750669,-9.560426],[-70.793319,-9.638463],[-70.963367,-9.748913],[-70.993912,-9.817209],[-71.13974,-9.857016],[-71.22052,-9.969678],[-72.180404,-9.999672],[-72.151361,-9.797416],[-72.262955,-9.750855],[-72.252818,-9.616334],[-72.288209,-9.603158],[-72.282899,-9.539953],[-72.356876,-9.494598],[-72.519535,-9.491281],[-72.716756,-9.412195],[-73.203797,-9.407154],[-73.073518,-9.234608],[-73.009298,-9.222365],[-73.026124,-9.177857],[-72.958197,-9.143024],[-72.940912,-8.98494],[-72.999307,-8.917781],[-73.059012,-8.905612],[-73.149923,-8.6839],[-73.209066,-8.685696],[-73.287445,-8.619481],[-73.305502,-8.471966],[-73.389557,-8.468783],[-73.412865,-8.410991],[-73.537444,-8.345869],[-73.627388,-8.021875],[-73.73175,-7.968395],[-73.7725,-7.902372],[-73.761643,-7.858028],[-73.697059,-7.865275],[-73.684303,-7.77644],[-73.822166,-7.717883],[-73.990944,-7.536347],[-73.948005,-7.526614],[-73.919808,-7.465678],[-73.963944,-7.347639],[-73.87014,-7.378823],[-73.700302,-7.304295],[-73.79842,-7.113061],[-73.71046,-6.84019],[-73.536393,-6.6834],[-73.39115,-6.641929],[-73.352809,-6.593267],[-73.227413,-6.588843],[-73.187967,-6.523016],[-73.135226,-6.510461],[-73.104726,-6.406664],[-73.246638,-6.149625],[-73.238213,-6.043992],[-73.186803,-6.005125],[-73.152068,-5.86796],[-73.053029,-5.79517],[-72.959116,-5.656891],[-72.958885,-5.466129],[-72.860525,-5.271167],[-72.887249,-5.163067],[-72.73986,-5.088593],[-72.727648,-5.051993],[-72.621198,-5.051804],[-72.597999,-4.98386],[-72.382017,-4.872956],[-72.368955,-4.803869],[-72.126014,-4.734541],[-72.043346,-4.623844],[-72.00689,-4.646223],[-71.994637,-4.60996],[-71.947433,-4.608773],[-71.919086,-4.529796],[-71.88549,-4.538029],[-71.907302,-4.516441],[-71.766368,-4.504462],[-71.75109,-4.468866],[-71.708175,-4.511649],[-71.654788,-4.47246],[-71.650325,-4.503949],[-71.615477,-4.468695],[-71.633502,-4.515243],[-71.596251,-4.529276],[-71.537028,-4.464416],[-71.494284,-4.487006],[-71.507159,-4.439087],[-71.434375,-4.428818],[-71.42562,-4.470577],[-71.350261,-4.427278],[-71.307517,-4.462876],[-71.320906,-4.420089],[-71.277819,-4.442168],[-71.269751,-4.385003],[-71.202632,-4.379868],[-71.19422,-4.42471],[-71.144782,-4.38158],[-71.114913,-4.41119],[-71.106158,-4.377643],[-70.993892,-4.386543],[-70.995951,-4.34632],[-70.935698,-4.384318],[-70.844829,-4.279054],[-70.864474,-4.252452],[-70.816768,-4.230047],[-70.845805,-4.218722],[-70.759013,-4.159443],[-70.681468,-4.207908],[-70.642561,-4.128052],[-70.62521,-4.191505],[-70.561177,-4.177496],[-70.57357,-4.211693],[-70.547957,-4.136705],[-70.510363,-4.148242],[-70.504167,-4.200981],[-70.485349,-4.16132],[-70.43435,-4.162663],[-70.431458,-4.132173],[-70.33892,-4.179968],[-70.322808,-4.142062],[-70.287693,-4.165548],[-70.291411,-4.287086],[-70.214572,-4.297487],[-70.19194,-4.361791],[-70.155083,-4.273079],[-70.117489,-4.28585],[-70.108814,-4.25454],[-70.041889,-4.294089],[-70.079483,-4.314275],[-70.028256,-4.370297],[-69.991824,-4.374822],[-69.947926,-4.231683]],[[-34.000346,-3.766545],[-34.017967,-3.849854],[-34.006639,-3.918085],[-33.986081,-3.959524],[-33.959229,-3.992171],[-33.892099,-4.036535],[-33.816578,-4.050765],[-33.729309,-4.031513],[-33.666375,-3.9838],[-33.627356,-3.918504],[-33.615189,-3.849854],[-33.632391,-3.768639],[-33.686933,-3.695371],[-33.749868,-3.659782],[-33.816578,-3.648896],[-33.893358,-3.663969],[-33.960068,-3.708769],[-34.000346,-3.766545]],[[-32.553802,-4.008842],[-32.599371,-3.953096],[-32.640605,-3.873093],[-32.617548,-3.73712],[-32.583381,-3.705275],[-32.542283,-3.656062],[-32.459198,-3.630287],[-32.351742,-3.638874],[-32.300491,-3.676843],[-32.247488,-3.752659],[-32.23155,-3.818895],[-32.235697,-3.902469],[-32.301938,-3.988305],[-32.428982,-4.038401],[-32.553802,-4.008842]],[[-29.503214,0.793907],[-29.540975,0.868896],[-29.547268,0.92553],[-29.523668,0.994224],[-29.489578,1.061343],[-29.431364,1.102242],[-29.35899,1.120595],[-29.292384,1.113778],[-29.221584,1.077598],[-29.162845,1.003138],[-29.145014,0.926054],[-29.147636,0.883579],[-29.171761,0.819603],[-29.248855,0.743565],[-29.294482,0.72521],[-29.36371,0.718918],[-29.43556,0.739369],[-29.503214,0.793907]],[[-29.095373,-20.426486],[-29.197561,-20.335094],[-29.334298,-20.289323],[-29.467412,-20.328798],[-29.546045,-20.429577],[-29.553961,-20.527057],[-29.516965,-20.626133],[-29.409954,-20.689546],[-29.275994,-20.725777],[-29.159683,-20.662087],[-29.071882,-20.570881],[-28.971199,-20.647689],[-28.832861,-20.698136],[-28.679676,-20.620991],[-28.635486,-20.492836],[-28.634116,-20.471458],[-28.743098,-20.300936],[-28.868302,-20.272879],[-29.003102,-20.324158],[-29.095373,-20.426486]]],"terms_text":"IBGE","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAOsSURBVHja7JXbb1RVFIe/fTmn05lepp0OpTcuUgQEElGgGGJSNYhggpdoTEz8m3w1xsQHE00MJj5oDGKCRI2IqKEKlpZCaSmXXubWmc6Zc/bFhwGp3N540LiTX7KTvbLWyvp+WVt473mUR/KIz7+/gJ64uNisJAW1lcbGUz9f+MQ6l5dCGID7EWpEMYcO7GB6tsifE9cItGo+CEEYaLyXl/p620+O7Nn2rp67sQCAUpLFpeXRYsWOKCUBcZ/UgqgRs2tnP5l0K2Pnx/GEJLYZ7RHU6hYwjy+V5l+KomStbElpmlKUl6NXpRQ0xV0SJCZhaKCdwwd2cHmmQJI4lAQpQAiQwqOkQEmJVprr89UjOt+TQylJobA8Wig0Xpby/liiKGawv503jjyFFJJiuY6Q4sFwpcAYl9JJnECguDq39EpinAoCif97QALnHEli2Lq5hxdHt5JpDZoJBDj3YLjOQyqUVb1UKCGlYH6xuk+pW7A8GOexJiHdqtn39AbW9nbw2Re/sbLS4Jk9mxgayHL23HUS41FyNaWmMax1ZPPtZ8Xv49eZXygdPnXmypcCiRAQhpqOtpB1g53sH9lMpVLno09P47xCSIjjhNcO7ySKYn4du4oxDucFUkqkFAgB1lp271p/SOdzbUT12tvbhntIZwLyXW309+XIdWcIAg3A+OQNEguplmarRinmbpQ5+NwT7N61EZMYKrWYUjmiUlmhutKgNaXG1g92H9dz1wrpqculkSg21OqOhcWIPy40reu9ZdvmXrq6Mgg8znkQAmsM+e4MADOzi/wyNsNSsU6tmhAbSxwbtgznfspkWqwulupHLs0UhtVd7nG3WMxcneSFZx/j4PNbOPHdRZx17N+7jlx3mo+PnmZ2roTzAqUkUkqEkKRSOh7s73nfuwB9c6H4phASpf5ZQN2++ICp6SLvvLWXTRvW4L1nemaRz786R62WEIYaLe7Y1VhHbz79Q0tKnqnWq8hCKXpSqYf5GeoNgzGObGeaiambHDsxQSN2tLQEiFXJPeC9p7M99bWUEikkMtSi5B/mZ+fpzraiteLHM1N8c3ISrTVKins3lfekU6rSu6btaBwnWGuQA33ZD7x3WNuE6P1tNbsx1tK/toMrs0uc+H6KIAyA1XF3lCSWgb7ssaGB/MVcVwc93Z3o7duH3yuWl7Pl5fh1JYKs815a571A4Lynoz0k35Ph+LfnybSG97BavQnDQIZdXZkPy8sNrG2ORfz/Zf73C/w1AJZ/tYbRRy7/AAAAAElFTkSuQmCC"},{"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,12],"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":"https://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":"https://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":"https://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":[[[130.35020577038,31.45741016686],[130.26851246373,31.45817385365],[130.20875325037,31.44939107956],[130.1002018703,31.44996389428],[130.09236826555,31.39190087104],[130.13355064479,31.37527753679],[130.35042958766,31.37527753679],[130.35020577038,31.45741016686]],[[130.41929509606,31.41715162138],[130.41699602753,31.41672525385],[130.41677221025,31.47525012446],[130.34179342195,31.47505923817],[130.34179342195,31.48374417037],[130.33362409129,31.48374417037],[130.33328836537,31.50044369718],[130.36674904851,31.49996660922],[130.36663713987,31.52458116919],[130.3501865699,31.5254396996],[130.35041038717,31.54985681512],[130.32523094334,31.55023828188],[130.32500712606,31.60029225564],[130.31661397812,31.63336079174],[130.31633914795,31.65083990804],[130.37520309219,31.65083990804],[130.3116389851,31.67598607789],[130.29194306459,31.69179419869],[130.29104779548,31.73234970456],[130.25210358902,31.73387257039],[130.24986541623,31.7169292784],[130.24426998427,31.71711966967],[130.21629282446,31.75804471218],[130.17533426249,31.75918654703],[130.1742151761,31.7825910568],[130.18383931907,31.79096196372],[130.23643637952,31.79096196372],[130.26911370218,31.77003327552],[130.36334077643,31.757854405],[130.42668106625,31.70893249188],[130.62408790589,31.70759962708],[130.62587844412,31.68627118535],[130.61088268646,31.62244704056],[130.55582363594,31.50249175717],[130.54239459923,31.41715162138],[130.42158428174,31.41715162138],[130.41929509606,31.41715162138]],[[130.52516066879,31.24183714215],[130.54440895474,31.24107169669],[130.56858122082,31.21714840084],[130.59924418797,31.21657416733],[130.59924418797,31.26632812093],[130.57641482557,31.26632812093],[130.57350520095,31.31624706403],[130.63080242424,31.2839270868],[130.68989018577,31.27665834675],[130.66706082336,31.26058861785],[130.66594173697,31.2192538939],[130.64400764367,31.18134784608],[130.59006767955,31.14687462722],[130.54239459923,31.17502869506],[130.54239459923,31.19130444028],[130.5000931336,31.19207028876],[130.5000931336,31.21580851721],[130.52493685151,31.21714840084],[130.52516066879,31.24183714215]],[[130.74987321641,31.16621947793],[130.74964939913,31.24107169669],[130.77449311704,31.25886669886],[130.77717892438,31.33307201163],[130.75121612008,31.3745479497],[130.74897794729,31.41657860612],[130.67556587994,31.46851775588],[130.67489442811,31.50077426676],[131.40006241045,31.50020176294],[131.40834364976,31.45916319691],[131.36693745323,31.40932010999],[131.36559454956,31.35142307004],[131.31702620013,31.34205683123],[131.29956845241,31.36594845228],[131.24316649822,31.36633066888],[131.19952212892,31.43357656998],[131.14782033758,31.45018957859],[131.13394366631,31.44999864121],[131.13260076264,31.42899315281],[131.10059489182,31.4253644553],[131.05090745599,31.41638760026],[131.04911691776,31.39155352706],[131.08403241321,31.35084965365],[131.11626210131,31.35084965365],[131.11782882226,31.33421905765],[130.99942948193,31.33364553639],[130.99965329921,31.25102200373],[130.87521089237,31.250639319],[130.87453944053,31.16679401706],[130.74987321641,31.16621947793]],[[130.86624800392,30.47467824549],[130.86602418665,30.4993660172],[130.93361700475,30.57493333731],[130.93227410108,30.61596948602],[131.00635762027,30.61654733583],[131.04933053774,30.59111868252],[131.04933053774,30.54274730545],[130.99203331444,30.50842948616],[130.99113804533,30.4752569368],[130.86624800392,30.47467824549]],[[137.8748637557,36.37519421155],[138.00004956356,36.37493936048],[138.00004956356,36.30839468919],[138.04159352635,36.30826715442],[138.04191005178,36.29174963873],[138.08305835778,36.29162207674],[138.08353314592,36.24989812235],[138.13306937584,36.24996193747],[138.13354416398,36.16676665118],[138.16654194014,36.16670276819],[138.16693759693,36.12484822641],[138.04167265771,36.1249121435],[138.04143526363,36.04158405062],[137.87478462434,36.04152006575],[137.8748637557,36.37519421155]],[[138.37446443279,35.8339347068],[138.49980210875,35.83284598419],[138.49980210875,35.75042265703],[138.74935837428,35.75060430014],[138.75070127796,35.58331750158],[138.62446833288,35.5838635715],[138.62536360199,35.49990716236],[138.37491206735,35.49972494883],[138.37446443279,35.8339347068]],[[135.791788714,35.6416524565],[135.80060419232,35.6492299306],[135.83399762526,35.65051596353],[135.89160525366,35.62003141459],[135.89271309267,35.60909530501],[135.95775906869,35.60858062772],[135.98339762858,35.61720103553],[135.98434720487,35.64099882962],[135.95095377193,35.64189914759],[135.95047898378,35.68304570763],[135.94224932258,35.69204369082],[135.94177453443,35.73239358289],[136.00808661218,35.7751627038],[136.03166775677,35.77503430242],[136.05018449447,35.75012051215],[136.05002623175,35.66646105164],[136.00840313761,35.65836031603],[136.00856140032,35.61694372337],[136.0340416975,35.60021665776],[136.06664381687,35.59995929098],[136.06616902872,35.61655775359],[136.10019551253,35.62492001521],[136.10019551253,35.69127247488],[136.07598131707,35.69165808378],[136.07503174078,35.74922141512],[136.0834196647,35.76694459715],[136.12440970798,35.76604569021],[136.15020653058,35.70039805209],[136.15875271721,35.64215637943],[136.17442072604,35.62492001521],[136.17552856504,35.58342174019],[136.17489551418,35.55812619512],[136.1585944545,35.55831932114],[136.15875271721,35.5670095101],[136.11649657221,35.56675203657],[136.11625917814,35.52554561689],[136.04044971041,35.52470191934],[136.01683698753,35.50311340405],[136.01661317025,35.48334161402],[135.97543079101,35.48334161402],[135.94141056468,35.50885268976],[135.94185819923,35.56640504504],[135.93357695993,35.57487049764],[135.90873324202,35.57514356187],[135.90850942474,35.59953354293],[135.83185200685,35.59971552979],[135.79279589175,35.62518960433],[135.791788714,35.6416524565]],[[135.80915921172,35.4750487703],[135.77043882253,35.53344498229],[135.75790505494,35.53326284486],[135.74167830225,35.51641334477],[135.70071974028,35.51705095781],[135.67464502734,35.53362711931],[135.67542838781,35.56658710719],[135.69960065389,35.58333505571],[135.81654518191,35.5834260676],[135.81654518191,35.56804358954],[135.85817519571,35.54956250693],[135.85851092163,35.5254305443],[135.85090113416,35.52470191934],[135.85011777368,35.4751399051],[135.80915921172,35.4750487703]],[[135.58332757771,35.44132180519],[135.61656444356,35.44989161714],[135.64163197876,35.4749576354],[135.71638694978,35.47477536528],[135.71728221889,35.46702850341],[135.81441891776,35.46538789573],[135.86668025229,35.44186884172],[135.86679216093,35.40867523135],[135.81721663374,35.40821917993],[135.81676899918,35.3849571361],[135.7754747113,35.38349733314],[135.7583526895,35.40803675864],[135.59183263429,35.40840160081],[135.58321566907,35.4253649376],[135.58332757771,35.44132180519]],[[135.40011097158,35.43312261685],[135.42495821789,35.44189082899],[135.4580351254,35.45007792954],[135.4589847017,35.49164522829],[135.46642304932,35.49183851435],[135.46618565524,35.5080728839],[135.44181319708,35.51709056025],[135.43967665042,35.53293345221],[135.45843078219,35.55804382162],[135.52323936414,35.55810819707],[135.52498025401,35.50910352674],[135.54151870776,35.50008495336],[135.54151870776,35.48339792301],[135.57514953478,35.48365566411],[135.57491214071,35.49164522829],[135.6087803618,35.49170965703],[135.60893862451,35.46683632488],[135.59208364533,35.45826419724],[135.53305165249,35.45826419724],[135.50029127041,35.45007792954],[135.50044953312,35.44150401624],[135.50788788075,35.4250627562],[135.53336817792,35.42512723828],[135.53297252113,35.38346105831],[135.54159783912,35.38333202741],[135.54175610184,35.36687889716],[135.50860006297,35.35836066507],[135.5089165884,35.34216063858],[135.50013300769,35.34164424964],[135.50013300769,35.41661515666],[135.3998735775,35.41655066776],[135.40011097158,35.43312261685]],[[133.70822156225,35.45816409093],[133.70822156225,35.33318625316],[133.12484182584,35.33327754848],[133.12495373448,35.37489746931],[132.95876940519,35.37507996558],[132.95820986199,35.45779947415],[132.87506174303,35.45852870604],[132.87461410847,35.52504328752],[132.95015243997,35.52522544361],[132.94970480541,35.55818888426],[133.01673808032,35.55855304549],[133.01684998896,35.56674623573],[133.03352437621,35.56692829711],[133.03307674165,35.5920487997],[133.0668731507,35.59186679541],[133.06653742479,35.61679752725],[133.14135176147,35.61671112498],[133.14151002418,35.59181218751],[133.36666664955,35.59185602422],[133.36689046683,35.57483679329],[133.34215865756,35.57447270605],[133.34193484028,35.55799602729],[133.33320596642,35.55025719141],[133.28363043923,35.55016614184],[133.28340662195,35.49178209483],[133.33354169233,35.49159986286],[133.33354169233,35.4752884282],[133.41713744585,35.47492388905],[133.41713744585,35.37516041329],[133.4999498389,35.37534290896],[133.49972602162,35.45806214773],[133.45854364238,35.45806214773],[133.45854364238,35.5162885278],[133.49211623415,35.53350232911],[133.54135603542,35.54160702023],[133.58343368378,35.54197125678],[133.58354559242,35.45842676331],[133.70822156225,35.45816409093]],[[133.84174199676,35.46646185214],[133.84158373405,35.58367337011],[133.97499920311,35.58328723983],[133.97531572854,35.50860042068],[134.00823437334,35.50834275959],[134.03339814508,35.49971063549],[134.04210259443,35.474968664],[134.04431827244,35.45834087408],[134.08356742586,35.45859869551],[134.08309263771,35.53358961595],[134.13326191849,35.54968677959],[134.2332839546,35.55998726867],[134.27490704875,35.58341595013],[134.33298946529,35.58367337011],[134.3352051433,35.49172187329],[134.36654116095,35.49223730128],[134.36654116095,35.49996832427],[134.41718522987,35.49971063549],[134.41591912815,35.54170299025],[134.62530070059,35.54157421294],[134.62514243787,35.37553750794],[134.70838862616,35.3746341986],[134.70823036344,35.33397481479],[134.41655217901,35.33358748416],[134.41591912815,35.37527942059],[134.39217972084,35.37540846437],[134.39154666998,35.35011194072],[134.37477082215,35.33345837354],[134.20004878437,35.33358748416],[134.19938857992,35.35874491549],[134.24997128486,35.39971317226],[134.2751507287,35.39962195204],[134.27503882006,35.39205031412],[134.35818693902,35.39314505273],[134.35852266494,35.39989561238],[134.37519705219,35.39998683229],[134.37441369171,35.42488600691],[134.33255986063,35.42506839006],[134.33278367791,35.41658713686],[134.04954291197,35.41658713686],[134.050773907,35.39177662715],[134.06610539058,35.39186785624],[134.06711256833,35.39998683229],[134.14186753935,35.4001692718],[134.14164372207,35.36677596772],[134.18338564451,35.35847111553],[134.18372137043,35.3333688437],[133.78308844191,35.33364272875],[133.78331225919,35.3415849913],[133.82471845571,35.35920124668],[133.82505418163,35.38310939264],[133.84172856888,35.40837862237],[133.89980915265,35.40892588268],[133.89980915265,35.41676953879],[133.85829104749,35.41658713686],[133.85739577837,35.46645867604],[133.84174199676,35.46646185214]],[[133.24986715088,33.66667502084],[133.41786302325,33.66674088],[133.52484861884,33.66674088],[133.5249277502,33.79178216553],[133.64156737143,33.79184792875],[133.64188389686,33.66680673911],[133.75005646282,33.66687259817],[133.7502938569,33.62517372978],[133.79152129425,33.62497605673],[133.79167955697,33.5084018887],[133.73335974635,33.5084018887],[133.73328061499,33.51658303581],[133.64196302822,33.51671498346],[133.6083322012,33.48345781283],[133.5249277502,33.46682443689],[133.47491673214,33.41934896387],[133.43313537528,33.38321323101],[133.37497382738,33.38334538172],[133.37497382738,33.4915753247],[133.20816492538,33.49190528877],[133.20824405673,33.55826847379],[133.24947149409,33.55833441583],[133.24986715088,33.66667502084]],[[134.35010199023,33.73355124395],[134.48320093386,33.73368285973],[134.48335919658,33.66732292669],[134.43366470395,33.65032970689],[134.43287339037,33.63412374427],[134.35279245639,33.63346490079],[134.35010199023,33.73355124395]],[[140.31655633412,36.21655924286],[140.31670857142,36.44984371664],[140.34972550975,36.44993784711],[140.35012116654,36.51667940915],[140.47467392354,36.51671120743],[140.47483218626,36.59159167371],[140.62489198016,36.59204412991],[140.62466816288,36.63354434507],[140.64973569807,36.63480157867],[140.6504071499,36.71683657266],[140.69912259173,36.81553707084],[140.71006153063,36.91305702097],[140.70837582504,36.95687206208],[140.74955820428,36.95866053873],[140.75322567003,37.06176178104],[140.75001124397,37.16670649618],[141.00831455851,37.16665576788],[141.00836843323,37.09170040353],[140.98331342638,37.05827740145],[140.98333134606,36.95834221234],[140.90833717097,36.90001505806],[140.81672362984,36.89998820089],[140.80827903855,36.87497854873],[140.80832751008,36.84999814762],[140.81655279507,36.85004292272],[140.81669039224,36.84150363067],[140.81669268087,36.81815641451],[140.79987840782,36.8083235537],[140.78339986069,36.79992318494],[140.77500355026,36.7952284511],[140.77498205056,36.78338477344],[140.75836081806,36.77499922674],[140.75825340609,36.75837229112],[140.7500237449,36.75830889371],[140.74688638087,36.71939040314],[140.73335857243,36.65047700125],[140.69167208421,36.58337353738],[140.65003069722,36.51336154863],[140.64998216361,36.38351382821],[140.59986271995,36.27483428417],[140.57499364049,36.247961428],[140.57462747735,36.21728656365],[140.31655633412,36.21655924286]],[[141.21659460884,41.24992504972],[141.41662092018,41.24971143017],[141.3985787742,41.17051732489],[141.40426133986,41.09679470963],[141.39502717066,41.04045724412],[141.3985787742,40.97184467053],[141.40625023785,40.91003228264],[141.41136454694,40.83010568063],[141.41306931664,40.80204405626],[141.42244554999,40.74986737343],[141.34161105343,40.75083597368],[141.31490299481,40.74556231273],[141.29203066802,40.74168751981],[141.2332161134,40.741902792],[141.23307404926,40.858370329],[141.25026381039,40.85858522311],[141.24941142554,40.916473772],[141.17411743051,40.91690318231],[141.22497639319,40.99479494983],[141.23818835836,41.06959595271],[141.24969555383,41.12580144291],[141.27143136749,41.15875294418],[141.23335817754,41.22994860165],[141.21659460884,41.24992504972]],[[141.25853811897,41.31660436526],[141.15014769418,41.31671753815],[141.14989655789,41.39163254467],[141.18877245631,41.39204703296],[141.21624676695,41.37915897915],[141.25848789171,41.36012370261],[141.25853811897,41.31660436526]],[[141.05840812211,45.25840298159],[141.03452758266,45.25832991558],[141.0087358852,45.25815313759],[141.00829855109,45.2749503937],[140.99993571248,45.2749503937],[141.00002145578,45.30370739875],[140.99998630938,45.30828451785],[140.99195968538,45.30845936456],[140.99171107313,45.3416205272],[140.98350686895,45.3417203809],[140.98336480481,45.34998266412],[140.97476992425,45.35008250306],[140.9750185365,45.36670323221],[140.96663675214,45.36675313695],[140.96684984835,45.39818437653],[140.966494688,45.42498689786],[140.95839703193,45.42483733769],[140.95815451327,45.43314299759],[140.95011815184,45.43349546179],[140.94966610651,45.51650986935],[140.97442814517,45.51672103552],[140.97447837243,45.50014208116],[140.9830672337,45.50042371776],[140.98331837,45.4669695229],[140.99045064077,45.46703997365],[140.99135473143,45.45876140769],[141.000194729,45.45812725464],[141.00034541078,45.45002356013],[141.01626745186,45.45019973978],[141.01636790638,45.47496512106],[141.04991971535,45.47531732397],[141.04991971535,45.46675817011],[141.06614311999,45.46679339563],[141.0664947108,45.45019973978],[141.07463152675,45.44998832413],[141.07498311756,45.34178065157],[141.06659516532,45.34167474083],[141.06418425689,45.30611284333],[141.06644448354,45.30565360635],[141.06629380176,45.28484273553],[141.05906107648,45.28357051614],[141.05840812211,45.25840298159]],[[144.27488180314,42.96671405694],[144.27502386729,42.99155438113],[144.25861545893,42.99145046763],[144.25804720237,42.98313681807],[144.20818268867,42.98318878187],[144.20853784903,42.97471810232],[144.16684202347,42.97502992716],[144.16684202347,43.00495774998],[144.16641583105,43.04177598129],[144.0748554918,43.04187980967],[144.07492652387,43.10025542281],[144.24987851423,43.09999609865],[144.24987851423,43.11679803377],[144.29178743599,43.11674618304],[144.2920005322,43.09190463314],[144.41680388058,43.09185276132],[144.41680388058,43.11679803377],[144.56653948581,43.11679803377],[144.56675258202,42.99171025106],[144.50005346755,42.9915024244],[144.50019553169,42.92480576324],[144.46652633013,42.92501381529],[144.31738592868,42.96675438272],[144.27488180314,42.96671405694]],[[140.69972478088,42.5751298131],[140.70015284963,42.61646613432],[140.84450599182,42.61672487035],[140.99960776742,42.61668790813],[141.00006375193,42.54167666875],[141.24984166465,42.54168238797],[141.24994211917,42.58335654436],[141.29163074409,42.58331956233],[141.29158051683,42.62509525569],[141.37500799393,42.62498438386],[141.37500799393,42.66662133905],[141.4999231869,42.66665827162],[141.4999231869,42.81649728565],[141.47496023921,42.81650491617],[141.47511092099,42.8334137279],[141.81235902085,42.83357414934],[141.95751579918,42.83327948275],[141.9435526212,42.77977422873],[141.9576162537,42.77896318716],[141.95831943532,42.75020121185],[141.99990760572,42.75086510026],[141.9992044241,42.71493114279],[142.0003094238,42.67631769199],[142.01798941894,42.65075907775],[142.0908189444,42.65002023325],[142.09122076247,42.52510348612],[142.02471987164,42.52510348612],[141.96032852568,42.52495541975],[141.86650400599,42.52517751918],[141.86559991533,42.57712707332],[141.83576492352,42.58518943644],[141.80482493201,42.57416814647],[141.74646085713,42.57705310186],[141.73068949782,42.61476715705],[141.61707543811,42.6105531897],[141.52134228257,42.60330745653],[141.45614730047,42.57586954656],[141.35619505519,42.52865697374],[141.27522871378,42.48822412486],[141.19506600852,42.43790576605],[141.10475739695,42.39140503755],[141.05392741091,42.33165259938],[141.02539832783,42.29161268611],[140.95186562075,42.29146406758],[140.91469744913,42.32682538905],[140.89450609104,42.37174125443],[140.88425973022,42.42722922291],[140.85040655769,42.46095792778],[140.76642658075,42.49977903608],[140.76662748979,42.52821279884],[140.69972478088,42.5751298131]],[[140.75005175023,43.23374469699],[140.82761698213,43.21350425464],[140.88245374078,43.22530637354],[140.97337479139,43.24600632559],[141.02139247124,43.2431087556],[141.04213383591,43.20211407957],[141.08345726584,43.18205479137],[141.17267354675,43.16382009604],[141.25677551857,43.19365585362],[141.37528066948,43.33327171855],[141.6249101464,43.33334478655],[141.62450832833,43.41680402892],[141.79146373703,43.41680402892],[141.79196600962,43.83339131087],[142.12487228186,43.83331884728],[142.12487228186,43.75021775035],[142.16656090677,43.74992749181],[142.16656090677,43.83317391984],[142.24953633854,43.83324638361],[142.24983770209,43.8580962632],[142.27464996801,43.8580962632],[142.27464996801,43.87424675433],[142.26671406109,43.87489847601],[142.26651315206,43.91688328705],[142.24993815661,43.91710037291],[142.25000627225,44.49999904167],[142.4999694516,44.50012874722],[142.49976854256,43.88365981984],[142.51674535608,43.88344261201],[142.51644399253,43.83346377437],[142.6247339628,43.83346377437],[142.6247339628,43.58330511259],[142.54175853103,43.58403277336],[142.54195944007,43.50007553209],[142.5005721787,43.500221266],[142.50037126967,43.250063364],[142.25054088372,43.25013653203],[142.25003861113,43.45838119826],[142.00030867969,43.45816244584],[142.00000731614,43.41724183211],[141.91703188437,43.41687699634],[141.91703188437,43.33341785446],[141.87494144139,43.33327171855],[141.87453962331,43.17487339597],[141.93350642531,43.17472687911],[141.93390824338,43.15868115634],[141.9913682276,43.15802165291],[141.99207140923,43.13339509811],[141.87524280494,43.13332178998],[141.87484098687,43.00012273874],[141.49984427164,43.00026967384],[141.5001456352,42.91682752603],[141.25021479473,42.91631255378],[141.25001388569,42.99990233543],[141.12504846546,43.00004927106],[141.12524937449,43.08323181508],[140.99988213619,43.0835986549],[141.00008304522,43.16637483706],[140.75085538638,43.16659464227],[140.75005175023,43.23374469699]],[[140.59120711887,41.7835290469],[140.58381978351,41.83340389909],[140.58453010422,41.87731665106],[140.59092299059,41.91612521476],[140.60797068758,41.9440274172],[140.57543799916,41.95913601413],[140.58438804008,41.99979520491],[140.71039893366,42.00011192783],[140.86894251566,42.00011192783],[140.9172443238,42.00053422262],[140.99040735671,41.91908511782],[141.04737507748,41.90692749714],[141.12721512505,41.88398028822],[141.17551693319,41.8373202361],[141.20194086352,41.8148774364],[141.18418284582,41.78321124824],[141.11300871089,41.7671073878],[141.05689337497,41.71559028285],[140.99381689611,41.6996815955],[140.94267380514,41.70413642477],[140.89238309902,41.73562962373],[140.84805908685,41.74326201425],[140.80018347113,41.75672249187],[140.73298713217,41.74633591528],[140.69704490435,41.73234317623],[140.68809486343,41.76986228217],[140.59120711887,41.7835290469]],[[140.24179585193,42.23380417915],[140.24159494289,42.25826958158],[140.21005222428,42.25797218685],[140.20804313392,42.27484711876],[140.26610584525,42.27514443389],[140.26510130007,42.29179184247],[140.29001402051,42.29119736791],[140.29182220183,42.26778547222],[140.33913627975,42.24139021231],[140.34144673366,42.21662067407],[140.29322856508,42.21662067407],[140.24179585193,42.23380417915]],[[140.5500698319,42.08446643616],[140.54976846834,42.11387080944],[140.58065823259,42.11193329833],[140.62636503822,42.12068888716],[140.63364799077,42.12135947813],[140.63359776351,42.10060512509],[140.6085343613,42.0996361742],[140.60848413404,42.08327357565],[140.54971824108,42.08312446651],[140.5500698319,42.08446643616]],[[140.65829476124,41.06668390404],[140.67117312553,40.91973845213],[140.84491757068,40.91651794496],[140.91726268929,40.91688446951],[140.91712062514,40.87597060622],[140.98460109239,40.87532609104],[140.98502728482,40.79277634954],[141.13391050519,40.79191591552],[141.13972013932,40.68033688317],[141.17424172572,40.68173742982],[141.18503860048,40.60056495195],[141.4335087841,40.60078068023],[141.43308259168,40.51756583822],[141.1830497025,40.51648584823],[141.18361795907,40.58222550347],[141.16713851864,40.59171949298],[141.0439689079,40.59236676137],[141.04283239476,40.65824744906],[140.98401784015,40.65835522015],[140.72645555147,40.65857076182],[140.7258872949,40.5752120322],[140.6684933817,40.57467250396],[140.60882644224,40.57488831578],[140.60925263466,40.48310558373],[140.55058014419,40.48299753002],[140.54887537449,40.51756583822],[140.4002762824,40.51691784631],[140.40013421826,40.58319654154],[140.25664943526,40.58233339729],[140.24897797162,40.6329164137],[140.33251168687,40.6329164137],[140.33251168687,40.6668685866],[140.41675572282,40.66697634376],[140.41703985111,40.73310636766],[140.3319434303,40.73375226547],[140.33350613586,40.75850695413],[140.28420987873,40.7581841262],[140.28037414691,40.85678885153],[140.30253615299,40.98506688683],[140.31844733685,41.00018619857],[140.42442718647,41.00040063195],[140.42442718647,40.9002917234],[140.55043808005,40.89975482521],[140.54993594969,41.06668469228],[140.65829476124,41.06668390404]],[[140.01669286591,40.33380933454],[140.25251934093,40.33380933454],[140.25006213354,39.33298346786],[139.9834077398,39.33320323377],[140.05621967123,39.72433162037],[140.00614206132,39.7704262598],[139.9407337113,39.88023137264],[139.94158325159,40.01081102788],[139.94055447894,40.08508825139],[139.94115720605,40.10875598318],[140.01669286591,40.33380933454]],[[139.85814158604,39.04176309557],[139.87552021763,39.04137298588],[139.8770270354,39.00008721208],[139.91670656996,39.00000914431],[139.91670128995,38.7917265095],[139.75492583732,38.79164845102],[139.75020447498,38.79386031243],[139.79375938684,38.89687193302],[139.79014302419,38.92540244092],[139.83615119338,38.99101811819],[139.85814158604,39.04176309557]],[[139.37551097227,38.1173978813],[139.38053369817,37.95892457768],[139.41699868815,37.9584493548],[139.41699868815,37.87412788746],[139.37571188131,37.87460365543],[139.37611369938,37.83296233149],[139.29233463147,37.83145487116],[139.30006962935,37.78073866603],[139.29173190436,37.68357441277],[139.2919328134,37.66473061802],[139.22934964877,37.65940260168],[139.18113148019,37.61023958654],[139.14536967182,37.60769304313],[139.12367149596,37.62671043285],[139.09815604842,37.65017707221],[139.08831150567,37.66640051458],[138.99950971187,37.66655955038],[138.9994226694,37.79170868021],[138.81260832323,37.79198934291],[138.86834406289,37.84689141822],[138.9915013018,37.91333515169],[139.08231218596,37.97750182191],[139.27679213256,38.03417532016],[139.37551097227,38.1173978813]],[[139.96008286406,38.49993004113],[140.50032726119,38.50008727416],[140.50022680667,38.16653588757],[140.37496002288,38.16653588757],[140.37536184095,38.08348155828],[140.25039642072,38.08292807287],[140.21704552078,38.07407173651],[140.22136506505,38.04219586845],[140.25120005686,38.04195852705],[140.25039642072,38.0001744595],[140.23372097075,37.99962034404],[140.23352006172,37.94196948017],[140.20860734128,37.94109803478],[140.20840643225,37.90012844634],[140.19253461842,37.89965284327],[140.19122870969,37.88371836434],[140.15838008235,37.88300479955],[140.15827962783,37.8581049883],[140.07530419606,37.85945328271],[140.07409874185,37.87475866032],[140.0501905666,37.87571018504],[140.0501905666,37.89251842835],[140.05762420092,37.89354899768],[140.05812647351,37.92541025073],[140.07409874185,37.92572720879],[140.07419919637,37.94196948017],[140.09871009873,37.95369337696],[140.09820782614,37.99233729463],[140.10182418878,38.00041193627],[140.12281918302,38.00080772918],[140.11548600321,38.01806222303],[140.08976964664,38.02795402283],[140.07470146896,38.04132561289],[140.06726783463,38.0349170489],[140.0670669256,37.99186228803],[140.01633739407,37.99170395181],[140.01583512148,38.0660052113],[139.99805467182,38.06655882479],[139.99966194411,38.13738675813],[139.99956148959,38.17514410602],[139.9979542173,38.33370049749],[139.95787286467,38.33377929514],[139.95837513726,38.50028381497],[139.96008286406,38.49993004113]],[[140.70821747827,38.78330258189],[140.70837353831,39.15023077225],[141.04194014274,39.14956975049],[141.04167202485,39.50007808975],[141.00146787279,39.49985884928],[140.998932853,39.91638279149],[141.25077232931,39.91692211681],[141.25037051124,39.50069531694],[141.16709371592,39.50007521498],[141.1669932614,39.45626652209],[141.16669189785,39.40272822458],[141.16689280689,39.25073529211],[141.2079787047,39.24995738356],[141.20898324987,38.8747057376],[141.03399147974,38.87509676593],[141.03338875263,38.78353750059],[140.86794016169,38.783145969],[140.70821747827,38.78330258189]],[[141.37590200536,38.36972154065],[141.37476549223,38.4999203515],[141.24903872693,38.50025389276],[141.25133490268,38.668858542],[141.52523456764,38.66652919592],[141.54981166414,38.63368844711],[141.55052198484,38.55563135133],[141.5554942298,38.47938004219],[141.56558078385,38.39558849019],[141.5462600606,38.37398500653],[141.55918789748,38.32429480069],[141.5985396647,38.31225706776],[141.59527218944,38.26062821377],[141.50761861409,38.23664120781],[141.46982955243,38.2447865207],[141.39226253112,38.27724712227],[141.41158325438,38.34780719677],[141.37590200536,38.36972154065]],[[131.04175307036,33.73809881635],[131.04130543581,33.70887251514],[130.99955681677,33.70857592787],[131.00034687384,33.6839199041],[131.04958667511,33.6839199041],[131.05013952171,33.64170875055],[131.07510184486,33.64200556853],[131.07587850874,33.616829842],[131.10039319733,33.61666078162],[131.10084083189,33.60081650355],[131.17447671651,33.60007081873],[131.19999188626,33.58422349198],[131.2006633381,33.55867520339],[131.24050281367,33.55867520339],[131.28258046203,33.54207408934],[131.33137262874,33.52528320256],[131.4182137328,33.55065483869],[131.51624570079,33.55084136726],[131.51691715262,33.56669482339],[131.63352595472,33.56688131732],[131.63307832016,33.4754510561],[131.74230115207,33.47451759623],[131.74946330499,33.4593941455],[131.75013475682,33.33288884057],[131.60756315041,33.33401081872],[131.60801078497,33.37420549744],[131.52564602648,33.37457931428],[131.52467218605,33.2669137917],[131.57690018326,33.25843203104],[131.64941698149,33.28332039594],[131.71633834777,33.28388170581],[131.77496545798,33.26686700692],[131.78385146414,33.25028494772],[131.8329129059,33.25015259514],[131.88403176297,33.27450209588],[131.90824595842,33.27489904237],[131.90808769571,33.25849041659],[131.87516905091,33.20606803915],[131.84984701645,33.18275912021],[131.8503218046,33.14963919794],[131.8752486155,33.15037560256],[131.90777117028,33.14129100398],[131.91710244658,33.13332160215],[131.91732626386,33.10857804157],[131.95050210343,33.09967070254],[131.950185578,33.08349443782],[131.98278769736,33.08336183319],[131.98278769736,33.10006844205],[132.00035485877,33.11690443011],[132.02520210509,33.11690443011],[132.02472731694,33.09980328258],[132.00842625726,33.09171553445],[132.00842625726,33.06718256819],[132.01744723203,33.06704993897],[132.01714877007,33.04987795647],[131.99180867214,33.0421120948],[131.92518006897,33.04091808468],[131.9254965944,33.02499640337],[131.95002731528,33.02499640337],[131.95045122108,33.01347549853],[131.95034384071,32.97482430898],[131.98326248551,32.97535537996],[131.98491908197,32.95940701418],[132.02610146121,32.9592192187],[132.0582790126,32.95862511022],[132.05843727531,32.99141876734],[132.07198400331,32.99170189784],[132.0829679962,32.98332106133],[132.09167992381,32.92634886448],[132.02472731694,32.92542075248],[132.02472731694,32.90057574318],[132.0334874314,32.88294129224],[132.00795146911,32.88356551414],[131.98326248551,32.85870876251],[131.99988007063,32.84980117207],[132.01714877007,32.84289727827],[132.01602968368,32.82653607307],[131.97550761246,32.78396366112],[131.93411255975,32.76746021785],[131.8991970643,32.766142793],[131.89178663602,32.71661269643],[131.83317096714,32.65069845095],[131.78369320142,32.6489443227],[131.78415498315,32.58396276024],[131.74185351752,32.58283121821],[131.70820188619,32.56668764106],[131.70772709804,32.5429431523],[131.74159531913,32.50851583424],[131.74140588296,32.45128662429],[131.70804362347,32.44215937788],[131.70111877283,32.40878136136],[131.6578743427,32.39219290505],[131.64225482858,32.33354523679],[131.59947540073,32.27571995554],[131.57492216184,32.18337883254],[131.54184525433,32.0847417557],[131.54200351704,32.00009168682],[131.49974737204,32.00022590098],[131.5003804229,31.74971007939],[131.45859906604,31.75011381693],[131.45875732875,31.79182387036],[131.24969228174,31.79168935204],[131.24969228174,32.16703604105],[131.3748780896,32.16717001027],[131.37503635232,32.25046068056],[131.49990563475,32.25019298716],[131.49990563475,32.33340757632],[131.54137046618,32.33340757632],[131.54166750852,32.62506038939],[131.66644564128,32.62515464066],[131.66633373264,32.6666155687],[131.74992948616,32.66652136111],[131.75005894815,32.91663566767],[131.59769929528,32.91688239565],[131.25044431813,32.91663037405],[131.24901995369,33.00042251591],[131.49970809484,33.00002432608],[131.49986635756,33.06344656374],[131.50018288299,33.13914840974],[131.48040004357,33.16631091805],[131.28399601379,33.16617843843],[131.26706190324,33.20035154321],[131.26627058967,33.25039503689],[131.29966402261,33.2698486619],[131.29950575989,33.31998461745],[131.24427207223,33.34114154113],[131.17511126561,33.34153818437],[131.17526952832,33.35806338039],[131.07524749221,33.35806338039],[131.07572228035,33.33347274995],[131.00054749055,33.33320829683],[131.0000727024,33.24960091936],[130.91445257339,33.24960091936],[130.74970108668,33.25013033185],[130.74970108668,33.0837373409],[130.62546485511,33.08320692264],[130.62546485511,33.00002432608],[130.72795985531,33.0017112414],[130.87491804477,33.00017600322],[130.87529612813,32.79131407789],[130.96677197761,32.7918462497],[130.96708850304,32.85807675215],[130.92530714618,32.85781086498],[130.92530714618,32.95029145755],[130.96679503759,32.95830705997],[131.00012227803,32.91682799652],[131.00016863211,32.50006684553],[130.66646598784,32.50045582611],[130.66668980512,32.33305500581],[130.62505979131,32.33305500581],[130.62461215676,32.24942752141],[130.49972211535,32.25037396494],[130.50039356719,32.12516864385],[130.33275442559,32.1249790954],[130.343705176,32.16132753197],[130.34954072148,32.20815299489],[130.42748424391,32.2942330114],[130.46637334086,32.40054393512],[130.49390286611,32.40073290896],[130.52299911232,32.43304161793],[130.54940955118,32.44456414676],[130.54985718574,32.46590526749],[130.48383108858,32.46647177702],[130.4742069456,32.47534662776],[130.47510221472,32.50064459054],[130.50889862377,32.54197445264],[130.62438833948,32.62570813417],[130.62483597404,32.66660356216],[130.52568491966,32.66679197706],[130.5252372851,32.68337093253],[130.5585860596,32.71670792054],[130.55903369416,32.77450016017],[130.57492472093,32.78372085869],[130.57492472093,32.82172262654],[130.50934625833,32.84184569286],[130.50777953738,32.8698599348],[130.44154787641,32.89158085761],[130.41623827047,32.94258041232],[130.41579063591,32.97488144692],[130.37438443939,33.00097656168],[130.37527970851,33.08315385362],[130.24927058071,33.08371644737],[130.24904676343,33.16075775844],[130.15862458292,33.09740511948],[130.17775431247,33.07174090544],[130.18369211811,33.06683706925],[130.18369211811,33.03400678724],[130.19958314488,33.02499977112],[130.19976856119,33.00001402362],[130.12478977289,33.00001402362],[130.12456595561,32.96678328756],[130.04089669442,32.94070208204],[130.02500566765,32.94164125217],[130.02455803309,32.91646804471],[130.12456595561,32.91719556631],[130.12456595561,32.86739205681],[130.15030494264,32.86682808325],[130.19577825115,32.86610014791],[130.23334115296,32.89182746562],[130.29198127993,32.89182746562],[130.29242891449,32.84990720854],[130.29153364537,32.79159949882],[130.29220509721,32.71724877165],[130.18342989986,32.65791195602],[130.15034334361,32.65002149531],[130.11538944719,32.64962050091],[130.11744220367,32.70013515534],[130.1590338165,32.7170604632],[130.2485607279,32.75866696147],[130.24967981429,32.79084689122],[130.13329482947,32.79235210006],[130.125685042,32.76751289707],[130.00146645243,32.74963190739],[129.92939728876,32.67317376017],[129.80047853634,32.57458560005],[129.80003090178,32.54704447759],[129.77424681515,32.54749343613],[129.71766614329,32.54987443459],[129.71632323962,32.59042734571],[129.7498958314,32.67486935529],[129.75011964868,32.72459249076],[129.80025471906,32.72553394947],[129.74161459209,32.77522884647],[129.62411052088,32.85009523599],[129.62646465079,32.9178725958],[129.83158913805,32.91738345105],[129.87120479635,32.91644402337],[129.89269125508,32.94105373663],[129.93342599977,33.00827283013],[129.96699859154,33.0746905371],[130.0580922239,33.12025335469],[130.05876367573,33.21692565966],[130.24945599701,33.21673841336],[130.24990363157,33.33331517671],[130.21565958796,33.33350217315],[130.04220119712,33.33331517671],[129.92559239502,33.33294118261],[129.90835846458,33.35836912319],[129.90791083002,33.38304208051],[129.86695226805,33.38285519048],[129.86697302051,33.36012438878],[129.83337967628,33.34079472146],[129.8009261709,33.34098170185],[129.80003090178,33.31592275281],[129.75056728323,33.31685791766],[129.75034346596,33.27532693435],[129.72572356532,33.27476556947],[129.69170333899,33.30806697203],[129.69237479082,33.25024911652],[129.8747858728,33.25024911652],[129.87590495919,33.21299340321],[129.87521274072,33.1185621153],[129.87523350736,33.03323224813],[129.80831214109,33.0330446097],[129.7498958314,33.05030567244],[129.73400480462,33.05799701292],[129.72657821909,33.08172509009],[129.69841785734,33.0998186332],[129.62412979867,33.09927670165],[129.62373755404,33.12376865485],[129.62500578999,33.24201303912],[129.59255228461,33.24107707212],[129.59255228461,33.29927514005],[129.54196957967,33.30039755093],[129.50011574859,33.31760604231],[129.49989193131,33.41686255934],[129.59949062024,33.41592846878],[129.66753107291,33.40864221756],[129.66775489019,33.43274056151],[129.83360349356,33.5665605303],[129.9320830961,33.56786598137],[129.935216538,33.40826854718],[130.04130592801,33.38360274821],[130.04108211073,33.48427733817],[130.24900836246,33.48465068126],[130.25057508341,33.61680614548],[130.2850429443,33.63404510982],[130.28302858879,33.69151444112],[130.30887948446,33.69151444112],[130.32365142484,33.66711562227],[130.3922514207,33.69179377681],[130.41776659045,33.72484208862],[130.4338814345,33.7754604525],[130.39023706519,33.87047513641],[130.39113233431,33.92509325246],[130.50774113641,33.92620754358],[130.60554928711,33.89165774203],[130.66665140414,33.94960428957],[130.74991143174,34.00843908709],[130.84973393796,34.00825355239],[130.85040538979,34.14154830158],[130.88308271245,34.19191941659],[130.85801517726,34.27518795053],[130.83227619023,34.36705766644],[130.97126672018,34.45052182824],[131.08608498405,34.43335569762],[131.19306964318,34.44166233028],[131.29356360122,34.44092399637],[131.36518513035,34.44590762363],[131.37548072516,34.53279638609],[131.44934042706,34.55012640416],[131.57445428574,34.69176511221],[131.62526080796,34.69158108366],[131.78596161393,34.70078201028],[131.86989309337,34.77435258434],[131.99545458661,34.88146431036],[132.37594396006,35.16738931144],[132.74971881516,35.16684041595],[132.75083790155,35.08318208103],[132.62550022559,35.08336523463],[132.62505259103,34.91670902007],[132.3754963255,34.91689254667],[132.37527250822,34.83426413383],[132.12482097358,34.83297814707],[132.12482097358,34.75008153683],[132.00037856673,34.74989763802],[132.00037856673,34.58330147349],[131.74988882507,34.58325955431],[131.75139258551,34.37954004577],[131.75147145222,34.16709508493],[132.1249714605,34.16683319036],[132.12481319779,34.29140309717],[132.25015726837,34.2919261113],[132.24929244561,34.40917062589],[132.25015726837,34.49982698087],[132.37249434735,34.49995740949],[132.3750265508,34.58338985226],[132.49166617203,34.58338985226],[132.49182443475,34.70831000696],[132.5917673395,34.70824495609],[132.583645893,34.54169650488],[132.84148339783,34.54132778131],[132.84193103239,34.66623144063],[133.08342987589,34.6667836941],[133.08365369317,34.76631318897],[133.20742464818,34.76686477448],[133.20787228274,34.6667836941],[133.49973001391,34.66641552553],[133.50025571797,34.8331395492],[133.70119922927,34.83356799396],[133.69940869105,34.87526017127],[133.74983602012,34.87534786088],[133.74983602012,34.99989818945],[133.87510525467,35.00002651459],[133.8751800907,35.12503588695],[133.97425255052,35.12516532967],[133.9754594883,35.00097401217],[134.05849569863,34.99996564586],[134.05815997271,35.07464276466],[134.1665417497,35.07479659134],[134.16670001242,35.00015747182],[134.75337989831,35.00015747182],[134.83323920816,34.99996564586],[134.83330256958,35.0417616416],[135.24494389227,35.0417616416],[135.37471917085,35.04153400419],[135.37535236974,35.08360365372],[135.74948542889,35.08334463604],[135.75065867443,35.25004440859],[135.87473664328,35.25030289585],[135.87529529182,35.33387895394],[136.00001530733,35.33355930519],[136.00023897658,35.25870328334],[135.98330486603,35.24254791937],[135.9336103734,35.20027026349],[135.9330564539,35.16670397648],[135.97539173026,35.16663928817],[135.97523346755,35.15596501278],[136.0499334692,35.15829406507],[136.0499334692,35.21662799307],[136.05895444398,35.22483794301],[136.1245543395,35.23343487427],[136.1253593779,35.25011086017],[136.16666646077,35.24997008399],[136.1665076839,35.36441083833],[136.16664223225,35.45872455467],[136.33347484862,35.45857056019],[136.37478141734,35.33381752591],[136.49980896248,35.33355930519],[136.49965069977,35.4998113591],[136.74991342685,35.58365155619],[137.00002635272,35.5834383487],[136.99984479591,35.41254039886],[136.99998795175,35.33351312428],[137.24995039069,35.33357309177],[137.24997782689,34.91665530206],[137.62489494541,34.91657467133],[137.62516041866,35.00034095028],[137.69185796765,35.00052428969],[137.69181631169,35.06711204141],[137.74199303804,35.06668296826],[137.74221685532,35.10789050033],[137.77489417798,35.10843979343],[137.77474061337,35.15014636155],[138.16670692831,35.15020646479],[138.16666358591,35.29179470828],[138.38224433204,35.29138366775],[138.50029334835,35.29186849141],[138.50118861747,35.33332714595],[138.38256545986,35.33369232599],[138.38318595523,35.44169203388],[138.4998457138,35.44207774821],[138.49987755423,35.45840012079],[138.66643551377,35.45854467099],[138.66703722084,35.37476454466],[138.70817743621,35.37518719503],[138.70817743621,35.33347612855],[138.83340320354,35.33356742355],[138.8332912949,35.40832417574],[139.00819983923,35.40835556961],[139.00858238783,35.39191741773],[139.12429592082,35.39228233285],[139.12498392646,35.41668118537],[139.25000882531,35.41666699526],[139.24995278822,35.499962055],[139.12486987404,35.5000453935],[139.12491651073,35.5833023905],[138.99999141008,35.58333303234],[138.99998633341,35.66670418293],[139.12490105769,35.66678039976],[139.12504409647,35.80919511674],[139.12474355537,35.91713094137],[139.0005249658,35.91713094137],[139.00006382179,36.00001114722],[139.12491952742,36.00011588408],[139.12546551965,36.11894450158],[139.12494599875,36.16663614917],[139.0000003755,36.16668304052],[138.99940587941,36.25031012004],[138.95831284301,36.25001879847],[138.95822350017,36.29127185972],[138.91662765915,36.29166053471],[138.91677782747,36.37496285354],[138.95844731745,36.3756537684],[138.95836333416,36.45831554129],[139.08378499341,36.45868415516],[139.0833357061,36.50000376413],[139.25009029129,36.50011694838],[139.24960263537,36.5413608278],[139.37464470438,36.54189275708],[139.37505257232,36.62499503085],[139.45021835267,36.62527716826],[139.44999392176,36.66666708159],[139.66374110632,36.66671170008],[139.75001859084,36.66664589731],[139.75004599077,36.75002620205],[139.99999620829,36.75001150284],[139.99998367293,36.62208934319],[140.00001444624,36.41668110102],[140.2500103038,36.41666403038],[140.24998851514,36.04158216628],[140.50004360543,36.04158216628],[140.49988534272,35.83348536422],[140.416322629,35.83374197787],[140.41679741714,35.79190299604],[140.45873703672,35.79113274684],[140.45873703672,35.72460642843],[140.51666119055,35.72486339376],[140.51690846747,35.74169858434],[140.59143962121,35.74174400013],[140.59149557553,35.94177546708],[140.65002379386,35.94163956278],[140.64994381468,36.00836984944],[140.67502845507,36.00833784352],[140.71403082982,35.92325558937],[140.77327157686,35.83876818944],[140.81532256277,35.78508229698],[140.89133133484,35.75009670348],[140.89211469532,35.71716690908],[140.8663235896,35.6785248785],[140.80694077842,35.7062158349],[140.72766898741,35.67610146243],[140.68235052625,35.68891011377],[140.60194222212,35.63073538836],[140.48544962602,35.54408743348],[140.40950523435,35.42896763831],[140.40816233068,35.3335295184],[140.30722073807,35.33371210817],[140.30766837263,35.41747724976],[140.30945891086,35.45850682455],[140.20762204914,35.45905374428],[140.20829350098,35.37478431679],[140.12503347337,35.37478431679],[140.12436202154,35.33407728648],[140.29155352858,35.33316433763],[140.29244879769,35.20909014172],[140.31706869833,35.20835865572],[140.31662106377,35.18421592115],[140.35041747282,35.18256956434],[140.34310135616,35.13152190767],[140.23200719745,35.10095957841],[140.13696628673,35.09270694653],[140.05542146946,35.03642731857],[139.98865132292,34.98848930387],[139.96379009814,34.91687909212],[139.91222081475,34.88262382284],[139.82272040556,34.89217945025],[139.78336863834,34.93633065362],[139.73961288273,34.95321599339],[139.74430099941,34.99302832951],[139.81476481363,35.00932019408],[139.79629647522,35.05282683517],[139.8016949126,35.09107956841],[139.80766160655,35.15289710038],[139.80865605554,35.19667547459],[139.85152875904,35.24126900084],[139.83250429037,35.29188828382],[139.74927324436,35.29610514399],[139.76149076054,35.33517067988],[139.79231867926,35.35266869932],[139.8103463798,35.49933327017],[140.00350069115,35.49987991221],[140.03349220647,35.53667858328],[140.06639334641,35.58383634986],[139.79714116037,35.58310825556],[139.80005078499,35.500790974],[139.77086699388,35.47342895212],[139.70992147714,35.44206953063],[139.69869840996,35.40282411886],[139.66886494023,35.36715094731],[139.68477612408,35.30781519278],[139.73549302263,35.27279594595],[139.75069388578,35.25934081802],[139.73733985647,35.23091531763],[139.74387480698,35.20851596895],[139.6971357044,35.18970967156],[139.67426337761,35.17020224599],[139.68932217661,35.1539424821],[139.68150864883,35.13477501648],[139.62354647906,35.12199419853],[139.59783286944,35.1285010474],[139.60223685783,35.17252480405],[139.58362645528,35.18959356978],[139.59033399503,35.24163459636],[139.54959925035,35.28403249053],[139.49879272813,35.300839305],[139.42314248799,35.30942404814],[139.29131411095,35.300656641],[139.2307391276,35.277783055],[139.1554570229,35.23541924836],[139.1503092255,35.17506907239],[139.16664788683,35.13316335499],[139.12501787303,35.13298031326],[139.09435490587,35.13334639631],[139.05832032403,35.13316335499],[139.05671055416,35.00443297532],[139.03347660612,34.98384794205],[138.99968019707,34.98366456528],[139.00057546618,34.88274513664],[139.14135653436,34.88347954423],[139.11002211537,34.84601639101],[139.08128765066,34.79528991251],[139.01691412751,34.74106560358],[138.99990401434,34.64150571261],[138.90043999843,34.60970494227],[138.87367106927,34.59158875439],[138.80025900192,34.59987962655],[138.75773371901,34.65881306843],[138.72528021362,34.6757486834],[138.72528021362,34.7250631297],[138.83316014186,34.72598289603],[138.8338315937,34.74952542934],[138.74189641642,34.75106296366],[138.73379876035,34.81360389397],[138.74985200835,34.90056884096],[138.76064888311,34.93772819302],[138.75027820078,34.9831352578],[138.77854896495,35.04352254895],[138.8754616075,35.03316137513],[138.87702832845,35.04928719612],[138.85845149433,35.04983688392],[138.76803621848,35.12106460626],[138.68293979767,35.12222659494],[138.61872680568,35.09014962348],[138.55408762126,35.05201275244],[138.54925744044,34.99442490215],[138.49996118332,34.95391462218],[138.39142417915,34.91128737102],[138.35562401547,34.86758894052],[138.33928663919,34.8004229037],[138.27635222447,34.72246037223],[138.2446719209,34.6661602616],[138.24396160019,34.58503020853],[138.12661661925,34.58573196098],[138.01467007568,34.62560515076],[137.88184010331,34.65540983045],[137.79532304108,34.63717765139],[137.68991144803,34.65307259566],[137.57654426305,34.66440756907],[137.38134813252,34.64617736905],[137.18402103987,34.58409452939],[137.03187034424,34.56619763851],[137.0079402155,34.57572764727],[137.02539796322,34.61791841962],[137.05989989736,34.66612578938],[137.17516579579,34.66686212746],[137.30766562466,34.75995609746],[137.2989367508,34.77595181262],[137.29087932877,34.79231203731],[137.25036840137,34.79212823259],[137.21634817503,34.76767855388],[137.15815568262,34.7491066647],[137.08317689433,34.75076175505],[137.03214655483,34.76344967914],[136.94060528792,34.80848524854],[136.9345622214,34.77521644543],[136.98335438811,34.72574796503],[137.06750968483,34.74211813979],[137.06773350211,34.70183064704],[137.02453676736,34.70808661352],[137.0158078935,34.64937233008],[136.98178766716,34.65029293775],[136.82601084133,34.7491066647],[136.84884020373,34.82318541413],[136.79266206683,34.82520648177],[136.79131916316,35.00048270019],[136.75080823575,35.00011602077],[136.74991296664,34.95848723128],[136.68276778309,34.96068840187],[136.66240041074,34.89701402804],[136.59077888162,34.80003146575],[136.53862945573,34.72703562436],[136.58294527687,34.62506459048],[136.75681722902,34.54181211493],[136.85798263891,34.54125902973],[136.93945212828,34.54347134846],[136.91675500542,34.49230962828],[136.94081093816,34.46686985603],[136.94112746359,34.40865537918],[136.92404366078,34.35875805984],[136.90742215622,34.30209423566],[136.90045394573,34.2666041617],[136.84980987681,34.23416136223],[136.81692729803,34.19229471408],[136.79948233333,34.19254302385],[136.79995712147,34.22905833234],[136.74203296764,34.25862543953],[136.73325151864,34.28284564349],[136.70895606013,34.28334393778],[136.64264398239,34.2590178534],[136.5593977941,34.22604870821],[136.5356402977,34.22166690394],[136.5006823267,34.20864312064],[136.44006770671,34.200528009],[136.38325139189,34.16675028516],[136.33339863654,34.14802269893],[136.31583147514,34.08486836388],[136.26740308423,34.08316437817],[136.1249666404,34.08342653205],[136.12449185225,34.16688123268],[136.24967766011,34.16688123268],[136.24983592283,34.25012268958],[136.37486346797,34.25025350763],[136.37468162529,34.33330513437],[136.50020753855,34.33302050702],[136.4997327504,34.49191830593],[136.45842618169,34.49126609792],[136.45810965626,34.54160154926],[136.41680308755,34.54186227551],[136.41664482483,34.62516333605],[136.37494259933,34.62464240515],[136.37469162846,34.68105692884],[136.37484989118,34.7497447187],[136.33401811061,34.75026486297],[136.33354332247,34.79108596488],[136.37484989118,34.79212572916],[136.37532467932,34.95857844776],[136.33322679703,34.95857844776],[136.33322679703,34.83344573936],[136.29239501647,34.83370554806],[136.29207849104,34.79199575934],[136.24966408332,34.79212572916],[136.24998060875,34.70838276897],[136.29192022832,34.70851287043],[136.29160370289,34.62475029374],[136.12486701259,34.62512439789],[136.12497892122,34.66673782096],[136.04160698498,34.66655373678],[136.04093553315,34.74990198184],[136.00022657751,34.75008885941],[135.99991005208,34.65992481342],[135.99975178937,34.58386615691],[136.04153314623,34.58373585971],[136.04184967166,34.50017333586],[136.04989090487,34.49997451266],[136.05004683818,34.42503184751],[135.91674069587,34.42499960904],[135.91667174711,34.3583549028],[135.81664583435,34.35836843202],[135.81660626868,34.31668083709],[135.74990639027,34.31672404905],[135.75007425323,34.29167201943],[135.64152287316,34.29176447608],[135.64185859908,34.27512064005],[135.53325126468,34.27488945246],[135.53347508196,34.25833476838],[135.47500281795,34.25833476838],[135.47511472659,34.22498430095],[135.3750684031,34.22512309587],[135.37490054014,34.20814215322],[135.50001439883,34.20837352421],[135.50001496403,33.66651585925],[135.87502081416,33.66660899832],[135.87558035736,33.74983496912],[136.03370726462,33.75020716356],[136.01271963798,33.7106163609],[135.99680845412,33.67326455076],[135.97947662885,33.63388574463],[135.97194722934,33.61271071376],[135.95830907175,33.56797763328],[135.85332367113,33.50521760186],[135.85353435543,33.48302294456],[135.87591186964,33.4814042424],[135.86056894235,33.44051530172],[135.77717729124,33.42557714245],[135.74180331999,33.42534000808],[135.74162571618,33.46650066265],[135.68497766335,33.47915288954],[135.59007881678,33.49633278594],[135.47372828483,33.52819542819],[135.39019456958,33.57519803318],[135.37485307229,33.61633320131],[135.37532786043,33.6496709874],[135.33370476629,33.6498027317],[135.32468379151,33.6665326188],[135.45794099786,33.66666433728],[135.458415786,33.74987006025],[135.41726748001,33.75000165098],[135.41663442914,33.78802291019],[135.41742574272,33.83273219751],[135.37516959772,33.83325805005],[135.37516959772,33.79170573426],[135.32839666799,33.78999406158],[135.2877663235,33.75622027208],[135.21502948301,33.7698022424],[135.14371328394,33.85113086379],[135.12013063644,33.87826253319],[135.05776447828,33.87991374771],[135.05946924798,33.9647902581],[135.07708520154,34.00837444738],[135.11345362178,34.05028840011],[135.06515181365,34.06758952518],[135.07040818688,34.12100062861],[135.15522047941,34.16285887994],[135.11629490461,34.18742330292],[135.06316291566,34.25849051928],[135.04914840404,34.27082115018],[134.99554038427,34.27152278701],[134.99549734353,34.29122128464],[134.99945391142,34.29893542959],[135.00903647772,34.30356652855],[135.14570218192,34.34721085328],[135.20804417028,34.35108537099],[135.24173754163,34.39165309027],[135.19144683551,34.42482281178],[135.25011932598,34.46055636895],[135.29486953058,34.42658055716],[135.30901578269,34.44119295496],[135.36646514837,34.53276800379],[135.3914706574,34.53394138996],[135.38308273349,34.63127477246],[135.36409120764,34.66668779015],[135.291606884,34.66694812396],[135.29060760633,34.6244999083],[135.08349141328,34.62463314776],[135.04724925146,34.61642805384],[134.92905436601,34.64799421584],[134.82599797536,34.69662081511],[134.75873632133,34.74267049508],[134.71632191361,34.74982280423],[134.52561534158,34.74969276777],[134.41657233069,34.70885119699],[134.31670855729,34.66668779015],[134.25055474226,34.66655762294],[134.2499216914,34.68308722232],[134.15797105376,34.68347764541],[134.15781279105,34.70013398221],[134.12505240897,34.70000386757],[134.12473588354,34.58386016201],[134.11666448505,34.55844834256],[134.02518863556,34.55023671031],[134.02534689828,34.44784922942],[134.02787910173,34.41639040184],[134.19168101214,34.41678207828],[134.19152274942,34.384005473],[134.28347338706,34.38296058922],[134.28347338706,34.3337056584],[134.38082361091,34.29414536452],[134.40952056751,34.2653854985],[134.43267702258,34.2464808009],[134.56264881698,34.25054688274],[134.66662742098,34.24963115535],[134.64146364924,34.04963379725],[134.70809225241,33.96553844571],[134.74006132092,33.92825273835],[134.71220589784,33.86773427325],[134.76918166054,33.86690588331],[134.76712424524,33.82523844726],[134.66741873456,33.77539488227],[134.63101831002,33.77486867404],[134.50018139848,33.77493445024],[134.49977915313,33.95855429751],[134.45819679633,33.95873690431],[134.45816038671,34.00005912476],[134.34679273601,33.99888814689],[134.06046787607,33.99987486057],[133.7495472142,34.00047441762],[133.74998010726,34.33336494732],[133.87500134644,34.33342236401],[133.87493968566,34.41668102516],[133.95888054127,34.41683206237],[133.95843290671,34.44156982725],[133.85055297847,34.44156982725],[133.84965770936,34.46620800554],[133.82537353464,34.46703837928],[133.8164208435,34.44221586478],[133.84204792189,34.43326318539],[133.84193601325,34.41655510566],[133.75822337954,34.41714986703],[133.74121823792,34.44175440991],[133.69130201327,34.44151837272],[133.69085437871,34.45739100084],[133.6909712589,34.46639253375],[133.70003585868,34.48345962918],[133.6165520138,34.48355187426],[133.61688773972,34.45827290653],[133.53351083192,34.45886737103],[133.53328701464,34.41751913981],[133.48969726525,34.4174334909],[133.46642026828,34.4331260929],[133.46630835964,34.4499231427],[133.45030542423,34.45001542485],[133.45008160695,34.41660262399],[133.4171258471,34.41696523002],[133.41667821254,34.3578604567],[133.34174039879,34.3582984738],[133.30304516488,34.37515059623],[133.27479527019,34.35875574666],[133.21655459093,34.35000180434],[133.16693922966,34.35006713566],[133.16662270423,34.36659432201],[133.09184357121,34.36659432201],[133.09176443985,34.34170431373],[133.05837100691,34.3416389759],[133.05829187555,34.324910817],[132.90002916018,34.32517222013],[132.89148297355,34.29164062433],[132.7916983315,34.29164062433],[132.79133273641,34.2828112475],[132.79200418825,34.24211616348],[132.77492248367,34.22512613438],[132.71628614763,34.22499527728],[132.7165235417,34.21655456516],[132.75854229263,34.21635825947],[132.77500161503,34.20876742193],[132.79218102205,34.20095164949],[132.79222800552,34.14177431504],[132.74137601204,34.14173084641],[132.70837823589,34.16654912614],[132.63353752486,34.16665159095],[132.61663932033,34.1916945672],[132.59185155674,34.19160200057],[132.57489739789,34.16660529391],[132.5415486234,34.16674418496],[132.54177647088,34.14195955751],[132.42514951077,34.14165344298],[132.42503081374,34.16656995645],[132.37490109864,34.16663543037],[132.37514741069,34.18347600104],[132.40832832223,34.18342971323],[132.37520336501,34.21679663244],[132.34991201254,34.23331322775],[132.35013582982,34.25833640424],[132.35813729752,34.25842889756],[132.35819325184,34.27502980063],[132.33922473749,34.25833640424],[132.29166356581,34.22493967243],[132.24992164337,34.22493967243],[132.25003355201,34.20430293896],[132.25809097403,34.18324456173],[132.28327041786,34.18352228883],[132.28321446354,34.19995284807],[132.29183142877,34.20837516104],[132.3250123403,34.20846770925],[132.31684010599,34.17529658532],[132.25842669995,34.17532895502],[132.25842669995,34.14171407625],[132.25020141497,34.1167489215],[132.21668477751,34.11684157021],[132.21685264047,34.05849913457],[132.22491006249,34.05826735294],[132.22502197113,33.99162705239],[132.21668477751,33.99176623069],[132.21651691455,33.97515601055],[132.25036637427,33.97526276959],[132.25014255699,33.9162192778],[131.95761337399,33.91733368499],[131.95783049468,33.92511686386],[131.91755008114,33.92494841068],[131.91586475496,33.95863206817],[131.88699232603,33.96670716623],[131.87568955347,33.95891053259],[131.84972674916,33.92502400564],[131.80049364448,33.92439125871],[131.79947977014,33.9504633731],[131.77520229201,33.95057346177],[131.75057569479,33.96679997899],[131.70828092574,33.97507716244],[131.70917619485,33.92550555901],[131.68366102511,33.9251341272],[131.68320669396,33.95055620359],[131.6915998419,33.96717122903],[131.69988108121,33.98322624237],[131.6833186026,33.99937100092],[131.68354241987,34.01681131495],[131.69999298984,34.01699683095],[131.70010489848,34.03313517088],[131.68209430416,34.03352337245],[131.67514927193,34.02580837394],[131.62512611019,34.02488088618],[131.59121779249,33.97515271288],[131.38720834314,33.97496710548],[131.29980769588,33.91685208542],[131.16674832381,33.91666635086],[131.11720281055,33.97472960748],[131.06077753904,34.02461988102],[131.03349514839,34.02557101805],[131.04197688764,34.00847992179],[131.04175307036,33.73809881635]],[[135.98582632111,35.86595341956],[135.93904778695,35.95516536708],[135.95723199707,36.13160407318],[136.15271225588,36.29665593207],[136.65959711303,36.75694522796],[136.6584605999,37.00603068828],[136.66641619183,37.33477034922],[136.85166783245,37.42327563113],[137.11306585295,37.5288032506],[137.31877472996,37.54953046686],[137.39151157045,37.50356234188],[137.34765373317,37.35791049463],[137.20218005219,37.24761852662],[137.09307479146,37.06827606619],[137.02229600951,36.83794593283],[137.09531697828,36.8013261482],[137.22970965621,36.77367912166],[137.35387371595,36.80451117283],[137.39706121499,36.90965623709],[137.50588234744,36.95882577339],[137.72267222749,37.01579092308],[137.95199404056,37.10655492798],[138.05300164523,37.1697489731],[138.18625781003,37.18253990533],[138.28854399196,37.24861072926],[138.43501212193,37.34512377596],[138.54908962762,37.41229325092],[138.61841692871,37.49225359136],[138.73902938491,37.515357361],[138.78377958951,37.56739915068],[138.82185277945,37.62795613472],[138.91490479219,37.63009386317],[138.92399689725,37.60319901211],[139.01321317816,37.59757124385],[139.01420762715,37.53507443387],[139.0345227994,37.52324481549],[139.03793233879,37.45797923094],[139.04887127769,37.4235763325],[139.13027403082,37.42312504187],[139.23881103499,37.43260157377],[139.26281987491,37.33326409528],[139.12288669546,37.32784190325],[139.11407871868,37.26353652688],[139.11422078282,37.16748486574],[139.05554829235,37.1665792038],[138.82824566582,37.1713338079],[138.87072284415,37.23379508225],[138.8910380164,37.31315483479],[138.72965315157,37.33258634267],[138.71402609599,37.2947354553],[138.71715150711,37.16420178957],[138.53516734175,37.16533390091],[138.39906989411,37.1669188283],[138.3747769259,37.13260904733],[138.37250389964,36.99907203744],[138.08823355234,36.99839128128],[138.08596052607,36.91586122976],[137.8923271011,36.91767853447],[137.8779786228,36.83517474846],[137.66516653872,36.83210470722],[137.52111349915,36.8314224591],[137.51216345824,36.74222304782],[137.39481847729,36.74427215795],[137.37137789393,36.58325068345],[137.29366880849,36.58370698743],[137.18015955937,36.55027558459],[137.21382876092,36.531328506],[137.26383533876,36.3317607158],[136.63321261429,36.33496516228],[136.50436043787,36.29226654145],[136.39411866401,36.29444210346],[136.38033844228,36.25492902836],[136.37778128773,36.17664562948],[136.38218527612,36.09506978245],[136.3875837135,36.00065282008],[136.25929979365,35.99398651985],[136.25532199769,35.90922947902],[136.24992356031,35.83336568294],[136.12206583289,35.8287585623],[136.11183721469,35.88724911714],[136.05984173887,35.91164579558],[136.01793281711,35.86675930692],[135.98582632111,35.86595341956]],[[140.03280760425,37.29985864131],[140.03344065511,37.34642500576],[140.03344065511,37.47427085093],[140.03407370597,37.48281126528],[139.99973069674,37.48356478439],[140.0003637476,37.44198429399],[139.94212306834,37.44173298208],[139.94196480562,37.35007358234],[139.89116247399,37.35007358234],[139.89116247399,37.41697462302],[139.81725378591,37.4164718304],[139.81266416716,37.57468448903],[139.74192073339,37.5755625118],[139.74223725882,37.79174164901],[139.81788683677,37.79161658285],[139.98295484891,37.79111631608],[139.98358789977,37.58333883296],[140.04119552816,37.58333883296],[140.04151205359,37.47502445617],[140.15910125112,37.47527565622],[140.15815167483,37.63311311956],[140.37449680674,37.63399045296],[140.37481333217,37.83337690748],[140.49999914004,37.83525181691],[140.49988467877,37.91662259569],[140.53144291504,37.91679916623],[140.62489389965,37.91669692162],[140.62489324665,37.84641146353],[140.62534321061,37.33359067275],[140.57501566712,37.33283564369],[140.57485740441,37.25880599139],[140.45790125775,37.25855406554],[140.45774299503,37.208404057],[140.25010231246,37.20865615048],[140.24994404974,37.29998453523],[140.03280760425,37.29985864131]],[[141.00075354845,38.16707524992],[140.84263615887,38.16752201876],[140.68778995522,38.16405244519],[140.7078808588,38.09498964653],[140.70868449494,38.03345773695],[140.6162663385,38.033615983],[140.53369272481,38.11364462215],[140.5359027242,38.14477833039],[140.61948088307,38.14477833039],[140.624704518,38.20479567961],[140.62309724571,38.27375450928],[140.63073178907,38.33902357935],[140.81255446642,38.33697496075],[141.00361895942,38.33398072166],[141.00075354845,38.16707524992]],[[129.44454248239,34.73674858595],[129.5252349148,34.65451904132],[129.35703097117,34.19045888777],[129.23087801345,34.06062615384],[129.15132209417,34.11615874979],[129.27179248623,34.63488400992],[129.44454248239,34.73674858595]]],"terms_url":"http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html","terms_text":"GSI Japan"},{"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.0960155,47.5788226],[8.1032285,47.5787939],[8.1032285,47.5858264],[8.1059094,47.5873189],[8.1101861,47.5887827],[8.1158884,47.5892993],[8.1216758,47.5891558],[8.1254631,47.5887253],[8.1295909,47.5888831],[8.1302292,47.5912222],[8.1319952,47.5935755],[8.1350591,47.5954552],[8.1383145,47.5969761],[8.1416125,47.5993865],[8.145336,47.6007638],[8.1496127,47.6014381],[8.1543788,47.601266],[8.1575065,47.6006347],[8.1611874,47.5991426],[8.1625492,47.5997595],[8.164379,47.6014812],[8.166528,47.6039918],[8.1708685,47.6067319],[8.1760814,47.6083815],[8.1791241,47.6086828],[8.1815284,47.6117955],[8.1830391,47.6148937],[8.1849753,47.6176045],[8.1895286,47.6215055],[8.1921244,47.6232121],[8.2226146,47.622997],[8.2256146,47.6212043],[8.2284871,47.618422],[8.2295935,47.6162133],[8.2300828,47.6150085],[8.2326148,47.6168587],[8.2365724,47.6180348],[8.239998,47.6183503],[8.2435087,47.617834],[8.2474876,47.6187662],[8.2506578,47.6198849],[8.2570835,47.6208028],[8.2610411,47.620688],[8.2649135,47.6193543],[8.2673179,47.6176906],[8.26902,47.6153097],[8.2757862,47.6170165],[8.2810629,47.6170739],[8.2877226,47.6162563],[8.2942122,47.6144204],[8.2994676,47.6122115],[8.303106,47.609773],[8.302872,47.5944651],[8.3043826,47.5922697],[8.3059146,47.591093],[8.3079147,47.590189],[8.3123616,47.5891702],[8.3165532,47.5871324],[8.3204894,47.5843626],[8.325979,47.57888],[8.3286386,47.5771577],[8.3321919,47.5760381],[8.3390218,47.5757653],[8.3470221,47.5762821],[8.3596181,47.5755213],[8.3647459,47.5743586],[8.3720653,47.5737701],[8.3800229,47.5723347],[8.3819379,47.5749615],[8.3838741,47.5768562],[8.3887891,47.5802723],[8.3923211,47.5817362],[8.3961084,47.5824682],[8.4001298,47.5825543],[8.4043214,47.5815783],[8.4115769,47.5792819],[8.4180026,47.5760237],[8.4238113,47.5745165],[8.4303859,47.5722772],[8.4327477,47.5703537],[8.4335988,47.5684874],[8.4335349,47.5666929],[8.4318966,47.5644389],[8.4285986,47.5621705],[8.4257475,47.5612085],[8.4258964,47.5585379],[8.4249815,47.5562404],[8.4235347,47.5546896],[8.4229602,47.5536988],[8.4245985,47.5517027],[8.4249177,47.5498071],[8.4243432,47.5483566],[8.4253858,47.5467912],[8.4250028,47.5441773],[8.4233006,47.5421952],[8.4210027,47.5410605],[8.4183218,47.540486],[8.4155132,47.5406153],[8.4138961,47.5392364],[8.4128323,47.5371966],[8.4119386,47.5362629],[8.4124067,47.5341513],[8.4118535,47.53237],[8.4111727,47.5315798],[8.4014277,47.5316948],[8.4012362,47.5244251],[8.3993638,47.522198],[8.3966616,47.5208186],[8.3938531,47.5198846],[8.390853,47.5197266],[8.3887678,47.5201433],[8.3880869,47.5145965],[8.3855124,47.510745],[8.3836613,47.5094372],[8.3677559,47.5095329],[8.3673948,47.4870891],[8.375098,47.4868858],[8.3788894,47.4852997],[8.3819586,47.4818834],[8.3818382,47.4752129],[8.3832826,47.4719179],[8.3824401,47.4687855],[8.379431,47.4664259],[8.3775052,47.4658971],[8.3778663,47.4649613],[8.3823799,47.464229],[8.3867129,47.4609741],[8.3917079,47.4574341],[8.3931522,47.453487],[8.3951382,47.4503128],[8.3941753,47.4472198],[8.3917079,47.4453476],[8.3896016,47.4444929],[8.3899627,47.443394],[8.3911061,47.4416031],[8.3921292,47.4392423],[8.393393,47.4359044],[8.3924903,47.4341132],[8.3936939,47.4314264],[8.3956798,47.4285359],[8.3995916,47.4246273],[8.3995314,47.4195375],[8.4490001,47.4189675],[8.4536942,47.4123296],[8.4536942,47.4045098],[8.4485788,47.3964851],[8.4036237,47.3968517],[8.4048273,47.3939185],[8.4029015,47.3890295],[8.4035034,47.3855255],[8.4031423,47.3830399],[8.4048273,47.3790464],[8.4084382,47.3757455],[8.4137943,47.3733817],[8.4159006,47.3701619],[8.4158404,47.365393],[8.4143961,47.3632734],[8.4149377,47.3591153],[8.4172246,47.3557316],[8.4163219,47.3523069],[8.4135536,47.3491266],[8.4136739,47.346884],[8.4147572,47.3448043],[8.4188495,47.3424392],[8.4226409,47.3405225],[8.424687,47.3371784],[8.4242056,47.3316315],[8.4291404,47.3328551],[8.4350983,47.331917],[8.4376259,47.3328143],[8.4432829,47.3350576],[8.4452689,47.3374638],[8.4521295,47.3401963],[8.457606,47.3397477],[8.4621195,47.336485],[8.4627815,47.3332222],[8.4604345,47.3282868],[8.457967,47.3245748],[8.4555598,47.3200465],[8.4491806,47.3149467],[8.4471345,47.3121721],[8.4402137,47.3094791],[8.4362417,47.2981749],[8.4331123,47.2959301],[8.4280571,47.2939709],[8.4231825,47.2900116],[8.4165626,47.2878889],[8.4102436,47.2872766],[8.4035034,47.2840923],[8.4018785,47.2804997],[8.4086187,47.2759268],[8.4106649,47.2715986],[8.4089196,47.2661265],[8.4123499,47.2617975],[8.4123499,47.2587342],[8.4110861,47.2560793],[8.4169839,47.2514226],[8.4188495,47.2475009],[8.4180069,47.2430478],[8.4143961,47.2390437],[8.4137341,47.2356523],[8.4106047,47.2322607],[8.4043459,47.2279697],[8.4029617,47.2255993],[8.4039848,47.221267],[8.4085586,47.2171795],[8.4092807,47.2132553],[8.4084382,47.2094534],[8.4101233,47.2025847],[8.4131925,47.1967784],[8.412711,47.1924028],[8.4087993,47.1879859],[8.4081373,47.1847548],[8.4091002,47.1811963],[8.4151784,47.1791511],[8.4191504,47.1756331],[8.4229418,47.1655278],[8.4229418,47.1574668],[8.4201133,47.1532516],[8.4224603,47.1483813],[8.4227612,47.1439198],[8.4205345,47.1395399],[8.4158404,47.1352414],[8.4089798,47.1327441],[8.4038644,47.1320071],[8.4011563,47.1325803],[8.3953188,47.1327031],[8.3843658,47.1345045],[8.3789496,47.1338495],[8.37245,47.1344226],[8.3690799,47.1365924],[8.3679966,47.1387621],[8.3565623,47.1422825],[8.3540949,47.145639],[8.3533125,47.149159],[8.3506044,47.1516146],[8.3503035,47.1541929],[8.3477157,47.1566893],[8.3456094,47.1592264],[8.3408551,47.1616407],[8.3393506,47.1651187],[8.3373044,47.1689647],[8.3331519,47.1715421],[8.3326103,47.1735058],[8.3306243,47.1779239],[8.3300225,47.187168],[8.3292402,47.1878632],[8.3293605,47.1949382],[8.3229212,47.1951427],[8.3214768,47.1985367],[8.3219583,47.2011537],[8.3183474,47.2104345],[8.3141348,47.2117836],[8.310885,47.2152992],[8.3110656,47.2185693],[8.312209,47.2197955],[8.3088389,47.2243324],[8.3093203,47.2264576],[8.3071538,47.2304217],[8.3072742,47.2320972],[8.3059502,47.2358158],[8.3060705,47.2394932],[8.3037837,47.2436606],[8.3014366,47.2467656],[8.2955389,47.2483588],[8.2918679,47.2529341],[8.2881366,47.2586934],[8.2876552,47.2614299],[8.286271,47.2651872],[8.2872339,47.2680459],[8.2883774,47.2696385],[8.2822991,47.2747835],[8.2771837,47.2757635],[8.2727303,47.2753143],[8.2674946,47.2759268],[8.2653281,47.2771925],[8.2615969,47.2769476],[8.2579259,47.277805],[8.2557593,47.2788665],[8.2531716,47.2767842],[8.2503431,47.2754777],[8.2501023,47.2734769],[8.2495607,47.2701693],[8.2455888,47.2671475],[8.2409548,47.2667799],[8.2345155,47.26727],[8.2314463,47.2627776],[8.2309046,47.2593061],[8.2266318,47.249421],[8.2219979,47.2471333],[8.2152576,47.2443143],[8.2136327,47.2420264],[8.2130911,47.2360201],[8.2112255,47.232465],[8.2128504,47.2254767],[8.2111653,47.2226566],[8.2068925,47.2205313],[8.1976246,47.2206539],[8.1914862,47.2186102],[8.1697609,47.218651],[8.1654279,47.2231471],[8.1608541,47.2240463],[8.1535121,47.2294001],[8.1517066,47.2332005],[8.1482161,47.2364695],[8.1479754,47.2410049],[8.1463505,47.2420264],[8.1382261,47.2416587],[8.1355782,47.2394115],[8.1267316,47.2360609],[8.1217967,47.2363061],[8.1161397,47.2387169],[8.1067515,47.2394523],[8.1026592,47.2411275],[8.0998307,47.2443552],[8.0976642,47.2492984],[8.0979651,47.2506873],[8.0933914,47.2556708],[8.0885167,47.2568962],[8.0848457,47.2558342],[8.0832323,47.254053],[8.0799525,47.2524599],[8.0769018,47.2505444],[8.0685367,47.2428435],[8.0632523,47.2409801],[8.0513365,47.2386512],[8.0485681,47.2388555],[8.0357496,47.2374663],[8.0321989,47.2355458],[8.0271437,47.2353415],[8.0113892,47.2396732],[8.0092725,47.2411594],[8.0079059,47.2431192],[8.0078257,47.2482115],[8.0085667,47.2504155],[8.0083965,47.2576942],[8.0071199,47.2592249],[8.0029921,47.261622],[8.000524,47.2648564],[7.9975877,47.2678885],[7.9962685,47.2727106],[7.9947366,47.2736923],[7.9899279,47.2712091],[7.9727786,47.2690724],[7.9685657,47.270083],[7.9673742,47.2709781],[7.958608,47.2711225],[7.9600974,47.2674842],[7.9627357,47.2639612],[7.9657571,47.2617086],[7.9669912,47.2587917],[7.9669486,47.2500111],[7.9596293,47.2458225],[7.9511184,47.2391778],[7.9446927,47.2359996],[7.9373308,47.2310586],[7.9340542,47.2305096],[7.9297987,47.2307697],[7.9177984,47.2330524],[7.9078407,47.2383689],[7.8979256,47.2377043],[7.8694993,47.23207],[7.8547755,47.2271864],[7.8513712,47.2271286],[7.8395836,47.2294693],[7.8358388,47.2297583],[7.8308174,47.2325901],[7.8270727,47.2350461],[7.8243066,47.2383111],[7.8212853,47.2404202],[7.8201363,47.2426447],[7.8182214,47.2456203],[7.8177107,47.2491734],[7.8182214,47.2508199],[7.818349,47.2537084],[7.819881,47.2558747],[7.8211576,47.2567989],[7.8211151,47.2577809],[7.8192001,47.2605823],[7.819115,47.2615354],[7.8168596,47.2648564],[7.8174979,47.267311],[7.8195831,47.2698232],[7.8243917,47.2715845],[7.8280514,47.2721042],[7.8359239,47.2783695],[7.8370729,47.2834216],[7.8400517,47.2872031],[7.8420092,47.2906669],[7.8458817,47.2942747],[7.8476264,47.2981997],[7.8513712,47.3029902],[7.8529031,47.3074052],[7.8557117,47.3103194],[7.860648,47.312541],[7.8642226,47.3134931],[7.8701802,47.3167244],[7.876308,47.317359],[7.8808187,47.3171571],[7.883372,47.3166667],[7.8858827,47.3194073],[7.8888615,47.3213112],[7.888053,47.3244266],[7.8890743,47.3286955],[7.8914999,47.332618],[7.8977979,47.3401449],[7.9000958,47.3415579],[7.9000533,47.3432015],[7.9022235,47.345566],[7.9063513,47.3470365],[7.909628,47.3473536],[7.9135855,47.346258],[7.9161813,47.3445568],[7.9169899,47.3430285],[7.9240113,47.3389915],[7.9383947,47.3379245],[7.9492886,47.337838],[7.95431,47.3359635],[7.9559271,47.333166],[7.9569058,47.3296762],[7.9557143,47.3253496],[7.9699274,47.3279745],[7.9730764,47.3301665],[7.983332,47.3343196],[7.98563,47.3369151],[7.989545,47.338184],[7.9924812,47.3382705],[7.997843,47.3401738],[7.9963536,47.3425672],[7.9960132,47.3458831],[7.9973324,47.3485934],[8.0011623,47.3508134],[8.001375,47.3568964],[8.0026091,47.3577036],[8.0041836,47.3604421],[8.0097582,47.3641893],[8.0112476,47.3659763],[8.0174606,47.369262],[8.0191202,47.3715676],[8.0198011,47.3737578],[8.0202266,47.3759768],[8.021716,47.3783685],[8.0219288,47.3809331],[8.0228224,47.3828636],[8.0207798,47.3885683],[8.0160563,47.3892886],[8.0126519,47.3889717],[8.0077156,47.3901241],[8.003673,47.3920543],[8.0016304,47.394791],[8.0015453,47.399976],[8.0002261,47.4030579],[7.9980133,47.4045268],[7.9926089,47.405506],[7.9877577,47.4063701],[7.9841831,47.4083861],[7.9802681,47.4080981],[7.9732041,47.4112659],[7.9696295,47.4138289],[7.9569484,47.4189256],[7.9552887,47.4218049],[7.9559271,47.4240218],[7.957459,47.4262099],[7.9627357,47.4282827],[7.9774595,47.4325432],[7.9756723,47.4373215],[7.9761403,47.4413798],[7.9743105,47.4436823],[7.9512886,47.451107],[7.9486077,47.4538982],[7.9481822,47.456603],[7.9467779,47.4575525],[7.9403947,47.4566893],[7.935884,47.4573798],[7.9363095,47.4762513],[7.9317988,47.4760499],[7.9246922,47.4771716],[7.9157132,47.4774305],[7.9090322,47.4794725],[7.9031597,47.4796739],[7.902947,47.4896528],[7.8969043,47.4897965],[7.8917977,47.4940521],[7.8908615,47.497646],[7.8877976,47.4993135],[7.8863082,47.5023034],[7.8799925,47.5039706],[7.8740346,47.5078733],[7.8699423,47.5094384],[7.8700627,47.5123855],[7.8643455,47.5124464],[7.8585079,47.515434],[7.8557998,47.5185433],[7.8562512,47.5214695],[7.8548971,47.524741],[7.8518279,47.5284999],[7.8464718,47.5271386],[7.8414768,47.5277685],[7.8413037,47.5240579],[7.8401548,47.5158674],[7.8394313,47.5125909],[7.8368781,47.5125622],[7.836793,47.5104927],[7.8335163,47.5094866],[7.8315588,47.507647],[7.8298141,47.5055198],[7.8252182,47.5035363],[7.8204947,47.5004027],[7.8147498,47.4949114],[7.8118136,47.4926112],[7.8064518,47.4914035],[7.8040262,47.491461],[7.8004942,47.4901383],[7.7797702,47.4902821],[7.7787064,47.4930425],[7.7796,47.4960039],[7.7838554,47.5004027],[7.7820256,47.50368],[7.7808766,47.507302],[7.7810894,47.5101765],[7.7797702,47.5126484],[7.7796851,47.5152926],[7.7704508,47.5180229],[7.7590463,47.5200346],[7.7526631,47.5200921],[7.7478119,47.5195748],[7.7336839,47.5229084],[7.7278114,47.52719],[7.7198538,47.529776],[7.7126195,47.5309541],[7.7076407,47.5344018],[7.705513,47.5391709],[7.7069598,47.5427904],[7.7141515,47.5462661],[7.7224496,47.5475587],[7.7490035,47.5497704],[7.7542802,47.5533892],[7.7665358,47.5561462],[7.7716849,47.5576109],[7.7800681,47.5583575],[7.7857704,47.5598221],[7.790196,47.5616025],[7.7939834,47.5663403],[7.8049198,47.5723697],[7.8061113,47.5798911],[7.8117285,47.5895352],[7.8157712,47.5921756],[7.8221117,47.5935244],[7.8364525,47.5916303],[7.8395164,47.5904536],[7.8430485,47.5877845],[7.8487507,47.5889899],[7.8562403,47.5918886],[7.8648788,47.5939262],[7.871262,47.5942992],[7.8772621,47.5936679],[7.8853474,47.5942418],[7.8934327,47.5930078],[7.9010925,47.5897648],[7.9083267,47.5851439],[7.9138588,47.5792308],[7.9186674,47.571939],[7.9195611,47.5677185],[7.9187525,47.5643304],[7.9156035,47.5600805],[7.9157737,47.5571514],[7.9184121,47.5540498],[7.9212632,47.5526138],[7.9255187,47.5522691],[7.9347104,47.5522117],[7.9404978,47.5507756],[7.9432638,47.5496842],[7.9435617,47.5505171],[7.944583,47.5558878],[7.9484129,47.5597934],[7.9539449,47.5622916],[7.9600302,47.5633254],[7.965775,47.5627224],[7.9720305,47.5612005],[7.9783286,47.5605687],[7.9862437,47.560942],[7.9971801,47.5621194],[8.0044995,47.5613728],[8.0111379,47.5597359],[8.0164147,47.5570078],[8.0204573,47.5557442],[8.0262021,47.5574098],[8.0379897,47.5587596],[8.042543,47.5602815],[8.0485006,47.5633254],[8.0545433,47.5679769],[8.0593094,47.5692115],[8.0622031,47.5689531],[8.0669266,47.5700155],[8.0724161,47.5697283],[8.077395,47.5679482],[8.0818206,47.5643591],[8.085225,47.5628085],[8.0879059,47.5629808],[8.0925868,47.5655938],[8.0939486,47.5680918],[8.0948422,47.5758721],[8.0960155,47.5788226]]],"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":[[[7.7043837,47.5579369],[7.7707561,47.5577157],[7.7710309,47.5802484],[7.8040761,47.5801681],[7.8043315,47.6024837],[7.9371294,47.6021651],[7.9370265,47.5796189],[8.0037358,47.57917],[8.0033818,47.5568746],[8.0363991,47.5566467],[8.0368072,47.5792819],[8.103127,47.5788098],[8.1038729,47.6011151],[8.1701128,47.6008572],[8.1703583,47.6234954],[8.303108,47.6223517],[8.3030479,47.5998751],[8.3361987,47.5992663],[8.3358464,47.5771047],[8.3691264,47.5769423],[8.3694274,47.5993115],[8.4356351,47.5987721],[8.434543,47.5313309],[8.4014436,47.5316154],[8.4009621,47.5092624],[8.3678025,47.5095876],[8.3675016,47.4869812],[8.4004205,47.4866559],[8.3993887,47.4192943],[8.4655766,47.4187047],[8.4651501,47.3964683],[8.4320649,47.3965377],[8.4312466,47.3515984],[8.4643446,47.3512791],[8.4632704,47.2838729],[8.4299736,47.2842069],[8.4271368,47.1267624],[8.3293044,47.1275336],[8.3293709,47.1300747],[8.328335,47.1300747],[8.328496,47.1452909],[8.3293986,47.1950243],[8.2963975,47.19526],[8.2971382,47.2402162],[8.2640997,47.2404639],[8.2644614,47.2629694],[8.2314132,47.2631644],[8.2307496,47.2182208],[8.0988604,47.2191231],[8.09874,47.2413542],[8.0660016,47.2417628],[8.0655202,47.2192048],[7.9999301,47.2195248],[8.0000316,47.2643299],[7.9673499,47.2646187],[7.9667542,47.2196077],[7.8015274,47.2202899],[7.8024434,47.2879109],[7.8351763,47.2877159],[7.8354316,47.3101684],[7.8683686,47.3101684],[7.8688544,47.3554249],[8.0009678,47.3542951],[8.0015636,47.3992779],[7.9353032,47.3997634],[7.9360677,47.467157],[7.9027785,47.4672894],[7.9030284,47.4898126],[7.8698688,47.4899752],[7.869929,47.512499],[7.8368897,47.5125803],[7.8366489,47.4900972],[7.7702695,47.4902599],[7.77045,47.5127429],[7.7045169,47.5130695],[7.7043837,47.5579369]]],"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":"https://www.geo.bl.ch/fileadmin/user_upload/Geodaten/Nutzungsbedingungen_GBD_BL_V3p2.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":"https://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.7133786,47.2138825],[8.7137004,47.2273679],[8.8116987,47.2262565],[8.8033693,47.238578],[8.8086564,47.2431015],[8.8244837,47.2465632],[8.8297079,47.2453884],[8.8365225,47.2425717],[8.845681,47.2425282],[8.8483688,47.2432185],[8.8523223,47.2403414],[8.8620639,47.2388207],[8.8647161,47.2396607],[8.868627,47.2396752],[8.8733911,47.2412538],[8.8788236,47.2447632],[8.8805373,47.2479105],[8.8987831,47.2497591],[8.9028149,47.2509368],[8.9102526,47.2500343],[8.9273465,47.2540596],[8.936441,47.254991],[8.9423286,47.2584948],[8.9442343,47.2617281],[8.9488206,47.2653616],[8.9509396,47.2686041],[8.9506765,47.2710841],[8.9530017,47.2728451],[8.9541109,47.2750548],[8.9550424,47.2825128],[8.9517147,47.2852719],[8.9466448,47.2864681],[8.9525821,47.288436],[8.9545376,47.2898202],[8.9614064,47.3009796],[8.975521,47.3024455],[8.9800647,47.3041573],[8.9915271,47.3189339],[8.990688,47.3218309],[8.9863719,47.325417],[8.985483,47.3277835],[8.9836414,47.3293064],[8.9859168,47.3381494],[8.9846369,47.3406117],[8.98079,47.3423656],[8.9808753,47.3483543],[8.9778462,47.3543713],[8.975905,47.3560573],[8.9700245,47.3584321],[8.9657226,47.3588993],[8.9623806,47.3625214],[8.9566494,47.3743155],[8.9520986,47.3783555],[8.9477771,47.3797089],[8.9502307,47.3834606],[8.9501804,47.3859594],[8.9488028,47.3883559],[8.9397021,47.3940336],[8.9363736,47.3949594],[8.9325121,47.3987101],[8.9280071,47.4014804],[8.922778,47.4038013],[8.9138785,47.4056866],[8.9192383,47.4121313],[8.9204852,47.4191469],[8.918293,47.4232292],[8.9209378,47.4254404],[8.9210685,47.4282841],[8.9257143,47.4269507],[8.9343725,47.4279643],[8.9387669,47.4317263],[8.9397424,47.4341139],[8.9388876,47.4372496],[8.9351066,47.4397254],[8.923492,47.439535],[8.919731,47.4408069],[8.9132248,47.4411945],[8.9116159,47.4434661],[8.9152662,47.4462817],[8.9149947,47.4500355],[8.9119578,47.4537755],[8.90517,47.4579095],[8.9018315,47.4643479],[8.8973465,47.4689773],[8.8958079,47.4721858],[8.8913532,47.4737967],[8.8914336,47.4782146],[8.9014192,47.4813273],[8.904275,47.4844942],[8.9031387,47.4892782],[8.9000113,47.4918738],[8.8996694,47.4988516],[8.9035711,47.504035],[8.9041343,47.5074519],[8.9032192,47.5194804],[8.9049689,47.5244717],[8.9036516,47.5269095],[8.8998203,47.5296458],[8.8842335,47.5339233],[8.8788335,47.5327691],[8.8706077,47.5347652],[8.8601998,47.5348806],[8.8567406,47.5359397],[8.847821,47.5358039],[8.8461416,47.5408683],[8.8402991,47.5465363],[8.8372823,47.5527806],[8.8427528,47.5536968],[8.8464835,47.5562011],[8.852688,47.5564454],[8.8561976,47.557918],[8.8577462,47.5614128],[8.8572836,47.5648937],[8.8551115,47.5672075],[8.8507875,47.5681777],[8.8476299,47.5702335],[8.8453774,47.5706134],[8.8448042,47.5730897],[8.8421092,47.5751318],[8.83326,47.5776893],[8.8296197,47.5777842],[8.826613,47.5766242],[8.8213745,47.5775574],[8.8143152,47.5759835],[8.8123442,47.5778016],[8.8122235,47.584734],[8.8106749,47.5863889],[8.8081207,47.5873792],[8.7681785,47.596738],[8.7543013,47.5972941],[8.7552868,47.6010778],[8.7541605,47.6027322],[8.7488309,47.6058782],[8.7482878,47.6087393],[8.7507013,47.6098105],[8.7525516,47.6129154],[8.7557493,47.6121697],[8.7610187,47.6133493],[8.7816937,47.6063393],[8.7816535,47.6034509],[8.7846703,47.5999251],[8.8016849,47.5966024],[8.805124,47.5968601],[8.8089453,47.5993826],[8.8107353,47.6098105],[8.8186593,47.6137153],[8.8200068,47.6152609],[8.8208918,47.6205752],[8.8201476,47.6241539],[8.8241509,47.6255988],[8.8307922,47.6320585],[8.8344755,47.6409896],[8.8318161,47.6494497],[8.8269525,47.6520555],[8.8116788,47.6559927],[8.8111242,47.6621038],[8.8119206,47.6645366],[8.8104131,47.6675247],[8.8088061,47.6685686],[8.8029328,47.6697849],[8.7929921,47.6691911],[8.7868485,47.6697849],[8.7845305,47.66899],[8.7821555,47.6665862],[8.7792117,47.6569506],[8.7776331,47.6556287],[8.7739783,47.6543451],[8.7662277,47.6543834],[8.7610796,47.6525728],[8.7585198,47.6503311],[8.7546374,47.648827],[8.7534001,47.6473324],[8.7483942,47.6461252],[8.7432888,47.6474857],[8.7388233,47.6465085],[8.723763,47.6475336],[8.7206344,47.6466426],[8.7149174,47.6488462],[8.7082619,47.647639],[8.7048061,47.6503886],[8.7005255,47.6519885],[8.6942682,47.653071],[8.6924194,47.6558107],[8.6863185,47.6609449],[8.6848537,47.6641343],[8.6857354,47.667994],[8.6832609,47.6731461],[8.6805589,47.6756071],[8.6752117,47.6775988],[8.6764205,47.6817734],[8.6756099,47.6866083],[8.6742731,47.6879869],[8.6722679,47.6889059],[8.6627254,47.690294],[8.6464379,47.6984747],[8.6396803,47.6987725],[8.6354971,47.6974324],[8.6216198,47.6955373],[8.6181807,47.6927893],[8.6174366,47.6908669],[8.6200712,47.6813354],[8.6147818,47.683082],[8.6091706,47.681877],[8.6019906,47.6745105],[8.599537,47.6692288],[8.6027549,47.6613188],[8.6097913,47.6567985],[8.6140953,47.6563989],[8.6157444,47.6555726],[8.622311,47.6510364],[8.6222707,47.6502371],[8.6204808,47.6475815],[8.6193947,47.6504267],[8.6152115,47.6545182],[8.6092986,47.656767],[8.6032449,47.6565367],[8.6006907,47.6554123],[8.597875,47.652757],[8.5964471,47.6487602],[8.5909163,47.6462266],[8.5893677,47.6443973],[8.5887442,47.6393565],[8.5911576,47.627552],[8.5932493,47.6223333],[8.5983778,47.6158668],[8.5985387,47.6144975],[8.5911375,47.6091691],[8.5893677,47.6068233],[8.5879599,47.6031891],[8.5878794,47.5990937],[8.5820269,47.5979273],[8.5739821,47.5932889],[8.5714624,47.5898796],[8.5703531,47.5863307],[8.5720312,47.5798462],[8.567708,47.5779851],[8.5650628,47.5752413],[8.5611662,47.5640727],[8.5570705,47.5594664],[8.5561603,47.5633626],[8.5520646,47.5690432],[8.5533445,47.5714611],[8.552605,47.5759896],[8.5500736,47.5780618],[8.5466605,47.5792322],[8.5435034,47.5822828],[8.5431905,47.5851029],[8.548879,47.5879038],[8.5517517,47.5877695],[8.5576393,47.5896302],[8.5611378,47.5915101],[8.5626452,47.5945983],[8.566684,47.5956532],[8.5690163,47.5974754],[8.5695283,47.6004865],[8.5723726,47.6038618],[8.5730836,47.6064124],[8.575615,47.6067575],[8.5789997,47.608445],[8.5807631,47.6103051],[8.5812466,47.6120308],[8.5802511,47.6145617],[8.5771224,47.616364],[8.5752452,47.6195658],[8.5727707,47.6210995],[8.5678502,47.6216363],[8.5634132,47.6269655],[8.5610524,47.628384],[8.5480258,47.629975],[8.5455797,47.6312209],[8.5449824,47.6329651],[8.5428777,47.6345751],[8.5399481,47.6356484],[8.5276894,47.6363383],[8.5211191,47.6388681],[8.5147765,47.638504],[8.5093155,47.6355909],[8.5082916,47.6294191],[8.5016076,47.6259687],[8.5006974,47.6242051],[8.5014938,47.6215404],[8.4925344,47.6189331],[8.4888369,47.6195275],[8.4766919,47.6193741],[8.4743881,47.6183771],[8.4715439,47.6149452],[8.4712879,47.6130662],[8.4678463,47.6127211],[8.4644617,47.6110912],[8.4617312,47.606585],[8.4551894,47.6067575],[8.4506102,47.6041111],[8.4498991,47.6016372],[8.4506955,47.595845],[8.4538242,47.5934283],[8.4542792,47.5865993],[8.4562987,47.584796],[8.4601384,47.5838176],[8.463324,47.5804409],[8.4688134,47.5795008],[8.4621863,47.5765268],[8.4541939,47.5766803],[8.4364174,47.5715379],[8.4316106,47.5710198],[8.4247559,47.5723054],[8.4147726,47.5687937],[8.4130376,47.5674504],[8.4103356,47.5619423],[8.4103925,47.5597159],[8.4078895,47.5546486],[8.4084584,47.5501758],[8.3996412,47.5444356],[8.3960859,47.5429956],[8.3946922,47.5409412],[8.3949482,47.5367361],[8.3913644,47.53568],[8.3883495,47.5330492],[8.3852493,47.5331644],[8.3811251,47.5321851],[8.3773991,47.5296885],[8.3751806,47.5267885],[8.3727915,47.5165125],[8.3657946,47.5166278],[8.3566646,47.5134773],[8.3543892,47.5110375],[8.3510329,47.503141],[8.3523982,47.499567],[8.3516302,47.4972995],[8.3527395,47.4948398],[8.3545029,47.4935522],[8.3556975,47.4897854],[8.3553278,47.4852494],[8.3569774,47.4793099],[8.3589115,47.477426],[8.3618695,47.4764455],[8.3672167,47.4765417],[8.3670176,47.4748691],[8.3607318,47.4722161],[8.3590253,47.4660443],[8.3599639,47.4638138],[8.3632632,47.4620447],[8.367302,47.4565256],[8.3697481,47.4550448],[8.3739292,47.4547178],[8.3775414,47.452006],[8.3758348,47.4506789],[8.3744127,47.4461396],[8.376233,47.4381757],[8.3716822,47.436752],[8.3685535,47.4340585],[8.3680984,47.4315766],[8.369037,47.4286327],[8.3722226,47.426035],[8.3828317,47.4234564],[8.3837134,47.4225135],[8.3807269,47.4220709],[8.3755504,47.4177986],[8.375977,47.4137761],[8.3744127,47.4090604],[8.3606749,47.406635],[8.3578876,47.4054222],[8.3562948,47.4037667],[8.3566077,47.3996084],[8.3619549,47.3951609],[8.3657662,47.3942945],[8.3760055,47.3946988],[8.3774276,47.3921765],[8.3803572,47.390482],[8.38761,47.3903473],[8.3883211,47.3801216],[8.3903405,47.375268],[8.3935545,47.3718972],[8.3938674,47.3694508],[8.3957446,47.3671007],[8.3990154,47.3660796],[8.3983613,47.3640761],[8.4001247,47.3609358],[8.4010349,47.354327],[8.3972805,47.3467731],[8.3977924,47.3447496],[8.4018597,47.3391025],[8.4093116,47.334091],[8.4060976,47.3297537],[8.4057848,47.3266691],[8.406894,47.3244713],[8.4129523,47.3204996],[8.4161094,47.3199597],[8.4294774,47.3222734],[8.4355641,47.3208273],[8.4343695,47.3195355],[8.4315537,47.3185136],[8.4260927,47.3137508],[8.4227649,47.3070589],[8.4231063,47.3036838],[8.4174462,47.3015043],[8.4137202,47.2982445],[8.4001247,47.2956404],[8.3976787,47.2939235],[8.3951757,47.2951581],[8.39108,47.2955247],[8.3860172,47.2943672],[8.3827179,47.2922452],[8.3819784,47.2903353],[8.3825472,47.2880974],[8.3850786,47.2856472],[8.3897716,47.2750731],[8.3956308,47.2710011],[8.3940665,47.2667166],[8.3941518,47.263609],[8.3975649,47.2598644],[8.3961428,47.2548067],[8.3974227,47.2518915],[8.4064674,47.2445161],[8.4082593,47.2411756],[8.4076051,47.2395728],[8.4095961,47.2358457],[8.4107338,47.2279852],[8.4124806,47.2243309],[8.4169461,47.2201391],[8.4195912,47.2190187],[8.4226915,47.2188641],[8.4297736,47.2200039],[8.4393588,47.2193664],[8.4499963,47.2136286],[8.454604,47.2133388],[8.4562536,47.2108078],[8.4590979,47.2093394],[8.4644735,47.2092814],[8.4660947,47.2086245],[8.468682,47.2053299],[8.4732876,47.2039772],[8.4769279,47.2045784],[8.4839872,47.2039225],[8.4948878,47.2073794],[8.5039985,47.2076799],[8.5153818,47.2115191],[8.5175338,47.2127076],[8.5190623,47.2149481],[8.5306003,47.213063],[8.533074,47.2132543],[8.5415009,47.217776],[8.5445579,47.2170657],[8.5540708,47.2172569],[8.5585759,47.2151668],[8.5698386,47.2138964],[8.5749129,47.2125501],[8.5774872,47.2077137],[8.5804437,47.206402],[8.5840839,47.2060331],[8.5901175,47.2071398],[8.5896549,47.2045985],[8.5907409,47.2019476],[8.5935767,47.1985998],[8.5958091,47.1975339],[8.6016818,47.1972196],[8.6065288,47.199201],[8.6072528,47.1988457],[8.6109735,47.1938714],[8.6112752,47.1905913],[8.6139098,47.1883772],[8.6152171,47.1851515],[8.6193803,47.1804493],[8.6197624,47.1791779],[8.6172082,47.1735865],[8.6196015,47.1697994],[8.62292,47.1682133],[8.6339011,47.1671468],[8.6356106,47.1657794],[8.6396531,47.1645898],[8.642871,47.1644257],[8.6521627,47.1659846],[8.6542543,47.1655196],[8.6548979,47.159667],[8.6564867,47.1578345],[8.6588197,47.1565763],[8.6685337,47.1549215],[8.678469,47.1555779],[8.6824109,47.1575883],[8.6936133,47.1589832],[8.6980379,47.1613353],[8.6988625,47.163031],[8.697696,47.1703326],[8.6959865,47.1723151],[8.6891887,47.1756646],[8.6871976,47.1795881],[8.6879015,47.1822947],[8.6918635,47.1848508],[8.698239,47.1920537],[8.7032268,47.1932564],[8.7085162,47.196017],[8.714228,47.1969326],[8.716923,47.1989277],[8.7421232,47.2070988],[8.74218,47.2135521],[8.7133786,47.2138825]]],"terms_text":"Kanton Zürich Orthophotos 2014/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":"https://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":"https://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":"osmse-ekonomiska","name":"Lantmäteriet Economic Map (historic)","type":"tms","template":"https://mapproxy.openstreetmap.se/tms/1.0.0/ek_EPSG3857/{zoom}/{x}/{-y}.jpeg","scaleExtent":[3,17],"polygon":[[[12.7111707,55.2666045],[14.3810926,55.2916348],[19.6545301,57.2493436],[19.852284,59.7508666],[17.775868,61.1379379],[18.0615125,62.2781508],[20.9728895,63.5779045],[24.3566785,65.6084197],[23.9611707,66.7919139],[20.6103406,66.451891],[17.1386609,63.9663237],[11.9970594,61.0370176],[12.2936902,60.3160739],[10.7006727,58.8137475],[12.7111707,55.2666045]]],"terms_url":"https://www.lantmateriet.se","terms_text":"© Lantmäteriet","description":"Scan of ´Economic maps´ ca 1950-1980","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAA0CAMAAADPNIq/AAAA7VBMVEVHcEz1NzT1NjT4NzTwNTLzNjP4ODX3NzTyNTPyNS/zNjPyNjPxNTP2NzTvMi70NjPzNjP0NjL1NjP3NzP1NzT1NjP0NjP3NzT/Njb0NjP3NzT4ODP0NjPzNjP2NzX2NzTvLCzzNjTtNC/zNTPyNDP5NzT0NjTzNjP1NjPtMy72NzT5ODX3ODT1NjT1NzTyNjP1NzTyODD0NzT/Ozj/OjfzNzT9OTb3NzT0NDH/ODX6ODX1NzT/PDn5NTL4ODX0NjP2PTr8YmL1OTb9Y2P2QT/4TUz3R0X+Zmb7ODX8X1/4Skj6UlH7W1r+NjP5T03RuQwnAAAAMnRSTlMA8SH8F63p7FkZsHRcsw/ErCddmTKo2/QD+34roLpExwfMG25W1djATRKRk9CG+VOkPjR6UnQAAAIzSURBVEjHnZXpVuowEIDZC3gBBRQEBNerqN4lk9bS1FIqUAH0/R/HbkmT0haOc/jDnK/zTZihyWR+GP3my6BaHbw0+2lUrvecn3gBYD33cglY5akz+TTMuROmOjWw3nmqxHHNEn4zv7armROrDZoiZOilX7vcI3yam5ltv7thrywHRLICj1HuVFeXM3u23SyWy+V6bboccoueitxAVxf2ajFHahAoCKIPeO7I4d4XlqpOUTSIfhRy7fzbemvGUJ4932ZgYzLfIBXFhwwNyj0AWVpJnCOHhwC8x6bFaQkxiEDCfTBey0CMkzXAhoFBk/kuT/wjA/90tnXbbv9tSULSP3gNuHZqwSbkahD6oeamumdKmOHm8C98XjnrOolCVgsTlyF4+ZsV0LIFJ3FybrCCTX5cZVbSOHdP00cU1KQ6D9alDwoid99zfyiIR+KmNLBQccx6xBcieIGFHrusaXwlgldYOHWmSJs2OsJ/pJKlPUHVS9xAZAJ0ScP8jT8EdhqtdM0VLGmRWYczlPFoTLnxCNO9AHrI//iVSe6Gfm54x8QED+nTRZBZTaXRK5d7DYXVk4OjeO1I4V4QDNj5hKvzIV3zY+V3mghfxAU4Bjnpr1UVhlDg5EIoUuRFJco58c5rqqjL+8WJ8h1xgjxGLP7sKeJYeaw4Rp4g3vnZZSgmXh+FknKAOCJPEQvyNLEgTxVzcgLlfbemJ98nZnJFKuy/iG+BHCD2bzv9+KC7vd5q1TM/j284bszID7oc+QAAAABJRU5ErkJggg=="},{"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":"Lausanne-2012","name":"Lausanne - Orthophoto technique 2012","type":"tms","template":"http://osmdata.asitvd.ch/tiles/lausanne2012/{zoom}/{x}/{y}.png","endDate":"2012-01-01T00:00:00.000Z","startDate":"2012-01-01T00:00:00.000Z","scaleExtent":[14,20],"polygon":[[[6.6666848,46.4944086],[6.6163719,46.4940643],[6.6163553,46.4983636],[6.6013468,46.4982495],[6.6013136,46.5022748],[6.5592343,46.5019436],[6.5577253,46.5968689],[6.7289549,46.5980474],[6.7304012,46.490042],[6.677024,46.4897774],[6.6770269,46.4901091],[6.6734462,46.490056],[6.6734711,46.4904096],[6.6667206,46.4903583],[6.6666848,46.4944086]]],"terms_url":"http://carto.lausanne.ch/lausanne-gc/","terms_text":"Ville de Lausanne - Orthophoto technique 2012"},{"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":"https://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":"https://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":"https://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":"https://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":"https://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":"https://www.dati.gov.it/content/italian-open-data-license-v20","terms_text":"CTR DBT 10000 Regione Lombardia"},{"id":"Lombardia-Italy-CTR","name":"Lombardia - Italy (CTR)","type":"wms","template":"https://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":"https://www.dati.gov.it/content/italian-open-data-license-v20","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}","endDate":"2011-01-01T00:00:00.000Z","startDate":"2011-01-01T00:00:00.000Z","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":"https://data.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":"https://data.grandlyon.com/imagerie/orthophotographie-2015-du-grand-lyon","terms_text":"Métropole de Lyon DINSI","best":true},{"id":"MainRoadsWA_Road_Hierarchy","name":"Main Roads WA Road Hierarchy","type":"wms","template":"https://services.slip.wa.gov.au/public/services/SLIP_Public_Services/Transport/MapServer/WMSServer?LAYERS=8&TRANSPARENT=TRUE&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&FORMAT=image%2Fpng&SRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}","projection":"EPSG:3857","scaleExtent":[0,21],"polygon":[[[129.00009155273438,-31.68764133578121],[128.99871826171875,-14.582254405707156],[127.08984375000001,-12.297068292853805],[124.76074218749999,-12.983147716796566],[121.2451171875,-15.707662769583505],[119.091796875,-17.602139123350838],[115.53222656249999,-18.854310361889812],[112.412109375,-20.46818922264095],[111.24755859375,-22.836945920943844],[111.005859375,-25.621715959845726],[111.64306640625,-29.668962525992505],[111.68701171875,-32.36140331527542],[112.1484375,-34.47033512121748],[113.35693359375,-36.10237644873643],[116.98242187499999,-36.703659597194545],[119.44335937499999,-36.949891786813275],[122.27783203125,-36.61552763134924],[125.9912109375,-35.406960932702],[127.59521484375,-34.57895241036947],[128.86962890625,-33.59631896113268],[129.00009155273438,-31.68764133578121]]],"terms_url":"https://catalogue.data.wa.gov.au/dataset/clss-road-hierarchy","terms_text":"Main Roads Western Australia","overlay":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":"https://www.mapbox.com/about/maps","terms_text":"Terms & Feedback","default":true,"description":"Satellite and aerial imagery.","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAC0CAYAAABsb0igAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAJhxJREFUeNrsnf9VG0kSx9u8/X91EawcwcoRMERgEYFFBEAEiAiACCRHgBwB4wgsR4A2ArQRcFOm5m6WRWgkdfdU93w+782T7x4r9VT/qm9XdbdzAAAAAAAAkfiACcLy/Pw8qD5GLf98+eHDhzVWAwAAAAAECLwlLobVx1AFhgiNP/Wz/v8PYaWP8L16RJgs5f+rRMoK6wMAAAAAAiR/sVGoyBg1REdXlCpIfrqXyMmSWgIAAAAABEjagmNcPccqPAbGi7xWUSLRkhJBAgAAAAAIEPuiQwTHZxUcw8RfZ6WC5FslRhbULgAAAAAgQGyJDvkcZPqaEh1ZIEYAAAAAAAHSjeiQ/RtfqmeSsejYJkbuSNMCAAAAAARIWOEhguPctT8WN3eWKkTmmAIAAAAAECB+RIdEOC5UeAyo8jeRqMhd9dxyDwkAAAAAIED2Ex7D6uPK5b23IwTz6rnmrhEAAAAAQIDsJjwmVC9CBAAAAAAQIKGEB6lWYbh2pGYBAAAAAALkH+JjUn3cIDyCIeJDoiG3mAIAAAAAeitAKuFRqPDgVKs4yKlZl5UQKTEFAAAAAPRGgGi6lezzuKAKO2GuQoS0LAAAAADIW4DozeUzR7pV14j4OONmdQAAAADIUoBo1EPSrSZUmykWKkSIhgAAAABAHgKkEh+yx+O+eoZUmUlWKkJKTAEAAAAASQuQSnzIPo8bqioJ5KSsKWYAAAAAgOQEiKZcyV6PMdWUFGX1nJKSBQAAAADJCBBNuRLxwfG6abJSEbLEFAAAsKcfcMgCZElaMAACZJdBp3Av+z045SptOCULAAD28QOG1cejh686QYQA2OTI2KAzqT4eEB9ZIHV4r3UKAADQFl/zRoEpARAg28SHbDSfUSXZMavqlnoFAAAAgF/8ZkR8iIM6oTqyZVLVsfvw4cMZpgAAAADoN51HQBAfvRIhREIAAAAAECCID0CEAAAAAEDmAgTxgQgBAAAAAAQI4gMQIQAAAACQjwBBfAAiBAAAAAABEkt8TBEf8EqE3GAGAAAAAARICPEhwuMKk8MrLrisEAAAAAAB4lt8jByXDMJm5LLCAjMAAAAAIEB8iI9h9fGAqWEL9ypUAQAAAAABsrf4GIhjWT0DTA1bkDYy0zYDAAAAAJnyW+Dvlw3GrGq/z7J61tWzqp6/NvzN7w07Fhnbok7VO6VZAAAAACBAdkI3Fk8w8b/ERlk9P+XfHz58WO5p24E66yJG/tTPXCIH4+r9Lirb3NJcAAAAABAgbR1kcY45XvWFRfV8E+FROdUrH19Yfc9ahUz5yuZfxIGvnmHiNrup3qfcV6ABAAAAgF1C7QGRNJo+5/KL0Lisnv9UTvRp9cx9iY93RIlEVC6r52P1Pz9Vj0QQ1gnbkP0gAAAAAAiQ7ejFcn3d91FWz4mIAEkh0khFdGoxUv1TxMiZCqLUkDbEvTEAAAAACJB3xUdRfVz00I5LFR7ylFYKJQJIoy+pCpEL7gcBAAAAQIC8R98uG5QIx1nl4H+yJDw2iJFaiFy6tFKzSMUCAAAAQID8m8pJnLr0Nz/vgmwul1SreUqF1tOlRIikUm5pU6RiAQAAACBA/iE++uQkSvTgVDeXJ7nJW1OzJCXrxKWRlnXBLekAAAAACJAmfUm9qvd6LHJ4GU0bkxOzUngfjnUGAAAAQID8in7IvRNFD2y1UPGR1d0UGg2Rm8cvjRe10MstAQAAAKDPAsT1Y2V6nnLKVUshIntDJCXL8juyFwQAAACgzwJEV6SHPRAfZ31oDJqSZVmEDPWwAwAAAADomwDRo1Fzj370Rnw0RMjS2d6cfs6xvAAAAADp8tsB/61cOJizI9g78dEUIZWTL5vTHw3W8UDb3pTu6w89yU6e0Tt1XlbP2uo+KD0prX6HtxBRvbJ+Z09kmxX6z+KdP1vps8w5DZU6gx3GmUFL+8t4s8Jqrew6aMw/7516Ke15qb4KY3nKvuYBDcWic+qLUm41Z0D4NdA+GKxnGYA+MrEePNjLARKfdSLdtY5l4P9WPYuuJlgVTc132IVV4x3KPrSlRp0f6wQ/2rPvyeT/Xet+SW8K3saLvtWZptr62PN3Xb3vlD5jciwq1J7H7v2FrzZjeW3fEvvmL0B8DQ4WqY/axbm1LUIOmlgM2nh8SJttezS0rp5+qZ6J5z5zp5PrOoK9JvoOhaevlDKL/b7mtqKmE31trxB36Rxku0b5Bgf8/jxEu9O+ckgbK/e0SS2sQ9VZLb7vDEczOxMg1vtMBmPR8YHzXVv7fuvyygQPY1uTeeyFPh2HJp7qw98YXRXs8TlPntTo1jpt12UYG62rQQaD8lDf5VDG20RO9TxEqJNpqHoR4RFh7HlopLgkLWqrZxa5T0rdXOxS/57a5CyA/QpPNhnu+Jv3kevsh8XjzXUc8cF0R/t30WcmOe9rVP/hvkM/4aYLv87zOz/FvIxZ548nn/OqTycgVwpjHbcIMbl2PCH4ZJLB4HzhyRb3mwSsDsCxB/2x58HwIfI7PFhbjDBsq72FqK8fTNkB1nG+6zp7tDSe9tD+T7md8BhpwWinOTKmjxeojw4ild17vb31O/ucgnWeqVC/NhgOlRD0xIIjpGFsi/ZJnUGo79EVkx/uZdN+7He610n9oPcTgabvEHtxQH7vMRWnQIXmrCNbvVX/V2q/iYNNdTbUlcEHA3Umc8xMHY+iR/a/N2L/X31G7T9O3K4S8ZA9wjNn65oGseuDCpEY5VoE6KMXEepvGqDeyoMFiA5MI5cfpbX9BK/yj6042nJjuqW9McO+TJZ7tJ+JOqNdTgC1Ez/ao/y1Q931Ud9XPoRU6AnfvRwKYs3ZH6hTm2Q0KcIk/2jA8X3LyamdtJzTguqFjbFB+9+naP+GoL53tu+HG+u8NA1s48sA/tJ5yLFUv/s8kC0OEyDuZVNWbkgDsXjcblN0WImCWLRVrhG5Q8XHzEhxZIDfKc9cJ4UHQw51oe8wMlbPA13BvXe2TyQsdm0DGfdNcdJ+OPvR29pJKzKz/0Cd5Bvjfaa2/zgRu1oV1Nt8rB+h2rhuGr8LMJ+GXJQL0S+uNx12cbRLx3X2Vth8cGbtnO7G0YubBEmXIkTCigtD5hqzumpWfDSZtXFAG+LDWqRV2tiDFRHSSK9LJV2jjobMetw3C62zUUJ19qDRghzsP0rMSa5TWW8M27SOeqSaDl2P69NA/pJ8r++T5sYhRJN+p+/5ZPledtEuEZCk8xI3UHZ5TNsWZf6aiSFHO0Ro8aAOifQwLT52ESEWxcdrh2zUcT2P1U4pCu+Jnrw06GHftHiceRtuUheOjZTUFO1/YTElqyGoiwy6aMhU2xBZIyH6403sd99FgOSW6mIy9WrL2ctWoiAr5z+0eAg5pgbuytC4+GiKkPGGtj9z9leH61XJQUfjg4wN1lOutjFSIdcLEaIRhNQjPxPre6G29JnU7T+21GcSF9Sb+CWofC8wafrRte/53mfURsco33Pv9bZ7ho5aFm7o8tt8fmct9aqFyBgbmgBunZ0oyMhafn5HAiQVZq+jeSpKJgnZ+h5H6nAR0oN+KQt3N5m8S5GgcPycW5/p2v7q+OaaSjl0AaLcgVKxvGxI1/bke3F72eZgp7YRkNxSXFYWb9FucfOkNBQT+bi6IZ0oCOzDoOnA6wCY2oRWxDyiNzPx0XSo+tDWc6uze9pYP0WIRqmvetBnQ6TangUop4/FjRAbzy/b/FFbAZKbc3dttFxtOvY5UZBeiOTcGTUceOsn0mzsrzEib/obM5oMGBLftMduRUh0++t4PemJjb2LkECpWAdtSNf/1ned3ra9U++oRQGHma0iyMbzubVCtYh+NDsGUZB/M+Q0rOQ4DzQAxuQmwrjwQFMBY0xyu7k7McYxT8fSCOxVz2xcixBvfkWgVKxDxKjvNrTaRWS1iYDktrKccvSj6bhZWTG2JOaIgiQ4wCf+DkXguxJS33AO+XLFRbCdchHjnhCt475GvEIcOuI7FWuvDemBNp6f6cJ0K35r8TfHGTWmsm1oKCY7RD+anUIaz7TrsstG/qr8CyPOv2w4vGVeat8f3MuKxV/6v/9wL5vwUnEqZKCT1aTvjf/vT32HmFHbK7Wl73HhxnUbfS5fjTkjuowJVvr8zwFx3R1CIc7Zx12cjgyoxx0L9pcDPZahDtRR3+S+53auU95OPflMy8qut85vJossSs/btoNAG89vd/Wv2wiQnFaVrUY/zvdscLdGBv6vRtpJ4aCNUyn1tXiv7ejK2mdnMz1q7l5OsVtuGWDH2rdCO84SBRltO3Jwx4m/cHFTLaXs37R9LDe1DbXrSPvaZ0RJFCdsoSJ7uaXNj7Q+jrXtx4icDXw6Z9h/b/ufhBI4Ll4EtrZzucXOQ7XzZx2HYogSSXm7qMrla4HzWtvI0GM7uNmhH/red7ny7l/LJPicD48WRzeZ0Kvnac93mhp6jycj9ZyUYJY6jNX+90mX0JtuZ0bq9n6ffFwdx34ELtvMc7t4jNQmpofkOGv7uOm6/yfcLzfxcOhYJv+9fk9y464R+0882P8+UnknifYBGZcnh6Q46fgeY4568rkfJJB/XVj93RQHAdMd1ICNnwxdTGTFSU3qzP1IfWx2aDvRQasrJ/PJR/8NbOunhNrEk+b/+l5ImXbVRjKa+x58T+bad0MLkUefc1Fm9h9GsP+TZ/sPLS6ItShzaMH34LnMN7EX2gMsxt2Eco4envPgyRnkwOiHKWGlqxgWSGpTc4SJ9sLzAP8jdt999ngUYuB2OjIyJmyLIg0CtudhF/NGBgLk6Tlw9Fbbfsi2NU3c/heB7T9OyP4PKZTzHcH9mMJito73j7HsK23c8sLD68LmgslVcU+DbLgGYGvFpDNnJGEBMg1Q3sFznPQg7+Ijggi58FC2WUBbTiK264uU+3xkB1hE/TDiOP0jYBsbYP+t42dI537ooYzjgFGPUUQ731tv5w3B5Lt8w0iLWwctmhy9Y5ScNhdaurG7doAkVObjFAJpaI86YHcmRPT0hZUR+xYOFnrmuO96lk2ZstEtxuEHZz43djfeYe7CHEhxfGC7lb4cQiRIXZ3EvP9IN2vGaicpIyfXfAp1itFb47T8ngtzfLqZO6p2GSe1b8Sy/7p6Tly44+t9+BQhFmxlHP8UYjx/x84y/txab+d6ctSt5/JdbahXnz6i+BiLIALE5XO6SRlrcNlBeMyc35Mb6gb3qDmFw65sbaTO+34yjzh9Z6G+PNCNrq+5PXRw2/IO0wDt9dB+F1J8LGM3Qq2/E0TIu+LjrIsf1t8N4QRbuqOqjf1PuzhJMqD9x8+HbeieOP+nSi11DOrCzpeB5kLf7VzmU59+6qS5EPvs/8JfLz7GewLkz0wG+a8ZC49NyvxRUzliC5GfRuo8l7a7L5ehB3td4Q4lONcuzpHZviemQ4XveQA7diI+XonVUwdmxEdgJ7g+/to6Zcb2P8TR9D0GdSY+GnYWG98as/PrMoZYNLzZ8G8vc6ePOu1DBGTR1Q9HFB5vKuAOhMjSSJ0PXX9ZRky1CSUS7mJMWBoZnVuoNF159L1yfNql+GjYuXQBI3Ip9lFZJLCyWBFg3D5PwP4mRLGKkNKC/XWV3Kfft+5afDTsfBnAFzz3XMbS83w00r14vm88X/jKTshdgCxiN37d6HPRofDoUohYESBFj52baPuddMBcef5a6a+3OdprC599i8Ndb6UN3FbmrsPFIEOsVRiujdRLiD1dow7TgNtwZuzmdt/2H+65h/eL7/cyZuczz/PVMMDJdZee28KV83vjuddIzXsCJJU8zvf4Fll4TMXZdy/hLmsDcHAhYmmwSSgP2atzE3OjcSAHPuqigUYIVgbaqs+JbBniAAJPDkDf94NcW9mT2OgDUh7f0cyxYfsvjdk/RPrNTmIiwBh0a2kBJKCdPxsv48CzL+9VvB9taIxFJoN98BW3V8LjKgHhVguRh0D1bGVy7eNG9C5WmH1PMl97YreQztqlxcapE9el6y+l7p2yWDe+93R9MfiaK6PCvD6wwaf9x3v8vS/fJYSg9WVnsfHcstDWtmAxWrzwfTDM0TuqKXlnLORKaoLC4zUiPh4CCBErAmTYQwfnW+wf9LyauO5o1ex7x/XmcxVtYW3l8VV7kcl/6frJdY/KZzENy7r49bnyvWsa1rHPdmQs9SpkOx8EukDUWrQ4yMmamwRIDqvHwZwKddhTFR6bhMh9ZpN9HwVImfjvduWYrgz0wb44ucJdH/umZWGo4rD0PIYUhl5vFfJYb0/2l3Fo0ZH9xx7tPE/Azj7LeBygjEGP0rciKo9wxvYeqE+dnXsvDnW+zvTSnpz4vWcOzsr4qlOniwZb+nNnK/K6SulrEaO0lt++wd5zZydSiuj6Jz5TIC0dh37dw3bSyjH2PAZ9TcTOPttDEKFtKBUrWOroUQIDx77OWNCJWESI3mga8lbTGMLjo/UViz3p2x6Qvjl0tNN0J3/n+nUi1tr66vsrcbg22LZ70d48nyzY1v4+Heh5InYWG/vyEUcBD73pOhUraCQm1z0gZcwBQ8/y/phI58tdeACkxLCnTv3XHtXxoqflLay8T2LRYV/2bzu2/OHp95bWTniLOAYFEdsGUrGCntqXawpW9FQOqSTjQqRvwqOPx/BCevjKHy5TcrIsHH8ckW99La+Rjeh9tn8bETjqqZ1L6wJEx0rfJ6TtMqcEPbXv6EDl3IeGlboQKV0/Ix59PIYX+sv3BMvcl9Owyh6Xd0g729mH8Gn/Ngtxoz62c10EWUe08yHETsWKEnnJUYCsLYQBDQgRGQxOZJ9KZOFB5AGgPUWPnfmfPajf5A6H0PL6mkOHBt4nxb7hbX9CrDnb+ilvge18HLgNS3+MeZBClAtTc0zBsnbLaS1E/qMNKPRk1BQeXQwIRB4AOnB0EyxzSb1kX+4hbcxuu/GYIpdqO09GnAa4LHRjn4l1YWqOAuS70caz1ltYPwYSIl0LDxfwJAgAeH98WWIFHByEUzbEig72XYD8nVh5Y6RiRdv0TgSkWyHi47SLddfCowHRD4D2gn3YcxP0QTT9nWi5/6KNZcEfDmIIpyhjeYRUrOuYWxgQIB0Kkerj0sNX3RnKvUSAABibtIyPgQAIQMYYBEj7cfPWhYk41Yvj0chOgKR0DrWWdX5Ig6meW0Ov9KcDAAAAAO88Pz+PAwmegX43AmRPygTLfEg47c7YKiIREICWJHpqjM+JlPECQtP3RbHvNIF3KTx9T5TMG91nOwv4E7OYe3lzEyCrBJ0QKfN8z//cTPRDGy0OBUB3/S81+nBoRaoO8HEm9k+1jf3OqJYUsRaCbwK36dACJ2sBkurGuX2iIHNj0Y+xA4CuSFH8D3tQL5wMSBsz2589RmGLRO2czCZ9vdV+EsOXi5WKlZsASfLEiz2jINfGXuPYAfQcnSR2wdciAgLEJkXPy13Sxjrtz9EWKRM91c+XnVeBbRs1MuEipWId5eTIu7hX1fvmboe/nRvcbD+mLQDsjK+xNsVUn14sWqS21yW3vTl7LAp0XV5x5H05f0tPfxPTmU9RgITOvrmKLKajCJ6jzJy3ZM/81ovEypZ/bir6UQ2YE2cv1YCL2SAFfC0kFAm+e9GTOi76Wl4jBy0UPW4vbcYXX/7e58SEns9F02XAckp7uOjAROPQ4j2rFKwMzpVvIywsRj8+OwDYB18rZ8OUVq5jH/fI+LgTX4yJ677Z31t5W/oKvk7KKnrcL4O09Q5Sr14TNBXryPjAYUKBRhRQpdseBbEW/Rg6mxvQScGCFCg9fteXhN77S4/quEglP17L6UvIWpmTR6mIc3X2fM2nZeR6GiaW7ubLzmvNYAlB7NSrf9WpliGqAEnxNKlcHM73BIbF6MeVUTv+xLeFBPA5cU0ScnL7dmrepIfltDQGn/fQ/m3HltLjbyaxsOA5bXwZqIwi5i4MmOsilLDMbQ9I8myJgliLfgwSmlgBLPb3tccJbKATK864Pc6t39Wi5fPpqJeGXm+cyF05Pu3fKrXK8xg0SSTa59PO3wL1xZkhewVJxcrpFKycbvx8S2gsDEY/bgzbsHQAaeCzrV5ZftEATm4qyHtfGC/jhfO3Krw2sgE9Gfvr4oFP570M9Lepj0ESfR11ZOdd+qIlITcMUa857QHJhg1RkDtjnVga5ITaAjgYnytokoc9NfyuoW/ytYzZKIiO57lGP/7nGFtdndd24XNBr9zxUJ6vHn97YnwviE87r3zv/9D9ShZFnPdUrKMNDjACpHuuXw0m1gb0mWXjGbQXwHtt1Wfa67nFTbcRb/K1irW0ipDC8JvR98T+b49B4kSvPL+PRaE3dX4jC1971EZ/lc3nIsp7x/CmloaV1b4VdUqWb4gRC51YQpiFYfMhoCE15jk7ugZzmrtibG2fTlUeSffweSiAzMULo/Yv9H2tzae+28Q+44nPLAs5eezGmJ3FZ7kyYOdtAsnn4tG1Z/9x6NOGRxk5cTlePCcDgqnoRyKOBAIEUsP3Spo4AJb66b2zldPcJTMrESoth29HcWH8Tq4bKylCav+ZEfvPPZfjworY1tS7+wB2XnluCz4FkpTtVp+V53r1Mn69J0A4xrRjqsYtA8KZtcnT2c/h/k7rgcT6uiyg+F5omFjYD6JCqKCW/8FD1yJEf/8hwFffJWD/ewP2H6j9Bxbsr6LFtwiZGbHzvRU7b/GtfHItdar1emmxrO8JkNKBBcdkZaUsAUL1oVjSciBBQuQTX3UpQlR8TKjafzHoUoQ0xIdvp6wMeCkb9t/O6sCMiRDp3l3auRZ5owDtvPRYzqnnMpa6gF37kQvPPv3Ix7yS0x4QCNuRC2f72F3aLqS+2CATRogFh6vY6Vgy8VfPPeKjlRNcdDCWh3B+Qzmwoe0/jmz/USCn+GD764LnPICdf8ROx1I7/7Bo5zfK6XtvylsRD9/ZNFeHCsujdxri2pFLD//vIPeJFHfFKW6QMKEcOEnH+hHjGNKGgzWmOls7wdNIY/k0oPgoEzx98Fd6TkT7X6hTHML+q+aq94FjUIg9PJKONYtxFLWKHWnnwwTaue/Fodu3opDqF/meXw4q+9E2QzM/9F58hMpTDQXRD0gWdSBCteFfK4KhTgHSqMfUhVt1zJkrFYijQHUjKRNSLyHvF7jOwP5FIPvL/Twyj4bMIvCS56+Oaqh9PBMdg0La+d6F3at65rG8F57HyvWWfuh7Q/pBqVjbBAibeREfKYkP2izkwGXA7/514VnVtx99pUSo8JDvenTGb0E2Ti0QZ74iVeqQzSKIwkUGdy/9ityJA+vLQW7YX/pGEbDspeb5+1oImQZcCBmqnR8C2Tlk5PXaV4aF9nHvqVfvnYAWaEP63qlYREBgU+cImacaEtosJI06creBf0YmP3F0n+S8/n0mEHEeGpN+CqfjpcIvMacO2mTXlJVaEOqK+6MLvw9HnJqzjOw/Vgf5h9pxuKf97xO3f+g6LRp2vkjAzksVZr7wPWaWbVLwAmxIr99lZ37bUtBVVbkrx/ntfRUfqTkUq0ROYAHYxrU6QqHHXunjkgYgDsBaJyY5gn3l/h2qH+pzrAsTCI7wDlqhQlHGNXn+2uA8yN/9ofUSe9Ho0vi9H/vyvzs6Wtr/d/2Mbf/rEPseZS6t3ltWy28i2PnXfTTqb5Zq56X7916UUaOdFxFt7FXkaeqV7/LvEtk4U9HmrQ4lFWtXgfZbi79Z6AQF/RAf0ilCnJkdg5IahBwQh67qi2cuzD0N74mRsWPzuFVnuHZsLaW5LTxtfMb+e855lf2DRUvlu6tx6DjimCALHBOD9X/pa3EzUOrV7S7l0+DCtedynFffOd9FDB+1+Bty6vsjPiYuzchHzTdqETISISKor7EEGEUcjTPM0BmyKn8a4XekjvucWXDrWWT7Tr3atvF843s5vxvSB27HVKytAkTzxdb09ezFx8z5Pw4uNiU1CZmJkKl7iUIDmHN+M029SoWTGPbX3zjtqR8oK/reNm2HSr3apx0E2pBe7HLK4lHLv2MCzFd4DPV4xknir7JgMoRM6fsKJNjjlP123Y4JMe2vaTUnPRMhIj587vsYOv+pV+Uh0ZlAG9Kv2h4o0FaAkNqSp/ioL0XK4cx+2ihkiQrrE0QIGHJ+S8zQqf3nsX9UBU9fRIhX8aGEOCnQRwTD93u2TsU6atnwUkjDGjpoKzwGenTdjcvnJBuidIAIScyR6kHV5ZbCfJbYpvPb3PpMl/ZviJAV4mMnn0s28Re+27aPKFigG9JbpWId7fCF1h08BEi7jiCNIvRlPV0MGKRfASIER8oaPzNy2FKss7/pM0FEyCeXZ0T2OoD42Hlzdgv23Xj+nlD3PUZtTcXaRYB8xQVIWngUutcjp6hHDelX0DcRkqrzvu6R+MjFYZM6+5RqnTX6TJmw/U8s2V9sWj2fEh6H3rLxqeeLBmuCpF75XHQNtCF9q/A62qGApcs77Jar8BjqCVcp3mrehpWmCAL0RoToKl1qR/SurDlSOGxbWar4WGZgfxEhtwna/8Tqnhsdh1I/Iatu4979CE298p1tUoYYQwNtSH83Fetoxy+7M9yI/sQ1eVN4SLrVJONXJTIHfRUiU5dOes8iB0e2Zw6bpKN8CnHLdof2v0zI/rcqPpbGbfqrb7v09mGuQ7bxQKlXwmVAm4TYl3eltjhYgMwNN6bc0ooQHum3SYDQk3+pk7/VlV2Z2CW1gTsj/umwfTTssNWr7tPM7T833GfE/pep9Blx4KWPq7hLQbDWCyIh23iI1KvbkII00Ib0jULsaMfCrXH4zAqPomfC45f4yGl1DmDPSWOtK7siREojxao3SX4iRXJjnYmzZmmD9K88cF0RLntg/zNna29IvSL/MVX7S1+X8ruXlXSL4qlUcXca0nfQzdfjEO0jgo1CbEgfVzYZHSRAFKt5x0UPRYccpzvRzeUPPRIeNTmkXy2Nfc8+fPc4wHbFytj37DP5LzXPvUunqp4kxYmatljBXSfebg6ts1L3hnR52WSzzqxE0tYxvkftb6rPZCLwZHHwP9quVwaKtFDhcZKwuI4SEQu0Id2r4/vwbJAeCQ9Rk7PnfvOQUX0eWpc/NuVYRhTCPxJ/B+lTTwe+w9RYuxpp23qK0B+l/i52rUNdQDkEebdJANtNPdlluuPvFhHH9h8hbOdxTHmIPaY07B+rz0y6HPci1mdMu9Y8aj8eJjqvN8e4aQfln3isrzdTsD7s25jcy4q7NbLd5KinKXx2L2E99rsYPhlkz/qVQXKfgXJlJQ1NQ6z7tM21lX6rY9s+LC3na6ujeex5/JA6kyOwF4fUnzpge53QF2oM0An/ysNXXe+zqq02qcf8wnOdfdU6WznjdDWmNOwfqs/0Nn244csUzv/9bTIefD90TDIwr5uZGw/og1t9lA8HFOrB2Ut7ysYpbeQQ1gMgNAYZDZsDwH4Tijx/6mebSVLGVRFYP/Xfy5w3lXctQDbUmcy3f1Bn9JmM7DpUe9a2rRcjtjm8K33EOf9LbVti0bT47ZCB1aAAGblELxtqDHDHgVYGcuIaEwDsh66oLbEEdQbYv2O71kKCgyoQIDs1nLJymktjIiSJ1KSG2Biq4Bg50qraUrLSAQAAANBDAaLITvkfht7nvHLuxaGXlYq/3f+jIdFDn41c8vrz2P0/vAj7Q/QDAAAAoK8CRMKSlaM9d3aOfx2ow187/VcNQSAfa/fPMGotVDaxbCEYjhv/JpIRlgXRDwAAAIAeCxBFVqRTOZlp4P6ZMlbQBJLiEhMAAAAApM3RoV+gm4juMCUE5ppbzwEAAAAQILUImTpOiIBwiPC4xQwAAAAACJAmpMdAKM44Px0AAAAAAfIPdHMwq9TgmzkbzwEAAAAQIJuQDekrzAqekKgHkTUAAAAABMjbaJrMGWYFT5ySegUAAACAANkmQkpHKhYczi2pVwAAAAAIkLYiRNJmOBUL9kXaDjeeAwAAACBAduLUveTwA+zCrzQ+Uq8AAAAAECA7oZfGsR8EduWyajtEzwAAAAAQIHuJkIUjlQbaI/s+5pgBAAAAAAFyiAiZVh8LTA1bKHXvEAAAAAAgQA5GUrFIq4FNSNs4xQwAAAAACBAv6IbiE8emdPg30ia47wMAAAAAAYIIgSji40QPLAAAAAAABIh3EbJEhECDE068AgAAAECAxBIh0G/OEB8AAAAACJCYIoQ7QvotPuaYAQAAAAABElOEzFWEkI6F+AAAAAAABEg0EcKekH6wRnwAAAAAwFHXBWBjem/ExwniAwAAAACOLBSiIUJWVEm24oMN5wAAAABgQ4A0RMgnx43pOSF1+RHxAQCJsTb2PQAAWfHBWoGen58H1cdN9UyonqRZuJc9H0zAAJAUOg89VM/ogK8pq+eUMRAAIAEB0pgALlSIQHpcV5PuFDMAQOJCRATIYI//dFWNgSssCACQmADRwb+oPu73nAAgPvVJVwtMAQAAAADJCRAVIQMVIQXVZRrZ53HKqh8AAAAAvMeR9QJK/mz1yAlZ11SXWSTl6hPiAwAAAAC2+vcpFVbzcWfusI2B4A8RHKeccgUAAAAAbTlKqbDi6MpKuyMaYoHb6vmE+AAAAACAnXz6VAuu0RA5JaugGqMiguMM4QEAAAAAvRIgDSEyUSHCSVlhkROuZK/HLaYAAAAAgN4KEBUhIj7k3pArqjQItyo+uFALAAAAABAgDSEyVBEyoWq9MFfhscIUAAAAAIAAQYggPAAAAAAAAYIQQXgAAAAAAPROgDSESL1H5NyxWf01sq/jTsQHwgMAAAAAECD+xcik+vjiOL63rJ6vleiY0w0AAAAAAAESXogM3UtqloiRYU9ee1U9i+q5I9oBAAAAAAiQ7sTISIXIOEMxUouOr1weCAAAAAAIEHtiZKhC5Fg/U6Ssnm8iPIh0AAAAAAACJC1BUriX/SJ/6qe1TeyyiVwiG99FeFSCo6TWAAAAAAABko8gGVYfI31ElNT/OwYiNFbV81P/vSTCAQAAAAAIkH4Kk4EKkUFDkPy+hzgRYfF3498S4VghNAAAAAAgB/4rwAB4xMkVHiVS4wAAAABJRU5ErkJggg=="},{"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":"wms","template":"https://geodata.md.gov/imap/services/Imagery/MD_SixInchImagery/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=MD_SixInchImagery&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","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":"https://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":"wms","template":"https://geodata.md.gov/imap/services/Transportation/MD_ColorBasemap/MapServer/WmsServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=MD_ColorBasemap&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}","projection":"EPSG:3857","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":"openlabs-geoportal-public-transport","name":"Municipality of Tirana - Public Transport (Open Labs GeoPortal) (overlay)","type":"tms","template":"https://geoportal.openlabs.cc/mapcache/tms/1.0.0/public-transport@GoogleMapsCompatibleExtended/{zoom}/{x}/{-y}.png","endDate":"2017-01-01T00:00:00.000Z","startDate":"2017-01-01T00:00:00.000Z","scaleExtent":[0,21],"polygon":[[[19.7376248,41.3015397],[19.8862836,41.2721302],[19.8687741,41.385825],[19.6833798,41.3732021],[19.7376248,41.3015397]]],"terms_url":"https://geoportal.openlabs.cc/","terms_text":"Data provided by the Muncipality of Tirana hosted by Open Labs","description":"Bus stops & lines provided by the Muncipality of Tirana hosted by Open Labs","overlay":true},{"id":"openlabs-geoportal-tirana","name":"Municipality of Tirana (Open Labs GeoPortal)","type":"tms","template":"https://geoportal.openlabs.cc/mapcache/tms/1.0.0/tirana@GoogleMapsCompatibleExtended/{zoom}/{x}/{-y}.png","endDate":"2017-01-01T00:00:00.000Z","startDate":"2017-01-01T00:00:00.000Z","scaleExtent":[0,21],"polygon":[[[19.7022626,41.1403991],[19.7757337,41.1186768],[19.8643109,41.1212632],[20.249862,41.3494955],[20.0308221,41.4118363],[19.9257654,41.5204034],[19.8886865,41.5075495],[19.8893731,41.4226497],[19.8165887,41.4617688],[19.7335046,41.4303724],[19.7417444,41.3788701],[19.6579736,41.3747481],[19.5721429,41.243224],[19.6181482,41.2256674],[19.6717065,41.2272167],[19.7022626,41.1403991]]],"terms_url":"https://geoportal.openlabs.cc","terms_text":"Data provided by the Muncipality of Tirana hosted by Open Labs","description":"Streets & Builings provided by the Muncipality of Tirana hosted by Open Labs"},{"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":"https://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":"https://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":"https://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":"https://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/PhMlZyIAAA02SURBVHja7F1djNxWFb7XyRMvYyQUUbHJeBuoeJtpkUAg0Dj9gYS22dmgIkVUXW+aFvoD8Sr8CRDrVAVFRTSzgBRImuysCEUqauNt0lDSVplFQgiBqPcNNSTrSaMk5CXeF56oL+fYx7t3bzy/2Z3Mz17Ja8/19b32+XzOPX/Xy1mflI//wjMF547QeIExzpjGmODwR+PReY57zqM9j85zFuJvHrfldIx1msbnzn81a3brs/JeB+sTh/6ZB7BK8CQFBAVAW4TfXhpwuOfpwPlwnQ4/dTjOQ10GgLsbgPO68Zk39jJgd/38H0UWijKAkxGMLwJEzoVn86Vb4tiXLwYAMwtD5nfrc/csaHe98HcLAJuORFvIZmBvn7fvCW6131Aggwp2Yfdw0K3PrvUiYJ88+LcyD8NpoC1SeeK9/Z+yzk/cszpEFsJD4IDj8uuctgpl6/N/1TWNuaEQBQ3nIiHG//XdT5dXdZBQFPBV/vfXtnrroK0OG7igWRQEE4shY+Z73//MqhNWE2IWONjvZir0jPaYfe4vFjDANGh1oPSBZvfDz3psQEvvcJoQqIpHc9iFH39uVQD77+832rArwobzofOh3f/zpHOoheK85tM5H+oqdbqzYLPVa6gvi8bxoM6hOh3bpLXvC9CGJv/swDy2DzhtEYBbzTkMCVmg4zwQMg+ESxSafbTH82UibKFOX0h8NMhz1M4nULDgC5CBbQTGKBM4pjQGjmv1Bafd8aOKrjFeBm1uBNVwmMfs9yc/v1aqeJY4xWmy/TxxaFKQSysEWvJCOPgiEGBJMeklKEp1lb5Q+Tf94JwtQuGHTIzwEBQPwUbfd75QXuNhJ4nIzRQbuMOUNuQeVzqfIxFoKteZyp4p1/Ump2363jtgh4mxEJUO0OZCzqyrzxU6ZeyWUgidOocBKEm7SOTBVoG6RYmzzJS+8vRiZNvltK4D7SPfecsCMTgGYFV5yKxrB++tdPgWCqSgNCpj0rFPIi8BYEQSkSpoOUU0zjergHSteNTwocMQ56+sEMLq4NBz0rHT4rV+DVFXlLhuURbD7XJZV4J2/WcP+HBTs8BpCNwYiEq7Q0Mj8aboONNE+23AIZy2Sg0QMorYTStuz4NGwBXBLjtAwOkdHNpROKLlQqJuvsZcqfa9qADew4rI/rM6gGbTW1Xq1Lhoo5EhfLJFRSTiMAkAWfVP5q2AjPORWxGNXQsaF6IoGAfRImaA6zoaIgHiukDcWYW4jRQRLIYEgisZzjI4KmhuO/eodSdozADgWAcct56kJMhj2ZKIqypGdENlhDhOvt6VQKtKik9bnNaVDuOP2m+ajPNzgrO5/7z4JZOtl+4Wj3d8648GqPp5Eb1RfB2hbgZt6Jk3dOCuKMAZCwCBgek1E48wb6ENlZc9GtI52ZPhJt5/UlLytAUkXl0lOqCTfWZIffhSW3kcFMOJdlxKnNVQj9cmNip6WspdJx6Hnj5two24goPywXk15KwMxwHTePlqaXuwRqCVJGWhCoQxJIItyPYYAeQqrie5zCReegL8XJ2hxxMQoK1Q7L4Kge5JY82hb7MtTht65OU8QGxhihmMVEjyBAWPcwYxfS16CzQ+D+c9qKtUZ75Srtfn8Ndfx1xFE8Th5Adx+kDkZ7zyywc7oTE69DajAZzFtx6IU5LcUVhmiYCeAtg8cVJiPI/B9X4SK0vxtMie/mlU/eu4rkrSWIsSxzXPaZt3/c4BYCxomY2AIZAAmHnYB7DpBFwAf6Kbw7zCaE7iHNpEHGTADyNKP+TxTIXgw0EmpARROJ6qHn7Y7iSHk7iblrQ8S+GSYRJx0yqnEEeUJRUeDWVd5TT0mFDbG1Ifo2RaCIWjDWWsqF1Lc9rm0RM2GLmTSGYRPZQog/3kXn5ld83I8ZZH/2CIUFgAHBBA5ITgOR7PTyyEfjAuJng8Z3HB5+A3qr2VhV/vrHRaLBPxbTKEswqXHaBotezcnUtEGxnLtgRaRjG21bLYwD1mKK6uqTTAGotHIfQoa5eJ8cuvPlpuhhCXTjyCbO8AeKUIOC5A/PEKj8HRE+AuvjTacZBqFFviDFksJQTUa3kwCFQZDEOx95CbZTGs2oeqWMxI4tdpT3sU8R/gtNLQrhPs8mvNAUfgBXQjJdbFhSZ/1QNiS2kHzRjVuVqgsZUe/YSD0uazjMJ17XlEQDEoA2ZV4LgM7K0+Nn1Kqtis0S7NeZ1rwZeIPsha8/aMAmC5LdAuvf6YD8DlkeMit9JgFlmUFUmpkBWZVFeWomAsAazMkXIpK8CN1ArGNvQ9AnAB+QGNAQVNfuNxzkNxWiSClhQlxU8Tv2Q6LHG1DHzK/CqHdZy0nJWmHMaRei9EdvPIb/ODhhh5O6YUcYihm0NsZVTabqDsyMDbNcYKFLssVUw2BG3LQzMmFywn4jlO71NsAkU1V4mJRB5nyx56phjgpuTKuqkv4sAJWcymjBVIL8l4PZFa17jOPli2waY6FLfk85dOPTZwnJZikOuJ71H2OXay1ATN2DGNadjvoh0MwB24dHrMYeulK0oqaMb2aUvgJMtZBgCbunTGsvucc4qKbeQl3gjF41+rLKUaUH8WmQdyCkJiaDdjfuTrjFlZAZrxwDGdadxNHMKwn6u+OW72MWB5sq3S3EuJLxHPFxp0teSJV6IHWIbJc4JjvdvEbY3TCzRZa6wlRcS4/5jBo5xDUYB9VQgx2s+AUXFZbX9gpo7txerYZ1YNzdFv8p4atfMjN5Zx30s2LjIXgmeAweZDwczq2T1BP6NFYk8Ot9yNigVpamZiVFOczKJrZK47oIZiyNhWXwKsS9xiXGp7UyxNubebuDgpG4fvPVqJxCHaz1zMAnBW9a3+BqzWXILLkFgcXXbb7MNK41gEs45rrFHRJRAxZudjPigAJqqA2Tb/7b1F/+3HBwUwT7GTkIMwlnUDiOQ2CLPUmh8Liv1WD8xmCxrz52grLxnXAJzvv7O3MmCejqCOFwM9/ufq+AkbeT0wWi2LzgKlMaxK0QbYEZx484fJTZWWyu00yWU6W7kSJvF6LNYAtZWC97WNtohjN5J7Km9sOypix0dkTMf5UMupBXFdnG2QpAcs1VFqQdQeTwhKK2DJnjqO65fPJX3XyTeRzsfj4QFUz1Hagg/nSheOjrTlmaC3P0jCJfTbZcvhllyTXRUVBaSQYiZYbQIXqPn+qD1OAWH2IcchUZDxOKUERMoJBkEjikVH8SenooURcRJCFCKNTou4hkdpBJRgEKcVUAO6IhLIcV/UtyBuX+6RQAY1NvoQGdaK5GyUtlCgtAUgjBjb+sTsBADXTrA1MmRxDiOwDMXInm9DNNYq7SokujK/Bhv9ypP2LbDubSvZPSfzAJwJsB6Ct+QQAIfJR8ULR0b8FrgsiVbvUwxi2Y5rRgHJqca0dB5BGpPAbRW0RBFZntN6dT6qHh/1Fo6NloAFRzG6DnyXg33TigMR9gBLX9q0mGaHsfScfkuxqfw682KuhTXdrfkee60MP37SADG7AE8ze/Fosdjq9URIXQK00qAtU7KKE6+/X0dRySd2Vq06RQrU0jb7xyQD4MSde922VeFNE3/SN+0/6/TCs2r9AhroLIuo0ABwbRmyG5hwoJNJAM5cB61DBbRfFz/5B8A5AFzLEXbAO78BddNQrHNapwqQ2gbg5uEAv4pwA4Dz7nyiefB4KCJzB4Dz10HrlDY5vSsAmuNijikWi0rUJp0WQI/Y7eqh7V0PWl+u2jP2vGaAKb5AXhdcKGKD8V2pd83Hvnmm8gEa65x9+NrUjmCd0zpc/OO7fBB2sf0mcBGIOAfGd3nrk7N6nTkt2IBemx7IpO5L0Ag4d+H4qAHAHQDQUFyO4cJ7AG6F92fLU6f1zU+fdjQhRnBO03ogTXAgFjUP7zlpwJOWQEyOxA5pNh9ybi38Zqe35alTMO/xSRE7pKeg3rnyqy/XFI+bvn22CDIXNzOMndcV6NPTYIsd3pp39fm1/fjaQK1EH97rFuGBEbwsPjkQfVxEixox+MlnLh1+yBp65g0jjBc85kUcedCjxZLxMdZlkugGS/5jBkUntDhaMXHlJ2ZpHbTVBU7naB5wPglPX8UvtQIIkwAcfrU14PghteXVqYyAozBUdDwLxxXYXPiJn86YlkNNANzo1Z9uc9dBW4OCdhwQOUccx4jj8LiKWWnw2wcUPKgLJODwGjNezsxHQonjMAMb+nKuH7zPXet73ziooAkMeVCMjz61O6MxXgIRuSKgOvTsGSNkIg+o5AGbcihENonsgRY3FzLgOCbc6y/c3zH7biBBAzvOZHHQFxdMlgGE8sKRnRHRjW+cKgInmWCz5YF/ELCsBhUhwgTIahqvAnAOXONee/GLt8WeG0jQ0M8oIntHBNF/gBLCAjsOlQ8TAMF/NoTuLIafydBCUQ015gNwFQDOu1La4d7u+x/IOc2wXg3oQzNs6TMZnD7rFJsDLmwVOPaqhx/uOu/IoHIaaIkCE3GqMCd5wHEecBeAJLyLR4pdH2T8vwADANA824ekci98AAAAAElFTkSuQmCC"},{"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,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAGb0lEQVR4Xq3MS2xcVx3H8e855z7m3vH1jMdjO43zshIrtpM0SZ3WFEcRVFFKoRWPBYtAHwgWCFUsQN100QeCsqAhCESrirRASdWWIkoUqgKFJm3UZ5o2oW2akrR5uXbi2ON4PPfOfZ17iERW2bCAz1/f3V8/cfDC02UEj4OxKHjdFMUfmUzOlAeXZFZuuVIKN8zi1dPh7Hcn5091G2EOB5b//NplA28/9tAT4bq111jD64ZKHR2VQWPEbULI0aHqZz7NZeLNmSeVMOJu4AfGgNEGLsR/95YuetcRzprcFJvaaVxrpm2mmqfp8FxKSYk8ck+0pt1nykFp0A/k9Tnt/lq3T2dHEOmi2DxSu+EdAAFwcPqp640xe42h26Qa2hqnXsFVHs04pNFuYgvbtOWCmD3aMj2VNaLi1+jwyxgpCKOQRCdMN6ZMd5Bmw1cPfG+5O/7LeX0ECyBppx9Zrn0c6BbNHJNr4qhFYWtsJCWpSFUm3ntxips2bxe+p1BKIJQECpRbkCQ2wu0XzbnIeemvhzYCVNR6JMDm5bdNF9qcwhiKbpvMg2KujZDmUgX1jgqT719gy+iX6QxsPM9F2YqclHbRRpUEXmCRZTGFlZGKxSMbR6+uA0gu863OzLc7cVUZN6jgKI8kicl0ykzjAiW5lGrVAWUwokApSa3UTY/XR2B3UlDgVy1sB8od7tgt2++4AcACOHL+uRW2bW8QQiCxcUoS6XssyBbnF6Y5+8kci8vjlJwqjnQwWpDlgtRYZDpHmxJzWUyk26gOYXxK0g+8G4bXX/snC0DZcmVh9EoQ5DpDSIVJYmIiGvkCurAQpkLU9kkTEEJeCjxbURSCZgTkfVjOApoM6Qtc3109Nj7uWO9M70EbPQT4YMhNjrWQEdHmTPs8SgfUisUgDLoAgcGyEjJtEaeaVlKQ5gVSGYwBhETaEmVJcemQaZ44aRpvyLIEnedGoNHNkNTTeI5DT2kRljeJziVhnKNlE1GaJFfnuRi3SXMDxmA7IUqCI20qdifkxfED+/dlanzb1cYL3BFhsTXPU4Ep0FGKUVALegCb1oLN7FlNpd5HIUNQLYxIsO0EKcByWljuAmXbp7fcIwgVb7xyaNeep3YfUnt272PLjaP1em/lZqmEk4cJQoMKfBxVIcwjlAp47okX6ap3XaoP221CIREyx7La2E6O7/h0eTXK+Bw+8uHrP7znvocXLe6flwCHXj06kab5hJAS6dhQFOgiJ2qXsKLVuHqAgdVD7HrwXibPTKJzFyMMAgECHGXTJTqxE4t3T5xMD7y29+mFRjgpLSUlYJ793T9ORWF0Lk1StCzQNqTTAle30flbzJ/bx6n3Xsa2Fb9/5Eccfu19wnlNFBniWJA3JecbDfa/8y5nJg7bW7ZeuyYKZwyF0QIAkC988Ogzfof6SppapHGZqgNTExPsfngfgaXpqyWk9QF6lwWk7YJlK1fQaTysqk8sE6LwIq4OEMql1DH3/O03PnBHUCk3JMCeA7/q6u1a0ltiNZ1eL719cPrcWR752d+Yn2lx/HSDY40qY2Pb2PapjYxv3YBX1syZ88weP3bp90Omw3PMOxNUe9FTn9gn5uemQqfk5BbAisHBlVo7g7PFx9TdgDMnZvjtzheI51qkWY5xYWxTLxXfJ5IVevIZ6gMDxCYnPjWDXZ0nSiOkEmYqO5l8cGT6FSD6+NhRJMCF1sWV88VkX6f3n/FHd+xl9uwsrTDEOIbPfWEj120eorw0JEzLhGWfop3ixxKrP0CTIQSAEVmhw5/f94uXAANg3b/r+1YrnV1T86ucPDzBrp3PcvHcHGmaUekL+OKtm9m0ailOUEe4FrXyWaKFblM4HmUvElNzF4jTxFiOhRRSJO34JHCOy6RU0i60uepfx07nO+593FycapAkCbX+Kl+/cxvXfXYIU3GjN/Yf2vPPg2/9JVxoNYNqQ+hcilznlKWDcpSwlCWiZrtx/O3Tf+AKClj88I9v/9aD99/aHBkaLlYNDTXuvPubH/3kN3e9vP3bn78HGAP6gSXA6K3fufnOXz+/888vHH3i9O4XH3j1roe+8dDo1pGvAeuAClfa/+aTQH35Yztuenz7l4aPLB9c81O/3H3L5VHFlUACZaAH6AQc/pv1o9cEiwbWbRlev+mrazeOblg3usnj/6nWV2fVyFp71fCa0sDgkOKyq5av4H/xb0Ky8po5hQEuAAAAAElFTkSuQmCC"},{"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,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAGb0lEQVR4Xq3MS2xcVx3H8e855z7m3vH1jMdjO43zshIrtpM0SZ3WFEcRVFFKoRWPBYtAHwgWCFUsQN100QeCsqAhCESrirRASdWWIkoUqgKFJm3UZ5o2oW2akrR5uXbi2ON4PPfOfZ17iERW2bCAz1/f3V8/cfDC02UEj4OxKHjdFMUfmUzOlAeXZFZuuVIKN8zi1dPh7Hcn5091G2EOB5b//NplA28/9tAT4bq111jD64ZKHR2VQWPEbULI0aHqZz7NZeLNmSeVMOJu4AfGgNEGLsR/95YuetcRzprcFJvaaVxrpm2mmqfp8FxKSYk8ck+0pt1nykFp0A/k9Tnt/lq3T2dHEOmi2DxSu+EdAAFwcPqp640xe42h26Qa2hqnXsFVHs04pNFuYgvbtOWCmD3aMj2VNaLi1+jwyxgpCKOQRCdMN6ZMd5Bmw1cPfG+5O/7LeX0ECyBppx9Zrn0c6BbNHJNr4qhFYWtsJCWpSFUm3ntxips2bxe+p1BKIJQECpRbkCQ2wu0XzbnIeemvhzYCVNR6JMDm5bdNF9qcwhiKbpvMg2KujZDmUgX1jgqT719gy+iX6QxsPM9F2YqclHbRRpUEXmCRZTGFlZGKxSMbR6+uA0gu863OzLc7cVUZN6jgKI8kicl0ykzjAiW5lGrVAWUwokApSa3UTY/XR2B3UlDgVy1sB8od7tgt2++4AcACOHL+uRW2bW8QQiCxcUoS6XssyBbnF6Y5+8kci8vjlJwqjnQwWpDlgtRYZDpHmxJzWUyk26gOYXxK0g+8G4bXX/snC0DZcmVh9EoQ5DpDSIVJYmIiGvkCurAQpkLU9kkTEEJeCjxbURSCZgTkfVjOApoM6Qtc3109Nj7uWO9M70EbPQT4YMhNjrWQEdHmTPs8SgfUisUgDLoAgcGyEjJtEaeaVlKQ5gVSGYwBhETaEmVJcemQaZ44aRpvyLIEnedGoNHNkNTTeI5DT2kRljeJziVhnKNlE1GaJFfnuRi3SXMDxmA7IUqCI20qdifkxfED+/dlanzb1cYL3BFhsTXPU4Ep0FGKUVALegCb1oLN7FlNpd5HIUNQLYxIsO0EKcByWljuAmXbp7fcIwgVb7xyaNeep3YfUnt272PLjaP1em/lZqmEk4cJQoMKfBxVIcwjlAp47okX6ap3XaoP221CIREyx7La2E6O7/h0eTXK+Bw+8uHrP7znvocXLe6flwCHXj06kab5hJAS6dhQFOgiJ2qXsKLVuHqAgdVD7HrwXibPTKJzFyMMAgECHGXTJTqxE4t3T5xMD7y29+mFRjgpLSUlYJ793T9ORWF0Lk1StCzQNqTTAle30flbzJ/bx6n3Xsa2Fb9/5Eccfu19wnlNFBniWJA3JecbDfa/8y5nJg7bW7ZeuyYKZwyF0QIAkC988Ogzfof6SppapHGZqgNTExPsfngfgaXpqyWk9QF6lwWk7YJlK1fQaTysqk8sE6LwIq4OEMql1DH3/O03PnBHUCk3JMCeA7/q6u1a0ltiNZ1eL719cPrcWR752d+Yn2lx/HSDY40qY2Pb2PapjYxv3YBX1syZ88weP3bp90Omw3PMOxNUe9FTn9gn5uemQqfk5BbAisHBlVo7g7PFx9TdgDMnZvjtzheI51qkWY5xYWxTLxXfJ5IVevIZ6gMDxCYnPjWDXZ0nSiOkEmYqO5l8cGT6FSD6+NhRJMCF1sWV88VkX6f3n/FHd+xl9uwsrTDEOIbPfWEj120eorw0JEzLhGWfop3ixxKrP0CTIQSAEVmhw5/f94uXAANg3b/r+1YrnV1T86ucPDzBrp3PcvHcHGmaUekL+OKtm9m0ailOUEe4FrXyWaKFblM4HmUvElNzF4jTxFiOhRRSJO34JHCOy6RU0i60uepfx07nO+593FycapAkCbX+Kl+/cxvXfXYIU3GjN/Yf2vPPg2/9JVxoNYNqQ+hcilznlKWDcpSwlCWiZrtx/O3Tf+AKClj88I9v/9aD99/aHBkaLlYNDTXuvPubH/3kN3e9vP3bn78HGAP6gSXA6K3fufnOXz+/888vHH3i9O4XH3j1roe+8dDo1pGvAeuAClfa/+aTQH35Yztuenz7l4aPLB9c81O/3H3L5VHFlUACZaAH6AQc/pv1o9cEiwbWbRlev+mrazeOblg3usnj/6nWV2fVyFp71fCa0sDgkOKyq5av4H/xb0Ky8po5hQEuAAAAAElFTkSuQmCC","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":"https://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=Actueel_ortho25&STYLE=&FORMAT=image/jpeg&tileMatrixSet=OGC:1.0:GoogleMapsCompatible&tileMatrix={zoom}&tileRow={y}&tileCol={x}","scaleExtent":[0,19],"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,iVBORw0KGgoAAAANSUhEUgAAAGYAAABpCAMAAAD/V6aFAAABQVBMVEVHcEzFxcUIjtE3quLGxsYMlNMxseXFxcXFxcXGxsY3qeC82+c4qeA4quEcod3FxcXGxsbGxsbKysrHx8cGkdLGxsYPl9fExMTGxsbGxsbGxsYGjtDGxsYLlNXFxcXKysrGxsY3qeDFxcXGxsbFxcXGxsY3qeHGxsbIyMjGxsbGxsbFxcXFxcXFxcXGxsYBi883quHExMTGxsbGxsYgpdkYntoeqtXGxsYko93FxcXFxcUio97GxsYDjdAcn9rGxsbGxsbGxsYQmdjGxsYCjdAAis0IktM1qODGxsbHx8fGxsY3quHFxcUco93GxsbGxsbFxcUmotw3q+E4quE3quE3quACjtEKl9XGxsbFxcUZoNkBi883qeHGxsYAis44quEAic0AiM08rOIcnNk6q+IspN4Mk9QFj9EXmdclodzGxsbX17u1AAAAXnRSTlMA7d4ItK8KTHw//QHerC31nSgFHsszjQ5Bw23d6qMYFFmUZtVH78rkCTn4uIZUdvqAFKxPDUAEozao2iLQ5V39lLF/y+z+wd1he76y+hGNgC1uQO7BUNR6mYRR96TdoavfmwAABLhJREFUeF7s08Fqg0AQBuApCC0IBBtCYpBVbMQmNoF4CfGykV5aKKbXAn2B//0foOLspQF0xhQokO80/2l2WH66xnNx18vz6S+c0K+ha8TukQn62RWNFxzfeY2J0K96pLH2zSSf81hjwIHGevsG7nncYkhC45gDgNKdlWOA/Uo7MemsnwBkAYcGQtmcVJINWi8cZhZCR1JZWrSiKacSUkvSeEBnx2llIWQ/Vbegk8UcQ0i9asqTgJ05biF2Jrn1BJ2J0R6DKmzJGmSq371eWOgsSKK8+M4COrmoOimckHPwAR2PBPbRRQUaKKU0zK/hRHy72UDHTmmYqT1nx2tnhadz8ulfuLn5YazseRMEwjhuJDCIOhkXw8DiagchJkQGInZoHKxWk7Y5nkO09ft/gTb3Sjg4nt/4T7jf5XnhIlcR8SRzbUxaeO/XBFQCGxasd7QToLeyMBglvZZ4AUSw9VjyCcTCvTI1Z0TNciIAlydziwZ+ihZe+jUZVUekPNlbNPS3LEwQrXHVoblozdZas7KqmmU7rXstjm7N7sCSaW7TPO//yM4vOYiaJV9EADOfJUcgVoDK/ix9/NaQ5gQEQOzQh+hPOECTgdJkLPBnfRoQqzPa4DUBJZLImAD76ow9vEZP7yrhzVr11kxM2gTr0HfXgxa1t12jVucDr5mqu8MlZkkKLZbHrYao2eg7DEOkSh8Ke55c2zTPskZRI0VOgNYEMulqukl1SlAWb6s1884/GjyKDt4GKDY5UVxZEl9MjXhjTKojTjOnIKGpfNPAQNTMBLegzn4xVPBPDrNhk8XwddzOGbeg/trT+DxyPAOni/ivXfNbbRSIwvgpLCQiYIyIRmAT1hS1RCEJICmCgjdtKKmXe+ML+P4PsCmzG6Y96zczFO/yu3WGzxnPmTl/JCV37gTFXKb4m6e9zk2JQPWBp5cirfMHY1YoJOi+5MqOkHFrY5kXoLL8WsV4c4XMk6lK7QKZiI326QPPMZWJwafx+UtnojL8aCqzAFZWDYyjeJIYbdgVUIkuB04hvllsoJL4bueO79kclOFbA5mSEHkN5hwMZI4ECP9vs2fx9F1fxfGQX47YUiyc+UVfprWBSjIw5OLTVl/mAlT6QYYfA12NDDhZSLhIZRThAOuHAfBKOviJss5rx98ubGfwTQ+gZ2PSFdriY7EShrMDiyn12hmQx71wK3i1qLCjQUWmKqc6P9UyVmhhwrUYmI0NDH0C3LnjzTTZCicPjnhYh+NLNZbofyiim4IYZi2fnU733hm5ACrT0A5fbSti6AQryWm++9HXUhCRPquXzDnABWwCupJ20VlcBsq4Y0YM5aRyTzfC07+uUlcrD3KOpR01hGexI/ZI1/Nhk+cWjbBsoYqMbYm77TjWSkcpU24cnKYJCDMNl7NKaZR3YO8oA+T0Hu6EcnbqLi3D8YmDTyg2Qz3raUYQ7/NynLZtFzYpKT7vW50TgAdSDWkye5Z9bEMq1rKxvfmkS9DcwsEqIzUROC4BNrmXjxOyjn8FpEHagn9PMEEXht2S9NiyvGwaSmYAEyD9N3Zumma6BdkbyXH2NB2nm8xvmpB9L1WOJiRzWHI+CRHLbafh0l+p1Hb2B2WwRgDiX0fTAAAAAElFTkSuQmCC"},{"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":"https://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":"https://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":"https://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":"https://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":"https://{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":"https://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/cps/metadaten_portal.html?id=cd01c334-7e32-482f-bd43-af286707178a","terms_text":"Staatsbetrieb Geobasisinformation und Vermessung Sachsen","best":true,"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHIAAABVCAMAAACiqkDBAAAA51BMVEWxs7T////a29oAaUD+/f6tr7CusLH8/P3t7e67vb76+fr29fXP0NHq6urn5+fe3t/h4eHS0tPLzMz3+PjMz87z8/Lw8PDV1taqrK0Ab0UEcUe0trcnfFzX19cAYDbFxscbd1QSckzHy8rCw8S+wcG3uboAbEPl5OQMcUoGbEXj4+NWm4CkyryTqqGXwrLN49qdsalBj3FZi3hwmInc4N6zwLtNiXI2fmN8nJBDhGuIpJmJuqe31sp+s54zhmau0cTq9PDd7edwqpPk8exjo4vm6OepubNikX+vvLfX6eLB3NLz9vW9x8PQldiEAAAK6ElEQVR4Xr2Z53LjuBKFdcCcM5VzDs4554n7/s9zGxDplThcz1Rdec4PF8mi8KEDumGwgjKldgInZjI+QyXIqBpY2sETADf2/gaSBRae7lrS/P75VuO3n4yc2g5+7h9JnbV6zwfAov15SN32gYfljFjz5Wq17NOFtPwBVJ1PQVpBGzh47nHM/c0LEguPqyMB/Q4r2DlSZoGJl5t7KXOmyQxVNQJLvuXQ/g1g7xbpxTq01dGcRp8tHyK43UpNUZVaTRkmWPU6Umf5CBbtDukvgNt13I72X6CHlVqt0jS6cdt3UhN4XBKzdQDP2hkyivHEI9jiDvW6w7C9cCwNXLKlW+YU+5LU6f+AZ+7Oscx9XC5vNY6IZABm4ixYEA6NcVOJ5WYXt/0OZwa7Q6IKQHehL7xq3CVQRVVIqlqpqAbimqEdcOYB7B0hme1AD4zaEMMaBxFpU9ZCUQzzoE/xfATbDTIAQkrQylhuK5VfpCwsbqt8S/E8gp7sBImFgwHB1NRRS5AxDLWijLBPeXsDezdIWAxtGtbXmkXgOpiKINNakQ7g7QYJ2JhWajaGJWZWIl8RDv5JK+kIPv5QsqaZpgYuLTI1TS4gEUCvGAjKgukm6wvzgVy7wsdtRdOZTUs79L2pScJadGV5jA3DYdzWcySYZhmRW4a0ZYMbrwywpHqh+ShX4tlhmFeon08HPx5W+/s3d3c3N/ur1e2P748ahOx3JKZ6lFhlwRxhoAq2/p2ydr8kmk41DKYmAO3pdv95edTqzejNLUnSrHd/9Hr3Yqb/IuE6kEclwWxqTMkS6ZXM3K5BCYsDh8O+r+6W932pwJEK6PlPGxtIOA5spcRMXVezqD7Npc6Dlubv2+FCJtrB/ut9T8oxc7Jm+UzefLj9wXVLDr7hpvfpx3dY5MicaTV/NVNhWjNfL0uetLbAxS6Al4fno9w0qX+/vFv9ePopy7JpJbo79UkL16HWwGf2+NqZP/rYRmIq6yX5MwD3t0oN1D2QpPkLC2yOe9pftuYZrXf0vDoglunosPMiLZQV6+aYodV5RVBEgmFRcK2q1pqyXauMqYFWddx3OjcZLjNudv+8+h7B1L3QaKo1A91apURKSmvsIDWLSCBAoKxJfJ40O2MYBpqli6YmW/JNp3O/es1x/aO72xfIqTcwKuJ1SjZeqUvz/kjEpIgUzFGN+2E0sNlCX7dqGfqC2YPRWPUogd6tu7t9hOYEo6bKXZcrccuQCsWkcyvrZUjTtZizth9m6njVcDhua00RkfVcCSm1Xh9eAATcOLUwtlUp0ZgW2D3aKEPCAxJ9KoxqVkTwlSG6+bjmHXlz/7uGtG34kVqS3215XCl5+jijKsLKkQhg5HmWaSznxVfxnh4eYfpdcmaNXixBDkqbg3bT6UULlCNhWdNiNJL8ido19cCg2IlrMr6k2ZXUEyXUWlQG4v9C4pfZK9Pk/ZqiqhYGL9ZH/1dk8tCZv1jJfyIjq/AjJaD4lA3ulSDVVN+eMIWAZ90rYvwnEiG2O0q5C8t3LpubC762K+Oh7VtUtQ4w/QA5RZhNv5g/BX+XrQdFxIVgatMYVKeJDMi0Qo7A8AESrlMgWIsyZLXM37UhQoVM85wI4HUwNtgLlQFUP0SGKNaOtMyeEHl/zd1IfhwFSIRp6bQ6MJrcXOv73T4c7UMk983v17dqkD05TKWgxczhMGguC0fjvOoqXZD0GB8iFwi3kOoA5fuFdo0MaxrdwNcjzkoIZugWn8JGlvGemeJjZGpVlQ/X97rPNBM9ZG6iiZj53I3cspq35SPVyKL4MTLSCyuuafIHOYrbZbO3VLBSl8VDHrPcMsXeWlLKVNf+BJkWi4Gur104DKu+Y2WstqtlrE2vq8PN/bA6Row/stLfbtRj16x6TiI2jhb5MBR21cJCmmUQ2a+9b0FqVTP9E2RqspogjbrvjVq2eEvrUrze7VJH6BZWiUhd0+raVeZTzliRiQB/gvThthdkVPYvtd8ObQzUDFVWlUSKUuJ64kemGfn+dBqGth1Uu+4fIQPIWrLefKytqmWDF0UNgNPGXeZEsqZPgyC0A8/VI5Tp4+rTrWT+U98HL0Eqjq4YtqMh8eKYuR+Afu9YrbiFVp1CSxLerLjQoFdtL/p/D0ddvBXHVzyzWeQNHFjteLGT89gYgVJE2tslRTE8gNn6ro6AXdn4xYlil5fz1a4OJ3R2d+rchpuNXtqlVbWbwrM1YHdIhlAtPzIQLh3p8Nq7PehuQxeM0pRVxj4cG9gt0i0/pfAi7tMQmq1hx0gbYOWnFOPa2BVn3jtGppZW+r+T2oUxlE0b2DmSod1Oy2JpaDo8F7tHBkgrgdkscexYgw3sHkkNf1gbyIZa3OjUDCuy8QlI2UegqEMMCanm/XFsDEObQffxGcgAHvW/phzy8/zRwOYH+pHY4cNPAWe0d7139ofxPP2yd304MMGlvb29pRCy3t6cyibRGRvdsC2n2d7DTPSpF4QjD7YG96Rf55p9Zfit2PlMvHzxBSS/1++3dHAd0tW/SCZD4yRNNl2/bXdH2flNrYoqEPfqkjSp0596/x/8RnG/zt+d0J89bjH/1Qm49upS/x3paKbH7MHQqOjO5iG7yhACpz36/ez85JjIk/4pPlTUopcvTr5ecNQAOG1IktRgGbKXI1NHM9Ykxbc289WDDeC8LtWvGADnmK6+5vmmYUNafvcPvXIt3NiQ6scZsn5eQEYeRvkZRFtrbhKrAGKyrZWCS2s1GjN+meydt1oXl5nFzvUVv8tNmSWAmGm9FwnkRKqfbSGTtjxUtk7w82qONkiXNO9DrDXY2zsk5OlFfUKq98+EYb313exwPe5c5A2mg9jWOHJ+TnM2N5Ee/FrJ/+lEDMB1NZFmLjZlUaDqfRFhBlRnE7rr89h9IT7PtKvrQQohQpKJV5RKGbLwL2X+0UAQGaqZMydijojYWiYOiXipW2d9iqwIdWPP0b/1pEkvgXm1zu7e+d4iR/5jE8zZROqms3G0xJSM2M5M6k0mFyBVG3OumU+Q9ZPr+qRn+o1sEXyhiXwD9K8NWiESd/uJlVmJ4zq9s4GEjYGSM6OFwoliPQqZ3EoNQMAjRgnvgz85IZ1PpLl7RqQYpLRPtou5XV9QMeCvHufI09mk4R9uIDXH2j66UQIEyHUxkfo6ANYi0TgLjUexQaqTGA00Fy6kx+8raHF2KRZmNUNSDk6ON5FgqOarxI3EzjXGu77WKRrCXlP7Vs+tPM7kcORpjjwBG8QM4vaaZ3qOTHuT+ZW0gUSAsZplDW06QgyQS8RocgXk2UvIC25OLu7YM2HZjBeB40a9BaGE7vdyJE+5yRZSzz/NKAQfFj5OkB/rJwkAjZao1DjFCaVNyoc5P/9q6TOakQzQU17hyLbJISAgHJYjZYrPFhL5Ry8lRBsMW/rGo9I6ub7kBYAjqw0qo98G141644qjiHl4yIshof2ZJFHYvuxRbvGJ5UgMGgWk7CcCqY6AAAVdi75ASVi/OJ8QEpcNfk+MHt2kF1nrkPoMwJ5EzDqJUuwbcqTIiW0kFrDF6hiVfer+0qoLXb0dNjgS1+v+ec4AvhJFg5ws/XVwW521LkYAPKkjEZnk8y/Mm0i05SYZOTZdq6wlnV0eH5+cAfogjkByv1xeHtrI5B1u3pkxfWO7WVVlcXPKWAIhl7HTLWRq+vwEydXxmdpCwoah6pqLv4jEQndNH38V6UFu4+8iUa3is/U/e1Y2pAhuIKYAAAAASUVORK5CYII="},{"id":"Geodatastyrelsen_Denmark","name":"SDFE aerial imagery","type":"tms","template":"https://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":"https://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":"SIGIP-2012","name":"SIGIP - Orthophoto 2012","type":"tms","template":"http://osmdata.asitvd.ch/tiles/sigip2012/{zoom}/{x}/{y}.png","endDate":"2012-01-01T00:00:00.000Z","startDate":"2012-01-01T00:00:00.000Z","scaleExtent":[14,20],"polygon":[[[6.7105672,46.5439641],[6.729684,46.5440781],[6.7299491,46.52605],[6.7108488,46.5259588],[6.7111304,46.507959],[6.6921958,46.5078792],[6.6922952,46.4988257],[6.6353092,46.4984722],[6.6348785,46.5254687],[6.6538131,46.5255827],[6.6536143,46.5435767],[6.6916326,46.5438388],[6.6915498,46.5528392],[6.7104678,46.5529304],[6.7105672,46.5439641]]],"terms_url":"https://www.sigip.ch/","terms_text":"SIGIP"},{"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]]],"icon":"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{"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","endDate":"2017-03-01T00:00:00.000Z","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":"https://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":"https://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":"https://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":"https://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":"https://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":"https://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":"https://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":"https://geoservices.buergernetz.bz.it/geokatalog","terms_text":"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano","description":"Topographical basemap of South Tyrol"},{"id":"SPW_ORTHO_LAST","name":"SPW(allonie) most recent aerial imagery","type":"wms","template":"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_LAST/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","polygon":[[[5.782568,49.8757267],[5.7391911,49.8336163],[5.7551556,49.7914562],[5.7883892,49.7966518],[5.9106426,49.662495],[5.8485737,49.597233],[5.871023,49.575993],[5.8185749,49.546381],[5.6607946,49.5536224],[5.6110847,49.5060265],[5.5560285,49.5292773],[5.4705116,49.4973681],[5.4570817,49.5670264],[5.3752213,49.623328],[5.3148607,49.6113701],[5.3324268,49.652632],[5.2685113,49.6965705],[5.1662837,49.6930304],[4.9975274,49.8000556],[4.8516407,49.7934458],[4.8475425,49.8680607],[4.8901307,49.9089349],[4.7911711,49.9580026],[4.877619,50.1537353],[4.8241825,50.1693225],[4.702074,50.095559],[4.69441,49.99625],[4.4455089,49.9372154],[4.3058943,49.968291],[4.1974552,49.9545998],[4.1351961,50.0150789],[4.2282482,50.0784208],[4.1968236,50.1351948],[4.1271392,50.1354991],[4.2052006,50.2734708],[4.162616,50.288955],[4.1353769,50.2578391],[4.0279494,50.3584006],[3.8857376,50.3270105],[3.8457828,50.3532303],[3.7454573,50.3500535],[3.709936,50.3031647],[3.6575582,50.3707552],[3.6555197,50.4616979],[3.6058552,50.4963203],[3.4993012,50.4892129],[3.5199234,50.523617],[3.4743888,50.5336789],[3.3769762,50.4910892],[3.286341,50.527929],[3.2610378,50.701309],[3.2060223,50.7113874],[3.1783878,50.7560872],[3.3056195,50.7546601],[3.3607746,50.7096189],[3.4543934,50.7707186],[3.6404725,50.7224166],[3.6775202,50.7706219],[3.7585743,50.7804497],[3.775681,50.7478928],[3.8797992,50.7514597],[3.9097026,50.6924497],[4.0586751,50.6943943],[4.1485268,50.7283384],[4.2466962,50.6893987],[4.4635478,50.7551115],[4.5239937,50.727241],[4.5972705,50.7635892],[4.6344534,50.7427181],[4.6430927,50.7975547],[4.760139,50.805435],[4.9254489,50.7427456],[5.0033909,50.7659375],[5.0703857,50.7064861],[5.1650784,50.6956986],[5.1698412,50.7225686],[5.309122,50.718017],[5.3502927,50.7462892],[5.478628,50.7235185],[5.6878623,50.811926],[5.6822533,50.7565056],[5.7707041,50.7513196],[5.8196276,50.7139556],[5.8833347,50.7099174],[5.8921739,50.7551846],[5.9656121,50.7610724],[6.0404534,50.7454613],[6.0395852,50.7183326],[6.1106615,50.7229851],[6.181693,50.6238292],[6.2695342,50.625191],[6.1781215,50.5415344],[6.2265784,50.4943237],[6.3503613,50.4885444],[6.3429763,50.3803321],[6.4054213,50.3233149],[6.3064697,50.3201903],[6.278891,50.2673359],[6.1737675,50.2316471],[6.1923212,50.1820338],[6.1469988,50.1777493],[6.1377905,50.1298537],[6.1024494,50.17055],[5.9636784,50.172634],[5.9613323,50.131363],[5.8953156,50.1121618],[5.819685,50.013287],[5.835779,49.97892],[5.7750225,49.9608],[5.7357693,49.89684],[5.782568,49.8757267]]],"best":true,"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAACX0lEQVQ4y32TS09TURSFv3Pu7e2Dl7wqISCiAUNIlBjUhIkzhvqnTJw4cuZPcGSiDERRQkTEhIgSwISqaNNQW8pT6H2f7aAKLYmu4c7Od9beZ20lIvc5KyMgAkqBVvxLxWLxuxIRqS9KEBLmNol+FHBGh7EH+urABuP66HQStGZlZWVen6VGm3kO7j2k+vgZcalyCvZ9gvUc/rslzHH1pN4AkCjG7B+CViRGh0mMDEFsiLd38F4vcPjgEdGXPNR5tuvtxVslvMUP4AXEhZ+I5xMWilSfvsB/u4Rua0XCgHh7B92UaXQgro87NYP7ZBqJY6y+HsR1qU7N4E7PIcaQuD6Kle0i/JxDgqARYKou7qt5CAJUOgXG4C8uE2+V0C3NqEwas72L7u7AynaB1o0jKK3Qba2Y8g7RZh5TrqCz66fDhhHheo54q0T6ziTO1ZFGB6q5iczdSVRTGjl2kTDCHBwRb5UQz8fs7mF294m+5XGfzyJVt86BCOIHODeukfp6G292Ad3Zjk4liQtF7CuXwAjh+gbYNqZcQaLoFODNLWJ+HWEOj7CynSjA7O1DOg2OQ2JoEN3Zjqm6qKQDYYiyrFOAfbEflMIcH6MzaXRrC3G5QrD0CX2uDd3bQ/B+GeUkIIpr+Ug6dYALvbXcGwEFVk+WuLyD1XseqyeLPdiPti3MUZXg4xrJiXFUKlW3gz9fglU7HJVKYlwP3ZTBGR1GOQ7OzbFaS3cHicsDKNs6k8S/edg/xH35hnBtA+fW2J+rBKuzvfbWxDgqkTjpVyKydxYivo94Abqthf9pdXV18TfYtyESB1ygiAAAAABJRU5ErkJggg=="},{"id":"SPW_PICC","name":"SPW(allonie) PICC numerical imagery","type":"wms","template":"https://geoservices.wallonie.be/arcgis/services/TOPOGRAPHIE/PICC_VDIFF/MapServer/WmsServer?SERVICE=WMS&VERSION=1.1.1&FORMAT=image/png8&TRANSPARENT=TRUE&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&LAYERS=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29","projection":"EPSG:3857","polygon":[[[5.782568,49.8757267],[5.7391911,49.8336163],[5.7551556,49.7914562],[5.7883892,49.7966518],[5.9106426,49.662495],[5.8485737,49.597233],[5.871023,49.575993],[5.8185749,49.546381],[5.6607946,49.5536224],[5.6110847,49.5060265],[5.5560285,49.5292773],[5.4705116,49.4973681],[5.4570817,49.5670264],[5.3752213,49.623328],[5.3148607,49.6113701],[5.3324268,49.652632],[5.2685113,49.6965705],[5.1662837,49.6930304],[4.9975274,49.8000556],[4.8516407,49.7934458],[4.8475425,49.8680607],[4.8901307,49.9089349],[4.7911711,49.9580026],[4.877619,50.1537353],[4.8241825,50.1693225],[4.702074,50.095559],[4.69441,49.99625],[4.4455089,49.9372154],[4.3058943,49.968291],[4.1974552,49.9545998],[4.1351961,50.0150789],[4.2282482,50.0784208],[4.1968236,50.1351948],[4.1271392,50.1354991],[4.2052006,50.2734708],[4.162616,50.288955],[4.1353769,50.2578391],[4.0279494,50.3584006],[3.8857376,50.3270105],[3.8457828,50.3532303],[3.7454573,50.3500535],[3.709936,50.3031647],[3.6575582,50.3707552],[3.6555197,50.4616979],[3.6058552,50.4963203],[3.4993012,50.4892129],[3.5199234,50.523617],[3.4743888,50.5336789],[3.3769762,50.4910892],[3.286341,50.527929],[3.2610378,50.701309],[3.2060223,50.7113874],[3.1783878,50.7560872],[3.3056195,50.7546601],[3.3607746,50.7096189],[3.4543934,50.7707186],[3.6404725,50.7224166],[3.6775202,50.7706219],[3.7585743,50.7804497],[3.775681,50.7478928],[3.8797992,50.7514597],[3.9097026,50.6924497],[4.0586751,50.6943943],[4.1485268,50.7283384],[4.2466962,50.6893987],[4.4635478,50.7551115],[4.5239937,50.727241],[4.5972705,50.7635892],[4.6344534,50.7427181],[4.6430927,50.7975547],[4.760139,50.805435],[4.9254489,50.7427456],[5.0033909,50.7659375],[5.0703857,50.7064861],[5.1650784,50.6956986],[5.1698412,50.7225686],[5.309122,50.718017],[5.3502927,50.7462892],[5.478628,50.7235185],[5.6878623,50.811926],[5.6822533,50.7565056],[5.7707041,50.7513196],[5.8196276,50.7139556],[5.8833347,50.7099174],[5.8921739,50.7551846],[5.9656121,50.7610724],[6.0404534,50.7454613],[6.0395852,50.7183326],[6.1106615,50.7229851],[6.181693,50.6238292],[6.2695342,50.625191],[6.1781215,50.5415344],[6.2265784,50.4943237],[6.3503613,50.4885444],[6.3429763,50.3803321],[6.4054213,50.3233149],[6.3064697,50.3201903],[6.278891,50.2673359],[6.1737675,50.2316471],[6.1923212,50.1820338],[6.1469988,50.1777493],[6.1377905,50.1298537],[6.1024494,50.17055],[5.9636784,50.172634],[5.9613323,50.131363],[5.8953156,50.1121618],[5.819685,50.013287],[5.835779,49.97892],[5.7750225,49.9608],[5.7357693,49.89684],[5.782568,49.8757267]]],"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAACX0lEQVQ4y32TS09TURSFv3Pu7e2Dl7wqISCiAUNIlBjUhIkzhvqnTJw4cuZPcGSiDERRQkTEhIgSwISqaNNQW8pT6H2f7aAKLYmu4c7Od9beZ20lIvc5KyMgAkqBVvxLxWLxuxIRqS9KEBLmNol+FHBGh7EH+urABuP66HQStGZlZWVen6VGm3kO7j2k+vgZcalyCvZ9gvUc/rslzHH1pN4AkCjG7B+CViRGh0mMDEFsiLd38F4vcPjgEdGXPNR5tuvtxVslvMUP4AXEhZ+I5xMWilSfvsB/u4Rua0XCgHh7B92UaXQgro87NYP7ZBqJY6y+HsR1qU7N4E7PIcaQuD6Kle0i/JxDgqARYKou7qt5CAJUOgXG4C8uE2+V0C3NqEwas72L7u7AynaB1o0jKK3Qba2Y8g7RZh5TrqCz66fDhhHheo54q0T6ziTO1ZFGB6q5iczdSVRTGjl2kTDCHBwRb5UQz8fs7mF294m+5XGfzyJVt86BCOIHODeukfp6G292Ad3Zjk4liQtF7CuXwAjh+gbYNqZcQaLoFODNLWJ+HWEOj7CynSjA7O1DOg2OQ2JoEN3Zjqm6qKQDYYiyrFOAfbEflMIcH6MzaXRrC3G5QrD0CX2uDd3bQ/B+GeUkIIpr+Ug6dYALvbXcGwEFVk+WuLyD1XseqyeLPdiPti3MUZXg4xrJiXFUKlW3gz9fglU7HJVKYlwP3ZTBGR1GOQ7OzbFaS3cHicsDKNs6k8S/edg/xH35hnBtA+fW2J+rBKuzvfbWxDgqkTjpVyKydxYivo94Abqthf9pdXV18TfYtyESB1ygiAAAAABJRU5ErkJggg=="},{"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":"Bern-2012","name":"Stadt Bern 10cm/25cm (2012)","type":"tms","template":"https://mapproxy.osm.ch/tiles/bern2012/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2012-01-01T00:00:00.000Z","startDate":"2012-01-01T00:00:00.000Z","scaleExtent":[14,19],"polygon":[[[7.3807026,47.0095236],[7.3807316,47.0230089],[7.4385298,47.0230287],[7.438646,47.0140785],[7.4517449,47.0139993],[7.4517159,47.0050278],[7.5411091,47.0050049],[7.5411091,46.9987259],[7.5437812,46.9987061],[7.5437522,46.9869583],[7.5568221,46.9869979],[7.5568511,46.9600256],[7.517438,46.9600058],[7.517438,46.9510847],[7.530508,46.9510649],[7.530508,46.9240745],[7.517409,46.9240547],[7.5173799,46.9150482],[7.5304208,46.9150681],[7.5304789,46.9060998],[7.5435779,46.9060204],[7.5435779,46.879047],[7.5565897,46.8790272],[7.5566188,46.8610969],[7.5434908,46.8610373],[7.5434036,46.8521196],[7.4909496,46.8521196],[7.4910658,46.8790669],[7.4779378,46.8790867],[7.4779668,46.8970705],[7.4516817,46.89713],[7.4517107,46.8880794],[7.4385537,46.8881389],[7.4385827,46.8701521],[7.4123267,46.8701521],[7.4123557,46.8790669],[7.3991696,46.8791066],[7.3991986,46.8610771],[7.3861287,46.8611366],[7.3860996,46.8521792],[7.3730007,46.8521594],[7.3730297,46.8611168],[7.3467736,46.8610969],[7.3468027,46.8880794],[7.2548774,46.8879603],[7.2548484,46.9059609],[7.2417204,46.9059212],[7.2416913,46.9149689],[7.2285633,46.9149292],[7.2283309,46.968866],[7.241459,46.9689056],[7.241488,46.986879],[7.267686,46.9869385],[7.2677731,46.9959328],[7.280785,46.9959526],[7.2809011,47.0094017],[7.3807026,47.0095236]]],"terms_text":"Orthophoto 2012, Vermessungsamt Stadt Bern"},{"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.5668111,47.3471283],[8.5666467,47.3470589],[8.5656321,47.3468387],[8.5657508,47.3466611],[8.5650859,47.3464458],[8.5420654,47.335018],[8.5407269,47.33376],[8.5403004,47.3339594],[8.5401928,47.3337202],[8.5404179,47.3335811],[8.5387962,47.3320825],[8.5364195,47.3307603],[8.5362197,47.330181],[8.5334539,47.3299212],[8.531799,47.3295046],[8.5314456,47.3284586],[8.5310233,47.3278882],[8.5297377,47.3277665],[8.5296889,47.3268657],[8.5289898,47.3269813],[8.5281278,47.3268508],[8.5280161,47.326347],[8.5275512,47.326391],[8.5276207,47.3261573],[8.5257896,47.3261908],[8.5256309,47.3257466],[8.5242553,47.3260813],[8.5241954,47.3248577],[8.5237181,47.3241621],[8.5230402,47.324334],[8.5219346,47.324356],[8.5219412,47.3239408],[8.5193166,47.3240091],[8.5186809,47.3238608],[8.5176785,47.3232],[8.5164185,47.3230802],[8.5156026,47.323154],[8.5147161,47.3227179],[8.5129492,47.3228951],[8.5116154,47.3222153],[8.509571,47.3220243],[8.5095034,47.3216488],[8.507877,47.3220315],[8.5073479,47.3217255],[8.5052926,47.3214351],[8.5047572,47.3212089],[8.5042993,47.3207416],[8.5031718,47.3202203],[8.5024105,47.3205283],[8.5022699,47.3208152],[8.5015158,47.3212901],[8.501024,47.3219795],[8.5009469,47.3225865],[8.5006025,47.3227848],[8.5007766,47.3237009],[8.5006647,47.3245121],[8.5009845,47.3259513],[8.5014986,47.3265046],[8.5015885,47.3273247],[8.5018842,47.3276454],[8.5013155,47.3288302],[8.5014041,47.3290265],[8.5006933,47.3297924],[8.5008734,47.3305262],[8.5006341,47.331099],[8.5011206,47.331827],[8.5007541,47.3320224],[8.5007833,47.3322389],[8.501057,47.3325984],[8.5019093,47.3330317],[8.5022042,47.3336379],[8.5017738,47.3341153],[8.5015204,47.3350444],[8.5019867,47.3366635],[8.5016086,47.3372789],[8.4987707,47.3396841],[8.4980764,47.3416944],[8.4970198,47.3424735],[8.4970857,47.3432619],[8.4979848,47.3436505],[8.4980964,47.3438702],[8.4981724,47.344534],[8.4977274,47.3452067],[8.4963629,47.3464829],[8.4951043,47.3469117],[8.4946719,47.3476034],[8.4928519,47.3482813],[8.4920593,47.3495035],[8.4914526,47.3496428],[8.4912761,47.3498347],[8.4908881,47.3506717],[8.4899998,47.350561],[8.4881311,47.3520013],[8.4869145,47.3520286],[8.4867952,47.3521995],[8.487275,47.3531092],[8.4871041,47.3534045],[8.4850065,47.354685],[8.4846252,47.3553616],[8.4846332,47.3567046],[8.4842574,47.3573654],[8.4832095,47.3581364],[8.4827226,47.359069],[8.482051,47.3595414],[8.4787857,47.3607802],[8.4769778,47.3602866],[8.4736491,47.3608106],[8.4727546,47.3607904],[8.4716901,47.3613176],[8.4705346,47.3616581],[8.4695072,47.3643825],[8.4663995,47.3657414],[8.4658262,47.3660986],[8.4654459,47.3666433],[8.4648499,47.3668079],[8.4642685,47.3672756],[8.4641765,47.3683804],[8.4649008,47.3689692],[8.4648229,47.3691129],[8.4693766,47.3713625],[8.4704197,47.3726],[8.4702245,47.3739521],[8.4686834,47.3738244],[8.4676081,47.3735734],[8.4654386,47.3744359],[8.4628786,47.3760325],[8.4599477,47.3775009],[8.4563798,47.3780073],[8.4511626,47.3781669],[8.450468,47.3783562],[8.4484713,47.3796659],[8.4480061,47.3802489],[8.4517428,47.3806206],[8.4537073,47.3802686],[8.4561412,47.380724],[8.4566891,47.3809395],[8.4567289,47.3824423],[8.4574491,47.382223],[8.45843,47.3823124],[8.4584128,47.382629],[8.4574537,47.3832487],[8.4576694,47.3834003],[8.4575551,47.383711],[8.4580689,47.3838786],[8.4600363,47.3859448],[8.4608754,47.3870442],[8.4612122,47.3879517],[8.4610423,47.3880298],[8.4638065,47.3905272],[8.4651812,47.3913239],[8.4655595,47.391131],[8.4661769,47.3911292],[8.4672656,47.390651],[8.4669717,47.3913069],[8.4673863,47.3929013],[8.4671019,47.3933421],[8.4660703,47.3937826],[8.4651015,47.3945286],[8.4648352,47.3948101],[8.4648837,47.3950816],[8.4653518,47.3949215],[8.4685392,47.3946073],[8.4701785,47.3940058],[8.470658,47.3943936],[8.4719132,47.393883],[8.472083,47.3940755],[8.4715234,47.3943033],[8.4715138,47.3949048],[8.4721035,47.3951669],[8.4730103,47.395064],[8.4734874,47.395996],[8.4651584,47.3982885],[8.4656768,47.3992174],[8.4675918,47.3987253],[8.4680605,47.3995665],[8.4661462,47.4000583],[8.4677017,47.4030001],[8.469902,47.4029831],[8.4755054,47.4038106],[8.4781488,47.4038749],[8.4781852,47.4050811],[8.477377,47.4051652],[8.4770538,47.4061941],[8.4772873,47.4091391],[8.4770261,47.409346],[8.4754317,47.4097053],[8.4758308,47.4107688],[8.4760457,47.4107168],[8.4762788,47.4110248],[8.476647,47.4109692],[8.4772491,47.4119382],[8.4748799,47.4124136],[8.4739359,47.4122221],[8.4730251,47.4114574],[8.4726814,47.4105829],[8.4710092,47.410936],[8.4711262,47.4113682],[8.4708503,47.411673],[8.4704419,47.4115928],[8.4703081,47.4125332],[8.468756,47.4122482],[8.4680053,47.4133401],[8.4686294,47.4136261],[8.4685663,47.41408],[8.4695518,47.4148391],[8.4700718,47.4155748],[8.4691344,47.4164893],[8.4691307,47.4169272],[8.4696238,47.4175244],[8.4715827,47.4176266],[8.4772018,47.4197449],[8.476879,47.4201593],[8.4778286,47.4221154],[8.4789517,47.421719],[8.4793669,47.4211341],[8.4797181,47.4214068],[8.4813104,47.4213424],[8.4817052,47.4230025],[8.482943,47.4226558],[8.4829177,47.4222244],[8.4860915,47.4215542],[8.4865761,47.4216425],[8.4868251,47.4218645],[8.4879635,47.422007],[8.4885143,47.4227084],[8.4901866,47.422336],[8.4910036,47.4238991],[8.4900591,47.4243496],[8.4900673,47.4253189],[8.4902716,47.4253614],[8.4901707,47.4257799],[8.4855191,47.4271201],[8.4848149,47.4278437],[8.484661,47.4287321],[8.484374,47.4289619],[8.4844472,47.4297912],[8.4857915,47.4310272],[8.4956173,47.4328128],[8.5002701,47.4344188],[8.5020653,47.4346662],[8.5036443,47.4340188],[8.5099683,47.4321273],[8.511553,47.4311636],[8.5127365,47.4308478],[8.5160014,47.4317438],[8.5162812,47.4317546],[8.5168051,47.4313321],[8.5187218,47.4318959],[8.5197943,47.4316717],[8.5246261,47.4312581],[8.5254902,47.4331566],[8.530298,47.4320655],[8.5306331,47.4326579],[8.5329988,47.4322774],[8.5337386,47.4325107],[8.5346736,47.4320017],[8.5352098,47.4318797],[8.5360609,47.4318653],[8.5373954,47.4314002],[8.5396428,47.4312601],[8.5401002,47.4310967],[8.5403303,47.4318604],[8.5436264,47.4314336],[8.5428445,47.4328905],[8.5431082,47.4328844],[8.544514,47.4325009],[8.5445856,47.4326166],[8.5460691,47.4320661],[8.5485802,47.4314175],[8.5500937,47.4312832],[8.5509806,47.4310231],[8.5519893,47.4310397],[8.5553504,47.4306622],[8.5560951,47.4280349],[8.5568396,47.4262384],[8.55783,47.4255398],[8.5569735,47.4249035],[8.5573584,47.4247214],[8.5568974,47.4242429],[8.5572272,47.4240966],[8.5541907,47.4208018],[8.5608195,47.4181748],[8.561289,47.4182869],[8.5623451,47.4163214],[8.5628176,47.4164324],[8.563234,47.4156476],[8.5662171,47.4163247],[8.5669231,47.4162865],[8.5673498,47.4164917],[8.5677986,47.4168445],[8.5687459,47.4185542],[8.569026,47.4187096],[8.5696006,47.4186847],[8.5694428,47.419261],[8.5722349,47.418926],[8.5736749,47.4200362],[8.5737831,47.4177981],[8.5734215,47.4171079],[8.5738627,47.4143784],[8.5738407,47.413238],[8.5733137,47.412573],[8.5726014,47.4120663],[8.5730014,47.4114383],[8.588059,47.4079651],[8.5889421,47.4075631],[8.5931154,47.407037],[8.5972792,47.4063087],[8.5972211,47.4059985],[8.5960793,47.4061173],[8.5937779,47.4022219],[8.5962176,47.401545],[8.5947962,47.3991811],[8.5972473,47.3985052],[8.5964397,47.3971511],[8.59637,47.3966323],[8.5962288,47.396464],[8.5945296,47.3971222],[8.593922,47.3964721],[8.5933487,47.3961397],[8.5920771,47.3969078],[8.5917242,47.3968079],[8.5914817,47.3970043],[8.5882815,47.3957975],[8.5890452,47.3950147],[8.5899492,47.3947762],[8.5881766,47.3935057],[8.5875246,47.3932129],[8.587475,47.3929744],[8.5861851,47.3928018],[8.5844165,47.3919525],[8.5836927,47.3900815],[8.5830501,47.3890474],[8.5831589,47.3883067],[8.5843702,47.3883357],[8.5843205,47.3889438],[8.5849231,47.3901089],[8.5852817,47.3903966],[8.5869601,47.3901709],[8.5869046,47.3897666],[8.5876488,47.3890534],[8.5869806,47.3879297],[8.5918104,47.3863782],[8.593073,47.3856494],[8.592992,47.3852339],[8.5935437,47.3852243],[8.5927356,47.3841724],[8.5908184,47.3847588],[8.5901259,47.3838085],[8.5896628,47.3840002],[8.5895613,47.3837317],[8.5921739,47.3831089],[8.5915089,47.3824415],[8.5938377,47.3808057],[8.5940703,47.3806061],[8.594061,47.3802938],[8.5955564,47.3796016],[8.5957448,47.3792746],[8.5972137,47.3784921],[8.5967415,47.3778177],[8.5970154,47.3771596],[8.597603,47.3766059],[8.5970488,47.3758905],[8.5977803,47.3755719],[8.5982825,47.3751014],[8.5985539,47.3747325],[8.5981292,47.3744671],[8.6001968,47.3733058],[8.6005273,47.3733996],[8.6009592,47.3731167],[8.6019393,47.3719822],[8.6019219,47.3717081],[8.603242,47.3713075],[8.6060745,47.3687057],[8.6074459,47.3681634],[8.6081229,47.3676128],[8.6106703,47.3673011],[8.6120019,47.3668439],[8.6130802,47.3677649],[8.6134447,47.3677929],[8.6136622,47.3680183],[8.6154945,47.3676953],[8.6164504,47.3684073],[8.6166519,47.3682801],[8.6176364,47.3668139],[8.6170927,47.366262],[8.6168236,47.3653459],[8.6156472,47.3646551],[8.6149501,47.3645812],[8.6155747,47.3634184],[8.6156558,47.3627274],[8.6148226,47.3626311],[8.6147042,47.3615093],[8.6192928,47.3612135],[8.6199562,47.3610355],[8.621739,47.3600705],[8.6225674,47.3598279],[8.621867,47.359461],[8.6213253,47.3574642],[8.6235083,47.3559235],[8.6235234,47.3556101],[8.6254413,47.3546647],[8.6241604,47.3539731],[8.6224493,47.353642],[8.6220945,47.3533419],[8.6198851,47.3536666],[8.6197589,47.3538473],[8.6184445,47.3538175],[8.6183902,47.3542504],[8.6170817,47.3541374],[8.615692,47.3544171],[8.6151975,47.3540998],[8.6138646,47.354021],[8.6125506,47.3543659],[8.6115607,47.3539441],[8.6110679,47.3535189],[8.61042,47.3533705],[8.6094622,47.3535153],[8.6077634,47.3533282],[8.6060686,47.3536266],[8.6050568,47.3535889],[8.6038033,47.3530049],[8.6030474,47.3521873],[8.6032016,47.352067],[8.6029426,47.351746],[8.6029967,47.3507596],[8.6026189,47.3507265],[8.6015997,47.3507282],[8.6010406,47.3510465],[8.6002591,47.3511159],[8.5996004,47.3514537],[8.598587,47.3514482],[8.5982352,47.3516535],[8.5968895,47.3514023],[8.5966563,47.3516127],[8.5959601,47.3516878],[8.5956408,47.3518987],[8.5949397,47.3516079],[8.5945418,47.3517493],[8.593904,47.3516089],[8.5935014,47.3521137],[8.5922913,47.3522969],[8.5918944,47.352783],[8.5911785,47.3532073],[8.5904654,47.3527123],[8.5901367,47.3528627],[8.588465,47.3528852],[8.5879686,47.3530689],[8.5874757,47.3526742],[8.5862951,47.352882],[8.5859056,47.3523073],[8.5852978,47.3520138],[8.5846216,47.3514145],[8.5841673,47.3512938],[8.5843773,47.3511598],[8.5839844,47.3508453],[8.5834761,47.3510422],[8.5833497,47.3508713],[8.5822061,47.3510081],[8.5824578,47.3506167],[8.5785111,47.3487299],[8.5782687,47.348882],[8.5778611,47.3486537],[8.5768553,47.3487802],[8.5768835,47.3485916],[8.5762504,47.3483856],[8.5730847,47.3475144],[8.5729991,47.3476488],[8.5721406,47.3474411],[8.5716326,47.3472757],[8.5716985,47.3471159],[8.5702906,47.3467217],[8.569681,47.3475973],[8.5674102,47.346736],[8.5668111,47.3471283]]],"terms_text":"Stadt Zürich Open Government Data"},{"id":"stamen-terrain-background","name":"Stamen Terrain","type":"tms","template":"https://stamen-tiles-{switch:a,b,c,d}.a.ssl.fastly.net/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. Data by OpenStreetMap, under ODbL"},{"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":"https://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,iVBORw0KGgoAAAANSUhEUgAAAD4AAABLCAMAAAAf8MQEAAAAAXNSR0IArs4c6QAAAt9QTFRF////q6ytVFplAAAB0owMmWYJRS4EZWx3o6OjYmNl7JoE/agGdE0GBgUA9aQOzIkMKhwCFA0BJBQBNBUAdHV15OXpUlVYGhECkWEJ5ZkOsXYKbkoH/64Qu30LgVYImpqbSTEEa0gG8qIOVTkFEgwBHhQCqnEKMSEE/80So20Kck0HCQYB/7IOMzM0uru+Q0tYRCQA/8ER/9oT/+EUlGMJflUI3ZQN/7kQ/60PaUYGZUMG/7EQ/8oSJhkCil0IOiYDMB8CfH1+yYYM4pcOiFsI2ZIN1Y4N/8URIRYCi4uLa3B5NSQD/74RzooM7qAO/7YQ6+vsiloD+6gP/aoP6p0OrnQLnWkKm2kJWz0FUjYFMSED/9QTjV4JdHZ69ff77J4ODAkBX0AGAAEL+fr7S1BVBQIAtXkLhVkIPikExIMMTjUEFhYXysrLxcXF+qcPwYEM1pENHSIqPSkDLR4Dck0I/qoQRzAEe1MH/+gVWzQAg4SFJCQlelIIDgkBYUEGQiwESElLLSADSi0B/9ESDAIArrS9v4ALTDIEDAwMxsvVklsAHRMBjmAJP0JHAAETdEUAhVcISVRlxoUMd1AI/7sOz9HW1IoChFkHomwK/+UUYj4D96UQZjYAGiQ4OURXg4eMk5mm/6wJwH8M3uHmp3AK/90UNDtJLhQAFxABGQ0Bg1gIglUEJjNJl14FsnMBlmUJ0YcA2drbi5WmFQIAi1MAa2trbHaHW1tck5KS8fL0fEoAOxwAJCw7/7YFUiwAgU0AJQwA6ZcCJy9BDRcrsLCx/8oU2t3j7/H2ChEfu73DAAAA1NXXAAAGWmJtEx42qWoAVDkEzIQAa0YEo2QAAw4lfIGNhY2bdnyIm2QCp6y2eoWXLTA5w34AjZKbRE1hdn+RrHEFxoAAu8DGY26BAQocnZ+kvHkB5JQB/8QOhIqVORcATCYA24wA+6YK8JsCJQYAn6Wu0YsMnai8hY+hU2B4tSvHUAAACMpJREFUWMO1mP9TFPcZx2nfd9do7xutySG3dznuzuOOQ8PCwd65C2eFY69h6ya7CMuXBDRzcNDksOJhUwkYz5IYLFaKDco41qqNEztmnMwk1aaNbZN0MtpYG5O06ZdfajWTpJl2pn9An4WxxS9HhZl+fgBm9/P6fJ7P87yf5/ksBQX/j/E50DAY9Z/4wuLQe+8jxlFYVOwE44LZvRK4fxE0UAJ4jb5VAVtpMIRwuQNYfdf4AxVsFRtBdU00hmJeqEVdHOvwlbvFMTciBpRI+Bo20EEgVzcAd0U/9HAgpMhqzcZwK6CF29pLw52wqc0mPPLoXdD6zqu0Lo5d3yKDQRws6oH1XZuAzY/dheWmysyACSFRllaVJlsAPlMOxB1xxPA/PLDmG/BstUr127IZUzIqbkHNkAN1omzXTdqeRiG+tQC9A0/CJBfpcwetoVR9R6Kp0/dUWuiKAz79aWv+/XfO+jsZ634asK30AKSWGIaJ4HZhDo/kENv9UJ5TN40lakK9ydFamvgMsToPsAPgurdRDPQlWlBU+Owd+T3PiUILbWGvNgHjsPSjv2+EoLJKcP4e3RB91O4FvnMHej84toxeGyabBmwDGN+O70HzFfP0yMbCC4SAUYDWmdp9u34O4PtsDI5Jrvr5Mne1PIyw3eEaD/T1kT1sJQ4msRFwYogM6ANuM39iX/AQDgXZ5JxgOZu/xj+JtK21jk7ct7EqiRkfRsIRwNMP5+Fb6B8cFYubpawv1uCtslVSlsHLS05vO1iWLDY3lg/C20+OYIF2IHOL+ccg8TKbjZaJuaJqOHs6arR6JSqFGFg3TQNlW8rjsJrQDwm9FoycmIv+ih3ACh3/0QucxCckZkCKztoeEiSecEkoMWKMnG7LJuAdRRoyRANkfdKNzNRNxxTsibWIqYzqCoTpYXuQEeowkPG3wwRXW5VpAwKmMFxuFAWRQjc7TdufrmRnrdj8XE4TONYFWZ4k9iXydkDowTQnMZ0mlPKdnMeKuMmPlSrSHTRjYwA49phZrMQZ3Qq2R5YVhn1KDFJ4kNAVMoi1ckYN1rGFEbfEdgv2dE0EouQARy9FoOKBFXAU60X02NEOcw3NVQV6czCTHG94CbBwIqdGpZFOuFGbA59ubx4eFYm14ZEClEntN05e8MoJN+rlDLmKzErANxwv1fOjbEyWZlAMirVs92IwGlo/QMapqVcL8MWDNGHvLH52ohOeRjnDFgPFlXDSU8/W0XEqM8nK7RYh7Ca8uhnJDm+jx5jE6Ln9FKkAUvaD53T8CaDzRE8Hh0ZPMAq+3oxefqMJRoajpG335ygBrblxnAxuiCD94m7fdjxesAbdghdJHV/2c8jBcc0yXtUiaJCmqK4OdoqbMCC6KfMwSllirQFacj1j8KeQntRt3nnoYN/c2Ze9PtrB+4GwVeCc9TwH11DEmFMQiDbDjG46ETZQs1rZ0S7BCL/mmqXO/+JLc5p79s1YM47XFrfqxUhkfWVubHAIAd2xiZawNQuxT49kLob29iJKWnLRbMG+94nH9V+OSbcBdm0wRXNKmnPF6ouUGV3f1PGUrKsgJIdR18UgPBLTO0aVpr01L18KzU4NTc7C7tI2ItLTQoikYTXPxvU4EOwZPlkNC6uhpQso7EXQq/36psrOhtHkKBn0wYO3d+qaonlvXEDWAj/6EqK+zo7XUEa1IDXW6xAaNl38zXxcgik+UtpmxKqKX94DE2ewUkK/E49SW4NdFB06f2a2DDcLZs1VFrv0zs34KLzr0hFYfovVGFYZxoz7cBprSRHoEeM6eXbN/fcgIAvlI/EILuO/3WoZHTUONY3Y8+lEEGAURYnYZYx4U0X4Lorm6tcOPUbANjzdNIKjeGsezrqTiAyhtgpolBElfEuTEKqxj44QN2rpJdXPXg/owvK7cX2td6/Mv8XkfjgUqd1KSUJvZnFV1mSqkW6kZutmrpky8Kbe/948178/xaiiw4zCetP2QjtkJZORIj0Ry0mEbaU011pt6V7obnBJUrkQbgyOZaVgnZX+Mpav6ySbPP9J7TzdbYrhRa3Jjlg1ySzV0BKZJnUHOlnomyvU32Ilnrfz4h9gisVYTSkqu1BtmN2rl0qHik4KhLvDI5QrM9xC2/+exyRrRS8LbWiY6G7VYxwMIkR4WWWTOKOoDB7Mi/8BDZDkLXpLHtyme8EWccOZ8AVyJPtck0ixmLk0sdCVxs7yzRjWW2wf07+3z0ZZ7YGLcEZO8KQERXz5lfz4xGmJb4wX+Xyo9ett3I2v6yHrgka9S9VxaaHtJ96lLicaSTU9VYZG24k/oWD16r+8vAsBSZkb5c0LOO8ClgciHMcxYhqXL5/CH+cer97K6xpmIryiqsG/5udfO+8KScqMKrXiytWrf7ux6jVRt5zr4fSfFxdw3ubGEZuiKswUblGUDgbKyQge+aVTsCc446SdGEH74GZFkd9ln6GcVtl1eAFclHyMzPNad2rzvAVwSlLUzFopS0tfX8B5+1nOx/cG3M8EPzo0b9oeXCeTtGyUlJMfP4Bz/EqXjeMMgotjH56fzuD6tspRNRpVy/F+Pse9LnBBF8sFj7O8N7j8zHzv5VrAz6iGAT748Yd58Cv7xOo6p1RnGJaCYJ+c/+rwiTaQ+6ZbZSEv/m0IljdlH0JO/fr451uu+BGKmllWrl/M/w3xCfYJWuq0Gdd+9cYt6VQoU+wMvPJpfs8f+fyDmz/efceylGI4ync+OlPx48V/TuKnnKpEmSwF7tzEEvCfZenkdQlS3WdYNP0e5BlFifbLC8om7zg7UcHyKlPPqNHs3/GPRfOP4vQ/ZTWqMusZ4csfLv7wB64Osnrf8qjiUvCCf73AKiov+fjMYr/k53x/jVNVmTUW18SxFPwzWcnKnDIsn1oSvlzqoc+FrNzF7l4K/hF9PNazHNtbWbEU/Px1tLjlkYSx45Ol/R+lQpROYoDjtKXhn0qyBQPeNiwNPxeUUFupYYn4q37/ha8eOfKTs7e9+TeLgDxdoqv76wAAAABJRU5ErkJggg==","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_url":"https://tiris.tirol.gv.at","terms_text":"tiris.tirol.gv.at","icon":"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif","overlay":true},{"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_url":"https://tiris.tirol.gv.at","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_url":"https://tiris.tirol.gv.at","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_url":"https://tiris.tirol.gv.at","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_url":"https://tiris.tirol.gv.at","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":"https://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","endDate":"2013-09-01T00:00:00.000Z","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":"https://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","endDate":"2015-01-01T00:00:00.000Z","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":"trafikverket-baninfo","name":"Trafikverket Railway Network","type":"wms","template":"http://geo-baninfo.trafikverket.se/mapservice/wms.axd/BanInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Spar_Huvud_och_sidospar&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","scaleExtent":[7,20],"polygon":[[[12.8018162,55.1961173],[14.2272895,55.2728604],[18.4460395,56.6924447],[19.7424207,57.9848139],[20.0061008,59.5371045],[19.083938,60.1930844],[20.4949924,63.2497044],[24.2523085,65.5743697],[23.8183485,67.9251447],[23.2360731,68.346545],[20.4345594,69.1703766],[18.0834852,68.5644031],[16.5014539,67.8838194],[14.4360242,66.1427472],[11.8212781,63.3077531],[12.2003119,60.3106301],[10.6237739,58.5481974],[12.6425144,56.0306237],[12.8018162,55.1961173]]],"terms_url":"https://www.trafikverket.se","terms_text":"© Trafikverket, CC0","description":"Swedish railway network, including sidings","icon":"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png","overlay":true},{"id":"trafikverket-vagnat","name":"Trafikverket Road Network","type":"wms","template":"https://geo-netinfo.trafikverket.se/mapservice/wms.axd/NetInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vagtrafiknat,Funkvagklass,Farjeled&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","scaleExtent":[13,20],"polygon":[[[12.8018162,55.1961173],[14.2272895,55.2728604],[18.4460395,56.6924447],[19.7424207,57.9848139],[20.0061008,59.5371045],[19.083938,60.1930844],[20.4949924,63.2497044],[24.2523085,65.5743697],[23.8183485,67.9251447],[23.2360731,68.346545],[20.4345594,69.1703766],[18.0834852,68.5644031],[16.5014539,67.8838194],[14.4360242,66.1427472],[11.8212781,63.3077531],[12.2003119,60.3106301],[10.6237739,58.5481974],[12.6425144,56.0306237],[12.8018162,55.1961173]]],"terms_url":"https://www.trafikverket.se","terms_text":"© Trafikverket, CC0","description":"Swedish NVDB road network","icon":"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png","overlay":true},{"id":"trafikverket-vagnat-extra","name":"Trafikverket Road Network extra","type":"wms","template":"https://geo-netinfo.trafikverket.se/mapservice/wms.axd/NetInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=VagnummerText,Vaghinder,Rastplats,Rastficka,Hallplats,Farthinder,BroTunnel,ATK_Matplats&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","scaleExtent":[3,20],"polygon":[[[12.8018162,55.1961173],[14.2272895,55.2728604],[18.4460395,56.6924447],[19.7424207,57.9848139],[20.0061008,59.5371045],[19.083938,60.1930844],[20.4949924,63.2497044],[24.2523085,65.5743697],[23.8183485,67.9251447],[23.2360731,68.346545],[20.4345594,69.1703766],[18.0834852,68.5644031],[16.5014539,67.8838194],[14.4360242,66.1427472],[11.8212781,63.3077531],[12.2003119,60.3106301],[10.6237739,58.5481974],[12.6425144,56.0306237],[12.8018162,55.1961173]]],"terms_url":"https://www.trafikverket.se","terms_text":"© Trafikverket, CC0","description":"Swedish NVDB extra details: Highway reference, traffic calming, rest area, bus stop, bridge, tunnel, speed camera","icon":"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png","overlay":true},{"id":"trafikverket-vagnat-navn","name":"Trafikverket Street Names","type":"tms","template":"https://mapproxy.openstreetmap.se/tiles/1.0.0/nvdb_names/EPSG3857/{zoom}/{x}/{y}.png","scaleExtent":[15,19],"polygon":[[[12.8018162,55.1961173],[14.2272895,55.2728604],[18.4460395,56.6924447],[19.7424207,57.9848139],[20.0061008,59.5371045],[19.083938,60.1930844],[20.4949924,63.2497044],[24.2523085,65.5743697],[23.8183485,67.9251447],[23.2360731,68.346545],[20.4345594,69.1703766],[18.0834852,68.5644031],[16.5014539,67.8838194],[14.4360242,66.1427472],[11.8212781,63.3077531],[12.2003119,60.3106301],[10.6237739,58.5481974],[12.6425144,56.0306237],[12.8018162,55.1961173]]],"terms_url":"https://www.trafikverket.se","terms_text":"© Trafikverket, CC0","description":"Swedish NVDB street names","icon":"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png","overlay":true},{"id":"US_Forest_Service_roads_overlay","name":"U.S. Forest Roads Overlay","type":"tms","template":"https://api.mapbox.com/styles/v1/glassman/cjf4qjmps0tgv2qpahj977mvz/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1IjoiZ2xhc3NtYW4iLCJhIjoiRjk3dWdwYyJ9.Tg_fMJWxygeKBgVTrZHmGA","scaleExtent":[0,20],"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]]],"overlay":true},{"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.45788051507,47.44581806984],[8.57392386647,47.44477300781],[8.5736210256,47.43124146738],[8.60265969038,47.43096170983],[8.60230512668,47.41746267935],[8.63180141114,47.41716275506],[8.62949748819,47.33628349035],[8.57161615958,47.33678511959],[8.57152127804,47.32291600346],[8.54236326252,47.32360349391],[8.54212409958,47.31013293622],[8.48418319606,47.31061691753],[8.48477528296,47.33761606244],[8.45581592704,47.33787246484],[8.45609007471,47.35135390006],[8.42713165453,47.35160640397],[8.42864162259,47.43259434498],[8.45744950771,47.43230644735],[8.45788051507,47.44581806984]]],"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":"2016-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":"wms","template":"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2017&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}","projection":"EPSG:3857","endDate":"2017-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,iVBORw0KGgoAAAANSUhEUgAAAMgAAAA2CAYAAACCwNb3AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAcppVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+UGFpbnQuTkVUIHYzLjMwPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgofPyfmAABAAElEQVR4AeW9B4AURfY/Xt3TEzdHYMk5I7KICKILhwE8DCe7eieiomRByRmGjKCAIHhgjl+PNUc4UVZEggKSdsmwsMuyOU0O3f3/vJqZZcPMgnfeHf5/BbMz3V3hVdVL9erVa6HNhEciCxS7VtBJKvsDJlWUxCjFa8tdk+6oD/zU1ZOMhyttYXYmK1EhMlbgfnudQWgd161y8+jRnhDZgt6+ZdIkY0nU71N/ijlFyjBneAMNTX/3lSZH8k51u1RR0i3KFHZTvrUy9qy13NWvVbtebkWJ0agq0yusdH9+zv5u0Ym4YgfCw0wHY6Lj93zw5Iw8fz2C2WymjxKo91q/U8xmwGOugufhDUuaFpcV9XJ53T0kSUo+VFooJIaHxSXGxifbnE4lwWASL5cUHRA1YmmEVn/Crsjfx2gjD26f+dzFQJu16wzcv4ZvAWU1AXhUVRWGvrSwvdNj73uxorhNpGTofryiSDIJGm2HpOZ9y1wOKdxoYnar9ezlyuKzbSITbSqTf0mMitvfuVW7febBwyp5mykpEtuxQ2aCUIMOhEaTH/qkQHEOEgShHE801wDg9ZNFELwiY4lhXmFWxbqPVzIgFquGWARoYCJ6zRsz/YS9eLmLqYUCE6SanVDQcZHZFK/S0RQZ0a998p2bhz+zK3XLFk16WppcM2+tK3+bzab9dXqx4lmuoH7G6yc8BHQ8+euXPUq3sNiI/sm33vniX54MVr/AUlNFlp4uY+LFQatn/i2nrDDV7XGnWEQlslRRmFslcFSmEUQmW0DSCtEDkkYjaMIjQP4K00sSixAEZnSzypjwyB/ijNEv7pix8jvKVpv46F49qQY8dzw3+eFiS8UTZV5H3wqmGB3AFpfHwzSihsn4ZjYrANMIzOtVWUSEwACHiH9hBItXsbUMiz5q0Bs3Z8x68U3gG8Etms1mhs81EW31+Xj2/15u8ePJQ0MdLucjFtndzY4JLGcKk71eJogiU1VUSeMjAEhZVpnBIIh6I3IoLAxwxSoahju5kTrjBze37v76xuHjj9M4ABaCqQoeSRZZnKLX6ZnL24CJAo29L+HndZcCsAUAAzKoJgNTLe5wfivPUgdqS14ev2cTvOF2o1b02uwNGQawdhIxcEzxMlmnZS7Fq6/9POS1v02rIKN+CVTmRP0BMK7QFq9f9TJFr2Gq7KlbPzghZhP/0+XUF+c/0Hn248suM1eHMsDE3G7MiwAABUUEshHXlAVZNRjCNRgS0Dv+qEx1uj2YTgFI62Iuqk9kkTkO75A4Z+WQ3gvHfZPcptPYDY88fSGllkQI2jcqj7aIWAmeboDnEuAplQGLB/3i8DBFgzyyCiIBxmvDIjWEWVoUdCqKrLhloKnMLCB2C+ik0F7SO8yl7d1yxrBpf14zd/6Xk5Z8CGRk1RE/KCy4mboltYpZ3WoeN/Orw7tm54tyhMXtBAFgFDAk6LpK40NEIAJ+ozFSQ2oApgMPMbser0Izb0MZG7IC6CaS4J5qObFv8i2Lx5n3zNu4mIgjNRVtod8EC8ZTcDMvuqUyD2c/CrCOPsSKrrdPADb/N6bPrQHsXoFh1pCSImqTEItISuL38Ac4RdOH/tII1voncJYjYAyIO0uU8dqSv01JEWWR1w9YatVN17x+jLEqY9xFQvZqyYeMKk1wj/mjVu68fPrjLE9lhzK73Su4vV5R0CjAP8J9AKZKQF2S9JJTVQQXUNCFqaLfdI+eUz4BhVBEofIlDoey11Yw6LvMX44OXD+vawbUJSKSahDU/AkuCrygcVP7LRy7cmfB6Y+PeiwdSh12r+hRILUFFXjI4ZH97eFbAxgg4RRmg5Sja9As2uDwiETAohe6sNPpzVbtHQ8VZ6cPWDZpM4idIz4RSU0grlz5iCNdNn/9bpOOsx//6ainbPlppyXCYnd60EMZRKFidDSB8aE2MRoamx8eECvzKIpI8ND4YCwlEWJGVETF63B7TtnKxJ/txYtuXTx+16a8/SYiDhAK56KiqoCSiFOAygHSH+OjchkAWAXZi5HHyISUIIFhJlGPAaREncVFrQ/q5GPgyxMo9tu+r1a/jyHVrRMzRjdbTRu2MdNbOa3Abge5qSAMkRaGErQoTO5vSxy7feWADCAXj+w+4ayIyL6UvWfEO2vbE5EQ4gWpVWBmM2+uzYxhG391l00rsNkUjax4UQ1xDvpw6glSNuQtVEhcAcQrSBr0Ldda6f3eljdyyJrZu8+rqoFU2QBSVq8kQBxzvtjS+Lv9Px077i7vU2FzeCTONJgWCE9S6zfBQ51DGXw4zmslUaPKDrd7l62g73tvvfVPah+wUBbQXSCBewV+Xu/fYAHgCYpXlURje8HA+sY32U0wpw5sRZ2qJ/072F9PtVWPfnv9yaNGaVFc6b1o/OwigzLW5XC4RfB+dIS4YNBEtykLvmX6gMNx1SFoZtykjJhcHRiJ+4xiDTt5/uR7lDc9jasRVF31RDih3r746XVnRPdYq9XhAa8lFSWkFYeLs2rw0PxcQazqVft+Q0hLQEqJWR2ub0rO9Rr13OS36AmQ0pfhyl/BDyP7cu/WLT9WXI4CIC6wE60XyB0KYYn7EQw0NvTxDeeVSmv/ghILDsJ0zOlxHbQW9U1Z9sxMypMCY8CVfpCAv84TAQiAsQT0irHGMKlnWMLOlHY9222d9+LnGF0xMJjXeTeqgZelObB5s2fYaytuyLWVLbVUWsHSBHDF0HMBJIdAgaKmyiIYhEbVajRQHkRonRwhqlVe5yfK6Zhbdp/3WJL/+tKSxygDIUEgI36T2iU//PKSBy54LROY3eEFonGJEchT+5sQELCAW3lFgoVggiYlKqqCZTDRVfAEBGfIqpdtDvdhW3HavS/MHoacih8GXigA213PTZ+RLTj7QP11oz19KMLw4wcWBjLDarIKHhLG0A5kiJlQRblE0Yii1upwsNPlhdOe/eSN6AxI2dB6aPB+/c/ukjLrRSdVrSS1l6K8rWIbzPxm6soX9hNEWFQxsznkZPzPgL5Kw+lZmTzHpYL853NVF1mDvNDdSaIETdBPyIwgJphMrLFoLHeJ4gmnwJwGr9zIpnrbX3TbgZIYI6gdwSog8QrVRJPnsLELxbljcPkWkKBK6hJCULn9F08ty3ZZAI8kAJEJ7+okugkVX1Z1oqa9IYpFSYZLxbLnrB4EHmEQOhaqzuhsu4X0GBkaJBkT6iQiEp0gSYXWCnZe0ax87cSJz57s0AFrelriMJYBK+XML9+L2fLj19MrXDbAI0qygppqQRTQr/AE+CFqWmjDWEPJdKlYkc/qYTvQKkrHE15rtBPGDqjaCqmstesg4GA6BCEJHouWxR7OPDwCt1Zf9wTCRRwZDmVFig8Ll9rronZ1btd95Oa/jT5BnRq1aZQ26XKSbE5Pp8s/VjKnu4dvfqHdj2cPDmQON1iqJjRxQGUgztwjIrG8fVKLme2bdP/IPGRIMXV4h6pKmzetGCiez1ybrdrai2ReCWGy53q3W2aXHRW9xr2zoc3GR8efMUP6ZkA4E4H0mDd6WKantAMQ2wOWGxQejp/YTGBaQXNrRMN9PVp0WnRrcv+daZ07WwmeV7Zvb7Dn3C99ThfmLdxrKejqcblBJCwokcCiAQOf4AGDaPRO+ktpKP5a/4ULNSn4kQFt4fDpQ8PKtUoscwIeFfDUIg5k4wnEoej1Ok0PU/zOlo2bzRvcJeXQsN69+R7H6q1bY7cf3fH40aILz+W4HbQmA20HrwmcRayElatMqHwQFfsIhNokkiUqp8/1kgJSA7JY6qCPltvEN5n15eRlq34CgKS7D/lrkmrub/Zt6AUsQfUC/5/u3W+v/1LZpbuLNaThk/SAhTRIIh3aq8hi1/D40sE33d5zyb3Dz1fLJvQHp8X11nFbNqTsPPLz6WPW0nDsitCOSR10AoSwP4leu8Sky2X5t6HcmQw/cVCdHtU93eXlZlsxlEhGHV4Rmy3Jxrivds3f+OddKLeOCvvaU0cOHFiA35/Qp8u8EVuOqRWpqkcmGIMyZEgGsczlZOWSnbj2ayBUhaX6YL9YVDiwFGZrvi4LNbywNGNRpmkhmf6xZ8HGh/egkvfxQaL+q5PvvrsU36v/vHZ2sT3/3FslDrsCI1ZQgqXRYW4vc0ieHpM/fb2pCAEKoSzTfhN2d1RYKtB5iPI6I0vN/ZcStc23m2A4iQsPl26LarL7js59uhFxEAijNm3SHkg6RcThXfPrjugR61bcAAoH+MHVgf8S2GjmGkat1iTLLvdtFtlDa6ughekmdhOUOKhVLWOT5hBxtDA/biCu72+Q97vJpFTjxrTx+S1ik9ZqDUZSF4Lit695US2DmeNs8eVmNDbG2BKukt29fOZNpR5nV5j98TS4moaMqEKR2jJ95Z9vuYsQGnsUZh2pRfhJ1dNuvTho3QS+1zPqnqFPddSGV0Ifk3xlqUTNhA5AiiisyGG/cdimpY3wVGHpTF51eFsYiLkP9AcMTjWDUrXiGAQY6BVNG63JPbB///H0KNVcAx5mVvlYSV8+u+ztFrqwnxnUMN/WSLWK/D99kkWQKwXFcPLsmTaiVhCiI8LDWJTRqDcYjRLp+DDaY59FhewTvFho1ZrSupX+nncg/kCrEKeiIHU0xSm3xbecuXPu+r7rh43JIqlh3mGWuBsIdswnvb2+Z/rnW07+cPEILfBY8ujRQTnUFfiC4uCVx/+1X1fALHDbmnOFiMvwugAAYiIAKRrbHs0aNfyccjzOWriBhJhLv8AHc7jlFt9eUKwx8uNGfPtBqWaBqVkvYQd251miKbwjPfnm4Bd8YByCc+glEYxegCG2ZpGqKzzwag0G1jKu4Wvmu/5S2NmcqktPM7uxzggUUQm2byaud9Gzib0HV0YbIzYzgx5snv7XTT6kZF6HRjWWlFfcHMhx+Kefm5TarTGcJEMxP5IeOokl6iP+uWHgYyUshUnp5hrwMLNgVoA7vI/Nw+K+MWFfHAyAxq9O4p3ARnIxNkTPFeVqxJYxCa8PiG258e5mXV9INias6qgJ/6CjIfJiQ/jTKFBtZOw0wJ6GvTj/ZNSp8ve5QdDjQ7wLi9Bw7W3RTffendy32yfPLnmOWiDCOHDKJzWIWw1dM3fZtuO//LLbXZJ41mUnNypGUoW+r+uETmKfkLqLPn0RD4W4DXFIrA5JItRJWhp94EDTsJiKOwbegVUvYwsWLKjTz/TULXzCW7VsfSFaZ6gAvRHL5WzdP7ZcRPGGaaihKlR63MStGXszmyOuxW4Dt5ZDwsIBVGVNM1HPGic2+YiKduqUGhTp6VkCK/IhocC2x3DvHp+ptDY8PpgE1QmI7R7XjVSWUqGlvJlghHWa1jscPfjtGn+wZlc1ko5l2yy/0IPkdj5CqJEJF60GlnFYPFpxN8QSRkbl/hTBYVHVaK2O9WzV8SZp9+z1L9eubMOOHeGf/rqtTwerdVShtvLBLNkmwRUFLEmEiST4RNau47dck+kSSp7CtDqpoSxYbghLmLdtzpoXd6ISkhqtBg5UzP3TSIdlE7as63X7kgmvHnaWdK2wV3r0hjCtEXtP5b+lwesk78nLeczicQFryD2i/kRbfY3j24dERtTBicZ8d1pph1mPncL1TbASkYcBV5+q187VL1XQFNtt8NPgyUPqzKtb3msDoy2KYlfA7+JVvRzNE0hbjBT1l4Y9dv+B1x6fxNJTU0OCnsJSlAwstVtFJOWcLy30YIqx5Q3vD/ytqpegpiswYbvi1f5QcM4VeJZVVuAppi6AcOpwhECmQHHsi9OtgOdEtcf+n6n4TmftW7TzZlcUsSK53KtIZDEOUrOqeuxeWSorq9BLJAYzs4tE9mYGLXb5BIzv35+sEbSj+M9Rb6+92XQua062UDmk2GmHSijC2hp60whlri0BLr9hwItFkBRpNIpNmWFr1+ZtR30wfm4OVZICuzwGWD2QtpnDdf+auQt2HP3VfMyONZfMPEbRoDqAFxoRmiClIL5Y/P51+kfr8cCRgSboCr7UBhXrDzwUWYndEvvl1+mReG6vnSdwHdh1LrDZ5YjYKKY4XXpy3KudYMORnGDMsaIp6pz/4eG9+9s7ZW9DqHtggcH1fWCgQlt8UcawrP5CSyIu0EzovQ7zArPKzIyVll7OpU6YwsM0vt29uv3FxolUqZfYPbFN+37lhwlrC0g6/0WIL/RO8GIN1zYirttl5MnIMAfN2TkrSyU7p+xwZju8biZEROrDMa5ByANbRbIUGxnGEqIidFImTI1UI9QWcep7mzpl5meHaXUaTaw+qqilLuGSefgT+/D43j+vmzv0QkHeO0edZQb4FcENglwgqOS/lrA5S3tbCqzUUhuN0ZNgjHp69/yXNtPOQDJMt61iBip+T1p15JurO2deOPvmpwWnejJs5EgaiXQSER1VI/SRLNotlnOsCeKL9a9B9x8sVW3M4JKtMYq+tWsoTABnAIoI3suy0/TrmaMDANn7PTfztZbPelcNVJ+aJbBBbbq+ZxO9hyEGHGguCIUAqWUlXK8z7uT7SKijwFYebyfsBcLj75VFUrX6AQtOF8CZk6kH+G1zCtxSMqrlqPXTj9w3J9/pjck5+LzV6w6DixgEGCRILajgOgDlmpliJOPeQC1hBqNY7oF/F19ehaQUDbwzWaFUOYg299Y+8EQ51kA1PHKpPtzjI7/m0w25D/T7y7LOTIgig5RaXZoFGobjI9xOw+Ni476Q0jYt7X+5KO+xtnOHJ+tVsVO54hG14DqwbFX8qjMU9l024ecoKfyDLycu+XDjkR+/e/3Dd77b7yi+UXV7PXzjhtTKkLAHWrzyzRUBAIbdGikcA9CM6bcP7N570rqHxx5DLhFOa0JR1kY1fbRPavRbOnHCP7N+eeECc2NmvF6dRivCIQ6dVaRWkdGsbXiDtU927vViGvsHRiGDS5orrV2HvzBWWHLwdHO/uyt/PLWvCEgZidUC+lRN9fCDTrNKfodFLuzwFufM26+q6T0FwROQFv5svi+fmiW8P3H+SzXu13NBKizt5oczqYeH89N6fI4g7eJFibWIiLOSKTUF/yDh66ndx6CxX0P8a2Z9Gas/C7jkd4lvarPmnYTnLVc2gnJ7SDVohKL3hNcerj/00wzUM+vdkn1kLq9S1fx1cwJh6ZnuT9Iz51Rvr77f0i/ZJ5df0Mk3K9hdhTM9VQKbGlZUWimKuZ1RTHC2jWKlj7SfOfzEt//8buT+RZt79F487h8XvZa0vLJyGdwc2g55btafiIZASVho4D9O2TRmOkfTsPgpe+etfzmLveWXGmUkNUiXVB9at7j1iaLzmw/biwZUum1ctQNBCm7sBxhNRrGLLvJs15btR77+2JQd26hp4kpXLCl057pNosYne59o2dLZc9HYo8xjaa14sLdHDpNBEje5Kqr3nNveYeayKaQp3E9uNVwF9e9+VyumEvGc2x4jhtbHcVQCxwBo4VqU5fN2/i7/vNbJFVUSI6FmUxXhjsysLvtBai+hU2aojNXA8f0kWKnN+mDKwPNUrDexrpFhemK9OnY6fvzyubI8puJQmIA9iBCsmPxVXV52Xq2Y2X3+qIOHFm1OB+1K5hSzAslB+FQjEQFa8trVCwvBOiQpSZZK3A6rip1VLHHsilZnitPpJZOXlUZodBcahkcVV7isF42SvvsFe2nDS56SH/ssHL9+97wND/35hZn5Lpd7YokHqijWAzjAQ6ZhLqQDfJATBawMWPPBWwfre0HRRhtNYpKo294uvuXITyeZswG5iMETMy5jrTHaJwFSVkwcvzc3a/UFwaNDx2F4kDRwV1YVDXbT4U6UHNVk7UvTV81sKwguNipZyzbtJ6K+5smqMVr/44sG+oi9Ea6y+y0uaDb1SGLghuR0ueTtpefu67vw6S3PjJjxWFrTpo5giOD3SbuqND2wGZ1PSefqVK+Yhk22l+fysxN1MArZCDTMLzOCITpNOv86KBV3iV6vnjLqEnLQQumbCSiexJl3pFXcMO/Jg2Cof1Khc+BuHYODPy9QTFQqvR4x2162ZfDKaU9/PX3VBjPWI34JSTK7Cj8y+KG6DH/R0F+kR4pGYmfovU6vM7XWhh3pG9vs2ZQuPTpmLX+rx/dz1t15YNHrT+2a/3LPnOf/0aR1XEIXtOKcuOkF85dTVjzTPizhTzeYYs4nhIdpZQ3cjqHPYQwhJEio0F4VllmgDxCHGGnSa1vrwktuDEscn7X0rTuIOAh4UqkweOAYGd5H317Vsvu8kd8eqix66YLHphPdMihE1Higk5hMBm1yWMLJGxu2uHHbjOcnEXGQmwkrgwfvdUMcVXMQetRrZenYqPFXTRRoBIoXi5HQFELFyKcJ29vyT47C1FWbF2U++eoLf4KG4+Vckk42htorCA0NVrU+xDHpjB3JggUOFxQILtowuZGilrU2RIZC1Ppa+k3PiGlSAb3W8EGEXgeEAlaFSIS/tHdHG9zlXhc7UJn3Um/z6A9mbX8rjtRHFFNRX9B1VYgqq25LDqZGNtaHsWbayAV7zBsWna16xAdKYljNsEzfJtT/jZpPa+jpw7ZsCB+1aUXU5tEzv9+Wn991yRsr/tpEY32yzGnvbmFeg42GGDMaBmNIGCY0wRBxLjLC9O7tbZL/bv7LcBxJZQIAxiBnqOl+C9WdK6eN3Z15ZM1Z1a7HVr8Hbj4i7II43SSL7SJjWfuoRi+Pnbpi0mAQBhEWierNo7lzXQDl/K1e6cB//1dQ3KoJRrUsgyZM0D8//JljtywY8yFTHEMVl0Im0KDuJlQJ7ygdlsLRwV/chS0rsj3b+5jHru/TqtuS54ePLSS1hBAh4xq5NQfMLwTyLGXw5MOGNqFi0OQbXnj3gpmaAmMeNOfvcRN94IAM7nD723n7P55nEYVmIF5iuJxwgrVBzyBJ1AKrRS4yeh4q2Lat/4DlExd8N/PFTWAuJEWwxk2tcqEPVkfte1JnQ/SeyPCoWdtmrNxBD8nsa2gUA3WHU54HxMGwMNQ+vH6i2KTUIjRt1VkzPm08d0qj/Hc1bGjD16v0eeL1F5rm5l+68bylNAq2W2+rqDhvUmzMkXfGzj1LAFID5AZQBIL3D4A6/r2Xmu8/dXTzLxW5d5ZhrQFB5KFVlwdrDZPJKNxgiM7u1qrjqE2PPvvtF9Oe4wiAatQAEvQyjx5ThrPHp1/44O/cq9d/VBJ5rvsU3i9OZesZ69C8zYKi07ahZ9RyrQYjgEMM1cioZjf8RKKVVFE+VVEinjLpJ1hP7XtyyJqZyx59dvmKNB8iCECE3+T+X+ay+4REzeaqrgIAgUszA/uXmHFVXdf4g3N9c1qa+5aF4xYVOYteddnh9EgUUE8FEDOURVIdHs95wZnocAovd5r72JN3rZw5b9v0FVuhfgIJmcbcGQ4oQdYntauW9izeNInfhIhO7TQOHJ1vyCk7zp83rP1403155cUDxywa3T+3olS4ALNsg2MHNL0WjKqINoXtjo+I/eT9cfO2+yvVvDFiSg5+04enbP/3u+PmCeQ/FNdIJ6ePNnOzMj26Z83MUd9m7nvxlGw3wFTn1SFCCYIS0FxoEnRGlhzXbMP8KSun9REErmunpJhZRiYWhiCCOV+81XjfsV83HXCX3lMhO5fzpmLO0SSHYoE8y/X1pxNUS7P0xoipWXesmjolX/C8YLU5vHBO1F6tE9gE1GgkEBPU0CPuUlOmbFuSPWfEiLSXFi3d8vT81/k6JCUFC9WUoAvVK+PgEyFwhvSLqCtP6v7CBhi0AoPBRyB+4VM32+90hzNBMxPhgPhaz3kj0341Vtwpk886HW6qJ3FdDJIY/otKfrlVzteKPa2Vl77pYR71TZQhZtqOmc9hd8PMGKmlCzL4WfZQ1VFPObcpyuqME2a+CB7DXl7+4PS3lq3K8dpb5sOTEvv/IEuYfoG6uR4Hy1UdQEND94YVheNaz3jkwI3N2i77cLz5Y2pk5OZVD2c7Cg98+8yq09UaVbPNbzqzcWMLDu289vy0O3LKC6fvK7pwW7EDm4+QGhKOCUOzwqLIIPUNS8xp3bTF8DefmJaxdeoq7tJ+6nJSldS4dcnEB9L3fPfqKa89FuCzSFjEuF/zH2EfpNqg8J8+dUj8dtrzq29bMrHPLjX/QdnhcsMnTcdtXQHWXbscroHSeEqIICmywysf1ZS3ys8/8doN80c80alhm7n/N272D+aMjGtSu7Bg5LUFaYbf4mAgCzaKoePVI0Fo7ZCZWQ/UoVrw3Td37lyDs5uZ798dXe8YVrb/i1/O6rzNNR4VuyOqtj5JQrWhT3QYEschVTmnsoLl6G2Dmjosg25fOuHNbm1vnL4+bUQRqvcHhPAFafBBceWvBDEjcGpKT+eesVu3f7Pup0vHHz1vh/OGLHi02PsENKBHURuF8C4NdAa3Tqu7iGNblXbVo4nQSD1OluR9NHDZM1+2a9Pur0qlO8dl83zUY8EoS5Sg2WbXas7FR0brC4sKaQvjxkXzRtxazjwdc3G4B34/Xh1UCjc6gnMBmg7RcayhKfr5V2asmUuLcFprkJvJZh/hKrTo+ipj55oTtuJHi5028liwa416k12mg2Z/3ARjBk4ICWzn3HVDsbj8PEuqHFJpteE0G05Q1Yu2vj5jt500H5hbBLnIalOKdK5biy4ey+i9ZPwbKd37TFnx50fKSK0Adwpp0OC+v/UtvfkIKwzno5hJbwiVk86zh1xMX8sM+c/1UGsc/4Gf/JTh8rS0oj8tnX2zq+LCz7kaWzOsKMBEmO5qjfmf4ywahggHanJUm5RjcT+e/2vZ0LQX5y/b8syi5fWYzBkRCK9j+N+X3PfuZ+9vOuCqaICzwrIRZ3dcGHEEsdA2NUWwhobIH2D23ZwQ3XDv3U8MvZwmwMSINPOnbYk/HdjXqMBe8UR5acXrI/9y34jPM/akZJ069tkptXJhCaQCKyghxzjf1o0b1wocbMCJsOTSubUia2g0MhgKDndq1PaZd0ZN/6HtzLVVUiMg1R57ZdmT2zJ+WHPEUxkBdUzWI96RCwEt3NiCbaLXm3IJGNi2ySzzR0sgDuKafPd3r3nTvbctfvrVXTrvk16ckQC3plOG9bDsK72l/ShIHg04midPsUn5gvxE5U9bBz+wes7oTyYv/QxmMOCvr50rpa7tF5kkmUarKbBUuAut5eepVBbcN6pKQxUCN1ZaTXlwZoHKegC9wQFDL6iryvl/kJ9XpaKYUlt1OZj+zOIVuE3qMsfNDEhZ8q74bvSygtQNK2/OKTq/e6+jqKUKtRwqH/yPr96On1AomomKmETek4IlvKTo7LIBSyfe36lt14dfSht5nqtcteKqSbM+fitu/5nDz+/KPfn4ORu5/Ekeg06rcXghNySdlGyIq+zStO2Et0bOfNvfF/b6CL5sIS4ij+17F1ml6PPs6i1bjF9+uyNxDWIv4brfk68+f1tW7pkxFcw5yCZqoitxZsapk5heo9HpoB800Ohko1b/U1xY5GvfTF/1Nvdf8G3wMPNobsVQEOol8suff1z//cXjw3Os5RSSB3suGhGxq3CQQW+41ZhwuXPrlp9tYh8wMzZ2zGj4j5iAuLRW4ESyc95LT93/wsyzZ8oLlx2zlUp04g4UIiGCC+fj9fXPhwiQ97QtBX09izkaOMtzP+23ZMKyH+eun1O9nbr1hK6elAjEWRDOuu2Vq1aNJrcnhrquEEhmKgqnMxxxHGqL1CULDuzLExO8xsT1JY0Gu9RqKxQhAqkBDBmNUrBeSx8/PX+Hqnaas3jsO2c05UMLrdhEhusRtttCBpWoDgLGByYQHOpgGqXYavV+77T1unyo8vi9G+c/+Pm4RV8hL8frQBlp+6+73vmV2Qd5Ky0eHRzRPJD2cFoTm4RHiV0iGnwx4OYBo6b3vyefCsICpUlvlKcyn4WLryM3wcIFWzPLcbnEyWlpJFUuBCp/7ampO/F7J4VsuVSc0+d0fk4UNnLcjQzhUuPwuLJ2DRofWfXw6LOB/HQQ6tTly8RNgf2M3bl6zpD3f9y2+bTqaqg6XF69Ros4UAhvBXWsdUQ06xjd5I3RUyY8PURIslOwL5TjMAXq+6N9A354CkLb6i9oPp2yYvnYd9ftMJ469topT0WnChvWajh1CM5MQRSumqCjE4LpcAZdPldRouaHu2YPWD65+/ezVt9D7eDDibFmRVfwveZ9UCcQy4v16A0RCfFpc99rN+eBRw5hDwuWspqRJ+HcVMps8NaSVSdgDaWK1a4ePADTqnoN2KmEJ2rwlAG8IC+B/ohLhxypd6+c9vhlofiVw+4KCYGvEL0E0SYhRYOXrnkXIfywPBF0Gq/gOe4p0dsvyV8O37hkztvj5i7j6igObFEJKctaZvLCUcQAlcopexDkFYsKfYKla6M2z7w1bvYbW9kL1Z0HuQVqxpa3m2XmZD3icrvuenH+iKRchxXAwUQ873FNpNZ4IiI8Ymuflh2/Nj/wRDY1snRI2iV8VW250kXASY4lM23KELMmg2V4A/FwZ3y7JerggT2vZpZeHHrJSctv0aMXtBqXjHPbBkg1Y3Rej2YdR78yYsqXX05dzhehOCTDiQqZ/9CJ1C10wEseAi8Pm7gXBNN10Mpp888qebNPq07ovbKMdSGc2eDeU4PHBu82XK/BVrSqHdFDvpdzB6csfebrjDkvDiYi4RuLaWm+gldh9tDO4KSlyCYj9tJFIYEKBbNiIZPE1Wevl/ZzrglZqS70Gu6nAAIMgK5DJVov+ImbbZ2+6s2ZH723M/zEnjVnbaX35mNdCkqDFVDEfirWZVdJxGiwwajVCpJ8wVIu7C45v/S+tXNLPnt2ySZS6UhqSVhky3YEFHTKLm3DiEjWJTzhq3v63jZy0m0PkhjVpGAR73MD2UxqqHD3qqkrth3NmHpCtotONyxcZP3wi9IyWthLlrZRrvIhRaXFnsHPT3uvS8sb5q18cFjulPdevivfXlnx3sgZVd6aHP4DzJNxwHeufNn2j+P2Hz847ssdX0/K9FTGMI9X1mKMPThgROuNZmGRrH1kwlsjn3jq6bREBAhIYVLquC2qz3fHzKv7/82fzQe4SgGCIcI3j3tn9btJF86vPucoH5Jjo/Nh/LQnnWa/Kpl4oJoBaXSy0+k6oi0e9Kflk5d9N2v1bLawPxA4gYsNEIB/WRx8BGmaaVnghprsUOA++z9MnLjRPhlxVjz4yDn8vO/B9eb7z5fkrTzqKGvr4dFL+Lhdk7SFMqiBe6ByprhArbRY/566aUlm+ui5PHayZCcvKZwN6KpPqOjQoOmU9AmLXtvOXqwuNThnfnjtopt7zB/x+iHZ1km1Yv0lYi1AthOSjdxNhoYPo4x4rBVOh/qrYtX+Klsfz6soSRu6fuHQTs27Hs7c/dkbty8a34BpNf+AC8HppOg4I4hMLrNaYnCm//Z/7PzqT5dke2yx3Y44DdgSod10FQxBpxe6aSPzOzdpNeb9MXM/+3bGmurw+dQqEO/143Ly+2BPBklF9KvzwjTtxkcnn0Gt9963zjywSenltSfcFZ0RmhQaCc7ngC1x/K2nWTLjgtnoSysq5FOKOCv15cXb08fO+56fB4I6gRMOJLfqT5heLwxhdrfPalilEtQsRZIJxAbrSbUNT0gWEo1XJeaaVdV/RW4kFLIUah77aIL5U+T+9J4XZs44W3pp9gmPLRJ+fDIPrH0NahckLTRYrbdQcUsnLpx5B5vj7chrWmokGSJv0IfvfvCuB//ybG8ejUKE1PA7D/qkBiLNLd1bcHJWtgciTIbfuUarBdVp+cFlrhH4OoKR4T+gClIgEgrn6DmkFphckvC1Z89Xz0Ak3pVsfup5l1dYVuq1shOWQkhthZXhAIsVh16YCxJJ0DgwjIicx3TwKGZNEDmxbUTCG08O/NuzPIxLQGrAJR4iUDZ/9UbDvYcyE7cKwhGuMlw3fln1T+41P0V/MsF2Aojw2UTzdpTtAheKMZfUklUnZWc4XHMowNtVTcKQJPD706o5TguLz7+4CvUkY8eML2midXAf8SKuFlA4GLHxe+BBFAe4POCvH6QTWEHpcWCHifAWwsGrqhyqh/xJiUyqbv0uPwJrIOCsRAzlqykrnpvx7aa/h/34y+JKg3fCaUsZ9tkgTXhc4/qbBJFI4ADu0zpnixFznhqH3C+Kt7boOPnHBS/3JeIgvcvvPOgl58GHNiy6CQh9ZJ+tYFa2rVLVyFxs6UAc9XaTBpPy4DyYTo/gecdLCuT91twX+yG85gHzq1MHt+/doYGsec5jd2RX2KzYDoEQQCER0TjC4F/SQGeUmkv6gt7h8R8MaNejz46560YQcXD4xqXSbj93bhyx6flbv96/98KhoouPUtevHrSBcv0xkx8RZEIE6sH3s9b9/b6eKR1vj2i4tQGiTMLED74U+nRfoNeQJBKcEr3FXluPxzYvuxf3udyINYSDrZGtKpCz5jesRGBeAuYVgbK9tEaulbDBR3ewu5kt2Oz5WK6cZF7PGRUfGKpPJUo6B2EN6g/RQq36fuMlEQcxSFK7nrtjdMWBRa9O7JnU9s52hqhTEtatiLZIx06v2jZUUcnpdLIKr2Pq6t1bjNJrY2f/RLBwCrxMLue+g0p9lk1YvDv35FzspmMIFbdGo4H7Awb3NyZEH8f+oFa9VF4h2yLkpZ3mjtCuTHtyIaqZad7/xaIjew/0PF5woV3bqPi2JoMp+uDFcwd6tOhwqVF82+/XwCrGFyxwCUjBgqO6S/zN5vGL/3n2wNxcyBpJ8ZJ9+o8RtKHa+BVlZdXLaKplrfoZQARSu1Y+ODIXDwYNXTt39LGCi38/4ayEoiSA3YS25BCG4AAWy4HX65niy3/DJY+Ugqg2dh8NEImEwCNAi0PCDO/jqAs3LfqRytd89Bh9V6XUVMmTnu6Om/vUykK5YhpzQJSEiP9VVeZf/QFpi60Cj5ksdBlm8f/GzPkW6+aOt+CIRo7WOu5SZbkKAvDFC6vbA94qtCB4bOJMupY1+Xrnz0MkMpvBzYRczjkn+duLi5KPFWW/ftBa3M1ps9ELnOigAm1b/MuJFonQlcVyq022GGUziETIWvK62dyTnzTbiYp3Hq9W+6nA79TOukH9BgjffHxUzsjwwXf/i/OSzxbmvH7IXdLN5bLDumXQGplG4hQSKPdH+b6dAxpiqup04grWVqld9M6MdPVDWF0e2bRid/7JA9vKBU+j+iIrUq1YGsAM5mVFtoqe606f1k9s29Z1oPjiL6JWNxjnu9HOlaYCUPjuCMyBRfqlcgRg4CnoKoQTSqAcvjnqFLuslZIWR0mrPbiGn799bFApCIRgUOg4BNQ6gnV86npzznfOzOWl2LCGeZdi/gStm/qJMkIRwv5UOiz9xfSsoiri6L/kmYV78k/sP+Io6+a0O0lqgJiuvgBEnVdNBBAAE+FnJJ9V7AtwqOUNKjRwxqgoWMa6Ba0AxyMpvhJO4nuf3vJKy9uXPrNx36XT+4+6Ld1cDic24TUKLO6snP37QRsCKBH4DgpP/TeDDnh9RTIQ+A7Pqcmrf8gIUStxh0QgQpsJg/TvjZ55tH+rzilttOEUdoFiYoXsCp1hg64NhwRP84O7PmtJ1eKkOL0bCqWCF+N3cfANbkEsUdUnURlirPRdK9G9K5+YGICCcx2wEwWvuVbpmpdU5Fo+NUv5rzbDTEvShLYS0ieYVwxo1nF+NNR4jA9FwgiZoKpifBAFWfX2kGit8bfNS7tn5Z5/42d7QXebDS7nElRaQf23pEaw1olIMAmiy2b37NPkPX7nc5Oj/zlj9QMDVky596aFY17D+ZGPEsKj9uBo6fksp4PdGRkTVVZp61rutQ/YdvCH4Rc1Xi2kBkUFR9xYbI5gbZpoDGdt9XFlpCemJA1RM5gvnkCw9q/lHhkayKx8LXmr5yGWdfWEajHdsF7z/QEwibWI6j4EngEkAPm9GnUAkzGXWq0olCgLRw9Cz6DvcuSrgWtn1n/jIiL55Gnzqd6Lxj11TnG9objJgy5Inb4GCBAKuCbZ7I4WuHWiS2xjZ0nZRTCbGlX7cgf+whAFWwA5rnamW4G3dwUe+79rVuB/gREd5GCcVGrlDnH57BtrIg7lZ3+Bl/bE4Kg1SYE6c4Ib8C9XI+OMph3fzVo7EqJDxKfGVIBA6Fplo5j2wwmLFicvHH3zAcVzD/kB4m7QJQNwVCPDYKSJ0PaUbl3y9LifL5zYcAaWDZCMb61BC7n/UIK8hfFWoy2ptLh2qMr9nec9+eH3M18YetO8kbkXZfsbZxi8hUsraFfU/ZOlXEch9UsU7E86ET9Kg/NdoqD14ugu0+lYG0OEvY0xcdrWGS9spAHM8KuJQUEn9KtHvvsWoSJzgHMUl5f+Zo3SAGdnpKBNX7kJZRV7RuRgSvfKnY5bj7jKWuG1TGQjD56gDDSTTCwtuX+DA2zzeUw4hfas0xCIBIPE2J55G97qPPexRVleN+LKIpJ5ED8ljkHQsophPTx2+TwflUK7dT+PhYH8fE8wGDSAugIuPjDdc/z4TwTq49INbR+6kCsdt+b1KhDgz1pXePqgo/HWSayBq7KI38g01yEifzfUlCQzmKeZdUxq8Xz+ecs9l9xWKFLBw/7AmwTzIbGLzkpRPF5e9MQZOqiEN3lh3khqhGrE39a//4VFJIX613vwcpZMV9mDPcwjd/6y+JU3zy17W4h0CevaGcLcsUadsViUNSWykwMk0EsYdVpjpM4gtdSFFSXrY1endElu5ScOAqoO0lSH1IAOh8LBqsKQrOWke1rKTL6yQXXs6tUylpnB270hvmkPFUwJ3Cfo+Pluko6psHCNBHs231OoBFMCG1PcuE+vcKvx0eMcP0OM0MTwSPKgbUNlOnXqFLR+PFLJ2Q6zjoA08lcM71oEstXgplS+eiKmHkhNo+Id0UAYVINRCJ7AYwQVOnyUwdSL5zD7+h489793N1/nhFIp4IAqXoCqIKx9rbHh1yoYOliA1ePlpx3gbhSy0YwFCzjTS+7Z+xDOGkFQQqUMabOjakgLRegddLocHA0rKQVnmkPW/7s/ICLBTGjheerOclb26zZ/REG3xq0HvTt6zjPPvP/KsovFF+9xOO39LtrKowvwuq4GEVHaaJ3xAhag27u167ADgZqtXJmCWY9t2nTVoA2t4hsJ53LLKaYT73zwDgmKBpRr0uop/OU3Ph37KkSS7hu1M+UF8fQLa7ag+AVkBFfAe5FdjspThbknqH2OoDAaYY7hN11XHaLlMuQtK8a7MbIunee21fqhSUGBDHbSZb+gMdI5bh6lBvdqJgKQqsZ5f/h7mjgRNUhqdlxbcKYc0Ef7H9fpB6S6KEPquF3ODrtV1cgPstHaCERZs4Xf5wqijS8HaHyoldq10k0ZDKe5MTI+Cw/9a7La2fg1H0r8eqh7ivvzrZ9CXcqPxsE0eudMnXqxVgbfUtQ4nUmQaNr4CAVqCFr9f+amv0kdPCDcR9zOxPILzgN9Fo5b+OLfRprR4uv+D2+8hP/1/dlFXzgaPApHgzdvR8zVa5ggMOpDfJVIfAkDEGxGcVuwwD3/QllRO2oiA//qTT7kUO5fY47+Je9kJ4prC4wOKqi45QRrw0amiNIR9/3Z+slYM8P+hYBXwBKjCJp8BISYtTDcwr2/LTL9WL9pOIPX0ys6MelnRylhVFDMpeawtmHxiD/buXFzdhDXdHio3exHT4OIbyLswK06ayJflEcBUditjd9/86XmyHPCvHChYPbRGy5/j+QbjFvatBf3HbFpSq2kVeM100GrhkkWBILJbEMv2uHnXkIQbGCIvz+zT8L5IWgIcAIJQhzUDM708mPPyISQo//jxBEVG4rQl+WLeCPREVfpgi6zHzvdc+GYBzft3+9XdfxAwhpBrhHUB4aIkGSloOO35i1b6F7QlEKMGinCqM+MxFtNMSoSDUCwzBhEDb1yGd9/mfX16wlkwIC+H3KMkn0RDuFt40q1aBTivMSyA3NRowkgO2IPSyxSMh4fktTTTg8dbtchAZEKMflB4eEVgPhLsHgqtpT2oOsQC2OeFfDyvkIjuJXhveWc/fqe1P5LiyGN1+Vx4A3gVVb1MFF/hHbBOcrVLoFrwAnTiOi9iDXz8ZKcAZTli0Z5dQipZtGMwGXQcQk8DHwjEx+L4akTynASMAcEi0f0ysa6CTdpa14pl12RedkXOlCO1PT0oPNFhEzP9/16qElhZWUsFSUtJljC6l2maPQOj/tQ0MqCFfpP3wMCYSgkuHm5PMecFW3Ouys+XP/JhsNweFz9wJpZt9C5FRioPP5QqcqYj19OTF236HacXPxoy77PJhB8FBCsNpxAcD64bz4x/TT0+CxCALDsegZc9FwQnBG7Dx2ZSXWZM83YK6r5imIsxoWAtyflKagsm0NvJSIVhK6DJVotR2v1LCoi6rvAc63eeDYacaZI+wqVyIXEA4vKZUvpPWiXv9MwxbebXh3hBP/7OJS/vrK0W7a17EZy90WTQeEB4cCipLJYU1jhpEcmFKJtni9WF5YR53vJVV29ww8gHVByIMig02mfSrewsQwX9Jrj489KX8Kg2K4+AiJuHbqbV4r4c/WHkybeGJVNBAKLatCS/CZWdQVwIMipLHiUKkn/cbZUm6nRfG2ryNTT82MXztxXqgMsGFZOYHSzVvLXy8K1xmNBB7BW/v/aJV75RWtMLXRLuQTvCD/mKG2zszRn0vZLp3d//vN35xtPf+hAzLSH9yZNf/jA97/sOrszNzPjsOj4S5bbRtybZYQIXk3uB/Qca4vPyfqFQGBBCYTyYDYlJ4KeHyvNm4wACGlw0nf73TxwHI8jEqlogagvrN/ipz/YZy1qDsswArkER0i+GFQUbQNZ8uD1YB9SO5RwqOknHU0TEL86tvue+v6Cm5GpxXvBa2/xp+emrKC7GT5rHRblgMcHk8r3i/DsRE72y/mw+kGK0JH2oNXiPrR6iUVrTfs7C4IbUhlUythNbTvsivEiGJ8iY0svODrzPuKN58dsxS0HrJg0F8V8rj90pJc8Hoh4fYyKcKsKLpMGr3XnumRQkKh5X6q2hovQGX7G62qIf3CcDWSp/o3BgTu6W71QUTT2kb8v/RNbf8ZlDph6q83XnjXpjmkfvdn3YvHleRVWKxlTeJ+r13Xlt8pM0JQVJu64rgiEAKSRIFcJkDh2lkTFipfFWxAFPdNRHnEJGzdlzHtznuLpccphDS9wO1wqkDkSHq28cyGCNgTeDdGzWYdPuujCIUA9eD1l8ImikDv08tgSBKc4XHD2H7eteHbtpC2bunLQzKR9MPXVzN2xaX9fPLinedSBXZb8h+AsSJEx6hlw+LDptaxpZOzHLzz41AU/ArHnJy/PbKIPzwVq0e5CSKIlkCrsDnVXSc7UWxaPfRMB9rp8rZ7WgzgU+mQiEMbjr6xKgTXwp1/txX1w9loOtuinMaJe005iks7EmkQlfkb3Elhn1JMirfjr2OxYbfg38KCj29Co6iaaH6ynJBzgUg+V5i0euOzZdUu3v98AjIT7x2UQ8UI1RTYO1/gPXupx7+qZY6DQPKa4oL4GMUbUbcV3J8Jg3BpLQW7grhR8ttAIuiTh5brnnFZ2MPvkt/esnTV75idvtOA10Pig9LKdWxIeXDd37PeHf9px1mM3IrQSef8FrRIMEuSoSs2Z3jage999QsKUh74v0sj9/ZPsE4c++K6rvxLUAnSqKtAHNAR6fRwhntZk95qt6z5eyBHPNznBYKe+yX0Wj3t3t6XgERy2h5EodJA2ag97SWAlBrGLFg6zsnwEQZmsOrjdRGh17bJdlZGF8GeiDSdIFDJ2BE2+ejxq5+hEcUCnXt3XPzzmMLn3kAcDIRJUyJe/Ljo/RnDBxwPSM2gluEnrJqhM2JKWhFZaE4LySWdtslxA+Y1MbOiU1FZn8R4hsIqQxEF5dZAsbq9L7B3bpHj+hKmtB8e1rSQVJC09jcfRunet+bb9+ad+wJtwZRy58xlwqGCtBM4KR2xVjQg3io0UbWUDY9SvFYr7V6siu6IlSR+nDbuxyF7RDIH/WuYqTlYJB0BIWcxfcCmLccI5VlXzQPOuOz6ZuHgAmuPz1WbWsENnPNYbcN4YAx3axwwMT4HTK+LDG9gNYhh6JByrVBWLgak6k6jpeEaxhyEQBqQ2XpRbj68aYrZ4FBxd7W2Ie3Wv+eWR9XC9WiPyP76EqkEUzwmYSxlc0Y2gbCAIrBC7dJSX9Wpxw7SKrN1Dsf+ih0U3pGMftYfAU4KMwADH7IUaqGbd+MEwLCaYFXtyOIUGwgDKhiYOIDUoWPHow8J07WKTniPiYCkpEsyRfPFvhpWsSXzT5zuWFIw5rpRCm9AGNTtSdyAR0Bp6ixNLODSlwXv2WmMzqzUXuXQ+H/sEeG0zAtGERiIaKwT/9iZGRunaxCetJOJIgUqEfhDHl+mo6efPmnfetuTpr/KY6x7EbHaj/qAGEOLcdGbVYoOEZ/bIU17r7UzS3q7DNuM5sk/jKAOFMgUDASvD3i7WUqGIg/pXJ01oI0FdklvGN3qlqOTSSxWynWRJyCDpdJ6Dv+DJ6ZIP0wuftNquPoMiTQI24nEaAJoBnVkOKQRADKrX69a20UWpXTp1WkaOstedilVnoH6nGyAOHj5m7aOjL7dNaDw8zmAir28EsRHoBfNBk9/KIUka8F2EUBUgRohD60Ss8viE+wi2TmHUR3vl4FQuptPoeoc12IVXyfFFP/zKuOpC8JDE2/z4xLOtYxqtZGFGrKvx7okQsFAb9AgfmmewdpFWPTiAgLe9QBUFZ8TpwtCTT8QBu78b9kJdB130j+8+vWAV1ZlRzfuAog3SvQG9+o7qKoWDAas6vAKOjpEETaS/gGphmwPrx7gITo/HbXN5ELDBQ9cUGIHGDnSNmAzBJUfQiunm+jNEtMK3U1ZtaC6a9oMh6DDmQdyIr9TgU5ugmmt0FCgaY0MbrwwLKgoJIeClMqH5KbYAEB9b9SThxUM3JDWf/WrahPMpYB7/zxAIDSNHBizYP528bEvzsKhHm0RGwZKIE/kCYixhgK4Mdc1f4DqE7JQP465qwFZD4QyfASAi+LniCQ8z6nuExf3ytznDSWVgZp/J+Eo7/veZfDn9uRm3GhJ2MYNWh/pdYHFX8tQEhV8RYoIYiJY4TIAP9uvQRQAPqaZuvL5Y110fc/yhB1MHU0V+eHid/mswkRTJfOdf82IiYnonavRWnP/Q0viEgolapdcSEHFiCOk95siPw3S4Jq5OY3ctKZAL39Q9nih8Kv24qUWnv7ZkRhvsckRt9RIJ5UebPnhovgBHfeeXiHEAaCjTqhIRYdI1lcI2fPTMUjKGiBlgHv9PEQgNHsMxTbJqHZy/6d1bGnV4uEtYvJsjJikx8CMkXfa3DgrnzlizwHwKIw/eCI5VYKzRpO0Z1vC9d+ZvvnW00JMfDQVCVk0+hwWEEEDS2X+bNLCPMXGXZNDrQV2kTnnAmTlQ/rzX/EXw4AMKIjzBG4NVWYwIN+l6hifu6nfL0BvHd+5v9UeBqQ0PmEiGl8Zn54y1x/u17NI7OSKxGOs8Hb3MFdVymLiZ+JqhCZ6RKqNxJsIjKQ5tjd5hSBKpSqWjnfEUcPHXnpp8pkNis16djNEWhcQ3TmOhLCFvgK6CNxLiLuBH23yeiS68cE7VNDCaNLfFNH5u37xNT/NimEj6Js85qMkYJ+43r0IK/RE+ONgGONEDwE79AAP9DYmHxAenTB8/9x+De/yp9Y2aqNcaSHpZi4BgOJkHDz+qlN7XwieBVDBZDwLAAl3l31joYmowqWgfSEPSWaZhhk4RH2bSdtZFHu+X2PovGbPXDiMzKl+U1wqPEwCXiIaIZDDOZOxesLFfL0P83Jb6CNiltDgKJotQc0gl8xAsvE0IDz3ZwgELfQgeIswqeOh99/QuEQlPSAAABIhJREFUFsyoAkfPCKNR294YVXp7fPMZ+82b+q0fPNhFxJFeT5BvGh8iko+enp85avioNnfEtni1rSlaNtL4oDmMD8AhPBE8/jHwQhVD9wkWvlikBSP/0D16FoAdY4l+0FILwRAUkC7qQi9pgWCQwmFhdHvy+dj43aoywMUJlm+mLs964JYBHfuaEr6J0Rs1IBS8AjAAB/PBgTkhIwSNCW8X3/Sb5g/w0Dhy/Ab8ZMgQFaz66DRmn+jGx3sltkj5asrzpAaT2yn4k09JEBpMfXh/UZiYTO95I/L9IyVSHARYLYxljpWWtR/OYBhIkhDX2gfiTjQBlP+BF8ztLlhynwJtPISXlTYrAc7RC0KxJ4BxwbTjBaY+nkeoh3HSG4ACWMFiP8EEjpSEo9haSfy2QXjMa/+cvhrvg0PCglzdsYMW8yhUfyIiwYcT+rBXV7e5XHBxWrGjckiB19moDIo03j7na5eYGSIucpgIDqIfHWChPUo8o32DCKCpzqtURmr1P7eNa7y13w09XqWX0RAE1dupH6KaMWsnf7y53dEzJ54stVTcU+yyd7Tg2Hk52saaH21DDmCjlCtHBEd1PKLxo6SH6Zhgx3hFYDx1GJFoBbYGrbbEIGnOmzTaIxjLHexSwacZG9OtICggKf76U0q1uRq4fGqKxVU5qcRh718seCNssJB7uOEW40FjQ/yN4OBCAL9xBoT/xj0sZFgcjOp6D7sUExa5Jykq+s2vJj33FW8GTNNvog40y4R2sx59tMLjbo8KsJFDS8s/TsILtIkzhWPBujV3zf/9gNnHxlkdNabeDpkJMVkGymVwQvlaVfVvrF3Y8UxxTle9TroJQVs6ny4rEpITmnaxed0Son+Q/0/5wdLLZzvFNihzOpyHGsfEH+/cqtORVUOfOB1oLKXahAbuXcM3TL8p2HDzwfJFXp7p9Y82984pyE02GAwdL1sqWoAgjE1jEjva3E5IDXQeEF22lJ0oV7zWznFJlYUVJXtjImMPtWrY6Ai8B3zcGA0TF+aS8xqAqJ6FTMAChQfyw0TPiIArKgpvvVRe3DbMaOyxJ/+idHN847Y2xRtd5nLIThAzaSi01xRvCNOEa3Xlh8vyT/dq0EK+WFr4c+voBLsqSQdbN2ha1LB9m7Pm3oO5N261dgkPq4gjcJ/PFbm0+4O6jXn77cQzuYdvvVxZ1DnCFHbDibKimBtiGrSGq3i0TfaQBiCGSTpvZtGlY4mRMSoOph/DnsnJxlHxh3t0v/EwXi1e9RoPf1AMPzUHWgStX/n5B/9VTSz+Kz2pTSi16/i6pCSy4OJFURerEfo06+po6YvuVzubCMIQM6pZhmpnuJbrq8Hy3oULMVZvEcLBMBaeoBMfad4Nv4IkmG1TOiOuGbl6X4MUC1JD1S2CCQTLXV2qblb7cV5VDR/s+sp4/vIlpfDSZaEczxJMBrVHpy7iw7feE2q8AjVwxpDCUsiQQkhahzgCGembq6wb0wVYyTlTq/6M4Nh98agRb9RV7JUaoX2zcIXM2dXzVP2GhE8dx1/5QZI7aJv/H+y6kJy2/hwbAAAAAElFTkSuQmCC"},{"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,iVBORw0KGgoAAAANSUhEUgAAAMgAAAA2CAYAAACCwNb3AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAcppVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+UGFpbnQuTkVUIHYzLjMwPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgofPyfmAABAAElEQVR4AeW9B4AURfY/Xt3TEzdHYMk5I7KICKILhwE8DCe7eieiomRByRmGjKCAIHhgjl+PNUc4UVZEggKSdsmwsMuyOU0O3f3/vJqZZcPMgnfeHf5/BbMz3V3hVdVL9erVa6HNhEciCxS7VtBJKvsDJlWUxCjFa8tdk+6oD/zU1ZOMhyttYXYmK1EhMlbgfnudQWgd161y8+jRnhDZgt6+ZdIkY0nU71N/ijlFyjBneAMNTX/3lSZH8k51u1RR0i3KFHZTvrUy9qy13NWvVbtebkWJ0agq0yusdH9+zv5u0Ym4YgfCw0wHY6Lj93zw5Iw8fz2C2WymjxKo91q/U8xmwGOugufhDUuaFpcV9XJ53T0kSUo+VFooJIaHxSXGxifbnE4lwWASL5cUHRA1YmmEVn/Crsjfx2gjD26f+dzFQJu16wzcv4ZvAWU1AXhUVRWGvrSwvdNj73uxorhNpGTofryiSDIJGm2HpOZ9y1wOKdxoYnar9ezlyuKzbSITbSqTf0mMitvfuVW7febBwyp5mykpEtuxQ2aCUIMOhEaTH/qkQHEOEgShHE801wDg9ZNFELwiY4lhXmFWxbqPVzIgFquGWARoYCJ6zRsz/YS9eLmLqYUCE6SanVDQcZHZFK/S0RQZ0a998p2bhz+zK3XLFk16WppcM2+tK3+bzab9dXqx4lmuoH7G6yc8BHQ8+euXPUq3sNiI/sm33vniX54MVr/AUlNFlp4uY+LFQatn/i2nrDDV7XGnWEQlslRRmFslcFSmEUQmW0DSCtEDkkYjaMIjQP4K00sSixAEZnSzypjwyB/ijNEv7pix8jvKVpv46F49qQY8dzw3+eFiS8UTZV5H3wqmGB3AFpfHwzSihsn4ZjYrANMIzOtVWUSEwACHiH9hBItXsbUMiz5q0Bs3Z8x68U3gG8Etms1mhs81EW31+Xj2/15u8ePJQ0MdLucjFtndzY4JLGcKk71eJogiU1VUSeMjAEhZVpnBIIh6I3IoLAxwxSoahju5kTrjBze37v76xuHjj9M4ABaCqQoeSRZZnKLX6ZnL24CJAo29L+HndZcCsAUAAzKoJgNTLe5wfivPUgdqS14ev2cTvOF2o1b02uwNGQawdhIxcEzxMlmnZS7Fq6/9POS1v02rIKN+CVTmRP0BMK7QFq9f9TJFr2Gq7KlbPzghZhP/0+XUF+c/0Hn248suM1eHMsDE3G7MiwAABUUEshHXlAVZNRjCNRgS0Dv+qEx1uj2YTgFI62Iuqk9kkTkO75A4Z+WQ3gvHfZPcptPYDY88fSGllkQI2jcqj7aIWAmeboDnEuAplQGLB/3i8DBFgzyyCiIBxmvDIjWEWVoUdCqKrLhloKnMLCB2C+ik0F7SO8yl7d1yxrBpf14zd/6Xk5Z8CGRk1RE/KCy4mboltYpZ3WoeN/Orw7tm54tyhMXtBAFgFDAk6LpK40NEIAJ+ozFSQ2oApgMPMbser0Izb0MZG7IC6CaS4J5qObFv8i2Lx5n3zNu4mIgjNRVtod8EC8ZTcDMvuqUyD2c/CrCOPsSKrrdPADb/N6bPrQHsXoFh1pCSImqTEItISuL38Ac4RdOH/tII1voncJYjYAyIO0uU8dqSv01JEWWR1w9YatVN17x+jLEqY9xFQvZqyYeMKk1wj/mjVu68fPrjLE9lhzK73Su4vV5R0CjAP8J9AKZKQF2S9JJTVQQXUNCFqaLfdI+eUz4BhVBEofIlDoey11Yw6LvMX44OXD+vawbUJSKSahDU/AkuCrygcVP7LRy7cmfB6Y+PeiwdSh12r+hRILUFFXjI4ZH97eFbAxgg4RRmg5Sja9As2uDwiETAohe6sNPpzVbtHQ8VZ6cPWDZpM4idIz4RSU0grlz5iCNdNn/9bpOOsx//6ainbPlppyXCYnd60EMZRKFidDSB8aE2MRoamx8eECvzKIpI8ND4YCwlEWJGVETF63B7TtnKxJ/txYtuXTx+16a8/SYiDhAK56KiqoCSiFOAygHSH+OjchkAWAXZi5HHyISUIIFhJlGPAaREncVFrQ/q5GPgyxMo9tu+r1a/jyHVrRMzRjdbTRu2MdNbOa3Abge5qSAMkRaGErQoTO5vSxy7feWADCAXj+w+4ayIyL6UvWfEO2vbE5EQ4gWpVWBmM2+uzYxhG391l00rsNkUjax4UQ1xDvpw6glSNuQtVEhcAcQrSBr0Ldda6f3eljdyyJrZu8+rqoFU2QBSVq8kQBxzvtjS+Lv9Px077i7vU2FzeCTONJgWCE9S6zfBQ51DGXw4zmslUaPKDrd7l62g73tvvfVPah+wUBbQXSCBewV+Xu/fYAHgCYpXlURje8HA+sY32U0wpw5sRZ2qJ/072F9PtVWPfnv9yaNGaVFc6b1o/OwigzLW5XC4RfB+dIS4YNBEtykLvmX6gMNx1SFoZtykjJhcHRiJ+4xiDTt5/uR7lDc9jasRVF31RDih3r746XVnRPdYq9XhAa8lFSWkFYeLs2rw0PxcQazqVft+Q0hLQEqJWR2ub0rO9Rr13OS36AmQ0pfhyl/BDyP7cu/WLT9WXI4CIC6wE60XyB0KYYn7EQw0NvTxDeeVSmv/ghILDsJ0zOlxHbQW9U1Z9sxMypMCY8CVfpCAv84TAQiAsQT0irHGMKlnWMLOlHY9222d9+LnGF0xMJjXeTeqgZelObB5s2fYaytuyLWVLbVUWsHSBHDF0HMBJIdAgaKmyiIYhEbVajRQHkRonRwhqlVe5yfK6Zhbdp/3WJL/+tKSxygDIUEgI36T2iU//PKSBy54LROY3eEFonGJEchT+5sQELCAW3lFgoVggiYlKqqCZTDRVfAEBGfIqpdtDvdhW3HavS/MHoacih8GXigA213PTZ+RLTj7QP11oz19KMLw4wcWBjLDarIKHhLG0A5kiJlQRblE0Yii1upwsNPlhdOe/eSN6AxI2dB6aPB+/c/ukjLrRSdVrSS1l6K8rWIbzPxm6soX9hNEWFQxsznkZPzPgL5Kw+lZmTzHpYL853NVF1mDvNDdSaIETdBPyIwgJphMrLFoLHeJ4gmnwJwGr9zIpnrbX3TbgZIYI6gdwSog8QrVRJPnsLELxbljcPkWkKBK6hJCULn9F08ty3ZZAI8kAJEJ7+okugkVX1Z1oqa9IYpFSYZLxbLnrB4EHmEQOhaqzuhsu4X0GBkaJBkT6iQiEp0gSYXWCnZe0ax87cSJz57s0AFrelriMJYBK+XML9+L2fLj19MrXDbAI0qygppqQRTQr/AE+CFqWmjDWEPJdKlYkc/qYTvQKkrHE15rtBPGDqjaCqmstesg4GA6BCEJHouWxR7OPDwCt1Zf9wTCRRwZDmVFig8Ll9rronZ1btd95Oa/jT5BnRq1aZQ26XKSbE5Pp8s/VjKnu4dvfqHdj2cPDmQON1iqJjRxQGUgztwjIrG8fVKLme2bdP/IPGRIMXV4h6pKmzetGCiez1ybrdrai2ReCWGy53q3W2aXHRW9xr2zoc3GR8efMUP6ZkA4E4H0mDd6WKantAMQ2wOWGxQejp/YTGBaQXNrRMN9PVp0WnRrcv+daZ07WwmeV7Zvb7Dn3C99ThfmLdxrKejqcblBJCwokcCiAQOf4AGDaPRO+ktpKP5a/4ULNSn4kQFt4fDpQ8PKtUoscwIeFfDUIg5k4wnEoej1Ok0PU/zOlo2bzRvcJeXQsN69+R7H6q1bY7cf3fH40aILz+W4HbQmA20HrwmcRayElatMqHwQFfsIhNokkiUqp8/1kgJSA7JY6qCPltvEN5n15eRlq34CgKS7D/lrkmrub/Zt6AUsQfUC/5/u3W+v/1LZpbuLNaThk/SAhTRIIh3aq8hi1/D40sE33d5zyb3Dz1fLJvQHp8X11nFbNqTsPPLz6WPW0nDsitCOSR10AoSwP4leu8Sky2X5t6HcmQw/cVCdHtU93eXlZlsxlEhGHV4Rmy3Jxrivds3f+OddKLeOCvvaU0cOHFiA35/Qp8u8EVuOqRWpqkcmGIMyZEgGsczlZOWSnbj2ayBUhaX6YL9YVDiwFGZrvi4LNbywNGNRpmkhmf6xZ8HGh/egkvfxQaL+q5PvvrsU36v/vHZ2sT3/3FslDrsCI1ZQgqXRYW4vc0ieHpM/fb2pCAEKoSzTfhN2d1RYKtB5iPI6I0vN/ZcStc23m2A4iQsPl26LarL7js59uhFxEAijNm3SHkg6RcThXfPrjugR61bcAAoH+MHVgf8S2GjmGkat1iTLLvdtFtlDa6ughekmdhOUOKhVLWOT5hBxtDA/biCu72+Q97vJpFTjxrTx+S1ik9ZqDUZSF4Lit695US2DmeNs8eVmNDbG2BKukt29fOZNpR5nV5j98TS4moaMqEKR2jJ95Z9vuYsQGnsUZh2pRfhJ1dNuvTho3QS+1zPqnqFPddSGV0Ifk3xlqUTNhA5AiiisyGG/cdimpY3wVGHpTF51eFsYiLkP9AcMTjWDUrXiGAQY6BVNG63JPbB///H0KNVcAx5mVvlYSV8+u+ztFrqwnxnUMN/WSLWK/D99kkWQKwXFcPLsmTaiVhCiI8LDWJTRqDcYjRLp+DDaY59FhewTvFho1ZrSupX+nncg/kCrEKeiIHU0xSm3xbecuXPu+r7rh43JIqlh3mGWuBsIdswnvb2+Z/rnW07+cPEILfBY8ujRQTnUFfiC4uCVx/+1X1fALHDbmnOFiMvwugAAYiIAKRrbHs0aNfyccjzOWriBhJhLv8AHc7jlFt9eUKwx8uNGfPtBqWaBqVkvYQd251miKbwjPfnm4Bd8YByCc+glEYxegCG2ZpGqKzzwag0G1jKu4Wvmu/5S2NmcqktPM7uxzggUUQm2byaud9Gzib0HV0YbIzYzgx5snv7XTT6kZF6HRjWWlFfcHMhx+Kefm5TarTGcJEMxP5IeOokl6iP+uWHgYyUshUnp5hrwMLNgVoA7vI/Nw+K+MWFfHAyAxq9O4p3ARnIxNkTPFeVqxJYxCa8PiG258e5mXV9INias6qgJ/6CjIfJiQ/jTKFBtZOw0wJ6GvTj/ZNSp8ve5QdDjQ7wLi9Bw7W3RTffendy32yfPLnmOWiDCOHDKJzWIWw1dM3fZtuO//LLbXZJ41mUnNypGUoW+r+uETmKfkLqLPn0RD4W4DXFIrA5JItRJWhp94EDTsJiKOwbegVUvYwsWLKjTz/TULXzCW7VsfSFaZ6gAvRHL5WzdP7ZcRPGGaaihKlR63MStGXszmyOuxW4Dt5ZDwsIBVGVNM1HPGic2+YiKduqUGhTp6VkCK/IhocC2x3DvHp+ptDY8PpgE1QmI7R7XjVSWUqGlvJlghHWa1jscPfjtGn+wZlc1ko5l2yy/0IPkdj5CqJEJF60GlnFYPFpxN8QSRkbl/hTBYVHVaK2O9WzV8SZp9+z1L9eubMOOHeGf/rqtTwerdVShtvLBLNkmwRUFLEmEiST4RNau47dck+kSSp7CtDqpoSxYbghLmLdtzpoXd6ISkhqtBg5UzP3TSIdlE7as63X7kgmvHnaWdK2wV3r0hjCtEXtP5b+lwesk78nLeczicQFryD2i/kRbfY3j24dERtTBicZ8d1pph1mPncL1TbASkYcBV5+q187VL1XQFNtt8NPgyUPqzKtb3msDoy2KYlfA7+JVvRzNE0hbjBT1l4Y9dv+B1x6fxNJTU0OCnsJSlAwstVtFJOWcLy30YIqx5Q3vD/ytqpegpiswYbvi1f5QcM4VeJZVVuAppi6AcOpwhECmQHHsi9OtgOdEtcf+n6n4TmftW7TzZlcUsSK53KtIZDEOUrOqeuxeWSorq9BLJAYzs4tE9mYGLXb5BIzv35+sEbSj+M9Rb6+92XQua062UDmk2GmHSijC2hp60whlri0BLr9hwItFkBRpNIpNmWFr1+ZtR30wfm4OVZICuzwGWD2QtpnDdf+auQt2HP3VfMyONZfMPEbRoDqAFxoRmiClIL5Y/P51+kfr8cCRgSboCr7UBhXrDzwUWYndEvvl1+mReG6vnSdwHdh1LrDZ5YjYKKY4XXpy3KudYMORnGDMsaIp6pz/4eG9+9s7ZW9DqHtggcH1fWCgQlt8UcawrP5CSyIu0EzovQ7zArPKzIyVll7OpU6YwsM0vt29uv3FxolUqZfYPbFN+37lhwlrC0g6/0WIL/RO8GIN1zYirttl5MnIMAfN2TkrSyU7p+xwZju8biZEROrDMa5ByANbRbIUGxnGEqIidFImTI1UI9QWcep7mzpl5meHaXUaTaw+qqilLuGSefgT+/D43j+vmzv0QkHeO0edZQb4FcENglwgqOS/lrA5S3tbCqzUUhuN0ZNgjHp69/yXNtPOQDJMt61iBip+T1p15JurO2deOPvmpwWnejJs5EgaiXQSER1VI/SRLNotlnOsCeKL9a9B9x8sVW3M4JKtMYq+tWsoTABnAIoI3suy0/TrmaMDANn7PTfztZbPelcNVJ+aJbBBbbq+ZxO9hyEGHGguCIUAqWUlXK8z7uT7SKijwFYebyfsBcLj75VFUrX6AQtOF8CZk6kH+G1zCtxSMqrlqPXTj9w3J9/pjck5+LzV6w6DixgEGCRILajgOgDlmpliJOPeQC1hBqNY7oF/F19ehaQUDbwzWaFUOYg299Y+8EQ51kA1PHKpPtzjI7/m0w25D/T7y7LOTIgig5RaXZoFGobjI9xOw+Ni476Q0jYt7X+5KO+xtnOHJ+tVsVO54hG14DqwbFX8qjMU9l024ecoKfyDLycu+XDjkR+/e/3Dd77b7yi+UXV7PXzjhtTKkLAHWrzyzRUBAIbdGikcA9CM6bcP7N570rqHxx5DLhFOa0JR1kY1fbRPavRbOnHCP7N+eeECc2NmvF6dRivCIQ6dVaRWkdGsbXiDtU927vViGvsHRiGDS5orrV2HvzBWWHLwdHO/uyt/PLWvCEgZidUC+lRN9fCDTrNKfodFLuzwFufM26+q6T0FwROQFv5svi+fmiW8P3H+SzXu13NBKizt5oczqYeH89N6fI4g7eJFibWIiLOSKTUF/yDh66ndx6CxX0P8a2Z9Gas/C7jkd4lvarPmnYTnLVc2gnJ7SDVohKL3hNcerj/00wzUM+vdkn1kLq9S1fx1cwJh6ZnuT9Iz51Rvr77f0i/ZJ5df0Mk3K9hdhTM9VQKbGlZUWimKuZ1RTHC2jWKlj7SfOfzEt//8buT+RZt79F487h8XvZa0vLJyGdwc2g55btafiIZASVho4D9O2TRmOkfTsPgpe+etfzmLveWXGmUkNUiXVB9at7j1iaLzmw/biwZUum1ctQNBCm7sBxhNRrGLLvJs15btR77+2JQd26hp4kpXLCl057pNosYne59o2dLZc9HYo8xjaa14sLdHDpNBEje5Kqr3nNveYeayKaQp3E9uNVwF9e9+VyumEvGc2x4jhtbHcVQCxwBo4VqU5fN2/i7/vNbJFVUSI6FmUxXhjsysLvtBai+hU2aojNXA8f0kWKnN+mDKwPNUrDexrpFhemK9OnY6fvzyubI8puJQmIA9iBCsmPxVXV52Xq2Y2X3+qIOHFm1OB+1K5hSzAslB+FQjEQFa8trVCwvBOiQpSZZK3A6rip1VLHHsilZnitPpJZOXlUZodBcahkcVV7isF42SvvsFe2nDS56SH/ssHL9+97wND/35hZn5Lpd7YokHqijWAzjAQ6ZhLqQDfJATBawMWPPBWwfre0HRRhtNYpKo294uvuXITyeZswG5iMETMy5jrTHaJwFSVkwcvzc3a/UFwaNDx2F4kDRwV1YVDXbT4U6UHNVk7UvTV81sKwguNipZyzbtJ6K+5smqMVr/44sG+oi9Ea6y+y0uaDb1SGLghuR0ueTtpefu67vw6S3PjJjxWFrTpo5giOD3SbuqND2wGZ1PSefqVK+Yhk22l+fysxN1MArZCDTMLzOCITpNOv86KBV3iV6vnjLqEnLQQumbCSiexJl3pFXcMO/Jg2Cof1Khc+BuHYODPy9QTFQqvR4x2162ZfDKaU9/PX3VBjPWI34JSTK7Cj8y+KG6DH/R0F+kR4pGYmfovU6vM7XWhh3pG9vs2ZQuPTpmLX+rx/dz1t15YNHrT+2a/3LPnOf/0aR1XEIXtOKcuOkF85dTVjzTPizhTzeYYs4nhIdpZQ3cjqHPYQwhJEio0F4VllmgDxCHGGnSa1vrwktuDEscn7X0rTuIOAh4UqkweOAYGd5H317Vsvu8kd8eqix66YLHphPdMihE1Higk5hMBm1yWMLJGxu2uHHbjOcnEXGQmwkrgwfvdUMcVXMQetRrZenYqPFXTRRoBIoXi5HQFELFyKcJ29vyT47C1FWbF2U++eoLf4KG4+Vckk42htorCA0NVrU+xDHpjB3JggUOFxQILtowuZGilrU2RIZC1Ppa+k3PiGlSAb3W8EGEXgeEAlaFSIS/tHdHG9zlXhc7UJn3Um/z6A9mbX8rjtRHFFNRX9B1VYgqq25LDqZGNtaHsWbayAV7zBsWna16xAdKYljNsEzfJtT/jZpPa+jpw7ZsCB+1aUXU5tEzv9+Wn991yRsr/tpEY32yzGnvbmFeg42GGDMaBmNIGCY0wRBxLjLC9O7tbZL/bv7LcBxJZQIAxiBnqOl+C9WdK6eN3Z15ZM1Z1a7HVr8Hbj4i7II43SSL7SJjWfuoRi+Pnbpi0mAQBhEWierNo7lzXQDl/K1e6cB//1dQ3KoJRrUsgyZM0D8//JljtywY8yFTHEMVl0Im0KDuJlQJ7ygdlsLRwV/chS0rsj3b+5jHru/TqtuS54ePLSS1hBAh4xq5NQfMLwTyLGXw5MOGNqFi0OQbXnj3gpmaAmMeNOfvcRN94IAM7nD723n7P55nEYVmIF5iuJxwgrVBzyBJ1AKrRS4yeh4q2Lat/4DlExd8N/PFTWAuJEWwxk2tcqEPVkfte1JnQ/SeyPCoWdtmrNxBD8nsa2gUA3WHU54HxMGwMNQ+vH6i2KTUIjRt1VkzPm08d0qj/Hc1bGjD16v0eeL1F5rm5l+68bylNAq2W2+rqDhvUmzMkXfGzj1LAFID5AZQBIL3D4A6/r2Xmu8/dXTzLxW5d5ZhrQFB5KFVlwdrDZPJKNxgiM7u1qrjqE2PPvvtF9Oe4wiAatQAEvQyjx5ThrPHp1/44O/cq9d/VBJ5rvsU3i9OZesZ69C8zYKi07ahZ9RyrQYjgEMM1cioZjf8RKKVVFE+VVEinjLpJ1hP7XtyyJqZyx59dvmKNB8iCECE3+T+X+ay+4REzeaqrgIAgUszA/uXmHFVXdf4g3N9c1qa+5aF4xYVOYteddnh9EgUUE8FEDOURVIdHs95wZnocAovd5r72JN3rZw5b9v0FVuhfgIJmcbcGQ4oQdYntauW9izeNInfhIhO7TQOHJ1vyCk7zp83rP1403155cUDxywa3T+3olS4ALNsg2MHNL0WjKqINoXtjo+I/eT9cfO2+yvVvDFiSg5+04enbP/3u+PmCeQ/FNdIJ6ePNnOzMj26Z83MUd9m7nvxlGw3wFTn1SFCCYIS0FxoEnRGlhzXbMP8KSun9REErmunpJhZRiYWhiCCOV+81XjfsV83HXCX3lMhO5fzpmLO0SSHYoE8y/X1pxNUS7P0xoipWXesmjolX/C8YLU5vHBO1F6tE9gE1GgkEBPU0CPuUlOmbFuSPWfEiLSXFi3d8vT81/k6JCUFC9WUoAvVK+PgEyFwhvSLqCtP6v7CBhi0AoPBRyB+4VM32+90hzNBMxPhgPhaz3kj0341Vtwpk886HW6qJ3FdDJIY/otKfrlVzteKPa2Vl77pYR71TZQhZtqOmc9hd8PMGKmlCzL4WfZQ1VFPObcpyuqME2a+CB7DXl7+4PS3lq3K8dpb5sOTEvv/IEuYfoG6uR4Hy1UdQEND94YVheNaz3jkwI3N2i77cLz5Y2pk5OZVD2c7Cg98+8yq09UaVbPNbzqzcWMLDu289vy0O3LKC6fvK7pwW7EDm4+QGhKOCUOzwqLIIPUNS8xp3bTF8DefmJaxdeoq7tJ+6nJSldS4dcnEB9L3fPfqKa89FuCzSFjEuF/zH2EfpNqg8J8+dUj8dtrzq29bMrHPLjX/QdnhcsMnTcdtXQHWXbscroHSeEqIICmywysf1ZS3ys8/8doN80c80alhm7n/N272D+aMjGtSu7Bg5LUFaYbf4mAgCzaKoePVI0Fo7ZCZWQ/UoVrw3Td37lyDs5uZ798dXe8YVrb/i1/O6rzNNR4VuyOqtj5JQrWhT3QYEschVTmnsoLl6G2Dmjosg25fOuHNbm1vnL4+bUQRqvcHhPAFafBBceWvBDEjcGpKT+eesVu3f7Pup0vHHz1vh/OGLHi02PsENKBHURuF8C4NdAa3Tqu7iGNblXbVo4nQSD1OluR9NHDZM1+2a9Pur0qlO8dl83zUY8EoS5Sg2WbXas7FR0brC4sKaQvjxkXzRtxazjwdc3G4B34/Xh1UCjc6gnMBmg7RcayhKfr5V2asmUuLcFprkJvJZh/hKrTo+ipj55oTtuJHi5028liwa416k12mg2Z/3ARjBk4ICWzn3HVDsbj8PEuqHFJpteE0G05Q1Yu2vj5jt500H5hbBLnIalOKdK5biy4ey+i9ZPwbKd37TFnx50fKSK0Adwpp0OC+v/UtvfkIKwzno5hJbwiVk86zh1xMX8sM+c/1UGsc/4Gf/JTh8rS0oj8tnX2zq+LCz7kaWzOsKMBEmO5qjfmf4ywahggHanJUm5RjcT+e/2vZ0LQX5y/b8syi5fWYzBkRCK9j+N+X3PfuZ+9vOuCqaICzwrIRZ3dcGHEEsdA2NUWwhobIH2D23ZwQ3XDv3U8MvZwmwMSINPOnbYk/HdjXqMBe8UR5acXrI/9y34jPM/akZJ069tkptXJhCaQCKyghxzjf1o0b1wocbMCJsOTSubUia2g0MhgKDndq1PaZd0ZN/6HtzLVVUiMg1R57ZdmT2zJ+WHPEUxkBdUzWI96RCwEt3NiCbaLXm3IJGNi2ySzzR0sgDuKafPd3r3nTvbctfvrVXTrvk16ckQC3plOG9bDsK72l/ShIHg04midPsUn5gvxE5U9bBz+wes7oTyYv/QxmMOCvr50rpa7tF5kkmUarKbBUuAut5eepVBbcN6pKQxUCN1ZaTXlwZoHKegC9wQFDL6iryvl/kJ9XpaKYUlt1OZj+zOIVuE3qMsfNDEhZ8q74bvSygtQNK2/OKTq/e6+jqKUKtRwqH/yPr96On1AomomKmETek4IlvKTo7LIBSyfe36lt14dfSht5nqtcteKqSbM+fitu/5nDz+/KPfn4ORu5/Ekeg06rcXghNySdlGyIq+zStO2Et0bOfNvfF/b6CL5sIS4ij+17F1ml6PPs6i1bjF9+uyNxDWIv4brfk68+f1tW7pkxFcw5yCZqoitxZsapk5heo9HpoB800Ohko1b/U1xY5GvfTF/1Nvdf8G3wMPNobsVQEOol8suff1z//cXjw3Os5RSSB3suGhGxq3CQQW+41ZhwuXPrlp9tYh8wMzZ2zGj4j5iAuLRW4ESyc95LT93/wsyzZ8oLlx2zlUp04g4UIiGCC+fj9fXPhwiQ97QtBX09izkaOMtzP+23ZMKyH+eun1O9nbr1hK6elAjEWRDOuu2Vq1aNJrcnhrquEEhmKgqnMxxxHGqL1CULDuzLExO8xsT1JY0Gu9RqKxQhAqkBDBmNUrBeSx8/PX+Hqnaas3jsO2c05UMLrdhEhusRtttCBpWoDgLGByYQHOpgGqXYavV+77T1unyo8vi9G+c/+Pm4RV8hL8frQBlp+6+73vmV2Qd5Ky0eHRzRPJD2cFoTm4RHiV0iGnwx4OYBo6b3vyefCsICpUlvlKcyn4WLryM3wcIFWzPLcbnEyWlpJFUuBCp/7ampO/F7J4VsuVSc0+d0fk4UNnLcjQzhUuPwuLJ2DRofWfXw6LOB/HQQ6tTly8RNgf2M3bl6zpD3f9y2+bTqaqg6XF69Ros4UAhvBXWsdUQ06xjd5I3RUyY8PURIslOwL5TjMAXq+6N9A354CkLb6i9oPp2yYvnYd9ftMJ469topT0WnChvWajh1CM5MQRSumqCjE4LpcAZdPldRouaHu2YPWD65+/ezVt9D7eDDibFmRVfwveZ9UCcQy4v16A0RCfFpc99rN+eBRw5hDwuWspqRJ+HcVMps8NaSVSdgDaWK1a4ePADTqnoN2KmEJ2rwlAG8IC+B/ohLhxypd6+c9vhlofiVw+4KCYGvEL0E0SYhRYOXrnkXIfywPBF0Gq/gOe4p0dsvyV8O37hkztvj5i7j6igObFEJKctaZvLCUcQAlcopexDkFYsKfYKla6M2z7w1bvYbW9kL1Z0HuQVqxpa3m2XmZD3icrvuenH+iKRchxXAwUQ873FNpNZ4IiI8Ymuflh2/Nj/wRDY1snRI2iV8VW250kXASY4lM23KELMmg2V4A/FwZ3y7JerggT2vZpZeHHrJSctv0aMXtBqXjHPbBkg1Y3Rej2YdR78yYsqXX05dzhehOCTDiQqZ/9CJ1C10wEseAi8Pm7gXBNN10Mpp888qebNPq07ovbKMdSGc2eDeU4PHBu82XK/BVrSqHdFDvpdzB6csfebrjDkvDiYi4RuLaWm+gldh9tDO4KSlyCYj9tJFIYEKBbNiIZPE1Wevl/ZzrglZqS70Gu6nAAIMgK5DJVov+ImbbZ2+6s2ZH723M/zEnjVnbaX35mNdCkqDFVDEfirWZVdJxGiwwajVCpJ8wVIu7C45v/S+tXNLPnt2ySZS6UhqSVhky3YEFHTKLm3DiEjWJTzhq3v63jZy0m0PkhjVpGAR73MD2UxqqHD3qqkrth3NmHpCtotONyxcZP3wi9IyWthLlrZRrvIhRaXFnsHPT3uvS8sb5q18cFjulPdevivfXlnx3sgZVd6aHP4DzJNxwHeufNn2j+P2Hz847ssdX0/K9FTGMI9X1mKMPThgROuNZmGRrH1kwlsjn3jq6bREBAhIYVLquC2qz3fHzKv7/82fzQe4SgGCIcI3j3tn9btJF86vPucoH5Jjo/Nh/LQnnWa/Kpl4oJoBaXSy0+k6oi0e9Kflk5d9N2v1bLawPxA4gYsNEIB/WRx8BGmaaVnghprsUOA++z9MnLjRPhlxVjz4yDn8vO/B9eb7z5fkrTzqKGvr4dFL+Lhdk7SFMqiBe6ByprhArbRY/566aUlm+ui5PHayZCcvKZwN6KpPqOjQoOmU9AmLXtvOXqwuNThnfnjtopt7zB/x+iHZ1km1Yv0lYi1AthOSjdxNhoYPo4x4rBVOh/qrYtX+Klsfz6soSRu6fuHQTs27Hs7c/dkbty8a34BpNf+AC8HppOg4I4hMLrNaYnCm//Z/7PzqT5dke2yx3Y44DdgSod10FQxBpxe6aSPzOzdpNeb9MXM/+3bGmurw+dQqEO/143Ly+2BPBklF9KvzwjTtxkcnn0Gt9963zjywSenltSfcFZ0RmhQaCc7ngC1x/K2nWTLjgtnoSysq5FOKOCv15cXb08fO+56fB4I6gRMOJLfqT5heLwxhdrfPalilEtQsRZIJxAbrSbUNT0gWEo1XJeaaVdV/RW4kFLIUah77aIL5U+T+9J4XZs44W3pp9gmPLRJ+fDIPrH0NahckLTRYrbdQcUsnLpx5B5vj7chrWmokGSJv0IfvfvCuB//ybG8ejUKE1PA7D/qkBiLNLd1bcHJWtgciTIbfuUarBdVp+cFlrhH4OoKR4T+gClIgEgrn6DmkFphckvC1Z89Xz0Ak3pVsfup5l1dYVuq1shOWQkhthZXhAIsVh16YCxJJ0DgwjIicx3TwKGZNEDmxbUTCG08O/NuzPIxLQGrAJR4iUDZ/9UbDvYcyE7cKwhGuMlw3fln1T+41P0V/MsF2Aojw2UTzdpTtAheKMZfUklUnZWc4XHMowNtVTcKQJPD706o5TguLz7+4CvUkY8eML2midXAf8SKuFlA4GLHxe+BBFAe4POCvH6QTWEHpcWCHifAWwsGrqhyqh/xJiUyqbv0uPwJrIOCsRAzlqykrnpvx7aa/h/34y+JKg3fCaUsZ9tkgTXhc4/qbBJFI4ADu0zpnixFznhqH3C+Kt7boOPnHBS/3JeIgvcvvPOgl58GHNiy6CQh9ZJ+tYFa2rVLVyFxs6UAc9XaTBpPy4DyYTo/gecdLCuT91twX+yG85gHzq1MHt+/doYGsec5jd2RX2KzYDoEQQCER0TjC4F/SQGeUmkv6gt7h8R8MaNejz46560YQcXD4xqXSbj93bhyx6flbv96/98KhoouPUtevHrSBcv0xkx8RZEIE6sH3s9b9/b6eKR1vj2i4tQGiTMLED74U+nRfoNeQJBKcEr3FXluPxzYvuxf3udyINYSDrZGtKpCz5jesRGBeAuYVgbK9tEaulbDBR3ewu5kt2Oz5WK6cZF7PGRUfGKpPJUo6B2EN6g/RQq36fuMlEQcxSFK7nrtjdMWBRa9O7JnU9s52hqhTEtatiLZIx06v2jZUUcnpdLIKr2Pq6t1bjNJrY2f/RLBwCrxMLue+g0p9lk1YvDv35FzspmMIFbdGo4H7Awb3NyZEH8f+oFa9VF4h2yLkpZ3mjtCuTHtyIaqZad7/xaIjew/0PF5woV3bqPi2JoMp+uDFcwd6tOhwqVF82+/XwCrGFyxwCUjBgqO6S/zN5vGL/3n2wNxcyBpJ8ZJ9+o8RtKHa+BVlZdXLaKplrfoZQARSu1Y+ODIXDwYNXTt39LGCi38/4ayEoiSA3YS25BCG4AAWy4HX65niy3/DJY+Ugqg2dh8NEImEwCNAi0PCDO/jqAs3LfqRytd89Bh9V6XUVMmTnu6Om/vUykK5YhpzQJSEiP9VVeZf/QFpi60Cj5ksdBlm8f/GzPkW6+aOt+CIRo7WOu5SZbkKAvDFC6vbA94qtCB4bOJMupY1+Xrnz0MkMpvBzYRczjkn+duLi5KPFWW/ftBa3M1ps9ELnOigAm1b/MuJFonQlcVyq022GGUziETIWvK62dyTnzTbiYp3Hq9W+6nA79TOukH9BgjffHxUzsjwwXf/i/OSzxbmvH7IXdLN5bLDumXQGplG4hQSKPdH+b6dAxpiqup04grWVqld9M6MdPVDWF0e2bRid/7JA9vKBU+j+iIrUq1YGsAM5mVFtoqe606f1k9s29Z1oPjiL6JWNxjnu9HOlaYCUPjuCMyBRfqlcgRg4CnoKoQTSqAcvjnqFLuslZIWR0mrPbiGn799bFApCIRgUOg4BNQ6gnV86npzznfOzOWl2LCGeZdi/gStm/qJMkIRwv5UOiz9xfSsoiri6L/kmYV78k/sP+Io6+a0O0lqgJiuvgBEnVdNBBAAE+FnJJ9V7AtwqOUNKjRwxqgoWMa6Ba0AxyMpvhJO4nuf3vJKy9uXPrNx36XT+4+6Ld1cDic24TUKLO6snP37QRsCKBH4DgpP/TeDDnh9RTIQ+A7Pqcmrf8gIUStxh0QgQpsJg/TvjZ55tH+rzilttOEUdoFiYoXsCp1hg64NhwRP84O7PmtJ1eKkOL0bCqWCF+N3cfANbkEsUdUnURlirPRdK9G9K5+YGICCcx2wEwWvuVbpmpdU5Fo+NUv5rzbDTEvShLYS0ieYVwxo1nF+NNR4jA9FwgiZoKpifBAFWfX2kGit8bfNS7tn5Z5/42d7QXebDS7nElRaQf23pEaw1olIMAmiy2b37NPkPX7nc5Oj/zlj9QMDVky596aFY17D+ZGPEsKj9uBo6fksp4PdGRkTVVZp61rutQ/YdvCH4Rc1Xi2kBkUFR9xYbI5gbZpoDGdt9XFlpCemJA1RM5gvnkCw9q/lHhkayKx8LXmr5yGWdfWEajHdsF7z/QEwibWI6j4EngEkAPm9GnUAkzGXWq0olCgLRw9Cz6DvcuSrgWtn1n/jIiL55Gnzqd6Lxj11TnG9objJgy5Inb4GCBAKuCbZ7I4WuHWiS2xjZ0nZRTCbGlX7cgf+whAFWwA5rnamW4G3dwUe+79rVuB/gREd5GCcVGrlDnH57BtrIg7lZ3+Bl/bE4Kg1SYE6c4Ib8C9XI+OMph3fzVo7EqJDxKfGVIBA6Fplo5j2wwmLFicvHH3zAcVzD/kB4m7QJQNwVCPDYKSJ0PaUbl3y9LifL5zYcAaWDZCMb61BC7n/UIK8hfFWoy2ptLh2qMr9nec9+eH3M18YetO8kbkXZfsbZxi8hUsraFfU/ZOlXEch9UsU7E86ET9Kg/NdoqD14ugu0+lYG0OEvY0xcdrWGS9spAHM8KuJQUEn9KtHvvsWoSJzgHMUl5f+Zo3SAGdnpKBNX7kJZRV7RuRgSvfKnY5bj7jKWuG1TGQjD56gDDSTTCwtuX+DA2zzeUw4hfas0xCIBIPE2J55G97qPPexRVleN+LKIpJ5ED8ljkHQsophPTx2+TwflUK7dT+PhYH8fE8wGDSAugIuPjDdc/z4TwTq49INbR+6kCsdt+b1KhDgz1pXePqgo/HWSayBq7KI38g01yEifzfUlCQzmKeZdUxq8Xz+ecs9l9xWKFLBw/7AmwTzIbGLzkpRPF5e9MQZOqiEN3lh3khqhGrE39a//4VFJIX613vwcpZMV9mDPcwjd/6y+JU3zy17W4h0CevaGcLcsUadsViUNSWykwMk0EsYdVpjpM4gtdSFFSXrY1endElu5ScOAqoO0lSH1IAOh8LBqsKQrOWke1rKTL6yQXXs6tUylpnB270hvmkPFUwJ3Cfo+Pluko6psHCNBHs231OoBFMCG1PcuE+vcKvx0eMcP0OM0MTwSPKgbUNlOnXqFLR+PFLJ2Q6zjoA08lcM71oEstXgplS+eiKmHkhNo+Id0UAYVINRCJ7AYwQVOnyUwdSL5zD7+h489793N1/nhFIp4IAqXoCqIKx9rbHh1yoYOliA1ePlpx3gbhSy0YwFCzjTS+7Z+xDOGkFQQqUMabOjakgLRegddLocHA0rKQVnmkPW/7s/ICLBTGjheerOclb26zZ/REG3xq0HvTt6zjPPvP/KsovFF+9xOO39LtrKowvwuq4GEVHaaJ3xAhag27u167ADgZqtXJmCWY9t2nTVoA2t4hsJ53LLKaYT73zwDgmKBpRr0uop/OU3Ph37KkSS7hu1M+UF8fQLa7ag+AVkBFfAe5FdjspThbknqH2OoDAaYY7hN11XHaLlMuQtK8a7MbIunee21fqhSUGBDHbSZb+gMdI5bh6lBvdqJgKQqsZ5f/h7mjgRNUhqdlxbcKYc0Ef7H9fpB6S6KEPquF3ODrtV1cgPstHaCERZs4Xf5wqijS8HaHyoldq10k0ZDKe5MTI+Cw/9a7La2fg1H0r8eqh7ivvzrZ9CXcqPxsE0eudMnXqxVgbfUtQ4nUmQaNr4CAVqCFr9f+amv0kdPCDcR9zOxPILzgN9Fo5b+OLfRprR4uv+D2+8hP/1/dlFXzgaPApHgzdvR8zVa5ggMOpDfJVIfAkDEGxGcVuwwD3/QllRO2oiA//qTT7kUO5fY47+Je9kJ4prC4wOKqi45QRrw0amiNIR9/3Z+slYM8P+hYBXwBKjCJp8BISYtTDcwr2/LTL9WL9pOIPX0ys6MelnRylhVFDMpeawtmHxiD/buXFzdhDXdHio3exHT4OIbyLswK06ayJflEcBUditjd9/86XmyHPCvHChYPbRGy5/j+QbjFvatBf3HbFpSq2kVeM100GrhkkWBILJbEMv2uHnXkIQbGCIvz+zT8L5IWgIcAIJQhzUDM708mPPyISQo//jxBEVG4rQl+WLeCPREVfpgi6zHzvdc+GYBzft3+9XdfxAwhpBrhHUB4aIkGSloOO35i1b6F7QlEKMGinCqM+MxFtNMSoSDUCwzBhEDb1yGd9/mfX16wlkwIC+H3KMkn0RDuFt40q1aBTivMSyA3NRowkgO2IPSyxSMh4fktTTTg8dbtchAZEKMflB4eEVgPhLsHgqtpT2oOsQC2OeFfDyvkIjuJXhveWc/fqe1P5LiyGN1+Vx4A3gVVb1MFF/hHbBOcrVLoFrwAnTiOi9iDXz8ZKcAZTli0Z5dQipZtGMwGXQcQk8DHwjEx+L4akTynASMAcEi0f0ysa6CTdpa14pl12RedkXOlCO1PT0oPNFhEzP9/16qElhZWUsFSUtJljC6l2maPQOj/tQ0MqCFfpP3wMCYSgkuHm5PMecFW3Ouys+XP/JhsNweFz9wJpZt9C5FRioPP5QqcqYj19OTF236HacXPxoy77PJhB8FBCsNpxAcD64bz4x/TT0+CxCALDsegZc9FwQnBG7Dx2ZSXWZM83YK6r5imIsxoWAtyflKagsm0NvJSIVhK6DJVotR2v1LCoi6rvAc63eeDYacaZI+wqVyIXEA4vKZUvpPWiXv9MwxbebXh3hBP/7OJS/vrK0W7a17EZy90WTQeEB4cCipLJYU1jhpEcmFKJtni9WF5YR53vJVV29ww8gHVByIMig02mfSrewsQwX9Jrj489KX8Kg2K4+AiJuHbqbV4r4c/WHkybeGJVNBAKLatCS/CZWdQVwIMipLHiUKkn/cbZUm6nRfG2ryNTT82MXztxXqgMsGFZOYHSzVvLXy8K1xmNBB7BW/v/aJV75RWtMLXRLuQTvCD/mKG2zszRn0vZLp3d//vN35xtPf+hAzLSH9yZNf/jA97/sOrszNzPjsOj4S5bbRtybZYQIXk3uB/Qca4vPyfqFQGBBCYTyYDYlJ4KeHyvNm4wACGlw0nf73TxwHI8jEqlogagvrN/ipz/YZy1qDsswArkER0i+GFQUbQNZ8uD1YB9SO5RwqOknHU0TEL86tvue+v6Cm5GpxXvBa2/xp+emrKC7GT5rHRblgMcHk8r3i/DsRE72y/mw+kGK0JH2oNXiPrR6iUVrTfs7C4IbUhlUythNbTvsivEiGJ8iY0svODrzPuKN58dsxS0HrJg0F8V8rj90pJc8Hoh4fYyKcKsKLpMGr3XnumRQkKh5X6q2hovQGX7G62qIf3CcDWSp/o3BgTu6W71QUTT2kb8v/RNbf8ZlDph6q83XnjXpjmkfvdn3YvHleRVWKxlTeJ+r13Xlt8pM0JQVJu64rgiEAKSRIFcJkDh2lkTFipfFWxAFPdNRHnEJGzdlzHtznuLpccphDS9wO1wqkDkSHq28cyGCNgTeDdGzWYdPuujCIUA9eD1l8ImikDv08tgSBKc4XHD2H7eteHbtpC2bunLQzKR9MPXVzN2xaX9fPLinedSBXZb8h+AsSJEx6hlw+LDptaxpZOzHLzz41AU/ArHnJy/PbKIPzwVq0e5CSKIlkCrsDnVXSc7UWxaPfRMB9rp8rZ7WgzgU+mQiEMbjr6xKgTXwp1/txX1w9loOtuinMaJe005iks7EmkQlfkb3Elhn1JMirfjr2OxYbfg38KCj29Co6iaaH6ynJBzgUg+V5i0euOzZdUu3v98AjIT7x2UQ8UI1RTYO1/gPXupx7+qZY6DQPKa4oL4GMUbUbcV3J8Jg3BpLQW7grhR8ttAIuiTh5brnnFZ2MPvkt/esnTV75idvtOA10Pig9LKdWxIeXDd37PeHf9px1mM3IrQSef8FrRIMEuSoSs2Z3jage999QsKUh74v0sj9/ZPsE4c++K6rvxLUAnSqKtAHNAR6fRwhntZk95qt6z5eyBHPNznBYKe+yX0Wj3t3t6XgERy2h5EodJA2ag97SWAlBrGLFg6zsnwEQZmsOrjdRGh17bJdlZGF8GeiDSdIFDJ2BE2+ejxq5+hEcUCnXt3XPzzmMLn3kAcDIRJUyJe/Ljo/RnDBxwPSM2gluEnrJqhM2JKWhFZaE4LySWdtslxA+Y1MbOiU1FZn8R4hsIqQxEF5dZAsbq9L7B3bpHj+hKmtB8e1rSQVJC09jcfRunet+bb9+ad+wJtwZRy58xlwqGCtBM4KR2xVjQg3io0UbWUDY9SvFYr7V6siu6IlSR+nDbuxyF7RDIH/WuYqTlYJB0BIWcxfcCmLccI5VlXzQPOuOz6ZuHgAmuPz1WbWsENnPNYbcN4YAx3axwwMT4HTK+LDG9gNYhh6JByrVBWLgak6k6jpeEaxhyEQBqQ2XpRbj68aYrZ4FBxd7W2Ie3Wv+eWR9XC9WiPyP76EqkEUzwmYSxlc0Y2gbCAIrBC7dJSX9Wpxw7SKrN1Dsf+ih0U3pGMftYfAU4KMwADH7IUaqGbd+MEwLCaYFXtyOIUGwgDKhiYOIDUoWPHow8J07WKTniPiYCkpEsyRfPFvhpWsSXzT5zuWFIw5rpRCm9AGNTtSdyAR0Bp6ixNLODSlwXv2WmMzqzUXuXQ+H/sEeG0zAtGERiIaKwT/9iZGRunaxCetJOJIgUqEfhDHl+mo6efPmnfetuTpr/KY6x7EbHaj/qAGEOLcdGbVYoOEZ/bIU17r7UzS3q7DNuM5sk/jKAOFMgUDASvD3i7WUqGIg/pXJ01oI0FdklvGN3qlqOTSSxWynWRJyCDpdJ6Dv+DJ6ZIP0wuftNquPoMiTQI24nEaAJoBnVkOKQRADKrX69a20UWpXTp1WkaOstedilVnoH6nGyAOHj5m7aOjL7dNaDw8zmAir28EsRHoBfNBk9/KIUka8F2EUBUgRohD60Ss8viE+wi2TmHUR3vl4FQuptPoeoc12IVXyfFFP/zKuOpC8JDE2/z4xLOtYxqtZGFGrKvx7okQsFAb9AgfmmewdpFWPTiAgLe9QBUFZ8TpwtCTT8QBu78b9kJdB130j+8+vWAV1ZlRzfuAog3SvQG9+o7qKoWDAas6vAKOjpEETaS/gGphmwPrx7gITo/HbXN5ELDBQ9cUGIHGDnSNmAzBJUfQiunm+jNEtMK3U1ZtaC6a9oMh6DDmQdyIr9TgU5ugmmt0FCgaY0MbrwwLKgoJIeClMqH5KbYAEB9b9SThxUM3JDWf/WrahPMpYB7/zxAIDSNHBizYP528bEvzsKhHm0RGwZKIE/kCYixhgK4Mdc1f4DqE7JQP465qwFZD4QyfASAi+LniCQ8z6nuExf3ytznDSWVgZp/J+Eo7/veZfDn9uRm3GhJ2MYNWh/pdYHFX8tQEhV8RYoIYiJY4TIAP9uvQRQAPqaZuvL5Y110fc/yhB1MHU0V+eHid/mswkRTJfOdf82IiYnonavRWnP/Q0viEgolapdcSEHFiCOk95siPw3S4Jq5OY3ctKZAL39Q9nih8Kv24qUWnv7ZkRhvsckRt9RIJ5UebPnhovgBHfeeXiHEAaCjTqhIRYdI1lcI2fPTMUjKGiBlgHv9PEQgNHsMxTbJqHZy/6d1bGnV4uEtYvJsjJikx8CMkXfa3DgrnzlizwHwKIw/eCI5VYKzRpO0Z1vC9d+ZvvnW00JMfDQVCVk0+hwWEEEDS2X+bNLCPMXGXZNDrQV2kTnnAmTlQ/rzX/EXw4AMKIjzBG4NVWYwIN+l6hifu6nfL0BvHd+5v9UeBqQ0PmEiGl8Zn54y1x/u17NI7OSKxGOs8Hb3MFdVymLiZ+JqhCZ6RKqNxJsIjKQ5tjd5hSBKpSqWjnfEUcPHXnpp8pkNis16djNEWhcQ3TmOhLCFvgK6CNxLiLuBH23yeiS68cE7VNDCaNLfFNH5u37xNT/NimEj6Js85qMkYJ+43r0IK/RE+ONgGONEDwE79AAP9DYmHxAenTB8/9x+De/yp9Y2aqNcaSHpZi4BgOJkHDz+qlN7XwieBVDBZDwLAAl3l31joYmowqWgfSEPSWaZhhk4RH2bSdtZFHu+X2PovGbPXDiMzKl+U1wqPEwCXiIaIZDDOZOxesLFfL0P83Jb6CNiltDgKJotQc0gl8xAsvE0IDz3ZwgELfQgeIswqeOh99/QuEQlPSAAABIhJREFUFsyoAkfPCKNR294YVXp7fPMZ+82b+q0fPNhFxJFeT5BvGh8iko+enp85avioNnfEtni1rSlaNtL4oDmMD8AhPBE8/jHwQhVD9wkWvlikBSP/0D16FoAdY4l+0FILwRAUkC7qQi9pgWCQwmFhdHvy+dj43aoywMUJlm+mLs964JYBHfuaEr6J0Rs1IBS8AjAAB/PBgTkhIwSNCW8X3/Sb5g/w0Dhy/Ab8ZMgQFaz66DRmn+jGx3sltkj5asrzpAaT2yn4k09JEBpMfXh/UZiYTO95I/L9IyVSHARYLYxljpWWtR/OYBhIkhDX2gfiTjQBlP+BF8ztLlhynwJtPISXlTYrAc7RC0KxJ4BxwbTjBaY+nkeoh3HSG4ACWMFiP8EEjpSEo9haSfy2QXjMa/+cvhrvg0PCglzdsYMW8yhUfyIiwYcT+rBXV7e5XHBxWrGjckiB19moDIo03j7na5eYGSIucpgIDqIfHWChPUo8o32DCKCpzqtURmr1P7eNa7y13w09XqWX0RAE1dupH6KaMWsnf7y53dEzJ54stVTcU+yyd7Tg2Hk52saaH21DDmCjlCtHBEd1PKLxo6SH6Zhgx3hFYDx1GJFoBbYGrbbEIGnOmzTaIxjLHexSwacZG9OtICggKf76U0q1uRq4fGqKxVU5qcRh718seCNssJB7uOEW40FjQ/yN4OBCAL9xBoT/xj0sZFgcjOp6D7sUExa5Jykq+s2vJj33FW8GTNNvog40y4R2sx59tMLjbo8KsJFDS8s/TsILtIkzhWPBujV3zf/9gNnHxlkdNabeDpkJMVkGymVwQvlaVfVvrF3Y8UxxTle9TroJQVs6ny4rEpITmnaxed0Son+Q/0/5wdLLZzvFNihzOpyHGsfEH+/cqtORVUOfOB1oLKXahAbuXcM3TL8p2HDzwfJFXp7p9Y82984pyE02GAwdL1sqWoAgjE1jEjva3E5IDXQeEF22lJ0oV7zWznFJlYUVJXtjImMPtWrY6Ai8B3zcGA0TF+aS8xqAqJ6FTMAChQfyw0TPiIArKgpvvVRe3DbMaOyxJ/+idHN847Y2xRtd5nLIThAzaSi01xRvCNOEa3Xlh8vyT/dq0EK+WFr4c+voBLsqSQdbN2ha1LB9m7Pm3oO5N261dgkPq4gjcJ/PFbm0+4O6jXn77cQzuYdvvVxZ1DnCFHbDibKimBtiGrSGq3i0TfaQBiCGSTpvZtGlY4mRMSoOph/DnsnJxlHxh3t0v/EwXi1e9RoPf1AMPzUHWgStX/n5B/9VTSz+Kz2pTSi16/i6pCSy4OJFURerEfo06+po6YvuVzubCMIQM6pZhmpnuJbrq8Hy3oULMVZvEcLBMBaeoBMfad4Nv4IkmG1TOiOuGbl6X4MUC1JD1S2CCQTLXV2qblb7cV5VDR/s+sp4/vIlpfDSZaEczxJMBrVHpy7iw7feE2q8AjVwxpDCUsiQQkhahzgCGembq6wb0wVYyTlTq/6M4Nh98agRb9RV7JUaoX2zcIXM2dXzVP2GhE8dx1/5QZI7aJv/H+y6kJy2/hwbAAAAAElFTkSuQmCC"},{"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":"https://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":"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","overlay":true},{"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":"Ville_de_Nyon-HD-2010","name":"Ville de Nyon - Orthophoto 2010 HD 5cm/pi","type":"tms","template":"http://osmdata.asitvd.ch/tiles/nyon2010/{zoom}/{x}/{y}.png","endDate":"2010-01-01T00:00:00.000Z","startDate":"2010-01-01T00:00:00.000Z","scaleExtent":[14,20],"polygon":[[[6.248585,46.382518],[6.248482,46.387154],[6.243784,46.389438],[6.241817,46.39109],[6.241403,46.391591],[6.239186,46.392223],[6.239731,46.393728],[6.237905,46.394599],[6.237129,46.396982],[6.230705,46.401073],[6.227891,46.399033],[6.22326,46.402186],[6.220658,46.401891],[6.215825,46.404619],[6.213931,46.406985],[6.209893,46.405629],[6.209276,46.40528],[6.209849,46.40434],[6.205006,46.403316],[6.205271,46.40104],[6.209059,46.401306],[6.209512,46.401302],[6.214904,46.400804],[6.211536,46.398079],[6.210572,46.396796],[6.209541,46.394486],[6.212288,46.392429],[6.213743,46.391684],[6.216393,46.390787],[6.212962,46.387357],[6.215319,46.385143],[6.214027,46.384242],[6.212596,46.382324],[6.212114,46.381021],[6.212119,46.379917],[6.212312,46.37901],[6.213177,46.376969],[6.214543,46.374943],[6.213589,46.374628],[6.213654,46.372759],[6.221335,46.369904],[6.22752,46.365547],[6.22752,46.365407],[6.237384,46.373561],[6.244036,46.378421],[6.248585,46.382518]]],"terms_url":"http://www.nyon.ch/fr/officiel/services-offices/informatique-et-population-776-3911","terms_text":"Ville de Nyon"},{"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=="}];
23649
23650   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"},"advertising/column":{"fields":["direction","lit"],"geometry":["point","area"],"tags":{"advertising":"column"},"name":"Advertising Column"},"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"},"allotments/plot":{"geometry":["area"],"fields":["name","ref"],"tags":{"allotments":"plot"},"reference":{"key":"allotments","value":"plot"},"name":"Community Garden Plot"},"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","faces"],"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","fields":["name"],"geometry":["point","area"],"tags":{"amenity":"fountain"},"name":"Fountain"},"amenity/fuel":{"icon":"fuel","fields":["name","brand","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/monastery":{"icon":"place-of-worship","fields":["name","religion","denomination","address","building_area"],"geometry":["point","area"],"terms":["abbey","basilica","bethel","cathedral","chancel","chantry","chapel","church","fold","house of God","house of prayer","house of worship","minster","mission","monastery","mosque","oratory","parish","sacellum","sanctuary","shrine","synagogue","tabernacle","temple"],"tags":{"amenity":"monastery"},"name":"Monastery Grounds"},"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":["vending","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":["vending","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/coffee":{"icon":"poi-vending-machine","fields":["vending","operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["coffee"],"tags":{"amenity":"vending_machine","vending":"coffee"},"reference":{"key":"vending","value":"coffee"},"name":"Coffee Vending Machine"},"amenity/vending_machine/condoms":{"icon":"poi-vending-machine","fields":["vending","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":["vending","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/electronics":{"icon":"poi-vending-machine","fields":["vending","operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["cable","charger","earbud","headphone","phone","tablet"],"tags":{"amenity":"vending_machine","vending":"electronics"},"reference":{"key":"vending","value":"electronics"},"name":"Electronics Vending Machine"},"amenity/vending_machine/elongated_coin":{"icon":"poi-vending-machine","fields":["vending","operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["coin","crush","elongated","flatten","penny","souvenir"],"tags":{"amenity":"vending_machine","vending":"elongated_coin"},"reference":{"key":"vending","value":"elongated_coin"},"name":"Flat Coin Vending Machine"},"amenity/vending_machine/excrement_bags":{"icon":"poi-vending-machine","fields":["vending","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":["vending","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/food":{"icon":"poi-vending-machine","fields":["vending","operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["food"],"tags":{"amenity":"vending_machine","vending":"food"},"reference":{"key":"vending","value":"food"},"name":"Food Vending Machine"},"amenity/vending_machine/fuel":{"icon":"poi-vending-machine","fields":["vending","operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["petrol","fuel","gasoline","propane","diesel","lng","cng","biodiesel"],"tags":{"amenity":"vending_machine","vending":"fuel"},"reference":{"key":"vending","value":"fuel"},"name":"Gas Pump"},"amenity/vending_machine/ice_cream":{"icon":"poi-vending-machine","fields":["vending","operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["chocolate","ice cream","frozen","popsicle","vanilla"],"tags":{"amenity":"vending_machine","vending":"ice_cream"},"reference":{"key":"vending","value":"ice_cream"},"name":"Ice Cream Vending Machine"},"amenity/vending_machine/newspapers":{"icon":"poi-vending-machine","fields":["vending","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":["vending","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":["vending","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":["vending","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/stamps":{"icon":"poi-vending-machine","fields":["vending","operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["mail","postage","stamp"],"tags":{"amenity":"vending_machine","vending":"stamps"},"reference":{"key":"vending","value":"stamps"},"name":"Postage Vending Machine"},"amenity/vending_machine/sweets":{"icon":"poi-vending-machine","fields":["vending","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/maze":{"icon":"amusement-park","fields":["name","operator"],"geometry":["point","area"],"terms":["theme park","amusement ride","labyrinth"],"tags":{"attraction":"maze"},"name":"Maze"},"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","height","address"],"geometry":["point","area"],"tags":{"building":"*"},"matchScore":0.6,"terms":[],"name":"Building"},"building/bunker":{"fields":["name","address","levels","height"],"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","height"],"geometry":["point","vertex","area"],"tags":{"building":"train_station"},"matchScore":0.5,"name":"Train Station","searchable":false},"building/apartments":{"icon":"building","fields":["name","address","levels","height"],"geometry":["area"],"tags":{"building":"apartments"},"matchScore":0.5,"name":"Apartments"},"building/barn":{"icon":"farm","fields":["name","address","levels","height"],"geometry":["area"],"tags":{"building":"barn"},"matchScore":0.5,"name":"Barn"},"building/boathouse":{"icon":"harbor","fields":["name","levels","height","address"],"geometry":["area"],"tags":{"building":"boathouse"},"matchScore":0.5,"terms":[],"name":"Boathouse"},"building/bungalow":{"icon":"home","fields":["name","address","levels","height"],"geometry":["area"],"tags":{"building":"bungalow"},"terms":["home","detached"],"matchScore":0.5,"name":"Bungalow"},"building/cabin":{"icon":"home","fields":["name","address","levels","height"],"geometry":["area"],"tags":{"building":"cabin"},"matchScore":0.5,"name":"Cabin"},"building/cathedral":{"icon":"place-of-worship","fields":["name","address","levels","height"],"geometry":["area"],"tags":{"building":"cathedral"},"matchScore":0.5,"name":"Cathedral Building"},"building/chapel":{"icon":"place-of-worship","fields":["name","address","levels","height"],"geometry":["area"],"tags":{"building":"chapel"},"matchScore":0.5,"name":"Chapel Building"},"building/church":{"icon":"place-of-worship","fields":["name","address","levels","height"],"geometry":["area"],"tags":{"building":"church"},"matchScore":0.5,"name":"Church Building"},"building/civic":{"icon":"building","fields":["name","address","levels","height","smoking"],"geometry":["area"],"tags":{"building":"civic"},"matchScore":0.5,"name":"Civic Building"},"building/college":{"icon":"building","fields":["name","address","levels","height"],"geometry":["area"],"terms":["university"],"tags":{"building":"college"},"matchScore":0.5,"name":"College Building"},"building/commercial":{"icon":"suitcase","fields":["name","address","levels","height","smoking"],"geometry":["area"],"tags":{"building":"commercial"},"matchScore":0.5,"name":"Commercial Building"},"building/construction":{"icon":"building","fields":["name","address","levels","height"],"geometry":["area"],"tags":{"building":"construction"},"matchScore":0.5,"name":"Building Under Construction"},"building/detached":{"icon":"home","fields":["name","address","levels","height"],"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","height","smoking"],"geometry":["area"],"tags":{"building":"dormitory"},"matchScore":0.5,"name":"Dormitory"},"building/farm_auxiliary":{"icon":"farm","fields":["name","address","levels","height"],"geometry":["area"],"tags":{"building":"farm_auxiliary"},"matchScore":0.5,"name":"Farm Building"},"building/farm":{"icon":"farm","fields":["name","address","levels","height"],"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","height"],"geometry":["area"],"tags":{"building":"greenhouse"},"matchScore":0.5,"name":"Greenhouse"},"building/hospital":{"icon":"building","fields":["name","address","levels","height"],"geometry":["area"],"tags":{"building":"hospital"},"matchScore":0.5,"name":"Hospital Building"},"building/hotel":{"icon":"building","fields":["name","address","levels","height","smoking"],"geometry":["area"],"tags":{"building":"hotel"},"matchScore":0.5,"name":"Hotel Building"},"building/house":{"icon":"home","fields":["name","address","levels","height"],"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","height"],"geometry":["area"],"tags":{"building":"industrial"},"matchScore":0.5,"name":"Industrial Building"},"building/kindergarten":{"icon":"building","fields":["name","address","levels","height"],"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","height"],"geometry":["area"],"tags":{"building":"mosque"},"matchScore":0.5,"name":"Mosque Building"},"building/public":{"icon":"building","fields":["name","address","levels","height","smoking"],"geometry":["area"],"tags":{"building":"public"},"matchScore":0.5,"name":"Public Building"},"building/residential":{"icon":"residential-community","fields":["name","address","levels","height"],"geometry":["area"],"tags":{"building":"residential"},"matchScore":0.5,"name":"Residential Building"},"building/retail":{"icon":"commercial","fields":["name","address","levels","height","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","height"],"geometry":["area"],"tags":{"building":"ruins"},"matchScore":0.5,"name":"Building Ruins"},"building/school":{"icon":"building","fields":["name","address","levels","height"],"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","height"],"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","height"],"geometry":["area"],"tags":{"building":"service"},"matchScore":0.5,"name":"Service Building"},"building/shed":{"icon":"home","fields":["name","address","levels","height"],"geometry":["area"],"tags":{"building":"shed"},"matchScore":0.5,"name":"Shed"},"building/stable":{"icon":"horse-riding","fields":["name","address","levels","height"],"geometry":["area"],"tags":{"building":"stable"},"matchScore":0.5,"name":"Stable"},"building/stadium":{"icon":"stadium","fields":["name","address","levels","height","smoking"],"geometry":["area"],"tags":{"building":"stadium"},"matchScore":0.5,"name":"Stadium Building"},"building/static_caravan":{"icon":"home","fields":["name","address","levels","height"],"geometry":["area"],"tags":{"building":"static_caravan"},"matchScore":0.5,"name":"Static Mobile Home"},"building/temple":{"icon":"place-of-worship","fields":["name","address","levels","height"],"geometry":["area"],"tags":{"building":"temple"},"matchScore":0.5,"name":"Temple Building"},"building/terrace":{"icon":"building","fields":["name","address","levels","height"],"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","height","smoking"],"geometry":["area"],"tags":{"building":"transportation"},"matchScore":0.5,"name":"Transportation Building"},"building/university":{"icon":"building","fields":["name","address","levels","height"],"geometry":["area"],"terms":["college"],"tags":{"building":"university"},"matchScore":0.5,"name":"University Building"},"building/warehouse":{"icon":"warehouse","fields":["name","address","levels","height"],"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/laboratory":{"icon":"hospital","fields":["name","operator","website","ref","address","opening_hours"],"geometry":["point","area"],"terms":["medical_laboratory","medical_lab","blood_check"],"tags":{"healthcare":"laboratory"},"name":"Medical Laboratory"},"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","maxspeed/advisory","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/passing_place":{"icon":"circle-stroked","geometry":["vertex"],"tags":{"highway":"passing_place"},"terms":["turnout, pullout"],"name":"Passing Place"},"highway/path":{"icon":"highway-path","fields":["name","surface","width","structure","access","incline","sac_scale","trail_visibility","mtb/scale","mtb/scale/uphill","mtb/scale/imba","horse_scale","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","maxspeed/advisory","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","maxspeed/advisory","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","maxspeed/advisory","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","horse_scale"],"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","maxspeed/advisory","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"],"terms":["dedicatory","epitaph","remember","remembrance","memory","monument","stolperstein"],"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","industrial"],"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/beach_resort":{"icon":"poi-beach","fields":["name","address","fee"],"geometry":["point","area"],"tags":{"leisure":"beach_resort"},"name":"Beach Resort"},"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/outdoor_seating":{"icon":"picnic-site","geometry":["point","area"],"fields":["name","operator"],"terms":["al fresco","beer garden","dining","cafe","restaurant","pub","bar","patio"],"tags":{"leisure":"outdoor_seating"},"name":"Outdoor Seating Area"},"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":["name","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":["name","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"baseball"},"reference":{"key":"sport","value":"baseball"},"terms":[],"name":"Baseball Diamond"},"leisure/pitch/basketball":{"icon":"basketball","fields":["name","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":["name","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":["name","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":["name","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":["name","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":["name","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":["name","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":["name","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":["name","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":["name","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":["name","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":["name","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":["name","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/antenna":{"icon":"poi-mast","fields":["height","communication_multi"],"geometry":["point"],"terms":["broadcast","cell phone","cell","communication","mobile phone","radio","television","transmission","tv"],"tags":{"man_made":"antenna"},"name":"Antenna"},"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/observatory":{"geometry":["point","area"],"terms":["astronomical","meteorological"],"tags":{"man_made":"observatory"},"name":"Observatory"},"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/mud":{"geometry":["area"],"tags":{"natural":"mud"},"terms":["wetland"],"name":"Mud"},"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","fields":["name","structure","service_rail","usage_rail"],"geometry":["line"],"tags":{"railway":"abandoned"},"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","fields":["structure","service_rail","usage_rail"],"geometry":["line"],"tags":{"railway":"disused"},"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","fields":["name","structure","gauge","electrified","service_rail","usage_rail","voltage","frequency"],"geometry":["line"],"tags":{"railway":"light_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","fields":["name","structure","electrified","service_rail","usage_rail","voltage","frequency"],"geometry":["line"],"tags":{"railway":"monorail"},"terms":[],"name":"Monorail"},"railway/narrow_gauge":{"icon":"railway-rail","fields":["name","structure","gauge","electrified","service_rail","usage_rail","voltage","frequency"],"geometry":["line"],"tags":{"railway":"narrow_gauge"},"terms":["narrow gauge railway","narrow gauge railroad"],"name":"Narrow Gauge Rail"},"railway/rail":{"icon":"railway-rail","fields":["name","structure","gauge","electrified","maxspeed","service_rail","usage_rail","voltage","frequency"],"geometry":["line"],"tags":{"railway":"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","fields":["name","structure","gauge","electrified","service_rail","usage_rail","voltage","frequency"],"geometry":["line"],"tags":{"railway":"subway"},"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","fields":["name","structure","gauge","electrified","service_rail","usage_rail","voltage","frequency"],"geometry":["line"],"tags":{"railway":"tram"},"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_grooming":{"icon":"dog-park","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["dog"],"tags":{"shop":"pet_grooming"},"name":"Pet Grooming 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","brand","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/trail_riding_station":{"icon":"horse-riding","fields":["name","horse_stables","horse_riding","horse_dressage","address","phone","website","description"],"geometry":["point","area"],"tags":{"tourism":"trail_riding_station"},"name":"Trail Riding Station","matchScore":2},"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":"Only Left Turn"},"type/restriction/only_right_turn":{"icon":"restriction-only-right-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"only_right_turn"},"name":"Only Right Turn"},"type/restriction/only_straight_on":{"icon":"restriction-only-straight-on","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"only_straight_on"},"name":"Only Straight On"},"type/restriction/only_u_turn":{"icon":"restriction-only-u-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"only_u_turn"},"name":"Only U-turn"},"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","description","distance"],"geometry":["relation"],"tags":{"type":"route","route":"hiking"},"name":"Hiking Route"},"type/route/horse":{"icon":"route-horse","fields":["name","ref_route","operator","network_horse","description","distance"],"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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ΕΚΟ":{"tags":{"name":"ΕΚΟ","amenity":"fuel"},"name":"ΕΚΟ","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/АГЗС":{"tags":{"name":"АГЗС","amenity":"fuel"},"name":"АГЗС","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/АЗС":{"tags":{"name":"АЗС","amenity":"fuel"},"name":"АЗС","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Авіас":{"tags":{"name":"Авіас","amenity":"fuel"},"name":"Авіас","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/БРСМ-Нафта":{"tags":{"name":"БРСМ-Нафта","amenity":"fuel"},"name":"БРСМ-Нафта","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Башнефть":{"tags":{"name":"Башнефть","amenity":"fuel"},"name":"Башнефть","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Белоруснефть":{"tags":{"name":"Белоруснефть","amenity":"fuel"},"name":"Белоруснефть","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Газовая заправка":{"tags":{"name":"Газовая заправка","amenity":"fuel"},"name":"Газовая заправка","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Газпромнефть":{"tags":{"name":"Газпромнефть","amenity":"fuel"},"name":"Газпромнефть","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Гелиос":{"tags":{"name":"Гелиос","amenity":"fuel"},"name":"Гелиос","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ЕКА":{"tags":{"name":"ЕКА","amenity":"fuel"},"name":"ЕКА","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Заправка":{"tags":{"name":"Заправка","amenity":"fuel"},"name":"Заправка","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/КазМунайГаз":{"tags":{"name":"КазМунайГаз","amenity":"fuel"},"name":"КазМунайГаз","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Лукойл":{"tags":{"name":"Лукойл","amenity":"fuel"},"name":"Лукойл","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Макпетрол":{"tags":{"name":"Макпетрол","amenity":"fuel"},"name":"Макпетрол","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/НК Альянс":{"tags":{"name":"НК Альянс","amenity":"fuel"},"name":"НК Альянс","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Нефтьмагистраль":{"tags":{"name":"Нефтьмагистраль","amenity":"fuel"},"name":"Нефтьмагистраль","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ОККО":{"tags":{"name":"ОККО","amenity":"fuel"},"name":"ОККО","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ОМВ":{"tags":{"name":"ОМВ","amenity":"fuel"},"name":"ОМВ","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Октан":{"tags":{"name":"Октан","amenity":"fuel"},"name":"Октан","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ПТК":{"tags":{"name":"ПТК","amenity":"fuel"},"name":"ПТК","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Петрол":{"tags":{"name":"Петрол","amenity":"fuel"},"name":"Петрол","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Пропан":{"tags":{"name":"Пропан","amenity":"fuel"},"name":"Пропан","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Роснефть":{"tags":{"name":"Роснефть","amenity":"fuel"},"name":"Роснефть","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Сибнефть":{"tags":{"name":"Сибнефть","amenity":"fuel"},"name":"Сибнефть","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Сургутнефтегаз":{"tags":{"name":"Сургутнефтегаз","amenity":"fuel"},"name":"Сургутнефтегаз","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ТНК":{"tags":{"name":"ТНК","amenity":"fuel"},"name":"ТНК","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Татнефтепродукт":{"tags":{"name":"Татнефтепродукт","amenity":"fuel"},"name":"Татнефтепродукт","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Татнефть":{"tags":{"name":"Татнефть","amenity":"fuel"},"name":"Татнефть","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Укрнафта":{"tags":{"name":"Укрнафта","amenity":"fuel"},"name":"Укрнафта","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/דור אלון":{"tags":{"name":"דור אלון","amenity":"fuel"},"name":"דור אלון","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/דלק":{"tags":{"name":"דלק","amenity":"fuel"},"name":"דלק","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/סונול":{"tags":{"name":"סונול","amenity":"fuel"},"name":"סונול","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/פז":{"tags":{"name":"פז","amenity":"fuel"},"name":"פז","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/محطة وقود":{"tags":{"name":"محطة وقود","amenity":"fuel"},"name":"محطة وقود","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/محطه وقود":{"tags":{"name":"محطه وقود","amenity":"fuel"},"name":"محطه وقود","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/پمپ بنزین":{"tags":{"name":"پمپ بنزین","amenity":"fuel"},"name":"پمپ بنزین","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/پمپ گاز":{"tags":{"name":"پمپ گاز","amenity":"fuel"},"name":"پمپ گاز","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/บางจาก":{"tags":{"name":"บางจาก","amenity":"fuel"},"name":"บางจาก","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ป.ต.ท.":{"tags":{"name":"ป.ต.ท.","amenity":"fuel"},"name":"ป.ต.ท.","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/เชลล์":{"tags":{"name":"เชลล์","amenity":"fuel"},"name":"เชลล์","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/เอสโซ่":{"tags":{"name":"เอสโซ่","amenity":"fuel"},"name":"เอสโซ่","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/エッソ":{"tags":{"name":"エッソ","amenity":"fuel"},"name":"エッソ","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/エネオス":{"tags":{"name":"エネオス","amenity":"fuel"},"name":"エネオス","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/コスモ石油":{"tags":{"name":"コスモ石油","amenity":"fuel"},"name":"コスモ石油","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ゼネラル":{"tags":{"name":"ゼネラル","amenity":"fuel"},"name":"ゼネラル","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/中国石化":{"tags":{"name":"中国石化","amenity":"fuel"},"name":"中国石化","icon":"fuel","geometry":["point","area"],"fields":["name","brand","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","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/中国石油":{"tags":{"name":"中国石油","amenity":"fuel"},"name":"中国石油","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/中油":{"tags":{"name":"中油","amenity":"fuel"},"name":"中油","icon":"fuel","geometry":["point","area"],"fields":["name","brand","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","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/加油站":{"tags":{"name":"加油站","amenity":"fuel"},"name":"加油站","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/台灣中油":{"tags":{"name":"台灣中油","amenity":"fuel"},"name":"台灣中油","icon":"fuel","geometry":["point","area"],"fields":["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/昭和シェル":{"tags":{"name":"昭和シェル","amenity":"fuel"},"name":"昭和シェル","icon":"fuel","geometry":["point","area"],"fields":["name","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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","brand","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}};
23651
23652   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"]};
23653
23654   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/only_u_turn","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"]}};
23655
23656   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"]},"distance":{"key":"distance","type":"text","label":"Total Distance"},"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"},"faces":{"key":"faces","type":"number","label":"Faces"},"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..."},"horse_dressage":{"key":"sport","type":"check","label":"Dressage Riding","strings":{"options":{"undefined":"No","equestrian":"Yes"}},"reference":{"key":"sport","value":"equestrian"}},"horse_riding":{"key":"leisure","type":"check","label":"Horseback Riding","strings":{"options":{"undefined":"No","horse_riding":"Yes"}},"reference":{"key":"leisure","value":"horse_riding"}},"horse_scale":{"key":"horse_scale","type":"combo","label":"Horseback Riding Difficulty","placeholder":"Difficult, Dangerous...","strings":{"options":{"common":"Easy: No problems or difficulties. (default)","demanding":"Use with caution: Uneven way, occasional difficult passages.","difficult":"Difficult: Way narrow and exposed. May contain obstacles to step over and narrow passages.","critical":"Borderline: Passable only for experienced riders and horses. Major obstacles. Bridges should be examined carefully.","dangerous":"Dangerous: Passable only for very experienced riders and horses and only in good weather. Dismount.","impossible":"Impassable: Way or bridge not passable for horses. Too narrow, insuffient support, obstacles like ladders. Danger of life."}}},"horse_stables":{"key":"amenity","type":"check","label":"Riding Stable","strings":{"options":{"undefined":"No","stables":"Yes"}},"reference":{"key":"amenity","value":"stables"}},"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"},"industrial":{"key":"industrial","type":"combo","label":"Type"},"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..."},"maxspeed/advisory":{"key":"maxspeed:advisory","type":"maxspeed","label":"Advisory 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"},"usage_rail":{"key":"usage","type":"combo","label":"Usage Type","strings":{"options":{"main":"Main","branch":"Branch","industrial":"Industrial","military":"Military","test":"Test","tourism":"Tourism"}}},"vending":{"key":"vending","type":"semiCombo","label":"Types 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"}}}};
23657
23658   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"];
23659   var all$1 = {
23660         all: all
23661   };
23662
23663   var all$2 = /*#__PURE__*/Object.freeze({
23664     all: all,
23665     default: all$1
23666   });
23667
23668   var Airport = ["airfield","airport","heliport","rocket"];
23669   var Dining = ["bakery","bar","beer","cafe","fast-food","ice-cream","restaurant"];
23670   var Education = ["college","school"];
23671   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"];
23672   var Health = ["dentist","doctor","hospital","pharmacy"];
23673   var Outdoors = ["campsite","cemetery","dog-park","garden","golf","park","picnic-site","playground","zoo"];
23674   var Transit = ["bus","ferry"];
23675   var streets = {
23676         Airport: Airport,
23677         Dining: Dining,
23678         Education: Education,
23679         General: General,
23680         Health: Health,
23681         Outdoors: Outdoors,
23682         Transit: Transit,
23683         "Mountain peak": ["mountain","volcano"],
23684         "Rail station": ["entrance","rail","rail-light","rail-metro"]
23685   };
23686
23687   var streets$1 = /*#__PURE__*/Object.freeze({
23688     Airport: Airport,
23689     Dining: Dining,
23690     Education: Education,
23691     General: General,
23692     Health: Health,
23693     Outdoors: Outdoors,
23694     Transit: Transit,
23695     default: streets
23696   });
23697
23698   var require$$0$1 = ( all$2 && all$1 ) || all$2;
23699
23700   var require$$1$1 = ( streets$1 && streets ) || streets$1;
23701
23702   var maki = {
23703     layouts: {
23704       all: require$$0$1,
23705       streets: require$$1$1
23706     }
23707   };
23708
23709   var quickselect_1 = quickselect;
23710   var default_1 = quickselect;
23711
23712   function quickselect(arr, k, left, right, compare) {
23713       quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
23714   }
23715   function quickselectStep(arr, k, left, right, compare) {
23716
23717       while (right > left) {
23718           if (right - left > 600) {
23719               var n = right - left + 1;
23720               var m = k - left + 1;
23721               var z = Math.log(n);
23722               var s = 0.5 * Math.exp(2 * z / 3);
23723               var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
23724               var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
23725               var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
23726               quickselectStep(arr, k, newLeft, newRight, compare);
23727           }
23728
23729           var t = arr[k];
23730           var i = left;
23731           var j = right;
23732
23733           swap(arr, left, k);
23734           if (compare(arr[right], t) > 0) swap(arr, left, right);
23735
23736           while (i < j) {
23737               swap(arr, i, j);
23738               i++;
23739               j--;
23740               while (compare(arr[i], t) < 0) i++;
23741               while (compare(arr[j], t) > 0) j--;
23742           }
23743
23744           if (compare(arr[left], t) === 0) swap(arr, left, j);
23745           else {
23746               j++;
23747               swap(arr, j, right);
23748           }
23749
23750           if (j <= k) left = j + 1;
23751           if (k <= j) right = j - 1;
23752       }
23753   }
23754
23755   function swap(arr, i, j) {
23756       var tmp = arr[i];
23757       arr[i] = arr[j];
23758       arr[j] = tmp;
23759   }
23760
23761   function defaultCompare(a, b) {
23762       return a < b ? -1 : a > b ? 1 : 0;
23763   }
23764   quickselect_1.default = default_1;
23765
23766   var rbush_1 = rbush;
23767   var default_1$1 = rbush;
23768
23769
23770
23771   function rbush(maxEntries, format) {
23772       if (!(this instanceof rbush)) return new rbush(maxEntries, format);
23773
23774       // max entries in a node is 9 by default; min node fill is 40% for best performance
23775       this._maxEntries = Math.max(4, maxEntries || 9);
23776       this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
23777
23778       if (format) {
23779           this._initFormat(format);
23780       }
23781
23782       this.clear();
23783   }
23784
23785   rbush.prototype = {
23786
23787       all: function () {
23788           return this._all(this.data, []);
23789       },
23790
23791       search: function (bbox) {
23792
23793           var node = this.data,
23794               result = [],
23795               toBBox = this.toBBox;
23796
23797           if (!intersects$1(bbox, node)) return result;
23798
23799           var nodesToSearch = [],
23800               i, len, child, childBBox;
23801
23802           while (node) {
23803               for (i = 0, len = node.children.length; i < len; i++) {
23804
23805                   child = node.children[i];
23806                   childBBox = node.leaf ? toBBox(child) : child;
23807
23808                   if (intersects$1(bbox, childBBox)) {
23809                       if (node.leaf) result.push(child);
23810                       else if (contains$2(bbox, childBBox)) this._all(child, result);
23811                       else nodesToSearch.push(child);
23812                   }
23813               }
23814               node = nodesToSearch.pop();
23815           }
23816
23817           return result;
23818       },
23819
23820       collides: function (bbox) {
23821
23822           var node = this.data,
23823               toBBox = this.toBBox;
23824
23825           if (!intersects$1(bbox, node)) return false;
23826
23827           var nodesToSearch = [],
23828               i, len, child, childBBox;
23829
23830           while (node) {
23831               for (i = 0, len = node.children.length; i < len; i++) {
23832
23833                   child = node.children[i];
23834                   childBBox = node.leaf ? toBBox(child) : child;
23835
23836                   if (intersects$1(bbox, childBBox)) {
23837                       if (node.leaf || contains$2(bbox, childBBox)) return true;
23838                       nodesToSearch.push(child);
23839                   }
23840               }
23841               node = nodesToSearch.pop();
23842           }
23843
23844           return false;
23845       },
23846
23847       load: function (data) {
23848           if (!(data && data.length)) return this;
23849
23850           if (data.length < this._minEntries) {
23851               for (var i = 0, len = data.length; i < len; i++) {
23852                   this.insert(data[i]);
23853               }
23854               return this;
23855           }
23856
23857           // recursively build the tree with the given data from scratch using OMT algorithm
23858           var node = this._build(data.slice(), 0, data.length - 1, 0);
23859
23860           if (!this.data.children.length) {
23861               // save as is if tree is empty
23862               this.data = node;
23863
23864           } else if (this.data.height === node.height) {
23865               // split root if trees have the same height
23866               this._splitRoot(this.data, node);
23867
23868           } else {
23869               if (this.data.height < node.height) {
23870                   // swap trees if inserted one is bigger
23871                   var tmpNode = this.data;
23872                   this.data = node;
23873                   node = tmpNode;
23874               }
23875
23876               // insert the small tree into the large tree at appropriate level
23877               this._insert(node, this.data.height - node.height - 1, true);
23878           }
23879
23880           return this;
23881       },
23882
23883       insert: function (item) {
23884           if (item) this._insert(item, this.data.height - 1);
23885           return this;
23886       },
23887
23888       clear: function () {
23889           this.data = createNode([]);
23890           return this;
23891       },
23892
23893       remove: function (item, equalsFn) {
23894           if (!item) return this;
23895
23896           var node = this.data,
23897               bbox = this.toBBox(item),
23898               path = [],
23899               indexes = [],
23900               i, parent, index, goingUp;
23901
23902           // depth-first iterative tree traversal
23903           while (node || path.length) {
23904
23905               if (!node) { // go up
23906                   node = path.pop();
23907                   parent = path[path.length - 1];
23908                   i = indexes.pop();
23909                   goingUp = true;
23910               }
23911
23912               if (node.leaf) { // check current node
23913                   index = findItem(item, node.children, equalsFn);
23914
23915                   if (index !== -1) {
23916                       // item found, remove the item and condense tree upwards
23917                       node.children.splice(index, 1);
23918                       path.push(node);
23919                       this._condense(path);
23920                       return this;
23921                   }
23922               }
23923
23924               if (!goingUp && !node.leaf && contains$2(node, bbox)) { // go down
23925                   path.push(node);
23926                   indexes.push(i);
23927                   i = 0;
23928                   parent = node;
23929                   node = node.children[0];
23930
23931               } else if (parent) { // go right
23932                   i++;
23933                   node = parent.children[i];
23934                   goingUp = false;
23935
23936               } else node = null; // nothing found
23937           }
23938
23939           return this;
23940       },
23941
23942       toBBox: function (item) { return item; },
23943
23944       compareMinX: compareNodeMinX,
23945       compareMinY: compareNodeMinY,
23946
23947       toJSON: function () { return this.data; },
23948
23949       fromJSON: function (data) {
23950           this.data = data;
23951           return this;
23952       },
23953
23954       _all: function (node, result) {
23955           var nodesToSearch = [];
23956           while (node) {
23957               if (node.leaf) result.push.apply(result, node.children);
23958               else nodesToSearch.push.apply(nodesToSearch, node.children);
23959
23960               node = nodesToSearch.pop();
23961           }
23962           return result;
23963       },
23964
23965       _build: function (items, left, right, height) {
23966
23967           var N = right - left + 1,
23968               M = this._maxEntries,
23969               node;
23970
23971           if (N <= M) {
23972               // reached leaf level; return leaf
23973               node = createNode(items.slice(left, right + 1));
23974               calcBBox(node, this.toBBox);
23975               return node;
23976           }
23977
23978           if (!height) {
23979               // target height of the bulk-loaded tree
23980               height = Math.ceil(Math.log(N) / Math.log(M));
23981
23982               // target number of root entries to maximize storage utilization
23983               M = Math.ceil(N / Math.pow(M, height - 1));
23984           }
23985
23986           node = createNode([]);
23987           node.leaf = false;
23988           node.height = height;
23989
23990           // split the items into M mostly square tiles
23991
23992           var N2 = Math.ceil(N / M),
23993               N1 = N2 * Math.ceil(Math.sqrt(M)),
23994               i, j, right2, right3;
23995
23996           multiSelect(items, left, right, N1, this.compareMinX);
23997
23998           for (i = left; i <= right; i += N1) {
23999
24000               right2 = Math.min(i + N1 - 1, right);
24001
24002               multiSelect(items, i, right2, N2, this.compareMinY);
24003
24004               for (j = i; j <= right2; j += N2) {
24005
24006                   right3 = Math.min(j + N2 - 1, right2);
24007
24008                   // pack each entry recursively
24009                   node.children.push(this._build(items, j, right3, height - 1));
24010               }
24011           }
24012
24013           calcBBox(node, this.toBBox);
24014
24015           return node;
24016       },
24017
24018       _chooseSubtree: function (bbox, node, level, path) {
24019
24020           var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
24021
24022           while (true) {
24023               path.push(node);
24024
24025               if (node.leaf || path.length - 1 === level) break;
24026
24027               minArea = minEnlargement = Infinity;
24028
24029               for (i = 0, len = node.children.length; i < len; i++) {
24030                   child = node.children[i];
24031                   area = bboxArea(child);
24032                   enlargement = enlargedArea(bbox, child) - area;
24033
24034                   // choose entry with the least area enlargement
24035                   if (enlargement < minEnlargement) {
24036                       minEnlargement = enlargement;
24037                       minArea = area < minArea ? area : minArea;
24038                       targetNode = child;
24039
24040                   } else if (enlargement === minEnlargement) {
24041                       // otherwise choose one with the smallest area
24042                       if (area < minArea) {
24043                           minArea = area;
24044                           targetNode = child;
24045                       }
24046                   }
24047               }
24048
24049               node = targetNode || node.children[0];
24050           }
24051
24052           return node;
24053       },
24054
24055       _insert: function (item, level, isNode) {
24056
24057           var toBBox = this.toBBox,
24058               bbox = isNode ? item : toBBox(item),
24059               insertPath = [];
24060
24061           // find the best node for accommodating the item, saving all nodes along the path too
24062           var node = this._chooseSubtree(bbox, this.data, level, insertPath);
24063
24064           // put the item into the node
24065           node.children.push(item);
24066           extend$1(node, bbox);
24067
24068           // split on node overflow; propagate upwards if necessary
24069           while (level >= 0) {
24070               if (insertPath[level].children.length > this._maxEntries) {
24071                   this._split(insertPath, level);
24072                   level--;
24073               } else break;
24074           }
24075
24076           // adjust bboxes along the insertion path
24077           this._adjustParentBBoxes(bbox, insertPath, level);
24078       },
24079
24080       // split overflowed node into two
24081       _split: function (insertPath, level) {
24082
24083           var node = insertPath[level],
24084               M = node.children.length,
24085               m = this._minEntries;
24086
24087           this._chooseSplitAxis(node, m, M);
24088
24089           var splitIndex = this._chooseSplitIndex(node, m, M);
24090
24091           var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
24092           newNode.height = node.height;
24093           newNode.leaf = node.leaf;
24094
24095           calcBBox(node, this.toBBox);
24096           calcBBox(newNode, this.toBBox);
24097
24098           if (level) insertPath[level - 1].children.push(newNode);
24099           else this._splitRoot(node, newNode);
24100       },
24101
24102       _splitRoot: function (node, newNode) {
24103           // split root node
24104           this.data = createNode([node, newNode]);
24105           this.data.height = node.height + 1;
24106           this.data.leaf = false;
24107           calcBBox(this.data, this.toBBox);
24108       },
24109
24110       _chooseSplitIndex: function (node, m, M) {
24111
24112           var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
24113
24114           minOverlap = minArea = Infinity;
24115
24116           for (i = m; i <= M - m; i++) {
24117               bbox1 = distBBox(node, 0, i, this.toBBox);
24118               bbox2 = distBBox(node, i, M, this.toBBox);
24119
24120               overlap = intersectionArea(bbox1, bbox2);
24121               area = bboxArea(bbox1) + bboxArea(bbox2);
24122
24123               // choose distribution with minimum overlap
24124               if (overlap < minOverlap) {
24125                   minOverlap = overlap;
24126                   index = i;
24127
24128                   minArea = area < minArea ? area : minArea;
24129
24130               } else if (overlap === minOverlap) {
24131                   // otherwise choose distribution with minimum area
24132                   if (area < minArea) {
24133                       minArea = area;
24134                       index = i;
24135                   }
24136               }
24137           }
24138
24139           return index;
24140       },
24141
24142       // sorts node children by the best axis for split
24143       _chooseSplitAxis: function (node, m, M) {
24144
24145           var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
24146               compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
24147               xMargin = this._allDistMargin(node, m, M, compareMinX),
24148               yMargin = this._allDistMargin(node, m, M, compareMinY);
24149
24150           // if total distributions margin value is minimal for x, sort by minX,
24151           // otherwise it's already sorted by minY
24152           if (xMargin < yMargin) node.children.sort(compareMinX);
24153       },
24154
24155       // total margin of all possible split distributions where each node is at least m full
24156       _allDistMargin: function (node, m, M, compare) {
24157
24158           node.children.sort(compare);
24159
24160           var toBBox = this.toBBox,
24161               leftBBox = distBBox(node, 0, m, toBBox),
24162               rightBBox = distBBox(node, M - m, M, toBBox),
24163               margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
24164               i, child;
24165
24166           for (i = m; i < M - m; i++) {
24167               child = node.children[i];
24168               extend$1(leftBBox, node.leaf ? toBBox(child) : child);
24169               margin += bboxMargin(leftBBox);
24170           }
24171
24172           for (i = M - m - 1; i >= m; i--) {
24173               child = node.children[i];
24174               extend$1(rightBBox, node.leaf ? toBBox(child) : child);
24175               margin += bboxMargin(rightBBox);
24176           }
24177
24178           return margin;
24179       },
24180
24181       _adjustParentBBoxes: function (bbox, path, level) {
24182           // adjust bboxes along the given tree path
24183           for (var i = level; i >= 0; i--) {
24184               extend$1(path[i], bbox);
24185           }
24186       },
24187
24188       _condense: function (path) {
24189           // go through the path, removing empty nodes and updating bboxes
24190           for (var i = path.length - 1, siblings; i >= 0; i--) {
24191               if (path[i].children.length === 0) {
24192                   if (i > 0) {
24193                       siblings = path[i - 1].children;
24194                       siblings.splice(siblings.indexOf(path[i]), 1);
24195
24196                   } else this.clear();
24197
24198               } else calcBBox(path[i], this.toBBox);
24199           }
24200       },
24201
24202       _initFormat: function (format) {
24203           // data format (minX, minY, maxX, maxY accessors)
24204
24205           // uses eval-type function compilation instead of just accepting a toBBox function
24206           // because the algorithms are very sensitive to sorting functions performance,
24207           // so they should be dead simple and without inner calls
24208
24209           var compareArr = ['return a', ' - b', ';'];
24210
24211           this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
24212           this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
24213
24214           this.toBBox = new Function('a',
24215               'return {minX: a' + format[0] +
24216               ', minY: a' + format[1] +
24217               ', maxX: a' + format[2] +
24218               ', maxY: a' + format[3] + '};');
24219       }
24220   };
24221
24222   function findItem(item, items, equalsFn) {
24223       if (!equalsFn) return items.indexOf(item);
24224
24225       for (var i = 0; i < items.length; i++) {
24226           if (equalsFn(item, items[i])) return i;
24227       }
24228       return -1;
24229   }
24230
24231   // calculate node's bbox from bboxes of its children
24232   function calcBBox(node, toBBox) {
24233       distBBox(node, 0, node.children.length, toBBox, node);
24234   }
24235
24236   // min bounding rectangle of node children from k to p-1
24237   function distBBox(node, k, p, toBBox, destNode) {
24238       if (!destNode) destNode = createNode(null);
24239       destNode.minX = Infinity;
24240       destNode.minY = Infinity;
24241       destNode.maxX = -Infinity;
24242       destNode.maxY = -Infinity;
24243
24244       for (var i = k, child; i < p; i++) {
24245           child = node.children[i];
24246           extend$1(destNode, node.leaf ? toBBox(child) : child);
24247       }
24248
24249       return destNode;
24250   }
24251
24252   function extend$1(a, b) {
24253       a.minX = Math.min(a.minX, b.minX);
24254       a.minY = Math.min(a.minY, b.minY);
24255       a.maxX = Math.max(a.maxX, b.maxX);
24256       a.maxY = Math.max(a.maxY, b.maxY);
24257       return a;
24258   }
24259
24260   function compareNodeMinX(a, b) { return a.minX - b.minX; }
24261   function compareNodeMinY(a, b) { return a.minY - b.minY; }
24262
24263   function bboxArea(a)   { return (a.maxX - a.minX) * (a.maxY - a.minY); }
24264   function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
24265
24266   function enlargedArea(a, b) {
24267       return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
24268              (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
24269   }
24270
24271   function intersectionArea(a, b) {
24272       var minX = Math.max(a.minX, b.minX),
24273           minY = Math.max(a.minY, b.minY),
24274           maxX = Math.min(a.maxX, b.maxX),
24275           maxY = Math.min(a.maxY, b.maxY);
24276
24277       return Math.max(0, maxX - minX) *
24278              Math.max(0, maxY - minY);
24279   }
24280
24281   function contains$2(a, b) {
24282       return a.minX <= b.minX &&
24283              a.minY <= b.minY &&
24284              b.maxX <= a.maxX &&
24285              b.maxY <= a.maxY;
24286   }
24287
24288   function intersects$1(a, b) {
24289       return b.minX <= a.maxX &&
24290              b.minY <= a.maxY &&
24291              b.maxX >= a.minX &&
24292              b.maxY >= a.minY;
24293   }
24294
24295   function createNode(children) {
24296       return {
24297           children: children,
24298           height: 1,
24299           leaf: true,
24300           minX: Infinity,
24301           minY: Infinity,
24302           maxX: -Infinity,
24303           maxY: -Infinity
24304       };
24305   }
24306
24307   // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
24308   // combines selection algorithm with binary divide & conquer approach
24309
24310   function multiSelect(arr, left, right, n, compare) {
24311       var stack = [left, right],
24312           mid;
24313
24314       while (stack.length) {
24315           right = stack.pop();
24316           left = stack.pop();
24317
24318           if (right - left <= n) continue;
24319
24320           mid = left + Math.ceil((right - left) / n / 2) * n;
24321           quickselect_1(arr, mid, left, right, compare);
24322
24323           stack.push(left, mid, mid, right);
24324       }
24325   }
24326   rbush_1.default = default_1$1;
24327
24328   var lineclip_1 = lineclip;
24329
24330   lineclip.polyline = lineclip;
24331   lineclip.polygon = polygonclip;
24332
24333
24334   // Cohen-Sutherland line clippign algorithm, adapted to efficiently
24335   // handle polylines rather than just segments
24336
24337   function lineclip(points, bbox, result) {
24338
24339       var len = points.length,
24340           codeA = bitCode(points[0], bbox),
24341           part = [],
24342           i, a, b, codeB, lastCode;
24343
24344       if (!result) result = [];
24345
24346       for (i = 1; i < len; i++) {
24347           a = points[i - 1];
24348           b = points[i];
24349           codeB = lastCode = bitCode(b, bbox);
24350
24351           while (true) {
24352
24353               if (!(codeA | codeB)) { // accept
24354                   part.push(a);
24355
24356                   if (codeB !== lastCode) { // segment went outside
24357                       part.push(b);
24358
24359                       if (i < len - 1) { // start a new line
24360                           result.push(part);
24361                           part = [];
24362                       }
24363                   } else if (i === len - 1) {
24364                       part.push(b);
24365                   }
24366                   break;
24367
24368               } else if (codeA & codeB) { // trivial reject
24369                   break;
24370
24371               } else if (codeA) { // a outside, intersect with clip edge
24372                   a = intersect$1(a, b, codeA, bbox);
24373                   codeA = bitCode(a, bbox);
24374
24375               } else { // b outside
24376                   b = intersect$1(a, b, codeB, bbox);
24377                   codeB = bitCode(b, bbox);
24378               }
24379           }
24380
24381           codeA = lastCode;
24382       }
24383
24384       if (part.length) result.push(part);
24385
24386       return result;
24387   }
24388
24389   // Sutherland-Hodgeman polygon clipping algorithm
24390
24391   function polygonclip(points, bbox) {
24392
24393       var result, edge, prev, prevInside, i, p, inside;
24394
24395       // clip against each side of the clip rectangle
24396       for (edge = 1; edge <= 8; edge *= 2) {
24397           result = [];
24398           prev = points[points.length - 1];
24399           prevInside = !(bitCode(prev, bbox) & edge);
24400
24401           for (i = 0; i < points.length; i++) {
24402               p = points[i];
24403               inside = !(bitCode(p, bbox) & edge);
24404
24405               // if segment goes through the clip window, add an intersection
24406               if (inside !== prevInside) result.push(intersect$1(prev, p, edge, bbox));
24407
24408               if (inside) result.push(p); // add a point if it's inside
24409
24410               prev = p;
24411               prevInside = inside;
24412           }
24413
24414           points = result;
24415
24416           if (!points.length) break;
24417       }
24418
24419       return result;
24420   }
24421
24422   // intersect a segment against one of the 4 lines that make up the bbox
24423
24424   function intersect$1(a, b, edge, bbox) {
24425       return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
24426              edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
24427              edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
24428              edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
24429              null;
24430   }
24431
24432   // bit code reflects the point position relative to the bbox:
24433
24434   //         left  mid  right
24435   //    top  1001  1000  1010
24436   //    mid  0001  0000  0010
24437   // bottom  0101  0100  0110
24438
24439   function bitCode(p, bbox) {
24440       var code = 0;
24441
24442       if (p[0] < bbox[0]) code |= 1; // left
24443       else if (p[0] > bbox[2]) code |= 2; // right
24444
24445       if (p[1] < bbox[1]) code |= 4; // bottom
24446       else if (p[1] > bbox[3]) code |= 8; // top
24447
24448       return code;
24449   }
24450
24451   var whichPolygon_1 = whichPolygon;
24452
24453   function whichPolygon(data) {
24454       var bboxes = [];
24455       for (var i = 0; i < data.features.length; i++) {
24456           var feature = data.features[i];
24457           var coords = feature.geometry.coordinates;
24458
24459           if (feature.geometry.type === 'Polygon') {
24460               bboxes.push(treeItem(coords, feature.properties));
24461
24462           } else if (feature.geometry.type === 'MultiPolygon') {
24463               for (var j = 0; j < coords.length; j++) {
24464                   bboxes.push(treeItem(coords[j], feature.properties));
24465               }
24466           }
24467       }
24468
24469       var tree = rbush_1().load(bboxes);
24470
24471       function query(p, multi) {
24472           var output = [],
24473               result = tree.search({
24474                   minX: p[0],
24475                   minY: p[1],
24476                   maxX: p[0],
24477                   maxY: p[1]
24478               });
24479           for (var i = 0; i < result.length; i++) {
24480               if (insidePolygon(result[i].coords, p)) {
24481                   if (multi)
24482                       output.push(result[i].props);
24483                   else
24484                       return result[i].props;
24485               }
24486           }
24487           return multi && output.length ? output : null;
24488       }
24489
24490       query.tree = tree;
24491       query.bbox = function queryBBox(bbox) {
24492           var output = [];
24493           var result = tree.search({
24494               minX: bbox[0],
24495               minY: bbox[1],
24496               maxX: bbox[2],
24497               maxY: bbox[3]
24498           });
24499           for (var i = 0; i < result.length; i++) {
24500               if (polygonIntersectsBBox(result[i].coords, bbox)) {
24501                   output.push(result[i].props);
24502               }
24503           }
24504           return output;
24505       };
24506
24507       return query;
24508   }
24509
24510   function polygonIntersectsBBox(polygon, bbox) {
24511       var bboxCenter = [
24512           (bbox[0] + bbox[2]) / 2,
24513           (bbox[1] + bbox[3]) / 2
24514       ];
24515       if (insidePolygon(polygon, bboxCenter)) return true;
24516       for (var i = 0; i < polygon.length; i++) {
24517           if (lineclip_1(polygon[i], bbox).length > 0) return true;
24518       }
24519       return false;
24520   }
24521
24522   // ray casting algorithm for detecting if point is in polygon
24523   function insidePolygon(rings, p) {
24524       var inside = false;
24525       for (var i = 0, len = rings.length; i < len; i++) {
24526           var ring = rings[i];
24527           for (var j = 0, len2 = ring.length, k = len2 - 1; j < len2; k = j++) {
24528               if (rayIntersect(p, ring[j], ring[k])) inside = !inside;
24529           }
24530       }
24531       return inside;
24532   }
24533
24534   function rayIntersect(p, p1, p2) {
24535       return ((p1[1] > p[1]) !== (p2[1] > p[1])) && (p[0] < (p2[0] - p1[0]) * (p[1] - p1[1]) / (p2[1] - p1[1]) + p1[0]);
24536   }
24537
24538   function treeItem(coords, props) {
24539       var item = {
24540           minX: Infinity,
24541           minY: Infinity,
24542           maxX: -Infinity,
24543           maxY: -Infinity,
24544           coords: coords,
24545           props: props
24546       };
24547
24548       for (var i = 0; i < coords[0].length; i++) {
24549           var p = coords[0][i];
24550           item.minX = Math.min(item.minX, p[0]);
24551           item.minY = Math.min(item.minY, p[1]);
24552           item.maxX = Math.max(item.maxX, p[0]);
24553           item.maxY = Math.max(item.maxY, p[1]);
24554       }
24555       return item;
24556   }
24557
24558   var dataFeatureIcons = maki.layouts.all.all;
24559
24560   var features$4 = values$1(features$2).map(function(feature) {
24561       // workaround for which-polygon
24562       // only supports `properties`, not `id`
24563       // https://github.com/mapbox/which-polygon/pull/6
24564       feature.properties = {
24565           id: feature.id,
24566           area: d3_geoArea(feature)   // also precompute areas
24567       };
24568
24569       return feature;
24570   });
24571
24572   var data = {
24573       community: {
24574           features: features$2,
24575           resources: resources,
24576           query: whichPolygon_1({
24577               type: 'FeatureCollection',
24578               features: features$4
24579           })
24580       },
24581       imagery: dataImagery,
24582       presets: {
24583           presets: presets,
24584           defaults: defaults,
24585           categories: categories,
24586           fields: fields
24587       }
24588   };
24589
24590   function osmEntity$$1(attrs) {
24591       // For prototypal inheritance.
24592       if (this instanceof osmEntity$$1) return;
24593
24594       // Create the appropriate subtype.
24595       if (attrs && attrs.type) {
24596           return osmEntity$$1[attrs.type].apply(this, arguments);
24597       } else if (attrs && attrs.id) {
24598           return osmEntity$$1[osmEntity$$1.id.type(attrs.id)].apply(this, arguments);
24599       }
24600
24601       // Initialize a generic Entity (used only in tests).
24602       return (new osmEntity$$1()).initialize(arguments);
24603   }
24604
24605
24606   osmEntity$$1.id = function(type) {
24607       return osmEntity$$1.id.fromOSM(type, osmEntity$$1.id.next[type]--);
24608   };
24609
24610
24611   osmEntity$$1.id.next = {
24612       changeset: -1, node: -1, way: -1, relation: -1
24613   };
24614
24615
24616   osmEntity$$1.id.fromOSM = function(type, id) {
24617       return type[0] + id;
24618   };
24619
24620
24621   osmEntity$$1.id.toOSM = function(id) {
24622       return id.slice(1);
24623   };
24624
24625
24626   osmEntity$$1.id.type = function(id) {
24627       return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
24628   };
24629
24630
24631   // A function suitable for use as the second argument to d3.selection#data().
24632   osmEntity$$1.key = function(entity) {
24633       return entity.id + 'v' + (entity.v || 0);
24634   };
24635
24636
24637   osmEntity$$1.prototype = {
24638
24639       tags: {},
24640
24641
24642       initialize: function(sources) {
24643           for (var i = 0; i < sources.length; ++i) {
24644               var source = sources[i];
24645               for (var prop in source) {
24646                   if (Object.prototype.hasOwnProperty.call(source, prop)) {
24647                       if (source[prop] === undefined) {
24648                           delete this[prop];
24649                       } else {
24650                           this[prop] = source[prop];
24651                       }
24652                   }
24653               }
24654           }
24655
24656           if (!this.id && this.type) {
24657               this.id = osmEntity$$1.id(this.type);
24658           }
24659           if (!this.hasOwnProperty('visible')) {
24660               this.visible = true;
24661           }
24662
24663           if (debug) {
24664               Object.freeze(this);
24665               Object.freeze(this.tags);
24666
24667               if (this.loc) Object.freeze(this.loc);
24668               if (this.nodes) Object.freeze(this.nodes);
24669               if (this.members) Object.freeze(this.members);
24670           }
24671
24672           return this;
24673       },
24674
24675
24676       copy: function(resolver, copies) {
24677           if (copies[this.id])
24678               return copies[this.id];
24679
24680           var copy = osmEntity$$1(this, {id: undefined, user: undefined, version: undefined});
24681           copies[this.id] = copy;
24682
24683           return copy;
24684       },
24685
24686
24687       osmId: function() {
24688           return osmEntity$$1.id.toOSM(this.id);
24689       },
24690
24691
24692       isNew: function() {
24693           return this.osmId() < 0;
24694       },
24695
24696
24697       update: function(attrs) {
24698           return osmEntity$$1(this, attrs, {v: 1 + (this.v || 0)});
24699       },
24700
24701
24702       mergeTags: function(tags) {
24703           var merged = clone(this.tags), changed = false;
24704           for (var k in tags) {
24705               var t1 = merged[k],
24706                   t2 = tags[k];
24707               if (!t1) {
24708                   changed = true;
24709                   merged[k] = t2;
24710               } else if (t1 !== t2) {
24711                   changed = true;
24712                   merged[k] = union(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
24713               }
24714           }
24715           return changed ? this.update({tags: merged}) : this;
24716       },
24717
24718
24719       intersects: function(extent, resolver) {
24720           return this.extent(resolver).intersects(extent);
24721       },
24722
24723
24724       isUsed: function(resolver) {
24725           return without(Object.keys(this.tags), 'area').length > 0 ||
24726               resolver.parentRelations(this).length > 0;
24727       },
24728
24729
24730       hasInterestingTags: function() {
24731           return keys$1(this.tags).some(osmIsInterestingTag);
24732       },
24733
24734
24735       isHighwayIntersection: function() {
24736           return false;
24737       },
24738
24739       isDegenerate: function() {
24740           return true;
24741       },
24742
24743       deprecatedTags: function() {
24744           var tags = toPairs(this.tags);
24745           var deprecated = {};
24746
24747           dataDeprecated.forEach(function(d) {
24748               var match = toPairs(d.old)[0];
24749               tags.forEach(function(t) {
24750                   if (t[0] === match[0] &&
24751                       (t[1] === match[1] || match[1] === '*')) {
24752                       deprecated[t[0]] = t[1];
24753                   }
24754               });
24755           });
24756
24757           return deprecated;
24758       }
24759   };
24760
24761   function geoExtent$$1(min, max) {
24762       if (!(this instanceof geoExtent$$1)) {
24763           return new geoExtent$$1(min, max);
24764       } else if (min instanceof geoExtent$$1) {
24765           return min;
24766       } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
24767           this[0] = min[0];
24768           this[1] = min[1];
24769       } else {
24770           this[0] = min        || [ Infinity,  Infinity];
24771           this[1] = max || min || [-Infinity, -Infinity];
24772       }
24773   }
24774
24775   // $FlowFixMe
24776   geoExtent$$1.prototype = new Array(2);
24777
24778   assignIn(geoExtent$$1.prototype, {
24779
24780       equals: function (obj) {
24781           return this[0][0] === obj[0][0] &&
24782               this[0][1] === obj[0][1] &&
24783               this[1][0] === obj[1][0] &&
24784               this[1][1] === obj[1][1];
24785       },
24786
24787
24788       extend: function(obj) {
24789           if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24790           return geoExtent$$1(
24791               [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
24792               [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
24793           );
24794       },
24795
24796
24797       _extend: function(extent) {
24798           this[0][0] = Math.min(extent[0][0], this[0][0]);
24799           this[0][1] = Math.min(extent[0][1], this[0][1]);
24800           this[1][0] = Math.max(extent[1][0], this[1][0]);
24801           this[1][1] = Math.max(extent[1][1], this[1][1]);
24802       },
24803
24804
24805       area: function() {
24806           return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
24807       },
24808
24809
24810       center: function() {
24811           return [(this[0][0] + this[1][0]) / 2, (this[0][1] + this[1][1]) / 2];
24812       },
24813
24814
24815       rectangle: function() {
24816           return [this[0][0], this[0][1], this[1][0], this[1][1]];
24817       },
24818
24819
24820       bbox: function() {
24821           return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
24822       },
24823
24824
24825       polygon: function() {
24826           return [
24827               [this[0][0], this[0][1]],
24828               [this[0][0], this[1][1]],
24829               [this[1][0], this[1][1]],
24830               [this[1][0], this[0][1]],
24831               [this[0][0], this[0][1]]
24832           ];
24833       },
24834
24835
24836       contains: function(obj) {
24837           if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24838           return obj[0][0] >= this[0][0] &&
24839                  obj[0][1] >= this[0][1] &&
24840                  obj[1][0] <= this[1][0] &&
24841                  obj[1][1] <= this[1][1];
24842       },
24843
24844
24845       intersects: function(obj) {
24846           if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24847           return obj[0][0] <= this[1][0] &&
24848                  obj[0][1] <= this[1][1] &&
24849                  obj[1][0] >= this[0][0] &&
24850                  obj[1][1] >= this[0][1];
24851       },
24852
24853
24854       intersection: function(obj) {
24855           if (!this.intersects(obj)) return new geoExtent$$1();
24856           return new geoExtent$$1(
24857               [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
24858               [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
24859           );
24860       },
24861
24862
24863       percentContainedIn: function(obj) {
24864           if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24865           var a1 = this.intersection(obj).area();
24866           var a2 = this.area();
24867
24868           if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
24869               return 0;
24870           } else {
24871               return a1 / a2;
24872           }
24873       },
24874
24875
24876       padByMeters: function(meters) {
24877           var dLat = geoMetersToLat(meters);
24878           var dLon = geoMetersToLon(meters, this.center()[1]);
24879           return geoExtent$$1(
24880               [this[0][0] - dLon, this[0][1] - dLat],
24881               [this[1][0] + dLon, this[1][1] + dLat]
24882           );
24883       },
24884
24885
24886       toParam: function() {
24887           return this.rectangle().join(',');
24888       }
24889
24890   });
24891
24892   // constants
24893   var TAU = 2 * Math.PI;
24894   var EQUATORIAL_RADIUS = 6356752.314245179;
24895   var POLAR_RADIUS = 6378137.0;
24896
24897
24898   function geoLatToMeters(dLat) {
24899       return dLat * (TAU * POLAR_RADIUS / 360);
24900   }
24901
24902
24903   function geoLonToMeters(dLon, atLat) {
24904       return Math.abs(atLat) >= 90 ? 0 :
24905           dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180)));
24906   }
24907
24908
24909   function geoMetersToLat(m) {
24910       return m / (TAU * POLAR_RADIUS / 360);
24911   }
24912
24913
24914   function geoMetersToLon(m, atLat) {
24915       return Math.abs(atLat) >= 90 ? 0 :
24916           m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180)));
24917   }
24918
24919
24920   function geoMetersToOffset(meters, tileSize) {
24921       tileSize = tileSize || 256;
24922       return [
24923           meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS),
24924           -meters[1] * tileSize / (TAU * POLAR_RADIUS)
24925       ];
24926   }
24927
24928
24929   function geoOffsetToMeters(offset, tileSize) {
24930       tileSize = tileSize || 256;
24931       return [
24932           offset[0] * TAU * EQUATORIAL_RADIUS / tileSize,
24933           -offset[1] * TAU * POLAR_RADIUS / tileSize
24934       ];
24935   }
24936
24937
24938   // Equirectangular approximation of spherical distances on Earth
24939   function geoSphericalDistance(a, b) {
24940       var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2);
24941       var y = geoLatToMeters(a[1] - b[1]);
24942       return Math.sqrt((x * x) + (y * y));
24943   }
24944
24945
24946   // scale to zoom
24947   function geoScaleToZoom(k, tileSize) {
24948       tileSize = tileSize || 256;
24949       var log2ts = Math.log(tileSize) * Math.LOG2E;
24950       return Math.log(k * TAU) / Math.LN2 - log2ts;
24951   }
24952
24953
24954   // zoom to scale
24955   function geoZoomToScale(z, tileSize) {
24956       tileSize = tileSize || 256;
24957       return tileSize * Math.pow(2, z) / TAU;
24958   }
24959
24960   /**
24961    * A specialized version of `_.every` for arrays without support for
24962    * iteratee shorthands.
24963    *
24964    * @private
24965    * @param {Array} [array] The array to iterate over.
24966    * @param {Function} predicate The function invoked per iteration.
24967    * @returns {boolean} Returns `true` if all elements pass the predicate check,
24968    *  else `false`.
24969    */
24970   function arrayEvery(array, predicate) {
24971     var index = -1,
24972         length = array == null ? 0 : array.length;
24973
24974     while (++index < length) {
24975       if (!predicate(array[index], index, array)) {
24976         return false;
24977       }
24978     }
24979     return true;
24980   }
24981
24982   /**
24983    * The base implementation of `_.every` without support for iteratee shorthands.
24984    *
24985    * @private
24986    * @param {Array|Object} collection The collection to iterate over.
24987    * @param {Function} predicate The function invoked per iteration.
24988    * @returns {boolean} Returns `true` if all elements pass the predicate check,
24989    *  else `false`
24990    */
24991   function baseEvery(collection, predicate) {
24992     var result = true;
24993     baseEach(collection, function(value, index, collection) {
24994       result = !!predicate(value, index, collection);
24995       return result;
24996     });
24997     return result;
24998   }
24999
25000   /**
25001    * Checks if `predicate` returns truthy for **all** elements of `collection`.
25002    * Iteration is stopped once `predicate` returns falsey. The predicate is
25003    * invoked with three arguments: (value, index|key, collection).
25004    *
25005    * **Note:** This method returns `true` for
25006    * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
25007    * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
25008    * elements of empty collections.
25009    *
25010    * @static
25011    * @memberOf _
25012    * @since 0.1.0
25013    * @category Collection
25014    * @param {Array|Object} collection The collection to iterate over.
25015    * @param {Function} [predicate=_.identity] The function invoked per iteration.
25016    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
25017    * @returns {boolean} Returns `true` if all elements pass the predicate check,
25018    *  else `false`.
25019    * @example
25020    *
25021    * _.every([true, 1, null, 'yes'], Boolean);
25022    * // => false
25023    *
25024    * var users = [
25025    *   { 'user': 'barney', 'age': 36, 'active': false },
25026    *   { 'user': 'fred',   'age': 40, 'active': false }
25027    * ];
25028    *
25029    * // The `_.matches` iteratee shorthand.
25030    * _.every(users, { 'user': 'barney', 'active': false });
25031    * // => false
25032    *
25033    * // The `_.matchesProperty` iteratee shorthand.
25034    * _.every(users, ['active', false]);
25035    * // => true
25036    *
25037    * // The `_.property` iteratee shorthand.
25038    * _.every(users, 'active');
25039    * // => false
25040    */
25041   function every(collection, predicate, guard) {
25042     var func = isArray(collection) ? arrayEvery : baseEvery;
25043     if (guard && isIterateeCall(collection, predicate, guard)) {
25044       predicate = undefined;
25045     }
25046     return func(collection, baseIteratee(predicate, 3));
25047   }
25048
25049   /**
25050    * The base implementation of `_.some` without support for iteratee shorthands.
25051    *
25052    * @private
25053    * @param {Array|Object} collection The collection to iterate over.
25054    * @param {Function} predicate The function invoked per iteration.
25055    * @returns {boolean} Returns `true` if any element passes the predicate check,
25056    *  else `false`.
25057    */
25058   function baseSome(collection, predicate) {
25059     var result;
25060
25061     baseEach(collection, function(value, index, collection) {
25062       result = predicate(value, index, collection);
25063       return !result;
25064     });
25065     return !!result;
25066   }
25067
25068   /**
25069    * Checks if `predicate` returns truthy for **any** element of `collection`.
25070    * Iteration is stopped once `predicate` returns truthy. The predicate is
25071    * invoked with three arguments: (value, index|key, collection).
25072    *
25073    * @static
25074    * @memberOf _
25075    * @since 0.1.0
25076    * @category Collection
25077    * @param {Array|Object} collection The collection to iterate over.
25078    * @param {Function} [predicate=_.identity] The function invoked per iteration.
25079    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
25080    * @returns {boolean} Returns `true` if any element passes the predicate check,
25081    *  else `false`.
25082    * @example
25083    *
25084    * _.some([null, 0, 'yes', false], Boolean);
25085    * // => true
25086    *
25087    * var users = [
25088    *   { 'user': 'barney', 'active': true },
25089    *   { 'user': 'fred',   'active': false }
25090    * ];
25091    *
25092    * // The `_.matches` iteratee shorthand.
25093    * _.some(users, { 'user': 'barney', 'active': false });
25094    * // => false
25095    *
25096    * // The `_.matchesProperty` iteratee shorthand.
25097    * _.some(users, ['active', false]);
25098    * // => true
25099    *
25100    * // The `_.property` iteratee shorthand.
25101    * _.some(users, 'active');
25102    * // => true
25103    */
25104   function some(collection, predicate, guard) {
25105     var func = isArray(collection) ? arraySome : baseSome;
25106     if (guard && isIterateeCall(collection, predicate, guard)) {
25107       predicate = undefined;
25108     }
25109     return func(collection, baseIteratee(predicate, 3));
25110   }
25111
25112   // vector equals
25113   function geoVecEqual(a, b, epsilon) {
25114       if (epsilon) {
25115           return (Math.abs(a[0] - b[0]) <= epsilon) && (Math.abs(a[1] - b[1]) <= epsilon);
25116       } else {
25117           return (a[0] === b[0]) && (a[1] === b[1]);
25118       }
25119   }
25120
25121   // vector addition
25122   function geoVecAdd(a, b) {
25123       return [ a[0] + b[0], a[1] + b[1] ];
25124   }
25125
25126   // vector subtraction
25127   function geoVecSubtract(a, b) {
25128       return [ a[0] - b[0], a[1] - b[1] ];
25129   }
25130
25131   // vector scaling
25132   function geoVecScale(a, mag) {
25133       return [ a[0] * mag, a[1] * mag ];
25134   }
25135
25136   // vector rounding (was: geoRoundCoordinates)
25137   function geoVecFloor(a) {
25138       return [ Math.floor(a[0]), Math.floor(a[1]) ];
25139   }
25140
25141   // linear interpolation
25142   function geoVecInterp(a, b, t) {
25143       return [
25144           a[0] + (b[0] - a[0]) * t,
25145           a[1] + (b[1] - a[1]) * t
25146       ];
25147   }
25148
25149   // http://jsperf.com/id-dist-optimization
25150   function geoVecLength(a, b) {
25151       var x = a[0] - b[0];
25152       var y = a[1] - b[1];
25153       return Math.sqrt((x * x) + (y * y));
25154   }
25155
25156   // Return the counterclockwise angle in the range (-pi, pi)
25157   // between the positive X axis and the line intersecting a and b.
25158   function geoVecAngle(a, b) {
25159       return Math.atan2(b[1] - a[1], b[0] - a[0]);
25160   }
25161
25162   // dot product
25163   function geoVecDot(a, b, origin) {
25164       origin = origin || [0, 0];
25165       return (a[0] - origin[0]) * (b[0] - origin[0]) +
25166           (a[1] - origin[1]) * (b[1] - origin[1]);
25167   }
25168
25169   // 2D cross product of OA and OB vectors, returns magnitude of Z vector
25170   // Returns a positive value, if OAB makes a counter-clockwise turn,
25171   // negative for clockwise turn, and zero if the points are collinear.
25172   function geoVecCross(a, b, origin) {
25173       origin = origin || [0, 0];
25174       return (a[0] - origin[0]) * (b[1] - origin[1]) -
25175           (a[1] - origin[1]) * (b[0] - origin[0]);
25176   }
25177
25178   // Return the counterclockwise angle in the range (-pi, pi)
25179   // between the positive X axis and the line intersecting a and b.
25180   function geoAngle(a, b, projection) {
25181       return geoVecAngle(projection(a.loc), projection(b.loc));
25182   }
25183
25184   function geoEdgeEqual(a, b) {
25185       return (a[0] === b[0] && a[1] === b[1]) ||
25186           (a[0] === b[1] && a[1] === b[0]);
25187   }
25188
25189   // Rotate all points counterclockwise around a pivot point by given angle
25190   function geoRotate(points, angle, around) {
25191       return points.map(function(point) {
25192           var radial = geoVecSubtract(point, around);
25193           return [
25194               radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0],
25195               radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]
25196           ];
25197       });
25198   }
25199
25200
25201   // Choose the edge with the minimal distance from `point` to its orthogonal
25202   // projection onto that edge, if such a projection exists, or the distance to
25203   // the closest vertex on that edge. Returns an object with the `index` of the
25204   // chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
25205   function geoChooseEdge(nodes, point, projection, activeID) {
25206       var dist = geoVecLength;
25207       var points = nodes.map(function(n) { return projection(n.loc); });
25208       var ids = nodes.map(function(n) { return n.id; });
25209       var min = Infinity;
25210       var idx;
25211       var loc;
25212
25213       for (var i = 0; i < points.length - 1; i++) {
25214           if (ids[i] === activeID || ids[i + 1] === activeID) continue;
25215
25216           var o = points[i];
25217           var s = geoVecSubtract(points[i + 1], o);
25218           var v = geoVecSubtract(point, o);
25219           var proj = geoVecDot(v, s) / geoVecDot(s, s);
25220           var p;
25221
25222           if (proj < 0) {
25223               p = o;
25224           } else if (proj > 1) {
25225               p = points[i + 1];
25226           } else {
25227               p = [o[0] + proj * s[0], o[1] + proj * s[1]];
25228           }
25229
25230           var d = dist(p, point);
25231           if (d < min) {
25232               min = d;
25233               idx = i + 1;
25234               loc = projection.invert(p);
25235           }
25236       }
25237
25238       if (idx !== undefined) {
25239           return { index: idx, distance: min, loc: loc };
25240       } else {
25241           return null;
25242       }
25243   }
25244
25245
25246   // Test active (dragged or drawing) segments against inactive segments
25247   // This is used to test e.g. multipolygon rings that cross
25248   // `activeNodes` is the ring containing the activeID being dragged.
25249   // `inactiveNodes` is the other ring to test against
25250   function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) {
25251       var actives = [];
25252       var inactives = [];
25253       var j, k, n1, n2, segment;
25254
25255       // gather active segments (only segments in activeNodes that contain the activeID)
25256       for (j = 0; j < activeNodes.length - 1; j++) {
25257           n1 = activeNodes[j];
25258           n2 = activeNodes[j+1];
25259           segment = [n1.loc, n2.loc];
25260           if (n1.id === activeID || n2.id === activeID) {
25261               actives.push(segment);
25262           }
25263       }
25264
25265       // gather inactive segments
25266       for (j = 0; j < inactiveNodes.length - 1; j++) {
25267           n1 = inactiveNodes[j];
25268           n2 = inactiveNodes[j+1];
25269           segment = [n1.loc, n2.loc];
25270           inactives.push(segment);
25271       }
25272
25273       // test
25274       for (j = 0; j < actives.length; j++) {
25275           for (k = 0; k < inactives.length; k++) {
25276               var p = actives[j];
25277               var q = inactives[k];
25278               var hit = geoLineIntersection(p, q);
25279               if (hit) {
25280                   return true;
25281               }
25282           }
25283       }
25284
25285       return false;
25286   }
25287
25288
25289   // Test active (dragged or drawing) segments against inactive segments
25290   // This is used to test whether a way intersects with itself.
25291   function geoHasSelfIntersections(nodes, activeID) {
25292       var actives = [];
25293       var inactives = [];
25294       var j, k;
25295
25296       // group active and passive segments along the nodes
25297       for (j = 0; j < nodes.length - 1; j++) {
25298           var n1 = nodes[j];
25299           var n2 = nodes[j+1];
25300           var segment = [n1.loc, n2.loc];
25301           if (n1.id === activeID || n2.id === activeID) {
25302               actives.push(segment);
25303           } else {
25304               inactives.push(segment);
25305           }
25306       }
25307
25308       // test
25309       for (j = 0; j < actives.length; j++) {
25310           for (k = 0; k < inactives.length; k++) {
25311               var p = actives[j];
25312               var q = inactives[k];
25313               // skip if segments share an endpoint
25314               if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) ||
25315                   geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1]) ) {
25316                   continue;
25317               }
25318
25319               var hit = geoLineIntersection(p, q);
25320               if (hit) {
25321                   var epsilon = 1e-8;
25322                   // skip if the hit is at the segment's endpoint
25323                   if (geoVecEqual(p[1], hit, epsilon) || geoVecEqual(p[0], hit, epsilon) ||
25324                       geoVecEqual(q[1], hit, epsilon) || geoVecEqual(q[0], hit, epsilon) ) {
25325                       continue;
25326                   } else {
25327                       return true;
25328                   }
25329               }
25330           }
25331       }
25332
25333       return false;
25334   }
25335
25336
25337   // Return the intersection point of 2 line segments.
25338   // From https://github.com/pgkelley4/line-segments-intersect
25339   // This uses the vector cross product approach described below:
25340   //  http://stackoverflow.com/a/565282/786339
25341   function geoLineIntersection(a, b) {
25342       var p = [a[0][0], a[0][1]];
25343       var p2 = [a[1][0], a[1][1]];
25344       var q = [b[0][0], b[0][1]];
25345       var q2 = [b[1][0], b[1][1]];
25346       var r = geoVecSubtract(p2, p);
25347       var s = geoVecSubtract(q2, q);
25348       var uNumerator = geoVecCross(geoVecSubtract(q, p), r);
25349       var denominator = geoVecCross(r, s);
25350
25351       if (uNumerator && denominator) {
25352           var u = uNumerator / denominator;
25353           var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
25354
25355           if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
25356               return geoVecInterp(p, p2, t);
25357           }
25358       }
25359
25360       return null;
25361   }
25362
25363
25364   function geoPathIntersections(path1, path2) {
25365       var intersections = [];
25366       for (var i = 0; i < path1.length - 1; i++) {
25367           for (var j = 0; j < path2.length - 1; j++) {
25368               var a = [ path1[i], path1[i+1] ];
25369               var b = [ path2[j], path2[j+1] ];
25370               var hit = geoLineIntersection(a, b);
25371               if (hit) {
25372                   intersections.push(hit);
25373               }
25374           }
25375       }
25376       return intersections;
25377   }
25378
25379   function geoPathHasIntersections(path1, path2) {
25380       for (var i = 0; i < path1.length - 1; i++) {
25381           for (var j = 0; j < path2.length - 1; j++) {
25382               var a = [ path1[i], path1[i+1] ];
25383               var b = [ path2[j], path2[j+1] ];
25384               var hit = geoLineIntersection(a, b);
25385               if (hit) {
25386                   return true;
25387               }
25388           }
25389       }
25390       return false;
25391   }
25392
25393
25394   // Return whether point is contained in polygon.
25395   //
25396   // `point` should be a 2-item array of coordinates.
25397   // `polygon` should be an array of 2-item arrays of coordinates.
25398   //
25399   // From https://github.com/substack/point-in-polygon.
25400   // ray-casting algorithm based on
25401   // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
25402   //
25403   function geoPointInPolygon(point, polygon) {
25404       var x = point[0];
25405       var y = point[1];
25406       var inside = false;
25407
25408       for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
25409           var xi = polygon[i][0];
25410           var yi = polygon[i][1];
25411           var xj = polygon[j][0];
25412           var yj = polygon[j][1];
25413
25414           var intersect = ((yi > y) !== (yj > y)) &&
25415               (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
25416           if (intersect) inside = !inside;
25417       }
25418
25419       return inside;
25420   }
25421
25422
25423   function geoPolygonContainsPolygon(outer, inner) {
25424       return every(inner, function(point) {
25425           return geoPointInPolygon(point, outer);
25426       });
25427   }
25428
25429
25430   function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
25431       function testPoints(outer, inner) {
25432           return some(inner, function(point) {
25433               return geoPointInPolygon(point, outer);
25434           });
25435       }
25436
25437      return testPoints(outer, inner) || (!!checkSegments && geoPathHasIntersections(outer, inner));
25438   }
25439
25440
25441   function geoPathLength(path) {
25442       var length = 0;
25443       for (var i = 0; i < path.length - 1; i++) {
25444           length += geoVecLength(path[i], path[i + 1]);
25445       }
25446       return length;
25447   }
25448
25449
25450   // If the given point is at the edge of the padded viewport,
25451   // return a vector that will nudge the viewport in that direction
25452   function geoViewportEdge(point, dimensions) {
25453       var pad = [80, 20, 50, 20];   // top, right, bottom, left
25454       var x = 0;
25455       var y = 0;
25456
25457       if (point[0] > dimensions[0] - pad[1])
25458           x = -10;
25459       if (point[0] < pad[3])
25460           x = 10;
25461       if (point[1] > dimensions[1] - pad[2])
25462           y = -10;
25463       if (point[1] < pad[0])
25464           y = 10;
25465
25466       if (x || y) {
25467           return [x, y];
25468       } else {
25469           return null;
25470       }
25471   }
25472
25473   /*
25474       Bypasses features of D3's default projection stream pipeline that are unnecessary:
25475       * Antimeridian clipping
25476       * Spherical rotation
25477       * Resampling
25478   */
25479   function geoRawMercator() {
25480       var project = mercatorRaw;
25481       var k = 512 / Math.PI; // scale
25482       var x = 0;
25483       var y = 0; // translate
25484       var clipExtent = [[0, 0], [0, 0]];
25485
25486
25487       function projection$$1(point) {
25488           point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
25489           return [point[0] * k + x, y - point[1] * k];
25490       }
25491
25492
25493       projection$$1.invert = function(point) {
25494           point = project.invert((point[0] - x) / k, (y - point[1]) / k);
25495           return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
25496       };
25497
25498
25499       projection$$1.scale = function(_) {
25500           if (!arguments.length) return k;
25501           k = +_;
25502           return projection$$1;
25503       };
25504
25505
25506       projection$$1.translate = function(_) {
25507           if (!arguments.length) return [x, y];
25508           x = +_[0];
25509           y = +_[1];
25510           return projection$$1;
25511       };
25512
25513
25514       projection$$1.clipExtent = function(_) {
25515           if (!arguments.length) return clipExtent;
25516           clipExtent = _;
25517           return projection$$1;
25518       };
25519
25520
25521       projection$$1.transform = function(obj) {
25522           if (!arguments.length) return identity$7.translate(x, y).scale(k);
25523           x = +obj.x;
25524           y = +obj.y;
25525           k = +obj.k;
25526           return projection$$1;
25527       };
25528
25529
25530       projection$$1.stream = d3_geoTransform({
25531           point: function(x, y) {
25532               var vec = projection$$1([x, y]);
25533               this.stream.point(vec[0], vec[1]);
25534           }
25535       }).stream;
25536
25537
25538       return projection$$1;
25539   }
25540
25541   function osmChangeset() {
25542       if (!(this instanceof osmChangeset)) {
25543           return (new osmChangeset()).initialize(arguments);
25544       } else if (arguments.length) {
25545           this.initialize(arguments);
25546       }
25547   }
25548
25549
25550   osmEntity$$1.changeset = osmChangeset;
25551
25552   osmChangeset.prototype = Object.create(osmEntity$$1.prototype);
25553
25554   assignIn(osmChangeset.prototype, {
25555
25556       type: 'changeset',
25557
25558
25559       extent: function() {
25560           return new geoExtent$$1();
25561       },
25562
25563
25564       geometry: function() {
25565           return 'changeset';
25566       },
25567
25568
25569       asJXON: function() {
25570           return {
25571               osm: {
25572                   changeset: {
25573                       tag: map$3(this.tags, function(value, key) {
25574                           return { '@k': key, '@v': value };
25575                       }),
25576                       '@version': 0.6,
25577                       '@generator': 'iD'
25578                   }
25579               }
25580           };
25581       },
25582
25583
25584       // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
25585       // XML. Returns a string.
25586       osmChangeJXON: function(changes) {
25587           var changeset_id = this.id;
25588
25589           function nest(x, order) {
25590               var groups = {};
25591               for (var i = 0; i < x.length; i++) {
25592                   var tagName = Object.keys(x[i])[0];
25593                   if (!groups[tagName]) groups[tagName] = [];
25594                   groups[tagName].push(x[i][tagName]);
25595               }
25596               var ordered = {};
25597               order.forEach(function(o) {
25598                   if (groups[o]) ordered[o] = groups[o];
25599               });
25600               return ordered;
25601           }
25602
25603
25604           // sort relations in a changeset by dependencies
25605           function sort(changes) {
25606
25607               // find a referenced relation in the current changeset
25608               function resolve(item) {
25609                   return find$1(relations, function(relation) {
25610                       return item.keyAttributes.type === 'relation'
25611                           && item.keyAttributes.ref === relation['@id'];
25612                   });
25613               }
25614
25615               // a new item is an item that has not been already processed
25616               function isNew(item) {
25617                   return !sorted[ item['@id'] ] && !find$1(processing, function(proc) {
25618                       return proc['@id'] === item['@id'];
25619                   });
25620               }
25621
25622               var processing = [],
25623                   sorted = {},
25624                   relations = changes.relation;
25625
25626               if (!relations) return changes;
25627
25628               for (var i = 0; i < relations.length; i++) {
25629                   var relation = relations[i];
25630
25631                   // skip relation if already sorted
25632                   if (!sorted[relation['@id']]) {
25633                       processing.push(relation);
25634                   }
25635
25636                   while (processing.length > 0) {
25637                       var next = processing[0],
25638                       deps = filter(compact(next.member.map(resolve)), isNew);
25639                       if (deps.length === 0) {
25640                           sorted[next['@id']] = next;
25641                           processing.shift();
25642                       } else {
25643                           processing = deps.concat(processing);
25644                       }
25645                   }
25646               }
25647
25648               changes.relation = values$1(sorted);
25649               return changes;
25650           }
25651
25652           function rep(entity) {
25653               return entity.asJXON(changeset_id);
25654           }
25655
25656           return {
25657               osmChange: {
25658                   '@version': 0.6,
25659                   '@generator': 'iD',
25660                   'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
25661                   'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
25662                   'delete': assignIn(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), { '@if-unused': true })
25663               }
25664           };
25665       },
25666
25667
25668       asGeoJSON: function() {
25669           return {};
25670       }
25671
25672   });
25673
25674   /**
25675    * Creates a duplicate-free version of an array, using
25676    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
25677    * for equality comparisons, in which only the first occurrence of each element
25678    * is kept. The order of result values is determined by the order they occur
25679    * in the array.
25680    *
25681    * @static
25682    * @memberOf _
25683    * @since 0.1.0
25684    * @category Array
25685    * @param {Array} array The array to inspect.
25686    * @returns {Array} Returns the new duplicate free array.
25687    * @example
25688    *
25689    * _.uniq([2, 1, 2]);
25690    * // => [2, 1]
25691    */
25692   function uniq(array) {
25693     return (array && array.length) ? baseUniq(array) : [];
25694   }
25695
25696   function osmNode() {
25697       if (!(this instanceof osmNode)) {
25698           return (new osmNode()).initialize(arguments);
25699       } else if (arguments.length) {
25700           this.initialize(arguments);
25701       }
25702   }
25703
25704   osmEntity$$1.node = osmNode;
25705
25706   osmNode.prototype = Object.create(osmEntity$$1.prototype);
25707
25708   assignIn(osmNode.prototype, {
25709
25710       type: 'node',
25711
25712
25713       extent: function() {
25714           return new geoExtent$$1(this.loc);
25715       },
25716
25717
25718       geometry: function(graph) {
25719           return graph.transient(this, 'geometry', function() {
25720               return graph.isPoi(this) ? 'point' : 'vertex';
25721           });
25722       },
25723
25724
25725       move: function(loc) {
25726           return this.update({loc: loc});
25727       },
25728
25729
25730       isDegenerate: function() {
25731           return !(
25732               Array.isArray(this.loc) && this.loc.length === 2 &&
25733               this.loc[0] >= -180 && this.loc[0] <= 180 &&
25734               this.loc[1] >= -90 && this.loc[1] <= 90
25735           );
25736       },
25737
25738
25739       // Inspect tags and geometry to determine which direction(s) this node/vertex points
25740       directions: function(resolver, projection) {
25741           var val;
25742           var i;
25743
25744           // which tag to use?
25745           if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') {
25746               // all-way stop tag on a highway intersection
25747               val = 'all';
25748           } else {
25749               // generic direction tag
25750               val = (this.tags.direction || '').toLowerCase();
25751
25752               // better suffix-style direction tag
25753               var re = /:direction$/i;
25754               var keys = Object.keys(this.tags);
25755               for (i = 0; i < keys.length; i++) {
25756                   if (re.test(keys[i])) {
25757                       val = this.tags[keys[i]].toLowerCase();
25758                       break;
25759                   }
25760               }
25761           }
25762
25763           if (val === '') return [];
25764
25765           var cardinal = {
25766               north: 0,               n: 0,
25767               northnortheast: 22,     nne: 22,
25768               northeast: 45,          ne: 45,
25769               eastnortheast: 67,      ene: 67,
25770               east: 90,               e: 90,
25771               eastsoutheast: 112,     ese: 112,
25772               southeast: 135,         se: 135,
25773               southsoutheast: 157,    sse: 157,
25774               south: 180,             s: 180,
25775               southsouthwest: 202,    ssw: 202,
25776               southwest: 225,         sw: 225,
25777               westsouthwest: 247,     wsw: 247,
25778               west: 270,              w: 270,
25779               westnorthwest: 292,     wnw: 292,
25780               northwest: 315,         nw: 315,
25781               northnorthwest: 337,    nnw: 337
25782           };
25783
25784
25785           var values = val.split(';');
25786           var results = [];
25787
25788           values.forEach(function(v) {
25789               // swap cardinal for numeric directions
25790               if (cardinal[v] !== undefined) {
25791                   v = cardinal[v];
25792               }
25793
25794               // numeric direction - just add to results
25795               if (v !== '' && !isNaN(+v)) {
25796                   results.push(+v);
25797                   return;
25798               }
25799
25800               // string direction - inspect parent ways
25801               var lookBackward =
25802                   (this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all');
25803               var lookForward =
25804                   (this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all');
25805
25806               if (!lookForward && !lookBackward) return;
25807
25808               var nodeIds = {};
25809               resolver.parentWays(this).forEach(function(parent) {
25810                   var nodes = parent.nodes;
25811                   for (i = 0; i < nodes.length; i++) {
25812                       if (nodes[i] === this.id) {  // match current entity
25813                           if (lookForward && i > 0) {
25814                               nodeIds[nodes[i - 1]] = true;  // look back to prev node
25815                           }
25816                           if (lookBackward && i < nodes.length - 1) {
25817                               nodeIds[nodes[i + 1]] = true;  // look ahead to next node
25818                           }
25819                       }
25820                   }
25821               }, this);
25822
25823               Object.keys(nodeIds).forEach(function(nodeId) {
25824                   // +90 because geoAngle returns angle from X axis, not Y (north)
25825                   results.push(
25826                       (geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI)) + 90
25827                   );
25828               }, this);
25829
25830           }, this);
25831
25832           return uniq(results);
25833       },
25834
25835
25836       isEndpoint: function(resolver) {
25837           return resolver.transient(this, 'isEndpoint', function() {
25838               var id = this.id;
25839               return resolver.parentWays(this).filter(function(parent) {
25840                   return !parent.isClosed() && !!parent.affix(id);
25841               }).length > 0;
25842           });
25843       },
25844
25845
25846       isConnected: function(resolver) {
25847           return resolver.transient(this, 'isConnected', function() {
25848               var parents = resolver.parentWays(this);
25849
25850               function isLine(entity) {
25851                   return entity.geometry(resolver) === 'line' &&
25852                       entity.hasInterestingTags();
25853               }
25854
25855               // vertex is connected to multiple parent lines
25856               if (parents.length > 1 && some(parents, isLine)) {
25857                   return true;
25858
25859               } else if (parents.length === 1) {
25860                   var way = parents[0],
25861                       nodes = way.nodes.slice();
25862                   if (way.isClosed()) { nodes.pop(); }  // ignore connecting node if closed
25863
25864                   // return true if vertex appears multiple times (way is self intersecting)
25865                   return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
25866               }
25867
25868               return false;
25869           });
25870       },
25871
25872
25873       isIntersection: function(resolver) {
25874           return resolver.transient(this, 'isIntersection', function() {
25875               return resolver.parentWays(this).filter(function(parent) {
25876                   return (parent.tags.highway ||
25877                       parent.tags.waterway ||
25878                       parent.tags.railway ||
25879                       parent.tags.aeroway) &&
25880                       parent.geometry(resolver) === 'line';
25881               }).length > 1;
25882           });
25883       },
25884
25885
25886       isHighwayIntersection: function(resolver) {
25887           return resolver.transient(this, 'isHighwayIntersection', function() {
25888               return resolver.parentWays(this).filter(function(parent) {
25889                   return parent.tags.highway && parent.geometry(resolver) === 'line';
25890               }).length > 1;
25891           });
25892       },
25893
25894
25895       isOnAddressLine: function(resolver) {
25896           return resolver.transient(this, 'isOnAddressLine', function() {
25897               return resolver.parentWays(this).filter(function(parent) {
25898                   return parent.tags.hasOwnProperty('addr:interpolation') &&
25899                       parent.geometry(resolver) === 'line';
25900               }).length > 0;
25901           });
25902       },
25903
25904
25905       asJXON: function(changeset_id) {
25906           var r = {
25907               node: {
25908                   '@id': this.osmId(),
25909                   '@lon': this.loc[0],
25910                   '@lat': this.loc[1],
25911                   '@version': (this.version || 0),
25912                   tag: map$3(this.tags, function(v, k) {
25913                       return { keyAttributes: { k: k, v: v } };
25914                   })
25915               }
25916           };
25917           if (changeset_id) r.node['@changeset'] = changeset_id;
25918           return r;
25919       },
25920
25921
25922       asGeoJSON: function() {
25923           return {
25924               type: 'Point',
25925               coordinates: this.loc
25926           };
25927       }
25928   });
25929
25930   /** Error message constants. */
25931   var FUNC_ERROR_TEXT$1 = 'Expected a function';
25932
25933   /**
25934    * Creates a function that negates the result of the predicate `func`. The
25935    * `func` predicate is invoked with the `this` binding and arguments of the
25936    * created function.
25937    *
25938    * @static
25939    * @memberOf _
25940    * @since 3.0.0
25941    * @category Function
25942    * @param {Function} predicate The predicate to negate.
25943    * @returns {Function} Returns the new negated function.
25944    * @example
25945    *
25946    * function isEven(n) {
25947    *   return n % 2 == 0;
25948    * }
25949    *
25950    * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
25951    * // => [1, 3, 5]
25952    */
25953   function negate(predicate) {
25954     if (typeof predicate != 'function') {
25955       throw new TypeError(FUNC_ERROR_TEXT$1);
25956     }
25957     return function() {
25958       var args = arguments;
25959       switch (args.length) {
25960         case 0: return !predicate.call(this);
25961         case 1: return !predicate.call(this, args[0]);
25962         case 2: return !predicate.call(this, args[0], args[1]);
25963         case 3: return !predicate.call(this, args[0], args[1], args[2]);
25964       }
25965       return !predicate.apply(this, args);
25966     };
25967   }
25968
25969   /**
25970    * The opposite of `_.filter`; this method returns the elements of `collection`
25971    * that `predicate` does **not** return truthy for.
25972    *
25973    * @static
25974    * @memberOf _
25975    * @since 0.1.0
25976    * @category Collection
25977    * @param {Array|Object} collection The collection to iterate over.
25978    * @param {Function} [predicate=_.identity] The function invoked per iteration.
25979    * @returns {Array} Returns the new filtered array.
25980    * @see _.filter
25981    * @example
25982    *
25983    * var users = [
25984    *   { 'user': 'barney', 'age': 36, 'active': false },
25985    *   { 'user': 'fred',   'age': 40, 'active': true }
25986    * ];
25987    *
25988    * _.reject(users, function(o) { return !o.active; });
25989    * // => objects for ['fred']
25990    *
25991    * // The `_.matches` iteratee shorthand.
25992    * _.reject(users, { 'age': 40, 'active': true });
25993    * // => objects for ['barney']
25994    *
25995    * // The `_.matchesProperty` iteratee shorthand.
25996    * _.reject(users, ['active', false]);
25997    * // => objects for ['fred']
25998    *
25999    * // The `_.property` iteratee shorthand.
26000    * _.reject(users, 'active');
26001    * // => objects for ['barney']
26002    */
26003   function reject(collection, predicate) {
26004     var func = isArray(collection) ? arrayFilter : baseFilter;
26005     return func(collection, negate(baseIteratee(predicate, 3)));
26006   }
26007
26008   /**
26009    * An alternative to `_.reduce`; this method transforms `object` to a new
26010    * `accumulator` object which is the result of running each of its own
26011    * enumerable string keyed properties thru `iteratee`, with each invocation
26012    * potentially mutating the `accumulator` object. If `accumulator` is not
26013    * provided, a new object with the same `[[Prototype]]` will be used. The
26014    * iteratee is invoked with four arguments: (accumulator, value, key, object).
26015    * Iteratee functions may exit iteration early by explicitly returning `false`.
26016    *
26017    * @static
26018    * @memberOf _
26019    * @since 1.3.0
26020    * @category Object
26021    * @param {Object} object The object to iterate over.
26022    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
26023    * @param {*} [accumulator] The custom accumulator value.
26024    * @returns {*} Returns the accumulated value.
26025    * @example
26026    *
26027    * _.transform([2, 3, 4], function(result, n) {
26028    *   result.push(n *= n);
26029    *   return n % 2 == 0;
26030    * }, []);
26031    * // => [4, 9]
26032    *
26033    * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
26034    *   (result[value] || (result[value] = [])).push(key);
26035    * }, {});
26036    * // => { '1': ['a', 'c'], '2': ['b'] }
26037    */
26038   function transform$1(object, iteratee, accumulator) {
26039     var isArr = isArray(object),
26040         isArrLike = isArr || isBuffer(object) || isTypedArray(object);
26041
26042     iteratee = baseIteratee(iteratee, 4);
26043     if (accumulator == null) {
26044       var Ctor = object && object.constructor;
26045       if (isArrLike) {
26046         accumulator = isArr ? new Ctor : [];
26047       }
26048       else if (isObject(object)) {
26049         accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
26050       }
26051       else {
26052         accumulator = {};
26053       }
26054     }
26055     (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
26056       return iteratee(accumulator, value, index, object);
26057     });
26058     return accumulator;
26059   }
26060
26061   /*
26062     Order the nodes of a way in reverse order and reverse any direction dependent tags
26063     other than `oneway`. (We assume that correcting a backwards oneway is the primary
26064     reason for reversing a way.)
26065
26066     The following transforms are performed:
26067
26068       Keys:
26069             *:right=* ⟺ *:left=*
26070           *:forward=* ⟺ *:backward=*
26071          direction=up ⟺ direction=down
26072            incline=up ⟺ incline=down
26073               *=right ⟺ *=left
26074
26075       Relation members:
26076          role=forward ⟺ role=backward
26077            role=north ⟺ role=south
26078             role=east ⟺ role=west
26079
26080      In addition, numeric-valued `incline` tags are negated.
26081
26082      The JOSM implementation was used as a guide, but transformations that were of unclear benefit
26083      or adjusted tags that don't seem to be used in practice were omitted.
26084
26085      Also, each node on the way is examined for its own tags and the following transformations are performed
26086      in order to ensure associated nodes (eg a Stop Sign) is also reversed
26087
26088       Node Keys:
26089           *direction=forward ⟺ *direction=backward
26090           *direction=left ⟺ *direction=right
26091           *:forward=* ⟺ *:backward=*
26092           *:left=* ⟺ *:right=*
26093
26094      References:
26095         http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
26096         http://wiki.openstreetmap.org/wiki/Key:direction#Steps
26097         http://wiki.openstreetmap.org/wiki/Key:incline
26098         http://wiki.openstreetmap.org/wiki/Route#Members
26099         http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
26100         http://wiki.openstreetmap.org/wiki/Tag:highway%3Dstop
26101         http://wiki.openstreetmap.org/wiki/Key:traffic_sign#On_a_way_or_area
26102    */
26103   function actionReverse(wayId, options) {
26104       var replacements = [
26105               [/:right$/, ':left'], [/:left$/, ':right'],
26106               [/:forward$/, ':backward'], [/:backward$/, ':forward']
26107           ],
26108           numeric = /^([+\-]?)(?=[\d.])/,
26109           roleReversals = {
26110               forward: 'backward',
26111               backward: 'forward',
26112               north: 'south',
26113               south: 'north',
26114               east: 'west',
26115               west: 'east'
26116           };
26117
26118
26119       function reverseKey(key) {
26120           for (var i = 0; i < replacements.length; ++i) {
26121               var replacement = replacements[i];
26122               if (replacement[0].test(key)) {
26123                   return key.replace(replacement[0], replacement[1]);
26124               }
26125           }
26126           return key;
26127       }
26128
26129
26130       function reverseValue(key, value) {
26131           if (key === 'incline' && numeric.test(value)) {
26132               return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
26133           } else if (key === 'incline' || key === 'direction') {
26134               return {up: 'down', down: 'up'}[value] || value;
26135           } else if (options && options.reverseOneway && key === 'oneway') {
26136               return {yes: '-1', '1': '-1', '-1': 'yes'}[value] || value;
26137           } else {
26138               return {left: 'right', right: 'left'}[value] || value;
26139           }
26140       }
26141
26142
26143       function reverseDirectionTags(node) {
26144           // Update the direction based tags as appropriate then return an updated node
26145           return node.update({tags: transform$1(node.tags, function(acc, tagValue, tagKey) {
26146               // See if this is a direction tag and reverse (or use existing value if not recognised)
26147               var re = /direction$/;
26148               if (re.test(tagKey)) {
26149                   acc[tagKey] = {forward: 'backward', backward: 'forward', left: 'right', right: 'left'}[tagValue] || tagValue;
26150               } else {
26151                   // Use the reverseKey method to cater for situations such as traffic_sign:forward=stop
26152                   // This will pass through other tags unchanged
26153                   acc[reverseKey(tagKey)] = tagValue;
26154               }
26155               return acc;
26156           }, {})});
26157       }
26158
26159
26160       function reverseTagsOnNodes(graph, nodeIds) {
26161           // Reverse the direction of appropriate tags attached to the nodes (#3076)
26162           return nodeIds
26163               // Get each node from the graph
26164               .map(function(nodeId) { return graph.entity(nodeId);})
26165               // Check tags on the node, if there aren't any, we can skip
26166               .filter(function(existingNode) { return existingNode.tags !== undefined;})
26167               // Get a new version of each node with the appropriate tags reversed
26168               .map(function(existingNode) { return reverseDirectionTags(existingNode);})
26169               // Chain together consecutive updates to the graph for each updated node and return
26170               .reduce(function (accGraph, value) { return accGraph.replace(value); }, graph);
26171       }
26172
26173
26174       return function(graph) {
26175           var way = graph.entity(wayId),
26176               nodes = way.nodes.slice().reverse(),
26177               tags = {}, key, role;
26178
26179           for (key in way.tags) {
26180               tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
26181           }
26182
26183           graph.parentRelations(way).forEach(function(relation) {
26184               relation.members.forEach(function(member, index) {
26185                   if (member.id === way.id && (role = roleReversals[member.role])) {
26186                       relation = relation.updateMember({role: role}, index);
26187                       graph = graph.replace(relation);
26188                   }
26189               });
26190           });
26191
26192           // Reverse any associated directions on nodes on the way and then replace
26193           // the way itself with the reversed node ids and updated way tags
26194           return reverseTagsOnNodes(graph, nodes).replace(way.update({nodes: nodes, tags: tags}));
26195       };
26196   }
26197
26198   /** `Object#toString` result references. */
26199   var numberTag$4 = '[object Number]';
26200
26201   /**
26202    * Checks if `value` is classified as a `Number` primitive or object.
26203    *
26204    * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
26205    * classified as numbers, use the `_.isFinite` method.
26206    *
26207    * @static
26208    * @memberOf _
26209    * @since 0.1.0
26210    * @category Lang
26211    * @param {*} value The value to check.
26212    * @returns {boolean} Returns `true` if `value` is a number, else `false`.
26213    * @example
26214    *
26215    * _.isNumber(3);
26216    * // => true
26217    *
26218    * _.isNumber(Number.MIN_VALUE);
26219    * // => true
26220    *
26221    * _.isNumber(Infinity);
26222    * // => true
26223    *
26224    * _.isNumber('3');
26225    * // => false
26226    */
26227   function isNumber(value) {
26228     return typeof value == 'number' ||
26229       (isObjectLike(value) && baseGetTag(value) == numberTag$4);
26230   }
26231
26232   /** `Object#toString` result references. */
26233   var stringTag$4 = '[object String]';
26234
26235   /**
26236    * Checks if `value` is classified as a `String` primitive or object.
26237    *
26238    * @static
26239    * @since 0.1.0
26240    * @memberOf _
26241    * @category Lang
26242    * @param {*} value The value to check.
26243    * @returns {boolean} Returns `true` if `value` is a string, else `false`.
26244    * @example
26245    *
26246    * _.isString('abc');
26247    * // => true
26248    *
26249    * _.isString(1);
26250    * // => false
26251    */
26252   function isString(value) {
26253     return typeof value == 'string' ||
26254       (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag$4);
26255   }
26256
26257   /**
26258    * Checks if `value` is `NaN`.
26259    *
26260    * **Note:** This method is based on
26261    * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
26262    * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
26263    * `undefined` and other non-number values.
26264    *
26265    * @static
26266    * @memberOf _
26267    * @since 0.1.0
26268    * @category Lang
26269    * @param {*} value The value to check.
26270    * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
26271    * @example
26272    *
26273    * _.isNaN(NaN);
26274    * // => true
26275    *
26276    * _.isNaN(new Number(NaN));
26277    * // => true
26278    *
26279    * isNaN(undefined);
26280    * // => true
26281    *
26282    * _.isNaN(undefined);
26283    * // => false
26284    */
26285   function isNaN$1(value) {
26286     // An `NaN` primitive is the only value that is not equal to itself.
26287     // Perform the `toStringTag` check first to avoid errors with some
26288     // ActiveX objects in IE.
26289     return isNumber(value) && value != +value;
26290   }
26291
26292   function osmLanes(entity) {
26293       if (entity.type !== 'way') return null;
26294       if (!entity.tags.highway) return null;
26295
26296       var tags = entity.tags;
26297       var isOneWay = entity.isOneWay();
26298       var laneCount = getLaneCount(tags, isOneWay);
26299       var maxspeed = parseMaxspeed(tags);
26300
26301       var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
26302       var forward = laneDirections.forward;
26303       var backward = laneDirections.backward;
26304       var bothways = laneDirections.bothways;
26305
26306       // parse the piped string 'x|y|z' format
26307       var turnLanes = {};
26308       turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
26309       turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
26310       turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
26311
26312       var maxspeedLanes = {};
26313       maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
26314       maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
26315       maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
26316
26317       var psvLanes = {};
26318       psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
26319       psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
26320       psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
26321
26322       var busLanes = {};
26323       busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
26324       busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
26325       busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
26326
26327       var taxiLanes = {};
26328       taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
26329       taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
26330       taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
26331
26332       var hovLanes = {};
26333       hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
26334       hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
26335       hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
26336
26337       var hgvLanes = {};
26338       hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
26339       hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
26340       hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
26341
26342       var bicyclewayLanes = {};
26343       bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
26344       bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
26345       bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
26346
26347       var lanesObj = {
26348           forward: [],
26349           backward: [],
26350           unspecified: []
26351       };
26352
26353       // map forward/backward/unspecified of each lane type to lanesObj
26354       mapToLanesObj(lanesObj, turnLanes, 'turnLane');
26355       mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
26356       mapToLanesObj(lanesObj, psvLanes, 'psv');
26357       mapToLanesObj(lanesObj, busLanes, 'bus');
26358       mapToLanesObj(lanesObj, taxiLanes, 'taxi');
26359       mapToLanesObj(lanesObj, hovLanes, 'hov');
26360       mapToLanesObj(lanesObj, hgvLanes, 'hgv');
26361       mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
26362
26363       return {
26364           metadata: {
26365               count: laneCount,
26366               oneway: isOneWay,
26367               forward: forward,
26368               backward: backward,
26369               bothways: bothways,
26370               turnLanes: turnLanes,
26371               maxspeed: maxspeed,
26372               maxspeedLanes: maxspeedLanes,
26373               psvLanes: psvLanes,
26374               busLanes: busLanes,
26375               taxiLanes: taxiLanes,
26376               hovLanes: hovLanes,
26377               hgvLanes: hgvLanes,
26378               bicyclewayLanes: bicyclewayLanes
26379           },
26380           lanes: lanesObj
26381       };
26382   }
26383
26384
26385   function getLaneCount(tags, isOneWay) {
26386       var count;
26387       if (tags.lanes) {
26388           count = parseInt(tags.lanes, 10);
26389           if (count > 0) {
26390               return count;
26391           }
26392       }
26393
26394
26395       switch (tags.highway) {
26396           case 'trunk':
26397           case 'motorway':
26398               count = isOneWay ? 2 : 4;
26399               break;
26400           default:
26401               count = isOneWay ? 1 : 2;
26402               break;
26403       }
26404
26405       return count;
26406   }
26407
26408
26409   function parseMaxspeed(tags) {
26410       var maxspeed = tags.maxspeed;
26411       if (isNumber(maxspeed)) return maxspeed;
26412       if (isString(maxspeed)) {
26413           maxspeed = maxspeed.match(/^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/g);
26414           if (!maxspeed) return;
26415           return parseInt(maxspeed, 10);
26416       }
26417   }
26418
26419
26420   function parseLaneDirections(tags, isOneWay, laneCount) {
26421       var forward = parseInt(tags['lanes:forward'], 10);
26422       var backward = parseInt(tags['lanes:backward'], 10);
26423       var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
26424
26425       if (parseInt(tags.oneway, 10) === -1) {
26426           forward = 0;
26427           bothways = 0;
26428           backward = laneCount;
26429       }
26430       else if (isOneWay) {
26431           forward = laneCount;
26432           bothways = 0;
26433           backward = 0;
26434       }
26435       else if (isNaN$1(forward) && isNaN$1(backward)) {
26436           backward = Math.floor((laneCount - bothways) / 2);
26437           forward = laneCount - bothways - backward;
26438       }
26439       else if (isNaN$1(forward)) {
26440           if (backward > laneCount - bothways) {
26441               backward = laneCount - bothways;
26442           }
26443           forward = laneCount - bothways - backward;
26444       }
26445       else if (isNaN$1(backward)) {
26446           if (forward > laneCount - bothways) {
26447               forward = laneCount - bothways;
26448           }
26449           backward = laneCount - bothways - forward;
26450       }
26451       return {
26452           forward: forward,
26453           backward: backward,
26454           bothways: bothways
26455       };
26456   }
26457
26458
26459   function parseTurnLanes(tag){
26460       if (!tag) return;
26461
26462       var validValues = [
26463           'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
26464           'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'
26465       ];
26466
26467       return tag.split('|')
26468           .map(function (s) {
26469               if (s === '') s = 'none';
26470               return s.split(';')
26471                   .map(function (d) {
26472                       return validValues.indexOf(d) === -1 ? 'unknown': d;
26473                   });
26474           });
26475   }
26476
26477
26478   function parseMaxspeedLanes(tag, maxspeed) {
26479       if (!tag) return;
26480
26481       return tag.split('|')
26482           .map(function (s) {
26483               if (s === 'none') return s;
26484               var m = parseInt(s, 10);
26485               if (s === '' || m === maxspeed) return null;
26486               return isNaN$1(m) ? 'unknown': m;
26487           });
26488   }
26489
26490
26491   function parseMiscLanes(tag) {
26492       if (!tag) return;
26493
26494       var validValues = [
26495           'yes', 'no', 'designated'
26496       ];
26497
26498       return tag.split('|')
26499           .map(function (s) {
26500               if (s === '') s = 'no';
26501               return validValues.indexOf(s) === -1 ? 'unknown': s;
26502           });
26503   }
26504
26505
26506   function parseBicycleWay(tag) {
26507       if (!tag) return;
26508
26509       var validValues = [
26510           'yes', 'no', 'designated', 'lane'
26511       ];
26512
26513       return tag.split('|')
26514           .map(function (s) {
26515               if (s === '') s = 'no';
26516               return validValues.indexOf(s) === -1 ? 'unknown': s;
26517           });
26518   }
26519
26520
26521   function mapToLanesObj(lanesObj, data, key) {
26522       if (data.forward) data.forward.forEach(function(l, i) {
26523           if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
26524           lanesObj.forward[i][key] = l;
26525       });
26526       if (data.backward) data.backward.forEach(function(l, i) {
26527           if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
26528           lanesObj.backward[i][key] = l;
26529       });
26530       if (data.unspecified) data.unspecified.forEach(function(l, i) {
26531           if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
26532           lanesObj.unspecified[i][key] = l;
26533       });
26534   }
26535
26536   /** Used to compose bitmasks for cloning. */
26537   var CLONE_DEEP_FLAG$2 = 1,
26538       CLONE_SYMBOLS_FLAG$3 = 4;
26539
26540   /**
26541    * This method is like `_.clone` except that it recursively clones `value`.
26542    *
26543    * @static
26544    * @memberOf _
26545    * @since 1.0.0
26546    * @category Lang
26547    * @param {*} value The value to recursively clone.
26548    * @returns {*} Returns the deep cloned value.
26549    * @see _.clone
26550    * @example
26551    *
26552    * var objects = [{ 'a': 1 }, { 'b': 2 }];
26553    *
26554    * var deep = _.cloneDeep(objects);
26555    * console.log(deep[0] === objects[0]);
26556    * // => false
26557    */
26558   function cloneDeep(value) {
26559     return baseClone(value, CLONE_DEEP_FLAG$2 | CLONE_SYMBOLS_FLAG$3);
26560   }
26561
26562   /**
26563    * Gets the timestamp of the number of milliseconds that have elapsed since
26564    * the Unix epoch (1 January 1970 00:00:00 UTC).
26565    *
26566    * @static
26567    * @memberOf _
26568    * @since 2.4.0
26569    * @category Date
26570    * @returns {number} Returns the timestamp.
26571    * @example
26572    *
26573    * _.defer(function(stamp) {
26574    *   console.log(_.now() - stamp);
26575    * }, _.now());
26576    * // => Logs the number of milliseconds it took for the deferred invocation.
26577    */
26578   var now$1 = function() {
26579     return root$2.Date.now();
26580   };
26581
26582   /** Error message constants. */
26583   var FUNC_ERROR_TEXT$2 = 'Expected a function';
26584
26585   /* Built-in method references for those with the same name as other `lodash` methods. */
26586   var nativeMax$2 = Math.max,
26587       nativeMin = Math.min;
26588
26589   /**
26590    * Creates a debounced function that delays invoking `func` until after `wait`
26591    * milliseconds have elapsed since the last time the debounced function was
26592    * invoked. The debounced function comes with a `cancel` method to cancel
26593    * delayed `func` invocations and a `flush` method to immediately invoke them.
26594    * Provide `options` to indicate whether `func` should be invoked on the
26595    * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
26596    * with the last arguments provided to the debounced function. Subsequent
26597    * calls to the debounced function return the result of the last `func`
26598    * invocation.
26599    *
26600    * **Note:** If `leading` and `trailing` options are `true`, `func` is
26601    * invoked on the trailing edge of the timeout only if the debounced function
26602    * is invoked more than once during the `wait` timeout.
26603    *
26604    * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
26605    * until to the next tick, similar to `setTimeout` with a timeout of `0`.
26606    *
26607    * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
26608    * for details over the differences between `_.debounce` and `_.throttle`.
26609    *
26610    * @static
26611    * @memberOf _
26612    * @since 0.1.0
26613    * @category Function
26614    * @param {Function} func The function to debounce.
26615    * @param {number} [wait=0] The number of milliseconds to delay.
26616    * @param {Object} [options={}] The options object.
26617    * @param {boolean} [options.leading=false]
26618    *  Specify invoking on the leading edge of the timeout.
26619    * @param {number} [options.maxWait]
26620    *  The maximum time `func` is allowed to be delayed before it's invoked.
26621    * @param {boolean} [options.trailing=true]
26622    *  Specify invoking on the trailing edge of the timeout.
26623    * @returns {Function} Returns the new debounced function.
26624    * @example
26625    *
26626    * // Avoid costly calculations while the window size is in flux.
26627    * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
26628    *
26629    * // Invoke `sendMail` when clicked, debouncing subsequent calls.
26630    * jQuery(element).on('click', _.debounce(sendMail, 300, {
26631    *   'leading': true,
26632    *   'trailing': false
26633    * }));
26634    *
26635    * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
26636    * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
26637    * var source = new EventSource('/stream');
26638    * jQuery(source).on('message', debounced);
26639    *
26640    * // Cancel the trailing debounced invocation.
26641    * jQuery(window).on('popstate', debounced.cancel);
26642    */
26643   function debounce(func, wait, options) {
26644     var lastArgs,
26645         lastThis,
26646         maxWait,
26647         result,
26648         timerId,
26649         lastCallTime,
26650         lastInvokeTime = 0,
26651         leading = false,
26652         maxing = false,
26653         trailing = true;
26654
26655     if (typeof func != 'function') {
26656       throw new TypeError(FUNC_ERROR_TEXT$2);
26657     }
26658     wait = toNumber(wait) || 0;
26659     if (isObject(options)) {
26660       leading = !!options.leading;
26661       maxing = 'maxWait' in options;
26662       maxWait = maxing ? nativeMax$2(toNumber(options.maxWait) || 0, wait) : maxWait;
26663       trailing = 'trailing' in options ? !!options.trailing : trailing;
26664     }
26665
26666     function invokeFunc(time) {
26667       var args = lastArgs,
26668           thisArg = lastThis;
26669
26670       lastArgs = lastThis = undefined;
26671       lastInvokeTime = time;
26672       result = func.apply(thisArg, args);
26673       return result;
26674     }
26675
26676     function leadingEdge(time) {
26677       // Reset any `maxWait` timer.
26678       lastInvokeTime = time;
26679       // Start the timer for the trailing edge.
26680       timerId = setTimeout(timerExpired, wait);
26681       // Invoke the leading edge.
26682       return leading ? invokeFunc(time) : result;
26683     }
26684
26685     function remainingWait(time) {
26686       var timeSinceLastCall = time - lastCallTime,
26687           timeSinceLastInvoke = time - lastInvokeTime,
26688           timeWaiting = wait - timeSinceLastCall;
26689
26690       return maxing
26691         ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
26692         : timeWaiting;
26693     }
26694
26695     function shouldInvoke(time) {
26696       var timeSinceLastCall = time - lastCallTime,
26697           timeSinceLastInvoke = time - lastInvokeTime;
26698
26699       // Either this is the first call, activity has stopped and we're at the
26700       // trailing edge, the system time has gone backwards and we're treating
26701       // it as the trailing edge, or we've hit the `maxWait` limit.
26702       return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
26703         (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
26704     }
26705
26706     function timerExpired() {
26707       var time = now$1();
26708       if (shouldInvoke(time)) {
26709         return trailingEdge(time);
26710       }
26711       // Restart the timer.
26712       timerId = setTimeout(timerExpired, remainingWait(time));
26713     }
26714
26715     function trailingEdge(time) {
26716       timerId = undefined;
26717
26718       // Only invoke if we have `lastArgs` which means `func` has been
26719       // debounced at least once.
26720       if (trailing && lastArgs) {
26721         return invokeFunc(time);
26722       }
26723       lastArgs = lastThis = undefined;
26724       return result;
26725     }
26726
26727     function cancel() {
26728       if (timerId !== undefined) {
26729         clearTimeout(timerId);
26730       }
26731       lastInvokeTime = 0;
26732       lastArgs = lastCallTime = lastThis = timerId = undefined;
26733     }
26734
26735     function flush() {
26736       return timerId === undefined ? result : trailingEdge(now$1());
26737     }
26738
26739     function debounced() {
26740       var time = now$1(),
26741           isInvoking = shouldInvoke(time);
26742
26743       lastArgs = arguments;
26744       lastThis = this;
26745       lastCallTime = time;
26746
26747       if (isInvoking) {
26748         if (timerId === undefined) {
26749           return leadingEdge(lastCallTime);
26750         }
26751         if (maxing) {
26752           // Handle invocations in a tight loop.
26753           timerId = setTimeout(timerExpired, wait);
26754           return invokeFunc(lastCallTime);
26755         }
26756       }
26757       if (timerId === undefined) {
26758         timerId = setTimeout(timerExpired, wait);
26759       }
26760       return result;
26761     }
26762     debounced.cancel = cancel;
26763     debounced.flush = flush;
26764     return debounced;
26765   }
26766
26767   /**
26768    * Casts `value` to `identity` if it's not a function.
26769    *
26770    * @private
26771    * @param {*} value The value to inspect.
26772    * @returns {Function} Returns cast function.
26773    */
26774   function castFunction(value) {
26775     return typeof value == 'function' ? value : identity$8;
26776   }
26777
26778   /**
26779    * Iterates over elements of `collection` and invokes `iteratee` for each element.
26780    * The iteratee is invoked with three arguments: (value, index|key, collection).
26781    * Iteratee functions may exit iteration early by explicitly returning `false`.
26782    *
26783    * **Note:** As with other "Collections" methods, objects with a "length"
26784    * property are iterated like arrays. To avoid this behavior use `_.forIn`
26785    * or `_.forOwn` for object iteration.
26786    *
26787    * @static
26788    * @memberOf _
26789    * @since 0.1.0
26790    * @alias each
26791    * @category Collection
26792    * @param {Array|Object} collection The collection to iterate over.
26793    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
26794    * @returns {Array|Object} Returns `collection`.
26795    * @see _.forEachRight
26796    * @example
26797    *
26798    * _.forEach([1, 2], function(value) {
26799    *   console.log(value);
26800    * });
26801    * // => Logs `1` then `2`.
26802    *
26803    * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
26804    *   console.log(key);
26805    * });
26806    * // => Logs 'a' then 'b' (iteration order is not guaranteed).
26807    */
26808   function forEach(collection, iteratee) {
26809     var func = isArray(collection) ? arrayEach : baseEach;
26810     return func(collection, castFunction(iteratee));
26811   }
26812
26813   /**
26814    * Iterates over own enumerable string keyed properties of an object and
26815    * invokes `iteratee` for each property. The iteratee is invoked with three
26816    * arguments: (value, key, object). Iteratee functions may exit iteration
26817    * early by explicitly returning `false`.
26818    *
26819    * @static
26820    * @memberOf _
26821    * @since 0.3.0
26822    * @category Object
26823    * @param {Object} object The object to iterate over.
26824    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
26825    * @returns {Object} Returns `object`.
26826    * @see _.forOwnRight
26827    * @example
26828    *
26829    * function Foo() {
26830    *   this.a = 1;
26831    *   this.b = 2;
26832    * }
26833    *
26834    * Foo.prototype.c = 3;
26835    *
26836    * _.forOwn(new Foo, function(value, key) {
26837    *   console.log(key);
26838    * });
26839    * // => Logs 'a' then 'b' (iteration order is not guaranteed).
26840    */
26841   function forOwn(object, iteratee) {
26842     return object && baseForOwn(object, castFunction(iteratee));
26843   }
26844
26845   var translations = Object.create(null);
26846
26847   var currentLocale = 'en';
26848   var textDirection = 'ltr';
26849
26850   function setLocale(_) {
26851       if (translations[_] !== undefined) {
26852           currentLocale = _;
26853       } else if (translations[_.split('-')[0]]) {
26854           currentLocale = _.split('-')[0];
26855       }
26856   }
26857
26858   function addTranslation(id, value) {
26859       translations[id] = value;
26860   }
26861
26862   /**
26863    * Given a string identifier, try to find that string in the current
26864    * language, and return it.  This function will be called recursively
26865    * with locale `en` if a string can not be found in the requested language.
26866    *
26867    * @param {string}   s   string identifier
26868    * @param {object?}  o   object of token replacements and default string
26869    * @param {string?}  loc locale to use
26870    * @returns {string?} locale string
26871    */
26872   function t(s, o, loc) {
26873       loc = loc || currentLocale;
26874
26875       var path = s
26876           .split('.')
26877           .map(function (s) { return s.replace('<TX_DOT>', '.'); })
26878           .reverse();
26879
26880       var rep = translations[loc];
26881
26882       while (rep !== undefined && path.length) {
26883           rep = rep[path.pop()];
26884       }
26885
26886       if (rep !== undefined) {
26887           if (o) {
26888               for (var k in o) {
26889                   rep = rep.replace('{' + k + '}', o[k]);
26890               }
26891           }
26892           return rep;
26893       }
26894
26895       if (loc !== 'en') {
26896           return t(s, o, 'en');
26897       }
26898
26899       if (o && 'default' in o) {
26900           return o.default;
26901       }
26902
26903       var missing = 'Missing ' + loc + ' translation: ' + s;
26904       if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
26905
26906       return missing;
26907   }
26908
26909   /**
26910    * Given string 'ltr' or 'rtl', save that setting
26911    *
26912    * @param {string} dir ltr or rtl
26913    */
26914
26915   function setTextDirection(dir) {
26916       textDirection = dir;
26917   }
26918
26919   /** Used to compose bitmasks for cloning. */
26920   var CLONE_DEEP_FLAG$3 = 1,
26921       CLONE_SYMBOLS_FLAG$4 = 4;
26922
26923   /**
26924    * This method is like `_.cloneWith` except that it recursively clones `value`.
26925    *
26926    * @static
26927    * @memberOf _
26928    * @since 4.0.0
26929    * @category Lang
26930    * @param {*} value The value to recursively clone.
26931    * @param {Function} [customizer] The function to customize cloning.
26932    * @returns {*} Returns the deep cloned value.
26933    * @see _.cloneWith
26934    * @example
26935    *
26936    * function customizer(value) {
26937    *   if (_.isElement(value)) {
26938    *     return value.cloneNode(true);
26939    *   }
26940    * }
26941    *
26942    * var el = _.cloneDeepWith(document.body, customizer);
26943    *
26944    * console.log(el === document.body);
26945    * // => false
26946    * console.log(el.nodeName);
26947    * // => 'BODY'
26948    * console.log(el.childNodes.length);
26949    * // => 20
26950    */
26951   function cloneDeepWith(value, customizer) {
26952     customizer = typeof customizer == 'function' ? customizer : undefined;
26953     return baseClone(value, CLONE_DEEP_FLAG$3 | CLONE_SYMBOLS_FLAG$4, customizer);
26954   }
26955
26956   /**
26957    * Creates an array of `array` values not included in the other given arrays
26958    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
26959    * for equality comparisons. The order and references of result values are
26960    * determined by the first array.
26961    *
26962    * **Note:** Unlike `_.pullAll`, this method returns a new array.
26963    *
26964    * @static
26965    * @memberOf _
26966    * @since 0.1.0
26967    * @category Array
26968    * @param {Array} array The array to inspect.
26969    * @param {...Array} [values] The values to exclude.
26970    * @returns {Array} Returns the new array of filtered values.
26971    * @see _.without, _.xor
26972    * @example
26973    *
26974    * _.difference([2, 1], [2, 3]);
26975    * // => [1]
26976    */
26977   var difference = baseRest(function(array, values) {
26978     return isArrayLikeObject(array)
26979       ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
26980       : [];
26981   });
26982
26983   /** `Object#toString` result references. */
26984   var mapTag$7 = '[object Map]',
26985       setTag$7 = '[object Set]';
26986
26987   /** Used for built-in method references. */
26988   var objectProto$17 = Object.prototype;
26989
26990   /** Used to check objects for own properties. */
26991   var hasOwnProperty$14 = objectProto$17.hasOwnProperty;
26992
26993   /**
26994    * Checks if `value` is an empty object, collection, map, or set.
26995    *
26996    * Objects are considered empty if they have no own enumerable string keyed
26997    * properties.
26998    *
26999    * Array-like values such as `arguments` objects, arrays, buffers, strings, or
27000    * jQuery-like collections are considered empty if they have a `length` of `0`.
27001    * Similarly, maps and sets are considered empty if they have a `size` of `0`.
27002    *
27003    * @static
27004    * @memberOf _
27005    * @since 0.1.0
27006    * @category Lang
27007    * @param {*} value The value to check.
27008    * @returns {boolean} Returns `true` if `value` is empty, else `false`.
27009    * @example
27010    *
27011    * _.isEmpty(null);
27012    * // => true
27013    *
27014    * _.isEmpty(true);
27015    * // => true
27016    *
27017    * _.isEmpty(1);
27018    * // => true
27019    *
27020    * _.isEmpty([1, 2, 3]);
27021    * // => false
27022    *
27023    * _.isEmpty({ 'a': 1 });
27024    * // => false
27025    */
27026   function isEmpty(value) {
27027     if (value == null) {
27028       return true;
27029     }
27030     if (isArrayLike(value) &&
27031         (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
27032           isBuffer(value) || isTypedArray(value) || isArguments(value))) {
27033       return !value.length;
27034     }
27035     var tag = getTag$1(value);
27036     if (tag == mapTag$7 || tag == setTag$7) {
27037       return !value.size;
27038     }
27039     if (isPrototype(value)) {
27040       return !baseKeys(value).length;
27041     }
27042     for (var key in value) {
27043       if (hasOwnProperty$14.call(value, key)) {
27044         return false;
27045       }
27046     }
27047     return true;
27048   }
27049
27050   var detected;
27051
27052   function utilDetect(force) {
27053       if (detected && !force) return detected;
27054       detected = {};
27055
27056       var ua = navigator.userAgent,
27057           m = null;
27058
27059       m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i);   // Edge
27060       if (m !== null) {
27061           detected.browser = m[1];
27062           detected.version = m[2];
27063       }
27064       if (!detected.browser) {
27065           m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i);   // IE11
27066           if (m !== null) {
27067               detected.browser = 'msie';
27068               detected.version = m[1];
27069           }
27070       }
27071       if (!detected.browser) {
27072           m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i);   // Opera 15+
27073           if (m !== null) {
27074               detected.browser = 'Opera';
27075               detected.version = m[2];
27076           }
27077       }
27078       if (!detected.browser) {
27079           m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
27080           if (m !== null) {
27081               detected.browser = m[1];
27082               detected.version = m[2];
27083               m = ua.match(/version\/([\.\d]+)/i);
27084               if (m !== null) detected.version = m[1];
27085           }
27086       }
27087       if (!detected.browser) {
27088           detected.browser = navigator.appName;
27089           detected.version = navigator.appVersion;
27090       }
27091
27092       // keep major.minor version only..
27093       detected.version = detected.version.split(/\W/).slice(0,2).join('.');
27094
27095       if (detected.browser.toLowerCase() === 'msie') {
27096           detected.ie = true;
27097           detected.browser = 'Internet Explorer';
27098           detected.support = parseFloat(detected.version) >= 11;
27099       } else {
27100           detected.ie = false;
27101           detected.support = true;
27102       }
27103
27104       // Added due to incomplete svg style support. See #715
27105       detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
27106
27107       detected.locale = (navigator.language || navigator.userLanguage || 'en-US');
27108       detected.language = detected.locale.split('-')[0];
27109
27110       // Search `navigator.languages` for a better locale.. Prefer the first language,
27111       // unless the second language is a culture-specific version of the first one, see #3842
27112       if (navigator.languages && navigator.languages.length > 0) {
27113           var code0 = navigator.languages[0],
27114               parts0 = code0.split('-');
27115
27116           detected.locale = code0;
27117           detected.language = parts0[0];
27118
27119           if (navigator.languages.length > 1 && parts0.length === 1) {
27120               var code1 = navigator.languages[1],
27121                   parts1 = code1.split('-');
27122
27123               if (parts1[0] === parts0[0]) {
27124                   detected.locale = code1;
27125               }
27126           }
27127       }
27128
27129       // Loaded locale is stored in currentLocale
27130       // return that instead (except in the situation where 'en' might override 'en-US')
27131       var loadedLocale = currentLocale || 'en';
27132       if (loadedLocale !== 'en') {
27133           detected.locale = loadedLocale;
27134           detected.language = detected.locale.split('-')[0];
27135       }
27136
27137       // detect text direction
27138       var q = utilStringQs(window.location.hash.substring(1));
27139       var lang = dataLocales[detected.locale];
27140       if ((lang && lang.rtl) || (q.rtl === 'true')) {
27141           detected.textDirection = 'rtl';
27142       } else {
27143           detected.textDirection = 'ltr';
27144       }
27145       setTextDirection(detected.textDirection);
27146
27147       // detect host
27148       var loc = window.top.location;
27149       var origin = loc.origin;
27150       if (!origin) {  // for unpatched IE11
27151           origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port: '');
27152       }
27153
27154       detected.host = origin + loc.pathname;
27155
27156       detected.filedrop = (window.FileReader && 'ondrop' in window);
27157
27158       detected.download = !(detected.ie || detected.browser.toLowerCase() === 'edge');
27159
27160       detected.cssfilters = !(detected.ie || detected.browser.toLowerCase() === 'edge');
27161
27162       function nav(x) {
27163           return navigator.userAgent.indexOf(x) !== -1;
27164       }
27165
27166       if (nav('Win')) {
27167           detected.os = 'win';
27168           detected.platform = 'Windows';
27169       }
27170       else if (nav('Mac')) {
27171           detected.os = 'mac';
27172           detected.platform = 'Macintosh';
27173       }
27174       else if (nav('X11') || nav('Linux')) {
27175           detected.os = 'linux';
27176           detected.platform = 'Linux';
27177       }
27178       else {
27179           detected.os = 'win';
27180           detected.platform = 'Unknown';
27181       }
27182
27183       return detected;
27184   }
27185
27186   var remove$1 = removeDiacritics;
27187
27188   var replacementList = [
27189     {
27190       base: ' ',
27191       chars: "\u00A0",
27192     }, {
27193       base: '0',
27194       chars: "\u07C0",
27195     }, {
27196       base: 'A',
27197       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",
27198     }, {
27199       base: 'AA',
27200       chars: "\uA732",
27201     }, {
27202       base: 'AE',
27203       chars: "\u00C6\u01FC\u01E2",
27204     }, {
27205       base: 'AO',
27206       chars: "\uA734",
27207     }, {
27208       base: 'AU',
27209       chars: "\uA736",
27210     }, {
27211       base: 'AV',
27212       chars: "\uA738\uA73A",
27213     }, {
27214       base: 'AY',
27215       chars: "\uA73C",
27216     }, {
27217       base: 'B',
27218       chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181",
27219     }, {
27220       base: 'C',
27221       chars: "\u24b8\uff23\uA73E\u1E08\u0106\u0043\u0108\u010A\u010C\u00C7\u0187\u023B",
27222     }, {
27223       base: 'D',
27224       chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779",
27225     }, {
27226       base: 'Dh',
27227       chars: "\u00D0",
27228     }, {
27229       base: 'DZ',
27230       chars: "\u01F1\u01C4",
27231     }, {
27232       base: 'Dz',
27233       chars: "\u01F2\u01C5",
27234     }, {
27235       base: 'E',
27236       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",
27237     }, {
27238       base: 'F',
27239       chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B",
27240     }, {
27241       base: 'G',
27242       chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262",
27243     }, {
27244       base: 'H',
27245       chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D",
27246     }, {
27247       base: 'I',
27248       chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197",
27249     }, {
27250       base: 'J',
27251       chars: "\u24BF\uFF2A\u0134\u0248\u0237",
27252     }, {
27253       base: 'K',
27254       chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2",
27255     }, {
27256       base: 'L',
27257       chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780",
27258     }, {
27259       base: 'LJ',
27260       chars: "\u01C7",
27261     }, {
27262       base: 'Lj',
27263       chars: "\u01C8",
27264     }, {
27265       base: 'M',
27266       chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB",
27267     }, {
27268       base: 'N',
27269       chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E",
27270     }, {
27271       base: 'NJ',
27272       chars: "\u01CA",
27273     }, {
27274       base: 'Nj',
27275       chars: "\u01CB",
27276     }, {
27277       base: 'O',
27278       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",
27279     }, {
27280       base: 'OE',
27281       chars: "\u0152",
27282     }, {
27283       base: 'OI',
27284       chars: "\u01A2",
27285     }, {
27286       base: 'OO',
27287       chars: "\uA74E",
27288     }, {
27289       base: 'OU',
27290       chars: "\u0222",
27291     }, {
27292       base: 'P',
27293       chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754",
27294     }, {
27295       base: 'Q',
27296       chars: "\u24C6\uFF31\uA756\uA758\u024A",
27297     }, {
27298       base: 'R',
27299       chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782",
27300     }, {
27301       base: 'S',
27302       chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784",
27303     }, {
27304       base: 'T',
27305       chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786",
27306     }, {
27307       base: 'Th',
27308       chars: "\u00DE",
27309     }, {
27310       base: 'TZ',
27311       chars: "\uA728",
27312     }, {
27313       base: 'U',
27314       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",
27315     }, {
27316       base: 'V',
27317       chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245",
27318     }, {
27319       base: 'VY',
27320       chars: "\uA760",
27321     }, {
27322       base: 'W',
27323       chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72",
27324     }, {
27325       base: 'X',
27326       chars: "\u24CD\uFF38\u1E8A\u1E8C",
27327     }, {
27328       base: 'Y',
27329       chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE",
27330     }, {
27331       base: 'Z',
27332       chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762",
27333     }, {
27334       base: 'a',
27335       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",
27336     }, {
27337       base: 'aa',
27338       chars: "\uA733",
27339     }, {
27340       base: 'ae',
27341       chars: "\u00E6\u01FD\u01E3",
27342     }, {
27343       base: 'ao',
27344       chars: "\uA735",
27345     }, {
27346       base: 'au',
27347       chars: "\uA737",
27348     }, {
27349       base: 'av',
27350       chars: "\uA739\uA73B",
27351     }, {
27352       base: 'ay',
27353       chars: "\uA73D",
27354     }, {
27355       base: 'b',
27356       chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182",
27357     }, {
27358       base: 'c',
27359       chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184",
27360     }, {
27361       base: 'd',
27362       chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA",
27363     }, {
27364       base: 'dh',
27365       chars: "\u00F0",
27366     }, {
27367       base: 'dz',
27368       chars: "\u01F3\u01C6",
27369     }, {
27370       base: 'e',
27371       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",
27372     }, {
27373       base: 'f',
27374       chars: "\u24D5\uFF46\u1E1F\u0192",
27375     }, {
27376       base: 'ff',
27377       chars: "\uFB00",
27378     }, {
27379       base: 'fi',
27380       chars: "\uFB01",
27381     }, {
27382       base: 'fl',
27383       chars: "\uFB02",
27384     }, {
27385       base: 'ffi',
27386       chars: "\uFB03",
27387     }, {
27388       base: 'ffl',
27389       chars: "\uFB04",
27390     }, {
27391       base: 'g',
27392       chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79",
27393     }, {
27394       base: 'h',
27395       chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265",
27396     }, {
27397       base: 'hv',
27398       chars: "\u0195",
27399     }, {
27400       base: 'i',
27401       chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131",
27402     }, {
27403       base: 'j',
27404       chars: "\u24D9\uFF4A\u0135\u01F0\u0249",
27405     }, {
27406       base: 'k',
27407       chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3",
27408     }, {
27409       base: 'l',
27410       chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D",
27411     }, {
27412       base: 'lj',
27413       chars: "\u01C9",
27414     }, {
27415       base: 'm',
27416       chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F",
27417     }, {
27418       base: 'n',
27419       chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509",
27420     }, {
27421       base: 'nj',
27422       chars: "\u01CC",
27423     }, {
27424       base: 'o',
27425       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",
27426     }, {
27427       base: 'oe',
27428       chars: "\u0153",
27429     }, {
27430       base: 'oi',
27431       chars: "\u01A3",
27432     }, {
27433       base: 'oo',
27434       chars: "\uA74F",
27435     }, {
27436       base: 'ou',
27437       chars: "\u0223",
27438     }, {
27439       base: 'p',
27440       chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1",
27441     }, {
27442       base: 'q',
27443       chars: "\u24E0\uFF51\u024B\uA757\uA759",
27444     }, {
27445       base: 'r',
27446       chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783",
27447     }, {
27448       base: 's',
27449       chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282",
27450     }, {
27451       base: 'ss',
27452       chars: "\xDF",
27453     }, {
27454       base: 't',
27455       chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787",
27456     }, {
27457       base: 'th',
27458       chars: "\u00FE",
27459     }, {
27460       base: 'tz',
27461       chars: "\uA729",
27462     }, {
27463       base: 'u',
27464       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",
27465     }, {
27466       base: 'v',
27467       chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C",
27468     }, {
27469       base: 'vy',
27470       chars: "\uA761",
27471     }, {
27472       base: 'w',
27473       chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73",
27474     }, {
27475       base: 'x',
27476       chars: "\u24E7\uFF58\u1E8B\u1E8D",
27477     }, {
27478       base: 'y',
27479       chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF",
27480     }, {
27481       base: 'z',
27482       chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763",
27483     }
27484   ];
27485
27486   var diacriticsMap = {};
27487   for (var i = 0; i < replacementList.length; i += 1) {
27488     var chars = replacementList[i].chars;
27489     for (var j = 0; j < chars.length; j += 1) {
27490       diacriticsMap[chars[j]] = replacementList[i].base;
27491     }
27492   }
27493
27494   function removeDiacritics(str) {
27495     return str.replace(/[^\u0000-\u007e]/g, function(c) {
27496       return diacriticsMap[c] || c;
27497     });
27498   }
27499
27500   // see https://github.com/openstreetmap/iD/pull/3707
27501   // https://gist.github.com/mapmeld/556b09ddec07a2044c76e1ef45f01c60
27502
27503   var chars$1 = {
27504       // madda above alef
27505       1570: { initial: 'آ‎', isolated: 'ﺁ', medial: 'ﺁ', final: 'ﺂ' },
27506
27507       // hamza above and below alef
27508       1571: { initial: 'أ', isolated: 'ﺃ', medial: '', final: 'ﺄ' },
27509       // 1572 is ؤ
27510       1573: { initial: 'إ', isolated: 'ﺇ', medial: '', final: 'ﺈ' },
27511       // 1574 is ئ
27512       1575: { initial: 'ا', isolated: 'ا', medial: '', final: 'ﺎ' },
27513       1576: { initial: 'ﺑ', isolated: 'ﺏ', medial: 'ﺒ', final: 'ﺐ' },
27514
27515       // 1577 ة
27516       1577: { initial: '', isolated: 'ة', medial: '', final: 'ﺔ' },
27517
27518       1578: { initial: 'ﺗ', isolated: 'ﺕ', medial: 'ﺘ', final: 'ﺖ' },
27519       1579: { initial: 'ﺛ', isolated: 'ﺙ', medial: 'ﺜ', final: 'ﺚ' },
27520       1580: { initial: 'ﺟ', isolated: 'ﺝ', medial: 'ﺠ', final: 'ﺞ' },
27521       1581: { initial: 'ﺣ', isolated: 'ﺡ', medial: 'ﺤ', final: 'ﺢ' },
27522       1582: { initial: 'ﺧ', isolated: 'ﺥ', medial: 'ﺨ', final: 'ﺦ' },
27523       1583: { initial: 'ﺩ', isolated: 'ﺩ', medial: '', final: 'ﺪ' },
27524       1584: { initial: 'ﺫ', isolated: 'ﺫ', medial: '', final: 'ﺬ' },
27525       1585: { initial: 'ﺭ', isolated: 'ﺭ', medial: '', final: 'ﺮ' },
27526       1586: { initial: 'ﺯ', isolated: 'ﺯ', medial: '', final: 'ﺰ' },
27527       1688: { initial: 'ﮊ', isolated: 'ﮊ', medial: '', final: 'ﮋ' },
27528       1587: { initial: 'ﺳ', isolated: 'ﺱ', medial: 'ﺴ', final: 'ﺲ' },
27529       1588: { initial: 'ﺷ', isolated: 'ﺵ', medial: 'ﺸ', final: 'ﺶ' },
27530       1589: { initial: 'ﺻ', isolated: 'ﺹ', medial: 'ﺼ', final: 'ﺺ' },
27531       1590: { initial: 'ﺿ', isolated: 'ﺽ', medial: 'ﻀ', final: 'ﺾ' },
27532       1591: { initial: 'ﻃ', isolated: 'ﻁ', medial: 'ﻄ', final: 'ﻂ' },
27533       1592: { initial: 'ﻇ', isolated: 'ﻅ', medial: 'ﻈ', final: 'ﻆ' },
27534       1593: { initial: 'ﻋ', isolated: 'ﻉ', medial: 'ﻌ', final: 'ﻊ' },
27535       1594: { initial: 'ﻏ', isolated: 'ﻍ', medial: 'ﻐ', final: 'ﻎ' },
27536
27537       // 1595 ػ - may be very rare
27538
27539       1601: { initial: 'ﻓ', isolated: 'ﻑ', medial: 'ﻔ', final: 'ﻒ' },
27540       1602: { initial: 'ﻗ', isolated: 'ﻕ', medial: 'ﻘ', final: 'ﻖ' },
27541       1604: { initial: 'ﻟ', isolated: 'ﻝ', medial: 'ﻠ', final: 'ﻞ' },
27542       1605: { initial: 'ﻣ', isolated: 'ﻡ', medial: 'ﻤ', final: 'ﻢ' },
27543       1606: { initial: 'ﻧ', isolated: 'ﻥ', medial: 'ﻨ', final: 'ﻦ' },
27544       1607: { initial: 'ﻫ', isolated: 'ﻩ', medial: 'ﻬ', final: 'ﻪ' },
27545       1608: { initial: 'ﻭ', isolated: 'ﻭ', medial: '', final: 'ﻮ' },
27546
27547       // 1609 ى
27548       1609: { initial: 'ﯨ', isolated: 'ﻯ', medial: 'ﯩ', final: 'ﻰ' },
27549       // 1610 ي
27550       1610: { initial: 'ﻳ', isolated: 'ﻱ', medial: 'ﻴ', final: 'ﻲ' },
27551
27552       // short vowel sounds / tashkil markings
27553
27554       1662: { initial: 'ﭘ', isolated: 'ﭖ', medial: 'ﭙ', final: 'ﭗ' },
27555
27556       1670: { initial: 'ﭼ', isolated: 'ﭺ', medial: 'ﭽ', final: 'ﭻ' },
27557       1603: { initial: 'ﻛ', isolated: 'ﻙ', medial: 'ﻜ', final: 'ﻚ' },
27558       1705: { initial: 'ﻛ', isolated: 'ﮎ', medial: 'ﻜ', final: 'ﮏ' },
27559       1711: { initial: 'ﮔ', isolated: 'ﮒ', medial: 'ﮕ', final: 'ﮓ' },
27560       1740: { initial: 'ﻳ', isolated: 'ﻯ', medial: 'ﻴ', final: 'ﻰ' },
27561       5000: { initial: 'ﻻ', isolated: 'ﻻ', medial: '', final: 'ﻼ' }
27562   };
27563
27564   var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0780-\u07BF]/;
27565
27566   function fixRTLTextForSvg(inputText) {
27567       var context = true;
27568       var ret = '';
27569       var rtlBuffer = [];
27570       var arabicRegex = /[\u0600-\u06FF]/g;
27571       var arabicTashkil = /[\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED]/;
27572       var thaanaVowel = /[\u07A6-\u07B0]/;
27573       var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
27574
27575       if (!arabicRegex.test(inputText)) {
27576           // Hebrew or Thaana RTL script
27577           for (var n = 0; n < inputText.length; n++) {
27578               var c = inputText[n];
27579               if ((thaanaVowel.test(c) || hebrewSign.test(c)) && rtlBuffer.length) {
27580                   rtlBuffer[rtlBuffer.length - 1] += c;
27581               } else if (rtlRegex.test(c)) {
27582                   rtlBuffer.push(c);
27583               } else if (c === ' ' && rtlBuffer.length) {
27584                   // whitespace within RTL text
27585                   rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
27586               } else {
27587                   // non-RTL character
27588                   ret += rtlBuffer.reverse().join('') + c;
27589                   rtlBuffer = [];
27590               }
27591           }
27592       } else {
27593           for (var i = 0, l = inputText.length; i < l; i++) {
27594               var code = inputText[i].charCodeAt(0);
27595               var nextCode = inputText[i + 1] ? inputText[i + 1].charCodeAt(0) : 0;
27596
27597               if (!chars$1[code]) {
27598                   if (code === 32 && rtlBuffer.length) {
27599                       // whitespace
27600                       rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
27601                   } else if (arabicTashkil.test(inputText[i]) && rtlBuffer.length) {
27602                       // tashkil mark
27603                       rtlBuffer[rtlBuffer.length - 1] += inputText[i];
27604                   } else {
27605                       // non-RTL character
27606                       ret += rtlBuffer.reverse().join('') + inputText[i];
27607                       rtlBuffer = [];
27608                   }
27609                   continue;
27610               }
27611               if (context) {
27612                   if (i === l - 1 || nextCode === 32) {
27613                       rtlBuffer.push(chars$1[code].isolated);
27614                   } else {
27615                       // special case for لا
27616                       if (code === 1604 && nextCode === 1575) {
27617                           rtlBuffer.push(chars$1[5000].initial);
27618                           i++;
27619                           context = true;
27620                           continue;
27621                       }
27622                       rtlBuffer.push(chars$1[code].initial);
27623                   }
27624               } else {
27625                   if (i === l - 1 || nextCode === 32){
27626                       rtlBuffer.push(chars$1[code].final);
27627                   } else {
27628                       // special case for ﻼ
27629                       if (code === 1604 && nextCode === 1575){
27630                           rtlBuffer.push(chars$1[5000].final);
27631                           i++;
27632                           context = true;
27633                           continue;
27634                       }
27635                       if (chars$1[code].medial === ''){
27636                           rtlBuffer.push(chars$1[code].final);
27637                       } else {
27638                           rtlBuffer.push(chars$1[code].medial);
27639                       }
27640                   }
27641               }
27642               context = (chars$1[code].medial === '') || nextCode === 32;
27643           }
27644       }
27645       ret += rtlBuffer.reverse().join('');
27646       return ret;
27647   }
27648
27649   function utilTagText(entity) {
27650       return map$3(entity.tags, function(v, k) {
27651           return k + '=' + v;
27652       }).join(', ');
27653   }
27654
27655
27656   function utilEntitySelector(ids) {
27657       return ids.length ? '.' + ids.join(',.') : 'nothing';
27658   }
27659
27660
27661   function utilEntityOrMemberSelector(ids, graph) {
27662       var s = utilEntitySelector(ids);
27663
27664       ids.forEach(function(id) {
27665           var entity = graph.hasEntity(id);
27666           if (entity && entity.type === 'relation') {
27667               entity.members.forEach(function(member) {
27668                   s += ',.' + member.id;
27669               });
27670           }
27671       });
27672
27673       return s;
27674   }
27675
27676
27677   function utilGetAllNodes(ids, graph) {
27678       var seen = {};
27679       var nodes = [];
27680       ids.forEach(getNodes);
27681       return nodes;
27682
27683       function getNodes(id) {
27684           if (seen[id]) return;
27685           seen[id] = true;
27686
27687           var entity = graph.hasEntity(id);
27688           if (!entity) return;
27689
27690           if (entity.type === 'node') {
27691               nodes.push(entity);
27692           } else if (entity.type === 'way') {
27693               entity.nodes.forEach(getNodes);
27694           } else {
27695               entity.members.map(function(member) { return member.id; }).forEach(getNodes);
27696           }
27697       }
27698   }
27699
27700
27701   function utilDisplayName(entity) {
27702       var localizedNameKey = 'name:' + utilDetect().locale.toLowerCase().split('-')[0],
27703           name = entity.tags[localizedNameKey] || entity.tags.name || '',
27704           network = entity.tags.cycle_network || entity.tags.network;
27705
27706       if (!name && entity.tags.ref) {
27707           name = entity.tags.ref;
27708           if (network) {
27709               name = network + ' ' + name;
27710           }
27711       }
27712
27713       return name;
27714   }
27715
27716
27717   function utilDisplayNameForPath(entity) {
27718       var name = utilDisplayName(entity);
27719       var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
27720
27721       if (!isFirefox && name && rtlRegex.test(name)) {
27722           name = fixRTLTextForSvg(name);
27723       }
27724
27725       return name;
27726   }
27727
27728
27729   function utilDisplayType(id) {
27730       return {
27731           n: t('inspector.node'),
27732           w: t('inspector.way'),
27733           r: t('inspector.relation')
27734       }[id.charAt(0)];
27735   }
27736
27737
27738   function utilStringQs(str) {
27739       return str.split('&').reduce(function(obj, pair){
27740           var parts = pair.split('=');
27741           if (parts.length === 2) {
27742               obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]);
27743           }
27744           return obj;
27745       }, {});
27746   }
27747
27748
27749   function utilQsString(obj, noencode) {
27750       function softEncode(s) {
27751         // encode everything except special characters used in certain hash parameters:
27752         // "/" in map states, ":", ",", {" and "}" in background
27753         return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
27754       }
27755       return Object.keys(obj).sort().map(function(key) {
27756           return encodeURIComponent(key) + '=' + (
27757               noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
27758       }).join('&');
27759   }
27760
27761
27762   function utilPrefixDOMProperty(property) {
27763       var prefixes = ['webkit', 'ms', 'moz', 'o'],
27764           i = -1,
27765           n = prefixes.length,
27766           s = document.body;
27767
27768       if (property in s)
27769           return property;
27770
27771       property = property.substr(0, 1).toUpperCase() + property.substr(1);
27772
27773       while (++i < n)
27774           if (prefixes[i] + property in s)
27775               return prefixes[i] + property;
27776
27777       return false;
27778   }
27779
27780
27781   function utilPrefixCSSProperty(property) {
27782       var prefixes = ['webkit', 'ms', 'Moz', 'O'],
27783           i = -1,
27784           n = prefixes.length,
27785           s = document.body.style;
27786
27787       if (property.toLowerCase() in s)
27788           return property.toLowerCase();
27789
27790       while (++i < n)
27791           if (prefixes[i] + property in s)
27792               return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
27793
27794       return false;
27795   }
27796
27797
27798   var transformProperty;
27799   function utilSetTransform(el, x, y, scale) {
27800       var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform'),
27801           translate = utilDetect().opera ?
27802               'translate('   + x + 'px,' + y + 'px)' :
27803               'translate3d(' + x + 'px,' + y + 'px,0)';
27804       return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
27805   }
27806
27807
27808   // Calculates Levenshtein distance between two strings
27809   // see:  https://en.wikipedia.org/wiki/Levenshtein_distance
27810   // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
27811   function utilEditDistance(a, b) {
27812       a = remove$1(a.toLowerCase());
27813       b = remove$1(b.toLowerCase());
27814       if (a.length === 0) return b.length;
27815       if (b.length === 0) return a.length;
27816       var matrix = [];
27817       for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; }
27818       for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; }
27819       for (i = 1; i <= b.length; i++) {
27820           for (j = 1; j <= a.length; j++) {
27821               if (b.charAt(i-1) === a.charAt(j-1)) {
27822                   matrix[i][j] = matrix[i-1][j-1];
27823               } else {
27824                   matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
27825                       Math.min(matrix[i][j-1] + 1, // insertion
27826                       matrix[i-1][j] + 1)); // deletion
27827               }
27828           }
27829       }
27830       return matrix[b.length][a.length];
27831   }
27832
27833
27834   // a d3.mouse-alike which
27835   // 1. Only works on HTML elements, not SVG
27836   // 2. Does not cause style recalculation
27837   function utilFastMouse(container) {
27838       var rect = container.getBoundingClientRect(),
27839           rectLeft = rect.left,
27840           rectTop = rect.top,
27841           clientLeft = +container.clientLeft,
27842           clientTop = +container.clientTop;
27843       if (textDirection === 'rtl') {
27844           rectLeft = 0;
27845       }
27846       return function(e) {
27847           return [
27848               e.clientX - rectLeft - clientLeft,
27849               e.clientY - rectTop - clientTop];
27850       };
27851   }
27852
27853
27854   /* eslint-disable no-proto */
27855   var utilGetPrototypeOf = Object.getPrototypeOf || function(obj) { return obj.__proto__; };
27856   /* eslint-enable no-proto */
27857
27858
27859   function utilAsyncMap(inputs, func, callback) {
27860       var remaining = inputs.length,
27861           results = [],
27862           errors = [];
27863
27864       inputs.forEach(function(d, i) {
27865           func(d, function done(err, data) {
27866               errors[i] = err;
27867               results[i] = data;
27868               remaining--;
27869               if (!remaining) callback(errors, results);
27870           });
27871       });
27872   }
27873
27874
27875   // wraps an index to an interval [0..length-1]
27876   function utilWrap(index, length) {
27877       if (index < 0)
27878           index += Math.ceil(-index/length)*length;
27879       return index % length;
27880   }
27881
27882
27883   /**
27884    * a replacement for functor
27885    *
27886    * @param {*} value any value
27887    * @returns {Function} a function that returns that value or the value if it's a function
27888    */
27889   function utilFunctor(value) {
27890       if (typeof value === 'function') return value;
27891       return function() {
27892           return value;
27893       };
27894   }
27895
27896
27897   function utilNoAuto(selection) {
27898       var isText = (selection.size() && selection.node().tagName.toLowerCase() === 'textarea');
27899
27900       return selection
27901           .attr('autocomplete', 'off')
27902           .attr('autocorrect', 'off')
27903           .attr('autocapitalize', 'off')
27904           .attr('spellcheck', isText ? 'true' : 'false');
27905   }
27906
27907   // note the function should be of low priority
27908   // and should not be returning a value.
27909   function utilCallWhenIdle(func, timeout) {
27910       return function() {
27911           var args = arguments;
27912           var that = this;
27913           window.requestIdleCallback(function() {
27914               func.apply(that, args);
27915           }, {timeout: timeout});
27916       };
27917   }
27918
27919   function utilCleanTags(tags) {
27920       var out = {};
27921       for (var k in tags) {
27922           if (!k) continue;
27923           var v = tags[k];
27924           if (v !== undefined) {
27925               out[k] = cleanValue(k, v);
27926           }
27927       }
27928
27929       return out;
27930
27931
27932       function cleanValue(k, v) {
27933           function keepSpaces(k) {
27934               return /_hours|_times|:conditional$/.test(k);
27935           }
27936
27937           function skip(k) {
27938               return /^(description|note|fixme)$/.test(k);
27939           }
27940
27941           if (skip(k)) return v;
27942
27943           var cleaned = v
27944               .split(';')
27945               .map(function(s) { return s.trim(); })
27946               .join(keepSpaces(k) ? '; ' : ';');
27947
27948           // The code below is not intended to validate websites and emails.
27949           // It is only intended to prevent obvious copy-paste errors. (#2323)
27950           // clean website- and email-like tags
27951           if (k.indexOf('website') !== -1 ||
27952               k.indexOf('email') !== -1 ||
27953               cleaned.indexOf('http') === 0) {
27954               cleaned = cleaned
27955                   .replace(/[\u200B-\u200F\uFEFF]/g, '');  // strip LRM and other zero width chars
27956
27957           }
27958
27959           return cleaned;
27960       }
27961   }
27962
27963   // Like selection.property('value', ...), but avoids no-op value sets,
27964   // which can result in layout/repaint thrashing in some situations.
27965   function utilGetSetValue(selection, value) {
27966       function d3_selection_value(value) {
27967           function valueNull() {
27968               delete this.value;
27969           }
27970
27971           function valueConstant() {
27972               if (this.value !== value) {
27973                   this.value = value;
27974               }
27975           }
27976
27977           function valueFunction() {
27978               var x = value.apply(this, arguments);
27979               if (x == null) {
27980                   delete this.value;
27981               } else if (this.value !== x) {
27982                   this.value = x;
27983               }
27984           }
27985
27986           return value == null
27987               ? valueNull : (typeof value === 'function'
27988               ? valueFunction : valueConstant);
27989       }
27990
27991       if (arguments.length === 1) {
27992           return selection.property('value');
27993       }
27994
27995       return selection.each(d3_selection_value(value));
27996   }
27997
27998   function utilIdleWorker(tasks, processor, callback) {
27999       var results = [], result;
28000       for (var i = 0; i < tasks.length; i++) {
28001           result = processor(tasks[i]);
28002           if (result) results.push(result);
28003       }
28004       callback(results);
28005
28006       // var processed = [];
28007       // var currentPos = 0;
28008       // var totalTasks = tasks.length;
28009
28010       // function worker(deadline) {
28011       //     while (deadline.timeRemaining() > 0 && currentPos < totalTasks) {
28012       //         var result = processor(tasks[currentPos]);
28013
28014       //         // if falsy dont add to the processed list
28015       //         if (result) processed.push(result);
28016       //         currentPos++;
28017       //     }
28018
28019       //     // more tasks are left, we might need more idleCallbacks
28020       //     if (currentPos < totalTasks) {
28021       //         return window.requestIdleCallback(function(deadline) {worker(deadline);});
28022       //     }
28023
28024       //     // tasks are completed
28025       //     return callback(processed);
28026       // }
28027
28028       // window.requestIdleCallback(function(deadline) {worker(deadline);});
28029   }
28030
28031   // shim
28032   window.requestIdleCallback =
28033       window.requestIdleCallback ||
28034       function(cb) {
28035           var start = Date.now();
28036           return setTimeout(function() {
28037               cb({
28038                   didTimeout: false,
28039                   timeRemaining: function() {
28040                       return Math.max(0, 50 - (Date.now() - start));
28041                   }
28042               });
28043           }, 1);
28044       };
28045
28046   window.cancelIdleCallback =
28047       window.cancelIdleCallback ||
28048       function(id) {
28049           clearTimeout(id);
28050       };
28051
28052   // Copies a variable number of methods from source to target.
28053   function utilRebind(target, source) {
28054       var i = 1, n = arguments.length, method;
28055       while (++i < n) {
28056           target[method = arguments[i]] = d3_rebind(target, source, source[method]);
28057       }
28058       return target;
28059   }
28060
28061   // Method is assumed to be a standard D3 getter-setter:
28062   // If passed with no arguments, gets the value.
28063   // If passed with arguments, sets the value and returns the target.
28064   function d3_rebind(target, source, method) {
28065       return function() {
28066           var value = method.apply(source, arguments);
28067           return value === source ? target : value;
28068       };
28069   }
28070
28071   // A per-domain session mutex backed by a cookie and dead man's
28072   // switch. If the session crashes, the mutex will auto-release
28073   // after 5 seconds.
28074
28075   // This accepts a string and returns an object that complies with utilSessionMutexType
28076   function utilSessionMutex(name) {
28077       var mutex = {};
28078       var intervalID;
28079
28080       function renew() {
28081           var expires = new Date();
28082           expires.setSeconds(expires.getSeconds() + 5);
28083           document.cookie = name + '=1; expires=' + expires.toUTCString();
28084       }
28085
28086       mutex.lock = function () {
28087           if (intervalID) return true;
28088           var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
28089           if (cookie) return false;
28090           renew();
28091           intervalID = window.setInterval(renew, 4000);
28092           return true;
28093       };
28094
28095       mutex.unlock = function () {
28096           if (!intervalID) return;
28097           document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
28098           clearInterval(intervalID);
28099           intervalID = null;
28100       };
28101
28102       mutex.locked = function () {
28103           return !!intervalID;
28104       };
28105
28106       return mutex;
28107   }
28108
28109   function utilSuggestNames(preset, suggestions) {
28110       preset = preset.id.split('/', 2);
28111       var k = preset[0],
28112           v = preset[1];
28113
28114       return function(value, callback) {
28115           var result = [];
28116           if (value && value.length > 2) {
28117               if (suggestions[k] && suggestions[k][v]) {
28118                   for (var sugg in suggestions[k][v]) {
28119                       var dist = utilEditDistance(value, sugg.substring(0, value.length));
28120                       if (dist < 3) {
28121                           result.push({
28122                               title: sugg,
28123                               value: sugg,
28124                               dist: dist
28125                           });
28126                       }
28127                   }
28128               }
28129               result.sort(function(a, b) {
28130                   return a.dist - b.dist;
28131               });
28132           }
28133           result = result.slice(0,3);
28134           callback(result);
28135       };
28136   }
28137
28138   function utilTriggerEvent(target, type) {
28139       target.each(function() {
28140           var evt = document.createEvent('HTMLEvents');
28141           evt.initEvent(type, true, true);
28142           this.dispatchEvent(evt);
28143       });
28144   }
28145
28146   function validationDeprecatedTag() {
28147
28148       var validation = function(changes) {
28149           var warnings = [];
28150           for (var i = 0; i < changes.created.length; i++) {
28151               var change = changes.created[i],
28152                   deprecatedTags = change.deprecatedTags();
28153
28154               if (!isEmpty(deprecatedTags)) {
28155                   var tags = utilTagText({ tags: deprecatedTags });
28156                   warnings.push({
28157                       id: 'deprecated_tags',
28158                       message: t('validations.deprecated_tags', { tags: tags }),
28159                       entity: change
28160                   });
28161               }
28162           }
28163
28164           return warnings;
28165       };
28166
28167
28168       return validation;
28169   }
28170
28171   function validationDisconnectedHighway() {
28172
28173       function isDisconnectedHighway(entity, graph) {
28174           if (!entity.tags.highway) return false;
28175           if (entity.geometry(graph) !== 'line') return false;
28176
28177           return graph.childNodes(entity)
28178               .every(function(vertex) {
28179                   var parents = graph.parentWays(vertex);
28180                   if (parents.length === 1) {  // standalone vertex
28181                       return true;
28182                   } else {                     // shared vertex
28183                       return !vertex.tags.entrance &&
28184                           parents.filter(function(parent) {
28185                               return parent.tags.highway && parent !== entity;
28186                           }).length === 0;
28187                   }
28188               });
28189       }
28190
28191
28192       var validation = function(changes, graph) {
28193           var warnings = [];
28194           for (var i = 0; i < changes.created.length; i++) {
28195               var entity = changes.created[i];
28196
28197               if (isDisconnectedHighway(entity, graph)) {
28198                   warnings.push({
28199                       id: 'disconnected_highway',
28200                       message: t('validations.disconnected_highway'),
28201                       tooltip: t('validations.disconnected_highway_tooltip'),
28202                       entity: entity
28203                   });
28204               }
28205           }
28206
28207           return warnings;
28208       };
28209
28210
28211       return validation;
28212   }
28213
28214   function validationManyDeletions() {
28215       var threshold = 100;
28216
28217       var validation = function(changes, graph) {
28218           var warnings = [];
28219           var nodes=0, ways=0, areas=0, relations=0;
28220
28221           changes.deleted.forEach(function(c) {
28222               if (c.type === 'node') {nodes++;}
28223               else if (c.type === 'way' && c.geometry(graph) === 'line') {ways++;}
28224               else if (c.type === 'way' && c.geometry(graph) === 'area') {areas++;}
28225               else if (c.type === 'relation') {relations++;}
28226           });
28227           if (changes.deleted.length > threshold) {
28228               warnings.push({
28229                   id: 'many_deletions',
28230                   message: t('validations.many_deletions',
28231                       { n: changes.deleted.length, p: nodes, l: ways, a:areas, r: relations })
28232               });
28233           }
28234
28235           return warnings;
28236       };
28237
28238
28239       return validation;
28240   }
28241
28242   function validationMissingTag() {
28243
28244       // Slightly stricter check than Entity#isUsed (#3091)
28245       function hasTags(entity, graph) {
28246           return without(Object.keys(entity.tags), 'area', 'name').length > 0 ||
28247               graph.parentRelations(entity).length > 0;
28248       }
28249
28250       var validation = function(changes, graph) {
28251           var types = ['point', 'line', 'area', 'relation'],
28252               warnings = [];
28253
28254           for (var i = 0; i < changes.created.length; i++) {
28255               var change = changes.created[i],
28256                   geometry = change.geometry(graph);
28257
28258               if (types.indexOf(geometry) !== -1 && !hasTags(change, graph)) {
28259                   warnings.push({
28260                       id: 'missing_tag',
28261                       message: t('validations.untagged_' + geometry),
28262                       tooltip: t('validations.untagged_' + geometry + '_tooltip'),
28263                       entity: change
28264                   });
28265               }
28266           }
28267
28268           return warnings;
28269       };
28270
28271
28272       return validation;
28273   }
28274
28275   function validationOldMultipolygon() {
28276
28277       return function validation(changes, graph) {
28278           var warnings = [];
28279           for (var i = 0; i < changes.created.length; i++) {
28280               var entity = changes.created[i];
28281               var parent = osmIsSimpleMultipolygonOuterMember(entity, graph);
28282               if (parent) {
28283                   warnings.push({
28284                       id: 'old_multipolygon',
28285                       message: t('validations.old_multipolygon'),
28286                       tooltip: t('validations.old_multipolygon_tooltip'),
28287                       entity: parent
28288                   });
28289               }
28290           }
28291           return warnings;
28292       };
28293   }
28294
28295   // https://github.com/openstreetmap/josm/blob/mirror/src/org/
28296   // openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80
28297   function validationTagSuggestsArea() {
28298
28299       function tagSuggestsArea(tags) {
28300           if (isEmpty(tags)) return false;
28301
28302           var presence = ['landuse', 'amenities', 'tourism', 'shop'];
28303           for (var i = 0; i < presence.length; i++) {
28304               if (tags[presence[i]] !== undefined) {
28305                   return presence[i] + '=' + tags[presence[i]];
28306               }
28307           }
28308
28309           if (tags.building && tags.building === 'yes') return 'building=yes';
28310       }
28311
28312
28313       var validation = function(changes, graph) {
28314           var warnings = [];
28315           for (var i = 0; i < changes.created.length; i++) {
28316               var change = changes.created[i],
28317                   geometry = change.geometry(graph),
28318                   suggestion = (geometry === 'line' ? tagSuggestsArea(change.tags) : undefined);
28319
28320               if (suggestion) {
28321                   warnings.push({
28322                       id: 'tag_suggests_area',
28323                       message: t('validations.tag_suggests_area', { tag: suggestion }),
28324                       entity: change
28325                   });
28326               }
28327           }
28328
28329           return warnings;
28330       };
28331
28332
28333       return validation;
28334   }
28335
28336
28337
28338   var Validations = /*#__PURE__*/Object.freeze({
28339     validationDeprecatedTag: validationDeprecatedTag,
28340     validationDisconnectedHighway: validationDisconnectedHighway,
28341     validationManyDeletions: validationManyDeletions,
28342     validationMissingTag: validationMissingTag,
28343     validationOldMultipolygon: validationOldMultipolygon,
28344     validationTagSuggestsArea: validationTagSuggestsArea
28345   });
28346
28347   /**
28348    * Performs a deep comparison between two values to determine if they are
28349    * equivalent.
28350    *
28351    * **Note:** This method supports comparing arrays, array buffers, booleans,
28352    * date objects, error objects, maps, numbers, `Object` objects, regexes,
28353    * sets, strings, symbols, and typed arrays. `Object` objects are compared
28354    * by their own, not inherited, enumerable properties. Functions and DOM
28355    * nodes are compared by strict equality, i.e. `===`.
28356    *
28357    * @static
28358    * @memberOf _
28359    * @since 0.1.0
28360    * @category Lang
28361    * @param {*} value The value to compare.
28362    * @param {*} other The other value to compare.
28363    * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
28364    * @example
28365    *
28366    * var object = { 'a': 1 };
28367    * var other = { 'a': 1 };
28368    *
28369    * _.isEqual(object, other);
28370    * // => true
28371    *
28372    * object === other;
28373    * // => false
28374    */
28375   function isEqual(value, other) {
28376     return baseIsEqual(value, other);
28377   }
28378
28379   /*
28380       iD.Difference represents the difference between two graphs.
28381       It knows how to calculate the set of entities that were
28382       created, modified, or deleted, and also contains the logic
28383       for recursively extending a difference to the complete set
28384       of entities that will require a redraw, taking into account
28385       child and parent relationships.
28386    */
28387   function coreDifference(base, head) {
28388       var _changes = {};
28389       var _diff = {};
28390       var _length = 0;
28391       var i, k, h, b, keys;
28392
28393       function changed(h, b) {
28394           if (h === b) return false;
28395           if (!h || !b) return true;
28396
28397           if (h.loc || b.loc) {
28398               if (!h.loc && b.loc || h.loc && !b.loc ||
28399                   h.loc[0] !== b.loc[0] || h.loc[1] !== b.loc[1]) return true;
28400           }
28401           if (h.nodes || b.nodes) {
28402               if (!isEqual(h.nodes, b.nodes)) return true;
28403           }
28404           if (h.members || b.members) {
28405               if (!isEqual(h.members, b.members)) return true;
28406           }
28407           return !isEqual(h.tags, b.tags);
28408       }
28409
28410
28411       keys = Object.keys(head.entities);
28412       for (i = 0; i < keys.length; i++) {
28413           k = keys[i];
28414           h = head.entities[k];
28415           b = base.entities[k];
28416           if (changed(h, b)) {
28417               _changes[k] = {base: b, head: h};
28418               _length++;
28419           }
28420       }
28421
28422       keys = Object.keys(base.entities);
28423       for (i = 0; i < keys.length; i++) {
28424           k = keys[i];
28425           h = head.entities[k];
28426           b = base.entities[k];
28427           if (!_changes[k] && changed(h, b)) {
28428               _changes[k] = {base: b, head: h};
28429               _length++;
28430           }
28431       }
28432
28433
28434       function addParents(parents, result) {
28435           for (var i = 0; i < parents.length; i++) {
28436               var parent = parents[i];
28437
28438               if (parent.id in result)
28439                   continue;
28440
28441               result[parent.id] = parent;
28442               addParents(head.parentRelations(parent), result);
28443           }
28444       }
28445
28446
28447       _diff.length = function length() {
28448           return _length;
28449       };
28450
28451
28452       _diff.changes = function changes() {
28453           return _changes;
28454       };
28455
28456
28457       _diff.extantIDs = function extantIDs() {
28458           var result = [];
28459           forEach(_changes, function(change, id) {
28460               if (change.head) result.push(id);
28461           });
28462           return result;
28463       };
28464
28465
28466       _diff.modified = function modified() {
28467           var result = [];
28468           forEach(_changes, function(change) {
28469               if (change.base && change.head) result.push(change.head);
28470           });
28471           return result;
28472       };
28473
28474
28475       _diff.created = function created() {
28476           var result = [];
28477           forEach(_changes, function(change) {
28478               if (!change.base && change.head) result.push(change.head);
28479           });
28480           return result;
28481       };
28482
28483
28484       _diff.deleted = function deleted() {
28485           var result = [];
28486           forEach(_changes, function(change) {
28487               if (change.base && !change.head) result.push(change.base);
28488           });
28489           return result;
28490       };
28491
28492
28493       _diff.summary = function summary() {
28494           var relevant = {};
28495
28496           function addEntity(entity, graph, changeType) {
28497               relevant[entity.id] = {
28498                   entity: entity,
28499                   graph: graph,
28500                   changeType: changeType
28501               };
28502           }
28503
28504           function addParents(entity) {
28505               var parents = head.parentWays(entity);
28506               for (var j = parents.length - 1; j >= 0; j--) {
28507                   var parent = parents[j];
28508                   if (!(parent.id in relevant)) addEntity(parent, head, 'modified');
28509               }
28510           }
28511
28512           var keys = Object.keys(_changes);
28513           for (var i = 0; i < keys.length; i++) {
28514               var change = _changes[keys[i]];
28515
28516               if (change.head && change.head.geometry(head) !== 'vertex') {
28517                   addEntity(change.head, head, change.base ? 'modified' : 'created');
28518
28519               } else if (change.base && change.base.geometry(base) !== 'vertex') {
28520                   addEntity(change.base, base, 'deleted');
28521
28522               } else if (change.base && change.head) { // modified vertex
28523                   var moved    = !isEqual(change.base.loc,  change.head.loc);
28524                   var retagged = !isEqual(change.base.tags, change.head.tags);
28525
28526                   if (moved) {
28527                       addParents(change.head);
28528                   }
28529
28530                   if (retagged || (moved && change.head.hasInterestingTags())) {
28531                       addEntity(change.head, head, 'modified');
28532                   }
28533
28534               } else if (change.head && change.head.hasInterestingTags()) { // created vertex
28535                   addEntity(change.head, head, 'created');
28536
28537               } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
28538                   addEntity(change.base, base, 'deleted');
28539               }
28540           }
28541
28542           return values$1(relevant);
28543       };
28544
28545
28546       _diff.complete = function complete(extent) {
28547           var result = {};
28548           var id, change;
28549
28550           for (id in _changes) {
28551               change = _changes[id];
28552
28553               var h = change.head;
28554               var b = change.base;
28555               var entity = h || b;
28556
28557               if (extent &&
28558                   (!h || !h.intersects(extent, head)) &&
28559                   (!b || !b.intersects(extent, base)))
28560                   continue;
28561
28562               result[id] = h;
28563
28564               if (entity.type === 'way') {
28565                   var nh = h ? h.nodes : [];
28566                   var nb = b ? b.nodes : [];
28567                   var diff, i;
28568
28569                   diff = difference(nh, nb);
28570                   for (i = 0; i < diff.length; i++) {
28571                       result[diff[i]] = head.hasEntity(diff[i]);
28572                   }
28573
28574                   diff = difference(nb, nh);
28575                   for (i = 0; i < diff.length; i++) {
28576                       result[diff[i]] = head.hasEntity(diff[i]);
28577                   }
28578               }
28579
28580               addParents(head.parentWays(entity), result);
28581               addParents(head.parentRelations(entity), result);
28582           }
28583
28584           return result;
28585       };
28586
28587
28588       return _diff;
28589   }
28590
28591   /** Used for built-in method references. */
28592   var objectProto$18 = Object.prototype;
28593
28594   /** Used to check objects for own properties. */
28595   var hasOwnProperty$15 = objectProto$18.hasOwnProperty;
28596
28597   /**
28598    * Assigns own enumerable string keyed properties of source objects to the
28599    * destination object. Source objects are applied from left to right.
28600    * Subsequent sources overwrite property assignments of previous sources.
28601    *
28602    * **Note:** This method mutates `object` and is loosely based on
28603    * [`Object.assign`](https://mdn.io/Object/assign).
28604    *
28605    * @static
28606    * @memberOf _
28607    * @since 0.10.0
28608    * @category Object
28609    * @param {Object} object The destination object.
28610    * @param {...Object} [sources] The source objects.
28611    * @returns {Object} Returns `object`.
28612    * @see _.assignIn
28613    * @example
28614    *
28615    * function Foo() {
28616    *   this.a = 1;
28617    * }
28618    *
28619    * function Bar() {
28620    *   this.c = 3;
28621    * }
28622    *
28623    * Foo.prototype.b = 2;
28624    * Bar.prototype.d = 4;
28625    *
28626    * _.assign({ 'a': 0 }, new Foo, new Bar);
28627    * // => { 'a': 1, 'c': 3 }
28628    */
28629   var assign = createAssigner(function(object, source) {
28630     if (isPrototype(source) || isArrayLike(source)) {
28631       copyObject(source, keys$1(source), object);
28632       return;
28633     }
28634     for (var key in source) {
28635       if (hasOwnProperty$15.call(source, key)) {
28636         assignValue(object, key, source[key]);
28637       }
28638     }
28639   });
28640
28641   /* Built-in method references for those with the same name as other `lodash` methods. */
28642   var nativeMax$3 = Math.max;
28643
28644   /**
28645    * Checks if `value` is in `collection`. If `collection` is a string, it's
28646    * checked for a substring of `value`, otherwise
28647    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
28648    * is used for equality comparisons. If `fromIndex` is negative, it's used as
28649    * the offset from the end of `collection`.
28650    *
28651    * @static
28652    * @memberOf _
28653    * @since 0.1.0
28654    * @category Collection
28655    * @param {Array|Object|string} collection The collection to inspect.
28656    * @param {*} value The value to search for.
28657    * @param {number} [fromIndex=0] The index to search from.
28658    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
28659    * @returns {boolean} Returns `true` if `value` is found, else `false`.
28660    * @example
28661    *
28662    * _.includes([1, 2, 3], 1);
28663    * // => true
28664    *
28665    * _.includes([1, 2, 3], 1, 2);
28666    * // => false
28667    *
28668    * _.includes({ 'a': 1, 'b': 2 }, 1);
28669    * // => true
28670    *
28671    * _.includes('abcd', 'bc');
28672    * // => true
28673    */
28674   function includes(collection, value, fromIndex, guard) {
28675     collection = isArrayLike(collection) ? collection : values$1(collection);
28676     fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
28677
28678     var length = collection.length;
28679     if (fromIndex < 0) {
28680       fromIndex = nativeMax$3(length + fromIndex, 0);
28681     }
28682     return isString(collection)
28683       ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
28684       : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
28685   }
28686
28687   function coreGraph$$1(other, mutable) {
28688       if (!(this instanceof coreGraph$$1)) return new coreGraph$$1(other, mutable);
28689
28690       if (other instanceof coreGraph$$1) {
28691           var base = other.base();
28692           this.entities = assign(Object.create(base.entities), other.entities);
28693           this._parentWays = assign(Object.create(base.parentWays), other._parentWays);
28694           this._parentRels = assign(Object.create(base.parentRels), other._parentRels);
28695
28696       } else {
28697           this.entities = Object.create({});
28698           this._parentWays = Object.create({});
28699           this._parentRels = Object.create({});
28700           this.rebase(other || [], [this]);
28701       }
28702
28703       this.transients = {};
28704       this._childNodes = {};
28705       this.frozen = !mutable;
28706   }
28707
28708
28709   coreGraph$$1.prototype = {
28710
28711       hasEntity: function(id) {
28712           return this.entities[id];
28713       },
28714
28715
28716       entity: function(id) {
28717           var entity = this.entities[id];
28718
28719           //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
28720           if (!entity) {
28721               entity = this.entities.__proto__[id];  // eslint-disable-line no-proto
28722           }
28723
28724           if (!entity) {
28725               throw new Error('entity ' + id + ' not found');
28726           }
28727           return entity;
28728       },
28729
28730
28731       transient: function(entity, key, fn) {
28732           var id = entity.id,
28733               transients = this.transients[id] ||
28734               (this.transients[id] = {});
28735
28736           if (transients[key] !== undefined) {
28737               return transients[key];
28738           }
28739
28740           transients[key] = fn.call(entity);
28741
28742           return transients[key];
28743       },
28744
28745
28746       parentWays: function(entity) {
28747           var parents = this._parentWays[entity.id],
28748               result = [];
28749
28750           if (parents) {
28751               for (var i = 0; i < parents.length; i++) {
28752                   result.push(this.entity(parents[i]));
28753               }
28754           }
28755           return result;
28756       },
28757
28758
28759       isPoi: function(entity) {
28760           var parentWays = this._parentWays[entity.id];
28761           return !parentWays || parentWays.length === 0;
28762       },
28763
28764
28765       isShared: function(entity) {
28766           var parentWays = this._parentWays[entity.id];
28767           return parentWays && parentWays.length > 1;
28768       },
28769
28770
28771       parentRelations: function(entity) {
28772           var parents = this._parentRels[entity.id],
28773               result = [];
28774
28775           if (parents) {
28776               for (var i = 0; i < parents.length; i++) {
28777                   result.push(this.entity(parents[i]));
28778               }
28779           }
28780           return result;
28781       },
28782
28783
28784       childNodes: function(entity) {
28785           if (this._childNodes[entity.id]) return this._childNodes[entity.id];
28786           if (!entity.nodes) return [];
28787
28788           var nodes = [];
28789           for (var i = 0; i < entity.nodes.length; i++) {
28790               nodes[i] = this.entity(entity.nodes[i]);
28791           }
28792
28793           if (debug) Object.freeze(nodes);
28794
28795           this._childNodes[entity.id] = nodes;
28796           return this._childNodes[entity.id];
28797       },
28798
28799
28800       base: function() {
28801           return {
28802               'entities': utilGetPrototypeOf(this.entities),
28803               'parentWays': utilGetPrototypeOf(this._parentWays),
28804               'parentRels': utilGetPrototypeOf(this._parentRels)
28805           };
28806       },
28807
28808
28809       // Unlike other graph methods, rebase mutates in place. This is because it
28810       // is used only during the history operation that merges newly downloaded
28811       // data into each state. To external consumers, it should appear as if the
28812       // graph always contained the newly downloaded data.
28813       rebase: function(entities, stack, force) {
28814           var base = this.base(),
28815               i, j, k, id;
28816
28817           for (i = 0; i < entities.length; i++) {
28818               var entity = entities[i];
28819
28820               if (!entity.visible || (!force && base.entities[entity.id]))
28821                   continue;
28822
28823               // Merging data into the base graph
28824               base.entities[entity.id] = entity;
28825               this._updateCalculated(undefined, entity, base.parentWays, base.parentRels);
28826
28827               // Restore provisionally-deleted nodes that are discovered to have an extant parent
28828               if (entity.type === 'way') {
28829                   for (j = 0; j < entity.nodes.length; j++) {
28830                       id = entity.nodes[j];
28831                       for (k = 1; k < stack.length; k++) {
28832                           var ents = stack[k].entities;
28833                           if (ents.hasOwnProperty(id) && ents[id] === undefined) {
28834                               delete ents[id];
28835                           }
28836                       }
28837                   }
28838               }
28839           }
28840
28841           for (i = 0; i < stack.length; i++) {
28842               stack[i]._updateRebased();
28843           }
28844       },
28845
28846
28847       _updateRebased: function() {
28848           var base = this.base(),
28849               i, k, child, id, keys;
28850
28851           keys = Object.keys(this._parentWays);
28852           for (i = 0; i < keys.length; i++) {
28853               child = keys[i];
28854               if (base.parentWays[child]) {
28855                   for (k = 0; k < base.parentWays[child].length; k++) {
28856                       id = base.parentWays[child][k];
28857                       if (!this.entities.hasOwnProperty(id) && !includes(this._parentWays[child], id)) {
28858                           this._parentWays[child].push(id);
28859                       }
28860                   }
28861               }
28862           }
28863
28864           keys = Object.keys(this._parentRels);
28865           for (i = 0; i < keys.length; i++) {
28866               child = keys[i];
28867               if (base.parentRels[child]) {
28868                   for (k = 0; k < base.parentRels[child].length; k++) {
28869                       id = base.parentRels[child][k];
28870                       if (!this.entities.hasOwnProperty(id) && !includes(this._parentRels[child], id)) {
28871                           this._parentRels[child].push(id);
28872                       }
28873                   }
28874               }
28875           }
28876
28877           this.transients = {};
28878
28879           // this._childNodes is not updated, under the assumption that
28880           // ways are always downloaded with their child nodes.
28881       },
28882
28883
28884       // Updates calculated properties (parentWays, parentRels) for the specified change
28885       _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
28886
28887           parentWays = parentWays || this._parentWays;
28888           parentRels = parentRels || this._parentRels;
28889
28890           var type = entity && entity.type || oldentity && oldentity.type,
28891               removed, added, ways, rels, i;
28892
28893
28894           if (type === 'way') {
28895
28896               // Update parentWays
28897               if (oldentity && entity) {
28898                   removed = difference(oldentity.nodes, entity.nodes);
28899                   added = difference(entity.nodes, oldentity.nodes);
28900               } else if (oldentity) {
28901                   removed = oldentity.nodes;
28902                   added = [];
28903               } else if (entity) {
28904                   removed = [];
28905                   added = entity.nodes;
28906               }
28907               for (i = 0; i < removed.length; i++) {
28908                   parentWays[removed[i]] = without(parentWays[removed[i]], oldentity.id);
28909               }
28910               for (i = 0; i < added.length; i++) {
28911                   ways = without(parentWays[added[i]], entity.id);
28912                   ways.push(entity.id);
28913                   parentWays[added[i]] = ways;
28914               }
28915
28916           } else if (type === 'relation') {
28917
28918               // Update parentRels
28919               if (oldentity && entity) {
28920                   removed = difference(oldentity.members, entity.members);
28921                   added = difference(entity.members, oldentity);
28922               } else if (oldentity) {
28923                   removed = oldentity.members;
28924                   added = [];
28925               } else if (entity) {
28926                   removed = [];
28927                   added = entity.members;
28928               }
28929               for (i = 0; i < removed.length; i++) {
28930                   parentRels[removed[i].id] = without(parentRels[removed[i].id], oldentity.id);
28931               }
28932               for (i = 0; i < added.length; i++) {
28933                   rels = without(parentRels[added[i].id], entity.id);
28934                   rels.push(entity.id);
28935                   parentRels[added[i].id] = rels;
28936               }
28937           }
28938       },
28939
28940
28941       replace: function(entity) {
28942           if (this.entities[entity.id] === entity)
28943               return this;
28944
28945           return this.update(function() {
28946               this._updateCalculated(this.entities[entity.id], entity);
28947               this.entities[entity.id] = entity;
28948           });
28949       },
28950
28951
28952       remove: function(entity) {
28953           return this.update(function() {
28954               this._updateCalculated(entity, undefined);
28955               this.entities[entity.id] = undefined;
28956           });
28957       },
28958
28959
28960       revert: function(id) {
28961           var baseEntity = this.base().entities[id],
28962               headEntity = this.entities[id];
28963
28964           if (headEntity === baseEntity)
28965               return this;
28966
28967           return this.update(function() {
28968               this._updateCalculated(headEntity, baseEntity);
28969               delete this.entities[id];
28970           });
28971       },
28972
28973
28974       update: function() {
28975           var graph = this.frozen ? coreGraph$$1(this, true) : this;
28976
28977           for (var i = 0; i < arguments.length; i++) {
28978               arguments[i].call(graph, graph);
28979           }
28980
28981           if (this.frozen) graph.frozen = true;
28982
28983           return graph;
28984       },
28985
28986
28987       // Obliterates any existing entities
28988       load: function(entities) {
28989           var base = this.base();
28990           this.entities = Object.create(base.entities);
28991
28992           for (var i in entities) {
28993               this.entities[i] = entities[i];
28994               this._updateCalculated(base.entities[i], this.entities[i]);
28995           }
28996
28997           return this;
28998       }
28999   };
29000
29001   function coreTree(head) {
29002       var rtree = rbush_1(),
29003           bboxes = {},
29004           tree = {};
29005
29006
29007       function entityBBox(entity) {
29008           var bbox = entity.extent(head).bbox();
29009           bbox.id = entity.id;
29010           bboxes[entity.id] = bbox;
29011           return bbox;
29012       }
29013
29014
29015       function updateParents(entity, insertions, memo) {
29016           head.parentWays(entity).forEach(function(way) {
29017               if (bboxes[way.id]) {
29018                   rtree.remove(bboxes[way.id]);
29019                   insertions[way.id] = way;
29020               }
29021               updateParents(way, insertions, memo);
29022           });
29023
29024           head.parentRelations(entity).forEach(function(relation) {
29025               if (memo[entity.id]) return;
29026               memo[entity.id] = true;
29027               if (bboxes[relation.id]) {
29028                   rtree.remove(bboxes[relation.id]);
29029                   insertions[relation.id] = relation;
29030               }
29031               updateParents(relation, insertions, memo);
29032           });
29033       }
29034
29035
29036       tree.rebase = function(entities, force) {
29037           var insertions = {};
29038
29039           for (var i = 0; i < entities.length; i++) {
29040               var entity = entities[i];
29041
29042               if (!entity.visible)
29043                   continue;
29044
29045               if (head.entities.hasOwnProperty(entity.id) || bboxes[entity.id]) {
29046                   if (!force) {
29047                       continue;
29048                   } else if (bboxes[entity.id]) {
29049                       rtree.remove(bboxes[entity.id]);
29050                   }
29051               }
29052
29053               insertions[entity.id] = entity;
29054               updateParents(entity, insertions, {});
29055           }
29056
29057           rtree.load(map$3(insertions, entityBBox));
29058
29059           return tree;
29060       };
29061
29062
29063       tree.intersects = function(extent, graph) {
29064           if (graph !== head) {
29065               var diff = coreDifference(head, graph),
29066                   insertions = {};
29067
29068               head = graph;
29069
29070               diff.deleted().forEach(function(entity) {
29071                   rtree.remove(bboxes[entity.id]);
29072                   delete bboxes[entity.id];
29073               });
29074
29075               diff.modified().forEach(function(entity) {
29076                   rtree.remove(bboxes[entity.id]);
29077                   insertions[entity.id] = entity;
29078                   updateParents(entity, insertions, {});
29079               });
29080
29081               diff.created().forEach(function(entity) {
29082                   insertions[entity.id] = entity;
29083               });
29084
29085               rtree.load(map$3(insertions, entityBBox));
29086           }
29087
29088           return rtree.search(extent.bbox()).map(function(bbox) {
29089               return head.entity(bbox.id);
29090           });
29091       };
29092
29093
29094       return tree;
29095   }
29096
29097   /*
29098    * This code is licensed under the MIT license.
29099    *
29100    * Copyright © 2013, iD authors.
29101    *
29102    * Portions copyright © 2011, Keith Cirkel
29103    * See https://github.com/keithamus/jwerty
29104    *
29105    */
29106   function d3keybinding(namespace$$1) {
29107       var bindings = [];
29108
29109
29110       function testBindings(isCapturing) {
29111           var didMatch = false,
29112               i, binding;
29113
29114           // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
29115           // so we don't strictly match on the shift key, but we prioritize
29116           // shifted bindings first, and fallback to unshifted only if no match.
29117           // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z')
29118
29119           // priority match shifted bindings first
29120           for (i = 0; i < bindings.length; i++) {
29121               binding = bindings[i];
29122               if (!binding.event.modifiers.shiftKey) continue;  // no shift
29123               if (!!binding.capture !== isCapturing) continue;
29124               if (matches(binding, true)) {
29125                   binding.callback();
29126                   didMatch = true;
29127               }
29128           }
29129
29130           // then unshifted bindings
29131           if (didMatch) return;
29132           for (i = 0; i < bindings.length; i++) {
29133               binding = bindings[i];
29134               if (binding.event.modifiers.shiftKey) continue;   // shift
29135               if (!!binding.capture !== isCapturing) continue;
29136               if (matches(binding, false)) {
29137                   binding.callback();
29138               }
29139           }
29140
29141
29142           function matches(binding, testShift) {
29143               var event$$1 = event;
29144               var isMatch = false;
29145               var tryKeyCode = true;
29146
29147               // Prefer a match on `KeyboardEvent.key`
29148               if (event$$1.key !== undefined) {
29149                   tryKeyCode = (event$$1.key.charCodeAt(0) > 255);  // outside ISO-Latin-1
29150                   isMatch = true;
29151
29152                   if (binding.event.key === undefined) {
29153                       isMatch = false;
29154                   } else if (Array.isArray(binding.event.key)) {
29155                       if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$$1.key.toLowerCase()) === -1)
29156                           isMatch = false;
29157                   } else {
29158                       if (event$$1.key.toLowerCase() !== binding.event.key.toLowerCase())
29159                           isMatch = false;
29160                   }
29161               }
29162
29163               // Fallback match on `KeyboardEvent.keyCode`, can happen if:
29164               // - browser doesn't support `KeyboardEvent.key`
29165               // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?)
29166               if (!isMatch && tryKeyCode) {
29167                   isMatch = (event$$1.keyCode === binding.event.keyCode);
29168               }
29169
29170               if (!isMatch) return false;
29171
29172               // test modifier keys
29173               if (!(event$$1.ctrlKey && event$$1.altKey)) {  // if both are set, assume AltGr and skip it - #4096
29174                   if (event$$1.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
29175                   if (event$$1.altKey !== binding.event.modifiers.altKey) return false;
29176               }
29177               if (event$$1.metaKey !== binding.event.modifiers.metaKey) return false;
29178               if (testShift && event$$1.shiftKey !== binding.event.modifiers.shiftKey) return false;
29179
29180               return true;
29181           }
29182       }
29183
29184
29185       function capture() {
29186           testBindings(true);
29187       }
29188
29189
29190       function bubble() {
29191           var tagName = d3_select(event.target).node().tagName;
29192           if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
29193               return;
29194           }
29195           testBindings(false);
29196       }
29197
29198
29199       function keybinding(selection$$1) {
29200           selection$$1 = selection$$1 || d3_select(document);
29201           selection$$1.on('keydown.capture' + namespace$$1, capture, true);
29202           selection$$1.on('keydown.bubble' + namespace$$1, bubble, false);
29203           return keybinding;
29204       }
29205
29206
29207       keybinding.off = function(selection$$1) {
29208           bindings = [];
29209           selection$$1 = selection$$1 || d3_select(document);
29210           selection$$1.on('keydown.capture' + namespace$$1, null);
29211           selection$$1.on('keydown.bubble' + namespace$$1, null);
29212           return keybinding;
29213       };
29214
29215
29216       keybinding.on = function(codes, callback, capture) {
29217           var arr = [].concat(codes);
29218           for (var i = 0; i < arr.length; i++) {
29219               var code = arr[i];
29220               var binding = {
29221                   event: {
29222                       key: undefined,  // preferred
29223                       keyCode: 0,      // fallback
29224                       modifiers: {
29225                           shiftKey: false,
29226                           ctrlKey: false,
29227                           altKey: false,
29228                           metaKey: false
29229                       }
29230                   },
29231                   capture: capture,
29232                   callback: callback
29233               };
29234
29235               code = code.toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
29236
29237               for (var j = 0; j < code.length; j++) {
29238                   // Normalise matching errors
29239                   if (code[j] === '++') code[j] = '+';
29240
29241                   if (code[j] in d3keybinding.modifierCodes) {
29242                       binding.event.modifiers[d3keybinding.modifierProperties[d3keybinding.modifierCodes[code[j]]]] = true;
29243                   } else {
29244                       binding.event.key = d3keybinding.keys[code[j]] || code[j];
29245                       if (code[j] in d3keybinding.keyCodes) {
29246                           binding.event.keyCode = d3keybinding.keyCodes[code[j]];
29247                       }
29248                   }
29249               }
29250
29251               bindings.push(binding);
29252           }
29253
29254           return keybinding;
29255       };
29256
29257       return keybinding;
29258   }
29259
29260
29261   d3keybinding.modifierCodes = {
29262       // Shift key, ⇧
29263       '⇧': 16, shift: 16,
29264       // CTRL key, on Mac: ⌃
29265       '⌃': 17, ctrl: 17,
29266       // ALT key, on Mac: ⌥ (Alt)
29267       '⌥': 18, alt: 18, option: 18,
29268       // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
29269       '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
29270   };
29271
29272   d3keybinding.modifierProperties = {
29273       16: 'shiftKey',
29274       17: 'ctrlKey',
29275       18: 'altKey',
29276       91: 'metaKey'
29277   };
29278
29279   d3keybinding.keys = {
29280       // Backspace key, on Mac: ⌫ (Backspace)
29281       '⌫': 'Backspace', backspace: 'Backspace',
29282       // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29283       '⇥': 'Tab', '⇆': 'Tab', tab: 'Tab',
29284       // Return key, ↩
29285       '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter',
29286       // Pause/Break key
29287       'pause': 'Pause', 'pause-break': 'Pause',
29288       // Caps Lock key, ⇪
29289       '⇪': 'CapsLock', caps: 'CapsLock', 'caps-lock': 'CapsLock',
29290       // Escape key, on Mac: ⎋, on Windows: Esc
29291       '⎋': ['Escape', 'Esc'], escape: ['Escape', 'Esc'], esc: ['Escape', 'Esc'],
29292       // Space key
29293       space: [' ', 'Spacebar'],
29294       // Page-Up key, or pgup, on Mac: ↖
29295       '↖': 'PageUp', pgup: 'PageUp', 'page-up': 'PageUp',
29296       // Page-Down key, or pgdown, on Mac: ↘
29297       '↘': 'PageDown', pgdown: 'PageDown', 'page-down': 'PageDown',
29298       // END key, on Mac: ⇟
29299       '⇟': 'End', end: 'End',
29300       // HOME key, on Mac: ⇞
29301       '⇞': 'Home', home: 'Home',
29302       // Insert key, or ins
29303       ins: 'Insert', insert: 'Insert',
29304       // Delete key, on Mac: ⌦ (Delete)
29305       '⌦': ['Delete', 'Del'], del: ['Delete', 'Del'], 'delete': ['Delete', 'Del'],
29306       // Left Arrow Key, or ←
29307       '←': ['ArrowLeft', 'Left'], left: ['ArrowLeft', 'Left'], 'arrow-left': ['ArrowLeft', 'Left'],
29308       // Up Arrow Key, or ↑
29309       '↑': ['ArrowUp', 'Up'], up: ['ArrowUp', 'Up'], 'arrow-up': ['ArrowUp', 'Up'],
29310       // Right Arrow Key, or →
29311       '→': ['ArrowRight', 'Right'], right: ['ArrowRight', 'Right'], 'arrow-right': ['ArrowRight', 'Right'],
29312       // Up Arrow Key, or ↓
29313       '↓': ['ArrowDown', 'Down'], down: ['ArrowDown', 'Down'], 'arrow-down': ['ArrowDown', 'Down'],
29314       // odities, stuff for backward compatibility (browsers and code):
29315       // Num-Multiply, or *
29316       '*': ['*', 'Multiply'], star: ['*', 'Multiply'], asterisk: ['*', 'Multiply'], multiply: ['*', 'Multiply'],
29317       // Num-Plus or +
29318       '+': ['+', 'Add'], 'plus': ['+', 'Add'],
29319       // Num-Subtract, or -
29320       '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'],
29321       // Semicolon
29322       semicolon: ';',
29323       // = or equals
29324       equals: '=',
29325       // Comma, or ,
29326       comma: ',',
29327       // Period, or ., or full-stop
29328       period: '.', 'full-stop': '.',
29329       // Slash, or /, or forward-slash
29330       slash: '/', 'forward-slash': '/',
29331       // Tick, or `, or back-quote
29332       tick: '`', 'back-quote': '`',
29333       // Open bracket, or [
29334       'open-bracket': '[',
29335       // Back slash, or \
29336       'back-slash': '\\',
29337       // Close backet, or ]
29338       'close-bracket': ']',
29339       // Apostrophe, or Quote, or '
29340       quote: '\'', apostrophe: '\'',
29341       // NUMPAD 0-9
29342       'num-0': '0',
29343       'num-1': '1',
29344       'num-2': '2',
29345       'num-3': '3',
29346       'num-4': '4',
29347       'num-5': '5',
29348       'num-6': '6',
29349       'num-7': '7',
29350       'num-8': '8',
29351       'num-9': '9',
29352       // F1-F25
29353       f1: 'F1',
29354       f2: 'F2',
29355       f3: 'F3',
29356       f4: 'F4',
29357       f5: 'F5',
29358       f6: 'F6',
29359       f7: 'F7',
29360       f8: 'F8',
29361       f9: 'F9',
29362       f10: 'F10',
29363       f11: 'F11',
29364       f12: 'F12',
29365       f13: 'F13',
29366       f14: 'F14',
29367       f15: 'F15',
29368       f16: 'F16',
29369       f17: 'F17',
29370       f18: 'F18',
29371       f19: 'F19',
29372       f20: 'F20',
29373       f21: 'F21',
29374       f22: 'F22',
29375       f23: 'F23',
29376       f24: 'F24',
29377       f25: 'F25'
29378   };
29379
29380   d3keybinding.keyCodes = {
29381       // Backspace key, on Mac: ⌫ (Backspace)
29382       '⌫': 8, backspace: 8,
29383       // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29384       '⇥': 9, '⇆': 9, tab: 9,
29385       // Return key, ↩
29386       '↩': 13, 'return': 13, enter: 13, '⌅': 13,
29387       // Pause/Break key
29388       'pause': 19, 'pause-break': 19,
29389       // Caps Lock key, ⇪
29390       '⇪': 20, caps: 20, 'caps-lock': 20,
29391       // Escape key, on Mac: ⎋, on Windows: Esc
29392       '⎋': 27, escape: 27, esc: 27,
29393       // Space key
29394       space: 32,
29395       // Page-Up key, or pgup, on Mac: ↖
29396       '↖': 33, pgup: 33, 'page-up': 33,
29397       // Page-Down key, or pgdown, on Mac: ↘
29398       '↘': 34, pgdown: 34, 'page-down': 34,
29399       // END key, on Mac: ⇟
29400       '⇟': 35, end: 35,
29401       // HOME key, on Mac: ⇞
29402       '⇞': 36, home: 36,
29403       // Insert key, or ins
29404       ins: 45, insert: 45,
29405       // Delete key, on Mac: ⌦ (Delete)
29406       '⌦': 46, del: 46, 'delete': 46,
29407       // Left Arrow Key, or ←
29408       '←': 37, left: 37, 'arrow-left': 37,
29409       // Up Arrow Key, or ↑
29410       '↑': 38, up: 38, 'arrow-up': 38,
29411       // Right Arrow Key, or →
29412       '→': 39, right: 39, 'arrow-right': 39,
29413       // Up Arrow Key, or ↓
29414       '↓': 40, down: 40, 'arrow-down': 40,
29415       // odities, printing characters that come out wrong:
29416       // Firefox Equals
29417       'ffequals': 61,
29418       // Num-Multiply, or *
29419       '*': 106, star: 106, asterisk: 106, multiply: 106,
29420       // Num-Plus or +
29421       '+': 107, 'plus': 107,
29422       // Num-Subtract, or -
29423       '-': 109, subtract: 109,
29424       // Firefox Plus
29425       'ffplus': 171,
29426       // Firefox Minus
29427       'ffminus': 173,
29428       // Semicolon
29429       ';': 186, semicolon: 186,
29430       // = or equals
29431       '=': 187, 'equals': 187,
29432       // Comma, or ,
29433       ',': 188, comma: 188,
29434       // Dash / Underscore key
29435       'dash': 189,
29436       // Period, or ., or full-stop
29437       '.': 190, period: 190, 'full-stop': 190,
29438       // Slash, or /, or forward-slash
29439       '/': 191, slash: 191, 'forward-slash': 191,
29440       // Tick, or `, or back-quote
29441       '`': 192, tick: 192, 'back-quote': 192,
29442       // Open bracket, or [
29443       '[': 219, 'open-bracket': 219,
29444       // Back slash, or \
29445       '\\': 220, 'back-slash': 220,
29446       // Close backet, or ]
29447       ']': 221, 'close-bracket': 221,
29448       // Apostrophe, or Quote, or '
29449       '\'': 222, quote: 222, apostrophe: 222
29450   };
29451
29452   // NUMPAD 0-9
29453   var i$1 = 95, n = 0;
29454   while (++i$1 < 106) {
29455       d3keybinding.keyCodes['num-' + n] = i$1;
29456       ++n;
29457   }
29458
29459   // 0-9
29460   i$1 = 47; n = 0;
29461   while (++i$1 < 58) {
29462       d3keybinding.keyCodes[n] = i$1;
29463       ++n;
29464   }
29465
29466   // F1-F25
29467   i$1 = 111; n = 1;
29468   while (++i$1 < 136) {
29469       d3keybinding.keyCodes['f' + n] = i$1;
29470       ++n;
29471   }
29472
29473   // a-z
29474   i$1 = 64;
29475   while (++i$1 < 91) {
29476       d3keybinding.keyCodes[String.fromCharCode(i$1).toLowerCase()] = i$1;
29477   }
29478
29479   function tooltip() {
29480     var tooltip = function(selection$$1) {
29481         selection$$1.each(setup);
29482       },
29483       animation = utilFunctor(false),
29484       html = utilFunctor(false),
29485       title = function() {
29486         var title = this.getAttribute('data-original-title');
29487         if (title) {
29488           return title;
29489         } else {
29490           title = this.getAttribute('title');
29491           this.removeAttribute('title');
29492           this.setAttribute('data-original-title', title);
29493         }
29494         return title;
29495       },
29496       over = 'mouseenter.tooltip',
29497       out = 'mouseleave.tooltip',
29498       placement = utilFunctor('top');
29499
29500
29501     tooltip.title = function(_) {
29502       if (arguments.length) {
29503         title = utilFunctor(_);
29504         return tooltip;
29505       } else {
29506         return title;
29507       }
29508     };
29509
29510
29511     tooltip.html = function(_) {
29512       if (arguments.length) {
29513         html = utilFunctor(_);
29514         return tooltip;
29515       } else {
29516         return html;
29517       }
29518     };
29519
29520
29521     tooltip.placement = function(_) {
29522       if (arguments.length) {
29523         placement = utilFunctor(_);
29524         return tooltip;
29525       } else {
29526         return placement;
29527       }
29528     };
29529
29530
29531     tooltip.show = function(selection$$1) {
29532       selection$$1.each(show);
29533     };
29534
29535
29536     tooltip.hide = function(selection$$1) {
29537       selection$$1.each(hide);
29538     };
29539
29540
29541     tooltip.toggle = function(selection$$1) {
29542       selection$$1.each(toggle);
29543     };
29544
29545
29546     tooltip.destroy = function(selection$$1) {
29547       selection$$1
29548         .on(over, null)
29549         .on(out, null)
29550         .attr('title', function() {
29551           return this.getAttribute('data-original-title') || this.getAttribute('title');
29552         })
29553         .attr('data-original-title', null)
29554         .selectAll('.tooltip')
29555         .remove();
29556     };
29557
29558
29559     function setup() {
29560       var root = d3_select(this),
29561           animate = animation.apply(this, arguments),
29562           tip = root.selectAll('.tooltip').data([0]);
29563
29564       var enter = tip.enter()
29565         .append('div')
29566         .attr('class', 'tooltip');
29567
29568       enter
29569         .append('div')
29570         .attr('class', 'tooltip-arrow');
29571
29572       enter
29573         .append('div')
29574         .attr('class', 'tooltip-inner');
29575
29576       tip = enter
29577         .merge(tip);
29578
29579       if (animate) {
29580         tip.classed('fade', true);
29581       }
29582
29583       var place = placement.apply(this, arguments);
29584       tip.classed(place, true);
29585
29586       root.on(over, show);
29587       root.on(out, hide);
29588     }
29589
29590
29591     function show() {
29592       var root = d3_select(this),
29593         content = title.apply(this, arguments),
29594         tip = root.selectAll('.tooltip')
29595           .classed('in', true),
29596         markup = html.apply(this, arguments);
29597
29598       tip.selectAll('.tooltip-inner')[markup ? 'html' : 'text'](content);
29599       var place = placement.apply(this, arguments),
29600         outer = getPosition(root.node()),
29601         inner = getPosition(tip.node()),
29602         pos;
29603
29604       switch (place) {
29605         case 'top':
29606           pos = {x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h};
29607           break;
29608         case 'right':
29609           pos = {x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2};
29610           break;
29611         case 'left':
29612           pos = {x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2};
29613           break;
29614         case 'bottom':
29615           pos = {x: Math.max(0, outer.x + (outer.w - inner.w) / 2), y: outer.y + outer.h};
29616           break;
29617       }
29618
29619       if (pos) {
29620         tip.style('left', ~~pos.x + 'px').style('top', ~~pos.y + 'px');
29621       } else {
29622         tip.style('left', null).style('top', null);
29623       }
29624
29625       this.tooltipVisible = true;
29626     }
29627
29628
29629     function hide() {
29630       d3_select(this).selectAll('.tooltip')
29631         .classed('in', false);
29632
29633       this.tooltipVisible = false;
29634     }
29635
29636
29637     function toggle() {
29638       if (this.tooltipVisible) {
29639         hide.apply(this, arguments);
29640       } else {
29641         show.apply(this, arguments);
29642       }
29643     }
29644
29645     return tooltip;
29646   }
29647
29648
29649   function getPosition(node) {
29650     var mode = d3_select(node).style('position');
29651     if (mode === 'absolute' || mode === 'static') {
29652       return {
29653         x: node.offsetLeft,
29654         y: node.offsetTop,
29655         w: node.offsetWidth,
29656         h: node.offsetHeight
29657       };
29658     } else {
29659       return {
29660         x: 0,
29661         y: 0,
29662         w: node.offsetWidth,
29663         h: node.offsetHeight
29664       };
29665     }
29666   }
29667
29668   function behaviorEdit(context) {
29669
29670       function edit() {
29671           context.map()
29672               .minzoom(context.minEditableZoom());
29673       }
29674
29675
29676       edit.off = function() {
29677           context.map()
29678               .minzoom(0);
29679       };
29680
29681
29682       return edit;
29683   }
29684
29685   /*
29686      The hover behavior adds the `.hover` class on mouseover to all elements to which
29687      the identical datum is bound, and removes it on mouseout.
29688
29689      The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
29690      representation may consist of several elements scattered throughout the DOM hierarchy.
29691      Only one of these elements can have the :hover pseudo-class, but all of them will
29692      have the .hover class.
29693    */
29694   function behaviorHover(context) {
29695       var dispatch$$1 = dispatch('hover');
29696       var _selection = d3_select(null);
29697       var _newId = null;
29698       var _buttonDown;
29699       var _altDisables;
29700       var _target;
29701
29702
29703       function keydown() {
29704           if (_altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
29705               _selection.selectAll('.hover')
29706                   .classed('hover-suppressed', true)
29707                   .classed('hover', false);
29708
29709               _selection
29710                   .classed('hover-disabled', true);
29711
29712               dispatch$$1.call('hover', this, null);
29713           }
29714       }
29715
29716
29717       function keyup() {
29718           if (_altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
29719               _selection.selectAll('.hover-suppressed')
29720                   .classed('hover-suppressed', false)
29721                   .classed('hover', true);
29722
29723               _selection
29724                   .classed('hover-disabled', false);
29725
29726               dispatch$$1.call('hover', this, _target ? _target.id : null);
29727           }
29728       }
29729
29730
29731       var hover = function(selection$$1) {
29732           _selection = selection$$1;
29733           _newId = null;
29734
29735           _selection
29736               .on('mouseover.hover', mouseover)
29737               .on('mouseout.hover', mouseout)
29738               .on('mousedown.hover', mousedown);
29739
29740           d3_select(window)
29741               .on('keydown.hover', keydown)
29742               .on('keyup.hover', keyup);
29743
29744
29745           function mouseover() {
29746               if (_buttonDown) return;
29747               var target = event.target;
29748               enter(target ? target.__data__ : null);
29749           }
29750
29751
29752           function mouseout() {
29753               if (_buttonDown) return;
29754               var target = event.relatedTarget;
29755               enter(target ? target.__data__ : null);
29756           }
29757
29758
29759           function mousedown() {
29760               _buttonDown = true;
29761               d3_select(window)
29762                   .on('mouseup.hover', mouseup, true);
29763           }
29764
29765
29766           function mouseup() {
29767               _buttonDown = false;
29768               d3_select(window)
29769                   .on('mouseup.hover', null, true);
29770           }
29771
29772
29773           function enter(datum) {
29774               if (datum === _target) return;
29775               _target = datum;
29776
29777               _selection.selectAll('.hover')
29778                   .classed('hover', false);
29779               _selection.selectAll('.hover-suppressed')
29780                   .classed('hover-suppressed', false);
29781
29782               var entity;
29783               if (datum instanceof osmEntity$$1) {
29784                   entity = datum;
29785               } else {
29786                   entity = datum && datum.properties && datum.properties.entity;
29787               }
29788
29789               if (entity && entity.id !== _newId) {
29790                   // If drawing a way, don't hover on a node that was just placed. #3974
29791                   var mode = context.mode() && context.mode().id;
29792                   if ((mode === 'draw-line' || mode === 'draw-area') && !_newId && entity.type === 'node') {
29793                       _newId = entity.id;
29794                       return;
29795                   }
29796
29797                   var selector$$1 = '.' + entity.id;
29798
29799                   if (entity.type === 'relation') {
29800                       entity.members.forEach(function(member) {
29801                           selector$$1 += ', .' + member.id;
29802                       });
29803                   }
29804
29805                   var suppressed = _altDisables && event && event.altKey;
29806
29807                   _selection.selectAll(selector$$1)
29808                       .classed(suppressed ? 'hover-suppressed' : 'hover', true);
29809
29810                   dispatch$$1.call('hover', this, !suppressed && entity.id);
29811
29812               } else {
29813                   dispatch$$1.call('hover', this, null);
29814               }
29815           }
29816
29817       };
29818
29819
29820       hover.off = function(selection$$1) {
29821           selection$$1.selectAll('.hover')
29822               .classed('hover', false);
29823           selection$$1.selectAll('.hover-suppressed')
29824               .classed('hover-suppressed', false);
29825           selection$$1
29826               .classed('hover-disabled', false);
29827
29828           selection$$1
29829               .on('mouseover.hover', null)
29830               .on('mouseout.hover', null)
29831               .on('mousedown.hover', null);
29832
29833           d3_select(window)
29834               .on('keydown.hover', null)
29835               .on('keyup.hover', null);
29836       };
29837
29838
29839       hover.altDisables = function(_) {
29840           if (!arguments.length) return _altDisables;
29841           _altDisables = _;
29842           return hover;
29843       };
29844
29845
29846       return utilRebind(hover, dispatch$$1, 'on');
29847   }
29848
29849   function refresh(selection, node) {
29850       var cr = node.getBoundingClientRect();
29851       var prop = [cr.width, cr.height];
29852       selection.property('__dimensions__', prop);
29853       return prop;
29854   }
29855
29856   function utilGetDimensions(selection, force) {
29857       if (!selection || selection.empty()) {
29858           return [0, 0];
29859       }
29860       var node = selection.node(),
29861           cached = selection.property('__dimensions__');
29862       return (!cached || force) ? refresh(selection, node) : cached;
29863   }
29864
29865
29866   function utilSetDimensions(selection, dimensions) {
29867       if (!selection || selection.empty()) {
29868           return selection;
29869       }
29870       var node = selection.node();
29871       if (dimensions === null) {
29872           refresh(selection, node);
29873           return selection;
29874       }
29875       return selection
29876           .property('__dimensions__', [dimensions[0], dimensions[1]])
29877           .attr('width', dimensions[0])
29878           .attr('height', dimensions[1]);
29879   }
29880
29881   function behaviorTail() {
29882       var text,
29883           container,
29884           xmargin = 25,
29885           tooltipSize = [0, 0],
29886           selectionSize = [0, 0];
29887
29888
29889       function tail(selection$$1) {
29890           if (!text) return;
29891
29892           d3_select(window)
29893               .on('resize.tail', function() { selectionSize = utilGetDimensions(selection$$1); });
29894
29895           container = d3_select(document.body)
29896               .append('div')
29897               .style('display', 'none')
29898               .attr('class', 'tail tooltip-inner');
29899
29900           container.append('div')
29901               .text(text);
29902
29903           selection$$1
29904               .on('mousemove.tail', mousemove)
29905               .on('mouseenter.tail', mouseenter)
29906               .on('mouseleave.tail', mouseleave);
29907
29908           container
29909               .on('mousemove.tail', mousemove);
29910
29911           tooltipSize = utilGetDimensions(container);
29912           selectionSize = utilGetDimensions(selection$$1);
29913
29914
29915           function show() {
29916               container.style('display', 'block');
29917               tooltipSize = utilGetDimensions(container);
29918           }
29919
29920
29921           function mousemove() {
29922               if (container.style('display') === 'none') show();
29923               var xoffset = ((event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
29924                   -tooltipSize[0] - xmargin : xmargin;
29925               container.classed('left', xoffset > 0);
29926               utilSetTransform(container, event.clientX + xoffset, event.clientY);
29927           }
29928
29929
29930           function mouseleave() {
29931               if (event.relatedTarget !== container.node()) {
29932                   container.style('display', 'none');
29933               }
29934           }
29935
29936
29937           function mouseenter() {
29938               if (event.relatedTarget !== container.node()) {
29939                   show();
29940               }
29941           }
29942       }
29943
29944
29945       tail.off = function(selection$$1) {
29946           if (!text) return;
29947
29948           container
29949               .on('mousemove.tail', null)
29950               .remove();
29951
29952           selection$$1
29953               .on('mousemove.tail', null)
29954               .on('mouseenter.tail', null)
29955               .on('mouseleave.tail', null);
29956
29957           d3_select(window)
29958               .on('resize.tail', null);
29959       };
29960
29961
29962       tail.text = function(_) {
29963           if (!arguments.length) return text;
29964           text = _;
29965           return tail;
29966       };
29967
29968
29969       return tail;
29970   }
29971
29972   var _usedTails = {};
29973   var _disableSpace = false;
29974   var _lastSpace = null;
29975
29976
29977   function behaviorDraw(context) {
29978       var dispatch$$1 = dispatch(
29979           'move', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish'
29980       );
29981
29982       var keybinding = d3keybinding('draw');
29983
29984       var hover = behaviorHover(context).altDisables(true)
29985           .on('hover', context.ui().sidebar.hover);
29986       var tail = behaviorTail();
29987       var edit = behaviorEdit(context);
29988
29989       var closeTolerance = 4;
29990       var tolerance = 12;
29991       var _mouseLeave = false;
29992       var _lastMouse = null;
29993
29994
29995       // related code
29996       // - `mode/drag_node.js` `datum()`
29997       function datum() {
29998           if (event.altKey) return {};
29999
30000           var element;
30001           if (event.type === 'keydown') {
30002               element = _lastMouse && _lastMouse.target;
30003           } else {
30004               element = event.target;
30005           }
30006
30007           // When drawing, snap only to touch targets..
30008           // (this excludes area fills and active drawing elements)
30009           var d = element.__data__;
30010           return (d && d.properties && d.properties.target) ? d : {};
30011       }
30012
30013
30014       function mousedown() {
30015
30016           function point$$1() {
30017               var p = context.container().node();
30018               return touchId !== null ? d3_touches(p).filter(function(p) {
30019                   return p.identifier === touchId;
30020               })[0] : d3_mouse(p);
30021           }
30022
30023           var element = d3_select(this);
30024           var touchId = event.touches ? event.changedTouches[0].identifier : null;
30025           var t1 = +new Date();
30026           var p1 = point$$1();
30027
30028           element.on('mousemove.draw', null);
30029
30030           d3_select(window).on('mouseup.draw', function() {
30031               var t2 = +new Date();
30032               var p2 = point$$1();
30033               var dist = geoVecLength(p1, p2);
30034
30035               element.on('mousemove.draw', mousemove);
30036               d3_select(window).on('mouseup.draw', null);
30037
30038               if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
30039                   // Prevent a quick second click
30040                   d3_select(window).on('click.draw-block', function() {
30041                       event.stopPropagation();
30042                   }, true);
30043
30044                   context.map().dblclickEnable(false);
30045
30046                   window.setTimeout(function() {
30047                       context.map().dblclickEnable(true);
30048                       d3_select(window).on('click.draw-block', null);
30049                   }, 500);
30050
30051                   click();
30052               }
30053           }, true);
30054       }
30055
30056
30057       function mousemove() {
30058           _lastMouse = event;
30059           dispatch$$1.call('move', this, datum());
30060       }
30061
30062
30063       function mouseenter() {
30064           _mouseLeave = false;
30065       }
30066
30067
30068       function mouseleave() {
30069           _mouseLeave = true;
30070       }
30071
30072
30073       // related code
30074       // - `mode/drag_node.js`     `doMode()`
30075       // - `behavior/draw.js`      `click()`
30076       // - `behavior/draw_way.js`  `move()`
30077       function click() {
30078           var d = datum();
30079           var target = d && d.properties && d.properties.entity;
30080
30081           if (target && target.type === 'node') {   // Snap to a node
30082               dispatch$$1.call('clickNode', this, target, d);
30083               return;
30084
30085           } else if (target && target.type === 'way') {   // Snap to a way
30086               var choice = geoChooseEdge(
30087                   context.childNodes(target), context.mouse(), context.projection, context.activeID()
30088               );
30089               if (choice) {
30090                   var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
30091                   dispatch$$1.call('clickWay', this, choice.loc, edge, d);
30092                   return;
30093               }
30094           }
30095
30096           dispatch$$1.call('click', this, context.map().mouseCoordinates(), d);
30097       }
30098
30099
30100       function space() {
30101           event.preventDefault();
30102           event.stopPropagation();
30103
30104           var currSpace = context.mouse();
30105           if (_disableSpace && _lastSpace) {
30106               var dist = geoVecLength(_lastSpace, currSpace);
30107               if (dist > tolerance) {
30108                   _disableSpace = false;
30109               }
30110           }
30111
30112           if (_disableSpace || _mouseLeave || !_lastMouse) return;
30113
30114           // user must move mouse or release space bar to allow another click
30115           _lastSpace = currSpace;
30116           _disableSpace = true;
30117
30118           d3_select(window).on('keyup.space-block', function() {
30119               event.preventDefault();
30120               event.stopPropagation();
30121               _disableSpace = false;
30122               d3_select(window).on('keyup.space-block', null);
30123           });
30124
30125           click();
30126       }
30127
30128
30129       function backspace() {
30130           event.preventDefault();
30131           dispatch$$1.call('undo');
30132       }
30133
30134
30135       function del() {
30136           event.preventDefault();
30137           dispatch$$1.call('cancel');
30138       }
30139
30140
30141       function ret() {
30142           event.preventDefault();
30143           dispatch$$1.call('finish');
30144       }
30145
30146
30147       function draw(selection$$1) {
30148           context.install(hover);
30149           context.install(edit);
30150
30151           if (!context.inIntro() && !_usedTails[tail.text()]) {
30152               context.install(tail);
30153           }
30154
30155           keybinding
30156               .on('⌫', backspace)
30157               .on('⌦', del)
30158               .on('⎋', ret)
30159               .on('↩', ret)
30160               .on('space', space)
30161               .on('⌥space', space);
30162
30163           selection$$1
30164               .on('mouseenter.draw', mouseenter)
30165               .on('mouseleave.draw', mouseleave)
30166               .on('mousedown.draw', mousedown)
30167               .on('mousemove.draw', mousemove);
30168
30169           d3_select(document)
30170               .call(keybinding);
30171
30172           return draw;
30173       }
30174
30175
30176       draw.off = function(selection$$1) {
30177           context.ui().sidebar.hover.cancel();
30178           context.uninstall(hover);
30179           context.uninstall(edit);
30180
30181           if (!context.inIntro() && !_usedTails[tail.text()]) {
30182               context.uninstall(tail);
30183               _usedTails[tail.text()] = true;
30184           }
30185
30186           selection$$1
30187               .on('mouseenter.draw', null)
30188               .on('mouseleave.draw', null)
30189               .on('mousedown.draw', null)
30190               .on('mousemove.draw', null);
30191
30192           d3_select(window)
30193               .on('mouseup.draw', null);
30194               // note: keyup.space-block, click.draw-block should remain
30195
30196           d3_select(document)
30197               .call(keybinding.off);
30198       };
30199
30200
30201       draw.tail = function(_) {
30202           tail.text(_);
30203           return draw;
30204       };
30205
30206
30207       return utilRebind(draw, dispatch$$1, 'on');
30208   }
30209
30210   function modeAddArea$$1(context) {
30211       var mode = {
30212           id: 'add-area',
30213           button: 'area',
30214           title: t('modes.add_area.title'),
30215           description: t('modes.add_area.description'),
30216           key: '3'
30217       };
30218
30219       var behavior = behaviorAddWay(context)
30220               .tail(t('modes.add_area.tail'))
30221               .on('start', start)
30222               .on('startFromWay', startFromWay)
30223               .on('startFromNode', startFromNode),
30224           defaultTags = { area: 'yes' };
30225
30226
30227       function actionClose(wayId) {
30228           return function (graph) {
30229               return graph.replace(graph.entity(wayId).close());
30230           };
30231       }
30232
30233
30234       function start(loc) {
30235           var startGraph = context.graph(),
30236               node = osmNode({ loc: loc }),
30237               way = osmWay({ tags: defaultTags });
30238
30239           context.perform(
30240               actionAddEntity(node),
30241               actionAddEntity(way),
30242               actionAddVertex(way.id, node.id),
30243               actionClose(way.id)
30244           );
30245
30246           context.enter(modeDrawArea(context, way.id, startGraph));
30247       }
30248
30249
30250       function startFromWay(loc, edge) {
30251           var startGraph = context.graph(),
30252               node = osmNode({ loc: loc }),
30253               way = osmWay({ tags: defaultTags });
30254
30255           context.perform(
30256               actionAddEntity(node),
30257               actionAddEntity(way),
30258               actionAddVertex(way.id, node.id),
30259               actionClose(way.id),
30260               actionAddMidpoint({ loc: loc, edge: edge }, node)
30261           );
30262
30263           context.enter(modeDrawArea(context, way.id, startGraph));
30264       }
30265
30266
30267       function startFromNode(node) {
30268           var startGraph = context.graph(),
30269               way = osmWay({ tags: defaultTags });
30270
30271           context.perform(
30272               actionAddEntity(way),
30273               actionAddVertex(way.id, node.id),
30274               actionClose(way.id)
30275           );
30276
30277           context.enter(modeDrawArea(context, way.id, startGraph));
30278       }
30279
30280
30281       mode.enter = function() {
30282           context.install(behavior);
30283       };
30284
30285
30286       mode.exit = function() {
30287           context.uninstall(behavior);
30288       };
30289
30290
30291       return mode;
30292   }
30293
30294   function modeAddLine$$1(context) {
30295       var mode = {
30296           id: 'add-line',
30297           button: 'line',
30298           title: t('modes.add_line.title'),
30299           description: t('modes.add_line.description'),
30300           key: '2'
30301       };
30302
30303       var behavior = behaviorAddWay(context)
30304           .tail(t('modes.add_line.tail'))
30305           .on('start', start)
30306           .on('startFromWay', startFromWay)
30307           .on('startFromNode', startFromNode);
30308
30309
30310       function start(loc) {
30311           var startGraph = context.graph(),
30312               node = osmNode({ loc: loc }),
30313               way = osmWay();
30314
30315           context.perform(
30316               actionAddEntity(node),
30317               actionAddEntity(way),
30318               actionAddVertex(way.id, node.id)
30319           );
30320
30321           context.enter(modeDrawLine(context, way.id, startGraph));
30322       }
30323
30324
30325       function startFromWay(loc, edge) {
30326           var startGraph = context.graph(),
30327               node = osmNode({ loc: loc }),
30328               way = osmWay();
30329
30330           context.perform(
30331               actionAddEntity(node),
30332               actionAddEntity(way),
30333               actionAddVertex(way.id, node.id),
30334               actionAddMidpoint({ loc: loc, edge: edge }, node)
30335           );
30336
30337           context.enter(modeDrawLine(context, way.id, startGraph));
30338       }
30339
30340
30341       function startFromNode(node) {
30342           var startGraph = context.graph(),
30343               way = osmWay();
30344
30345           context.perform(
30346               actionAddEntity(way),
30347               actionAddVertex(way.id, node.id)
30348           );
30349
30350           context.enter(modeDrawLine(context, way.id, startGraph));
30351       }
30352
30353
30354       mode.enter = function() {
30355           context.install(behavior);
30356       };
30357
30358
30359       mode.exit = function() {
30360           context.uninstall(behavior);
30361       };
30362
30363       return mode;
30364   }
30365
30366   function modeAddPoint$$1(context) {
30367       var mode = {
30368           id: 'add-point',
30369           button: 'point',
30370           title: t('modes.add_point.title'),
30371           description: t('modes.add_point.description'),
30372           key: '1'
30373       };
30374
30375       var behavior = behaviorDraw(context)
30376           .tail(t('modes.add_point.tail'))
30377           .on('click', add)
30378           .on('clickWay', addWay)
30379           .on('clickNode', addNode)
30380           .on('cancel', cancel)
30381           .on('finish', cancel);
30382
30383
30384       function add(loc) {
30385           var node = osmNode({ loc: loc });
30386
30387           context.perform(
30388               actionAddEntity(node),
30389               t('operations.add.annotation.point')
30390           );
30391
30392           context.enter(
30393               modeSelect(context, [node.id]).newFeature(true)
30394           );
30395       }
30396
30397
30398       function addWay(loc) {
30399           add(loc);
30400       }
30401
30402
30403       function addNode(node) {
30404           add(node.loc);
30405       }
30406
30407
30408       function cancel() {
30409           context.enter(modeBrowse(context));
30410       }
30411
30412
30413       mode.enter = function() {
30414           context.install(behavior);
30415       };
30416
30417
30418       mode.exit = function() {
30419           context.uninstall(behavior);
30420       };
30421
30422
30423       return mode;
30424   }
30425
30426   function modeDragNode$$1(context) {
30427       var mode = {
30428           id: 'drag-node',
30429           button: 'browse'
30430       };
30431       var hover = behaviorHover(context).altDisables(true)
30432           .on('hover', context.ui().sidebar.hover);
30433       var edit = behaviorEdit(context);
30434
30435       var _nudgeInterval;
30436       var _restoreSelectedIDs = [];
30437       var _wasMidpoint = false;
30438       var _isCancelled = false;
30439       var _activeEntity;
30440       var _startLoc;
30441       var _lastLoc;
30442
30443
30444       function startNudge(entity, nudge) {
30445           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
30446           _nudgeInterval = window.setInterval(function() {
30447               context.pan(nudge);
30448               doMove(entity, nudge);
30449           }, 50);
30450       }
30451
30452
30453       function stopNudge() {
30454           if (_nudgeInterval) {
30455               window.clearInterval(_nudgeInterval);
30456               _nudgeInterval = null;
30457           }
30458       }
30459
30460
30461       function moveAnnotation(entity) {
30462           return t('operations.move.annotation.' + entity.geometry(context.graph()));
30463       }
30464
30465
30466       function connectAnnotation(entity) {
30467           return t('operations.connect.annotation.' + entity.geometry(context.graph()));
30468       }
30469
30470
30471       function origin(entity) {
30472           return context.projection(entity.loc);
30473       }
30474
30475
30476       function keydown() {
30477           if (event.keyCode === d3keybinding.modifierCodes.alt) {
30478               if (context.surface().classed('nope')) {
30479                   context.surface()
30480                       .classed('nope-suppressed', true);
30481               }
30482               context.surface()
30483                   .classed('nope', false)
30484                   .classed('nope-disabled', true);
30485           }
30486       }
30487
30488
30489       function keyup() {
30490           if (event.keyCode === d3keybinding.modifierCodes.alt) {
30491               if (context.surface().classed('nope-suppressed')) {
30492                   context.surface()
30493                       .classed('nope', true);
30494               }
30495               context.surface()
30496                   .classed('nope-suppressed', false)
30497                   .classed('nope-disabled', false);
30498           }
30499       }
30500
30501
30502       function start(entity) {
30503           _wasMidpoint = entity.type === 'midpoint';
30504           var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
30505           _isCancelled = event.sourceEvent.shiftKey || hasHidden;
30506
30507
30508           if (_isCancelled) {
30509               if (hasHidden) {
30510                   uiFlash()
30511                       .duration(4000)
30512                       .text(t('modes.drag_node.connected_to_hidden'))();
30513               }
30514               return drag.cancel();
30515           }
30516
30517           if (_wasMidpoint) {
30518               var midpoint = entity;
30519               entity = osmNode();
30520               context.perform(actionAddMidpoint(midpoint, entity));
30521               entity = context.entity(entity.id);   // get post-action entity
30522
30523               var vertex = context.surface().selectAll('.' + entity.id);
30524               drag.target(vertex.node(), entity);
30525
30526           } else {
30527               context.perform(actionNoop());
30528           }
30529
30530           _activeEntity = entity;
30531           _startLoc = entity.loc;
30532
30533           context.surface().selectAll('.' + _activeEntity.id)
30534               .classed('active', true);
30535
30536           context.enter(mode);
30537       }
30538
30539
30540       // related code
30541       // - `behavior/draw.js` `datum()`
30542       function datum() {
30543           var event$$1 = event && event.sourceEvent;
30544           if (!event$$1 || event$$1.altKey) {
30545               return {};
30546           } else {
30547               // When dragging, snap only to touch targets..
30548               // (this excludes area fills and active drawing elements)
30549               var d = event$$1.target.__data__;
30550               return (d && d.properties && d.properties.target) ? d : {};
30551           }
30552       }
30553
30554
30555       function doMove(entity, nudge) {
30556           nudge = nudge || [0, 0];
30557
30558           var currPoint = (event && event.point) || context.projection(_lastLoc);
30559           var currMouse = geoVecSubtract(currPoint, nudge);
30560           var loc = context.projection.invert(currMouse);
30561
30562           if (!_nudgeInterval) {   // If not nudging at the edge of the viewport, try to snap..
30563               // related code
30564               // - `mode/drag_node.js`     `doMode()`
30565               // - `behavior/draw.js`      `click()`
30566               // - `behavior/draw_way.js`  `move()`
30567               var d = datum();
30568               var target = d && d.properties && d.properties.entity;
30569               var targetLoc = target && target.loc;
30570               var targetNodes = d && d.properties && d.properties.nodes;
30571               var edge;
30572
30573               if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
30574                   loc = targetLoc;
30575
30576               } else if (targetNodes) {   // snap to way - a line target with `.nodes`
30577                   edge = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
30578                   if (edge) {
30579                       loc = edge.loc;
30580                   }
30581               }
30582           }
30583
30584           context.replace(
30585               actionMoveNode(entity.id, loc),
30586               moveAnnotation(entity)
30587           );
30588
30589           // Below here: validations
30590           var isInvalid = false;
30591
30592           // Check if this connection to `target` could cause relations to break..
30593           if (target) {
30594               isInvalid = hasRelationConflict(entity, target, edge, context.graph());
30595           }
30596
30597           // Check if this drag causes the geometry to break..
30598           if (!isInvalid) {
30599               isInvalid = hasInvalidGeometry(entity, context.graph());
30600           }
30601
30602
30603           var nope = context.surface().classed('nope');
30604           if (isInvalid === 'relation' || isInvalid === 'restriction') {
30605               if (!nope) {   // about to nope - show hint
30606                   uiFlash()
30607                       .duration(4000)
30608                       .text(t('operations.connect.' + isInvalid,
30609                           { relation: context.presets().item('type/restriction').name() }
30610                       ))();
30611               }
30612           } else {
30613               if (nope) {   // about to un-nope, remove hint
30614                   uiFlash()
30615                       .duration(1)
30616                       .text('')();
30617               }
30618           }
30619
30620
30621           var nopeDisabled = context.surface().classed('nope-disabled');
30622           if (nopeDisabled) {
30623               context.surface()
30624                   .classed('nope', false)
30625                   .classed('nope-suppressed', isInvalid);
30626           } else {
30627               context.surface()
30628                   .classed('nope', isInvalid)
30629                   .classed('nope-suppressed', false);
30630           }
30631
30632           _lastLoc = loc;
30633       }
30634
30635
30636       // Uses `actionConnect.disabled()` to know whether this connection is ok..
30637       function hasRelationConflict(entity, target, edge, graph) {
30638           var testGraph = graph.update();  // copy
30639
30640           // if snapping to way - add midpoint there and consider that the target..
30641           if (edge) {
30642               var midpoint = osmNode();
30643               var action = actionAddMidpoint({
30644                   loc: edge.loc,
30645                   edge: [target.nodes[edge.index - 1], target.nodes[edge.index]]
30646               }, midpoint);
30647
30648               testGraph = action(testGraph);
30649               target = midpoint;
30650           }
30651
30652           // can we connect to it?
30653           var ids = [entity.id, target.id];
30654           return actionConnect(ids).disabled(testGraph);
30655       }
30656
30657
30658       function hasInvalidGeometry(entity, graph) {
30659           var parents = graph.parentWays(entity);
30660           var i, j, k;
30661
30662           for (i = 0; i < parents.length; i++) {
30663               var parent = parents[i];
30664               var nodes = [];
30665               var activeIndex = null;    // which multipolygon ring contains node being dragged
30666
30667               // test any parent multipolygons for valid geometry
30668               var relations = graph.parentRelations(parent);
30669               for (j = 0; j < relations.length; j++) {
30670                   if (!relations[j].isMultipolygon()) continue;
30671
30672                   var rings = osmJoinWays(relations[j].members, graph);
30673
30674                   // find active ring and test it for self intersections
30675                   for (k = 0; k < rings.length; k++) {
30676                       nodes = rings[k].nodes;
30677                       if (find$1(nodes, function(n) { return n.id === entity.id; })) {
30678                           activeIndex = k;
30679                           if (geoHasSelfIntersections(nodes, entity.id)) {
30680                               return true;
30681                           }
30682                       }
30683                       rings[k].coords = nodes.map(function(n) { return n.loc; });
30684                   }
30685
30686                   // test active ring for intersections with other rings in the multipolygon
30687                   for (k = 0; k < rings.length; k++) {
30688                       if (k === activeIndex) continue;
30689
30690                       // make sure active ring doesnt cross passive rings
30691                       if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
30692                           return true;
30693                       }
30694                   }
30695               }
30696
30697
30698               // If we still haven't tested this node's parent way for self-intersections.
30699               // (because it's not a member of a multipolygon), test it now.
30700               if (activeIndex === null) {
30701                   nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
30702                   if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
30703                       return true;
30704                   }
30705               }
30706
30707           }
30708
30709           return false;
30710       }
30711
30712
30713       function move(entity) {
30714           if (_isCancelled) return;
30715           event.sourceEvent.stopPropagation();
30716
30717           context.surface().classed('nope-disabled', event.sourceEvent.altKey);
30718
30719           _lastLoc = context.projection.invert(event.point);
30720
30721           doMove(entity);
30722           var nudge = geoViewportEdge(event.point, context.map().dimensions());
30723           if (nudge) {
30724               startNudge(entity, nudge);
30725           } else {
30726               stopNudge();
30727           }
30728       }
30729
30730
30731       function end(entity) {
30732           if (_isCancelled) return;
30733
30734           var d = datum();
30735           var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope');
30736           var target = d && d.properties && d.properties.entity;   // entity to snap to
30737
30738           if (nope) {   // bounce back
30739               context.perform(
30740                   _actionBounceBack(entity.id, _startLoc)
30741               );
30742
30743           } else if (target && target.type === 'way') {
30744               var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id);
30745               context.replace(
30746                   actionAddMidpoint({
30747                       loc: choice.loc,
30748                       edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
30749                   }, entity),
30750                   connectAnnotation(target)
30751               );
30752
30753           } else if (target && target.type === 'node') {
30754               context.replace(
30755                   actionConnect([target.id, entity.id]),
30756                   connectAnnotation(target)
30757               );
30758
30759           } else if (_wasMidpoint) {
30760               context.replace(
30761                   actionNoop(),
30762                   t('operations.add.annotation.vertex')
30763               );
30764
30765           } else {
30766               context.replace(
30767                   actionNoop(),
30768                   moveAnnotation(entity)
30769               );
30770           }
30771
30772           var reselection = _restoreSelectedIDs.filter(function(id) {
30773               return context.graph().hasEntity(id);
30774           });
30775
30776           if (reselection.length) {
30777               context.enter(modeSelect(context, reselection));
30778           } else {
30779               context.enter(modeBrowse(context));
30780           }
30781       }
30782
30783
30784       function _actionBounceBack(nodeID, toLoc) {
30785           var moveNode = actionMoveNode(nodeID, toLoc);
30786           var action = function(graph, t$$1) {
30787               // last time through, pop off the bounceback perform.
30788               // it will then overwrite the initial perform with a moveNode that does nothing
30789               if (t$$1 === 1) context.pop();
30790               return moveNode(graph, t$$1);
30791           };
30792           action.transitionable = true;
30793           return action;
30794       }
30795
30796
30797       function cancel() {
30798           drag.cancel();
30799           context.enter(modeBrowse(context));
30800       }
30801
30802
30803       var drag = behaviorDrag()
30804           .selector('.layer-points-targets .target')
30805           .surface(d3_select('#map').node())
30806           .origin(origin)
30807           .on('start', start)
30808           .on('move', move)
30809           .on('end', end);
30810
30811
30812       mode.enter = function() {
30813           context.install(hover);
30814           context.install(edit);
30815
30816           d3_select(window)
30817               .on('keydown.drawWay', keydown)
30818               .on('keyup.drawWay', keyup);
30819
30820           context.history()
30821               .on('undone.drag-node', cancel);
30822       };
30823
30824
30825       mode.exit = function() {
30826           context.ui().sidebar.hover.cancel();
30827           context.uninstall(hover);
30828           context.uninstall(edit);
30829
30830           d3_select(window)
30831               .on('keydown.hover', null)
30832               .on('keyup.hover', null);
30833
30834           context.history()
30835               .on('undone.drag-node', null);
30836
30837           context.map()
30838               .on('drawn.drag-node', null);
30839
30840           _activeEntity = null;
30841
30842           context.surface()
30843               .classed('nope', false)
30844               .classed('nope-suppressed', false)
30845               .classed('nope-disabled', false)
30846               .selectAll('.active')
30847               .classed('active', false);
30848
30849           stopNudge();
30850       };
30851
30852
30853       mode.selectedIDs = function() {
30854           if (!arguments.length) return _activeEntity ? [_activeEntity.id] : [];
30855           // no assign
30856           return mode;
30857       };
30858
30859
30860       mode.activeID = function() {
30861           if (!arguments.length) return _activeEntity && _activeEntity.id;
30862           // no assign
30863           return mode;
30864       };
30865
30866
30867       mode.restoreSelectedIDs = function(_) {
30868           if (!arguments.length) return _restoreSelectedIDs;
30869           _restoreSelectedIDs = _;
30870           return mode;
30871       };
30872
30873
30874       mode.behavior = drag;
30875
30876
30877       return mode;
30878   }
30879
30880   function modeBrowse(context) {
30881       var mode = {
30882           button: 'browse',
30883           id: 'browse',
30884           title: t('modes.browse.title'),
30885           description: t('modes.browse.description')
30886       }, sidebar;
30887
30888       var behaviors = [
30889           behaviorPaste(context),
30890           behaviorHover(context).on('hover', context.ui().sidebar.hover),
30891           behaviorSelect(context),
30892           behaviorLasso(context),
30893           modeDragNode$$1(context).behavior
30894       ];
30895
30896
30897       mode.enter = function() {
30898           behaviors.forEach(function(behavior) {
30899               context.install(behavior);
30900           });
30901
30902           // Get focus on the body.
30903           if (document.activeElement && document.activeElement.blur) {
30904               document.activeElement.blur();
30905           }
30906
30907           if (sidebar) {
30908               context.ui().sidebar.show(sidebar);
30909           } else {
30910               context.ui().sidebar.select(null);
30911           }
30912       };
30913
30914
30915       mode.exit = function() {
30916           context.ui().sidebar.hover.cancel();
30917           behaviors.forEach(function(behavior) {
30918               context.uninstall(behavior);
30919           });
30920
30921           if (sidebar) {
30922               context.ui().sidebar.hide();
30923           }
30924       };
30925
30926
30927       mode.sidebar = function(_) {
30928           if (!arguments.length) return sidebar;
30929           sidebar = _;
30930           return mode;
30931       };
30932
30933
30934       return mode;
30935   }
30936
30937   function modeDrawArea(context, wayId, startGraph) {
30938       var mode = {
30939           button: 'area',
30940           id: 'draw-area'
30941       };
30942
30943       var behavior;
30944
30945
30946       mode.enter = function() {
30947           var way = context.entity(wayId);
30948
30949           behavior = behaviorDrawWay(context, wayId, undefined, mode, startGraph)
30950               .tail(t('modes.draw_area.tail'));
30951
30952           var addNode = behavior.addNode;
30953
30954           behavior.addNode = function(node, d) {
30955               var length = way.nodes.length;
30956               var penultimate = length > 2 ? way.nodes[length - 2] : null;
30957
30958               if (node.id === way.first() || node.id === penultimate) {
30959                   behavior.finish();
30960               } else {
30961                   addNode(node, d);
30962               }
30963           };
30964
30965           context.install(behavior);
30966       };
30967
30968
30969       mode.exit = function() {
30970           context.uninstall(behavior);
30971       };
30972
30973
30974       mode.selectedIDs = function() {
30975           return [wayId];
30976       };
30977
30978
30979       mode.activeID = function() {
30980           return (behavior && behavior.activeID()) || [];
30981       };
30982
30983
30984       return mode;
30985   }
30986
30987   function modeDrawLine(context, wayId, startGraph, affix) {
30988       var mode = {
30989           button: 'line',
30990           id: 'draw-line'
30991       };
30992
30993       var behavior;
30994
30995
30996       mode.enter = function() {
30997           var way = context.entity(wayId);
30998           var index = (affix === 'prefix') ? 0 : undefined;
30999           var headId = (affix === 'prefix') ? way.first() : way.last();
31000
31001           behavior = behaviorDrawWay(context, wayId, index, mode, startGraph)
31002               .tail(t('modes.draw_line.tail'));
31003
31004           var addNode = behavior.addNode;
31005           behavior.addNode = function(node, d) {
31006               if (node.id === headId) {
31007                   behavior.finish();
31008               } else {
31009                   addNode(node, d);
31010               }
31011           };
31012
31013           context.install(behavior);
31014       };
31015
31016
31017       mode.exit = function() {
31018           context.uninstall(behavior);
31019       };
31020
31021
31022       mode.selectedIDs = function() {
31023           return [wayId];
31024       };
31025
31026
31027       mode.activeID = function() {
31028           return (behavior && behavior.activeID()) || [];
31029       };
31030
31031       return mode;
31032   }
31033
31034   function operationCircularize(selectedIDs, context) {
31035       var entityId = selectedIDs[0],
31036           entity = context.entity(entityId),
31037           extent = entity.extent(context.graph()),
31038           geometry = context.geometry(entityId),
31039           action = actionCircularize(entityId, context.projection);
31040
31041
31042       var operation = function() {
31043           context.perform(action, operation.annotation());
31044       };
31045
31046
31047       operation.available = function() {
31048           return selectedIDs.length === 1 &&
31049               entity.type === 'way' &&
31050               uniq(entity.nodes).length > 1;
31051       };
31052
31053
31054       operation.disabled = function() {
31055           var reason;
31056           if (extent.percentContainedIn(context.extent()) < 0.8) {
31057               reason = 'too_large';
31058           } else if (context.hasHiddenConnections(entityId)) {
31059               reason = 'connected_to_hidden';
31060           }
31061           return action.disabled(context.graph()) || reason;
31062       };
31063
31064
31065       operation.tooltip = function() {
31066           var disable = operation.disabled();
31067           return disable ?
31068               t('operations.circularize.' + disable) :
31069               t('operations.circularize.description.' + geometry);
31070       };
31071
31072
31073       operation.annotation = function() {
31074           return t('operations.circularize.annotation.' + geometry);
31075       };
31076
31077
31078       operation.id = 'circularize';
31079       operation.keys = [t('operations.circularize.key')];
31080       operation.title = t('operations.circularize.title');
31081       operation.behavior = behaviorOperation(context).which(operation);
31082
31083       return operation;
31084   }
31085
31086   function operationContinue(selectedIDs, context) {
31087       var graph = context.graph(),
31088           entities = selectedIDs.map(function(id) { return graph.entity(id); }),
31089           geometries = assignIn({ line: [], vertex: [] },
31090               groupBy(entities, function(entity) { return entity.geometry(graph); })),
31091           vertex = geometries.vertex[0];
31092
31093
31094       function candidateWays() {
31095           return graph.parentWays(vertex).filter(function(parent) {
31096               return parent.geometry(graph) === 'line' &&
31097                   !parent.isClosed() &&
31098                   parent.affix(vertex.id) &&
31099                   (geometries.line.length === 0 || geometries.line[0] === parent);
31100           });
31101       }
31102
31103
31104       var operation = function() {
31105           var candidate = candidateWays()[0];
31106           context.enter(
31107               modeDrawLine(context, candidate.id, context.graph(), candidate.affix(vertex.id))
31108           );
31109       };
31110
31111
31112       operation.available = function() {
31113           return geometries.vertex.length === 1 && geometries.line.length <= 1 &&
31114               !context.features().hasHiddenConnections(vertex, context.graph());
31115       };
31116
31117
31118       operation.disabled = function() {
31119           var candidates = candidateWays();
31120           if (candidates.length === 0)
31121               return 'not_eligible';
31122           if (candidates.length > 1)
31123               return 'multiple';
31124       };
31125
31126
31127       operation.tooltip = function() {
31128           var disable = operation.disabled();
31129           return disable ?
31130               t('operations.continue.' + disable) :
31131               t('operations.continue.description');
31132       };
31133
31134
31135       operation.annotation = function() {
31136           return t('operations.continue.annotation.line');
31137       };
31138
31139
31140       operation.id = 'continue';
31141       operation.keys = [t('operations.continue.key')];
31142       operation.title = t('operations.continue.title');
31143       operation.behavior = behaviorOperation(context).which(operation);
31144
31145       return operation;
31146   }
31147
31148   function operationDelete(selectedIDs, context) {
31149       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
31150           action = actionDeleteMultiple(selectedIDs),
31151           extent = selectedIDs.reduce(function(extent, id) {
31152                   return extent.extend(context.entity(id).extent(context.graph()));
31153               }, geoExtent$$1());
31154
31155
31156       var operation = function() {
31157           var nextSelectedID;
31158           var nextSelectedLoc;
31159
31160           if (selectedIDs.length === 1) {
31161               var id = selectedIDs[0],
31162                   entity = context.entity(id),
31163                   geometry = context.geometry(id),
31164                   parents = context.graph().parentWays(entity),
31165                   parent = parents[0];
31166
31167               // Select the next closest node in the way.
31168               if (geometry === 'vertex') {
31169                   var nodes = parent.nodes,
31170                       i = nodes.indexOf(id);
31171
31172                   if (i === 0) {
31173                       i++;
31174                   } else if (i === nodes.length - 1) {
31175                       i--;
31176                   } else {
31177                       var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc),
31178                           b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
31179                       i = a < b ? i - 1 : i + 1;
31180                   }
31181
31182                   nextSelectedID = nodes[i];
31183                   nextSelectedLoc = context.entity(nextSelectedID).loc;
31184               }
31185           }
31186
31187           context.perform(action, operation.annotation());
31188
31189           if (nextSelectedID && nextSelectedLoc) {
31190               if (context.hasEntity(nextSelectedID)) {
31191                   context.enter(modeSelect(context, [nextSelectedID]).follow(true));
31192               } else {
31193                   context.map().centerEase(nextSelectedLoc);
31194                   context.enter(modeBrowse(context));
31195               }
31196           } else {
31197               context.enter(modeBrowse(context));
31198           }
31199
31200       };
31201
31202
31203       operation.available = function() {
31204           return true;
31205       };
31206
31207
31208       operation.disabled = function() {
31209           var reason;
31210           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
31211               reason = 'too_large';
31212           } else if (some(selectedIDs, context.hasHiddenConnections)) {
31213               reason = 'connected_to_hidden';
31214           } else if (some(selectedIDs, protectedMember)) {
31215               reason = 'part_of_relation';
31216           } else if (some(selectedIDs, incompleteRelation)) {
31217               reason = 'incomplete_relation';
31218           }
31219           return reason;
31220
31221           function incompleteRelation(id) {
31222               var entity = context.entity(id);
31223               return entity.type === 'relation' && !entity.isComplete(context.graph());
31224           }
31225
31226           function protectedMember(id) {
31227               var entity = context.entity(id);
31228               if (entity.type !== 'way') return false;
31229
31230               var parents = context.graph().parentRelations(entity);
31231               for (var i = 0; i < parents.length; i++) {
31232                   var parent = parents[i],
31233                       type = parent.tags.type,
31234                       role = parent.memberById(id).role || 'outer';
31235                   if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) {
31236                       return true;
31237                   }
31238               }
31239               return false;
31240           }
31241
31242       };
31243
31244
31245       operation.tooltip = function() {
31246           var disable = operation.disabled();
31247           return disable ?
31248               t('operations.delete.' + disable + '.' + multi) :
31249               t('operations.delete.description' + '.' + multi);
31250       };
31251
31252
31253       operation.annotation = function() {
31254           return selectedIDs.length === 1 ?
31255               t('operations.delete.annotation.' + context.geometry(selectedIDs[0])) :
31256               t('operations.delete.annotation.multiple', { n: selectedIDs.length });
31257       };
31258
31259
31260       operation.id = 'delete';
31261       operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
31262       operation.title = t('operations.delete.title');
31263       operation.behavior = behaviorOperation(context).which(operation);
31264
31265       return operation;
31266   }
31267
31268   function operationDisconnect(selectedIDs, context) {
31269       var vertices = filter(selectedIDs, function(entityId) {
31270           return context.geometry(entityId) === 'vertex';
31271       });
31272
31273       var entityId = vertices[0],
31274           action = actionDisconnect(entityId);
31275
31276       if (selectedIDs.length > 1) {
31277           action.limitWays(without(selectedIDs, entityId));
31278       }
31279
31280
31281       var operation = function() {
31282           context.perform(action, operation.annotation());
31283       };
31284
31285
31286       operation.available = function() {
31287           return vertices.length === 1;
31288       };
31289
31290
31291       operation.disabled = function() {
31292           var reason;
31293           if (some(selectedIDs, context.hasHiddenConnections)) {
31294               reason = 'connected_to_hidden';
31295           }
31296           return action.disabled(context.graph()) || reason;
31297       };
31298
31299
31300       operation.tooltip = function() {
31301           var disable = operation.disabled();
31302           return disable ?
31303               t('operations.disconnect.' + disable) :
31304               t('operations.disconnect.description');
31305       };
31306
31307
31308       operation.annotation = function() {
31309           return t('operations.disconnect.annotation');
31310       };
31311
31312
31313       operation.id = 'disconnect';
31314       operation.keys = [t('operations.disconnect.key')];
31315       operation.title = t('operations.disconnect.title');
31316       operation.behavior = behaviorOperation(context).which(operation);
31317
31318       return operation;
31319   }
31320
31321   function operationMerge(selectedIDs, context) {
31322
31323       function updatePresetTags(newGraph, ids) {
31324           var id = ids[0],
31325               newEntity = newGraph.hasEntity(id);
31326
31327           if (!newEntity) return;
31328
31329           var newPreset = context.presets().match(newEntity, newGraph);
31330
31331           context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
31332       }
31333
31334
31335       var join = actionJoin(selectedIDs),
31336           merge = actionMerge(selectedIDs),
31337           mergePolygon = actionMergePolygon(selectedIDs);
31338
31339
31340       var operation = function() {
31341           var origGraph = context.graph(),
31342               action;
31343
31344           if (!join.disabled(origGraph)) {
31345               action = join;
31346           } else if (!merge.disabled(origGraph)) {
31347               action = merge;
31348           } else {
31349               action = mergePolygon;
31350           }
31351
31352           context.perform(action, operation.annotation());
31353
31354           var ids = selectedIDs.filter(function(id) {
31355               var entity = context.hasEntity(id);
31356               return entity && entity.type !== 'node';
31357           });
31358
31359           // if we merged tags, rematch preset to update tags if necessary (#3851)
31360           if (action === merge) {
31361               updatePresetTags(context.graph(), ids);
31362           }
31363
31364           context.enter(modeSelect(context, ids));
31365       };
31366
31367
31368       operation.available = function() {
31369           return selectedIDs.length >= 2;
31370       };
31371
31372
31373       operation.disabled = function() {
31374           return join.disabled(context.graph()) &&
31375               merge.disabled(context.graph()) &&
31376               mergePolygon.disabled(context.graph());
31377       };
31378
31379
31380       operation.tooltip = function() {
31381           var j = join.disabled(context.graph()),
31382               m = merge.disabled(context.graph()),
31383               p = mergePolygon.disabled(context.graph());
31384
31385           if (j === 'restriction' && m && p) {
31386               return t('operations.merge.restriction',
31387                   { relation: context.presets().item('type/restriction').name() });
31388           }
31389
31390           if (p === 'incomplete_relation' && j && m) {
31391               return t('operations.merge.incomplete_relation');
31392           }
31393
31394           if (j && m && p) {
31395               return t('operations.merge.' + j);
31396           }
31397
31398           return t('operations.merge.description');
31399       };
31400
31401
31402       operation.annotation = function() {
31403           return t('operations.merge.annotation', { n: selectedIDs.length });
31404       };
31405
31406
31407       operation.id = 'merge';
31408       operation.keys = [t('operations.merge.key')];
31409       operation.title = t('operations.merge.title');
31410       operation.behavior = behaviorOperation(context).which(operation);
31411
31412       return operation;
31413   }
31414
31415   function operationMove(selectedIDs, context) {
31416       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
31417       var extent = selectedIDs.reduce(function(extent, id) {
31418           return extent.extend(context.entity(id).extent(context.graph()));
31419       }, geoExtent$$1());
31420
31421
31422       var operation = function() {
31423           context.enter(modeMove$$1(context, selectedIDs));
31424       };
31425
31426
31427       operation.available = function() {
31428           return selectedIDs.length > 1 ||
31429               context.entity(selectedIDs[0]).type !== 'node';
31430       };
31431
31432
31433       operation.disabled = function() {
31434           var reason;
31435           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
31436               reason = 'too_large';
31437           } else if (some(selectedIDs, context.hasHiddenConnections)) {
31438               reason = 'connected_to_hidden';
31439           } else if (some(selectedIDs, incompleteRelation)) {
31440               reason = 'incomplete_relation';
31441           }
31442           return reason;
31443
31444           function incompleteRelation(id) {
31445               var entity = context.entity(id);
31446               return entity.type === 'relation' && !entity.isComplete(context.graph());
31447           }
31448       };
31449
31450
31451       operation.tooltip = function() {
31452           var disable = operation.disabled();
31453           return disable ?
31454               t('operations.move.' + disable + '.' + multi) :
31455               t('operations.move.description.' + multi);
31456       };
31457
31458
31459       operation.annotation = function() {
31460           return selectedIDs.length === 1 ?
31461               t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
31462               t('operations.move.annotation.multiple');
31463       };
31464
31465
31466       operation.id = 'move';
31467       operation.keys = [t('operations.move.key')];
31468       operation.title = t('operations.move.title');
31469       operation.behavior = behaviorOperation(context).which(operation);
31470
31471       return operation;
31472   }
31473
31474   function operationOrthogonalize(selectedIDs, context) {
31475       var entityId = selectedIDs[0],
31476           entity = context.entity(entityId),
31477           extent = entity.extent(context.graph()),
31478           geometry = context.geometry(entityId),
31479           action = actionOrthogonalize(entityId, context.projection);
31480
31481
31482       var operation = function() {
31483           context.perform(action, operation.annotation());
31484       };
31485
31486
31487       operation.available = function() {
31488           return selectedIDs.length === 1 &&
31489               entity.type === 'way' &&
31490               entity.isClosed() &&
31491               uniq(entity.nodes).length > 2;
31492       };
31493
31494
31495       operation.disabled = function() {
31496           var reason;
31497           if (extent.percentContainedIn(context.extent()) < 0.8) {
31498               reason = 'too_large';
31499           } else if (context.hasHiddenConnections(entityId)) {
31500               reason = 'connected_to_hidden';
31501           }
31502           return action.disabled(context.graph()) || reason;
31503       };
31504
31505
31506       operation.tooltip = function() {
31507           var disable = operation.disabled();
31508           return disable ?
31509               t('operations.orthogonalize.' + disable) :
31510               t('operations.orthogonalize.description.' + geometry);
31511       };
31512
31513
31514       operation.annotation = function() {
31515           return t('operations.orthogonalize.annotation.' + geometry);
31516       };
31517
31518
31519       operation.id = 'orthogonalize';
31520       operation.keys = [t('operations.orthogonalize.key')];
31521       operation.title = t('operations.orthogonalize.title');
31522       operation.behavior = behaviorOperation(context).which(operation);
31523
31524       return operation;
31525   }
31526
31527   /**
31528    * This method is like `_.uniq` except that it accepts `iteratee` which is
31529    * invoked for each element in `array` to generate the criterion by which
31530    * uniqueness is computed. The order of result values is determined by the
31531    * order they occur in the array. The iteratee is invoked with one argument:
31532    * (value).
31533    *
31534    * @static
31535    * @memberOf _
31536    * @since 4.0.0
31537    * @category Array
31538    * @param {Array} array The array to inspect.
31539    * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
31540    * @returns {Array} Returns the new duplicate free array.
31541    * @example
31542    *
31543    * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
31544    * // => [2.1, 1.2]
31545    *
31546    * // The `_.property` iteratee shorthand.
31547    * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
31548    * // => [{ 'x': 1 }, { 'x': 2 }]
31549    */
31550   function uniqBy(array, iteratee) {
31551     return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];
31552   }
31553
31554   function operationReflectShort(selectedIDs, context) {
31555       return operationReflect(selectedIDs, context, 'short');
31556   }
31557
31558
31559   function operationReflectLong(selectedIDs, context) {
31560       return operationReflect(selectedIDs, context, 'long');
31561   }
31562
31563
31564   function operationReflect(selectedIDs, context, axis) {
31565       axis = axis || 'long';
31566       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
31567           extent = selectedIDs.reduce(function(extent, id) {
31568               return extent.extend(context.entity(id).extent(context.graph()));
31569           }, geoExtent$$1());
31570
31571
31572       var operation = function() {
31573           var action = actionReflect(selectedIDs, context.projection)
31574               .useLongAxis(Boolean(axis === 'long'));
31575           context.perform(action, operation.annotation());
31576       };
31577
31578
31579       operation.available = function() {
31580           var nodes = utilGetAllNodes(selectedIDs, context.graph());
31581           return uniqBy(nodes, function(n) { return n.loc; }).length >= 3;
31582       };
31583
31584
31585       operation.disabled = function() {
31586           var reason;
31587           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
31588               reason = 'too_large';
31589           } else if (some(selectedIDs, context.hasHiddenConnections)) {
31590               reason = 'connected_to_hidden';
31591           } else if (some(selectedIDs, incompleteRelation)) {
31592               reason = 'incomplete_relation';
31593           }
31594           return reason;
31595
31596           function incompleteRelation(id) {
31597               var entity = context.entity(id);
31598               return entity.type === 'relation' && !entity.isComplete(context.graph());
31599           }
31600       };
31601
31602
31603       operation.tooltip = function() {
31604           var disable = operation.disabled();
31605           return disable ?
31606               t('operations.reflect.' + disable + '.' + multi) :
31607               t('operations.reflect.description.' + axis + '.' + multi);
31608       };
31609
31610
31611       operation.annotation = function() {
31612           return t('operations.reflect.annotation.' + axis + '.' + multi);
31613       };
31614
31615
31616       operation.id = 'reflect-' + axis;
31617       operation.keys = [t('operations.reflect.key.' + axis)];
31618       operation.title = t('operations.reflect.title.' + axis);
31619       operation.behavior = behaviorOperation(context).which(operation);
31620
31621       return operation;
31622   }
31623
31624   function operationReverse(selectedIDs, context) {
31625       var entityId = selectedIDs[0];
31626
31627       var operation = function() {
31628           context.perform(actionReverse(entityId), operation.annotation());
31629       };
31630
31631
31632       operation.available = function() {
31633           return selectedIDs.length === 1 && context.geometry(entityId) === 'line';
31634       };
31635
31636
31637       operation.disabled = function() {
31638           return false;
31639       };
31640
31641
31642       operation.tooltip = function() {
31643           return t('operations.reverse.description');
31644       };
31645
31646
31647       operation.annotation = function() {
31648           return t('operations.reverse.annotation');
31649       };
31650
31651
31652       operation.id = 'reverse';
31653       operation.keys = [t('operations.reverse.key')];
31654       operation.title = t('operations.reverse.title');
31655       operation.behavior = behaviorOperation(context).which(operation);
31656
31657       return operation;
31658   }
31659
31660   function operationRotate(selectedIDs, context) {
31661       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
31662           extent = selectedIDs.reduce(function(extent, id) {
31663               return extent.extend(context.entity(id).extent(context.graph()));
31664           }, geoExtent$$1());
31665
31666
31667       var operation = function() {
31668           context.enter(modeRotate$$1(context, selectedIDs));
31669       };
31670
31671
31672       operation.available = function() {
31673           var nodes = utilGetAllNodes(selectedIDs, context.graph());
31674           return uniqBy(nodes, function(n) { return n.loc; }).length >= 2;
31675       };
31676
31677
31678       operation.disabled = function() {
31679           var reason;
31680           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
31681               reason = 'too_large';
31682           } else if (some(selectedIDs, context.hasHiddenConnections)) {
31683               reason = 'connected_to_hidden';
31684           } else if (some(selectedIDs, incompleteRelation)) {
31685               reason = 'incomplete_relation';
31686           }
31687           return reason;
31688
31689           function incompleteRelation(id) {
31690               var entity = context.entity(id);
31691               return entity.type === 'relation' && !entity.isComplete(context.graph());
31692           }
31693       };
31694
31695
31696       operation.tooltip = function() {
31697           var disable = operation.disabled();
31698           return disable ?
31699               t('operations.rotate.' + disable + '.' + multi) :
31700               t('operations.rotate.description.' + multi);
31701       };
31702
31703
31704       operation.annotation = function() {
31705           return selectedIDs.length === 1 ?
31706               t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
31707               t('operations.rotate.annotation.multiple');
31708       };
31709
31710
31711       operation.id = 'rotate';
31712       operation.keys = [t('operations.rotate.key')];
31713       operation.title = t('operations.rotate.title');
31714       operation.behavior = behaviorOperation(context).which(operation);
31715
31716       return operation;
31717   }
31718
31719   function operationSplit(selectedIDs, context) {
31720       var vertices = filter(selectedIDs, function(entityId) {
31721           return context.geometry(entityId) === 'vertex';
31722       });
31723
31724       var entityId = vertices[0],
31725           action = actionSplit(entityId),
31726           ways = [];
31727
31728       if (vertices.length === 1) {
31729           if (selectedIDs.length > 1) {
31730               action.limitWays(without(selectedIDs, entityId));
31731           }
31732           ways = action.ways(context.graph());
31733       }
31734
31735
31736       var operation = function() {
31737           var difference = context.perform(action, operation.annotation());
31738           context.enter(modeSelect(context, difference.extantIDs()));
31739       };
31740
31741
31742       operation.available = function() {
31743           return vertices.length === 1;
31744       };
31745
31746
31747       operation.disabled = function() {
31748           var reason;
31749           if (some(selectedIDs, context.hasHiddenConnections)) {
31750               reason = 'connected_to_hidden';
31751           }
31752           return action.disabled(context.graph()) || reason;
31753       };
31754
31755
31756       operation.tooltip = function() {
31757           var disable = operation.disabled();
31758           if (disable) {
31759               return t('operations.split.' + disable);
31760           }
31761           if (ways.length === 1) {
31762               return t('operations.split.description.' + context.geometry(ways[0].id));
31763           } else {
31764               return t('operations.split.description.multiple');
31765           }
31766       };
31767
31768
31769       operation.annotation = function() {
31770           return ways.length === 1 ?
31771               t('operations.split.annotation.' + context.geometry(ways[0].id)) :
31772               t('operations.split.annotation.multiple', { n: ways.length });
31773       };
31774
31775
31776       operation.id = 'split';
31777       operation.keys = [t('operations.split.key')];
31778       operation.title = t('operations.split.title');
31779       operation.behavior = behaviorOperation(context).which(operation);
31780
31781       return operation;
31782   }
31783
31784   function operationStraighten(selectedIDs, context) {
31785       var entityId = selectedIDs[0],
31786           action = actionStraighten(entityId, context.projection);
31787
31788
31789       function operation() {
31790           context.perform(action, operation.annotation());
31791       }
31792
31793
31794       operation.available = function() {
31795           var entity = context.entity(entityId);
31796           return selectedIDs.length === 1 &&
31797               entity.type === 'way' &&
31798               !entity.isClosed() &&
31799               uniq(entity.nodes).length > 2;
31800       };
31801
31802
31803       operation.disabled = function() {
31804           var reason;
31805           if (context.hasHiddenConnections(entityId)) {
31806               reason = 'connected_to_hidden';
31807           }
31808           return action.disabled(context.graph()) || reason;
31809       };
31810
31811
31812       operation.tooltip = function() {
31813           var disable = operation.disabled();
31814           return disable ?
31815               t('operations.straighten.' + disable) :
31816               t('operations.straighten.description');
31817       };
31818
31819
31820       operation.annotation = function() {
31821           return t('operations.straighten.annotation');
31822       };
31823
31824
31825       operation.id = 'straighten';
31826       operation.keys = [t('operations.straighten.key')];
31827       operation.title = t('operations.straighten.title');
31828       operation.behavior = behaviorOperation(context).which(operation);
31829
31830       return operation;
31831   }
31832
31833
31834
31835   var Operations = /*#__PURE__*/Object.freeze({
31836     operationCircularize: operationCircularize,
31837     operationContinue: operationContinue,
31838     operationDelete: operationDelete,
31839     operationDisconnect: operationDisconnect,
31840     operationMerge: operationMerge,
31841     operationMove: operationMove,
31842     operationOrthogonalize: operationOrthogonalize,
31843     operationReflectShort: operationReflectShort,
31844     operationReflectLong: operationReflectLong,
31845     operationReverse: operationReverse,
31846     operationRotate: operationRotate,
31847     operationSplit: operationSplit,
31848     operationStraighten: operationStraighten
31849   });
31850
31851   function modeMove$$1(context, entityIDs, baseGraph) {
31852       var mode = {
31853           id: 'move',
31854           button: 'browse'
31855       };
31856
31857       var keybinding = d3keybinding('move');
31858       var behaviors = [
31859           behaviorEdit(context),
31860           operationCircularize(entityIDs, context).behavior,
31861           operationDelete(entityIDs, context).behavior,
31862           operationOrthogonalize(entityIDs, context).behavior,
31863           operationReflectLong(entityIDs, context).behavior,
31864           operationReflectShort(entityIDs, context).behavior,
31865           operationRotate(entityIDs, context).behavior
31866       ];
31867       var annotation = entityIDs.length === 1 ?
31868           t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
31869           t('operations.move.annotation.multiple');
31870
31871       var _prevGraph;
31872       var _cache;
31873       var _origin;
31874       var _nudgeInterval;
31875
31876
31877       function doMove(nudge) {
31878           nudge = nudge || [0, 0];
31879
31880           var fn;
31881           if (_prevGraph !== context.graph()) {
31882               _cache = {};
31883               _origin = context.map().mouseCoordinates();
31884               fn = context.perform;
31885           } else {
31886               fn = context.overwrite;
31887           }
31888
31889           var currMouse = context.mouse();
31890           var origMouse = context.projection(_origin);
31891           var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
31892
31893           fn(actionMove(entityIDs, delta, context.projection, _cache), annotation);
31894           _prevGraph = context.graph();
31895       }
31896
31897
31898       function startNudge(nudge) {
31899           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
31900           _nudgeInterval = window.setInterval(function() {
31901               context.pan(nudge);
31902               doMove(nudge);
31903           }, 50);
31904       }
31905
31906
31907       function stopNudge() {
31908           if (_nudgeInterval) {
31909               window.clearInterval(_nudgeInterval);
31910               _nudgeInterval = null;
31911           }
31912       }
31913
31914
31915       function move() {
31916           doMove();
31917           var nudge = geoViewportEdge(context.mouse(), context.map().dimensions());
31918           if (nudge) {
31919               startNudge(nudge);
31920           } else {
31921               stopNudge();
31922           }
31923       }
31924
31925
31926       function finish() {
31927           event.stopPropagation();
31928           context.enter(modeSelect(context, entityIDs));
31929           stopNudge();
31930       }
31931
31932
31933       function cancel() {
31934           if (baseGraph) {
31935               while (context.graph() !== baseGraph) context.pop();
31936               context.enter(modeBrowse(context));
31937           } else {
31938               context.pop();
31939               context.enter(modeSelect(context, entityIDs));
31940           }
31941           stopNudge();
31942       }
31943
31944
31945       function undone() {
31946           context.enter(modeBrowse(context));
31947       }
31948
31949
31950       mode.enter = function() {
31951           _origin = context.map().mouseCoordinates();
31952           _prevGraph = null;
31953           _cache = {};
31954
31955           behaviors.forEach(function(behavior) {
31956               context.install(behavior);
31957           });
31958
31959           context.surface()
31960               .on('mousemove.move', move)
31961               .on('click.move', finish);
31962
31963           context.history()
31964               .on('undone.move', undone);
31965
31966           keybinding
31967               .on('⎋', cancel)
31968               .on('↩', finish);
31969
31970           d3_select(document)
31971               .call(keybinding);
31972       };
31973
31974
31975       mode.exit = function() {
31976           stopNudge();
31977
31978           behaviors.forEach(function(behavior) {
31979               context.uninstall(behavior);
31980           });
31981
31982           context.surface()
31983               .on('mousemove.move', null)
31984               .on('click.move', null);
31985
31986           context.history()
31987               .on('undone.move', null);
31988
31989           keybinding.off();
31990       };
31991
31992
31993       mode.selectedIDs = function() {
31994           if (!arguments.length) return entityIDs;
31995           // no assign
31996           return mode;
31997       };
31998
31999
32000       return mode;
32001   }
32002
32003   function modeRotate$$1(context, entityIDs) {
32004       var mode = {
32005           id: 'rotate',
32006           button: 'browse'
32007       };
32008
32009       var keybinding = d3keybinding('rotate');
32010       var behaviors = [
32011           behaviorEdit(context),
32012           operationCircularize(entityIDs, context).behavior,
32013           operationDelete(entityIDs, context).behavior,
32014           operationMove(entityIDs, context).behavior,
32015           operationOrthogonalize(entityIDs, context).behavior,
32016           operationReflectLong(entityIDs, context).behavior,
32017           operationReflectShort(entityIDs, context).behavior
32018       ];
32019       var annotation = entityIDs.length === 1 ?
32020           t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
32021           t('operations.rotate.annotation.multiple');
32022
32023       var _prevGraph;
32024       var _prevAngle;
32025       var _prevTransform;
32026       var _pivot;
32027
32028
32029       function doRotate() {
32030           var fn;
32031           if (context.graph() !== _prevGraph) {
32032               fn = context.perform;
32033           } else {
32034               fn = context.replace;
32035           }
32036
32037           // projection changed, recalculate _pivot
32038           var projection = context.projection;
32039           var currTransform = projection.transform();
32040           if (!_prevTransform ||
32041               currTransform.k !== _prevTransform.k ||
32042               currTransform.x !== _prevTransform.x ||
32043               currTransform.y !== _prevTransform.y) {
32044
32045               var nodes = utilGetAllNodes(entityIDs, context.graph());
32046               var points = nodes.map(function(n) { return projection(n.loc); });
32047
32048               if (points.length === 1) {  // degenerate case
32049                   _pivot = points[0];
32050               } else if (points.length === 2) {
32051                   _pivot = geoVecInterp(points[0], points[1], 0.5);
32052               } else {
32053                   _pivot = d3_polygonCentroid(d3_polygonHull(points));
32054               }
32055               _prevAngle = undefined;
32056           }
32057
32058
32059           var currMouse = context.mouse();
32060           var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
32061
32062           if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
32063           var delta = currAngle - _prevAngle;
32064
32065           fn(actionRotate(entityIDs, _pivot, delta, projection), annotation);
32066
32067           _prevTransform = currTransform;
32068           _prevAngle = currAngle;
32069           _prevGraph = context.graph();
32070       }
32071
32072
32073       function finish() {
32074           event.stopPropagation();
32075           context.enter(modeSelect(context, entityIDs));
32076       }
32077
32078
32079       function cancel() {
32080           context.pop();
32081           context.enter(modeSelect(context, entityIDs));
32082       }
32083
32084
32085       function undone() {
32086           context.enter(modeBrowse(context));
32087       }
32088
32089
32090       mode.enter = function() {
32091           behaviors.forEach(function(behavior) {
32092               context.install(behavior);
32093           });
32094
32095           context.surface()
32096               .on('mousemove.rotate', doRotate)
32097               .on('click.rotate', finish);
32098
32099           context.history()
32100               .on('undone.rotate', undone);
32101
32102           keybinding
32103               .on('⎋', cancel)
32104               .on('↩', finish);
32105
32106           d3_select(document)
32107               .call(keybinding);
32108       };
32109
32110
32111       mode.exit = function() {
32112           behaviors.forEach(function(behavior) {
32113               context.uninstall(behavior);
32114           });
32115
32116           context.surface()
32117               .on('mousemove.rotate', null)
32118               .on('click.rotate', null);
32119
32120           context.history()
32121               .on('undone.rotate', null);
32122
32123           keybinding.off();
32124       };
32125
32126
32127       mode.selectedIDs = function() {
32128           if (!arguments.length) return entityIDs;
32129           // no assign
32130           return mode;
32131       };
32132
32133
32134       return mode;
32135   }
32136
32137   /**
32138    * A specialized version of `_.reduce` for arrays without support for
32139    * iteratee shorthands.
32140    *
32141    * @private
32142    * @param {Array} [array] The array to iterate over.
32143    * @param {Function} iteratee The function invoked per iteration.
32144    * @param {*} [accumulator] The initial value.
32145    * @param {boolean} [initAccum] Specify using the first element of `array` as
32146    *  the initial value.
32147    * @returns {*} Returns the accumulated value.
32148    */
32149   function arrayReduce(array, iteratee, accumulator, initAccum) {
32150     var index = -1,
32151         length = array == null ? 0 : array.length;
32152
32153     if (initAccum && length) {
32154       accumulator = array[++index];
32155     }
32156     while (++index < length) {
32157       accumulator = iteratee(accumulator, array[index], index, array);
32158     }
32159     return accumulator;
32160   }
32161
32162   /**
32163    * The base implementation of `_.reduce` and `_.reduceRight`, without support
32164    * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
32165    *
32166    * @private
32167    * @param {Array|Object} collection The collection to iterate over.
32168    * @param {Function} iteratee The function invoked per iteration.
32169    * @param {*} accumulator The initial value.
32170    * @param {boolean} initAccum Specify using the first or last element of
32171    *  `collection` as the initial value.
32172    * @param {Function} eachFunc The function to iterate over `collection`.
32173    * @returns {*} Returns the accumulated value.
32174    */
32175   function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
32176     eachFunc(collection, function(value, index, collection) {
32177       accumulator = initAccum
32178         ? (initAccum = false, value)
32179         : iteratee(accumulator, value, index, collection);
32180     });
32181     return accumulator;
32182   }
32183
32184   /**
32185    * Reduces `collection` to a value which is the accumulated result of running
32186    * each element in `collection` thru `iteratee`, where each successive
32187    * invocation is supplied the return value of the previous. If `accumulator`
32188    * is not given, the first element of `collection` is used as the initial
32189    * value. The iteratee is invoked with four arguments:
32190    * (accumulator, value, index|key, collection).
32191    *
32192    * Many lodash methods are guarded to work as iteratees for methods like
32193    * `_.reduce`, `_.reduceRight`, and `_.transform`.
32194    *
32195    * The guarded methods are:
32196    * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
32197    * and `sortBy`
32198    *
32199    * @static
32200    * @memberOf _
32201    * @since 0.1.0
32202    * @category Collection
32203    * @param {Array|Object} collection The collection to iterate over.
32204    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
32205    * @param {*} [accumulator] The initial value.
32206    * @returns {*} Returns the accumulated value.
32207    * @see _.reduceRight
32208    * @example
32209    *
32210    * _.reduce([1, 2], function(sum, n) {
32211    *   return sum + n;
32212    * }, 0);
32213    * // => 3
32214    *
32215    * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
32216    *   (result[value] || (result[value] = [])).push(key);
32217    *   return result;
32218    * }, {});
32219    * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
32220    */
32221   function reduce(collection, iteratee, accumulator) {
32222     var func = isArray(collection) ? arrayReduce : baseReduce,
32223         initAccum = arguments.length < 3;
32224
32225     return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);
32226   }
32227
32228   function d3geoTile() {
32229     var size = [960, 500],
32230         scale = 256,
32231         scaleExtent = [0, 20],
32232         translate = [size[0] / 2, size[1] / 2],
32233         zoomDelta = 0;
32234
32235     function bound(_) {
32236         return Math.min(scaleExtent[1], Math.max(scaleExtent[0], _));
32237     }
32238
32239     function tile() {
32240       var z = Math.max(Math.log(scale) / Math.LN2 - 8, 0),
32241           z0 = bound(Math.round(z + zoomDelta)),
32242           k = Math.pow(2, z - z0 + 8),
32243           origin = [(translate[0] - scale / 2) / k, (translate[1] - scale / 2) / k],
32244           tiles = [],
32245           cols = d3_range(Math.max(0, Math.floor(-origin[0])), Math.max(0, Math.ceil(size[0] / k - origin[0]))),
32246           rows = d3_range(Math.max(0, Math.floor(-origin[1])), Math.max(0, Math.ceil(size[1] / k - origin[1])));
32247
32248       rows.forEach(function(y) {
32249         cols.forEach(function(x) {
32250           tiles.push([x, y, z0]);
32251         });
32252       });
32253
32254       tiles.translate = origin;
32255       tiles.scale = k;
32256
32257       return tiles;
32258     }
32259
32260     tile.scaleExtent = function(_) {
32261       if (!arguments.length) return scaleExtent;
32262       scaleExtent = _;
32263       return tile;
32264     };
32265
32266     tile.size = function(_) {
32267       if (!arguments.length) return size;
32268       size = _;
32269       return tile;
32270     };
32271
32272     tile.scale = function(_) {
32273       if (!arguments.length) return scale;
32274       scale = _;
32275       return tile;
32276     };
32277
32278     tile.translate = function(_) {
32279       if (!arguments.length) return translate;
32280       translate = _;
32281       return tile;
32282     };
32283
32284     tile.zoomDelta = function(_) {
32285       if (!arguments.length) return zoomDelta;
32286       zoomDelta = +_;
32287       return tile;
32288     };
32289
32290     return tile;
32291   }
32292
32293   /* global Mapillary:false */
32294
32295
32296   var apibase = 'https://a.mapillary.com/v3/',
32297       viewercss = 'mapillary-js/mapillary.min.css',
32298       viewerjs = 'mapillary-js/mapillary.min.js',
32299       clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi',
32300       maxResults = 1000,
32301       tileZoom = 14,
32302       dispatch$1 = dispatch('loadedImages', 'loadedSigns'),
32303       _mlyFallback = false,
32304       _mlyCache,
32305       _mlyClicks,
32306       _mlySelectedImage,
32307       _mlySignDefs,
32308       _mlySignSprite,
32309       _mlyViewer;
32310
32311
32312   function abortRequest(i) {
32313       i.abort();
32314   }
32315
32316
32317   function nearNullIsland(x, y, z) {
32318       if (z >= 7) {
32319           var center = Math.pow(2, z - 1),
32320               width = Math.pow(2, z - 6),
32321               min$$1 = center - (width / 2),
32322               max$$1 = center + (width / 2) - 1;
32323           return x >= min$$1 && x <= max$$1 && y >= min$$1 && y <= max$$1;
32324       }
32325       return false;
32326   }
32327
32328
32329   function maxPageAtZoom(z) {
32330       if (z < 15)   return 2;
32331       if (z === 15) return 5;
32332       if (z === 16) return 10;
32333       if (z === 17) return 20;
32334       if (z === 18) return 40;
32335       if (z > 18)   return 80;
32336   }
32337
32338
32339   function localeTimestamp(s) {
32340       if (!s) return null;
32341       var detected = utilDetect();
32342       var options = {
32343           day: 'numeric', month: 'short', year: 'numeric',
32344           hour: 'numeric', minute: 'numeric', second: 'numeric',
32345           timeZone: 'UTC'
32346       };
32347       var d = new Date(s);
32348       if (isNaN(d.getTime())) return null;
32349       return d.toLocaleString(detected.locale, options);
32350   }
32351
32352
32353   function getTiles(projection) {
32354       var s = projection.scale() * 2 * Math.PI,
32355           z = Math.max(Math.log(s) / Math.log(2) - 8, 0),
32356           ts = 256 * Math.pow(2, z - tileZoom),
32357           origin = [
32358               s / 2 - projection.translate()[0],
32359               s / 2 - projection.translate()[1]];
32360
32361       return d3geoTile()
32362           .scaleExtent([tileZoom, tileZoom])
32363           .scale(s)
32364           .size(projection.clipExtent()[1])
32365           .translate(projection.translate())()
32366           .map(function(tile) {
32367               var x = tile[0] * ts - origin[0],
32368                   y = tile[1] * ts - origin[1];
32369
32370               return {
32371                   id: tile.toString(),
32372                   xyz: tile,
32373                   extent: geoExtent$$1(
32374                       projection.invert([x, y + ts]),
32375                       projection.invert([x + ts, y])
32376                   )
32377               };
32378           });
32379   }
32380
32381
32382   function loadTiles(which, url, projection) {
32383       var s = projection.scale() * 2 * Math.PI,
32384           currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0));
32385
32386       var tiles = getTiles(projection).filter(function(t) {
32387               return !nearNullIsland(t.xyz[0], t.xyz[1], t.xyz[2]);
32388           });
32389
32390       filter(which.inflight, function(v, k) {
32391           var wanted = find$1(tiles, function(tile) { return k === (tile.id + ',0'); });
32392           if (!wanted) delete which.inflight[k];
32393           return !wanted;
32394       }).map(abortRequest);
32395
32396       tiles.forEach(function(tile) {
32397           loadNextTilePage(which, currZoom, url, tile);
32398       });
32399   }
32400
32401
32402   function loadNextTilePage(which, currZoom, url, tile) {
32403       var cache = _mlyCache[which],
32404           rect = tile.extent.rectangle(),
32405           maxPages = maxPageAtZoom(currZoom),
32406           nextPage = cache.nextPage[tile.id] || 0,
32407           nextURL = cache.nextURL[tile.id] || url +
32408               utilQsString({
32409                   per_page: maxResults,
32410                   page: nextPage,
32411                   client_id: clientId,
32412                   bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
32413               });
32414
32415       if (nextPage > maxPages) return;
32416
32417       var id = tile.id + ',' + String(nextPage);
32418       if (cache.loaded[id] || cache.inflight[id]) return;
32419       cache.inflight[id] = d3_request(nextURL)
32420           .mimeType('application/json')
32421           .response(function(xhr) {
32422               var linkHeader = xhr.getResponseHeader('Link');
32423               if (linkHeader) {
32424                   var pagination = parsePagination(xhr.getResponseHeader('Link'));
32425                   if (pagination.next) {
32426                       cache.nextURL[tile.id] = pagination.next;
32427                   }
32428               }
32429               return JSON.parse(xhr.responseText);
32430           })
32431           .get(function(err, data) {
32432               cache.loaded[id] = true;
32433               delete cache.inflight[id];
32434               if (err || !data.features || !data.features.length) return;
32435
32436               var features = data.features.map(function(feature) {
32437                   var loc = feature.geometry.coordinates,
32438                       d;
32439
32440                   if (which === 'images') {
32441                       d = {
32442                           loc: loc,
32443                           key: feature.properties.key,
32444                           ca: feature.properties.ca,
32445                           captured_at: feature.properties.captured_at,
32446                           captured_by: feature.properties.username,
32447                           pano: feature.properties.pano
32448                       };
32449                       cache.forImageKey[d.key] = d;     // cache imageKey -> image
32450
32451                   } else if (which === 'sequences') {
32452                       var sequenceKey = feature.properties.key;
32453                       cache.lineString[sequenceKey] = feature;           // cache sequenceKey -> lineString
32454                       feature.properties.coordinateProperties.image_keys.forEach(function(imageKey) {
32455                           cache.forImageKey[imageKey] = sequenceKey;     // cache imageKey -> sequenceKey
32456                       });
32457                       return false;  // because no `d` data worth loading into an rbush
32458
32459                   } else if (which === 'objects') {
32460                       d = {
32461                           loc: loc,
32462                           key: feature.properties.key,
32463                           value: feature.properties.value,
32464                           package: feature.properties.package,
32465                           detections: feature.properties.detections
32466                       };
32467
32468                       // cache imageKey -> detectionKey
32469                       feature.properties.detections.forEach(function(detection) {
32470                           var imageKey = detection.image_key;
32471                           var detectionKey = detection.detection_key;
32472                           if (!_mlyCache.detections[imageKey]) {
32473                               _mlyCache.detections[imageKey] = {};
32474                           }
32475                           if (!_mlyCache.detections[imageKey][detectionKey]) {
32476                               _mlyCache.detections[imageKey][detectionKey] = {};
32477                           }
32478                       });
32479                   }
32480
32481                   return {
32482                       minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
32483                   };
32484
32485               }).filter(Boolean);
32486
32487               cache.rtree.load(features);
32488
32489               if (which === 'images' || which === 'sequences') {
32490                   dispatch$1.call('loadedImages');
32491               } else if (which === 'objects') {
32492                   dispatch$1.call('loadedSigns');
32493               }
32494
32495               if (data.features.length === maxResults) {  // more pages to load
32496                   cache.nextPage[tile.id] = nextPage + 1;
32497                   loadNextTilePage(which, currZoom, url, tile);
32498               } else {
32499                   cache.nextPage[tile.id] = Infinity;     // no more pages to load
32500               }
32501           });
32502   }
32503
32504   // extract links to pages of API results
32505   function parsePagination(links) {
32506       return links.split(',').map(function(rel) {
32507           var elements = rel.split(';');
32508           if (elements.length === 2) {
32509               return [
32510                   /<(.+)>/.exec(elements[0])[1],
32511                   /rel="(.+)"/.exec(elements[1])[1]
32512                   ];
32513           } else {
32514               return ['',''];
32515           }
32516       }).reduce(function(pagination, val) {
32517           pagination[val[1]] = val[0];
32518           return pagination;
32519       }, {});
32520   }
32521
32522
32523   // partition viewport into `psize` x `psize` regions
32524   function partitionViewport(psize, projection) {
32525       var dimensions = projection.clipExtent()[1];
32526       psize = psize || 16;
32527       var cols = d3_range(0, dimensions[0], psize),
32528           rows = d3_range(0, dimensions[1], psize),
32529           partitions = [];
32530
32531       rows.forEach(function(y) {
32532           cols.forEach(function(x) {
32533               var min$$1 = [x, y + psize],
32534                   max$$1 = [x + psize, y];
32535               partitions.push(
32536                   geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
32537           });
32538       });
32539
32540       return partitions;
32541   }
32542
32543
32544   // no more than `limit` results per partition.
32545   function searchLimited(psize, limit, projection, rtree) {
32546       limit = limit || 3;
32547
32548       var partitions = partitionViewport(psize, projection);
32549       var results;
32550
32551       // console.time('previous');
32552       results =  flatten(map$3(partitions, function(extent$$1) {
32553           return rtree.search(extent$$1.bbox())
32554               .slice(0, limit)
32555               .map(function(d) { return d.data; });
32556       }));
32557       // console.timeEnd('previous');
32558
32559       // console.time('new');
32560       // results = partitions.reduce(function(result, extent) {
32561       //     var found = rtree.search(extent.bbox())
32562       //         .map(function(d) { return d.data; })
32563       //         .sort(function(a, b) {
32564       //             return a.loc[1] - b.loc[1];
32565       //             // return a.key.localeCompare(b.key);
32566       //         })
32567       //         .slice(0, limit);
32568
32569       //     return (found.length ? result.concat(found) : result);
32570       // }, []);
32571       // console.timeEnd('new');
32572
32573       return results;
32574   }
32575
32576
32577
32578   var serviceMapillary = {
32579
32580       init: function() {
32581           if (!_mlyCache) {
32582               this.reset();
32583           }
32584
32585           this.event = utilRebind(this, dispatch$1, 'on');
32586       },
32587
32588       reset: function() {
32589           var cache = _mlyCache;
32590
32591           if (cache) {
32592               if (cache.images && cache.images.inflight) {
32593                   forEach(cache.images.inflight, abortRequest);
32594               }
32595               if (cache.objects && cache.objects.inflight) {
32596                   forEach(cache.objects.inflight, abortRequest);
32597               }
32598               if (cache.sequences && cache.sequences.inflight) {
32599                   forEach(cache.sequences.inflight, abortRequest);
32600               }
32601           }
32602
32603           _mlyCache = {
32604               images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {} },
32605               objects: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
32606               sequences: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {}, lineString: {} },
32607               detections: {}
32608           };
32609
32610           _mlySelectedImage = null;
32611           _mlyClicks = [];
32612       },
32613
32614
32615       images: function(projection) {
32616           var psize = 16, limit = 3;
32617           return searchLimited(psize, limit, projection, _mlyCache.images.rtree);
32618       },
32619
32620
32621       signs: function(projection) {
32622           var psize = 32, limit = 3;
32623           return searchLimited(psize, limit, projection, _mlyCache.objects.rtree);
32624       },
32625
32626
32627       sequences: function(projection) {
32628           var viewport = projection.clipExtent();
32629           var min$$1 = [viewport[0][0], viewport[1][1]];
32630           var max$$1 = [viewport[1][0], viewport[0][1]];
32631           var bbox = geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)).bbox();
32632           var sequenceKeys = {};
32633
32634           // all sequences for images in viewport
32635           _mlyCache.images.rtree.search(bbox)
32636               .forEach(function(d) {
32637                   var sequenceKey = _mlyCache.sequences.forImageKey[d.data.key];
32638                   if (sequenceKey) {
32639                       sequenceKeys[sequenceKey] = true;
32640                   }
32641               });
32642
32643           // Return lineStrings for the sequences
32644           return Object.keys(sequenceKeys).map(function(sequenceKey) {
32645               return _mlyCache.sequences.lineString[sequenceKey];
32646           });
32647       },
32648
32649
32650       signsSupported: function() {
32651           var detected = utilDetect();
32652           if (detected.ie) return false;
32653           if ((detected.browser.toLowerCase() === 'safari') && (parseFloat(detected.version) < 10)) return false;
32654           return true;
32655       },
32656
32657
32658       signHTML: function(d) {
32659           if (!_mlySignDefs || !_mlySignSprite) return;
32660           var position = _mlySignDefs[d.value];
32661           if (!position) return '<div></div>';
32662           var iconStyle = [
32663               'background-image:url(' + _mlySignSprite + ')',
32664               'background-repeat:no-repeat',
32665               'height:' + position.height + 'px',
32666               'width:' + position.width + 'px',
32667               'background-position-x:-' + position.x + 'px',
32668               'background-position-y:-' + position.y + 'px',
32669           ];
32670
32671           return '<div style="' + iconStyle.join(';') +'"></div>';
32672       },
32673
32674
32675       loadImages: function(projection) {
32676           loadTiles('images', apibase + 'images?', projection);
32677           loadTiles('sequences', apibase + 'sequences?', projection);
32678       },
32679
32680
32681       loadSigns: function(context, projection) {
32682           // if we are looking at signs, we'll actually need to fetch images too
32683           loadTiles('images', apibase + 'images?', projection);
32684           loadTiles('objects', apibase + 'objects?', projection);
32685
32686           // load traffic sign defs
32687           if (!_mlySignDefs) {
32688               _mlySignSprite = context.asset('img/traffic-signs/traffic-signs.png');
32689               _mlySignDefs = {};
32690               d3_json(context.asset('img/traffic-signs/traffic-signs.json'), function(err, data) {
32691                   if (err) return;
32692                   _mlySignDefs = data;
32693               });
32694           }
32695       },
32696
32697
32698       loadViewer: function(context) {
32699           // add mly-wrapper
32700           var wrap = d3_select('#photoviewer').selectAll('.mly-wrapper')
32701               .data([0]);
32702
32703           var wrapEnter = wrap.enter()
32704               .append('div')
32705               .attr('id', 'mly')
32706               .attr('class', 'photo-wrapper mly-wrapper')
32707               .classed('hide', true);
32708
32709           wrapEnter
32710               .append('div')
32711               .attr('class', 'photo-attribution fillD');
32712
32713
32714           // load mapillary-viewercss
32715           d3_select('head').selectAll('#mapillary-viewercss')
32716               .data([0])
32717               .enter()
32718               .append('link')
32719               .attr('id', 'mapillary-viewercss')
32720               .attr('rel', 'stylesheet')
32721               .attr('href', context.asset(viewercss));
32722
32723           // load mapillary-viewerjs
32724           d3_select('head').selectAll('#mapillary-viewerjs')
32725               .data([0])
32726               .enter()
32727               .append('script')
32728               .attr('id', 'mapillary-viewerjs')
32729               .attr('src', context.asset(viewerjs));
32730       },
32731
32732
32733       showViewer: function() {
32734           var wrap = d3_select('#photoviewer')
32735               .classed('hide', false);
32736
32737           var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size();
32738
32739           if (isHidden) {
32740               wrap
32741                   .selectAll('.photo-wrapper:not(.mly-wrapper)')
32742                   .classed('hide', true);
32743
32744               wrap
32745                   .selectAll('.photo-wrapper.mly-wrapper')
32746                   .classed('hide', false);
32747
32748               _mlyViewer.resize();
32749           }
32750
32751           return this;
32752       },
32753
32754
32755       hideViewer: function() {
32756           _mlySelectedImage = null;
32757
32758           if (!_mlyFallback && _mlyViewer) {
32759               _mlyViewer.getComponent('sequence').stop();
32760           }
32761
32762           var viewer = d3_select('#photoviewer');
32763           if (!viewer.empty()) viewer.datum(null);
32764
32765           viewer
32766               .classed('hide', true)
32767               .selectAll('.photo-wrapper')
32768               .classed('hide', true);
32769
32770           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
32771               .classed('selected', false);
32772
32773           return this.setStyles(null, true);
32774       },
32775
32776
32777       parsePagination: parsePagination,
32778
32779
32780       updateViewer: function(imageKey, context) {
32781           if (!imageKey) return this;
32782
32783           if (!_mlyViewer) {
32784               this.initViewer(imageKey, context);
32785           } else {
32786               _mlyViewer.moveToKey(imageKey)
32787                   .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
32788           }
32789
32790           return this;
32791       },
32792
32793
32794       initViewer: function(imageKey, context) {
32795           var that = this;
32796           if (Mapillary && imageKey) {
32797               var opts = {
32798                   baseImageSize: 320,
32799                   component: {
32800                       cover: false,
32801                       keyboard: false,
32802                       tag: true
32803                   }
32804               };
32805
32806               // Disable components requiring WebGL support
32807               if (!Mapillary.isSupported() && Mapillary.isFallbackSupported()) {
32808                   _mlyFallback = true;
32809                   opts.component = {
32810                       cover: false,
32811                       direction: false,
32812                       imagePlane: false,
32813                       keyboard: false,
32814                       mouse: false,
32815                       sequence: false,
32816                       tag: false,
32817                       image: true,        // fallback
32818                       navigation: true    // fallback
32819                   };
32820               }
32821
32822               _mlyViewer = new Mapillary.Viewer('mly', clientId, null, opts);
32823               _mlyViewer.on('nodechanged', nodeChanged);
32824               _mlyViewer.moveToKey(imageKey)
32825                   .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
32826           }
32827
32828           // nodeChanged: called after the viewer has changed images and is ready.
32829           //
32830           // There is some logic here to batch up clicks into a _mlyClicks array
32831           // because the user might click on a lot of markers quickly and nodechanged
32832           // may be called out of order asychronously.
32833           //
32834           // Clicks are added to the array in `selectedImage` and removed here.
32835           //
32836           function nodeChanged(node) {
32837               if (!_mlyFallback) {
32838                   _mlyViewer.getComponent('tag').removeAll();  // remove previous detections
32839               }
32840
32841               var clicks = _mlyClicks;
32842               var index = clicks.indexOf(node.key);
32843               var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
32844
32845               if (index > -1) {              // `nodechanged` initiated from clicking on a marker..
32846                   clicks.splice(index, 1);   // remove the click
32847                   // If `node.key` matches the current _mlySelectedImage, call `selectImage()`
32848                   // one more time to update the detections and attribution..
32849                   if (node.key === selectedKey) {
32850                       that.selectImage(_mlySelectedImage, node.key, true);
32851                   }
32852               } else {             // `nodechanged` initiated from the Mapillary viewer controls..
32853                   var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat];
32854                   context.map().centerEase(loc);
32855                   that.selectImage(undefined, node.key, true);
32856               }
32857           }
32858       },
32859
32860
32861       // Pass the image datum itself in `d` or the `imageKey` string.
32862       // This allows images to be selected from places that dont have access
32863       // to the full image datum (like the street signs layer or the js viewer)
32864       selectImage: function(d, imageKey, fromViewer) {
32865           if (!d && imageKey) {
32866               // If the user clicked on something that's not an image marker, we
32867               // might get in here.. Cache lookup can fail, e.g. if the user
32868               // clicked a streetsign, but images are loading slowly asynchronously.
32869               // We'll try to carry on anyway if there is no datum.  There just
32870               // might be a delay before user sees detections, captured_at, etc.
32871               d = _mlyCache.images.forImageKey[imageKey];
32872           }
32873
32874           _mlySelectedImage = d;
32875           var viewer = d3_select('#photoviewer');
32876           if (!viewer.empty()) viewer.datum(d);
32877
32878           imageKey = (d && d.key) || imageKey;
32879           if (!fromViewer && imageKey) {
32880               _mlyClicks.push(imageKey);
32881           }
32882
32883           this.setStyles(null, true);
32884
32885           d3_selectAll('.layer-mapillary-signs .icon-sign')
32886               .classed('selected', function(d) {
32887                   return some(d.detections, function(detection) {
32888                       return detection.image_key === imageKey;
32889                   });
32890               });
32891
32892           var wrap = d3_select('#photoviewer .mly-wrapper');
32893           var attribution = wrap.selectAll('.photo-attribution').html('');
32894
32895           if (d) {
32896               if (d.captured_by) {
32897                   attribution
32898                       .append('a')
32899                       .attr('class', 'captured_by')
32900                       .attr('target', '_blank')
32901                       .attr('href', 'https://www.mapillary.com/app/user/' + encodeURIComponent(d.captured_by))
32902                       .text('@' + d.captured_by);
32903
32904                   attribution
32905                       .append('span')
32906                       .text('|');
32907               }
32908
32909               if (d.captured_at) {
32910                   attribution
32911                       .append('span')
32912                       .attr('class', 'captured_at')
32913                       .text(localeTimestamp(d.captured_at));
32914
32915                   attribution
32916                       .append('span')
32917                       .text('|');
32918               }
32919
32920               attribution
32921                   .append('a')
32922                   .attr('class', 'image_link')
32923                   .attr('target', '_blank')
32924                   .attr('href', 'https://www.mapillary.com/app/?pKey=' + encodeURIComponent(d.key) +
32925                       '&focus=photo&lat=' + d.loc[1] + '&lng=' + d.loc[0] + '&z=17')
32926                   .text('mapillary.com');
32927
32928               this.updateDetections(d);
32929           }
32930
32931           return this;
32932       },
32933
32934
32935       getSelectedImage: function() {
32936           return _mlySelectedImage;
32937       },
32938
32939
32940       getSequenceKeyForImage: function(d) {
32941           var imageKey = d && d.key;
32942           return imageKey && _mlyCache.sequences.forImageKey[imageKey];
32943       },
32944
32945
32946       setStyles: function(hovered, reset) {
32947           if (reset) {  // reset all layers
32948               d3_selectAll('.viewfield-group')
32949                   .classed('highlighted', false)
32950                   .classed('hovered', false)
32951                   .classed('selected', false);
32952
32953               d3_selectAll('.sequence')
32954                   .classed('highlighted', false)
32955                   .classed('selected', false);
32956           }
32957
32958           var hoveredImageKey = hovered && hovered.key;
32959           var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
32960           var hoveredLineString = hoveredSequenceKey && _mlyCache.sequences.lineString[hoveredSequenceKey];
32961           var hoveredImageKeys = (hoveredLineString && hoveredLineString.properties.coordinateProperties.image_keys) || [];
32962
32963           var viewer = d3_select('#photoviewer');
32964           var selected = viewer.empty() ? undefined : viewer.datum();
32965           var selectedImageKey = selected && selected.key;
32966           var selectedSequenceKey = this.getSequenceKeyForImage(selected);
32967           var selectedLineString = selectedSequenceKey && _mlyCache.sequences.lineString[selectedSequenceKey];
32968           var selectedImageKeys = (selectedLineString && selectedLineString.properties.coordinateProperties.image_keys) || [];
32969
32970           // highlight sibling viewfields on either the selected or the hovered sequences
32971           var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
32972
32973           d3_selectAll('.layer-mapillary-images .viewfield-group')
32974               .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
32975               .classed('hovered', function(d) { return d.key === hoveredImageKey; })
32976               .classed('selected', function(d) { return d.key === selectedImageKey; });
32977
32978           d3_selectAll('.layer-mapillary-images .sequence')
32979               .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
32980               .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
32981
32982           return this;
32983       },
32984
32985
32986       updateDetections: function(d) {
32987           if (!_mlyViewer || _mlyFallback) return;
32988
32989           var imageKey = d && d.key;
32990           var detections = (imageKey && _mlyCache.detections[imageKey]) || [];
32991
32992           forEach(detections, function(data, k) {
32993               if (isEmpty(data)) {
32994                   loadDetection(k);
32995               } else {
32996                   var tag = makeTag(data);
32997                   if (tag) {
32998                       var tagComponent = _mlyViewer.getComponent('tag');
32999                       tagComponent.add([tag]);
33000                   }
33001               }
33002           });
33003
33004
33005           function loadDetection(detectionKey) {
33006               var url = apibase + 'detections/'+
33007                   detectionKey + '?' + utilQsString({
33008                       client_id: clientId,
33009                   });
33010
33011               d3_request(url)
33012                   .mimeType('application/json')
33013                   .response(function(xhr) {
33014                       return JSON.parse(xhr.responseText);
33015                   })
33016                   .get(function(err, data) {
33017                       if (!data || !data.properties) return;
33018
33019                       var imageKey = data.properties.image_key;
33020                       _mlyCache.detections[imageKey][detectionKey] = data;
33021
33022                       var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
33023                       if (imageKey === selectedKey) {
33024                           var tag = makeTag(data);
33025                           if (tag) {
33026                               var tagComponent = _mlyViewer.getComponent('tag');
33027                               tagComponent.add([tag]);
33028                           }
33029                       }
33030                   });
33031           }
33032
33033
33034           function makeTag(data) {
33035               var valueParts = data.properties.value.split('--');
33036               if (valueParts.length !== 3) return;
33037
33038               var text = valueParts[1].replace(/-/g, ' ');
33039               var tag;
33040
33041               // Currently only two shapes <Polygon|Point>
33042               if (data.properties.shape.type === 'Polygon') {
33043                   var polygonGeometry = new Mapillary
33044                       .TagComponent
33045                       .PolygonGeometry(data.properties.shape.coordinates[0]);
33046
33047                   tag = new Mapillary.TagComponent.OutlineTag(
33048                       data.properties.key,
33049                       polygonGeometry,
33050                       {
33051                           text: text,
33052                           textColor: 0xffff00,
33053                           lineColor: 0xffff00,
33054                           lineWidth: 2,
33055                           fillColor: 0xffff00,
33056                           fillOpacity: 0.3,
33057                       }
33058                   );
33059
33060               } else if (data.properties.shape.type === 'Point') {
33061                   var pointGeometry = new Mapillary
33062                       .TagComponent
33063                       .PointGeometry(data.properties.shape.coordinates[0]);
33064
33065                   tag = new Mapillary.TagComponent.SpotTag(
33066                       data.properties.key,
33067                       pointGeometry,
33068                       {
33069                           text: text,
33070                           color: 0xffff00,
33071                           textColor: 0xffff00
33072                       }
33073                   );
33074               }
33075
33076               return tag;
33077           }
33078       },
33079
33080
33081       cache: function() {
33082           return _mlyCache;
33083       },
33084
33085
33086       signDefs: function(_) {
33087           if (!arguments.length) return _mlySignDefs;
33088           _mlySignDefs = _;
33089           return this;
33090       }
33091
33092   };
33093
33094   var apibase$1 = 'https://nominatim.openstreetmap.org/',
33095       inflight = {},
33096       nominatimCache;
33097
33098
33099   var serviceNominatim = {
33100
33101       init: function() {
33102           inflight = {};
33103           nominatimCache = rbush_1();
33104       },
33105
33106       reset: function() {
33107           forEach(inflight, function(req) { req.abort(); });
33108           inflight = {};
33109           nominatimCache = rbush_1();
33110       },
33111
33112
33113       countryCode: function (location, callback) {
33114           this.reverse(location, function(err, result) {
33115               if (err) {
33116                   return callback(err);
33117               } else if (result.address) {
33118                   return callback(null, result.address.country_code);
33119               } else {
33120                   return callback('Unable to geocode', null);
33121               }
33122           });
33123       },
33124
33125
33126       reverse: function (location, callback) {
33127           var cached = nominatimCache.search(
33128               { minX: location[0], minY: location[1], maxX: location[0], maxY: location[1] }
33129           );
33130
33131           if (cached.length > 0) {
33132               return callback(null, cached[0].data);
33133           }
33134
33135           var params = { zoom: 13, format: 'json', addressdetails: 1, lat: location[1], lon: location[0] };
33136           var url = apibase$1 + 'reverse?' + utilQsString(params);
33137           if (inflight[url]) return;
33138
33139           inflight[url] = d3_json(url, function(err, result) {
33140               delete inflight[url];
33141
33142               if (err) {
33143                   return callback(err);
33144               } else if (result && result.error) {
33145                   return callback(result.error);
33146               }
33147
33148               var extent = geoExtent$$1(location).padByMeters(200);
33149               nominatimCache.insert(assign(extent.bbox(), {data: result}));
33150
33151               callback(null, result);
33152           });
33153       },
33154
33155
33156       search: function (val, callback) {
33157           var searchVal = encodeURIComponent(val);
33158           var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
33159           if (inflight[url]) return;
33160
33161           inflight[url] = d3_json(url, function(err, result) {
33162               delete inflight[url];
33163               callback(err, result);
33164           });
33165       }
33166
33167   };
33168
33169   var apibase$2 = 'https://openstreetcam.org',
33170       maxResults$1 = 1000,
33171       tileZoom$1 = 14,
33172       dispatch$2 = dispatch('loadedImages'),
33173       imgZoom = d3_zoom()
33174           .extent([[0, 0], [320, 240]])
33175           .translateExtent([[0, 0], [320, 240]])
33176           .scaleExtent([1, 15])
33177           .on('zoom', zoomPan),
33178       _oscCache,
33179       _oscSelectedImage;
33180
33181
33182   function abortRequest$1(i) {
33183       i.abort();
33184   }
33185
33186
33187   function nearNullIsland$1(x, y, z) {
33188       if (z >= 7) {
33189           var center = Math.pow(2, z - 1),
33190               width = Math.pow(2, z - 6),
33191               min$$1 = center - (width / 2),
33192               max$$1 = center + (width / 2) - 1;
33193           return x >= min$$1 && x <= max$$1 && y >= min$$1 && y <= max$$1;
33194       }
33195       return false;
33196   }
33197
33198
33199   function maxPageAtZoom$1(z) {
33200       if (z < 15)   return 2;
33201       if (z === 15) return 5;
33202       if (z === 16) return 10;
33203       if (z === 17) return 20;
33204       if (z === 18) return 40;
33205       if (z > 18)   return 80;
33206   }
33207
33208
33209   function getTiles$1(projection) {
33210       var s = projection.scale() * 2 * Math.PI,
33211           z = Math.max(Math.log(s) / Math.log(2) - 8, 0),
33212           ts = 256 * Math.pow(2, z - tileZoom$1),
33213           origin = [
33214               s / 2 - projection.translate()[0],
33215               s / 2 - projection.translate()[1]];
33216
33217       return d3geoTile()
33218           .scaleExtent([tileZoom$1, tileZoom$1])
33219           .scale(s)
33220           .size(projection.clipExtent()[1])
33221           .translate(projection.translate())()
33222           .map(function(tile) {
33223               var x = tile[0] * ts - origin[0],
33224                   y = tile[1] * ts - origin[1];
33225
33226               return {
33227                   id: tile.toString(),
33228                   xyz: tile,
33229                   extent: geoExtent$$1(
33230                       projection.invert([x, y + ts]),
33231                       projection.invert([x + ts, y])
33232                   )
33233               };
33234           });
33235   }
33236
33237
33238   function loadTiles$1(which, url, projection) {
33239       var s = projection.scale() * 2 * Math.PI,
33240           currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0));
33241
33242       var tiles = getTiles$1(projection).filter(function(t) {
33243               return !nearNullIsland$1(t.xyz[0], t.xyz[1], t.xyz[2]);
33244           });
33245
33246       filter(which.inflight, function(v, k) {
33247           var wanted = find$1(tiles, function(tile) { return k === (tile.id + ',0'); });
33248           if (!wanted) delete which.inflight[k];
33249           return !wanted;
33250       }).map(abortRequest$1);
33251
33252       tiles.forEach(function(tile) {
33253           loadNextTilePage$1(which, currZoom, url, tile);
33254       });
33255   }
33256
33257
33258   function loadNextTilePage$1(which, currZoom, url, tile) {
33259       var cache = _oscCache[which];
33260       var bbox = tile.extent.bbox();
33261       var maxPages = maxPageAtZoom$1(currZoom);
33262       var nextPage = cache.nextPage[tile.id] || 1;
33263       var params = utilQsString({
33264               ipp: maxResults$1,
33265               page: nextPage,
33266               // client_id: clientId,
33267               bbTopLeft: [bbox.maxY, bbox.minX].join(','),
33268               bbBottomRight: [bbox.minY, bbox.maxX].join(',')
33269           }, true);
33270
33271       if (nextPage > maxPages) return;
33272
33273       var id = tile.id + ',' + String(nextPage);
33274       if (cache.loaded[id] || cache.inflight[id]) return;
33275
33276       cache.inflight[id] = d3_request(url)
33277           .mimeType('application/json')
33278           .header('Content-type', 'application/x-www-form-urlencoded')
33279           .response(function(xhr) { return JSON.parse(xhr.responseText); })
33280           .post(params, function(err, data) {
33281               cache.loaded[id] = true;
33282               delete cache.inflight[id];
33283               if (err || !data.currentPageItems || !data.currentPageItems.length) return;
33284
33285               function localeDateString(s) {
33286                   if (!s) return null;
33287                   var detected = utilDetect();
33288                   var options = { day: 'numeric', month: 'short', year: 'numeric' };
33289                   var d = new Date(s);
33290                   if (isNaN(d.getTime())) return null;
33291                   return d.toLocaleDateString(detected.locale, options);
33292               }
33293
33294               var features = data.currentPageItems.map(function(item) {
33295                   var loc = [+item.lng, +item.lat],
33296                       d;
33297
33298                   if (which === 'images') {
33299                       d = {
33300                           loc: loc,
33301                           key: item.id,
33302                           ca: +item.heading,
33303                           captured_at: localeDateString(item.shot_date || item.date_added),
33304                           captured_by: item.username,
33305                           imagePath: item.lth_name,
33306                           sequence_id: item.sequence_id,
33307                           sequence_index: +item.sequence_index
33308                       };
33309
33310                       // cache sequence info
33311                       var seq = _oscCache.sequences[d.sequence_id];
33312                       if (!seq) {
33313                           seq = { rotation: 0, images: [] };
33314                           _oscCache.sequences[d.sequence_id] = seq;
33315                       }
33316                       seq.images[d.sequence_index] = d;
33317                   }
33318
33319                   return {
33320                       minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
33321                   };
33322               });
33323
33324               cache.rtree.load(features);
33325
33326               if (which === 'images') {
33327                   dispatch$2.call('loadedImages');
33328               }
33329
33330               if (data.currentPageItems.length === maxResults$1) {  // more pages to load
33331                   cache.nextPage[tile.id] = nextPage + 1;
33332                   loadNextTilePage$1(which, currZoom, url, tile);
33333               } else {
33334                   cache.nextPage[tile.id] = Infinity;     // no more pages to load
33335               }
33336           });
33337   }
33338
33339
33340   // partition viewport into `psize` x `psize` regions
33341   function partitionViewport$1(psize, projection) {
33342       var dimensions = projection.clipExtent()[1];
33343       psize = psize || 16;
33344       var cols = d3_range(0, dimensions[0], psize),
33345           rows = d3_range(0, dimensions[1], psize),
33346           partitions = [];
33347
33348       rows.forEach(function(y) {
33349           cols.forEach(function(x) {
33350               var min$$1 = [x, y + psize],
33351                   max$$1 = [x + psize, y];
33352               partitions.push(
33353                   geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
33354           });
33355       });
33356
33357       return partitions;
33358   }
33359
33360
33361   // no more than `limit` results per partition.
33362   function searchLimited$1(psize, limit, projection, rtree) {
33363       limit = limit || 3;
33364
33365       var partitions = partitionViewport$1(psize, projection);
33366       var results;
33367
33368       results = flatten(map$3(partitions, function(extent$$1) {
33369           return rtree.search(extent$$1.bbox())
33370               .slice(0, limit)
33371               .map(function(d) { return d.data; });
33372       }));
33373       return results;
33374   }
33375
33376
33377   function zoomPan() {
33378       var t = event.transform;
33379       d3_select('#photoviewer .osc-image-wrap')
33380           .call(utilSetTransform, t.x, t.y, t.k);
33381   }
33382
33383
33384   var serviceOpenstreetcam = {
33385
33386       init: function() {
33387           if (!_oscCache) {
33388               this.reset();
33389           }
33390
33391           this.event = utilRebind(this, dispatch$2, 'on');
33392       },
33393
33394       reset: function() {
33395           var cache = _oscCache;
33396
33397           if (cache) {
33398               if (cache.images && cache.images.inflight) {
33399                   forEach(cache.images.inflight, abortRequest$1);
33400               }
33401           }
33402
33403           _oscCache = {
33404               images: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1() },
33405               sequences: {}
33406           };
33407
33408           _oscSelectedImage = null;
33409       },
33410
33411
33412       images: function(projection) {
33413           var psize = 16, limit = 3;
33414           return searchLimited$1(psize, limit, projection, _oscCache.images.rtree);
33415       },
33416
33417
33418       sequences: function(projection) {
33419           var viewport = projection.clipExtent();
33420           var min$$1 = [viewport[0][0], viewport[1][1]];
33421           var max$$1 = [viewport[1][0], viewport[0][1]];
33422           var bbox = geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)).bbox();
33423           var sequenceKeys = {};
33424
33425           // all sequences for images in viewport
33426           _oscCache.images.rtree.search(bbox)
33427               .forEach(function(d) { sequenceKeys[d.data.sequence_id] = true; });
33428
33429           // make linestrings from those sequences
33430           var lineStrings = [];
33431           Object.keys(sequenceKeys)
33432               .forEach(function(sequenceKey) {
33433                   var seq = _oscCache.sequences[sequenceKey];
33434                   var images = seq && seq.images;
33435                   if (images) {
33436                       lineStrings.push({
33437                           type: 'LineString',
33438                           coordinates: images.map(function (d) { return d.loc; }).filter(Boolean),
33439                           properties: { key: sequenceKey }
33440                       });
33441                   }
33442               });
33443           return lineStrings;
33444       },
33445
33446
33447       loadImages: function(projection) {
33448           var url = apibase$2 + '/1.0/list/nearby-photos/';
33449           loadTiles$1('images', url, projection);
33450       },
33451
33452
33453       loadViewer: function(context) {
33454           var that = this;
33455
33456           // add osc-wrapper
33457           var wrap = d3_select('#photoviewer').selectAll('.osc-wrapper')
33458               .data([0]);
33459
33460           var wrapEnter = wrap.enter()
33461               .append('div')
33462               .attr('class', 'photo-wrapper osc-wrapper')
33463               .classed('hide', true)
33464               .call(imgZoom)
33465               .on('dblclick.zoom', null);
33466
33467           wrapEnter
33468               .append('div')
33469               .attr('class', 'photo-attribution fillD');
33470
33471           var controlsEnter = wrapEnter
33472               .append('div')
33473               .attr('class', 'osc-controls-wrap')
33474               .append('div')
33475               .attr('class', 'osc-controls');
33476
33477           controlsEnter
33478               .append('button')
33479               .on('click.back', step(-1))
33480               .text('◄');
33481
33482           controlsEnter
33483               .append('button')
33484               .on('click.rotate-ccw', rotate(-90))
33485               .text('⤿');
33486
33487           controlsEnter
33488               .append('button')
33489               .on('click.rotate-cw', rotate(90))
33490               .text('⤾');
33491
33492           controlsEnter
33493               .append('button')
33494               .on('click.forward', step(1))
33495               .text('►');
33496
33497           wrapEnter
33498               .append('div')
33499               .attr('class', 'osc-image-wrap');
33500
33501
33502           function rotate(deg) {
33503               return function() {
33504                   if (!_oscSelectedImage) return;
33505                   var sequenceKey = _oscSelectedImage.sequence_id;
33506                   var sequence = _oscCache.sequences[sequenceKey];
33507                   if (!sequence) return;
33508
33509                   var r = sequence.rotation || 0;
33510                   r += deg;
33511
33512                   if (r > 180) r -= 360;
33513                   if (r < -180) r += 360;
33514                   sequence.rotation = r;
33515
33516                   var wrap = d3_select('#photoviewer .osc-wrapper');
33517
33518                   wrap
33519                       .transition()
33520                       .duration(100)
33521                       .call(imgZoom.transform, identity$7);
33522
33523                   wrap.selectAll('.osc-image')
33524                       .transition()
33525                       .duration(100)
33526                       .style('transform', 'rotate(' + r + 'deg)');
33527               };
33528           }
33529
33530           function step(stepBy) {
33531               return function() {
33532                   if (!_oscSelectedImage) return;
33533                   var sequenceKey = _oscSelectedImage.sequence_id;
33534                   var sequence = _oscCache.sequences[sequenceKey];
33535                   if (!sequence) return;
33536
33537                   var nextIndex = _oscSelectedImage.sequence_index + stepBy;
33538                   var nextImage = sequence.images[nextIndex];
33539                   if (!nextImage) return;
33540
33541                   context.map().centerEase(nextImage.loc);
33542
33543                   that
33544                       .selectImage(nextImage)
33545                       .updateViewer(nextImage);
33546               };
33547           }
33548       },
33549
33550
33551       showViewer: function() {
33552           var viewer = d3_select('#photoviewer')
33553               .classed('hide', false);
33554
33555           var isHidden = viewer.selectAll('.photo-wrapper.osc-wrapper.hide').size();
33556
33557           if (isHidden) {
33558               viewer
33559                   .selectAll('.photo-wrapper:not(.osc-wrapper)')
33560                   .classed('hide', true);
33561
33562               viewer
33563                   .selectAll('.photo-wrapper.osc-wrapper')
33564                   .classed('hide', false);
33565           }
33566
33567           return this;
33568       },
33569
33570
33571       hideViewer: function() {
33572           _oscSelectedImage = null;
33573
33574           var viewer = d3_select('#photoviewer');
33575           if (!viewer.empty()) viewer.datum(null);
33576
33577           viewer
33578               .classed('hide', true)
33579               .selectAll('.photo-wrapper')
33580               .classed('hide', true);
33581
33582           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
33583               .classed('selected', false);
33584
33585           return this.setStyles(null, true);
33586       },
33587
33588
33589       updateViewer: function(d) {
33590           var wrap = d3_select('#photoviewer .osc-wrapper');
33591           var imageWrap = wrap.selectAll('.osc-image-wrap');
33592           var attribution = wrap.selectAll('.photo-attribution').html('');
33593
33594           wrap
33595               .transition()
33596               .duration(100)
33597               .call(imgZoom.transform, identity$7);
33598
33599           imageWrap
33600               .selectAll('.osc-image')
33601               .remove();
33602
33603           if (d) {
33604               var sequence = _oscCache.sequences[d.sequence_id];
33605               var r = (sequence && sequence.rotation) || 0;
33606
33607               imageWrap
33608                   .append('img')
33609                   .attr('class', 'osc-image')
33610                   .attr('src', apibase$2 + '/' + d.imagePath)
33611                   .style('transform', 'rotate(' + r + 'deg)');
33612
33613               if (d.captured_by) {
33614                   attribution
33615                       .append('a')
33616                       .attr('class', 'captured_by')
33617                       .attr('target', '_blank')
33618                       .attr('href', 'https://openstreetcam.org/user/' + encodeURIComponent(d.captured_by))
33619                       .text('@' + d.captured_by);
33620
33621                   attribution
33622                       .append('span')
33623                       .text('|');
33624               }
33625
33626               if (d.captured_at) {
33627                   attribution
33628                       .append('span')
33629                       .attr('class', 'captured_at')
33630                       .text(d.captured_at);
33631
33632                   attribution
33633                       .append('span')
33634                       .text('|');
33635               }
33636
33637               attribution
33638                   .append('a')
33639                   .attr('class', 'image_link')
33640                   .attr('target', '_blank')
33641                   .attr('href', 'https://openstreetcam.org/details/' + d.sequence_id + '/' + d.sequence_index)
33642                   .text('openstreetcam.org');
33643           }
33644           return this;
33645       },
33646
33647
33648       selectImage: function(d) {
33649           _oscSelectedImage = d;
33650           var viewer = d3_select('#photoviewer');
33651           if (!viewer.empty()) viewer.datum(d);
33652
33653           this.setStyles(null, true);
33654
33655           d3_selectAll('.icon-sign')
33656               .classed('selected', false);
33657
33658           return this;
33659       },
33660
33661
33662       getSelectedImage: function() {
33663           return _oscSelectedImage;
33664       },
33665
33666
33667       getSequenceKeyForImage: function(d) {
33668           return d && d.sequence_id;
33669       },
33670
33671
33672       setStyles: function(hovered, reset) {
33673           if (reset) {  // reset all layers
33674               d3_selectAll('.viewfield-group')
33675                   .classed('highlighted', false)
33676                   .classed('hovered', false)
33677                   .classed('selected', false);
33678
33679               d3_selectAll('.sequence')
33680                   .classed('highlighted', false)
33681                   .classed('selected', false);
33682           }
33683
33684           var hoveredImageKey = hovered && hovered.key;
33685           var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
33686           var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
33687           var hoveredImageKeys = (hoveredSequence && hoveredSequence.images.map(function (d) { return d.key; })) || [];
33688
33689           var viewer = d3_select('#photoviewer');
33690           var selected = viewer.empty() ? undefined : viewer.datum();
33691           var selectedImageKey = selected && selected.key;
33692           var selectedSequenceKey = this.getSequenceKeyForImage(selected);
33693           var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
33694           var selectedImageKeys = (selectedSequence && selectedSequence.images.map(function (d) { return d.key; })) || [];
33695
33696           // highlight sibling viewfields on either the selected or the hovered sequences
33697           var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
33698
33699           d3_selectAll('.layer-openstreetcam-images .viewfield-group')
33700               .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
33701               .classed('hovered', function(d) { return d.key === hoveredImageKey; })
33702               .classed('selected', function(d) { return d.key === selectedImageKey; });
33703
33704           d3_selectAll('.layer-openstreetcam-images .sequence')
33705               .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
33706               .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
33707
33708           return this;
33709       },
33710
33711
33712       cache: function() {
33713           return _oscCache;
33714       }
33715
33716   };
33717
33718   /* Built-in method references for those with the same name as other `lodash` methods. */
33719   var nativeCeil = Math.ceil,
33720       nativeMax$4 = Math.max;
33721
33722   /**
33723    * Creates an array of elements split into groups the length of `size`.
33724    * If `array` can't be split evenly, the final chunk will be the remaining
33725    * elements.
33726    *
33727    * @static
33728    * @memberOf _
33729    * @since 3.0.0
33730    * @category Array
33731    * @param {Array} array The array to process.
33732    * @param {number} [size=1] The length of each chunk
33733    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
33734    * @returns {Array} Returns the new array of chunks.
33735    * @example
33736    *
33737    * _.chunk(['a', 'b', 'c', 'd'], 2);
33738    * // => [['a', 'b'], ['c', 'd']]
33739    *
33740    * _.chunk(['a', 'b', 'c', 'd'], 3);
33741    * // => [['a', 'b', 'c'], ['d']]
33742    */
33743   function chunk(array, size, guard) {
33744     if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
33745       size = 1;
33746     } else {
33747       size = nativeMax$4(toInteger(size), 0);
33748     }
33749     var length = array == null ? 0 : array.length;
33750     if (!length || size < 1) {
33751       return [];
33752     }
33753     var index = 0,
33754         resIndex = 0,
33755         result = Array(nativeCeil(length / size));
33756
33757     while (index < length) {
33758       result[resIndex++] = baseSlice(array, index, (index += size));
33759     }
33760     return result;
33761   }
33762
33763   var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
33764
33765   function createCommonjsModule(fn, module) {
33766         return module = { exports: {} }, fn(module, module.exports), module.exports;
33767   }
33768
33769   var hashes = createCommonjsModule(function (module, exports) {
33770   /**
33771    * jshashes - https://github.com/h2non/jshashes
33772    * Released under the "New BSD" license
33773    *
33774    * Algorithms specification:
33775    *
33776    * MD5 - http://www.ietf.org/rfc/rfc1321.txt
33777    * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
33778    * SHA1   - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
33779    * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
33780    * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
33781    * HMAC - http://www.ietf.org/rfc/rfc2104.txt
33782    */
33783   (function() {
33784     var Hashes;
33785
33786     function utf8Encode(str) {
33787       var x, y, output = '',
33788         i = -1,
33789         l;
33790
33791       if (str && str.length) {
33792         l = str.length;
33793         while ((i += 1) < l) {
33794           /* Decode utf-16 surrogate pairs */
33795           x = str.charCodeAt(i);
33796           y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
33797           if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
33798             x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
33799             i += 1;
33800           }
33801           /* Encode output as utf-8 */
33802           if (x <= 0x7F) {
33803             output += String.fromCharCode(x);
33804           } else if (x <= 0x7FF) {
33805             output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
33806               0x80 | (x & 0x3F));
33807           } else if (x <= 0xFFFF) {
33808             output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
33809               0x80 | ((x >>> 6) & 0x3F),
33810               0x80 | (x & 0x3F));
33811           } else if (x <= 0x1FFFFF) {
33812             output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
33813               0x80 | ((x >>> 12) & 0x3F),
33814               0x80 | ((x >>> 6) & 0x3F),
33815               0x80 | (x & 0x3F));
33816           }
33817         }
33818       }
33819       return output;
33820     }
33821
33822     function utf8Decode(str) {
33823       var i, ac, c1, c2, c3, arr = [],
33824         l;
33825       i = ac = c1 = c2 = c3 = 0;
33826
33827       if (str && str.length) {
33828         l = str.length;
33829         str += '';
33830
33831         while (i < l) {
33832           c1 = str.charCodeAt(i);
33833           ac += 1;
33834           if (c1 < 128) {
33835             arr[ac] = String.fromCharCode(c1);
33836             i += 1;
33837           } else if (c1 > 191 && c1 < 224) {
33838             c2 = str.charCodeAt(i + 1);
33839             arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
33840             i += 2;
33841           } else {
33842             c2 = str.charCodeAt(i + 1);
33843             c3 = str.charCodeAt(i + 2);
33844             arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
33845             i += 3;
33846           }
33847         }
33848       }
33849       return arr.join('');
33850     }
33851
33852     /**
33853      * Add integers, wrapping at 2^32. This uses 16-bit operations internally
33854      * to work around bugs in some JS interpreters.
33855      */
33856
33857     function safe_add(x, y) {
33858       var lsw = (x & 0xFFFF) + (y & 0xFFFF),
33859         msw = (x >> 16) + (y >> 16) + (lsw >> 16);
33860       return (msw << 16) | (lsw & 0xFFFF);
33861     }
33862
33863     /**
33864      * Bitwise rotate a 32-bit number to the left.
33865      */
33866
33867     function bit_rol(num, cnt) {
33868       return (num << cnt) | (num >>> (32 - cnt));
33869     }
33870
33871     /**
33872      * Convert a raw string to a hex string
33873      */
33874
33875     function rstr2hex(input, hexcase) {
33876       var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
33877         output = '',
33878         x, i = 0,
33879         l = input.length;
33880       for (; i < l; i += 1) {
33881         x = input.charCodeAt(i);
33882         output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
33883       }
33884       return output;
33885     }
33886
33887     /**
33888      * Convert an array of big-endian words to a string
33889      */
33890
33891     function binb2rstr(input) {
33892       var i, l = input.length * 32,
33893         output = '';
33894       for (i = 0; i < l; i += 8) {
33895         output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
33896       }
33897       return output;
33898     }
33899
33900     /**
33901      * Convert an array of little-endian words to a string
33902      */
33903
33904     function binl2rstr(input) {
33905       var i, l = input.length * 32,
33906         output = '';
33907       for (i = 0; i < l; i += 8) {
33908         output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
33909       }
33910       return output;
33911     }
33912
33913     /**
33914      * Convert a raw string to an array of little-endian words
33915      * Characters >255 have their high-byte silently ignored.
33916      */
33917
33918     function rstr2binl(input) {
33919       var i, l = input.length * 8,
33920         output = Array(input.length >> 2),
33921         lo = output.length;
33922       for (i = 0; i < lo; i += 1) {
33923         output[i] = 0;
33924       }
33925       for (i = 0; i < l; i += 8) {
33926         output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
33927       }
33928       return output;
33929     }
33930
33931     /**
33932      * Convert a raw string to an array of big-endian words
33933      * Characters >255 have their high-byte silently ignored.
33934      */
33935
33936     function rstr2binb(input) {
33937       var i, l = input.length * 8,
33938         output = Array(input.length >> 2),
33939         lo = output.length;
33940       for (i = 0; i < lo; i += 1) {
33941         output[i] = 0;
33942       }
33943       for (i = 0; i < l; i += 8) {
33944         output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
33945       }
33946       return output;
33947     }
33948
33949     /**
33950      * Convert a raw string to an arbitrary string encoding
33951      */
33952
33953     function rstr2any(input, encoding) {
33954       var divisor = encoding.length,
33955         remainders = Array(),
33956         i, q, x, ld, quotient, dividend, output, full_length;
33957
33958       /* Convert to an array of 16-bit big-endian values, forming the dividend */
33959       dividend = Array(Math.ceil(input.length / 2));
33960       ld = dividend.length;
33961       for (i = 0; i < ld; i += 1) {
33962         dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
33963       }
33964
33965       /**
33966        * Repeatedly perform a long division. The binary array forms the dividend,
33967        * the length of the encoding is the divisor. Once computed, the quotient
33968        * forms the dividend for the next step. We stop when the dividend is zerHashes.
33969        * All remainders are stored for later use.
33970        */
33971       while (dividend.length > 0) {
33972         quotient = Array();
33973         x = 0;
33974         for (i = 0; i < dividend.length; i += 1) {
33975           x = (x << 16) + dividend[i];
33976           q = Math.floor(x / divisor);
33977           x -= q * divisor;
33978           if (quotient.length > 0 || q > 0) {
33979             quotient[quotient.length] = q;
33980           }
33981         }
33982         remainders[remainders.length] = x;
33983         dividend = quotient;
33984       }
33985
33986       /* Convert the remainders to the output string */
33987       output = '';
33988       for (i = remainders.length - 1; i >= 0; i--) {
33989         output += encoding.charAt(remainders[i]);
33990       }
33991
33992       /* Append leading zero equivalents */
33993       full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
33994       for (i = output.length; i < full_length; i += 1) {
33995         output = encoding[0] + output;
33996       }
33997       return output;
33998     }
33999
34000     /**
34001      * Convert a raw string to a base-64 string
34002      */
34003
34004     function rstr2b64(input, b64pad) {
34005       var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
34006         output = '',
34007         len = input.length,
34008         i, j, triplet;
34009       b64pad = b64pad || '=';
34010       for (i = 0; i < len; i += 3) {
34011         triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
34012         for (j = 0; j < 4; j += 1) {
34013           if (i * 8 + j * 6 > input.length * 8) {
34014             output += b64pad;
34015           } else {
34016             output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
34017           }
34018         }
34019       }
34020       return output;
34021     }
34022
34023     Hashes = {
34024       /**
34025        * @property {String} version
34026        * @readonly
34027        */
34028       VERSION: '1.0.6',
34029       /**
34030        * @member Hashes
34031        * @class Base64
34032        * @constructor
34033        */
34034       Base64: function() {
34035         // private properties
34036         var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
34037           pad = '=', // default pad according with the RFC standard
34038           utf8 = true; // by default enable UTF-8 support encoding
34039
34040         // public method for encoding
34041         this.encode = function(input) {
34042           var i, j, triplet,
34043             output = '',
34044             len = input.length;
34045
34046           pad = pad || '=';
34047           input = (utf8) ? utf8Encode(input) : input;
34048
34049           for (i = 0; i < len; i += 3) {
34050             triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
34051             for (j = 0; j < 4; j += 1) {
34052               if (i * 8 + j * 6 > len * 8) {
34053                 output += pad;
34054               } else {
34055                 output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
34056               }
34057             }
34058           }
34059           return output;
34060         };
34061
34062         // public method for decoding
34063         this.decode = function(input) {
34064           // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
34065           var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
34066             dec = '',
34067             arr = [];
34068           if (!input) {
34069             return input;
34070           }
34071
34072           i = ac = 0;
34073           input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
34074           //input += '';
34075
34076           do { // unpack four hexets into three octets using index points in b64
34077             h1 = tab.indexOf(input.charAt(i += 1));
34078             h2 = tab.indexOf(input.charAt(i += 1));
34079             h3 = tab.indexOf(input.charAt(i += 1));
34080             h4 = tab.indexOf(input.charAt(i += 1));
34081
34082             bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
34083
34084             o1 = bits >> 16 & 0xff;
34085             o2 = bits >> 8 & 0xff;
34086             o3 = bits & 0xff;
34087             ac += 1;
34088
34089             if (h3 === 64) {
34090               arr[ac] = String.fromCharCode(o1);
34091             } else if (h4 === 64) {
34092               arr[ac] = String.fromCharCode(o1, o2);
34093             } else {
34094               arr[ac] = String.fromCharCode(o1, o2, o3);
34095             }
34096           } while (i < input.length);
34097
34098           dec = arr.join('');
34099           dec = (utf8) ? utf8Decode(dec) : dec;
34100
34101           return dec;
34102         };
34103
34104         // set custom pad string
34105         this.setPad = function(str) {
34106           pad = str || pad;
34107           return this;
34108         };
34109         // set custom tab string characters
34110         this.setTab = function(str) {
34111           tab = str || tab;
34112           return this;
34113         };
34114         this.setUTF8 = function(bool) {
34115           if (typeof bool === 'boolean') {
34116             utf8 = bool;
34117           }
34118           return this;
34119         };
34120       },
34121
34122       /**
34123        * CRC-32 calculation
34124        * @member Hashes
34125        * @method CRC32
34126        * @static
34127        * @param {String} str Input String
34128        * @return {String}
34129        */
34130       CRC32: function(str) {
34131         var crc = 0,
34132           x = 0,
34133           y = 0,
34134           table, i, iTop;
34135         str = utf8Encode(str);
34136
34137         table = [
34138           '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
34139           '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
34140           '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
34141           '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
34142           'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
34143           '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
34144           'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
34145           '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
34146           'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
34147           '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
34148           'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
34149           '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
34150           'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
34151           '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
34152           '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
34153           '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
34154           '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
34155           'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
34156           '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
34157           'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
34158           '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
34159           'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
34160           '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
34161           'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
34162           '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
34163           'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
34164         ].join('');
34165
34166         crc = crc ^ (-1);
34167         for (i = 0, iTop = str.length; i < iTop; i += 1) {
34168           y = (crc ^ str.charCodeAt(i)) & 0xFF;
34169           x = '0x' + table.substr(y * 9, 8);
34170           crc = (crc >>> 8) ^ x;
34171         }
34172         // always return a positive number (that's what >>> 0 does)
34173         return (crc ^ (-1)) >>> 0;
34174       },
34175       /**
34176        * @member Hashes
34177        * @class MD5
34178        * @constructor
34179        * @param {Object} [config]
34180        *
34181        * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
34182        * Digest Algorithm, as defined in RFC 1321.
34183        * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
34184        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
34185        * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
34186        */
34187       MD5: function(options) {
34188         /**
34189          * Private config properties. You may need to tweak these to be compatible with
34190          * the server-side, but the defaults work in most cases.
34191          * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
34192          */
34193         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
34194           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
34195           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
34196
34197         // privileged (public) methods
34198         this.hex = function(s) {
34199           return rstr2hex(rstr(s, utf8), hexcase);
34200         };
34201         this.b64 = function(s) {
34202           return rstr2b64(rstr(s), b64pad);
34203         };
34204         this.any = function(s, e) {
34205           return rstr2any(rstr(s, utf8), e);
34206         };
34207         this.raw = function(s) {
34208           return rstr(s, utf8);
34209         };
34210         this.hex_hmac = function(k, d) {
34211           return rstr2hex(rstr_hmac(k, d), hexcase);
34212         };
34213         this.b64_hmac = function(k, d) {
34214           return rstr2b64(rstr_hmac(k, d), b64pad);
34215         };
34216         this.any_hmac = function(k, d, e) {
34217           return rstr2any(rstr_hmac(k, d), e);
34218         };
34219         /**
34220          * Perform a simple self-test to see if the VM is working
34221          * @return {String} Hexadecimal hash sample
34222          */
34223         this.vm_test = function() {
34224           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
34225         };
34226         /**
34227          * Enable/disable uppercase hexadecimal returned string
34228          * @param {Boolean}
34229          * @return {Object} this
34230          */
34231         this.setUpperCase = function(a) {
34232           if (typeof a === 'boolean') {
34233             hexcase = a;
34234           }
34235           return this;
34236         };
34237         /**
34238          * Defines a base64 pad string
34239          * @param {String} Pad
34240          * @return {Object} this
34241          */
34242         this.setPad = function(a) {
34243           b64pad = a || b64pad;
34244           return this;
34245         };
34246         /**
34247          * Defines a base64 pad string
34248          * @param {Boolean}
34249          * @return {Object} [this]
34250          */
34251         this.setUTF8 = function(a) {
34252           if (typeof a === 'boolean') {
34253             utf8 = a;
34254           }
34255           return this;
34256         };
34257
34258         // private methods
34259
34260         /**
34261          * Calculate the MD5 of a raw string
34262          */
34263
34264         function rstr(s) {
34265           s = (utf8) ? utf8Encode(s) : s;
34266           return binl2rstr(binl(rstr2binl(s), s.length * 8));
34267         }
34268
34269         /**
34270          * Calculate the HMAC-MD5, of a key and some data (raw strings)
34271          */
34272
34273         function rstr_hmac(key, data) {
34274           var bkey, ipad, opad, hash, i;
34275
34276           key = (utf8) ? utf8Encode(key) : key;
34277           data = (utf8) ? utf8Encode(data) : data;
34278           bkey = rstr2binl(key);
34279           if (bkey.length > 16) {
34280             bkey = binl(bkey, key.length * 8);
34281           }
34282
34283           ipad = Array(16), opad = Array(16);
34284           for (i = 0; i < 16; i += 1) {
34285             ipad[i] = bkey[i] ^ 0x36363636;
34286             opad[i] = bkey[i] ^ 0x5C5C5C5C;
34287           }
34288           hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
34289           return binl2rstr(binl(opad.concat(hash), 512 + 128));
34290         }
34291
34292         /**
34293          * Calculate the MD5 of an array of little-endian words, and a bit length.
34294          */
34295
34296         function binl(x, len) {
34297           var i, olda, oldb, oldc, oldd,
34298             a = 1732584193,
34299             b = -271733879,
34300             c = -1732584194,
34301             d = 271733878;
34302
34303           /* append padding */
34304           x[len >> 5] |= 0x80 << ((len) % 32);
34305           x[(((len + 64) >>> 9) << 4) + 14] = len;
34306
34307           for (i = 0; i < x.length; i += 16) {
34308             olda = a;
34309             oldb = b;
34310             oldc = c;
34311             oldd = d;
34312
34313             a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
34314             d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
34315             c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
34316             b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
34317             a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
34318             d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
34319             c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
34320             b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
34321             a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
34322             d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
34323             c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
34324             b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
34325             a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
34326             d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
34327             c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
34328             b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
34329
34330             a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
34331             d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
34332             c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
34333             b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
34334             a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
34335             d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
34336             c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
34337             b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
34338             a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
34339             d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
34340             c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
34341             b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
34342             a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
34343             d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
34344             c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
34345             b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
34346
34347             a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
34348             d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
34349             c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
34350             b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
34351             a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
34352             d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
34353             c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
34354             b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
34355             a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
34356             d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
34357             c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
34358             b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
34359             a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
34360             d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
34361             c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
34362             b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
34363
34364             a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
34365             d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
34366             c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
34367             b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
34368             a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
34369             d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
34370             c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
34371             b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
34372             a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
34373             d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
34374             c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
34375             b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
34376             a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
34377             d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
34378             c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
34379             b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
34380
34381             a = safe_add(a, olda);
34382             b = safe_add(b, oldb);
34383             c = safe_add(c, oldc);
34384             d = safe_add(d, oldd);
34385           }
34386           return Array(a, b, c, d);
34387         }
34388
34389         /**
34390          * These functions implement the four basic operations the algorithm uses.
34391          */
34392
34393         function md5_cmn(q, a, b, x, s, t) {
34394           return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
34395         }
34396
34397         function md5_ff(a, b, c, d, x, s, t) {
34398           return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
34399         }
34400
34401         function md5_gg(a, b, c, d, x, s, t) {
34402           return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
34403         }
34404
34405         function md5_hh(a, b, c, d, x, s, t) {
34406           return md5_cmn(b ^ c ^ d, a, b, x, s, t);
34407         }
34408
34409         function md5_ii(a, b, c, d, x, s, t) {
34410           return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
34411         }
34412       },
34413       /**
34414        * @member Hashes
34415        * @class Hashes.SHA1
34416        * @param {Object} [config]
34417        * @constructor
34418        *
34419        * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
34420        * Version 2.2 Copyright Paul Johnston 2000 - 2009.
34421        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
34422        * See http://pajhome.org.uk/crypt/md5 for details.
34423        */
34424       SHA1: function(options) {
34425         /**
34426          * Private config properties. You may need to tweak these to be compatible with
34427          * the server-side, but the defaults work in most cases.
34428          * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
34429          */
34430         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
34431           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
34432           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
34433
34434         // public methods
34435         this.hex = function(s) {
34436           return rstr2hex(rstr(s, utf8), hexcase);
34437         };
34438         this.b64 = function(s) {
34439           return rstr2b64(rstr(s, utf8), b64pad);
34440         };
34441         this.any = function(s, e) {
34442           return rstr2any(rstr(s, utf8), e);
34443         };
34444         this.raw = function(s) {
34445           return rstr(s, utf8);
34446         };
34447         this.hex_hmac = function(k, d) {
34448           return rstr2hex(rstr_hmac(k, d));
34449         };
34450         this.b64_hmac = function(k, d) {
34451           return rstr2b64(rstr_hmac(k, d), b64pad);
34452         };
34453         this.any_hmac = function(k, d, e) {
34454           return rstr2any(rstr_hmac(k, d), e);
34455         };
34456         /**
34457          * Perform a simple self-test to see if the VM is working
34458          * @return {String} Hexadecimal hash sample
34459          * @public
34460          */
34461         this.vm_test = function() {
34462           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
34463         };
34464         /**
34465          * @description Enable/disable uppercase hexadecimal returned string
34466          * @param {boolean}
34467          * @return {Object} this
34468          * @public
34469          */
34470         this.setUpperCase = function(a) {
34471           if (typeof a === 'boolean') {
34472             hexcase = a;
34473           }
34474           return this;
34475         };
34476         /**
34477          * @description Defines a base64 pad string
34478          * @param {string} Pad
34479          * @return {Object} this
34480          * @public
34481          */
34482         this.setPad = function(a) {
34483           b64pad = a || b64pad;
34484           return this;
34485         };
34486         /**
34487          * @description Defines a base64 pad string
34488          * @param {boolean}
34489          * @return {Object} this
34490          * @public
34491          */
34492         this.setUTF8 = function(a) {
34493           if (typeof a === 'boolean') {
34494             utf8 = a;
34495           }
34496           return this;
34497         };
34498
34499         // private methods
34500
34501         /**
34502          * Calculate the SHA-512 of a raw string
34503          */
34504
34505         function rstr(s) {
34506           s = (utf8) ? utf8Encode(s) : s;
34507           return binb2rstr(binb(rstr2binb(s), s.length * 8));
34508         }
34509
34510         /**
34511          * Calculate the HMAC-SHA1 of a key and some data (raw strings)
34512          */
34513
34514         function rstr_hmac(key, data) {
34515           var bkey, ipad, opad, i, hash;
34516           key = (utf8) ? utf8Encode(key) : key;
34517           data = (utf8) ? utf8Encode(data) : data;
34518           bkey = rstr2binb(key);
34519
34520           if (bkey.length > 16) {
34521             bkey = binb(bkey, key.length * 8);
34522           }
34523           ipad = Array(16), opad = Array(16);
34524           for (i = 0; i < 16; i += 1) {
34525             ipad[i] = bkey[i] ^ 0x36363636;
34526             opad[i] = bkey[i] ^ 0x5C5C5C5C;
34527           }
34528           hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
34529           return binb2rstr(binb(opad.concat(hash), 512 + 160));
34530         }
34531
34532         /**
34533          * Calculate the SHA-1 of an array of big-endian words, and a bit length
34534          */
34535
34536         function binb(x, len) {
34537           var i, j, t, olda, oldb, oldc, oldd, olde,
34538             w = Array(80),
34539             a = 1732584193,
34540             b = -271733879,
34541             c = -1732584194,
34542             d = 271733878,
34543             e = -1009589776;
34544
34545           /* append padding */
34546           x[len >> 5] |= 0x80 << (24 - len % 32);
34547           x[((len + 64 >> 9) << 4) + 15] = len;
34548
34549           for (i = 0; i < x.length; i += 16) {
34550             olda = a;
34551             oldb = b;
34552             oldc = c;
34553             oldd = d;
34554             olde = e;
34555
34556             for (j = 0; j < 80; j += 1) {
34557               if (j < 16) {
34558                 w[j] = x[i + j];
34559               } else {
34560                 w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
34561               }
34562               t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
34563                 safe_add(safe_add(e, w[j]), sha1_kt(j)));
34564               e = d;
34565               d = c;
34566               c = bit_rol(b, 30);
34567               b = a;
34568               a = t;
34569             }
34570
34571             a = safe_add(a, olda);
34572             b = safe_add(b, oldb);
34573             c = safe_add(c, oldc);
34574             d = safe_add(d, oldd);
34575             e = safe_add(e, olde);
34576           }
34577           return Array(a, b, c, d, e);
34578         }
34579
34580         /**
34581          * Perform the appropriate triplet combination function for the current
34582          * iteration
34583          */
34584
34585         function sha1_ft(t, b, c, d) {
34586           if (t < 20) {
34587             return (b & c) | ((~b) & d);
34588           }
34589           if (t < 40) {
34590             return b ^ c ^ d;
34591           }
34592           if (t < 60) {
34593             return (b & c) | (b & d) | (c & d);
34594           }
34595           return b ^ c ^ d;
34596         }
34597
34598         /**
34599          * Determine the appropriate additive constant for the current iteration
34600          */
34601
34602         function sha1_kt(t) {
34603           return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
34604             (t < 60) ? -1894007588 : -899497514;
34605         }
34606       },
34607       /**
34608        * @class Hashes.SHA256
34609        * @param {config}
34610        *
34611        * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
34612        * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
34613        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
34614        * See http://pajhome.org.uk/crypt/md5 for details.
34615        * Also http://anmar.eu.org/projects/jssha2/
34616        */
34617       SHA256: function(options) {
34618         /**
34619          * Private properties configuration variables. You may need to tweak these to be compatible with
34620          * the server-side, but the defaults work in most cases.
34621          * @see this.setUpperCase() method
34622          * @see this.setPad() method
34623          */
34624         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase  */
34625           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
34626           /* base-64 pad character. Default '=' for strict RFC compliance   */
34627           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
34628           /* enable/disable utf8 encoding */
34629           sha256_K;
34630
34631         /* privileged (public) methods */
34632         this.hex = function(s) {
34633           return rstr2hex(rstr(s, utf8));
34634         };
34635         this.b64 = function(s) {
34636           return rstr2b64(rstr(s, utf8), b64pad);
34637         };
34638         this.any = function(s, e) {
34639           return rstr2any(rstr(s, utf8), e);
34640         };
34641         this.raw = function(s) {
34642           return rstr(s, utf8);
34643         };
34644         this.hex_hmac = function(k, d) {
34645           return rstr2hex(rstr_hmac(k, d));
34646         };
34647         this.b64_hmac = function(k, d) {
34648           return rstr2b64(rstr_hmac(k, d), b64pad);
34649         };
34650         this.any_hmac = function(k, d, e) {
34651           return rstr2any(rstr_hmac(k, d), e);
34652         };
34653         /**
34654          * Perform a simple self-test to see if the VM is working
34655          * @return {String} Hexadecimal hash sample
34656          * @public
34657          */
34658         this.vm_test = function() {
34659           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
34660         };
34661         /**
34662          * Enable/disable uppercase hexadecimal returned string
34663          * @param {boolean}
34664          * @return {Object} this
34665          * @public
34666          */
34667         this.setUpperCase = function(a) {
34668           if (typeof a === 'boolean') {
34669             hexcase = a;
34670           }
34671           return this;
34672         };
34673         /**
34674          * @description Defines a base64 pad string
34675          * @param {string} Pad
34676          * @return {Object} this
34677          * @public
34678          */
34679         this.setPad = function(a) {
34680           b64pad = a || b64pad;
34681           return this;
34682         };
34683         /**
34684          * Defines a base64 pad string
34685          * @param {boolean}
34686          * @return {Object} this
34687          * @public
34688          */
34689         this.setUTF8 = function(a) {
34690           if (typeof a === 'boolean') {
34691             utf8 = a;
34692           }
34693           return this;
34694         };
34695
34696         // private methods
34697
34698         /**
34699          * Calculate the SHA-512 of a raw string
34700          */
34701
34702         function rstr(s, utf8) {
34703           s = (utf8) ? utf8Encode(s) : s;
34704           return binb2rstr(binb(rstr2binb(s), s.length * 8));
34705         }
34706
34707         /**
34708          * Calculate the HMAC-sha256 of a key and some data (raw strings)
34709          */
34710
34711         function rstr_hmac(key, data) {
34712           key = (utf8) ? utf8Encode(key) : key;
34713           data = (utf8) ? utf8Encode(data) : data;
34714           var hash, i = 0,
34715             bkey = rstr2binb(key),
34716             ipad = Array(16),
34717             opad = Array(16);
34718
34719           if (bkey.length > 16) {
34720             bkey = binb(bkey, key.length * 8);
34721           }
34722
34723           for (; i < 16; i += 1) {
34724             ipad[i] = bkey[i] ^ 0x36363636;
34725             opad[i] = bkey[i] ^ 0x5C5C5C5C;
34726           }
34727
34728           hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
34729           return binb2rstr(binb(opad.concat(hash), 512 + 256));
34730         }
34731
34732         /*
34733          * Main sha256 function, with its support functions
34734          */
34735
34736         function sha256_S(X, n) {
34737           return (X >>> n) | (X << (32 - n));
34738         }
34739
34740         function sha256_R(X, n) {
34741           return (X >>> n);
34742         }
34743
34744         function sha256_Ch(x, y, z) {
34745           return ((x & y) ^ ((~x) & z));
34746         }
34747
34748         function sha256_Maj(x, y, z) {
34749           return ((x & y) ^ (x & z) ^ (y & z));
34750         }
34751
34752         function sha256_Sigma0256(x) {
34753           return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
34754         }
34755
34756         function sha256_Sigma1256(x) {
34757           return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
34758         }
34759
34760         function sha256_Gamma0256(x) {
34761           return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
34762         }
34763
34764         function sha256_Gamma1256(x) {
34765           return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
34766         }
34767
34768         sha256_K = [
34769           1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
34770           1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
34771           264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
34772           113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
34773           1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
34774           430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
34775           1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998
34776         ];
34777
34778         function binb(m, l) {
34779           var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
34780             1359893119, -1694144372, 528734635, 1541459225
34781           ];
34782           var W = new Array(64);
34783           var a, b, c, d, e, f, g, h;
34784           var i, j, T1, T2;
34785
34786           /* append padding */
34787           m[l >> 5] |= 0x80 << (24 - l % 32);
34788           m[((l + 64 >> 9) << 4) + 15] = l;
34789
34790           for (i = 0; i < m.length; i += 16) {
34791             a = HASH[0];
34792             b = HASH[1];
34793             c = HASH[2];
34794             d = HASH[3];
34795             e = HASH[4];
34796             f = HASH[5];
34797             g = HASH[6];
34798             h = HASH[7];
34799
34800             for (j = 0; j < 64; j += 1) {
34801               if (j < 16) {
34802                 W[j] = m[j + i];
34803               } else {
34804                 W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
34805                   sha256_Gamma0256(W[j - 15])), W[j - 16]);
34806               }
34807
34808               T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
34809                 sha256_K[j]), W[j]);
34810               T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
34811               h = g;
34812               g = f;
34813               f = e;
34814               e = safe_add(d, T1);
34815               d = c;
34816               c = b;
34817               b = a;
34818               a = safe_add(T1, T2);
34819             }
34820
34821             HASH[0] = safe_add(a, HASH[0]);
34822             HASH[1] = safe_add(b, HASH[1]);
34823             HASH[2] = safe_add(c, HASH[2]);
34824             HASH[3] = safe_add(d, HASH[3]);
34825             HASH[4] = safe_add(e, HASH[4]);
34826             HASH[5] = safe_add(f, HASH[5]);
34827             HASH[6] = safe_add(g, HASH[6]);
34828             HASH[7] = safe_add(h, HASH[7]);
34829           }
34830           return HASH;
34831         }
34832
34833       },
34834
34835       /**
34836        * @class Hashes.SHA512
34837        * @param {config}
34838        *
34839        * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
34840        * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
34841        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
34842        * See http://pajhome.org.uk/crypt/md5 for details.
34843        */
34844       SHA512: function(options) {
34845         /**
34846          * Private properties configuration variables. You may need to tweak these to be compatible with
34847          * the server-side, but the defaults work in most cases.
34848          * @see this.setUpperCase() method
34849          * @see this.setPad() method
34850          */
34851         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
34852           /* hexadecimal output case format. false - lowercase; true - uppercase  */
34853           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
34854           /* base-64 pad character. Default '=' for strict RFC compliance   */
34855           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
34856           /* enable/disable utf8 encoding */
34857           sha512_k;
34858
34859         /* privileged (public) methods */
34860         this.hex = function(s) {
34861           return rstr2hex(rstr(s));
34862         };
34863         this.b64 = function(s) {
34864           return rstr2b64(rstr(s), b64pad);
34865         };
34866         this.any = function(s, e) {
34867           return rstr2any(rstr(s), e);
34868         };
34869         this.raw = function(s) {
34870           return rstr(s, utf8);
34871         };
34872         this.hex_hmac = function(k, d) {
34873           return rstr2hex(rstr_hmac(k, d));
34874         };
34875         this.b64_hmac = function(k, d) {
34876           return rstr2b64(rstr_hmac(k, d), b64pad);
34877         };
34878         this.any_hmac = function(k, d, e) {
34879           return rstr2any(rstr_hmac(k, d), e);
34880         };
34881         /**
34882          * Perform a simple self-test to see if the VM is working
34883          * @return {String} Hexadecimal hash sample
34884          * @public
34885          */
34886         this.vm_test = function() {
34887           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
34888         };
34889         /**
34890          * @description Enable/disable uppercase hexadecimal returned string
34891          * @param {boolean}
34892          * @return {Object} this
34893          * @public
34894          */
34895         this.setUpperCase = function(a) {
34896           if (typeof a === 'boolean') {
34897             hexcase = a;
34898           }
34899           return this;
34900         };
34901         /**
34902          * @description Defines a base64 pad string
34903          * @param {string} Pad
34904          * @return {Object} this
34905          * @public
34906          */
34907         this.setPad = function(a) {
34908           b64pad = a || b64pad;
34909           return this;
34910         };
34911         /**
34912          * @description Defines a base64 pad string
34913          * @param {boolean}
34914          * @return {Object} this
34915          * @public
34916          */
34917         this.setUTF8 = function(a) {
34918           if (typeof a === 'boolean') {
34919             utf8 = a;
34920           }
34921           return this;
34922         };
34923
34924         /* private methods */
34925
34926         /**
34927          * Calculate the SHA-512 of a raw string
34928          */
34929
34930         function rstr(s) {
34931           s = (utf8) ? utf8Encode(s) : s;
34932           return binb2rstr(binb(rstr2binb(s), s.length * 8));
34933         }
34934         /*
34935          * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
34936          */
34937
34938         function rstr_hmac(key, data) {
34939           key = (utf8) ? utf8Encode(key) : key;
34940           data = (utf8) ? utf8Encode(data) : data;
34941
34942           var hash, i = 0,
34943             bkey = rstr2binb(key),
34944             ipad = Array(32),
34945             opad = Array(32);
34946
34947           if (bkey.length > 32) {
34948             bkey = binb(bkey, key.length * 8);
34949           }
34950
34951           for (; i < 32; i += 1) {
34952             ipad[i] = bkey[i] ^ 0x36363636;
34953             opad[i] = bkey[i] ^ 0x5C5C5C5C;
34954           }
34955
34956           hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
34957           return binb2rstr(binb(opad.concat(hash), 1024 + 512));
34958         }
34959
34960         /**
34961          * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
34962          */
34963
34964         function binb(x, len) {
34965           var j, i, l,
34966             W = new Array(80),
34967             hash = new Array(16),
34968             //Initial hash values
34969             H = [
34970               new int64(0x6a09e667, -205731576),
34971               new int64(-1150833019, -2067093701),
34972               new int64(0x3c6ef372, -23791573),
34973               new int64(-1521486534, 0x5f1d36f1),
34974               new int64(0x510e527f, -1377402159),
34975               new int64(-1694144372, 0x2b3e6c1f),
34976               new int64(0x1f83d9ab, -79577749),
34977               new int64(0x5be0cd19, 0x137e2179)
34978             ],
34979             T1 = new int64(0, 0),
34980             T2 = new int64(0, 0),
34981             a = new int64(0, 0),
34982             b = new int64(0, 0),
34983             c = new int64(0, 0),
34984             d = new int64(0, 0),
34985             e = new int64(0, 0),
34986             f = new int64(0, 0),
34987             g = new int64(0, 0),
34988             h = new int64(0, 0),
34989             //Temporary variables not specified by the document
34990             s0 = new int64(0, 0),
34991             s1 = new int64(0, 0),
34992             Ch = new int64(0, 0),
34993             Maj = new int64(0, 0),
34994             r1 = new int64(0, 0),
34995             r2 = new int64(0, 0),
34996             r3 = new int64(0, 0);
34997
34998           if (sha512_k === undefined) {
34999             //SHA512 constants
35000             sha512_k = [
35001               new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
35002               new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
35003               new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
35004               new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
35005               new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
35006               new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
35007               new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
35008               new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
35009               new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
35010               new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
35011               new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
35012               new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
35013               new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
35014               new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
35015               new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
35016               new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
35017               new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
35018               new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
35019               new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
35020               new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
35021               new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
35022               new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
35023               new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
35024               new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
35025               new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
35026               new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
35027               new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
35028               new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
35029               new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
35030               new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
35031               new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
35032               new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
35033               new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
35034               new int64(-354779690, -840897762), new int64(-176337025, -294727304),
35035               new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
35036               new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
35037               new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
35038               new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
35039               new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
35040               new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
35041             ];
35042           }
35043
35044           for (i = 0; i < 80; i += 1) {
35045             W[i] = new int64(0, 0);
35046           }
35047
35048           // append padding to the source string. The format is described in the FIPS.
35049           x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
35050           x[((len + 128 >> 10) << 5) + 31] = len;
35051           l = x.length;
35052           for (i = 0; i < l; i += 32) { //32 dwords is the block size
35053             int64copy(a, H[0]);
35054             int64copy(b, H[1]);
35055             int64copy(c, H[2]);
35056             int64copy(d, H[3]);
35057             int64copy(e, H[4]);
35058             int64copy(f, H[5]);
35059             int64copy(g, H[6]);
35060             int64copy(h, H[7]);
35061
35062             for (j = 0; j < 16; j += 1) {
35063               W[j].h = x[i + 2 * j];
35064               W[j].l = x[i + 2 * j + 1];
35065             }
35066
35067             for (j = 16; j < 80; j += 1) {
35068               //sigma1
35069               int64rrot(r1, W[j - 2], 19);
35070               int64revrrot(r2, W[j - 2], 29);
35071               int64shr(r3, W[j - 2], 6);
35072               s1.l = r1.l ^ r2.l ^ r3.l;
35073               s1.h = r1.h ^ r2.h ^ r3.h;
35074               //sigma0
35075               int64rrot(r1, W[j - 15], 1);
35076               int64rrot(r2, W[j - 15], 8);
35077               int64shr(r3, W[j - 15], 7);
35078               s0.l = r1.l ^ r2.l ^ r3.l;
35079               s0.h = r1.h ^ r2.h ^ r3.h;
35080
35081               int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
35082             }
35083
35084             for (j = 0; j < 80; j += 1) {
35085               //Ch
35086               Ch.l = (e.l & f.l) ^ (~e.l & g.l);
35087               Ch.h = (e.h & f.h) ^ (~e.h & g.h);
35088
35089               //Sigma1
35090               int64rrot(r1, e, 14);
35091               int64rrot(r2, e, 18);
35092               int64revrrot(r3, e, 9);
35093               s1.l = r1.l ^ r2.l ^ r3.l;
35094               s1.h = r1.h ^ r2.h ^ r3.h;
35095
35096               //Sigma0
35097               int64rrot(r1, a, 28);
35098               int64revrrot(r2, a, 2);
35099               int64revrrot(r3, a, 7);
35100               s0.l = r1.l ^ r2.l ^ r3.l;
35101               s0.h = r1.h ^ r2.h ^ r3.h;
35102
35103               //Maj
35104               Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
35105               Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
35106
35107               int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
35108               int64add(T2, s0, Maj);
35109
35110               int64copy(h, g);
35111               int64copy(g, f);
35112               int64copy(f, e);
35113               int64add(e, d, T1);
35114               int64copy(d, c);
35115               int64copy(c, b);
35116               int64copy(b, a);
35117               int64add(a, T1, T2);
35118             }
35119             int64add(H[0], H[0], a);
35120             int64add(H[1], H[1], b);
35121             int64add(H[2], H[2], c);
35122             int64add(H[3], H[3], d);
35123             int64add(H[4], H[4], e);
35124             int64add(H[5], H[5], f);
35125             int64add(H[6], H[6], g);
35126             int64add(H[7], H[7], h);
35127           }
35128
35129           //represent the hash as an array of 32-bit dwords
35130           for (i = 0; i < 8; i += 1) {
35131             hash[2 * i] = H[i].h;
35132             hash[2 * i + 1] = H[i].l;
35133           }
35134           return hash;
35135         }
35136
35137         //A constructor for 64-bit numbers
35138
35139         function int64(h, l) {
35140           this.h = h;
35141           this.l = l;
35142           //this.toString = int64toString;
35143         }
35144
35145         //Copies src into dst, assuming both are 64-bit numbers
35146
35147         function int64copy(dst, src) {
35148           dst.h = src.h;
35149           dst.l = src.l;
35150         }
35151
35152         //Right-rotates a 64-bit number by shift
35153         //Won't handle cases of shift>=32
35154         //The function revrrot() is for that
35155
35156         function int64rrot(dst, x, shift) {
35157           dst.l = (x.l >>> shift) | (x.h << (32 - shift));
35158           dst.h = (x.h >>> shift) | (x.l << (32 - shift));
35159         }
35160
35161         //Reverses the dwords of the source and then rotates right by shift.
35162         //This is equivalent to rotation by 32+shift
35163
35164         function int64revrrot(dst, x, shift) {
35165           dst.l = (x.h >>> shift) | (x.l << (32 - shift));
35166           dst.h = (x.l >>> shift) | (x.h << (32 - shift));
35167         }
35168
35169         //Bitwise-shifts right a 64-bit number by shift
35170         //Won't handle shift>=32, but it's never needed in SHA512
35171
35172         function int64shr(dst, x, shift) {
35173           dst.l = (x.l >>> shift) | (x.h << (32 - shift));
35174           dst.h = (x.h >>> shift);
35175         }
35176
35177         //Adds two 64-bit numbers
35178         //Like the original implementation, does not rely on 32-bit operations
35179
35180         function int64add(dst, x, y) {
35181           var w0 = (x.l & 0xffff) + (y.l & 0xffff);
35182           var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
35183           var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
35184           var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
35185           dst.l = (w0 & 0xffff) | (w1 << 16);
35186           dst.h = (w2 & 0xffff) | (w3 << 16);
35187         }
35188
35189         //Same, except with 4 addends. Works faster than adding them one by one.
35190
35191         function int64add4(dst, a, b, c, d) {
35192           var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
35193           var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
35194           var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
35195           var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
35196           dst.l = (w0 & 0xffff) | (w1 << 16);
35197           dst.h = (w2 & 0xffff) | (w3 << 16);
35198         }
35199
35200         //Same, except with 5 addends
35201
35202         function int64add5(dst, a, b, c, d, e) {
35203           var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
35204             w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
35205             w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
35206             w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
35207           dst.l = (w0 & 0xffff) | (w1 << 16);
35208           dst.h = (w2 & 0xffff) | (w3 << 16);
35209         }
35210       },
35211       /**
35212        * @class Hashes.RMD160
35213        * @constructor
35214        * @param {Object} [config]
35215        *
35216        * A JavaScript implementation of the RIPEMD-160 Algorithm
35217        * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
35218        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
35219        * See http://pajhome.org.uk/crypt/md5 for details.
35220        * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
35221        */
35222       RMD160: function(options) {
35223         /**
35224          * Private properties configuration variables. You may need to tweak these to be compatible with
35225          * the server-side, but the defaults work in most cases.
35226          * @see this.setUpperCase() method
35227          * @see this.setPad() method
35228          */
35229         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
35230           /* hexadecimal output case format. false - lowercase; true - uppercase  */
35231           b64pad = (options && typeof options.pad === 'string') ? options.pa : '=',
35232           /* base-64 pad character. Default '=' for strict RFC compliance   */
35233           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
35234           /* enable/disable utf8 encoding */
35235           rmd160_r1 = [
35236             0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
35237             7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
35238             3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
35239             1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
35240             4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
35241           ],
35242           rmd160_r2 = [
35243             5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
35244             6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
35245             15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
35246             8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
35247             12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
35248           ],
35249           rmd160_s1 = [
35250             11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
35251             7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
35252             11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
35253             11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
35254             9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
35255           ],
35256           rmd160_s2 = [
35257             8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
35258             9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
35259             9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
35260             15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
35261             8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
35262           ];
35263
35264         /* privileged (public) methods */
35265         this.hex = function(s) {
35266           return rstr2hex(rstr(s, utf8));
35267         };
35268         this.b64 = function(s) {
35269           return rstr2b64(rstr(s, utf8), b64pad);
35270         };
35271         this.any = function(s, e) {
35272           return rstr2any(rstr(s, utf8), e);
35273         };
35274         this.raw = function(s) {
35275           return rstr(s, utf8);
35276         };
35277         this.hex_hmac = function(k, d) {
35278           return rstr2hex(rstr_hmac(k, d));
35279         };
35280         this.b64_hmac = function(k, d) {
35281           return rstr2b64(rstr_hmac(k, d), b64pad);
35282         };
35283         this.any_hmac = function(k, d, e) {
35284           return rstr2any(rstr_hmac(k, d), e);
35285         };
35286         /**
35287          * Perform a simple self-test to see if the VM is working
35288          * @return {String} Hexadecimal hash sample
35289          * @public
35290          */
35291         this.vm_test = function() {
35292           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
35293         };
35294         /**
35295          * @description Enable/disable uppercase hexadecimal returned string
35296          * @param {boolean}
35297          * @return {Object} this
35298          * @public
35299          */
35300         this.setUpperCase = function(a) {
35301           if (typeof a === 'boolean') {
35302             hexcase = a;
35303           }
35304           return this;
35305         };
35306         /**
35307          * @description Defines a base64 pad string
35308          * @param {string} Pad
35309          * @return {Object} this
35310          * @public
35311          */
35312         this.setPad = function(a) {
35313           if (typeof a !== 'undefined') {
35314             b64pad = a;
35315           }
35316           return this;
35317         };
35318         /**
35319          * @description Defines a base64 pad string
35320          * @param {boolean}
35321          * @return {Object} this
35322          * @public
35323          */
35324         this.setUTF8 = function(a) {
35325           if (typeof a === 'boolean') {
35326             utf8 = a;
35327           }
35328           return this;
35329         };
35330
35331         /* private methods */
35332
35333         /**
35334          * Calculate the rmd160 of a raw string
35335          */
35336
35337         function rstr(s) {
35338           s = (utf8) ? utf8Encode(s) : s;
35339           return binl2rstr(binl(rstr2binl(s), s.length * 8));
35340         }
35341
35342         /**
35343          * Calculate the HMAC-rmd160 of a key and some data (raw strings)
35344          */
35345
35346         function rstr_hmac(key, data) {
35347           key = (utf8) ? utf8Encode(key) : key;
35348           data = (utf8) ? utf8Encode(data) : data;
35349           var i, hash,
35350             bkey = rstr2binl(key),
35351             ipad = Array(16),
35352             opad = Array(16);
35353
35354           if (bkey.length > 16) {
35355             bkey = binl(bkey, key.length * 8);
35356           }
35357
35358           for (i = 0; i < 16; i += 1) {
35359             ipad[i] = bkey[i] ^ 0x36363636;
35360             opad[i] = bkey[i] ^ 0x5C5C5C5C;
35361           }
35362           hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
35363           return binl2rstr(binl(opad.concat(hash), 512 + 160));
35364         }
35365
35366         /**
35367          * Convert an array of little-endian words to a string
35368          */
35369
35370         function binl2rstr(input) {
35371           var i, output = '',
35372             l = input.length * 32;
35373           for (i = 0; i < l; i += 8) {
35374             output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
35375           }
35376           return output;
35377         }
35378
35379         /**
35380          * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
35381          */
35382
35383         function binl(x, len) {
35384           var T, j, i, l,
35385             h0 = 0x67452301,
35386             h1 = 0xefcdab89,
35387             h2 = 0x98badcfe,
35388             h3 = 0x10325476,
35389             h4 = 0xc3d2e1f0,
35390             A1, B1, C1, D1, E1,
35391             A2, B2, C2, D2, E2;
35392
35393           /* append padding */
35394           x[len >> 5] |= 0x80 << (len % 32);
35395           x[(((len + 64) >>> 9) << 4) + 14] = len;
35396           l = x.length;
35397
35398           for (i = 0; i < l; i += 16) {
35399             A1 = A2 = h0;
35400             B1 = B2 = h1;
35401             C1 = C2 = h2;
35402             D1 = D2 = h3;
35403             E1 = E2 = h4;
35404             for (j = 0; j <= 79; j += 1) {
35405               T = safe_add(A1, rmd160_f(j, B1, C1, D1));
35406               T = safe_add(T, x[i + rmd160_r1[j]]);
35407               T = safe_add(T, rmd160_K1(j));
35408               T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
35409               A1 = E1;
35410               E1 = D1;
35411               D1 = bit_rol(C1, 10);
35412               C1 = B1;
35413               B1 = T;
35414               T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
35415               T = safe_add(T, x[i + rmd160_r2[j]]);
35416               T = safe_add(T, rmd160_K2(j));
35417               T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
35418               A2 = E2;
35419               E2 = D2;
35420               D2 = bit_rol(C2, 10);
35421               C2 = B2;
35422               B2 = T;
35423             }
35424
35425             T = safe_add(h1, safe_add(C1, D2));
35426             h1 = safe_add(h2, safe_add(D1, E2));
35427             h2 = safe_add(h3, safe_add(E1, A2));
35428             h3 = safe_add(h4, safe_add(A1, B2));
35429             h4 = safe_add(h0, safe_add(B1, C2));
35430             h0 = T;
35431           }
35432           return [h0, h1, h2, h3, h4];
35433         }
35434
35435         // specific algorithm methods
35436
35437         function rmd160_f(j, x, y, z) {
35438           return (0 <= j && j <= 15) ? (x ^ y ^ z) :
35439             (16 <= j && j <= 31) ? (x & y) | (~x & z) :
35440             (32 <= j && j <= 47) ? (x | ~y) ^ z :
35441             (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
35442             (64 <= j && j <= 79) ? x ^ (y | ~z) :
35443             'rmd160_f: j out of range';
35444         }
35445
35446         function rmd160_K1(j) {
35447           return (0 <= j && j <= 15) ? 0x00000000 :
35448             (16 <= j && j <= 31) ? 0x5a827999 :
35449             (32 <= j && j <= 47) ? 0x6ed9eba1 :
35450             (48 <= j && j <= 63) ? 0x8f1bbcdc :
35451             (64 <= j && j <= 79) ? 0xa953fd4e :
35452             'rmd160_K1: j out of range';
35453         }
35454
35455         function rmd160_K2(j) {
35456           return (0 <= j && j <= 15) ? 0x50a28be6 :
35457             (16 <= j && j <= 31) ? 0x5c4dd124 :
35458             (32 <= j && j <= 47) ? 0x6d703ef3 :
35459             (48 <= j && j <= 63) ? 0x7a6d76e9 :
35460             (64 <= j && j <= 79) ? 0x00000000 :
35461             'rmd160_K2: j out of range';
35462         }
35463       }
35464     };
35465
35466     // exposes Hashes
35467     (function(window, undefined) {
35468       var freeExports = false;
35469       {
35470         freeExports = exports;
35471         if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
35472           window = commonjsGlobal;
35473         }
35474       }
35475
35476       if (typeof undefined === 'function' && typeof undefined.amd === 'object' && undefined.amd) {
35477         // define as an anonymous module, so, through path mapping, it can be aliased
35478         undefined(function() {
35479           return Hashes;
35480         });
35481       } else if (freeExports) {
35482         // in Node.js or RingoJS v0.8.0+
35483         if ('object' === 'object' && module && module.exports === freeExports) {
35484           module.exports = Hashes;
35485         }
35486         // in Narwhal or RingoJS v0.7.0-
35487         else {
35488           freeExports.Hashes = Hashes;
35489         }
35490       } else {
35491         // in a browser or Rhino
35492         window.Hashes = Hashes;
35493       }
35494     }(this));
35495   }()); // IIFE
35496   });
35497
35498   var immutable = extend$2;
35499
35500   var hasOwnProperty$16 = Object.prototype.hasOwnProperty;
35501
35502   function extend$2() {
35503       var target = {};
35504
35505       for (var i = 0; i < arguments.length; i++) {
35506           var source = arguments[i];
35507
35508           for (var key in source) {
35509               if (hasOwnProperty$16.call(source, key)) {
35510                   target[key] = source[key];
35511               }
35512           }
35513       }
35514
35515       return target
35516   }
35517
35518   var sha1 = new hashes.SHA1();
35519
35520   var ohauth = {};
35521
35522   ohauth.qsString = function(obj) {
35523       return Object.keys(obj).sort().map(function(key) {
35524           return ohauth.percentEncode(key) + '=' +
35525               ohauth.percentEncode(obj[key]);
35526       }).join('&');
35527   };
35528
35529   ohauth.stringQs = function(str) {
35530       return str.split('&').filter(function (pair) {
35531           return pair !== '';
35532       }).reduce(function(obj, pair){
35533           var parts = pair.split('=');
35534           obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
35535               '' : decodeURIComponent(parts[1]);
35536           return obj;
35537       }, {});
35538   };
35539
35540   ohauth.rawxhr = function(method, url, data, headers, callback) {
35541       var xhr = new XMLHttpRequest(),
35542           twoHundred = /^20\d$/;
35543       xhr.onreadystatechange = function() {
35544           if (4 === xhr.readyState && 0 !== xhr.status) {
35545               if (twoHundred.test(xhr.status)) callback(null, xhr);
35546               else return callback(xhr, null);
35547           }
35548       };
35549       xhr.onerror = function(e) { return callback(e, null); };
35550       xhr.open(method, url, true);
35551       for (var h in headers) xhr.setRequestHeader(h, headers[h]);
35552       xhr.send(data);
35553       return xhr;
35554   };
35555
35556   ohauth.xhr = function(method, url, auth, data, options, callback) {
35557       var headers = (options && options.header) || {
35558           'Content-Type': 'application/x-www-form-urlencoded'
35559       };
35560       headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
35561       return ohauth.rawxhr(method, url, data, headers, callback);
35562   };
35563
35564   ohauth.nonce = function() {
35565       for (var o = ''; o.length < 6;) {
35566           o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
35567       }
35568       return o;
35569   };
35570
35571   ohauth.authHeader = function(obj) {
35572       return Object.keys(obj).sort().map(function(key) {
35573           return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
35574       }).join(', ');
35575   };
35576
35577   ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
35578
35579   ohauth.percentEncode = function(s) {
35580       return encodeURIComponent(s)
35581           .replace(/\!/g, '%21').replace(/\'/g, '%27')
35582           .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
35583   };
35584
35585   ohauth.baseString = function(method, url, params) {
35586       if (params.oauth_signature) delete params.oauth_signature;
35587       return [
35588           method,
35589           ohauth.percentEncode(url),
35590           ohauth.percentEncode(ohauth.qsString(params))].join('&');
35591   };
35592
35593   ohauth.signature = function(oauth_secret, token_secret, baseString) {
35594       return sha1.b64_hmac(
35595           ohauth.percentEncode(oauth_secret) + '&' +
35596           ohauth.percentEncode(token_secret),
35597           baseString);
35598   };
35599
35600   /**
35601    * Takes an options object for configuration (consumer_key,
35602    * consumer_secret, version, signature_method, token, token_secret)
35603    * and returns a function that generates the Authorization header
35604    * for given data.
35605    *
35606    * The returned function takes these parameters:
35607    * - method: GET/POST/...
35608    * - uri: full URI with protocol, port, path and query string
35609    * - extra_params: any extra parameters (that are passed in the POST data),
35610    *   can be an object or a from-urlencoded string.
35611    *
35612    * Returned function returns full OAuth header with "OAuth" string in it.
35613    */
35614
35615   ohauth.headerGenerator = function(options) {
35616       options = options || {};
35617       var consumer_key = options.consumer_key || '',
35618           consumer_secret = options.consumer_secret || '',
35619           signature_method = options.signature_method || 'HMAC-SHA1',
35620           version = options.version || '1.0',
35621           token = options.token || '',
35622           token_secret = options.token_secret || '';
35623
35624       return function(method, uri, extra_params) {
35625           method = method.toUpperCase();
35626           if (typeof extra_params === 'string' && extra_params.length > 0) {
35627               extra_params = ohauth.stringQs(extra_params);
35628           }
35629
35630           var uri_parts = uri.split('?', 2),
35631           base_uri = uri_parts[0];
35632
35633           var query_params = uri_parts.length === 2 ?
35634               ohauth.stringQs(uri_parts[1]) : {};
35635
35636           var oauth_params = {
35637               oauth_consumer_key: consumer_key,
35638               oauth_signature_method: signature_method,
35639               oauth_version: version,
35640               oauth_timestamp: ohauth.timestamp(),
35641               oauth_nonce: ohauth.nonce()
35642           };
35643
35644           if (token) oauth_params.oauth_token = token;
35645
35646           var all_params = immutable({}, oauth_params, query_params, extra_params),
35647               base_str = ohauth.baseString(method, base_uri, all_params);
35648
35649           oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
35650
35651           return 'OAuth ' + ohauth.authHeader(oauth_params);
35652       };
35653   };
35654
35655   var ohauth_1 = ohauth;
35656
35657   var resolveUrl = createCommonjsModule(function (module, exports) {
35658   // Copyright 2014 Simon Lydell
35659   // X11 (“MIT”) Licensed. (See LICENSE.)
35660
35661   void (function(root, factory) {
35662     if (typeof undefined === "function" && undefined.amd) {
35663       undefined(factory);
35664     } else {
35665       module.exports = factory();
35666     }
35667   }(commonjsGlobal, function() {
35668
35669     function resolveUrl(/* ...urls */) {
35670       var numUrls = arguments.length;
35671
35672       if (numUrls === 0) {
35673         throw new Error("resolveUrl requires at least one argument; got none.")
35674       }
35675
35676       var base = document.createElement("base");
35677       base.href = arguments[0];
35678
35679       if (numUrls === 1) {
35680         return base.href
35681       }
35682
35683       var head = document.getElementsByTagName("head")[0];
35684       head.insertBefore(base, head.firstChild);
35685
35686       var a = document.createElement("a");
35687       var resolved;
35688
35689       for (var index = 1; index < numUrls; index++) {
35690         a.href = arguments[index];
35691         resolved = a.href;
35692         base.href = resolved;
35693       }
35694
35695       head.removeChild(base);
35696
35697       return resolved
35698     }
35699
35700     return resolveUrl
35701
35702   }));
35703   });
35704
35705   var assign$1 = make_assign();
35706   var create$2 = make_create();
35707   var trim = make_trim();
35708   var Global = (typeof window !== 'undefined' ? window : commonjsGlobal);
35709
35710   var util = {
35711         assign: assign$1,
35712         create: create$2,
35713         trim: trim,
35714         bind: bind,
35715         slice: slice$7,
35716         each: each,
35717         map: map$4,
35718         pluck: pluck,
35719         isList: isList,
35720         isFunction: isFunction$1,
35721         isObject: isObject$1,
35722         Global: Global
35723   };
35724
35725   function make_assign() {
35726         if (Object.assign) {
35727                 return Object.assign
35728         } else {
35729                 return function shimAssign(obj, props1, props2, etc) {
35730                         for (var i = 1; i < arguments.length; i++) {
35731                                 each(Object(arguments[i]), function(val, key) {
35732                                         obj[key] = val;
35733                                 });
35734                         }                       
35735                         return obj
35736                 }
35737         }
35738   }
35739
35740   function make_create() {
35741         if (Object.create) {
35742                 return function create(obj, assignProps1, assignProps2, etc) {
35743                         var assignArgsList = slice$7(arguments, 1);
35744                         return assign$1.apply(this, [Object.create(obj)].concat(assignArgsList))
35745                 }
35746         } else {
35747                 function F() {} // eslint-disable-line no-inner-declarations
35748                 return function create(obj, assignProps1, assignProps2, etc) {
35749                         var assignArgsList = slice$7(arguments, 1);
35750                         F.prototype = obj;
35751                         return assign$1.apply(this, [new F()].concat(assignArgsList))
35752                 }
35753         }
35754   }
35755
35756   function make_trim() {
35757         if (String.prototype.trim) {
35758                 return function trim(str) {
35759                         return String.prototype.trim.call(str)
35760                 }
35761         } else {
35762                 return function trim(str) {
35763                         return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
35764                 }
35765         }
35766   }
35767
35768   function bind(obj, fn) {
35769         return function() {
35770                 return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
35771         }
35772   }
35773
35774   function slice$7(arr, index) {
35775         return Array.prototype.slice.call(arr, index || 0)
35776   }
35777
35778   function each(obj, fn) {
35779         pluck(obj, function(val, key) {
35780                 fn(val, key);
35781                 return false
35782         });
35783   }
35784
35785   function map$4(obj, fn) {
35786         var res = (isList(obj) ? [] : {});
35787         pluck(obj, function(v, k) {
35788                 res[k] = fn(v, k);
35789                 return false
35790         });
35791         return res
35792   }
35793
35794   function pluck(obj, fn) {
35795         if (isList(obj)) {
35796                 for (var i=0; i<obj.length; i++) {
35797                         if (fn(obj[i], i)) {
35798                                 return obj[i]
35799                         }
35800                 }
35801         } else {
35802                 for (var key in obj) {
35803                         if (obj.hasOwnProperty(key)) {
35804                                 if (fn(obj[key], key)) {
35805                                         return obj[key]
35806                                 }
35807                         }
35808                 }
35809         }
35810   }
35811
35812   function isList(val) {
35813         return (val != null && typeof val != 'function' && typeof val.length == 'number')
35814   }
35815
35816   function isFunction$1(val) {
35817         return val && {}.toString.call(val) === '[object Function]'
35818   }
35819
35820   function isObject$1(val) {
35821         return val && {}.toString.call(val) === '[object Object]'
35822   }
35823
35824   var slice$8 = util.slice;
35825   var pluck$1 = util.pluck;
35826   var each$1 = util.each;
35827   var bind$1 = util.bind;
35828   var create$3 = util.create;
35829   var isList$1 = util.isList;
35830   var isFunction$2 = util.isFunction;
35831   var isObject$2 = util.isObject;
35832
35833   var storeEngine = {
35834         createStore: createStore
35835   };
35836
35837   var storeAPI = {
35838         version: '2.0.12',
35839         enabled: false,
35840         
35841         // get returns the value of the given key. If that value
35842         // is undefined, it returns optionalDefaultValue instead.
35843         get: function(key, optionalDefaultValue) {
35844                 var data = this.storage.read(this._namespacePrefix + key);
35845                 return this._deserialize(data, optionalDefaultValue)
35846         },
35847
35848         // set will store the given value at key and returns value.
35849         // Calling set with value === undefined is equivalent to calling remove.
35850         set: function(key, value) {
35851                 if (value === undefined) {
35852                         return this.remove(key)
35853                 }
35854                 this.storage.write(this._namespacePrefix + key, this._serialize(value));
35855                 return value
35856         },
35857
35858         // remove deletes the key and value stored at the given key.
35859         remove: function(key) {
35860                 this.storage.remove(this._namespacePrefix + key);
35861         },
35862
35863         // each will call the given callback once for each key-value pair
35864         // in this store.
35865         each: function(callback) {
35866                 var self = this;
35867                 this.storage.each(function(val, namespacedKey) {
35868                         callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
35869                 });
35870         },
35871
35872         // clearAll will remove all the stored key-value pairs in this store.
35873         clearAll: function() {
35874                 this.storage.clearAll();
35875         },
35876
35877         // additional functionality that can't live in plugins
35878         // ---------------------------------------------------
35879
35880         // hasNamespace returns true if this store instance has the given namespace.
35881         hasNamespace: function(namespace) {
35882                 return (this._namespacePrefix == '__storejs_'+namespace+'_')
35883         },
35884
35885         // createStore creates a store.js instance with the first
35886         // functioning storage in the list of storage candidates,
35887         // and applies the the given mixins to the instance.
35888         createStore: function() {
35889                 return createStore.apply(this, arguments)
35890         },
35891         
35892         addPlugin: function(plugin) {
35893                 this._addPlugin(plugin);
35894         },
35895         
35896         namespace: function(namespace) {
35897                 return createStore(this.storage, this.plugins, namespace)
35898         }
35899   };
35900
35901   function _warn() {
35902         var _console = (typeof console == 'undefined' ? null : console);
35903         if (!_console) { return }
35904         var fn = (_console.warn ? _console.warn : _console.log);
35905         fn.apply(_console, arguments);
35906   }
35907
35908   function createStore(storages, plugins, namespace) {
35909         if (!namespace) {
35910                 namespace = '';
35911         }
35912         if (storages && !isList$1(storages)) {
35913                 storages = [storages];
35914         }
35915         if (plugins && !isList$1(plugins)) {
35916                 plugins = [plugins];
35917         }
35918
35919         var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '');
35920         var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null);
35921         var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
35922         if (!legalNamespaces.test(namespace)) {
35923                 throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes')
35924         }
35925         
35926         var _privateStoreProps = {
35927                 _namespacePrefix: namespacePrefix,
35928                 _namespaceRegexp: namespaceRegexp,
35929
35930                 _testStorage: function(storage) {
35931                         try {
35932                                 var testStr = '__storejs__test__';
35933                                 storage.write(testStr, testStr);
35934                                 var ok = (storage.read(testStr) === testStr);
35935                                 storage.remove(testStr);
35936                                 return ok
35937                         } catch(e) {
35938                                 return false
35939                         }
35940                 },
35941
35942                 _assignPluginFnProp: function(pluginFnProp, propName) {
35943                         var oldFn = this[propName];
35944                         this[propName] = function pluginFn() {
35945                                 var args = slice$8(arguments, 0);
35946                                 var self = this;
35947
35948                                 // super_fn calls the old function which was overwritten by
35949                                 // this mixin.
35950                                 function super_fn() {
35951                                         if (!oldFn) { return }
35952                                         each$1(arguments, function(arg, i) {
35953                                                 args[i] = arg;
35954                                         });
35955                                         return oldFn.apply(self, args)
35956                                 }
35957
35958                                 // Give mixing function access to super_fn by prefixing all mixin function
35959                                 // arguments with super_fn.
35960                                 var newFnArgs = [super_fn].concat(args);
35961
35962                                 return pluginFnProp.apply(self, newFnArgs)
35963                         };
35964                 },
35965
35966                 _serialize: function(obj) {
35967                         return JSON.stringify(obj)
35968                 },
35969
35970                 _deserialize: function(strVal, defaultVal) {
35971                         if (!strVal) { return defaultVal }
35972                         // It is possible that a raw string value has been previously stored
35973                         // in a storage without using store.js, meaning it will be a raw
35974                         // string value instead of a JSON serialized string. By defaulting
35975                         // to the raw string value in case of a JSON parse error, we allow
35976                         // for past stored values to be forwards-compatible with store.js
35977                         var val = '';
35978                         try { val = JSON.parse(strVal); }
35979                         catch(e) { val = strVal; }
35980
35981                         return (val !== undefined ? val : defaultVal)
35982                 },
35983                 
35984                 _addStorage: function(storage) {
35985                         if (this.enabled) { return }
35986                         if (this._testStorage(storage)) {
35987                                 this.storage = storage;
35988                                 this.enabled = true;
35989                         }
35990                 },
35991
35992                 _addPlugin: function(plugin) {
35993                         var self = this;
35994
35995                         // If the plugin is an array, then add all plugins in the array.
35996                         // This allows for a plugin to depend on other plugins.
35997                         if (isList$1(plugin)) {
35998                                 each$1(plugin, function(plugin) {
35999                                         self._addPlugin(plugin);
36000                                 });
36001                                 return
36002                         }
36003
36004                         // Keep track of all plugins we've seen so far, so that we
36005                         // don't add any of them twice.
36006                         var seenPlugin = pluck$1(this.plugins, function(seenPlugin) {
36007                                 return (plugin === seenPlugin)
36008                         });
36009                         if (seenPlugin) {
36010                                 return
36011                         }
36012                         this.plugins.push(plugin);
36013
36014                         // Check that the plugin is properly formed
36015                         if (!isFunction$2(plugin)) {
36016                                 throw new Error('Plugins must be function values that return objects')
36017                         }
36018
36019                         var pluginProperties = plugin.call(this);
36020                         if (!isObject$2(pluginProperties)) {
36021                                 throw new Error('Plugins must return an object of function properties')
36022                         }
36023
36024                         // Add the plugin function properties to this store instance.
36025                         each$1(pluginProperties, function(pluginFnProp, propName) {
36026                                 if (!isFunction$2(pluginFnProp)) {
36027                                         throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
36028                                 }
36029                                 self._assignPluginFnProp(pluginFnProp, propName);
36030                         });
36031                 },
36032                 
36033                 // Put deprecated properties in the private API, so as to not expose it to accidential
36034                 // discovery through inspection of the store object.
36035                 
36036                 // Deprecated: addStorage
36037                 addStorage: function(storage) {
36038                         _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
36039                         this._addStorage(storage);
36040                 }
36041         };
36042
36043         var store = create$3(_privateStoreProps, storeAPI, {
36044                 plugins: []
36045         });
36046         store.raw = {};
36047         each$1(store, function(prop, propName) {
36048                 if (isFunction$2(prop)) {
36049                         store.raw[propName] = bind$1(store, prop);                      
36050                 }
36051         });
36052         each$1(storages, function(storage) {
36053                 store._addStorage(storage);
36054         });
36055         each$1(plugins, function(plugin) {
36056                 store._addPlugin(plugin);
36057         });
36058         return store
36059   }
36060
36061   var Global$1 = util.Global;
36062
36063   var localStorage_1 = {
36064         name: 'localStorage',
36065         read: read,
36066         write: write,
36067         each: each$2,
36068         remove: remove$2,
36069         clearAll: clearAll,
36070   };
36071
36072   function localStorage$1() {
36073         return Global$1.localStorage
36074   }
36075
36076   function read(key) {
36077         return localStorage$1().getItem(key)
36078   }
36079
36080   function write(key, data) {
36081         return localStorage$1().setItem(key, data)
36082   }
36083
36084   function each$2(fn) {
36085         for (var i = localStorage$1().length - 1; i >= 0; i--) {
36086                 var key = localStorage$1().key(i);
36087                 fn(read(key), key);
36088         }
36089   }
36090
36091   function remove$2(key) {
36092         return localStorage$1().removeItem(key)
36093   }
36094
36095   function clearAll() {
36096         return localStorage$1().clear()
36097   }
36098
36099   // oldFF-globalStorage provides storage for Firefox
36100   // versions 6 and 7, where no localStorage, etc
36101   // is available.
36102
36103
36104   var Global$2 = util.Global;
36105
36106   var oldFFGlobalStorage = {
36107         name: 'oldFF-globalStorage',
36108         read: read$1,
36109         write: write$1,
36110         each: each$3,
36111         remove: remove$3,
36112         clearAll: clearAll$1,
36113   };
36114
36115   var globalStorage = Global$2.globalStorage;
36116
36117   function read$1(key) {
36118         return globalStorage[key]
36119   }
36120
36121   function write$1(key, data) {
36122         globalStorage[key] = data;
36123   }
36124
36125   function each$3(fn) {
36126         for (var i = globalStorage.length - 1; i >= 0; i--) {
36127                 var key = globalStorage.key(i);
36128                 fn(globalStorage[key], key);
36129         }
36130   }
36131
36132   function remove$3(key) {
36133         return globalStorage.removeItem(key)
36134   }
36135
36136   function clearAll$1() {
36137         each$3(function(key, _) {
36138                 delete globalStorage[key];
36139         });
36140   }
36141
36142   // oldIE-userDataStorage provides storage for Internet Explorer
36143   // versions 6 and 7, where no localStorage, sessionStorage, etc
36144   // is available.
36145
36146
36147   var Global$3 = util.Global;
36148
36149   var oldIEUserDataStorage = {
36150         name: 'oldIE-userDataStorage',
36151         write: write$2,
36152         read: read$2,
36153         each: each$4,
36154         remove: remove$4,
36155         clearAll: clearAll$2,
36156   };
36157
36158   var storageName = 'storejs';
36159   var doc = Global$3.document;
36160   var _withStorageEl = _makeIEStorageElFunction();
36161   var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
36162
36163   function write$2(unfixedKey, data) {
36164         if (disable) { return }
36165         var fixedKey = fixKey(unfixedKey);
36166         _withStorageEl(function(storageEl) {
36167                 storageEl.setAttribute(fixedKey, data);
36168                 storageEl.save(storageName);
36169         });
36170   }
36171
36172   function read$2(unfixedKey) {
36173         if (disable) { return }
36174         var fixedKey = fixKey(unfixedKey);
36175         var res = null;
36176         _withStorageEl(function(storageEl) {
36177                 res = storageEl.getAttribute(fixedKey);
36178         });
36179         return res
36180   }
36181
36182   function each$4(callback) {
36183         _withStorageEl(function(storageEl) {
36184                 var attributes = storageEl.XMLDocument.documentElement.attributes;
36185                 for (var i=attributes.length-1; i>=0; i--) {
36186                         var attr = attributes[i];
36187                         callback(storageEl.getAttribute(attr.name), attr.name);
36188                 }
36189         });
36190   }
36191
36192   function remove$4(unfixedKey) {
36193         var fixedKey = fixKey(unfixedKey);
36194         _withStorageEl(function(storageEl) {
36195                 storageEl.removeAttribute(fixedKey);
36196                 storageEl.save(storageName);
36197         });
36198   }
36199
36200   function clearAll$2() {
36201         _withStorageEl(function(storageEl) {
36202                 var attributes = storageEl.XMLDocument.documentElement.attributes;
36203                 storageEl.load(storageName);
36204                 for (var i=attributes.length-1; i>=0; i--) {
36205                         storageEl.removeAttribute(attributes[i].name);
36206                 }
36207                 storageEl.save(storageName);
36208         });
36209   }
36210
36211   // Helpers
36212   //////////
36213
36214   // In IE7, keys cannot start with a digit or contain certain chars.
36215   // See https://github.com/marcuswestin/store.js/issues/40
36216   // See https://github.com/marcuswestin/store.js/issues/83
36217   var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
36218   function fixKey(key) {
36219         return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___')
36220   }
36221
36222   function _makeIEStorageElFunction() {
36223         if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
36224                 return null
36225         }
36226         var scriptTag = 'script',
36227                 storageOwner,
36228                 storageContainer,
36229                 storageEl;
36230
36231         // Since #userData storage applies only to specific paths, we need to
36232         // somehow link our data to a specific path.  We choose /favicon.ico
36233         // as a pretty safe option, since all browsers already make a request to
36234         // this URL anyway and being a 404 will not hurt us here.  We wrap an
36235         // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
36236         // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
36237         // since the iframe access rules appear to allow direct access and
36238         // manipulation of the document element, even for a 404 page.  This
36239         // document can be used instead of the current document (which would
36240         // have been limited to the current path) to perform #userData storage.
36241         try {
36242                 /* global ActiveXObject */
36243                 storageContainer = new ActiveXObject('htmlfile');
36244                 storageContainer.open();
36245                 storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>');
36246                 storageContainer.close();
36247                 storageOwner = storageContainer.w.frames[0].document;
36248                 storageEl = storageOwner.createElement('div');
36249         } catch(e) {
36250                 // somehow ActiveXObject instantiation failed (perhaps some special
36251                 // security settings or otherwse), fall back to per-path storage
36252                 storageEl = doc.createElement('div');
36253                 storageOwner = doc.body;
36254         }
36255
36256         return function(storeFunction) {
36257                 var args = [].slice.call(arguments, 0);
36258                 args.unshift(storageEl);
36259                 // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
36260                 // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
36261                 storageOwner.appendChild(storageEl);
36262                 storageEl.addBehavior('#default#userData');
36263                 storageEl.load(storageName);
36264                 storeFunction.apply(this, args);
36265                 storageOwner.removeChild(storageEl);
36266                 return
36267         }
36268   }
36269
36270   // cookieStorage is useful Safari private browser mode, where localStorage
36271   // doesn't work but cookies do. This implementation is adopted from
36272   // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
36273
36274
36275   var Global$4 = util.Global;
36276   var trim$1 = util.trim;
36277
36278   var cookieStorage = {
36279         name: 'cookieStorage',
36280         read: read$3,
36281         write: write$3,
36282         each: each$5,
36283         remove: remove$5,
36284         clearAll: clearAll$3,
36285   };
36286
36287   var doc$1 = Global$4.document;
36288
36289   function read$3(key) {
36290         if (!key || !_has(key)) { return null }
36291         var regexpStr = "(?:^|.*;\\s*)" +
36292                 escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
36293                 "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
36294         return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1"))
36295   }
36296
36297   function each$5(callback) {
36298         var cookies = doc$1.cookie.split(/; ?/g);
36299         for (var i = cookies.length - 1; i >= 0; i--) {
36300                 if (!trim$1(cookies[i])) {
36301                         continue
36302                 }
36303                 var kvp = cookies[i].split('=');
36304                 var key = unescape(kvp[0]);
36305                 var val = unescape(kvp[1]);
36306                 callback(val, key);
36307         }
36308   }
36309
36310   function write$3(key, data) {
36311         if(!key) { return }
36312         doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
36313   }
36314
36315   function remove$5(key) {
36316         if (!key || !_has(key)) {
36317                 return
36318         }
36319         doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
36320   }
36321
36322   function clearAll$3() {
36323         each$5(function(_, key) {
36324                 remove$5(key);
36325         });
36326   }
36327
36328   function _has(key) {
36329         return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
36330   }
36331
36332   var Global$5 = util.Global;
36333
36334   var sessionStorage_1 = {
36335         name: 'sessionStorage',
36336         read: read$4,
36337         write: write$4,
36338         each: each$6,
36339         remove: remove$6,
36340         clearAll: clearAll$4
36341   };
36342
36343   function sessionStorage() {
36344         return Global$5.sessionStorage
36345   }
36346
36347   function read$4(key) {
36348         return sessionStorage().getItem(key)
36349   }
36350
36351   function write$4(key, data) {
36352         return sessionStorage().setItem(key, data)
36353   }
36354
36355   function each$6(fn) {
36356         for (var i = sessionStorage().length - 1; i >= 0; i--) {
36357                 var key = sessionStorage().key(i);
36358                 fn(read$4(key), key);
36359         }
36360   }
36361
36362   function remove$6(key) {
36363         return sessionStorage().removeItem(key)
36364   }
36365
36366   function clearAll$4() {
36367         return sessionStorage().clear()
36368   }
36369
36370   // memoryStorage is a useful last fallback to ensure that the store
36371   // is functions (meaning store.get(), store.set(), etc will all function).
36372   // However, stored values will not persist when the browser navigates to
36373   // a new page or reloads the current page.
36374
36375   var memoryStorage_1 = {
36376         name: 'memoryStorage',
36377         read: read$5,
36378         write: write$5,
36379         each: each$7,
36380         remove: remove$7,
36381         clearAll: clearAll$5,
36382   };
36383
36384   var memoryStorage = {};
36385
36386   function read$5(key) {
36387         return memoryStorage[key]
36388   }
36389
36390   function write$5(key, data) {
36391         memoryStorage[key] = data;
36392   }
36393
36394   function each$7(callback) {
36395         for (var key in memoryStorage) {
36396                 if (memoryStorage.hasOwnProperty(key)) {
36397                         callback(memoryStorage[key], key);
36398                 }
36399         }
36400   }
36401
36402   function remove$7(key) {
36403         delete memoryStorage[key];
36404   }
36405
36406   function clearAll$5(key) {
36407         memoryStorage = {};
36408   }
36409
36410   var all$3 = [
36411         // Listed in order of usage preference
36412         localStorage_1,
36413         oldFFGlobalStorage,
36414         oldIEUserDataStorage,
36415         cookieStorage,
36416         sessionStorage_1,
36417         memoryStorage_1
36418   ];
36419
36420   /* eslint-disable */
36421
36422   //  json2.js
36423   //  2016-10-28
36424   //  Public Domain.
36425   //  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
36426   //  See http://www.JSON.org/js.html
36427   //  This code should be minified before deployment.
36428   //  See http://javascript.crockford.com/jsmin.html
36429
36430   //  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
36431   //  NOT CONTROL.
36432
36433   //  This file creates a global JSON object containing two methods: stringify
36434   //  and parse. This file provides the ES5 JSON capability to ES3 systems.
36435   //  If a project might run on IE8 or earlier, then this file should be included.
36436   //  This file does nothing on ES5 systems.
36437
36438   //      JSON.stringify(value, replacer, space)
36439   //          value       any JavaScript value, usually an object or array.
36440   //          replacer    an optional parameter that determines how object
36441   //                      values are stringified for objects. It can be a
36442   //                      function or an array of strings.
36443   //          space       an optional parameter that specifies the indentation
36444   //                      of nested structures. If it is omitted, the text will
36445   //                      be packed without extra whitespace. If it is a number,
36446   //                      it will specify the number of spaces to indent at each
36447   //                      level. If it is a string (such as "\t" or "&nbsp;"),
36448   //                      it contains the characters used to indent at each level.
36449   //          This method produces a JSON text from a JavaScript value.
36450   //          When an object value is found, if the object contains a toJSON
36451   //          method, its toJSON method will be called and the result will be
36452   //          stringified. A toJSON method does not serialize: it returns the
36453   //          value represented by the name/value pair that should be serialized,
36454   //          or undefined if nothing should be serialized. The toJSON method
36455   //          will be passed the key associated with the value, and this will be
36456   //          bound to the value.
36457
36458   //          For example, this would serialize Dates as ISO strings.
36459
36460   //              Date.prototype.toJSON = function (key) {
36461   //                  function f(n) {
36462   //                      // Format integers to have at least two digits.
36463   //                      return (n < 10)
36464   //                          ? "0" + n
36465   //                          : n;
36466   //                  }
36467   //                  return this.getUTCFullYear()   + "-" +
36468   //                       f(this.getUTCMonth() + 1) + "-" +
36469   //                       f(this.getUTCDate())      + "T" +
36470   //                       f(this.getUTCHours())     + ":" +
36471   //                       f(this.getUTCMinutes())   + ":" +
36472   //                       f(this.getUTCSeconds())   + "Z";
36473   //              };
36474
36475   //          You can provide an optional replacer method. It will be passed the
36476   //          key and value of each member, with this bound to the containing
36477   //          object. The value that is returned from your method will be
36478   //          serialized. If your method returns undefined, then the member will
36479   //          be excluded from the serialization.
36480
36481   //          If the replacer parameter is an array of strings, then it will be
36482   //          used to select the members to be serialized. It filters the results
36483   //          such that only members with keys listed in the replacer array are
36484   //          stringified.
36485
36486   //          Values that do not have JSON representations, such as undefined or
36487   //          functions, will not be serialized. Such values in objects will be
36488   //          dropped; in arrays they will be replaced with null. You can use
36489   //          a replacer function to replace those with JSON values.
36490
36491   //          JSON.stringify(undefined) returns undefined.
36492
36493   //          The optional space parameter produces a stringification of the
36494   //          value that is filled with line breaks and indentation to make it
36495   //          easier to read.
36496
36497   //          If the space parameter is a non-empty string, then that string will
36498   //          be used for indentation. If the space parameter is a number, then
36499   //          the indentation will be that many spaces.
36500
36501   //          Example:
36502
36503   //          text = JSON.stringify(["e", {pluribus: "unum"}]);
36504   //          // text is '["e",{"pluribus":"unum"}]'
36505
36506   //          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
36507   //          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
36508
36509   //          text = JSON.stringify([new Date()], function (key, value) {
36510   //              return this[key] instanceof Date
36511   //                  ? "Date(" + this[key] + ")"
36512   //                  : value;
36513   //          });
36514   //          // text is '["Date(---current time---)"]'
36515
36516   //      JSON.parse(text, reviver)
36517   //          This method parses a JSON text to produce an object or array.
36518   //          It can throw a SyntaxError exception.
36519
36520   //          The optional reviver parameter is a function that can filter and
36521   //          transform the results. It receives each of the keys and values,
36522   //          and its return value is used instead of the original value.
36523   //          If it returns what it received, then the structure is not modified.
36524   //          If it returns undefined then the member is deleted.
36525
36526   //          Example:
36527
36528   //          // Parse the text. Values that look like ISO date strings will
36529   //          // be converted to Date objects.
36530
36531   //          myData = JSON.parse(text, function (key, value) {
36532   //              var a;
36533   //              if (typeof value === "string") {
36534   //                  a =
36535   //   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
36536   //                  if (a) {
36537   //                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
36538   //                          +a[5], +a[6]));
36539   //                  }
36540   //              }
36541   //              return value;
36542   //          });
36543
36544   //          myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
36545   //              var d;
36546   //              if (typeof value === "string" &&
36547   //                      value.slice(0, 5) === "Date(" &&
36548   //                      value.slice(-1) === ")") {
36549   //                  d = new Date(value.slice(5, -1));
36550   //                  if (d) {
36551   //                      return d;
36552   //                  }
36553   //              }
36554   //              return value;
36555   //          });
36556
36557   //  This is a reference implementation. You are free to copy, modify, or
36558   //  redistribute.
36559
36560   /*jslint
36561       eval, for, this
36562   */
36563
36564   /*property
36565       JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
36566       getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
36567       lastIndex, length, parse, prototype, push, replace, slice, stringify,
36568       test, toJSON, toString, valueOf
36569   */
36570
36571
36572   // Create a JSON object only if one does not already exist. We create the
36573   // methods in a closure to avoid creating global variables.
36574
36575   if (typeof JSON !== "object") {
36576       JSON = {};
36577   }
36578
36579   (function () {
36580
36581       var rx_one = /^[\],:{}\s]*$/;
36582       var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
36583       var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
36584       var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
36585       var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
36586       var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
36587
36588       function f(n) {
36589           // Format integers to have at least two digits.
36590           return n < 10
36591               ? "0" + n
36592               : n;
36593       }
36594
36595       function this_value() {
36596           return this.valueOf();
36597       }
36598
36599       if (typeof Date.prototype.toJSON !== "function") {
36600
36601           Date.prototype.toJSON = function () {
36602
36603               return isFinite(this.valueOf())
36604                   ? this.getUTCFullYear() + "-" +
36605                           f(this.getUTCMonth() + 1) + "-" +
36606                           f(this.getUTCDate()) + "T" +
36607                           f(this.getUTCHours()) + ":" +
36608                           f(this.getUTCMinutes()) + ":" +
36609                           f(this.getUTCSeconds()) + "Z"
36610                   : null;
36611           };
36612
36613           Boolean.prototype.toJSON = this_value;
36614           Number.prototype.toJSON = this_value;
36615           String.prototype.toJSON = this_value;
36616       }
36617
36618       var gap;
36619       var indent;
36620       var meta;
36621       var rep;
36622
36623
36624       function quote(string) {
36625
36626   // If the string contains no control characters, no quote characters, and no
36627   // backslash characters, then we can safely slap some quotes around it.
36628   // Otherwise we must also replace the offending characters with safe escape
36629   // sequences.
36630
36631           rx_escapable.lastIndex = 0;
36632           return rx_escapable.test(string)
36633               ? "\"" + string.replace(rx_escapable, function (a) {
36634                   var c = meta[a];
36635                   return typeof c === "string"
36636                       ? c
36637                       : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
36638               }) + "\""
36639               : "\"" + string + "\"";
36640       }
36641
36642
36643       function str(key, holder) {
36644
36645   // Produce a string from holder[key].
36646
36647           var i;          // The loop counter.
36648           var k;          // The member key.
36649           var v;          // The member value.
36650           var length;
36651           var mind = gap;
36652           var partial;
36653           var value = holder[key];
36654
36655   // If the value has a toJSON method, call it to obtain a replacement value.
36656
36657           if (value && typeof value === "object" &&
36658                   typeof value.toJSON === "function") {
36659               value = value.toJSON(key);
36660           }
36661
36662   // If we were called with a replacer function, then call the replacer to
36663   // obtain a replacement value.
36664
36665           if (typeof rep === "function") {
36666               value = rep.call(holder, key, value);
36667           }
36668
36669   // What happens next depends on the value's type.
36670
36671           switch (typeof value) {
36672           case "string":
36673               return quote(value);
36674
36675           case "number":
36676
36677   // JSON numbers must be finite. Encode non-finite numbers as null.
36678
36679               return isFinite(value)
36680                   ? String(value)
36681                   : "null";
36682
36683           case "boolean":
36684           case "null":
36685
36686   // If the value is a boolean or null, convert it to a string. Note:
36687   // typeof null does not produce "null". The case is included here in
36688   // the remote chance that this gets fixed someday.
36689
36690               return String(value);
36691
36692   // If the type is "object", we might be dealing with an object or an array or
36693   // null.
36694
36695           case "object":
36696
36697   // Due to a specification blunder in ECMAScript, typeof null is "object",
36698   // so watch out for that case.
36699
36700               if (!value) {
36701                   return "null";
36702               }
36703
36704   // Make an array to hold the partial results of stringifying this object value.
36705
36706               gap += indent;
36707               partial = [];
36708
36709   // Is the value an array?
36710
36711               if (Object.prototype.toString.apply(value) === "[object Array]") {
36712
36713   // The value is an array. Stringify every element. Use null as a placeholder
36714   // for non-JSON values.
36715
36716                   length = value.length;
36717                   for (i = 0; i < length; i += 1) {
36718                       partial[i] = str(i, value) || "null";
36719                   }
36720
36721   // Join all of the elements together, separated with commas, and wrap them in
36722   // brackets.
36723
36724                   v = partial.length === 0
36725                       ? "[]"
36726                       : gap
36727                           ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
36728                           : "[" + partial.join(",") + "]";
36729                   gap = mind;
36730                   return v;
36731               }
36732
36733   // If the replacer is an array, use it to select the members to be stringified.
36734
36735               if (rep && typeof rep === "object") {
36736                   length = rep.length;
36737                   for (i = 0; i < length; i += 1) {
36738                       if (typeof rep[i] === "string") {
36739                           k = rep[i];
36740                           v = str(k, value);
36741                           if (v) {
36742                               partial.push(quote(k) + (
36743                                   gap
36744                                       ? ": "
36745                                       : ":"
36746                               ) + v);
36747                           }
36748                       }
36749                   }
36750               } else {
36751
36752   // Otherwise, iterate through all of the keys in the object.
36753
36754                   for (k in value) {
36755                       if (Object.prototype.hasOwnProperty.call(value, k)) {
36756                           v = str(k, value);
36757                           if (v) {
36758                               partial.push(quote(k) + (
36759                                   gap
36760                                       ? ": "
36761                                       : ":"
36762                               ) + v);
36763                           }
36764                       }
36765                   }
36766               }
36767
36768   // Join all of the member texts together, separated with commas,
36769   // and wrap them in braces.
36770
36771               v = partial.length === 0
36772                   ? "{}"
36773                   : gap
36774                       ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
36775                       : "{" + partial.join(",") + "}";
36776               gap = mind;
36777               return v;
36778           }
36779       }
36780
36781   // If the JSON object does not yet have a stringify method, give it one.
36782
36783       if (typeof JSON.stringify !== "function") {
36784           meta = {    // table of character substitutions
36785               "\b": "\\b",
36786               "\t": "\\t",
36787               "\n": "\\n",
36788               "\f": "\\f",
36789               "\r": "\\r",
36790               "\"": "\\\"",
36791               "\\": "\\\\"
36792           };
36793           JSON.stringify = function (value, replacer, space) {
36794
36795   // The stringify method takes a value and an optional replacer, and an optional
36796   // space parameter, and returns a JSON text. The replacer can be a function
36797   // that can replace values, or an array of strings that will select the keys.
36798   // A default replacer method can be provided. Use of the space parameter can
36799   // produce text that is more easily readable.
36800
36801               var i;
36802               gap = "";
36803               indent = "";
36804
36805   // If the space parameter is a number, make an indent string containing that
36806   // many spaces.
36807
36808               if (typeof space === "number") {
36809                   for (i = 0; i < space; i += 1) {
36810                       indent += " ";
36811                   }
36812
36813   // If the space parameter is a string, it will be used as the indent string.
36814
36815               } else if (typeof space === "string") {
36816                   indent = space;
36817               }
36818
36819   // If there is a replacer, it must be a function or an array.
36820   // Otherwise, throw an error.
36821
36822               rep = replacer;
36823               if (replacer && typeof replacer !== "function" &&
36824                       (typeof replacer !== "object" ||
36825                       typeof replacer.length !== "number")) {
36826                   throw new Error("JSON.stringify");
36827               }
36828
36829   // Make a fake root object containing our value under the key of "".
36830   // Return the result of stringifying the value.
36831
36832               return str("", {"": value});
36833           };
36834       }
36835
36836
36837   // If the JSON object does not yet have a parse method, give it one.
36838
36839       if (typeof JSON.parse !== "function") {
36840           JSON.parse = function (text, reviver) {
36841
36842   // The parse method takes a text and an optional reviver function, and returns
36843   // a JavaScript value if the text is a valid JSON text.
36844
36845               var j;
36846
36847               function walk(holder, key) {
36848
36849   // The walk method is used to recursively walk the resulting structure so
36850   // that modifications can be made.
36851
36852                   var k;
36853                   var v;
36854                   var value = holder[key];
36855                   if (value && typeof value === "object") {
36856                       for (k in value) {
36857                           if (Object.prototype.hasOwnProperty.call(value, k)) {
36858                               v = walk(value, k);
36859                               if (v !== undefined) {
36860                                   value[k] = v;
36861                               } else {
36862                                   delete value[k];
36863                               }
36864                           }
36865                       }
36866                   }
36867                   return reviver.call(holder, key, value);
36868               }
36869
36870
36871   // Parsing happens in four stages. In the first stage, we replace certain
36872   // Unicode characters with escape sequences. JavaScript handles many characters
36873   // incorrectly, either silently deleting them, or treating them as line endings.
36874
36875               text = String(text);
36876               rx_dangerous.lastIndex = 0;
36877               if (rx_dangerous.test(text)) {
36878                   text = text.replace(rx_dangerous, function (a) {
36879                       return "\\u" +
36880                               ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
36881                   });
36882               }
36883
36884   // In the second stage, we run the text against regular expressions that look
36885   // for non-JSON patterns. We are especially concerned with "()" and "new"
36886   // because they can cause invocation, and "=" because it can cause mutation.
36887   // But just to be safe, we want to reject all unexpected forms.
36888
36889   // We split the second stage into 4 regexp operations in order to work around
36890   // crippling inefficiencies in IE's and Safari's regexp engines. First we
36891   // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
36892   // replace all simple value tokens with "]" characters. Third, we delete all
36893   // open brackets that follow a colon or comma or that begin the text. Finally,
36894   // we look to see that the remaining characters are only whitespace or "]" or
36895   // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
36896
36897               if (
36898                   rx_one.test(
36899                       text
36900                           .replace(rx_two, "@")
36901                           .replace(rx_three, "]")
36902                           .replace(rx_four, "")
36903                   )
36904               ) {
36905
36906   // In the third stage we use the eval function to compile the text into a
36907   // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
36908   // in JavaScript: it can begin a block or an object literal. We wrap the text
36909   // in parens to eliminate the ambiguity.
36910
36911                   j = eval("(" + text + ")");
36912
36913   // In the optional fourth stage, we recursively walk the new structure, passing
36914   // each name/value pair to a reviver function for possible transformation.
36915
36916                   return (typeof reviver === "function")
36917                       ? walk({"": j}, "")
36918                       : j;
36919               }
36920
36921   // If the text is not JSON parseable, then a SyntaxError is thrown.
36922
36923               throw new SyntaxError("JSON.parse");
36924           };
36925       }
36926   }());
36927
36928   var json2 = json2Plugin;
36929
36930   function json2Plugin() {
36931         
36932         return {}
36933   }
36934
36935   var plugins = [json2];
36936
36937   var store_legacy = storeEngine.createStore(all$3, plugins);
36938
36939   // # osm-auth
36940   //
36941   // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
36942   // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
36943   // does not support custom headers, which this uses everywhere.
36944   var osmAuth = function(o) {
36945
36946       var oauth = {};
36947
36948       // authenticated users will also have a request token secret, but it's
36949       // not used in transactions with the server
36950       oauth.authenticated = function() {
36951           return !!(token('oauth_token') && token('oauth_token_secret'));
36952       };
36953
36954       oauth.logout = function() {
36955           token('oauth_token', '');
36956           token('oauth_token_secret', '');
36957           token('oauth_request_token_secret', '');
36958           return oauth;
36959       };
36960
36961       // TODO: detect lack of click event
36962       oauth.authenticate = function(callback) {
36963           if (oauth.authenticated()) return callback();
36964
36965           oauth.logout();
36966
36967           // ## Getting a request token
36968           var params = timenonce(getAuth(o)),
36969               url = o.url + '/oauth/request_token';
36970
36971           params.oauth_signature = ohauth_1.signature(
36972               o.oauth_secret, '',
36973               ohauth_1.baseString('POST', url, params));
36974
36975           if (!o.singlepage) {
36976               // Create a 600x550 popup window in the center of the screen
36977               var w = 600, h = 550,
36978                   settings = [
36979                       ['width', w], ['height', h],
36980                       ['left', screen.width / 2 - w / 2],
36981                       ['top', screen.height / 2 - h / 2]].map(function(x) {
36982                           return x.join('=');
36983                       }).join(','),
36984                   popup = window.open('about:blank', 'oauth_window', settings);
36985           }
36986
36987           // Request a request token. When this is complete, the popup
36988           // window is redirected to OSM's authorization page.
36989           ohauth_1.xhr('POST', url, params, null, {}, reqTokenDone);
36990           o.loading();
36991
36992           function reqTokenDone(err, xhr) {
36993               o.done();
36994               if (err) return callback(err);
36995               var resp = ohauth_1.stringQs(xhr.response);
36996               token('oauth_request_token_secret', resp.oauth_token_secret);
36997               var authorize_url = o.url + '/oauth/authorize?' + ohauth_1.qsString({
36998                   oauth_token: resp.oauth_token,
36999                   oauth_callback: resolveUrl(o.landing)
37000               });
37001
37002               if (o.singlepage) {
37003                   location.href = authorize_url;
37004               } else {
37005                   popup.location = authorize_url;
37006               }
37007           }
37008
37009           // Called by a function in a landing page, in the popup window. The
37010           // window closes itself.
37011           window.authComplete = function(token) {
37012               var oauth_token = ohauth_1.stringQs(token.split('?')[1]);
37013               get_access_token(oauth_token.oauth_token);
37014               delete window.authComplete;
37015           };
37016
37017           // ## Getting an request token
37018           //
37019           // At this point we have an `oauth_token`, brought in from a function
37020           // call on a landing page popup.
37021           function get_access_token(oauth_token) {
37022               var url = o.url + '/oauth/access_token',
37023                   params = timenonce(getAuth(o)),
37024                   request_token_secret = token('oauth_request_token_secret');
37025               params.oauth_token = oauth_token;
37026               params.oauth_signature = ohauth_1.signature(
37027                   o.oauth_secret,
37028                   request_token_secret,
37029                   ohauth_1.baseString('POST', url, params));
37030
37031               // ## Getting an access token
37032               //
37033               // The final token required for authentication. At this point
37034               // we have a `request token secret`
37035               ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
37036               o.loading();
37037           }
37038
37039           function accessTokenDone(err, xhr) {
37040               o.done();
37041               if (err) return callback(err);
37042               var access_token = ohauth_1.stringQs(xhr.response);
37043               token('oauth_token', access_token.oauth_token);
37044               token('oauth_token_secret', access_token.oauth_token_secret);
37045               callback(null, oauth);
37046           }
37047       };
37048
37049       oauth.bootstrapToken = function(oauth_token, callback) {
37050           // ## Getting an request token
37051           // At this point we have an `oauth_token`, brought in from a function
37052           // call on a landing page popup.
37053           function get_access_token(oauth_token) {
37054               var url = o.url + '/oauth/access_token',
37055                   params = timenonce(getAuth(o)),
37056                   request_token_secret = token('oauth_request_token_secret');
37057               params.oauth_token = oauth_token;
37058               params.oauth_signature = ohauth_1.signature(
37059                   o.oauth_secret,
37060                   request_token_secret,
37061                   ohauth_1.baseString('POST', url, params));
37062
37063               // ## Getting an access token
37064               // The final token required for authentication. At this point
37065               // we have a `request token secret`
37066               ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
37067               o.loading();
37068           }
37069
37070           function accessTokenDone(err, xhr) {
37071               o.done();
37072               if (err) return callback(err);
37073               var access_token = ohauth_1.stringQs(xhr.response);
37074               token('oauth_token', access_token.oauth_token);
37075               token('oauth_token_secret', access_token.oauth_token_secret);
37076               callback(null, oauth);
37077           }
37078
37079           get_access_token(oauth_token);
37080       };
37081
37082       // # xhr
37083       //
37084       // A single XMLHttpRequest wrapper that does authenticated calls if the
37085       // user has logged in.
37086       oauth.xhr = function(options, callback) {
37087           if (!oauth.authenticated()) {
37088               if (o.auto) {
37089                   return oauth.authenticate(run);
37090               } else {
37091                   callback('not authenticated', null);
37092                   return;
37093               }
37094           } else {
37095               return run();
37096           }
37097
37098           function run() {
37099               var params = timenonce(getAuth(o)),
37100                   oauth_token_secret = token('oauth_token_secret'),
37101                   url = (options.prefix !== false) ? o.url + options.path : options.path,
37102                   url_parts = url.replace(/#.*$/, '').split('?', 2),
37103                   base_url = url_parts[0],
37104                   query = (url_parts.length === 2) ? url_parts[1] : '';
37105
37106               // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
37107               if ((!options.options || !options.options.header ||
37108                   options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
37109                   options.content) {
37110                   params = immutable(params, ohauth_1.stringQs(options.content));
37111               }
37112
37113               params.oauth_token = token('oauth_token');
37114               params.oauth_signature = ohauth_1.signature(
37115                   o.oauth_secret,
37116                   oauth_token_secret,
37117                   ohauth_1.baseString(options.method, base_url, immutable(params, ohauth_1.stringQs(query)))
37118               );
37119
37120               return ohauth_1.xhr(options.method, url, params, options.content, options.options, done);
37121           }
37122
37123           function done(err, xhr) {
37124               if (err) return callback(err);
37125               else if (xhr.responseXML) return callback(err, xhr.responseXML);
37126               else return callback(err, xhr.response);
37127           }
37128       };
37129
37130       // pre-authorize this object, if we can just get a token and token_secret
37131       // from the start
37132       oauth.preauth = function(c) {
37133           if (!c) return;
37134           if (c.oauth_token) token('oauth_token', c.oauth_token);
37135           if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
37136           return oauth;
37137       };
37138
37139       oauth.options = function(_) {
37140           if (!arguments.length) return o;
37141
37142           o = _;
37143           o.url = o.url || 'https://www.openstreetmap.org';
37144           o.landing = o.landing || 'land.html';
37145           o.singlepage = o.singlepage || false;
37146
37147           // Optional loading and loading-done functions for nice UI feedback.
37148           // by default, no-ops
37149           o.loading = o.loading || function() {};
37150           o.done = o.done || function() {};
37151
37152           return oauth.preauth(o);
37153       };
37154
37155       // 'stamp' an authentication object from `getAuth()`
37156       // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
37157       // and timestamp
37158       function timenonce(o) {
37159           o.oauth_timestamp = ohauth_1.timestamp();
37160           o.oauth_nonce = ohauth_1.nonce();
37161           return o;
37162       }
37163
37164       // get/set tokens. These are prefixed with the base URL so that `osm-auth`
37165       // can be used with multiple APIs and the keys in `localStorage`
37166       // will not clash
37167       var token;
37168
37169       if (store_legacy.enabled) {
37170           token = function (x, y) {
37171               if (arguments.length === 1) return store_legacy.get(o.url + x);
37172               else if (arguments.length === 2) return store_legacy.set(o.url + x, y);
37173           };
37174       } else {
37175           var storage = {};
37176           token = function (x, y) {
37177               if (arguments.length === 1) return storage[o.url + x];
37178               else if (arguments.length === 2) return storage[o.url + x] = y;
37179           };
37180       }
37181
37182       // Get an authentication object. If you just add and remove properties
37183       // from a single object, you'll need to use `delete` to make sure that
37184       // it doesn't contain undesired properties for authentication
37185       function getAuth(o) {
37186           return {
37187               oauth_consumer_key: o.oauth_consumer_key,
37188               oauth_signature_method: 'HMAC-SHA1'
37189           };
37190       }
37191
37192       // potentially pre-authorize
37193       oauth.options(o);
37194
37195       return oauth;
37196   };
37197
37198   var JXON = new (function () {
37199     var
37200       sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */
37201       aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
37202
37203     function parseText (sValue) {
37204       if (rIsNull.test(sValue)) { return null; }
37205       if (rIsBool.test(sValue)) { return sValue.toLowerCase() === 'true'; }
37206       if (isFinite(sValue)) { return parseFloat(sValue); }
37207       if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
37208       return sValue;
37209     }
37210
37211     function EmptyTree () { }
37212     EmptyTree.prototype.toString = function () { return 'null'; };
37213     EmptyTree.prototype.valueOf = function () { return null; };
37214
37215     function objectify (vValue) {
37216       return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
37217     }
37218
37219     function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
37220       var
37221         nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
37222         bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
37223
37224       var
37225         sProp, vContent, nLength = 0, sCollectedTxt = '',
37226         vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
37227
37228       if (bChildren) {
37229         for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
37230           oNode = oParentNode.childNodes.item(nItem);
37231           if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is 'CDATASection' (4) */
37232           else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is 'Text' (3) */
37233           else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is 'Element' (1) */
37234         }
37235       }
37236
37237       var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
37238
37239       if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
37240
37241       for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
37242         sProp = aCache[nElId].nodeName.toLowerCase();
37243         vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
37244         if (vResult.hasOwnProperty(sProp)) {
37245           if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
37246           vResult[sProp].push(vContent);
37247         } else {
37248           vResult[sProp] = vContent;
37249           nLength++;
37250         }
37251       }
37252
37253       if (bAttributes) {
37254         var
37255           nAttrLen = oParentNode.attributes.length,
37256           sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
37257
37258         for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
37259           oAttrib = oParentNode.attributes.item(nAttrib);
37260           oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
37261         }
37262
37263         if (bNesteAttr) {
37264           if (bFreeze) { Object.freeze(oAttrParent); }
37265           vResult[sAttributesProp] = oAttrParent;
37266           nLength -= nAttrLen - 1;
37267         }
37268       }
37269
37270       if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
37271         vResult[sValueProp] = vBuiltVal;
37272       } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
37273         vResult = vBuiltVal;
37274       }
37275
37276       if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
37277
37278       aCache.length = nLevelStart;
37279
37280       return vResult;
37281     }
37282
37283     function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
37284       var vValue, oChild;
37285
37286       if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
37287         oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
37288       } else if (oParentObj.constructor === Date) {
37289         oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));    
37290       }
37291
37292       for (var sName in oParentObj) {
37293         vValue = oParentObj[sName];
37294         if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
37295         if (sName === sValueProp) {
37296           if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
37297         } else if (sName === sAttributesProp) { /* verbosity level is 3 */
37298           for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
37299         } else if (sName.charAt(0) === sAttrPref) {
37300           oParentEl.setAttribute(sName.slice(1), vValue);
37301         } else if (vValue.constructor === Array) {
37302           for (var nItem = 0; nItem < vValue.length; nItem++) {
37303             oChild = oXMLDoc.createElement(sName);
37304             loadObjTree(oXMLDoc, oChild, vValue[nItem]);
37305             oParentEl.appendChild(oChild);
37306           }
37307         } else {
37308           oChild = oXMLDoc.createElement(sName);
37309           if (vValue instanceof Object) {
37310             loadObjTree(oXMLDoc, oChild, vValue);
37311           } else if (vValue !== null && vValue !== true) {
37312             oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
37313           }
37314           oParentEl.appendChild(oChild);
37315        }
37316      }
37317     }
37318
37319     this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
37320       var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
37321       return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);    
37322     };
37323
37324     this.unbuild = function (oObjTree) {    
37325       var oNewDoc = document.implementation.createDocument('', '', null);
37326       loadObjTree(oNewDoc, oNewDoc, oObjTree);
37327       return oNewDoc;
37328     };
37329
37330     this.stringify = function (oObjTree) {
37331       return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
37332     };
37333   })();
37334
37335   // var myObject = JXON.build(doc);
37336   // we got our javascript object! try: alert(JSON.stringify(myObject));
37337
37338   // var newDoc = JXON.unbuild(myObject);
37339   // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
37340
37341   var dispatch$3 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded');
37342   var urlroot = 'https://www.openstreetmap.org';
37343   var oauth = osmAuth({
37344       url: urlroot,
37345       oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
37346       oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
37347       loading: authLoading,
37348       done: authDone
37349   });
37350
37351   var _blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
37352   var _tiles = { loaded: {}, inflight: {} };
37353   var _changeset = {};
37354   var _entityCache = {};
37355   var _connectionID = 1;
37356   var _tileZoom = 16;
37357   var _rateLimitError;
37358   var _userChangesets;
37359   var _userDetails;
37360   var _off;
37361
37362
37363   function authLoading() {
37364       dispatch$3.call('authLoading');
37365   }
37366
37367
37368   function authDone() {
37369       dispatch$3.call('authDone');
37370   }
37371
37372
37373   function abortRequest$2(i) {
37374       if (i) {
37375           i.abort();
37376       }
37377   }
37378
37379
37380   function getLoc(attrs) {
37381       var lon = attrs.lon && attrs.lon.value;
37382       var lat = attrs.lat && attrs.lat.value;
37383       return [parseFloat(lon), parseFloat(lat)];
37384   }
37385
37386
37387   function getNodes(obj) {
37388       var elems = obj.getElementsByTagName('nd');
37389       var nodes = new Array(elems.length);
37390       for (var i = 0, l = elems.length; i < l; i++) {
37391           nodes[i] = 'n' + elems[i].attributes.ref.value;
37392       }
37393       return nodes;
37394   }
37395
37396
37397   function getTags(obj) {
37398       var elems = obj.getElementsByTagName('tag');
37399       var tags = {};
37400       for (var i = 0, l = elems.length; i < l; i++) {
37401           var attrs = elems[i].attributes;
37402           tags[attrs.k.value] = attrs.v.value;
37403       }
37404
37405       return tags;
37406   }
37407
37408
37409   function getMembers(obj) {
37410       var elems = obj.getElementsByTagName('member');
37411       var members = new Array(elems.length);
37412       for (var i = 0, l = elems.length; i < l; i++) {
37413           var attrs = elems[i].attributes;
37414           members[i] = {
37415               id: attrs.type.value[0] + attrs.ref.value,
37416               type: attrs.type.value,
37417               role: attrs.role.value
37418           };
37419       }
37420       return members;
37421   }
37422
37423
37424   function getVisible(attrs) {
37425       return (!attrs.visible || attrs.visible.value !== 'false');
37426   }
37427
37428
37429   var parsers = {
37430       node: function nodeData(obj, uid) {
37431           var attrs = obj.attributes;
37432           return new osmNode({
37433               id:uid,
37434               visible: getVisible(attrs),
37435               version: attrs.version.value,
37436               changeset: attrs.changeset && attrs.changeset.value,
37437               timestamp: attrs.timestamp && attrs.timestamp.value,
37438               user: attrs.user && attrs.user.value,
37439               uid: attrs.uid && attrs.uid.value,
37440               loc: getLoc(attrs),
37441               tags: getTags(obj)
37442           });
37443       },
37444
37445       way: function wayData(obj, uid) {
37446           var attrs = obj.attributes;
37447           return new osmWay({
37448               id: uid,
37449               visible: getVisible(attrs),
37450               version: attrs.version.value,
37451               changeset: attrs.changeset && attrs.changeset.value,
37452               timestamp: attrs.timestamp && attrs.timestamp.value,
37453               user: attrs.user && attrs.user.value,
37454               uid: attrs.uid && attrs.uid.value,
37455               tags: getTags(obj),
37456               nodes: getNodes(obj),
37457           });
37458       },
37459
37460       relation: function relationData(obj, uid) {
37461           var attrs = obj.attributes;
37462           return new osmRelation({
37463               id: uid,
37464               visible: getVisible(attrs),
37465               version: attrs.version.value,
37466               changeset: attrs.changeset && attrs.changeset.value,
37467               timestamp: attrs.timestamp && attrs.timestamp.value,
37468               user: attrs.user && attrs.user.value,
37469               uid: attrs.uid && attrs.uid.value,
37470               tags: getTags(obj),
37471               members: getMembers(obj)
37472           });
37473       }
37474   };
37475
37476
37477   function parse(xml$$1, callback, options) {
37478       options = assignIn({ cache: true }, options);
37479       if (!xml$$1 || !xml$$1.childNodes) return;
37480
37481       var root = xml$$1.childNodes[0];
37482       var children = root.childNodes;
37483
37484       function parseChild(child) {
37485           var parser = parsers[child.nodeName];
37486           if (parser) {
37487               var uid = osmEntity$$1.id.fromOSM(child.nodeName, child.attributes.id.value);
37488               if (options.cache && _entityCache[uid]) {
37489                   return null;
37490               }
37491               return parser(child, uid);
37492           }
37493       }
37494
37495       utilIdleWorker(children, parseChild, callback);
37496   }
37497
37498
37499   var serviceOsm = {
37500
37501       init: function() {
37502           utilRebind(this, dispatch$3, 'on');
37503       },
37504
37505
37506       reset: function() {
37507           _connectionID++;
37508           _userChangesets = undefined;
37509           _userDetails = undefined;
37510           _rateLimitError = undefined;
37511           forEach(_tiles.inflight, abortRequest$2);
37512           if (_changeset.inflight) abortRequest$2(_changeset.inflight);
37513           _tiles = { loaded: {}, inflight: {} };
37514           _changeset = {};
37515           _entityCache = {};
37516           return this;
37517       },
37518
37519
37520       getConnectionId: function() {
37521           return _connectionID;
37522       },
37523
37524
37525       changesetURL: function(changesetId) {
37526           return urlroot + '/changeset/' + changesetId;
37527       },
37528
37529
37530       changesetsURL: function(center, zoom) {
37531           var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
37532           return urlroot + '/history#map=' +
37533               Math.floor(zoom) + '/' +
37534               center[1].toFixed(precision) + '/' +
37535               center[0].toFixed(precision);
37536       },
37537
37538
37539       entityURL: function(entity) {
37540           return urlroot + '/' + entity.type + '/' + entity.osmId();
37541       },
37542
37543
37544       historyURL: function(entity) {
37545           return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
37546       },
37547
37548
37549       userURL: function(username) {
37550           return urlroot + '/user/' + username;
37551       },
37552
37553
37554       loadFromAPI: function(path, callback, options) {
37555           options = assignIn({ cache: true }, options);
37556           var that = this;
37557           var cid = _connectionID;
37558
37559           function done(err, xml$$1) {
37560               if (that.getConnectionId() !== cid) {
37561                   if (callback) callback({ message: 'Connection Switched', status: -1 });
37562                   return;
37563               }
37564
37565               var isAuthenticated = that.authenticated();
37566
37567               // 400 Bad Request, 401 Unauthorized, 403 Forbidden
37568               // Logout and retry the request..
37569               if (isAuthenticated && err && (err.status === 400 || err.status === 401 || err.status === 403)) {
37570                   that.logout();
37571                   that.loadFromAPI(path, callback);
37572
37573               // else, no retry..
37574               } else {
37575                   // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
37576                   // Set the rateLimitError flag and trigger a warning..
37577                   if (!isAuthenticated && !_rateLimitError && err &&
37578                           (err.status === 509 || err.status === 429)) {
37579                       _rateLimitError = err;
37580                       dispatch$3.call('change');
37581                   }
37582
37583                   if (callback) {
37584                       if (err) return callback(err, null);
37585                       parse(xml$$1, function (entities) {
37586                           if (options.cache) {
37587                               for (var i in entities) {
37588                                   _entityCache[entities[i].id] = true;
37589                               }
37590                           }
37591                           callback(null, entities);
37592                       }, options);
37593                   }
37594               }
37595           }
37596
37597           if (this.authenticated()) {
37598               return oauth.xhr({ method: 'GET', path: path }, done);
37599           } else {
37600               var url = urlroot + path;
37601               return d3_xml(url).get(done);
37602           }
37603       },
37604
37605
37606       loadEntity: function(id, callback) {
37607           var type = osmEntity$$1.id.type(id);
37608           var osmID = osmEntity$$1.id.toOSM(id);
37609           var options = { cache: false };
37610
37611           this.loadFromAPI(
37612               '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
37613               function(err, entities) {
37614                   if (callback) callback(err, { data: entities });
37615               },
37616               options
37617           );
37618       },
37619
37620
37621       loadEntityVersion: function(id, version, callback) {
37622           var type = osmEntity$$1.id.type(id);
37623           var osmID = osmEntity$$1.id.toOSM(id);
37624           var options = { cache: false };
37625
37626           this.loadFromAPI(
37627               '/api/0.6/' + type + '/' + osmID + '/' + version,
37628               function(err, entities) {
37629                   if (callback) callback(err, { data: entities });
37630               },
37631               options
37632           );
37633       },
37634
37635
37636       loadMultiple: function(ids, callback) {
37637           var that = this;
37638
37639           forEach(groupBy(uniq(ids), osmEntity$$1.id.type), function(v, k) {
37640               var type = k + 's';
37641               var osmIDs = map$3(v, osmEntity$$1.id.toOSM);
37642               var options = { cache: false };
37643
37644               forEach(chunk(osmIDs, 150), function(arr) {
37645                   that.loadFromAPI(
37646                       '/api/0.6/' + type + '?' + type + '=' + arr.join(),
37647                       function(err, entities) {
37648                           if (callback) callback(err, { data: entities });
37649                       },
37650                       options
37651                   );
37652               });
37653           });
37654       },
37655
37656
37657       authenticated: function() {
37658           return oauth.authenticated();
37659       },
37660
37661
37662       putChangeset: function(changeset, changes, callback) {
37663           if (_changeset.inflight) {
37664               return callback({ message: 'Changeset already inflight', status: -2 }, changeset);
37665           }
37666
37667           var that = this;
37668           var cid = _connectionID;
37669
37670           if (_changeset.open) {   // reuse existing open changeset..
37671               createdChangeset(null, _changeset.open);
37672           } else {                 // open a new changeset..
37673               _changeset.inflight = oauth.xhr({
37674                   method: 'PUT',
37675                   path: '/api/0.6/changeset/create',
37676                   options: { header: { 'Content-Type': 'text/xml' } },
37677                   content: JXON.stringify(changeset.asJXON())
37678               }, createdChangeset);
37679           }
37680
37681
37682           function createdChangeset(err, changesetID) {
37683               _changeset.inflight = null;
37684
37685               if (err) {
37686                   // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
37687                   if (err.status === 400 || err.status === 401 || err.status === 403) {
37688                       that.logout();
37689                   }
37690                   return callback(err, changeset);
37691               }
37692               if (that.getConnectionId() !== cid) {
37693                   return callback({ message: 'Connection Switched', status: -1 }, changeset);
37694               }
37695
37696               _changeset.open = changesetID;
37697               changeset = changeset.update({ id: changesetID });
37698
37699               // Upload the changeset..
37700               _changeset.inflight = oauth.xhr({
37701                   method: 'POST',
37702                   path: '/api/0.6/changeset/' + changesetID + '/upload',
37703                   options: { header: { 'Content-Type': 'text/xml' } },
37704                   content: JXON.stringify(changeset.osmChangeJXON(changes))
37705               }, uploadedChangeset);
37706           }
37707
37708
37709           function uploadedChangeset(err) {
37710               _changeset.inflight = null;
37711
37712               if (err) return callback(err, changeset);
37713
37714               // Upload was successful, safe to call the callback.
37715               // Add delay to allow for postgres replication #1646 #2678
37716               window.setTimeout(function() {
37717                   callback(null, changeset);
37718               }, 2500);
37719
37720               _changeset.open = null;
37721
37722               // At this point, we don't really care if the connection was switched..
37723               // Only try to close the changeset if we're still talking to the same server.
37724               if (that.getConnectionId() === cid) {
37725                   // Still attempt to close changeset, but ignore response because #2667
37726                   oauth.xhr({
37727                       method: 'PUT',
37728                       path: '/api/0.6/changeset/' + changeset.id + '/close',
37729                       options: { header: { 'Content-Type': 'text/xml' } }
37730                   }, function() { return true; });
37731               }
37732           }
37733       },
37734
37735
37736       userDetails: function(callback) {
37737           if (_userDetails) {
37738               callback(undefined, _userDetails);
37739               return;
37740           }
37741
37742           var that = this;
37743           var cid = _connectionID;
37744
37745           function done(err, user_details) {
37746               if (err) {
37747                   // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
37748                   if (err.status === 400 || err.status === 401 || err.status === 403) {
37749                       that.logout();
37750                   }
37751                   return callback(err);
37752               }
37753               if (that.getConnectionId() !== cid) {
37754                   return callback({ message: 'Connection Switched', status: -1 });
37755               }
37756
37757
37758               var u = user_details.getElementsByTagName('user')[0];
37759               var img = u.getElementsByTagName('img');
37760               var image_url = '';
37761
37762               if (img && img[0] && img[0].getAttribute('href')) {
37763                   image_url = img[0].getAttribute('href');
37764               }
37765
37766               var changesets = u.getElementsByTagName('changesets');
37767               var changesets_count = 0;
37768
37769               if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
37770                   changesets_count = changesets[0].getAttribute('count');
37771               }
37772
37773               _userDetails = {
37774                   id: u.attributes.id.value,
37775                   display_name: u.attributes.display_name.value,
37776                   image_url: image_url,
37777                   changesets_count: changesets_count
37778               };
37779
37780               callback(undefined, _userDetails);
37781           }
37782
37783           oauth.xhr({ method: 'GET', path: '/api/0.6/user/details' }, done);
37784       },
37785
37786
37787       userChangesets: function(callback) {
37788           if (_userChangesets) {
37789               callback(undefined, _userChangesets);
37790               return;
37791           }
37792
37793           var that = this;
37794           var cid = _connectionID;
37795
37796           this.userDetails(function(err, user) {
37797               if (err) {
37798                   return callback(err);
37799               }
37800               if (that.getConnectionId() !== cid) {
37801                   return callback({ message: 'Connection Switched', status: -1 });
37802               }
37803
37804               function done(err, changesets) {
37805                   if (err) {
37806                       // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
37807                       if (err.status === 400 || err.status === 401 || err.status === 403) {
37808                           that.logout();
37809                       }
37810                       return callback(err);
37811                   }
37812                   if (that.getConnectionId() !== cid) {
37813                       return callback({ message: 'Connection Switched', status: -1 });
37814                   }
37815
37816                   _userChangesets = Array.prototype.map.call(
37817                       changesets.getElementsByTagName('changeset'),
37818                       function (changeset) {
37819                           return { tags: getTags(changeset) };
37820                       }
37821                   ).filter(function (changeset) {
37822                       var comment = changeset.tags.comment;
37823                       return comment && comment !== '';
37824                   });
37825
37826                   callback(undefined, _userChangesets);
37827               }
37828
37829               oauth.xhr({ method: 'GET', path: '/api/0.6/changesets?user=' + user.id }, done);
37830           });
37831       },
37832
37833
37834       status: function(callback) {
37835           var that = this;
37836           var cid = _connectionID;
37837
37838           function done(xml$$1) {
37839               if (that.getConnectionId() !== cid) {
37840                   return callback({ message: 'Connection Switched', status: -1 }, 'connectionSwitched');
37841               }
37842
37843               // update blacklists
37844               var elements = xml$$1.getElementsByTagName('blacklist');
37845               var regexes = [];
37846               for (var i = 0; i < elements.length; i++) {
37847                   var regex = elements[i].getAttribute('regex');  // needs unencode?
37848                   if (regex) {
37849                       regexes.push(regex);
37850                   }
37851               }
37852               if (regexes.length) {
37853                   _blacklists = regexes;
37854               }
37855
37856
37857               if (_rateLimitError) {
37858                   callback(_rateLimitError, 'rateLimited');
37859               } else {
37860                   var apiStatus = xml$$1.getElementsByTagName('status');
37861                   var val = apiStatus[0].getAttribute('api');
37862
37863                   callback(undefined, val);
37864               }
37865           }
37866
37867           d3_xml(urlroot + '/api/capabilities').get()
37868               .on('load', done)
37869               .on('error', callback);
37870       },
37871
37872
37873       imageryBlacklists: function() {
37874           return _blacklists;
37875       },
37876
37877
37878       tileZoom: function(_) {
37879           if (!arguments.length) return _tileZoom;
37880           _tileZoom = _;
37881           return this;
37882       },
37883
37884
37885       loadTiles: function(projection, dimensions, callback) {
37886           if (_off) return;
37887
37888           var that = this;
37889           var s = projection.scale() * 2 * Math.PI;
37890           var z = Math.max(Math.log(s) / Math.log(2) - 8, 0);
37891           var ts = 256 * Math.pow(2, z - _tileZoom);
37892           var origin = [
37893               s / 2 - projection.translate()[0],
37894               s / 2 - projection.translate()[1]
37895           ];
37896
37897           var tiles = d3geoTile()
37898               .scaleExtent([_tileZoom, _tileZoom])
37899               .scale(s)
37900               .size(dimensions)
37901               .translate(projection.translate())()
37902               .map(function(tile) {
37903                   var x = tile[0] * ts - origin[0];
37904                   var y = tile[1] * ts - origin[1];
37905
37906                   return {
37907                       id: tile.toString(),
37908                       extent: geoExtent$$1(
37909                           projection.invert([x, y + ts]),
37910                           projection.invert([x + ts, y]))
37911                   };
37912               });
37913
37914           filter(_tiles.inflight, function(v, i) {
37915               var wanted = find$1(tiles, function(tile) {
37916                   return i === tile.id;
37917               });
37918               if (!wanted) delete _tiles.inflight[i];
37919               return !wanted;
37920           }).map(abortRequest$2);
37921
37922           tiles.forEach(function(tile) {
37923               var id = tile.id;
37924
37925               if (_tiles.loaded[id] || _tiles.inflight[id]) return;
37926
37927               if (isEmpty(_tiles.inflight)) {
37928                   dispatch$3.call('loading');
37929               }
37930
37931               _tiles.inflight[id] = that.loadFromAPI(
37932                   '/api/0.6/map?bbox=' + tile.extent.toParam(),
37933                   function(err, parsed) {
37934                       delete _tiles.inflight[id];
37935                       if (!err) {
37936                           _tiles.loaded[id] = true;
37937                       }
37938
37939                       if (callback) {
37940                           callback(err, assignIn({ data: parsed }, tile));
37941                       }
37942
37943                       if (isEmpty(_tiles.inflight)) {
37944                           dispatch$3.call('loaded');
37945                       }
37946                   }
37947               );
37948           });
37949       },
37950
37951
37952       switch: function(options) {
37953           urlroot = options.urlroot;
37954
37955           oauth.options(assignIn({
37956               url: urlroot,
37957               loading: authLoading,
37958               done: authDone
37959           }, options));
37960
37961           this.reset();
37962           this.userChangesets(function() {});  // eagerly load user details/changesets
37963           dispatch$3.call('change');
37964           return this;
37965       },
37966
37967
37968       toggle: function(_) {
37969           _off = !_;
37970           return this;
37971       },
37972
37973
37974       loadedTiles: function(_) {
37975           if (!arguments.length) return _tiles.loaded;
37976           _tiles.loaded = _;
37977           return this;
37978       },
37979
37980
37981       logout: function() {
37982           _userChangesets = undefined;
37983           _userDetails = undefined;
37984           oauth.logout();
37985           dispatch$3.call('change');
37986           return this;
37987       },
37988
37989
37990       authenticate: function(callback) {
37991           var that = this;
37992           var cid = _connectionID;
37993           _userChangesets = undefined;
37994           _userDetails = undefined;
37995
37996           function done(err, res) {
37997               if (err) {
37998                   if (callback) callback(err);
37999                   return;
38000               }
38001               if (that.getConnectionId() !== cid) {
38002                   if (callback) callback({ message: 'Connection Switched', status: -1 });
38003                   return;
38004               }
38005               _rateLimitError = undefined;
38006               dispatch$3.call('change');
38007               if (callback) callback(err, res);
38008               that.userChangesets(function() {});  // eagerly load user details/changesets
38009           }
38010
38011           return oauth.authenticate(done);
38012       }
38013   };
38014
38015   var apibase$3 = 'https://taginfo.openstreetmap.org/api/4/',
38016       inflight$1 = {},
38017       popularKeys = {},
38018       taginfoCache = {},
38019       tag_sorts = {
38020           point: 'count_nodes',
38021           vertex: 'count_nodes',
38022           area: 'count_ways',
38023           line: 'count_ways'
38024       },
38025       tag_sort_members = {
38026           point: 'count_node_members',
38027           vertex: 'count_node_members',
38028           area: 'count_way_members',
38029           line: 'count_way_members',
38030           relation: 'count_relation_members'
38031       },
38032       tag_filters = {
38033           point: 'nodes',
38034           vertex: 'nodes',
38035           area: 'ways',
38036           line: 'ways'
38037       },
38038       tag_members_fractions = {
38039           point: 'count_node_members_fraction',
38040           vertex: 'count_node_members_fraction',
38041           area: 'count_way_members_fraction',
38042           line: 'count_way_members_fraction',
38043           relation: 'count_relation_members_fraction'
38044       };
38045
38046
38047   function sets(params, n, o) {
38048       if (params.geometry && o[params.geometry]) {
38049           params[n] = o[params.geometry];
38050       }
38051       return params;
38052   }
38053
38054
38055   function setFilter(params) {
38056       return sets(params, 'filter', tag_filters);
38057   }
38058
38059
38060   function setSort(params) {
38061       return sets(params, 'sortname', tag_sorts);
38062   }
38063
38064
38065   function setSortMembers(params) {
38066       return sets(params, 'sortname', tag_sort_members);
38067   }
38068
38069
38070   function clean(params) {
38071       return omit(params, ['geometry', 'debounce']);
38072   }
38073
38074
38075   function filterKeys(type) {
38076       var count_type = type ? 'count_' + type : 'count_all';
38077       return function(d) {
38078           return parseFloat(d[count_type]) > 2500 || d.in_wiki;
38079       };
38080   }
38081
38082
38083   function filterMultikeys(prefix) {
38084       return function(d) {
38085           // d.key begins with prefix, and d.key contains no additional ':'s
38086           var re = new RegExp('^' + prefix + '(.*)$');
38087           var matches = d.key.match(re) || [];
38088           return (matches.length === 2 && matches[1].indexOf(':') === -1);
38089       };
38090   }
38091
38092
38093   function filterValues(allowUpperCase) {
38094       return function(d) {
38095           if (d.value.match(/[;,]/) !== null) return false;  // exclude some punctuation
38096           if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false;  // exclude uppercase letters
38097           return parseFloat(d.fraction) > 0.0 || d.in_wiki;
38098       };
38099   }
38100
38101
38102   function filterRoles(geometry) {
38103       return function(d) {
38104           if (d.role === '') return false; // exclude empty role
38105           if (d.role.match(/[A-Z*;,]/) !== null) return false;  // exclude uppercase letters and some punctuation
38106           return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
38107       };
38108   }
38109
38110
38111   function valKey(d) {
38112       return {
38113           value: d.key,
38114           title: d.key
38115       };
38116   }
38117
38118
38119   function valKeyDescription(d) {
38120       return {
38121           value: d.value,
38122           title: d.description || d.value
38123       };
38124   }
38125
38126
38127   function roleKey(d) {
38128       return {
38129           value: d.role,
38130           title: d.role
38131       };
38132   }
38133
38134
38135   // sort keys with ':' lower than keys without ':'
38136   function sortKeys(a, b) {
38137       return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
38138           : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1
38139           : 0;
38140   }
38141
38142
38143   var debouncedRequest = debounce(request, 500, { leading: false });
38144
38145   function request(url, params, exactMatch, callback, loaded) {
38146       if (inflight$1[url]) return;
38147
38148       if (checkCache(url, params, exactMatch, callback)) return;
38149
38150       inflight$1[url] = d3_json(url, function (err, data) {
38151           delete inflight$1[url];
38152           loaded(err, data);
38153       });
38154   }
38155
38156
38157   function checkCache(url, params, exactMatch, callback) {
38158       var rp = params.rp || 25,
38159           testQuery = params.query || '',
38160           testUrl = url;
38161
38162       do {
38163           var hit = taginfoCache[testUrl];
38164
38165           // exact match, or shorter match yielding fewer than max results (rp)
38166           if (hit && (url === testUrl || hit.length < rp)) {
38167               callback(null, hit);
38168               return true;
38169           }
38170
38171           // don't try to shorten the query
38172           if (exactMatch || !testQuery.length) return false;
38173
38174           // do shorten the query to see if we already have a cached result
38175           // that has returned fewer than max results (rp)
38176           testQuery = testQuery.slice(0, -1);
38177           testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
38178       } while (testQuery.length >= 0);
38179
38180       return false;
38181   }
38182
38183
38184   var serviceTaginfo = {
38185
38186       init: function() {
38187           inflight$1 = {};
38188           taginfoCache = {};
38189           popularKeys = {};
38190
38191           // Fetch popular keys.  We'll exclude these from `values`
38192           // lookups because they stress taginfo, and they aren't likely
38193           // to yield meaningful autocomplete results.. see #3955
38194           var params = { rp: 100, sortname: 'values_all', sortorder: 'desc', page: 1, debounce: false };
38195           this.keys(params, function(err, data) {
38196               if (err) return;
38197               data.forEach(function(d) {
38198                   if (d.value === 'opening_hours') return;  // exception
38199                   popularKeys[d.value] = true;
38200               });
38201           });
38202       },
38203
38204
38205       reset: function() {
38206           forEach(inflight$1, function(req) { req.abort(); });
38207           inflight$1 = {};
38208       },
38209
38210
38211       keys: function(params, callback) {
38212           var doRequest = params.debounce ? debouncedRequest : request;
38213           params = clean(setSort(params));
38214           params = assignIn({ rp: 10, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
38215
38216           var url = apibase$3 + 'keys/all?' + utilQsString(params);
38217           doRequest(url, params, false, callback, function(err, d) {
38218               if (err) {
38219                   callback(err);
38220               } else {
38221                   var f = filterKeys(params.filter);
38222                   var result = d.data.filter(f).sort(sortKeys).map(valKey);
38223                   taginfoCache[url] = result;
38224                   callback(null, result);
38225               }
38226           });
38227       },
38228
38229
38230       multikeys: function(params, callback) {
38231           var doRequest = params.debounce ? debouncedRequest : request;
38232           params = clean(setSort(params));
38233           params = assignIn({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
38234           var prefix = params.query;
38235
38236           var url = apibase$3 + 'keys/all?' + utilQsString(params);
38237           doRequest(url, params, true, callback, function(err, d) {
38238               if (err) {
38239                   callback(err);
38240               } else {
38241                   var f = filterMultikeys(prefix);
38242                   var result = d.data.filter(f).map(valKey);
38243                   taginfoCache[url] = result;
38244                   callback(null, result);
38245               }
38246           });
38247       },
38248
38249
38250       values: function(params, callback) {
38251           // Exclude popular keys from values lookups.. see #3955
38252           var key = params.key;
38253           if (key && popularKeys[key]) {
38254               callback(null, []);
38255               return;
38256           }
38257
38258           var doRequest = params.debounce ? debouncedRequest : request;
38259           params = clean(setSort(setFilter(params)));
38260           params = assignIn({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
38261
38262           var url = apibase$3 + 'key/values?' + utilQsString(params);
38263           doRequest(url, params, false, callback, function(err, d) {
38264               if (err) {
38265                   callback(err);
38266               } else {
38267                   // In most cases we prefer taginfo value results with lowercase letters.
38268                   // A few OSM keys expect values to contain uppercase values (see #3377).
38269                   // This is not an exhaustive list (e.g. `name` also has uppercase values)
38270                   // but these are the fields where taginfo value lookup is most useful.
38271                   var re = /network|taxon|genus|species|brand|grape_variety|rating|:output|_hours|_times/;
38272                   var allowUpperCase = (params.key.match(re) !== null);
38273                   var f = filterValues(allowUpperCase);
38274
38275                   var result = d.data.filter(f).map(valKeyDescription);
38276                   taginfoCache[url] = result;
38277                   callback(null, result);
38278               }
38279           });
38280       },
38281
38282
38283       roles: function(params, callback) {
38284           var doRequest = params.debounce ? debouncedRequest : request;
38285           var geometry = params.geometry;
38286           params = clean(setSortMembers(params));
38287           params = assignIn({ rp: 25, sortname: 'count_all_members', sortorder: 'desc', page: 1 }, params);
38288
38289           var url = apibase$3 + 'relation/roles?' + utilQsString(params);
38290           doRequest(url, params, true, callback, function(err, d) {
38291               if (err) {
38292                   callback(err);
38293               } else {
38294                   var f = filterRoles(geometry);
38295                   var result = d.data.filter(f).map(roleKey);
38296                   taginfoCache[url] = result;
38297                   callback(null, result);
38298               }
38299           });
38300       },
38301
38302
38303       docs: function(params, callback) {
38304           var doRequest = params.debounce ? debouncedRequest : request;
38305           params = clean(setSort(params));
38306
38307           var path = 'key/wiki_pages?';
38308           if (params.value) path = 'tag/wiki_pages?';
38309           else if (params.rtype) path = 'relation/wiki_pages?';
38310
38311           var url = apibase$3 + path + utilQsString(params);
38312           doRequest(url, params, true, callback, function(err, d) {
38313               if (err) {
38314                   callback(err);
38315               } else {
38316                   taginfoCache[url] = d.data;
38317                   callback(null, d.data);
38318               }
38319           });
38320       },
38321
38322
38323       apibase: function(_) {
38324           if (!arguments.length) return apibase$3;
38325           apibase$3 = _;
38326           return this;
38327       }
38328
38329   };
38330
38331   var jsonpCache = {};
38332   window.jsonpCache = jsonpCache;
38333
38334   function jsonpRequest(url, callback) {
38335
38336     if (window.JSONP_FIX) {
38337       if (window.JSONP_DELAY === 0) {
38338         callback(window.JSONP_FIX);
38339       } else {
38340         setTimeout(function() {
38341           callback(window.JSONP_FIX);
38342         }, window.JSONP_DELAY || 0);
38343       }
38344       return;
38345     }
38346
38347     function rand() {
38348       var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
38349         c = '', i = -1;
38350       while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
38351       return c;
38352     }
38353
38354     function create$$1(url) {
38355       var e = url.match(/callback=(\w+)/),
38356         c = e ? e[1] : rand();
38357       jsonpCache[c] = function(data) {
38358         callback(data);
38359         delete jsonpCache[c];
38360         script.remove();
38361       };
38362       return 'jsonpCache.' + c;
38363     }
38364
38365     var cb = create$$1(url),
38366       script = d3_select('head')
38367       .append('script')
38368       .attr('type', 'text/javascript')
38369       .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
38370   }
38371
38372   var endpoint = 'https://www.wikidata.org/w/api.php?';
38373
38374   var serviceWikidata = {
38375
38376       init: function() {},
38377       reset: function() {},
38378
38379
38380       // Given a Wikipedia language and article title, return an array of
38381       // corresponding Wikidata entities.
38382       itemsByTitle: function(lang, title, callback) {
38383           if (!title) {
38384               callback('', {});
38385               return;
38386           }
38387
38388           lang = lang || 'en';
38389           jsonpRequest(endpoint + utilQsString({
38390               action: 'wbgetentities',
38391               format: 'json',
38392               sites: lang.replace(/-/g, '_') + 'wiki',
38393               titles: title,
38394               languages: 'en', // shrink response by filtering to one language
38395               callback: '{callback}'
38396           }), function(data) {
38397               if (!data || data.error) {
38398                   callback('', {});
38399               } else {
38400                   callback(title, data.entities || {});
38401               }
38402           });
38403       }
38404
38405   };
38406
38407   var endpoint$1 = 'https://en.wikipedia.org/w/api.php?';
38408
38409   var serviceWikipedia = {
38410
38411       init: function() {},
38412       reset: function() {},
38413
38414
38415       search: function(lang, query, callback) {
38416           if (!query) {
38417               callback('', []);
38418               return;
38419           }
38420
38421           lang = lang || 'en';
38422           jsonpRequest(endpoint$1.replace('en', lang) +
38423               utilQsString({
38424                   action: 'query',
38425                   list: 'search',
38426                   srlimit: '10',
38427                   srinfo: 'suggestion',
38428                   format: 'json',
38429                   callback: '{callback}',
38430                   srsearch: query
38431               }), function(data) {
38432                   if (!data || !data.query || !data.query.search || data.error) {
38433                       callback('', []);
38434                   } else {
38435                       var results = data.query.search.map(function(d) { return d.title; });
38436                       callback(query, results);
38437                   }
38438               }
38439           );
38440       },
38441
38442
38443       suggestions: function(lang, query, callback) {
38444           if (!query) {
38445               callback('', []);
38446               return;
38447           }
38448
38449           lang = lang || 'en';
38450           jsonpRequest(endpoint$1.replace('en', lang) +
38451               utilQsString({
38452                   action: 'opensearch',
38453                   namespace: 0,
38454                   suggest: '',
38455                   format: 'json',
38456                   callback: '{callback}',
38457                   search: query
38458               }), function(data) {
38459                   if (!data || data.error) {
38460                       callback('', []);
38461                   } else {
38462                       callback(data[0], data[1] || []);
38463                   }
38464               }
38465           );
38466       },
38467
38468
38469       translations: function(lang, title, callback) {
38470           if (!title) {
38471               callback({});
38472               return;
38473           }
38474
38475           jsonpRequest(endpoint$1.replace('en', lang) +
38476               utilQsString({
38477                   action: 'query',
38478                   prop: 'langlinks',
38479                   format: 'json',
38480                   callback: '{callback}',
38481                   lllimit: 500,
38482                   titles: title
38483               }), function(data) {
38484                   if (!data || !data.query || !data.query.pages || data.error) {
38485                       callback({});
38486                   } else {
38487                       var list = data.query.pages[Object.keys(data.query.pages)[0]],
38488                           translations = {};
38489                       if (list && list.langlinks) {
38490                           list.langlinks.forEach(function(d) {
38491                               translations[d.lang] = d['*'];
38492                           });
38493                       }
38494                       callback(translations);
38495                   }
38496               }
38497           );
38498       }
38499
38500   };
38501
38502   var services = {
38503       geocoder: serviceNominatim,
38504       mapillary: serviceMapillary,
38505       openstreetcam: serviceOpenstreetcam,
38506       osm: serviceOsm,
38507       taginfo: serviceTaginfo,
38508       wikidata: serviceWikidata,
38509       wikipedia: serviceWikipedia
38510   };
38511
38512   var _isSaving = false;
38513
38514
38515   function modeSave$$1(context) {
38516       var mode = { id: 'save' };
38517       var keybinding = d3keybinding('modeSave');
38518
38519       var loading = uiLoading(context)
38520           .message(t('save.uploading'))
38521           .blocking(true);
38522
38523       var commit = uiCommit(context)
38524           .on('cancel', cancel)
38525           .on('save', save);
38526
38527       var _toCheck = [];
38528       var _toLoad = [];
38529       var _loaded = {};
38530       var _toLoadCount = 0;
38531       var _toLoadTotal = 0;
38532
38533       var _conflicts = [];
38534       var _errors = [];
38535       var _origChanges;
38536       var _location;
38537
38538
38539       function cancel(selectedID) {
38540           if (selectedID) {
38541               context.enter(modeSelect(context, [selectedID]));
38542           } else {
38543               context.enter(modeBrowse(context));
38544           }
38545       }
38546
38547
38548       function save(changeset, tryAgain, checkConflicts) {
38549           // Guard against accidentally entering save code twice - #4641
38550           if (_isSaving && !tryAgain) {
38551               return;
38552           }
38553
38554           var osm = context.connection();
38555           if (!osm) {
38556               cancel();
38557               return;
38558           }
38559
38560           // If user somehow got logged out mid-save, try to reauthenticate..
38561           // This can happen if they were logged in from before, but the tokens are no longer valid.
38562           if (!osm.authenticated()) {
38563               osm.authenticate(function(err) {
38564                   if (err) {
38565                       cancel();   // quit save mode..
38566                   } else {
38567                       save(changeset, tryAgain, checkConflicts);  // continue where we left off..
38568                   }
38569               });
38570               return;
38571           }
38572
38573           if (!_isSaving) {
38574               keybindingOff();
38575               context.container().call(loading);  // block input
38576               _isSaving = true;
38577           }
38578
38579           var history = context.history();
38580           var localGraph = context.graph();
38581           var remoteGraph = coreGraph$$1(history.base(), true);
38582
38583           _conflicts = [];
38584           _errors = [];
38585
38586           // Store original changes, in case user wants to download them as an .osc file
38587           _origChanges = history.changes(actionDiscardTags(history.difference()));
38588
38589           // First time, `history.perform` a no-op action.
38590           // Any conflict resolutions will be done as `history.replace`
38591           if (!tryAgain) {
38592               history.perform(actionNoop());
38593           }
38594
38595           // Attempt a fast upload.. If there are conflicts, re-enter with `checkConflicts = true`
38596           if (!checkConflicts) {
38597               upload(changeset);
38598
38599           // Do the full (slow) conflict check..
38600           } else {
38601               var modified = filter(history.difference().summary(), { changeType: 'modified' });
38602               _toCheck = map$3(map$3(modified, 'entity'), 'id');
38603               _toLoad = withChildNodes(_toCheck, localGraph);
38604               _loaded = {};
38605               _toLoadCount = 0;
38606               _toLoadTotal = _toLoad.length;
38607
38608               if (_toCheck.length) {
38609                   showProgress(_toLoadCount, _toLoadTotal);
38610                   _toLoad.forEach(function(id) { _loaded[id] = false; });
38611                   osm.loadMultiple(_toLoad, loaded);
38612               } else {
38613                   upload(changeset);
38614               }
38615           }
38616
38617           return;
38618
38619
38620           function withChildNodes(ids, graph) {
38621               return uniq(reduce(ids, function(result, id) {
38622                   var entity = graph.entity(id);
38623                   if (entity.type === 'way') {
38624                       try {
38625                           var children = graph.childNodes(entity);
38626                           result.push.apply(result, map$3(filter(children, 'version'), 'id'));
38627                       } catch (err) {
38628                           /* eslint-disable no-console */
38629                           if (typeof console !== 'undefined') console.error(err);
38630                           /* eslint-enable no-console */
38631                       }
38632                   }
38633                   return result;
38634               }, clone(ids)));
38635           }
38636
38637
38638           // Reload modified entities into an alternate graph and check for conflicts..
38639           function loaded(err, result) {
38640               if (_errors.length) return;
38641
38642               if (err) {
38643                   _errors.push({
38644                       msg: err.message || err.responseText,
38645                       details: [ t('save.status_code', { code: err.status }) ]
38646                   });
38647                   showErrors();
38648
38649               } else {
38650                   var loadMore = [];
38651
38652                   result.data.forEach(function(entity) {
38653                       remoteGraph.replace(entity);
38654                       _loaded[entity.id] = true;
38655                       _toLoad = without(_toLoad, entity.id);
38656
38657                       if (!entity.visible) return;
38658
38659                       // Because loadMultiple doesn't download /full like loadEntity,
38660                       // need to also load children that aren't already being checked..
38661                       var i, id;
38662                       if (entity.type === 'way') {
38663                           for (i = 0; i < entity.nodes.length; i++) {
38664                               id = entity.nodes[i];
38665                               if (_loaded[id] === undefined) {
38666                                   _loaded[id] = false;
38667                                   loadMore.push(id);
38668                               }
38669                           }
38670                       } else if (entity.type === 'relation' && entity.isMultipolygon()) {
38671                           for (i = 0; i < entity.members.length; i++) {
38672                               id = entity.members[i].id;
38673                               if (_loaded[id] === undefined) {
38674                                   _loaded[id] = false;
38675                                   loadMore.push(id);
38676                               }
38677                           }
38678                       }
38679                   });
38680
38681                   _toLoadCount += result.data.length;
38682                   _toLoadTotal += loadMore.length;
38683                   showProgress(_toLoadCount, _toLoadTotal);
38684
38685                   if (loadMore.length) {
38686                       _toLoad.push.apply(_toLoad, loadMore);
38687                       osm.loadMultiple(loadMore, loaded);
38688                   }
38689
38690                   if (!_toLoad.length) {
38691                       detectConflicts();
38692                   }
38693               }
38694           }
38695
38696
38697           function detectConflicts() {
38698               function choice(id, text, action) {
38699                   return { id: id, text: text, action: function() { history.replace(action); } };
38700               }
38701               function formatUser(d) {
38702                   return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
38703               }
38704               function entityName(entity) {
38705                   return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
38706               }
38707
38708               function sameVersions(local$$1, remote) {
38709                   if (local$$1.version !== remote.version) return false;
38710
38711                   if (local$$1.type === 'way') {
38712                       var children = union(local$$1.nodes, remote.nodes);
38713                       for (var i = 0; i < children.length; i++) {
38714                           var a = localGraph.hasEntity(children[i]);
38715                           var b = remoteGraph.hasEntity(children[i]);
38716                           if (a && b && a.version !== b.version) return false;
38717                       }
38718                   }
38719
38720                   return true;
38721               }
38722
38723               _toCheck.forEach(function(id) {
38724                   var local$$1 = localGraph.entity(id);
38725                   var remote = remoteGraph.entity(id);
38726
38727                   if (sameVersions(local$$1, remote)) return;
38728
38729                   var action = actionMergeRemoteChanges;
38730                   var merge = action(id, localGraph, remoteGraph, formatUser);
38731
38732                   history.replace(merge);
38733
38734                   var mergeConflicts = merge.conflicts();
38735                   if (!mergeConflicts.length) return;  // merged safely
38736
38737                   var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local');
38738                   var forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote');
38739                   var keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore'));
38740                   var keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
38741
38742                   _conflicts.push({
38743                       id: id,
38744                       name: entityName(local$$1),
38745                       details: mergeConflicts,
38746                       chosen: 1,
38747                       choices: [
38748                           choice(id, keepMine, forceLocal),
38749                           choice(id, keepTheirs, forceRemote)
38750                       ]
38751                   });
38752               });
38753
38754               upload(changeset);
38755           }
38756       }
38757
38758
38759       function upload(changeset) {
38760           var osm = context.connection();
38761           if (!osm) {
38762               _errors.push({ msg: 'No OSM Service' });
38763           }
38764
38765           if (_conflicts.length) {
38766               _conflicts.sort(function(a, b) { return b.id.localeCompare(a.id); });
38767               showConflicts(changeset);
38768
38769           } else if (_errors.length) {
38770               showErrors();
38771
38772           } else {
38773               var history = context.history();
38774               var changes = history.changes(actionDiscardTags(history.difference()));
38775               if (changes.modified.length || changes.created.length || changes.deleted.length) {
38776                   loadLocation();  // so it is ready when we display the save screen
38777                   osm.putChangeset(changeset, changes, uploadCallback);
38778               } else {        // changes were insignificant or reverted by user
38779                   d3_select('.inspector-wrap *').remove();
38780                   loading.close();
38781                   _isSaving = false;
38782                   context.flush();
38783                   cancel();
38784               }
38785           }
38786       }
38787
38788
38789       function uploadCallback(err, changeset) {
38790           if (err) {
38791               if (err.status === 409) {          // 409 Conflict
38792                   save(changeset, true, true);   // tryAgain = true, checkConflicts = true
38793               } else {
38794                   _errors.push({
38795                       msg: err.message || err.responseText,
38796                       details: [ t('save.status_code', { code: err.status }) ]
38797                   });
38798                   showErrors();
38799               }
38800
38801           } else {
38802               context.history().clearSaved();
38803               success(changeset);
38804               // Add delay to allow for postgres replication #1646 #2678
38805               window.setTimeout(function() {
38806                   d3_select('.inspector-wrap *').remove();
38807                   loading.close();
38808                   _isSaving = false;
38809                   context.flush();
38810               }, 2500);
38811           }
38812       }
38813
38814
38815       function showProgress(num, total) {
38816           var modal = context.container().select('.loading-modal .modal-section');
38817           var progress = modal.selectAll('.progress')
38818               .data([0]);
38819
38820           // enter/update
38821           progress.enter()
38822               .append('div')
38823               .attr('class', 'progress')
38824               .merge(progress)
38825               .text(t('save.conflict_progress', { num: num, total: total }));
38826       }
38827
38828
38829       function showConflicts(changeset) {
38830           var history = context.history();
38831           var selection$$1 = context.container()
38832               .select('#sidebar')
38833               .append('div')
38834               .attr('class','sidebar-component');
38835
38836           loading.close();
38837           _isSaving = false;
38838
38839           var ui = uiConflicts(context)
38840               .conflictList(_conflicts)
38841               .origChanges(_origChanges)
38842               .on('cancel', function() {
38843                   history.pop();
38844                   selection$$1.remove();
38845                   keybindingOn();
38846               })
38847               .on('save', function() {
38848                   for (var i = 0; i < _conflicts.length; i++) {
38849                       if (_conflicts[i].chosen === 1) {  // user chose "keep theirs"
38850                           var entity = context.hasEntity(_conflicts[i].id);
38851                           if (entity && entity.type === 'way') {
38852                               var children = uniq(entity.nodes);
38853                               for (var j = 0; j < children.length; j++) {
38854                                   history.replace(actionRevert(children[j]));
38855                               }
38856                           }
38857                           history.replace(actionRevert(_conflicts[i].id));
38858                       }
38859                   }
38860
38861                   selection$$1.remove();
38862                   save(changeset, true, false);  // tryAgain = true, checkConflicts = false
38863               });
38864
38865           selection$$1.call(ui);
38866       }
38867
38868
38869       function showErrors() {
38870           keybindingOn();
38871           context.history().pop();
38872           loading.close();
38873           _isSaving = false;
38874
38875           var selection$$1 = uiConfirm(context.container());
38876           selection$$1
38877               .select('.modal-section.header')
38878               .append('h3')
38879               .text(t('save.error'));
38880
38881           addErrors(selection$$1, _errors);
38882           selection$$1.okButton();
38883       }
38884
38885
38886       function addErrors(selection$$1, data) {
38887           var message = selection$$1
38888               .select('.modal-section.message-text');
38889
38890           var items = message
38891               .selectAll('.error-container')
38892               .data(data);
38893
38894           var enter = items.enter()
38895               .append('div')
38896               .attr('class', 'error-container');
38897
38898           enter
38899               .append('a')
38900               .attr('class', 'error-description')
38901               .attr('href', '#')
38902               .classed('hide-toggle', true)
38903               .text(function(d) { return d.msg || t('save.unknown_error_details'); })
38904               .on('click', function() {
38905                   event.preventDefault();
38906
38907                   var error = d3_select(this);
38908                   var detail = d3_select(this.nextElementSibling);
38909                   var exp = error.classed('expanded');
38910
38911                   detail.style('display', exp ? 'none' : 'block');
38912                   error.classed('expanded', !exp);
38913               });
38914
38915           var details = enter
38916               .append('div')
38917               .attr('class', 'error-detail-container')
38918               .style('display', 'none');
38919
38920           details
38921               .append('ul')
38922               .attr('class', 'error-detail-list')
38923               .selectAll('li')
38924               .data(function(d) { return d.details || []; })
38925               .enter()
38926               .append('li')
38927               .attr('class', 'error-detail-item')
38928               .text(function(d) { return d; });
38929
38930           items.exit()
38931               .remove();
38932       }
38933
38934
38935       function success(changeset) {
38936           commit.reset();
38937
38938           var ui = uiSuccess$$1(context)
38939               .changeset(changeset)
38940               .location(_location)
38941               .on('cancel', function() { context.ui().sidebar.hide(); });
38942
38943           context.enter(modeBrowse(context).sidebar(ui));
38944       }
38945
38946
38947       function keybindingOn() {
38948           d3_select(document)
38949               .call(keybinding.on('⎋', cancel, true));
38950       }
38951
38952
38953       function keybindingOff() {
38954           d3_select(document)
38955               .call(keybinding.off);
38956       }
38957
38958
38959       // Reverse geocode current map location so we can display a message on
38960       // the success screen like "Thank you for editing around city, state."
38961       function loadLocation() {
38962           _location = null;
38963           if (!services.geocoder) return;
38964
38965           services.geocoder.reverse(context.map().center(), function(err, result) {
38966               if (err || !result || !result.address) return;
38967
38968               var parts = [];
38969               var addr = result.address;
38970               var city = addr && (addr.suburb || addr.city || addr.county);
38971               if (city) parts.push(city);
38972               var region = addr && (addr.state || addr.country);
38973               if (region) parts.push(region);
38974
38975               _location = parts.join(', ');
38976           });
38977       }
38978
38979
38980       mode.enter = function() {
38981           function done() {
38982               context.ui().sidebar.show(commit);
38983           }
38984
38985           keybindingOn();
38986
38987           context.container().selectAll('#content')
38988               .attr('class', 'inactive');
38989
38990           var osm = context.connection();
38991           if (!osm) {
38992               cancel();
38993               return;
38994           }
38995
38996           if (osm.authenticated()) {
38997               done();
38998           } else {
38999               osm.authenticate(function(err) {
39000                   if (err) {
39001                       cancel();
39002                   } else {
39003                       done();
39004                   }
39005               });
39006           }
39007       };
39008
39009
39010       mode.exit = function() {
39011           _isSaving = false;
39012
39013           keybindingOff();
39014
39015           context.container().selectAll('#content')
39016               .attr('class', 'active');
39017
39018           context.ui().sidebar.hide();
39019       };
39020
39021       return mode;
39022   }
39023
39024   /* Built-in method references for those with the same name as other `lodash` methods. */
39025   var nativeMin$1 = Math.min;
39026
39027   /**
39028    * The base implementation of methods like `_.intersection`, without support
39029    * for iteratee shorthands, that accepts an array of arrays to inspect.
39030    *
39031    * @private
39032    * @param {Array} arrays The arrays to inspect.
39033    * @param {Function} [iteratee] The iteratee invoked per element.
39034    * @param {Function} [comparator] The comparator invoked per element.
39035    * @returns {Array} Returns the new array of shared values.
39036    */
39037   function baseIntersection(arrays, iteratee, comparator) {
39038     var includes = comparator ? arrayIncludesWith : arrayIncludes,
39039         length = arrays[0].length,
39040         othLength = arrays.length,
39041         othIndex = othLength,
39042         caches = Array(othLength),
39043         maxLength = Infinity,
39044         result = [];
39045
39046     while (othIndex--) {
39047       var array = arrays[othIndex];
39048       if (othIndex && iteratee) {
39049         array = arrayMap(array, baseUnary(iteratee));
39050       }
39051       maxLength = nativeMin$1(array.length, maxLength);
39052       caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
39053         ? new SetCache(othIndex && array)
39054         : undefined;
39055     }
39056     array = arrays[0];
39057
39058     var index = -1,
39059         seen = caches[0];
39060
39061     outer:
39062     while (++index < length && result.length < maxLength) {
39063       var value = array[index],
39064           computed = iteratee ? iteratee(value) : value;
39065
39066       value = (comparator || value !== 0) ? value : 0;
39067       if (!(seen
39068             ? cacheHas(seen, computed)
39069             : includes(result, computed, comparator)
39070           )) {
39071         othIndex = othLength;
39072         while (--othIndex) {
39073           var cache = caches[othIndex];
39074           if (!(cache
39075                 ? cacheHas(cache, computed)
39076                 : includes(arrays[othIndex], computed, comparator))
39077               ) {
39078             continue outer;
39079           }
39080         }
39081         if (seen) {
39082           seen.push(computed);
39083         }
39084         result.push(value);
39085       }
39086     }
39087     return result;
39088   }
39089
39090   /**
39091    * Casts `value` to an empty array if it's not an array like object.
39092    *
39093    * @private
39094    * @param {*} value The value to inspect.
39095    * @returns {Array|Object} Returns the cast array-like object.
39096    */
39097   function castArrayLikeObject(value) {
39098     return isArrayLikeObject(value) ? value : [];
39099   }
39100
39101   /**
39102    * Creates an array of unique values that are included in all given arrays
39103    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
39104    * for equality comparisons. The order and references of result values are
39105    * determined by the first array.
39106    *
39107    * @static
39108    * @memberOf _
39109    * @since 0.1.0
39110    * @category Array
39111    * @param {...Array} [arrays] The arrays to inspect.
39112    * @returns {Array} Returns the new array of intersecting values.
39113    * @example
39114    *
39115    * _.intersection([2, 1], [2, 3]);
39116    * // => [2]
39117    */
39118   var intersection = baseRest(function(arrays) {
39119     var mapped = arrayMap(arrays, castArrayLikeObject);
39120     return (mapped.length && mapped[0] === arrays[0])
39121       ? baseIntersection(mapped)
39122       : [];
39123   });
39124
39125   // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
39126   // For example, ⌘Z -> Ctrl+Z
39127   var uiCmd = function (code) {
39128       var detected = utilDetect();
39129
39130       if (detected.os === 'mac') {
39131           return code;
39132       }
39133
39134       if (detected.os === 'win') {
39135           if (code === '⌘⇧Z') return 'Ctrl+Y';
39136       }
39137
39138       var result = '',
39139           replacements = {
39140               '⌘': 'Ctrl',
39141               '⇧': 'Shift',
39142               '⌥': 'Alt',
39143               '⌫': 'Backspace',
39144               '⌦': 'Delete'
39145           };
39146
39147       for (var i = 0; i < code.length; i++) {
39148           if (code[i] in replacements) {
39149               result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
39150           } else {
39151               result += code[i];
39152           }
39153       }
39154
39155       return result;
39156   };
39157
39158
39159   // return a display-focused string for a given keyboard code
39160   uiCmd.display = function(code) {
39161       if (code.length !== 1) return code;
39162
39163       var detected = utilDetect();
39164       var mac = (detected.os === 'mac');
39165       var replacements = {
39166           '⌘': mac ? '⌘ ' + t('shortcuts.key.cmd')    : t('shortcuts.key.ctrl'),
39167           '⇧': mac ? '⇧ ' + t('shortcuts.key.shift')  : t('shortcuts.key.shift'),
39168           '⌥': mac ? '⌥ ' + t('shortcuts.key.option') : t('shortcuts.key.alt'),
39169           '⌃': mac ? '⌃ ' + t('shortcuts.key.ctrl')   : t('shortcuts.key.ctrl'),
39170           '⌫': mac ? '⌫ ' + t('shortcuts.key.delete') : t('shortcuts.key.backspace'),
39171           '⌦': mac ? '⌦ ' + t('shortcuts.key.del')    : t('shortcuts.key.del'),
39172           '↖': mac ? '↖ ' + t('shortcuts.key.pgup')   : t('shortcuts.key.pgup'),
39173           '↘': mac ? '↘ ' + t('shortcuts.key.pgdn')   : t('shortcuts.key.pgdn'),
39174           '⇞': mac ? '⇞ ' + t('shortcuts.key.home')   : t('shortcuts.key.home'),
39175           '⇟': mac ? '⇟ ' + t('shortcuts.key.end')    : t('shortcuts.key.end'),
39176           '↵': mac ? '↵ ' + t('shortcuts.key.return') : t('shortcuts.key.enter'),
39177           '⎋': mac ? '⎋ ' + t('shortcuts.key.esc')    : t('shortcuts.key.esc'),
39178       };
39179
39180       return replacements[code] || code;
39181   };
39182
39183   var relatedParent;
39184
39185
39186   function modeSelect(context, selectedIDs) {
39187       var mode = {
39188           id: 'select',
39189           button: 'browse'
39190       };
39191
39192       var keybinding = d3keybinding('select');
39193       var timeout = null;
39194       var behaviors = [
39195           behaviorCopy(context),
39196           behaviorPaste(context),
39197           behaviorBreathe(context),
39198           behaviorHover(context),
39199           behaviorSelect(context),
39200           behaviorLasso(context),
39201           modeDragNode$$1(context).restoreSelectedIDs(selectedIDs).behavior
39202       ];
39203       var inspector;
39204       var editMenu;
39205       var newFeature = false;
39206       var suppressMenu = true;
39207       var follow = false;
39208
39209
39210       var wrap = context.container()
39211           .select('.inspector-wrap');
39212
39213
39214       function singular() {
39215           if (selectedIDs.length === 1) {
39216               return context.hasEntity(selectedIDs[0]);
39217           }
39218       }
39219
39220
39221       function checkSelectedIDs() {
39222           var ids = [];
39223           if (Array.isArray(selectedIDs)) {
39224               ids = selectedIDs.filter(function(id) {
39225                   return context.hasEntity(id);
39226               });
39227           }
39228
39229           if (ids.length) {
39230               selectedIDs = ids;
39231           } else {
39232               context.enter(modeBrowse(context));
39233           }
39234           return !!ids.length;
39235       }
39236
39237
39238       // find the common parent ways for nextVertex, previousVertex
39239       function commonParents() {
39240           var graph = context.graph();
39241           var commonParents = [];
39242
39243           for (var i = 0; i < selectedIDs.length; i++) {
39244               var entity = context.hasEntity(selectedIDs[i]);
39245               if (!entity || entity.geometry(graph) !== 'vertex') {
39246                   return [];  // selection includes some not vertexes
39247               }
39248
39249               var currParents = map$3(graph.parentWays(entity), 'id');
39250               if (!commonParents.length) {
39251                   commonParents = currParents;
39252                   continue;
39253               }
39254
39255               commonParents = intersection(commonParents, currParents);
39256               if (!commonParents.length) {
39257                   return [];
39258               }
39259           }
39260
39261           return commonParents;
39262       }
39263
39264
39265       function singularParent() {
39266           var parents = commonParents();
39267           if (!parents || parents.length === 0) {
39268               relatedParent = null;
39269               return null;
39270           }
39271
39272           // relatedParent is used when we visit a vertex with multiple
39273           // parents, and we want to remember which parent line we started on.
39274
39275           if (parents.length === 1) {
39276               relatedParent = parents[0];  // remember this parent for later
39277               return relatedParent;
39278           }
39279
39280           if (parents.indexOf(relatedParent) !== -1) {
39281               return relatedParent;   // prefer the previously seen parent
39282           }
39283
39284           return parents[0];
39285       }
39286
39287
39288       function closeMenu() {
39289           if (editMenu) {
39290               context.surface().call(editMenu.close);
39291           }
39292       }
39293
39294
39295       function positionMenu() {
39296           if (!editMenu) { return; }
39297
39298           var entity = singular();
39299           if (entity && context.geometry(entity.id) === 'relation') {
39300               suppressMenu = true;
39301           } else {
39302               var point$$1 = context.mouse();
39303               var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
39304
39305               if (point$$1 && geoPointInPolygon(point$$1, viewport)) {
39306                   editMenu.center(point$$1);
39307               } else {
39308                   suppressMenu = true;
39309               }
39310           }
39311       }
39312
39313
39314       function showMenu() {
39315           closeMenu();
39316           if (editMenu) {
39317               context.surface().call(editMenu);
39318           }
39319       }
39320
39321
39322       function toggleMenu() {
39323           // deprecation warning - Radial Menu to be removed in iD v3
39324           if (d3_select('.edit-menu, .radial-menu').empty()) {
39325               positionMenu();
39326               showMenu();
39327           } else {
39328               closeMenu();
39329           }
39330       }
39331
39332
39333       mode.selectedIDs = function() {
39334           return selectedIDs;
39335       };
39336
39337
39338       mode.reselect = function() {
39339           if (!checkSelectedIDs()) return;
39340
39341           var surfaceNode = context.surface().node();
39342           if (surfaceNode.focus) {   // FF doesn't support it
39343               surfaceNode.focus();
39344           }
39345
39346           positionMenu();
39347           if (!suppressMenu) {
39348               showMenu();
39349           }
39350       };
39351
39352
39353       mode.newFeature = function(_) {
39354           if (!arguments.length) return newFeature;
39355           newFeature = _;
39356           return mode;
39357       };
39358
39359
39360       mode.suppressMenu = function(_) {
39361           if (!arguments.length) return suppressMenu;
39362           suppressMenu = _;
39363           return mode;
39364       };
39365
39366
39367       mode.follow = function(_) {
39368           if (!arguments.length) return follow;
39369           follow = _;
39370           return mode;
39371       };
39372
39373
39374       mode.enter = function() {
39375
39376           function update() {
39377               closeMenu();
39378               checkSelectedIDs();
39379           }
39380
39381
39382           function dblclick() {
39383               var target = d3_select(event.target);
39384
39385               var datum = target.datum();
39386               var entity = datum && datum.properties && datum.properties.entity;
39387               if (!entity) return;
39388
39389               if (entity instanceof osmWay && target.classed('target')) {
39390                   var choice = geoChooseEdge(context.childNodes(entity), context.mouse(), context.projection);
39391                   var prev = entity.nodes[choice.index - 1];
39392                   var next = entity.nodes[choice.index];
39393
39394                   context.perform(
39395                       actionAddMidpoint({loc: choice.loc, edge: [prev, next]}, osmNode()),
39396                       t('operations.add.annotation.vertex')
39397                   );
39398
39399                   event.preventDefault();
39400                   event.stopPropagation();
39401
39402               } else if (entity.type === 'midpoint') {
39403                   context.perform(
39404                       actionAddMidpoint({loc: entity.loc, edge: entity.edge}, osmNode()),
39405                       t('operations.add.annotation.vertex'));
39406
39407                   event.preventDefault();
39408                   event.stopPropagation();
39409               }
39410           }
39411
39412
39413           function selectElements(drawn) {
39414               if (!checkSelectedIDs()) return;
39415
39416               var surface = context.surface();
39417               var entity = singular();
39418
39419               if (entity && context.geometry(entity.id) === 'relation') {
39420                   suppressMenu = true;
39421                   return;
39422               }
39423
39424               surface.selectAll('.related')
39425                   .classed('related', false);
39426
39427               singularParent();
39428               if (relatedParent) {
39429                   surface.selectAll(utilEntitySelector([relatedParent]))
39430                       .classed('related', true);
39431               }
39432
39433               var selection$$1 = context.surface()
39434                   .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
39435
39436               if (selection$$1.empty()) {
39437                   // Return to browse mode if selected DOM elements have
39438                   // disappeared because the user moved them out of view..
39439                   var source = event && event.type === 'zoom' && event.sourceEvent;
39440                   if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
39441                       context.enter(modeBrowse(context));
39442                   }
39443               } else {
39444                   selection$$1
39445                       .classed('selected', true);
39446               }
39447           }
39448
39449
39450           function esc() {
39451               context.enter(modeBrowse(context));
39452           }
39453
39454
39455           function firstVertex() {
39456               event.preventDefault();
39457               var entity = singular();
39458               var parent = singularParent();
39459               var way;
39460
39461               if (entity && entity.type === 'way') {
39462                   way = entity;
39463               } else if (parent) {
39464                   way = context.entity(parent);
39465               }
39466
39467               if (way) {
39468                   context.enter(
39469                       modeSelect(context, [way.first()]).follow(true)
39470                   );
39471               }
39472           }
39473
39474
39475           function lastVertex() {
39476               event.preventDefault();
39477               var entity = singular();
39478               var parent = singularParent();
39479               var way;
39480
39481               if (entity && entity.type === 'way') {
39482                   way = entity;
39483               } else if (parent) {
39484                   way = context.entity(parent);
39485               }
39486
39487               if (way) {
39488                   context.enter(
39489                       modeSelect(context, [way.last()]).follow(true)
39490                   );
39491               }
39492           }
39493
39494
39495           function previousVertex() {
39496               event.preventDefault();
39497               var parent = singularParent();
39498               if (!parent) return;
39499
39500               var way = context.entity(parent);
39501               var length = way.nodes.length;
39502               var curr = way.nodes.indexOf(selectedIDs[0]);
39503               var index = -1;
39504
39505               if (curr > 0) {
39506                   index = curr - 1;
39507               } else if (way.isClosed()) {
39508                   index = length - 2;
39509               }
39510
39511               if (index !== -1) {
39512                   context.enter(
39513                       modeSelect(context, [way.nodes[index]]).follow(true)
39514                   );
39515               }
39516           }
39517
39518
39519           function nextVertex() {
39520               event.preventDefault();
39521               var parent = singularParent();
39522               if (!parent) return;
39523
39524               var way = context.entity(parent);
39525               var length = way.nodes.length;
39526               var curr = way.nodes.indexOf(selectedIDs[0]);
39527               var index = -1;
39528
39529               if (curr < length - 1) {
39530                   index = curr + 1;
39531               } else if (way.isClosed()) {
39532                   index = 0;
39533               }
39534
39535               if (index !== -1) {
39536                   context.enter(
39537                       modeSelect(context, [way.nodes[index]]).follow(true)
39538                   );
39539               }
39540           }
39541
39542
39543           function nextParent() {
39544               event.preventDefault();
39545               var parents = uniq(commonParents());
39546               if (!parents || parents.length < 2) return;
39547
39548               var index = parents.indexOf(relatedParent);
39549               if (index < 0 || index > parents.length - 2) {
39550                   relatedParent = parents[0];
39551               } else {
39552                   relatedParent = parents[index + 1];
39553               }
39554
39555               var surface = context.surface();
39556               surface.selectAll('.related')
39557                   .classed('related', false);
39558
39559               if (relatedParent) {
39560                   surface.selectAll(utilEntitySelector([relatedParent]))
39561                       .classed('related', true);
39562               }
39563           }
39564
39565
39566           if (!checkSelectedIDs()) return;
39567
39568           var operations = without(values$1(Operations), operationDelete)
39569               .map(function(o) { return o(selectedIDs, context); })
39570               .filter(function(o) { return o.available(); });
39571
39572           // deprecation warning - Radial Menu to be removed in iD v3
39573           var isRadialMenu = context.storage('edit-menu-style') === 'radial';
39574           if (isRadialMenu) {
39575               operations = operations.slice(0,7);
39576               operations.unshift(operationDelete(selectedIDs, context));
39577           } else {
39578               operations.push(operationDelete(selectedIDs, context));
39579           }
39580
39581           operations.forEach(function(operation) {
39582               if (operation.behavior) {
39583                   behaviors.push(operation.behavior);
39584               }
39585           });
39586
39587           behaviors.forEach(function(behavior) {
39588               context.install(behavior);
39589           });
39590
39591           keybinding
39592               .on(['[', 'pgup'], previousVertex)
39593               .on([']', 'pgdown'], nextVertex)
39594               .on(['{', uiCmd('⌘['), 'home'], firstVertex)
39595               .on(['}', uiCmd('⌘]'), 'end'], lastVertex)
39596               .on(['\\', 'pause'], nextParent)
39597               .on('⎋', esc, true)
39598               .on('space', toggleMenu);
39599
39600           d3_select(document)
39601               .call(keybinding);
39602
39603
39604           // deprecation warning - Radial Menu to be removed in iD v3
39605           editMenu = isRadialMenu
39606               ? uiRadialMenu(context, operations)
39607               : uiEditMenu(context, operations);
39608
39609           context.ui().sidebar
39610               .select(singular() ? singular().id : null, newFeature);
39611
39612           context.history()
39613               .on('undone.select', update)
39614               .on('redone.select', update);
39615
39616           context.map()
39617               .on('move.select', closeMenu)
39618               .on('drawn.select', selectElements);
39619
39620           context.surface()
39621               .on('dblclick.select', dblclick);
39622
39623
39624           selectElements();
39625
39626           if (selectedIDs.length > 1) {
39627               var entities = uiSelectionList(context, selectedIDs);
39628               context.ui().sidebar.show(entities);
39629           }
39630
39631           if (follow) {
39632               var extent = geoExtent$$1();
39633               var graph = context.graph();
39634               selectedIDs.forEach(function(id) {
39635                   var entity = context.entity(id);
39636                   extent._extend(entity.extent(graph));
39637               });
39638
39639               var loc = extent.center();
39640               context.map().centerEase(loc);
39641           } else if (singular() && singular().type === 'way') {
39642               context.map().pan([0,0]);  // full redraw, to adjust z-sorting #2914
39643           }
39644
39645           timeout = window.setTimeout(function() {
39646               positionMenu();
39647               if (!suppressMenu) {
39648                   showMenu();
39649               }
39650           }, 270);  /* after any centerEase completes */
39651
39652       };
39653
39654
39655       mode.exit = function() {
39656           if (timeout) window.clearTimeout(timeout);
39657           if (inspector) wrap.call(inspector.close);
39658
39659           behaviors.forEach(function(behavior) {
39660               context.uninstall(behavior);
39661           });
39662
39663           keybinding.off();
39664           closeMenu();
39665           editMenu = undefined;
39666
39667           context.history()
39668               .on('undone.select', null)
39669               .on('redone.select', null);
39670
39671           var surface = context.surface();
39672
39673           surface
39674               .on('dblclick.select', null);
39675
39676           surface
39677               .selectAll('.selected')
39678               .classed('selected', false);
39679
39680           surface
39681               .selectAll('.related')
39682               .classed('related', false);
39683
39684           context.map().on('drawn.select', null);
39685           context.ui().sidebar.hide();
39686       };
39687
39688
39689       return mode;
39690   }
39691
39692   function behaviorAddWay(context) {
39693       var dispatch$$1 = dispatch('start', 'startFromWay', 'startFromNode'),
39694           draw = behaviorDraw(context);
39695
39696       var addWay = function(surface) {
39697           draw.on('click', function() { dispatch$$1.apply('start', this, arguments); })
39698               .on('clickWay', function() { dispatch$$1.apply('startFromWay', this, arguments); })
39699               .on('clickNode', function() { dispatch$$1.apply('startFromNode', this, arguments); })
39700               .on('cancel', addWay.cancel)
39701               .on('finish', addWay.cancel);
39702
39703           context.map()
39704               .dblclickEnable(false);
39705
39706           surface.call(draw);
39707       };
39708
39709
39710       addWay.off = function(surface) {
39711           surface.call(draw.off);
39712       };
39713
39714
39715       addWay.cancel = function() {
39716           window.setTimeout(function() {
39717               context.map().dblclickEnable(true);
39718           }, 1000);
39719
39720           context.enter(modeBrowse(context));
39721       };
39722
39723
39724       addWay.tail = function(text) {
39725           draw.tail(text);
39726           return addWay;
39727       };
39728
39729
39730       return utilRebind(addWay, dispatch$$1, 'on');
39731   }
39732
39733   function behaviorBreathe() {
39734       var duration = 800,
39735           steps = 4,
39736           selector$$1 = '.selected.shadow, .selected .shadow',
39737           selected = d3_select(null),
39738           classed = '',
39739           params = {},
39740           done = false,
39741           timer$$1;
39742
39743
39744       function ratchetyInterpolator(a, b, steps, units) {
39745           a = parseFloat(a);
39746           b = parseFloat(b);
39747           var sample = quantize()
39748               .domain([0, 1])
39749               .range(d3_quantize(d3_interpolateNumber(a, b), steps));
39750
39751           return function(t) {
39752               return String(sample(t)) + (units || '');
39753           };
39754       }
39755
39756
39757       function reset(selection$$1) {
39758           selection$$1
39759               .style('stroke-opacity', null)
39760               .style('stroke-width', null)
39761               .style('fill-opacity', null)
39762               .style('r', null);
39763       }
39764
39765
39766       function setAnimationParams(transition, fromTo) {
39767           var toFrom = (fromTo === 'from' ? 'to' : 'from');
39768
39769           transition
39770               .styleTween('stroke-opacity', function(d) {
39771                   return ratchetyInterpolator(
39772                       params[d.id][toFrom].opacity,
39773                       params[d.id][fromTo].opacity,
39774                       steps
39775                   );
39776               })
39777               .styleTween('stroke-width', function(d) {
39778                   return ratchetyInterpolator(
39779                       params[d.id][toFrom].width,
39780                       params[d.id][fromTo].width,
39781                       steps,
39782                       'px'
39783                   );
39784               })
39785               .styleTween('fill-opacity', function(d) {
39786                   return ratchetyInterpolator(
39787                       params[d.id][toFrom].opacity,
39788                       params[d.id][fromTo].opacity,
39789                       steps
39790                   );
39791               })
39792               .styleTween('r', function(d) {
39793                   return ratchetyInterpolator(
39794                       params[d.id][toFrom].width,
39795                       params[d.id][fromTo].width,
39796                       steps,
39797                       'px'
39798                   );
39799               });
39800       }
39801
39802
39803       function calcAnimationParams(selection$$1) {
39804           selection$$1
39805               .call(reset)
39806               .each(function(d) {
39807                   var s = d3_select(this),
39808                       tag = s.node().tagName,
39809                       p = {'from': {}, 'to': {}},
39810                       opacity, width;
39811
39812                   // determine base opacity and width
39813                   if (tag === 'circle') {
39814                       opacity = parseFloat(s.style('fill-opacity') || 0.5);
39815                       width = parseFloat(s.style('r') || 15.5);
39816                   } else {
39817                       opacity = parseFloat(s.style('stroke-opacity') || 0.7);
39818                       width = parseFloat(s.style('stroke-width') || 10);
39819                   }
39820
39821                   // calculate from/to interpolation params..
39822                   p.tag = tag;
39823                   p.from.opacity = opacity * 0.6;
39824                   p.to.opacity = opacity * 1.25;
39825                   p.from.width = width * 0.7;
39826                   p.to.width = width * (tag === 'circle' ? 1.5 : 1);
39827                   params[d.id] = p;
39828               });
39829       }
39830
39831
39832       function run(surface, fromTo) {
39833           var toFrom = (fromTo === 'from' ? 'to' : 'from'),
39834               currSelected = surface.selectAll(selector$$1),
39835               currClassed = surface.attr('class');
39836
39837           if (done || currSelected.empty()) {
39838               selected.call(reset);
39839               return;
39840           }
39841
39842           if (!isEqual(currSelected.data(), selected.data()) || currClassed !== classed) {
39843               selected.call(reset);
39844               classed = currClassed;
39845               selected = currSelected.call(calcAnimationParams);
39846           }
39847
39848           selected
39849               .transition()
39850               .duration(duration)
39851               .call(setAnimationParams, fromTo)
39852               .on('end', function() {
39853                   surface.call(run, toFrom);
39854               });
39855       }
39856
39857
39858       var breathe = function(surface) {
39859           done = false;
39860           timer$$1 = timer(function() {
39861               // wait for elements to actually become selected
39862               if (surface.selectAll(selector$$1).empty()) {
39863                   return false;
39864               }
39865
39866               surface.call(run, 'from');
39867               timer$$1.stop();
39868               return true;
39869           }, 20);
39870       };
39871
39872
39873       breathe.off = function() {
39874           done = true;
39875           if (timer$$1) {
39876               timer$$1.stop();
39877           }
39878           selected
39879               .interrupt()
39880               .call(reset);
39881       };
39882
39883
39884       return breathe;
39885   }
39886
39887   function behaviorCopy(context) {
39888       var keybinding = d3keybinding('copy');
39889
39890
39891       function groupEntities(ids, graph) {
39892           var entities = ids.map(function (id) { return graph.entity(id); });
39893           return assignIn({relation: [], way: [], node: []},
39894               groupBy(entities, function(entity) { return entity.type; }));
39895       }
39896
39897
39898       function getDescendants(id, graph, descendants) {
39899           var entity = graph.entity(id),
39900               i, children;
39901
39902           descendants = descendants || {};
39903
39904           if (entity.type === 'relation') {
39905               children = map$3(entity.members, 'id');
39906           } else if (entity.type === 'way') {
39907               children = entity.nodes;
39908           } else {
39909               children = [];
39910           }
39911
39912           for (i = 0; i < children.length; i++) {
39913               if (!descendants[children[i]]) {
39914                   descendants[children[i]] = true;
39915                   descendants = getDescendants(children[i], graph, descendants);
39916               }
39917           }
39918
39919           return descendants;
39920       }
39921
39922
39923       function doCopy() {
39924           if (!getSelectionText()) event.preventDefault();
39925
39926           var graph = context.graph(),
39927               selected = groupEntities(context.selectedIDs(), graph),
39928               canCopy = [],
39929               skip = {},
39930               i, entity;
39931
39932           for (i = 0; i < selected.relation.length; i++) {
39933               entity = selected.relation[i];
39934               if (!skip[entity.id] && entity.isComplete(graph)) {
39935                   canCopy.push(entity.id);
39936                   skip = getDescendants(entity.id, graph, skip);
39937               }
39938           }
39939           for (i = 0; i < selected.way.length; i++) {
39940               entity = selected.way[i];
39941               if (!skip[entity.id]) {
39942                   canCopy.push(entity.id);
39943                   skip = getDescendants(entity.id, graph, skip);
39944               }
39945           }
39946           for (i = 0; i < selected.node.length; i++) {
39947               entity = selected.node[i];
39948               if (!skip[entity.id]) {
39949                   canCopy.push(entity.id);
39950               }
39951           }
39952
39953           context.copyIDs(canCopy);
39954       }
39955
39956
39957       function copy() {
39958           keybinding.on(uiCmd('⌘C'), doCopy);
39959           d3_select(document).call(keybinding);
39960           return copy;
39961       }
39962
39963       function getSelectionText() {
39964           return window.getSelection().toString();
39965       }
39966
39967       copy.off = function() {
39968           d3_select(document).call(keybinding.off);
39969       };
39970
39971
39972       return copy;
39973   }
39974
39975   /*
39976       `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
39977
39978       * The `origin` function is expected to return an [x, y] tuple rather than an
39979         {x, y} object.
39980       * The events are `start`, `move`, and `end`.
39981         (https://github.com/mbostock/d3/issues/563)
39982       * The `start` event is not dispatched until the first cursor movement occurs.
39983         (https://github.com/mbostock/d3/pull/368)
39984       * The `move` event has a `point` and `delta` [x, y] tuple properties rather
39985         than `x`, `y`, `dx`, and `dy` properties.
39986       * The `end` event is not dispatched if no movement occurs.
39987       * An `off` function is available that unbinds the drag's internal event handlers.
39988    */
39989
39990   function behaviorDrag() {
39991       var dispatch$$1 = dispatch('start', 'move', 'end');
39992       var _origin = null;
39993       var _selector = '';
39994       var _event;
39995       var _target;
39996       var _surface;
39997
39998
39999       var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect');
40000       var d3_event_userSelectSuppress = function() {
40001               var selection$$1 = selection();
40002               var select$$1 = selection$$1.style(d3_event_userSelectProperty);
40003               selection$$1.style(d3_event_userSelectProperty, 'none');
40004               return function() {
40005                   selection$$1.style(d3_event_userSelectProperty, select$$1);
40006               };
40007           };
40008
40009
40010       function d3_eventCancel() {
40011           event.stopPropagation();
40012           event.preventDefault();
40013       }
40014
40015
40016       function eventOf(thiz, argumentz) {
40017           return function(e1) {
40018               e1.target = drag;
40019               customEvent(e1, dispatch$$1.apply, dispatch$$1, [e1.type, thiz, argumentz]);
40020           };
40021       }
40022
40023
40024       function dragstart() {
40025           _target = this;
40026           _event = eventOf(_target, arguments);
40027
40028           var eventTarget = event.target;
40029           var touchId = event.touches ? event.changedTouches[0].identifier : null;
40030           var offset;
40031           var startOrigin = point$$1();
40032           var started = false;
40033           var selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
40034
40035           d3_select(window)
40036               .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
40037               .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
40038
40039           if (_origin) {
40040               offset = _origin.apply(_target, arguments);
40041               offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
40042           } else {
40043               offset = [0, 0];
40044           }
40045
40046           if (touchId === null) {
40047               event.stopPropagation();
40048           }
40049
40050
40051           function point$$1() {
40052               var p = _surface || _target.parentNode;
40053               return touchId !== null ? d3_touches(p).filter(function(p) {
40054                   return p.identifier === touchId;
40055               })[0] : d3_mouse(p);
40056           }
40057
40058
40059           function dragmove() {
40060               var p = point$$1();
40061               var dx = p[0] - startOrigin[0];
40062               var dy = p[1] - startOrigin[1];
40063
40064               if (dx === 0 && dy === 0)
40065                   return;
40066
40067               startOrigin = p;
40068               d3_eventCancel();
40069
40070               if (!started) {
40071                   started = true;
40072                   _event({ type: 'start' });
40073               } else {
40074                   _event({
40075                       type: 'move',
40076                       point: [p[0] + offset[0],  p[1] + offset[1]],
40077                       delta: [dx, dy]
40078                   });
40079               }
40080           }
40081
40082
40083           function dragend() {
40084               if (started) {
40085                   _event({ type: 'end' });
40086
40087                   d3_eventCancel();
40088                   if (event.target === eventTarget) {
40089                       d3_select(window)
40090                           .on('click.drag', click, true);
40091                   }
40092               }
40093
40094               d3_select(window)
40095                   .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
40096                   .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
40097
40098               selectEnable();
40099           }
40100
40101
40102           function click() {
40103               d3_eventCancel();
40104               d3_select(window)
40105                   .on('click.drag', null);
40106           }
40107       }
40108
40109
40110       function drag(selection$$1) {
40111           var matchesSelector = utilPrefixDOMProperty('matchesSelector');
40112           var delegate = dragstart;
40113
40114           if (_selector) {
40115               delegate = function() {
40116                   var root = this;
40117                   var target = event.target;
40118                   for (; target && target !== root; target = target.parentNode) {
40119                       var datum = target.__data__;
40120                       var entity = datum && datum.properties && datum.properties.entity;
40121                       if (entity && target[matchesSelector](_selector)) {
40122                           return dragstart.call(target, entity);
40123                       }
40124                   }
40125               };
40126           }
40127
40128           selection$$1
40129               .on('mousedown.drag' + _selector, delegate)
40130               .on('touchstart.drag' + _selector, delegate);
40131       }
40132
40133
40134       drag.off = function(selection$$1) {
40135           selection$$1
40136               .on('mousedown.drag' + _selector, null)
40137               .on('touchstart.drag' + _selector, null);
40138       };
40139
40140
40141       drag.selector = function(_) {
40142           if (!arguments.length) return _selector;
40143           _selector = _;
40144           return drag;
40145       };
40146
40147
40148       drag.origin = function (_) {
40149           if (!arguments.length) return _origin;
40150           _origin = _;
40151           return drag;
40152       };
40153
40154
40155       drag.cancel = function() {
40156           d3_select(window)
40157               .on('mousemove.drag', null)
40158               .on('mouseup.drag', null);
40159           return drag;
40160       };
40161
40162
40163       drag.target = function() {
40164           if (!arguments.length) return _target;
40165           _target = arguments[0];
40166           _event = eventOf(_target, Array.prototype.slice.call(arguments, 1));
40167           return drag;
40168       };
40169
40170
40171       drag.surface = function() {
40172           if (!arguments.length) return _surface;
40173           _surface = arguments[0];
40174           return drag;
40175       };
40176
40177
40178       return utilRebind(drag, dispatch$$1, 'on');
40179   }
40180
40181   function behaviorDrawWay(context, wayId, index, mode, startGraph) {
40182       var origWay = context.entity(wayId);
40183       var annotation = t((origWay.isDegenerate() ?
40184           'operations.start.annotation.' :
40185           'operations.continue.annotation.') + context.geometry(wayId)
40186       );
40187       var behavior = behaviorDraw(context);
40188       var _tempEdits = 0;
40189
40190       var end = osmNode({ loc: context.map().mouseCoordinates() });
40191
40192       // Push an annotated state for undo to return back to.
40193       // We must make sure to remove this edit later.
40194       context.perform(actionNoop(), annotation);
40195       _tempEdits++;
40196
40197       // Add the drawing node to the graph.
40198       // We must make sure to remove this edit later.
40199       context.perform(_actionAddDrawNode());
40200       _tempEdits++;
40201
40202
40203
40204       function keydown() {
40205           if (event.keyCode === d3keybinding.modifierCodes.alt) {
40206               if (context.surface().classed('nope')) {
40207                   context.surface()
40208                       .classed('nope-suppressed', true);
40209               }
40210               context.surface()
40211                   .classed('nope', false)
40212                   .classed('nope-disabled', true);
40213           }
40214       }
40215
40216
40217       function keyup() {
40218           if (event.keyCode === d3keybinding.modifierCodes.alt) {
40219               if (context.surface().classed('nope-suppressed')) {
40220                   context.surface()
40221                       .classed('nope', true);
40222               }
40223               context.surface()
40224                   .classed('nope-suppressed', false)
40225                   .classed('nope-disabled', false);
40226           }
40227       }
40228
40229
40230       // related code
40231       // - `mode/drag_node.js`     `doMode()`
40232       // - `behavior/draw.js`      `click()`
40233       // - `behavior/draw_way.js`  `move()`
40234       function move(datum) {
40235           context.surface().classed('nope-disabled', event.altKey);
40236
40237           var targetLoc = datum && datum.properties && datum.properties.entity && datum.properties.entity.loc;
40238           var targetNodes = datum && datum.properties && datum.properties.nodes;
40239           var loc = context.map().mouseCoordinates();
40240
40241           if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
40242               loc = targetLoc;
40243
40244           } else if (targetNodes) {   // snap to way - a line target with `.nodes`
40245               var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
40246               if (choice) {
40247                   loc = choice.loc;
40248               }
40249           }
40250
40251           context.replace(actionMoveNode(end.id, loc));
40252           end = context.entity(end.id);
40253           checkGeometry(false);
40254       }
40255
40256
40257       // Check whether this edit causes the geometry to break.
40258       // If so, class the surface with a nope cursor.
40259       // `finishDraw` - Only checks the relevant line segments if finishing drawing
40260       function checkGeometry(finishDraw) {
40261           var nopeDisabled = context.surface().classed('nope-disabled');
40262           var isInvalid = isInvalidGeometry(end, context.graph(), finishDraw);
40263
40264           if (nopeDisabled) {
40265               context.surface()
40266                   .classed('nope', false)
40267                   .classed('nope-suppressed', isInvalid);
40268           } else {
40269               context.surface()
40270                   .classed('nope', isInvalid)
40271                   .classed('nope-suppressed', false);
40272           }
40273       }
40274
40275
40276       function isInvalidGeometry(entity, graph, finishDraw) {
40277           var parents = graph.parentWays(entity);
40278
40279           for (var i = 0; i < parents.length; i++) {
40280               var parent = parents[i];
40281               var nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
40282               
40283               if (origWay.isClosed()) { // Check if Area
40284                   if (finishDraw) {
40285                       nodes.splice(-2, 1);
40286                       entity = nodes[nodes.length-2];
40287                   } else {
40288                       nodes.pop();
40289                   }
40290               } else { // Line
40291                   if (finishDraw) {
40292                       nodes.pop();
40293                   }
40294               }
40295
40296               if (geoHasSelfIntersections(nodes, entity.id)) {
40297                   return true;
40298               }
40299           }
40300
40301           return false;
40302       }
40303
40304
40305       function undone() {
40306           // Undo popped the history back to the initial annotated no-op edit.
40307           // Remove initial no-op edit and whatever edit happened immediately before it.
40308           context.pop(2);
40309           _tempEdits = 0;
40310
40311           if (context.hasEntity(wayId)) {
40312               context.enter(mode);
40313           } else {
40314               context.enter(modeBrowse(context));
40315           }
40316       }
40317
40318
40319       function setActiveElements() {
40320           context.surface().selectAll('.' + end.id)
40321               .classed('active', true);
40322       }
40323
40324
40325       var drawWay = function(surface) {
40326           behavior
40327               .on('move', move)
40328               .on('click', drawWay.add)
40329               .on('clickWay', drawWay.addWay)
40330               .on('clickNode', drawWay.addNode)
40331               .on('undo', context.undo)
40332               .on('cancel', drawWay.cancel)
40333               .on('finish', drawWay.finish);
40334
40335           d3_select(window)
40336               .on('keydown.drawWay', keydown)
40337               .on('keyup.drawWay', keyup);
40338
40339           context.map()
40340               .dblclickEnable(false)
40341               .on('drawn.draw', setActiveElements);
40342
40343           setActiveElements();
40344
40345           surface.call(behavior);
40346
40347           context.history()
40348               .on('undone.draw', undone);
40349       };
40350
40351
40352       drawWay.off = function(surface) {
40353           // Drawing was interrupted unexpectedly.
40354           // This can happen if the user changes modes,
40355           // clicks geolocate button, a hashchange event occurs, etc.
40356           if (_tempEdits) {
40357               context.pop(_tempEdits);
40358               while (context.graph() !== startGraph) {
40359                   context.pop();
40360               }
40361           }
40362
40363           context.map()
40364               .on('drawn.draw', null);
40365
40366           surface.call(behavior.off)
40367               .selectAll('.active')
40368               .classed('active', false);
40369
40370           surface
40371               .classed('nope', false)
40372               .classed('nope-suppressed', false)
40373               .classed('nope-disabled', false);
40374
40375           d3_select(window)
40376               .on('keydown.hover', null)
40377               .on('keyup.hover', null);
40378
40379           context.history()
40380               .on('undone.draw', null);
40381       };
40382
40383
40384       function _actionAddDrawNode() {
40385           return function(graph) {
40386               return graph
40387                   .replace(end)
40388                   .replace(origWay.addNode(end.id, index));
40389           };
40390       }
40391
40392
40393       function _actionReplaceDrawNode(newNode) {
40394           return function(graph) {
40395               return graph
40396                   .replace(origWay.addNode(newNode.id, index))
40397                   .remove(end);
40398           };
40399       }
40400
40401
40402       // Accept the current position of the drawing node and continue drawing.
40403       drawWay.add = function(loc, d) {
40404           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
40405               return;   // can't click here
40406           }
40407
40408           context.pop(_tempEdits);
40409           _tempEdits = 0;
40410
40411           context.perform(
40412               _actionAddDrawNode(),
40413               annotation
40414           );
40415
40416           checkGeometry(false);   // finishDraw = false
40417           context.enter(mode);
40418       };
40419
40420
40421       // Connect the way to an existing way.
40422       drawWay.addWay = function(loc, edge, d) {
40423           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
40424               return;   // can't click here
40425           }
40426
40427           context.pop(_tempEdits);
40428           _tempEdits = 0;
40429
40430           context.perform(
40431               _actionAddDrawNode(),
40432               actionAddMidpoint({ loc: loc, edge: edge }, end),
40433               annotation
40434           );
40435
40436           checkGeometry(false);   // finishDraw = false
40437           context.enter(mode);
40438       };
40439
40440
40441       // Connect the way to an existing node and continue drawing.
40442       drawWay.addNode = function(node, d) {
40443           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
40444               return;   // can't click here
40445           }
40446
40447           context.pop(_tempEdits);
40448           _tempEdits = 0;
40449
40450           context.perform(
40451               _actionReplaceDrawNode(node),
40452               annotation
40453           );
40454
40455           checkGeometry(false);   // finishDraw = false
40456           context.enter(mode);
40457       };
40458
40459
40460       // Finish the draw operation, removing the temporary edits.
40461       // If the way has enough nodes to be valid, it's selected.
40462       // Otherwise, delete everything and return to browse mode.
40463       drawWay.finish = function() {
40464           checkGeometry(true);   // finishDraw = true
40465           if (context.surface().classed('nope')) {
40466               return;   // can't click here
40467           }
40468
40469           context.pop(_tempEdits);
40470           _tempEdits = 0;
40471
40472           var way = context.hasEntity(wayId);
40473           if (!way || way.isDegenerate()) {
40474               drawWay.cancel();
40475               return;
40476           }
40477
40478           window.setTimeout(function() {
40479               context.map().dblclickEnable(true);
40480           }, 1000);
40481
40482           context.enter(modeSelect(context, [wayId]).newFeature(true));
40483       };
40484
40485
40486       // Cancel the draw operation, delete everything, and return to browse mode.
40487       drawWay.cancel = function() {
40488           context.pop(_tempEdits);
40489           _tempEdits = 0;
40490
40491           while (context.graph() !== startGraph) {
40492               context.pop();
40493           }
40494
40495           window.setTimeout(function() {
40496               context.map().dblclickEnable(true);
40497           }, 1000);
40498
40499           context.surface()
40500               .classed('nope', false)
40501               .classed('nope-disabled', false)
40502               .classed('nope-suppressed', false);
40503
40504           context.enter(modeBrowse(context));
40505       };
40506
40507
40508       drawWay.activeID = function() {
40509           if (!arguments.length) return end.id;
40510           // no assign
40511           return drawWay;
40512       };
40513
40514
40515       drawWay.tail = function(text) {
40516           behavior.tail(text);
40517           return drawWay;
40518       };
40519
40520
40521       return drawWay;
40522   }
40523
40524   /** Error message constants. */
40525   var FUNC_ERROR_TEXT$3 = 'Expected a function';
40526
40527   /**
40528    * Creates a throttled function that only invokes `func` at most once per
40529    * every `wait` milliseconds. The throttled function comes with a `cancel`
40530    * method to cancel delayed `func` invocations and a `flush` method to
40531    * immediately invoke them. Provide `options` to indicate whether `func`
40532    * should be invoked on the leading and/or trailing edge of the `wait`
40533    * timeout. The `func` is invoked with the last arguments provided to the
40534    * throttled function. Subsequent calls to the throttled function return the
40535    * result of the last `func` invocation.
40536    *
40537    * **Note:** If `leading` and `trailing` options are `true`, `func` is
40538    * invoked on the trailing edge of the timeout only if the throttled function
40539    * is invoked more than once during the `wait` timeout.
40540    *
40541    * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
40542    * until to the next tick, similar to `setTimeout` with a timeout of `0`.
40543    *
40544    * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
40545    * for details over the differences between `_.throttle` and `_.debounce`.
40546    *
40547    * @static
40548    * @memberOf _
40549    * @since 0.1.0
40550    * @category Function
40551    * @param {Function} func The function to throttle.
40552    * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
40553    * @param {Object} [options={}] The options object.
40554    * @param {boolean} [options.leading=true]
40555    *  Specify invoking on the leading edge of the timeout.
40556    * @param {boolean} [options.trailing=true]
40557    *  Specify invoking on the trailing edge of the timeout.
40558    * @returns {Function} Returns the new throttled function.
40559    * @example
40560    *
40561    * // Avoid excessively updating the position while scrolling.
40562    * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
40563    *
40564    * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
40565    * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
40566    * jQuery(element).on('click', throttled);
40567    *
40568    * // Cancel the trailing throttled invocation.
40569    * jQuery(window).on('popstate', throttled.cancel);
40570    */
40571   function throttle(func, wait, options) {
40572     var leading = true,
40573         trailing = true;
40574
40575     if (typeof func != 'function') {
40576       throw new TypeError(FUNC_ERROR_TEXT$3);
40577     }
40578     if (isObject(options)) {
40579       leading = 'leading' in options ? !!options.leading : leading;
40580       trailing = 'trailing' in options ? !!options.trailing : trailing;
40581     }
40582     return debounce(func, wait, {
40583       'leading': leading,
40584       'maxWait': wait,
40585       'trailing': trailing
40586     });
40587   }
40588
40589   function behaviorHash(context) {
40590       var s0 = null; // cached window.location.hash
40591       var lat = 90 - 1e-8; // allowable latitude range
40592
40593
40594       var parser = function(map, s) {
40595           var q = utilStringQs(s);
40596           var args = (q.map || '').split('/').map(Number);
40597
40598           if (args.length < 3 || args.some(isNaN)) {
40599               return true; // replace bogus hash
40600
40601           } else if (s !== formatter(map).slice(1)) {   // hash has changed
40602               var mode = context.mode(),
40603                   dist = geoSphericalDistance(map.center(), [args[2], args[1]]),
40604                   maxdist = 500;
40605
40606               // Don't allow the hash location to change too much while drawing
40607               // This can happen if the user accidently hit the back button.  #3996
40608               if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
40609                   context.enter(modeBrowse(context));
40610               }
40611
40612               map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
40613           }
40614       };
40615
40616
40617       var formatter = function(map) {
40618           var center = map.center();
40619           var zoom = map.zoom();
40620           var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
40621           var q = omit(utilStringQs(window.location.hash.substring(1)),
40622               ['comment', 'source', 'hashtags', 'walkthrough']
40623           );
40624           var newParams = {};
40625
40626           delete q.id;
40627           var selected = context.selectedIDs().filter(function(id) {
40628               return !context.entity(id).isNew();
40629           });
40630           if (selected.length) {
40631               newParams.id = selected.join(',');
40632           }
40633
40634           newParams.map = zoom.toFixed(2) +
40635               '/' + center[1].toFixed(precision) +
40636               '/' + center[0].toFixed(precision);
40637
40638           return '#' + utilQsString(assign(q, newParams), true);
40639       };
40640
40641
40642       function update() {
40643           if (context.inIntro()) return;
40644           var s1 = formatter(context.map());
40645           if (s0 !== s1) {
40646               window.location.replace(s0 = s1);  // don't recenter the map!
40647           }
40648       }
40649
40650
40651       var throttledUpdate = throttle(update, 500);
40652
40653
40654       function hashchange() {
40655           if (window.location.hash === s0) return;  // ignore spurious hashchange events
40656           if (parser(context.map(), (s0 = window.location.hash).substring(1))) {
40657               update(); // replace bogus hash
40658           }
40659       }
40660
40661
40662       function hash() {
40663           context.map()
40664               .on('move.hash', throttledUpdate);
40665
40666           context
40667               .on('enter.hash', throttledUpdate);
40668
40669           d3_select(window)
40670               .on('hashchange.hash', hashchange);
40671
40672           if (window.location.hash) {
40673
40674               var q = utilStringQs(window.location.hash.substring(1));
40675
40676               if (q.id) {
40677                   context.zoomToEntity(q.id.split(',')[0], !q.map);
40678               }
40679
40680               if (q.comment) {
40681                   context.storage('comment', q.comment);
40682                   context.storage('commentDate', Date.now());
40683               }
40684
40685               if (q.source) {
40686                   context.storage('source', q.source);
40687                   context.storage('commentDate', Date.now());
40688               }
40689
40690               if (q.hashtags) {
40691                   context.storage('hashtags', q.hashtags);
40692               }
40693
40694               if (q.walkthrough === 'true') {
40695                   hash.startWalkthrough = true;
40696               }
40697
40698               hashchange();
40699
40700               if (q.map) {
40701                   hash.hadHash = true;
40702               }
40703           }
40704       }
40705
40706
40707       hash.off = function() {
40708           throttledUpdate.cancel();
40709
40710           context.map()
40711               .on('move.hash', null);
40712
40713           context
40714               .on('enter.hash', null);
40715
40716           d3_select(window)
40717               .on('hashchange.hash', null);
40718
40719           window.location.hash = '';
40720       };
40721
40722
40723       return hash;
40724   }
40725
40726   function behaviorLasso(context) {
40727
40728       var behavior = function(selection$$1) {
40729           var lasso;
40730
40731
40732           function mousedown() {
40733               var button = 0;  // left
40734               if (event.button === button && event.shiftKey === true) {
40735                   lasso = null;
40736
40737                   d3_select(window)
40738                       .on('mousemove.lasso', mousemove)
40739                       .on('mouseup.lasso', mouseup);
40740
40741                   event.stopPropagation();
40742               }
40743           }
40744
40745
40746           function mousemove() {
40747               if (!lasso) {
40748                   lasso = uiLasso(context);
40749                   context.surface().call(lasso);
40750               }
40751
40752               lasso.p(context.mouse());
40753           }
40754
40755
40756           function normalize(a, b) {
40757               return [
40758                   [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
40759                   [Math.max(a[0], b[0]), Math.max(a[1], b[1])]];
40760           }
40761
40762
40763           function lassoed() {
40764               if (!lasso) return [];
40765
40766               var graph = context.graph(),
40767                   bounds = lasso.extent().map(context.projection.invert),
40768                   extent = geoExtent$$1(normalize(bounds[0], bounds[1]));
40769
40770               return map$3(context.intersects(extent).filter(function(entity) {
40771                   return entity.type === 'node' &&
40772                       geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) &&
40773                       !context.features().isHidden(entity, graph, entity.geometry(graph));
40774               }), 'id');
40775           }
40776
40777
40778           function mouseup() {
40779               d3_select(window)
40780                   .on('mousemove.lasso', null)
40781                   .on('mouseup.lasso', null);
40782
40783               if (!lasso) return;
40784
40785               var ids = lassoed();
40786               lasso.close();
40787
40788               if (ids.length) {
40789                   context.enter(modeSelect(context, ids));
40790               }
40791           }
40792
40793           selection$$1
40794               .on('mousedown.lasso', mousedown);
40795       };
40796
40797
40798       behavior.off = function(selection$$1) {
40799           selection$$1.on('mousedown.lasso', null);
40800       };
40801
40802
40803       return behavior;
40804   }
40805
40806   /* Creates a keybinding behavior for an operation */
40807   function behaviorOperation() {
40808       var _operation, keybinding;
40809
40810       var behavior = function () {
40811           if (_operation && _operation.available()) {
40812               keybinding = d3keybinding('behavior.key.' + _operation.id);
40813               keybinding.on(_operation.keys, function() {
40814                   event.preventDefault();
40815                   var disabled = _operation.disabled();
40816                   var flash;
40817
40818                   if (disabled) {
40819                       flash = uiFlash()
40820                           .duration(4000)
40821                           .iconName('#operation-' + _operation.id)
40822                           .iconClass('operation disabled')
40823                           .text(_operation.tooltip);
40824
40825                       flash();
40826
40827                   } else {
40828                       flash = uiFlash()
40829                           .duration(2000)
40830                           .iconName('#operation-' + _operation.id)
40831                           .iconClass('operation')
40832                           .text(_operation.annotation() || _operation.title);
40833
40834                       flash();
40835                       _operation();
40836                   }
40837               });
40838
40839               d3_select(document).call(keybinding);
40840           }
40841
40842           return behavior;
40843       };
40844
40845
40846       behavior.off = function() {
40847           if (keybinding) {
40848               d3_select(document).call(keybinding.off);
40849           }
40850       };
40851
40852
40853       behavior.which = function (_) {
40854           if (!arguments.length) return _operation;
40855           _operation = _;
40856           return behavior;
40857       };
40858
40859
40860       return behavior;
40861   }
40862
40863   /**
40864    * The base implementation of `_.invert` and `_.invertBy` which inverts
40865    * `object` with values transformed by `iteratee` and set by `setter`.
40866    *
40867    * @private
40868    * @param {Object} object The object to iterate over.
40869    * @param {Function} setter The function to set `accumulator` values.
40870    * @param {Function} iteratee The iteratee to transform values.
40871    * @param {Object} accumulator The initial inverted object.
40872    * @returns {Function} Returns `accumulator`.
40873    */
40874   function baseInverter(object, setter, iteratee, accumulator) {
40875     baseForOwn(object, function(value, key, object) {
40876       setter(accumulator, iteratee(value), key, object);
40877     });
40878     return accumulator;
40879   }
40880
40881   /**
40882    * Creates a function like `_.invertBy`.
40883    *
40884    * @private
40885    * @param {Function} setter The function to set accumulator values.
40886    * @param {Function} toIteratee The function to resolve iteratees.
40887    * @returns {Function} Returns the new inverter function.
40888    */
40889   function createInverter(setter, toIteratee) {
40890     return function(object, iteratee) {
40891       return baseInverter(object, setter, toIteratee(iteratee), {});
40892     };
40893   }
40894
40895   /** Used for built-in method references. */
40896   var objectProto$19 = Object.prototype;
40897
40898   /**
40899    * Used to resolve the
40900    * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
40901    * of values.
40902    */
40903   var nativeObjectToString$2 = objectProto$19.toString;
40904
40905   /**
40906    * Creates an object composed of the inverted keys and values of `object`.
40907    * If `object` contains duplicate values, subsequent values overwrite
40908    * property assignments of previous values.
40909    *
40910    * @static
40911    * @memberOf _
40912    * @since 0.7.0
40913    * @category Object
40914    * @param {Object} object The object to invert.
40915    * @returns {Object} Returns the new inverted object.
40916    * @example
40917    *
40918    * var object = { 'a': 1, 'b': 2, 'c': 1 };
40919    *
40920    * _.invert(object);
40921    * // => { '1': 'c', '2': 'b' }
40922    */
40923   var invert = createInverter(function(result, value, key) {
40924     if (value != null &&
40925         typeof value.toString != 'function') {
40926       value = nativeObjectToString$2.call(value);
40927     }
40928
40929     result[value] = key;
40930   }, constant$13(identity$8));
40931
40932   /**
40933    * Creates an object with the same keys as `object` and values generated
40934    * by running each own enumerable string keyed property of `object` thru
40935    * `iteratee`. The iteratee is invoked with three arguments:
40936    * (value, key, object).
40937    *
40938    * @static
40939    * @memberOf _
40940    * @since 2.4.0
40941    * @category Object
40942    * @param {Object} object The object to iterate over.
40943    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
40944    * @returns {Object} Returns the new mapped object.
40945    * @see _.mapKeys
40946    * @example
40947    *
40948    * var users = {
40949    *   'fred':    { 'user': 'fred',    'age': 40 },
40950    *   'pebbles': { 'user': 'pebbles', 'age': 1 }
40951    * };
40952    *
40953    * _.mapValues(users, function(o) { return o.age; });
40954    * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
40955    *
40956    * // The `_.property` iteratee shorthand.
40957    * _.mapValues(users, 'age');
40958    * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
40959    */
40960   function mapValues(object, iteratee) {
40961     var result = {};
40962     iteratee = baseIteratee(iteratee, 3);
40963
40964     baseForOwn(object, function(value, key, object) {
40965       baseAssignValue(result, key, iteratee(value, key, object));
40966     });
40967     return result;
40968   }
40969
40970   function behaviorPaste(context) {
40971       var keybinding = d3keybinding('paste');
40972
40973
40974       function doPaste() {
40975           event.preventDefault();
40976
40977           var baseGraph = context.graph(),
40978               mouse = context.mouse(),
40979               projection = context.projection,
40980               viewport = geoExtent$$1(projection.clipExtent()).polygon();
40981
40982           if (!geoPointInPolygon(mouse, viewport)) return;
40983
40984           var extent = geoExtent$$1(),
40985               oldIDs = context.copyIDs(),
40986               oldGraph = context.copyGraph(),
40987               newIDs = [];
40988
40989           if (!oldIDs.length) return;
40990
40991           var action = actionCopyEntities(oldIDs, oldGraph);
40992           context.perform(action);
40993
40994           var copies = action.copies();
40995           var originals = invert(mapValues(copies, 'id'));
40996           for (var id in copies) {
40997               var oldEntity = oldGraph.entity(id),
40998                   newEntity = copies[id];
40999
41000               extent._extend(oldEntity.extent(oldGraph));
41001
41002               // Exclude child nodes from newIDs if their parent way was also copied.
41003               var parents = context.graph().parentWays(newEntity),
41004                   parentCopied = false;
41005               for (var i = 0; i < parents.length; i++) {
41006                   if (originals[parents[i].id]) {
41007                       parentCopied = true;
41008                       break;
41009                   }
41010               }
41011
41012               if (!parentCopied) {
41013                   newIDs.push(newEntity.id);
41014               }
41015           }
41016
41017           // Put pasted objects where mouse pointer is..
41018           var center = projection(extent.center()),
41019               delta = [ mouse[0] - center[0], mouse[1] - center[1] ];
41020
41021           context.perform(actionMove(newIDs, delta, projection));
41022           context.enter(modeMove$$1(context, newIDs, baseGraph));
41023       }
41024
41025
41026       function paste() {
41027           keybinding.on(uiCmd('⌘V'), doPaste);
41028           d3_select(document).call(keybinding);
41029           return paste;
41030       }
41031
41032
41033       paste.off = function() {
41034           d3_select(document).call(keybinding.off);
41035       };
41036
41037
41038       return paste;
41039   }
41040
41041   function behaviorSelect(context) {
41042       var lastMouse = null;
41043       var suppressMenu = true;
41044       var tolerance = 4;
41045       var p1 = null;
41046
41047
41048       function point$$1() {
41049           return d3_mouse(context.container().node());
41050       }
41051
41052
41053       function keydown() {
41054           var e = event;
41055           if (e && e.shiftKey) {
41056               context.surface()
41057                   .classed('behavior-multiselect', true);
41058           }
41059
41060           if (e && e.keyCode === 93) {  // context menu
41061               e.preventDefault();
41062               e.stopPropagation();
41063           }
41064       }
41065
41066
41067       function keyup() {
41068           var e = event;
41069           if (!e || !e.shiftKey) {
41070               context.surface()
41071                   .classed('behavior-multiselect', false);
41072           }
41073
41074
41075           if (e && e.keyCode === 93) {  // context menu
41076               e.preventDefault();
41077               e.stopPropagation();
41078               contextmenu();
41079           }
41080       }
41081
41082
41083       function mousedown() {
41084           if (!p1) p1 = point$$1();
41085           d3_select(window)
41086               .on('mouseup.select', mouseup, true);
41087
41088           var isShowAlways = +context.storage('edit-menu-show-always') === 1;
41089           suppressMenu = !isShowAlways;
41090       }
41091
41092
41093       function mousemove() {
41094           if (event) lastMouse = event;
41095       }
41096
41097
41098       function mouseup() {
41099           click();
41100       }
41101
41102
41103       function contextmenu() {
41104           var e = event;
41105           e.preventDefault();
41106           e.stopPropagation();
41107
41108           if (!+e.clientX && !+e.clientY) {
41109               if (lastMouse) {
41110                   e.sourceEvent = lastMouse;
41111               } else {
41112                   return;
41113               }
41114           }
41115
41116           if (!p1) p1 = point$$1();
41117           suppressMenu = false;
41118           click();
41119       }
41120
41121
41122       function click() {
41123           d3_select(window)
41124               .on('mouseup.select', null, true);
41125
41126           if (!p1) return;
41127           var p2 = point$$1();
41128           var dist = geoVecLength(p1, p2);
41129
41130           p1 = null;
41131           if (dist > tolerance) {
41132               return;
41133           }
41134
41135           var isMultiselect = event.shiftKey || d3_select('#surface .lasso').node();
41136           var isShowAlways = +context.storage('edit-menu-show-always') === 1;
41137           var datum = event.target.__data__ || (lastMouse && lastMouse.target.__data__);
41138           var mode = context.mode();
41139
41140           var entity = datum && datum.properties && datum.properties.entity;
41141           if (entity) datum = entity;
41142
41143           if (datum && datum.type === 'midpoint') {
41144               datum = datum.parents[0];
41145           }
41146
41147           if (!(datum instanceof osmEntity$$1)) {
41148               // clicked nothing..
41149               if (!isMultiselect && mode.id !== 'browse') {
41150                   context.enter(modeBrowse(context));
41151               }
41152
41153           } else {
41154               // clicked an entity..
41155               var selectedIDs = context.selectedIDs();
41156
41157               if (!isMultiselect) {
41158                   if (selectedIDs.length > 1 && (!suppressMenu && !isShowAlways)) {
41159                       // multiple things already selected, just show the menu...
41160                       mode.suppressMenu(false).reselect();
41161                   } else {
41162                       // select a single thing..
41163                       context.enter(modeSelect(context, [datum.id]).suppressMenu(suppressMenu));
41164                   }
41165
41166               } else {
41167                   if (selectedIDs.indexOf(datum.id) !== -1) {
41168                       // clicked entity is already in the selectedIDs list..
41169                       if (!suppressMenu && !isShowAlways) {
41170                           // don't deselect clicked entity, just show the menu.
41171                           mode.suppressMenu(false).reselect();
41172                       } else {
41173                           // deselect clicked entity, then reenter select mode or return to browse mode..
41174                           selectedIDs = without(selectedIDs, datum.id);
41175                           context.enter(selectedIDs.length ? modeSelect(context, selectedIDs) : modeBrowse(context));
41176                       }
41177                   } else {
41178                       // clicked entity is not in the selected list, add it..
41179                       selectedIDs = selectedIDs.concat([datum.id]);
41180                       context.enter(modeSelect(context, selectedIDs).suppressMenu(suppressMenu));
41181                   }
41182               }
41183           }
41184
41185           // reset for next time..
41186           suppressMenu = true;
41187       }
41188
41189
41190       var behavior = function(selection$$1) {
41191           lastMouse = null;
41192           suppressMenu = true;
41193           p1 = null;
41194
41195           d3_select(window)
41196               .on('keydown.select', keydown)
41197               .on('keyup.select', keyup)
41198               .on('contextmenu.select-window', function() {
41199                   // Edge and IE really like to show the contextmenu on the
41200                   // menubar when user presses a keyboard menu button
41201                   // even after we've already preventdefaulted the key event.
41202                   var e = event;
41203                   if (+e.clientX === 0 && +e.clientY === 0) {
41204                       event.preventDefault();
41205                       event.stopPropagation();
41206                   }
41207               });
41208
41209           selection$$1
41210               .on('mousedown.select', mousedown)
41211               .on('mousemove.select', mousemove)
41212               .on('contextmenu.select', contextmenu);
41213
41214           if (event && event.shiftKey) {
41215               context.surface()
41216                   .classed('behavior-multiselect', true);
41217           }
41218       };
41219
41220
41221       behavior.off = function(selection$$1) {
41222           d3_select(window)
41223               .on('keydown.select', null)
41224               .on('keyup.select', null)
41225               .on('contextmenu.select-window', null)
41226               .on('mouseup.select', null, true);
41227
41228           selection$$1
41229               .on('mousedown.select', null)
41230               .on('mousemove.select', null)
41231               .on('contextmenu.select', null);
41232
41233           context.surface()
41234               .classed('behavior-multiselect', false);
41235       };
41236
41237
41238       return behavior;
41239   }
41240
41241   function svgAreas$$1(projection, context) {
41242       // Patterns only work in Firefox when set directly on element.
41243       // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
41244       var patterns = {
41245           beach: 'beach',
41246           cemetery: 'cemetery',
41247           construction: 'construction',
41248           farm: 'farmland',
41249           farmland: 'farmland',
41250           grave_yard: 'cemetery',
41251           meadow: 'meadow',
41252           military: 'construction',
41253           orchard: 'orchard',
41254           sand: 'beach',
41255           scrub: 'scrub',
41256           wetland: 'wetland',
41257       };
41258
41259       var patternKeys = ['landuse', 'natural', 'amenity'];
41260
41261
41262       function setPattern(d) {
41263           for (var i = 0; i < patternKeys.length; i++) {
41264               if (d.tags.building && d.tags.building !== 'no') continue;
41265
41266               if (patterns.hasOwnProperty(d.tags[patternKeys[i]])) {
41267                   this.style.fill = this.style.stroke = 'url("#pattern-' + patterns[d.tags[patternKeys[i]]] + '")';
41268                   return;
41269               }
41270           }
41271           this.style.fill = this.style.stroke = '';
41272       }
41273
41274
41275       function drawTargets(selection, graph, entities, filter) {
41276           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
41277           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
41278           var getPath = svgPath(projection).geojson;
41279           var activeID = context.activeID();
41280
41281           // The targets and nopes will be MultiLineString sub-segments of the ways
41282           var data = { targets: [], nopes: [] };
41283
41284           entities.forEach(function(way) {
41285               var features = svgSegmentWay(way, graph, activeID);
41286               data.targets.push.apply(data.targets, features.passive);
41287               data.nopes.push.apply(data.nopes, features.active);
41288           });
41289
41290
41291           // Targets allow hover and vertex snapping
41292           var targetData = data.targets.filter(getPath);
41293           var targets = selection.selectAll('.area.target-allowed')
41294               .filter(function(d) { return filter(d.properties.entity); })
41295               .data(targetData, function key(d) { return d.id; });
41296
41297           // exit
41298           targets.exit()
41299               .remove();
41300
41301           // enter/update
41302           targets.enter()
41303               .append('path')
41304               .merge(targets)
41305               .attr('d', getPath)
41306               .attr('class', function(d) { return 'way area target target-allowed ' + targetClass + d.id; });
41307
41308
41309           // NOPE
41310           var nopeData = data.nopes.filter(getPath);
41311           var nopes = selection.selectAll('.area.target-nope')
41312               .filter(function(d) { return filter(d.properties.entity); })
41313               .data(nopeData, function key(d) { return d.id; });
41314
41315           // exit
41316           nopes.exit()
41317               .remove();
41318
41319           // enter/update
41320           nopes.enter()
41321               .append('path')
41322               .merge(nopes)
41323               .attr('d', getPath)
41324               .attr('class', function(d) { return 'way area target target-nope ' + nopeClass + d.id; });
41325       }
41326
41327
41328       function drawAreas(selection, graph, entities, filter) {
41329           var path = svgPath(projection, graph, true),
41330               areas = {},
41331               multipolygon;
41332
41333           for (var i = 0; i < entities.length; i++) {
41334               var entity = entities[i];
41335               if (entity.geometry(graph) !== 'area') continue;
41336
41337               multipolygon = osmIsSimpleMultipolygonOuterMember(entity, graph);
41338               if (multipolygon) {
41339                   areas[multipolygon.id] = {
41340                       entity: multipolygon.mergeTags(entity.tags),
41341                       area: Math.abs(entity.area(graph))
41342                   };
41343               } else if (!areas[entity.id]) {
41344                   areas[entity.id] = {
41345                       entity: entity,
41346                       area: Math.abs(entity.area(graph))
41347                   };
41348               }
41349           }
41350
41351           areas = values$1(areas).filter(function hasPath(a) { return path(a.entity); });
41352           areas.sort(function areaSort(a, b) { return b.area - a.area; });
41353           areas = map$3(areas, 'entity');
41354
41355           var strokes = areas.filter(function(area) {
41356               return area.type === 'way';
41357           });
41358
41359           var data = {
41360               clip: areas,
41361               shadow: strokes,
41362               stroke: strokes,
41363               fill: areas
41364           };
41365
41366           var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath')
41367              .filter(filter)
41368              .data(data.clip, osmEntity$$1.key);
41369
41370           clipPaths.exit()
41371              .remove();
41372
41373           var clipPathsEnter = clipPaths.enter()
41374              .append('clipPath')
41375              .attr('class', 'clipPath')
41376              .attr('id', function(entity) { return entity.id + '-clippath'; });
41377
41378           clipPathsEnter
41379              .append('path');
41380
41381           clipPaths.merge(clipPathsEnter)
41382              .selectAll('path')
41383              .attr('d', path);
41384
41385
41386           var layer = selection.selectAll('.layer-areas .layer-areas-areas');
41387
41388           var areagroup = layer
41389               .selectAll('g.areagroup')
41390               .data(['fill', 'shadow', 'stroke']);
41391
41392           areagroup = areagroup.enter()
41393               .append('g')
41394               .attr('class', function(d) { return 'areagroup area-' + d; })
41395               .merge(areagroup);
41396
41397           var paths = areagroup
41398               .selectAll('path')
41399               .filter(filter)
41400               .data(function(layer) { return data[layer]; }, osmEntity$$1.key);
41401
41402           paths.exit()
41403               .remove();
41404
41405           var fills = selection.selectAll('.area-fill path.area').nodes();
41406
41407           var bisect = d3_bisector(function(node) {
41408               return -node.__data__.area(graph);
41409           }).left;
41410
41411           function sortedByArea(entity) {
41412               if (this._parent.__data__ === 'fill') {
41413                   return fills[bisect(fills, -entity.area(graph))];
41414               }
41415           }
41416
41417           paths = paths.enter()
41418               .insert('path', sortedByArea)
41419               .merge(paths)
41420               .each(function(entity) {
41421                   var layer = this.parentNode.__data__;
41422
41423                   this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
41424
41425                   if (layer === 'fill') {
41426                       this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
41427                       setPattern.apply(this, arguments);
41428                   }
41429               })
41430               .call(svgTagClasses())
41431               .attr('d', path);
41432
41433
41434           // touch targets
41435           selection.selectAll('.layer-areas .layer-areas-targets')
41436               .call(drawTargets, graph, data.stroke, filter);
41437       }
41438
41439       return drawAreas;
41440   }
41441
41442   function svgDebug$$1(projection, context) {
41443
41444       function multipolygons(imagery) {
41445           return imagery.map(function(data$$1) {
41446               return {
41447                   type: 'MultiPolygon',
41448                   coordinates: [ data$$1.polygon ]
41449               };
41450           });
41451       }
41452
41453       function drawDebug(selection$$1) {
41454           var showsTile = context.getDebug('tile');
41455           var showsCollision = context.getDebug('collision');
41456           var showsImagery = context.getDebug('imagery');
41457           var showsCommunity = context.getDebug('community');
41458           var showsImperial = context.getDebug('imperial');
41459           var showsDriveLeft = context.getDebug('driveLeft');
41460           var showsTouchTargets = context.getDebug('target');
41461
41462           var debugData = [];
41463           if (showsTile) {
41464               debugData.push({ class: 'red', label: 'tile' });
41465           }
41466           if (showsCollision) {
41467               debugData.push({ class: 'yellow', label: 'collision' });
41468           }
41469           if (showsImagery) {
41470               debugData.push({ class: 'orange', label: 'imagery' });
41471           }
41472           if (showsCommunity) {
41473               debugData.push({ class: 'blue', label: 'community' });
41474           }
41475           if (showsImperial) {
41476               debugData.push({ class: 'cyan', label: 'imperial' });
41477           }
41478           if (showsDriveLeft) {
41479               debugData.push({ class: 'green', label: 'driveLeft' });
41480           }
41481           if (showsTouchTargets) {
41482               debugData.push({ class: 'pink', label: 'touchTargets' });
41483           }
41484
41485
41486           var legend = d3_select('#content')
41487               .selectAll('.debug-legend')
41488               .data(debugData.length ? [0] : []);
41489
41490           legend.exit()
41491               .remove();
41492
41493           legend = legend.enter()
41494               .append('div')
41495               .attr('class', 'fillD debug-legend')
41496               .merge(legend);
41497
41498
41499           var legendItems = legend.selectAll('.debug-legend-item')
41500               .data(debugData, function(d) { return d.label; });
41501
41502           legendItems.exit()
41503               .remove();
41504
41505           legendItems.enter()
41506               .append('span')
41507               .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
41508               .text(function(d) { return d.label; });
41509
41510
41511           var layer = selection$$1.selectAll('.layer-debug')
41512               .data(showsImagery || showsCommunity || showsImperial || showsDriveLeft ? [0] : []);
41513
41514           layer.exit()
41515               .remove();
41516
41517           layer = layer.enter()
41518               .append('g')
41519               .attr('class', 'layer-debug')
41520               .merge(layer);
41521
41522
41523           var extent = context.map().extent();
41524           var dataImagery = data.imagery || [];
41525           var availableImagery = showsImagery && multipolygons(dataImagery.filter(function(source) {
41526               if (!source.polygon) return false;
41527               return source.polygon.some(function(polygon) {
41528                   return geoPolygonIntersectsPolygon(polygon, extent, true);
41529               });
41530           }));
41531
41532           var imagery = layer.selectAll('path.debug-imagery')
41533               .data(showsImagery ? availableImagery : []);
41534
41535           imagery.exit()
41536               .remove();
41537
41538           imagery.enter()
41539               .append('path')
41540               .attr('class', 'debug-imagery debug orange');
41541
41542
41543           var community = layer.selectAll('path.debug-community')
41544               .data(showsCommunity ? values$1(data.community.features) : []);
41545
41546           community.exit()
41547               .remove();
41548
41549           community.enter()
41550               .append('path')
41551               .attr('class', 'debug-community debug blue');
41552
41553
41554           var imperial = layer
41555               .selectAll('path.debug-imperial')
41556               .data(showsImperial ? [dataImperial] : []);
41557
41558           imperial.exit()
41559               .remove();
41560
41561           imperial.enter()
41562               .append('path')
41563               .attr('class', 'debug-imperial debug cyan');
41564
41565
41566           var driveLeft = layer
41567               .selectAll('path.debug-drive-left')
41568               .data(showsDriveLeft ? [dataDriveLeft] : []);
41569
41570           driveLeft.exit()
41571               .remove();
41572
41573           driveLeft.enter()
41574               .append('path')
41575               .attr('class', 'debug-drive-left debug green');
41576
41577
41578           // update
41579           layer.selectAll('path')
41580               .attr('d', svgPath(projection).geojson);
41581       }
41582
41583
41584       // This looks strange because `enabled` methods on other layers are
41585       // chainable getter/setters, and this one is just a getter.
41586       drawDebug.enabled = function() {
41587           if (!arguments.length) {
41588               return context.getDebug('tile') ||
41589                   context.getDebug('collision') ||
41590                   context.getDebug('imagery') ||
41591                   context.getDebug('imperial') ||
41592                   context.getDebug('driveLeft') ||
41593                   context.getDebug('target');
41594           } else {
41595               return this;
41596           }
41597       };
41598
41599
41600       return drawDebug;
41601   }
41602
41603   /*
41604       A standalone SVG element that contains only a `defs` sub-element. To be
41605       used once globally, since defs IDs must be unique within a document.
41606   */
41607   function svgDefs(context) {
41608
41609       function SVGSpriteDefinition(id, href) {
41610           return function(defs) {
41611               d3_request(href)
41612                   .mimeType('image/svg+xml')
41613                   .response(function(xhr) { return xhr.responseXML; })
41614                   .get(function(err, svg) {
41615                       if (err) return;
41616                       defs.node().appendChild(
41617                           d3_select(svg.documentElement).attr('id', id).node()
41618                       );
41619                   });
41620           };
41621       }
41622
41623
41624       return function drawDefs(selection$$1) {
41625           var defs = selection$$1.append('defs');
41626
41627           // markers
41628           defs
41629               .append('marker')
41630               .attr('id', 'oneway-marker')
41631               .attr('viewBox', '0 0 10 5')
41632               .attr('refX', 2.5)
41633               .attr('refY', 2.5)
41634               .attr('markerWidth', 2)
41635               .attr('markerHeight', 2)
41636               .attr('markerUnits', 'strokeWidth')
41637               .attr('orient', 'auto')
41638               .append('path')
41639               .attr('class', 'oneway-marker-path')
41640               .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')
41641               .attr('stroke', 'none')
41642               .attr('fill', '#000')
41643               .attr('opacity', '0.75');
41644
41645           defs
41646               .append('marker')
41647               .attr('id', 'viewfield-marker')
41648               .attr('viewBox', '0 0 16 16')
41649               .attr('refX', 8)
41650               .attr('refY', 16)
41651               .attr('markerWidth', 4)
41652               .attr('markerHeight', 4)
41653               .attr('markerUnits', 'strokeWidth')
41654               .attr('orient', 'auto')
41655               .append('path')
41656               .attr('class', 'viewfield-marker-path')
41657               .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')
41658               .attr('fill', '#333')
41659               .attr('fill-opacity', '0.75')
41660               .attr('stroke', '#fff')
41661               .attr('stroke-width', '0.5px')
41662               .attr('stroke-opacity', '0.75');
41663
41664           defs
41665               .append('marker')
41666               .attr('id', 'viewfield-marker-wireframe')
41667               .attr('viewBox', '0 0 16 16')
41668               .attr('refX', 8)
41669               .attr('refY', 16)
41670               .attr('markerWidth', 4)
41671               .attr('markerHeight', 4)
41672               .attr('markerUnits', 'strokeWidth')
41673               .attr('orient', 'auto')
41674               .append('path')
41675               .attr('class', 'viewfield-marker-path')
41676               .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')
41677               .attr('fill', 'none')
41678               .attr('stroke', '#fff')
41679               .attr('stroke-width', '0.5px')
41680               .attr('stroke-opacity', '0.75');
41681
41682           // patterns
41683           var patterns = defs.selectAll('pattern')
41684               .data([
41685                   // pattern name, pattern image name
41686                   ['wetland', 'wetland'],
41687                   ['construction', 'construction'],
41688                   ['cemetery', 'cemetery'],
41689                   ['orchard', 'orchard'],
41690                   ['farmland', 'farmland'],
41691                   ['beach', 'dots'],
41692                   ['scrub', 'dots'],
41693                   ['meadow', 'dots']
41694               ])
41695               .enter()
41696               .append('pattern')
41697               .attr('id', function (d) { return 'pattern-' + d[0]; })
41698               .attr('width', 32)
41699               .attr('height', 32)
41700               .attr('patternUnits', 'userSpaceOnUse');
41701
41702           patterns
41703               .append('rect')
41704               .attr('x', 0)
41705               .attr('y', 0)
41706               .attr('width', 32)
41707               .attr('height', 32)
41708               .attr('class', function (d) { return 'pattern-color-' + d[0]; });
41709
41710           patterns
41711               .append('image')
41712               .attr('x', 0)
41713               .attr('y', 0)
41714               .attr('width', 32)
41715               .attr('height', 32)
41716               .attr('xlink:href', function (d) {
41717                   return context.imagePath('pattern/' + d[1] + '.png');
41718               });
41719
41720           // clip paths
41721           defs.selectAll('clipPath')
41722               .data([12, 18, 20, 32, 45])
41723               .enter()
41724               .append('clipPath')
41725               .attr('id', function (d) { return 'clip-square-' + d; })
41726               .append('rect')
41727               .attr('x', 0)
41728               .attr('y', 0)
41729               .attr('width', function (d) { return d; })
41730               .attr('height', function (d) { return d; });
41731
41732           // symbol spritesheets
41733           defs
41734               .call(SVGSpriteDefinition('iD-sprite', context.imagePath('iD-sprite.svg')))
41735               .call(SVGSpriteDefinition('maki-sprite', context.imagePath('maki-sprite.svg')))
41736               .call(SVGSpriteDefinition('community-sprite', context.imagePath('community-sprite.svg')));
41737       };
41738   }
41739
41740   /**
41741    * Checks if `value` is `undefined`.
41742    *
41743    * @static
41744    * @since 0.1.0
41745    * @memberOf _
41746    * @category Lang
41747    * @param {*} value The value to check.
41748    * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
41749    * @example
41750    *
41751    * _.isUndefined(void 0);
41752    * // => true
41753    *
41754    * _.isUndefined(null);
41755    * // => false
41756    */
41757   function isUndefined(value) {
41758     return value === undefined;
41759   }
41760
41761   //[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]
41762   //[4a]        NameChar           ::=          NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
41763   //[5]         Name       ::=          NameStartChar (NameChar)*
41764   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
41765   var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
41766   var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
41767   //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
41768   //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(',')
41769
41770   //S_TAG,      S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
41771   //S_ATTR_SPACE,       S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
41772   var S_TAG = 0;//tag name offerring
41773   var S_ATTR = 1;//attr name offerring 
41774   var S_ATTR_SPACE=2;//attr name end and space offer
41775   var S_EQ = 3;//=space?
41776   var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
41777   var S_ATTR_END = 5;//attr value end and no space(quot end)
41778   var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
41779   var S_TAG_CLOSE = 7;//closed el<el />
41780
41781   function XMLReader(){
41782         
41783   }
41784
41785   XMLReader.prototype = {
41786         parse:function(source,defaultNSMap,entityMap){
41787                 var domBuilder = this.domBuilder;
41788                 domBuilder.startDocument();
41789                 _copy(defaultNSMap ,defaultNSMap = {});
41790                 parse$1(source,defaultNSMap,entityMap,
41791                                 domBuilder,this.errorHandler);
41792                 domBuilder.endDocument();
41793         }
41794   };
41795   function parse$1(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
41796         function fixedFromCharCode(code) {
41797                 // String.prototype.fromCharCode does not supports
41798                 // > 2 bytes unicode chars directly
41799                 if (code > 0xffff) {
41800                         code -= 0x10000;
41801                         var surrogate1 = 0xd800 + (code >> 10)
41802                                 , surrogate2 = 0xdc00 + (code & 0x3ff);
41803
41804                         return String.fromCharCode(surrogate1, surrogate2);
41805                 } else {
41806                         return String.fromCharCode(code);
41807                 }
41808         }
41809         function entityReplacer(a){
41810                 var k = a.slice(1,-1);
41811                 if(k in entityMap){
41812                         return entityMap[k]; 
41813                 }else if(k.charAt(0) === '#'){
41814                         return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
41815                 }else{
41816                         errorHandler.error('entity not found:'+a);
41817                         return a;
41818                 }
41819         }
41820         function appendText(end){//has some bugs
41821                 if(end>start){
41822                         var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
41823                         locator&&position(start);
41824                         domBuilder.characters(xt,0,end-start);
41825                         start = end;
41826                 }
41827         }
41828         function position(p,m){
41829                 while(p>=lineEnd && (m = linePattern.exec(source))){
41830                         lineStart = m.index;
41831                         lineEnd = lineStart + m[0].length;
41832                         locator.lineNumber++;
41833                         //console.log('line++:',locator,startPos,endPos)
41834                 }
41835                 locator.columnNumber = p-lineStart+1;
41836         }
41837         var lineStart = 0;
41838         var lineEnd = 0;
41839         var linePattern = /.*(?:\r\n?|\n)|.*$/g;
41840         var locator = domBuilder.locator;
41841         
41842         var parseStack = [{currentNSMap:defaultNSMapCopy}];
41843         var closeMap = {};
41844         var start = 0;
41845         while(true){
41846                 try{
41847                         var tagStart = source.indexOf('<',start);
41848                         if(tagStart<0){
41849                                 if(!source.substr(start).match(/^\s*$/)){
41850                                         var doc = domBuilder.doc;
41851                                 var text = doc.createTextNode(source.substr(start));
41852                                 doc.appendChild(text);
41853                                 domBuilder.currentElement = text;
41854                                 }
41855                                 return;
41856                         }
41857                         if(tagStart>start){
41858                                 appendText(tagStart);
41859                         }
41860                         switch(source.charAt(tagStart+1)){
41861                         case '/':
41862                                 var end = source.indexOf('>',tagStart+3);
41863                                 var tagName = source.substring(tagStart+2,end);
41864                                 var config = parseStack.pop();
41865                                 if(end<0){
41866                                         
41867                                 tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
41868                                 //console.error('#@@@@@@'+tagName)
41869                                 errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
41870                                 end = tagStart+1+tagName.length;
41871                         }else if(tagName.match(/\s</)){
41872                                 tagName = tagName.replace(/[\s<].*/,'');
41873                                 errorHandler.error("end tag name: "+tagName+' maybe not complete');
41874                                 end = tagStart+1+tagName.length;
41875                                 }
41876                                 //console.error(parseStack.length,parseStack)
41877                                 //console.error(config);
41878                                 var localNSMap = config.localNSMap;
41879                                 var endMatch = config.tagName == tagName;
41880                                 var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase();
41881                         if(endIgnoreCaseMach){
41882                                 domBuilder.endElement(config.uri,config.localName,tagName);
41883                                         if(localNSMap){
41884                                                 for(var prefix in localNSMap){
41885                                                         domBuilder.endPrefixMapping(prefix) ;
41886                                                 }
41887                                         }
41888                                         if(!endMatch){
41889                                 errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
41890                                         }
41891                         }else{
41892                                 parseStack.push(config);
41893                         }
41894                                 
41895                                 end++;
41896                                 break;
41897                                 // end elment
41898                         case '?':// <?...?>
41899                                 locator&&position(tagStart);
41900                                 end = parseInstruction(source,tagStart,domBuilder);
41901                                 break;
41902                         case '!':// <!doctype,<![CDATA,<!--
41903                                 locator&&position(tagStart);
41904                                 end = parseDCC(source,tagStart,domBuilder,errorHandler);
41905                                 break;
41906                         default:
41907                                 locator&&position(tagStart);
41908                                 var el = new ElementAttributes();
41909                                 var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
41910                                 //elStartEnd
41911                                 var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
41912                                 var len = el.length;
41913                                 
41914                                 
41915                                 if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
41916                                         el.closed = true;
41917                                         if(!entityMap.nbsp){
41918                                                 errorHandler.warning('unclosed xml attribute');
41919                                         }
41920                                 }
41921                                 if(locator && len){
41922                                         var locator2 = copyLocator(locator,{});
41923                                         //try{//attribute position fixed
41924                                         for(var i = 0;i<len;i++){
41925                                                 var a = el[i];
41926                                                 position(a.offset);
41927                                                 a.locator = copyLocator(locator,{});
41928                                         }
41929                                         //}catch(e){console.error('@@@@@'+e)}
41930                                         domBuilder.locator = locator2;
41931                                         if(appendElement(el,domBuilder,currentNSMap)){
41932                                                 parseStack.push(el);
41933                                         }
41934                                         domBuilder.locator = locator;
41935                                 }else{
41936                                         if(appendElement(el,domBuilder,currentNSMap)){
41937                                                 parseStack.push(el);
41938                                         }
41939                                 }
41940                                 
41941                                 
41942                                 
41943                                 if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
41944                                         end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
41945                                 }else{
41946                                         end++;
41947                                 }
41948                         }
41949                 }catch(e){
41950                         errorHandler.error('element parse error: '+e);
41951                         //errorHandler.error('element parse error: '+e);
41952                         end = -1;
41953                         //throw e;
41954                 }
41955                 if(end>start){
41956                         start = end;
41957                 }else{
41958                         //TODO: 这里有可能sax回退,有位置错误风险
41959                         appendText(Math.max(tagStart,start)+1);
41960                 }
41961         }
41962   }
41963   function copyLocator(f,t){
41964         t.lineNumber = f.lineNumber;
41965         t.columnNumber = f.columnNumber;
41966         return t;
41967   }
41968
41969   /**
41970    * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
41971    * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
41972    */
41973   function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
41974         var attrName;
41975         var value;
41976         var p = ++start;
41977         var s = S_TAG;//status
41978         while(true){
41979                 var c = source.charAt(p);
41980                 switch(c){
41981                 case '=':
41982                         if(s === S_ATTR){//attrName
41983                                 attrName = source.slice(start,p);
41984                                 s = S_EQ;
41985                         }else if(s === S_ATTR_SPACE){
41986                                 s = S_EQ;
41987                         }else{
41988                                 //fatalError: equal must after attrName or space after attrName
41989                                 throw new Error('attribute equal must after attrName');
41990                         }
41991                         break;
41992                 case '\'':
41993                 case '"':
41994                         if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
41995                                 ){//equal
41996                                 if(s === S_ATTR){
41997                                         errorHandler.warning('attribute value must after "="');
41998                                         attrName = source.slice(start,p);
41999                                 }
42000                                 start = p+1;
42001                                 p = source.indexOf(c,start);
42002                                 if(p>0){
42003                                         value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
42004                                         el.add(attrName,value,start-1);
42005                                         s = S_ATTR_END;
42006                                 }else{
42007                                         //fatalError: no end quot match
42008                                         throw new Error('attribute value no end \''+c+'\' match');
42009                                 }
42010                         }else if(s == S_ATTR_NOQUOT_VALUE){
42011                                 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
42012                                 //console.log(attrName,value,start,p)
42013                                 el.add(attrName,value,start);
42014                                 //console.dir(el)
42015                                 errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
42016                                 start = p+1;
42017                                 s = S_ATTR_END;
42018                         }else{
42019                                 //fatalError: no equal before
42020                                 throw new Error('attribute value must after "="');
42021                         }
42022                         break;
42023                 case '/':
42024                         switch(s){
42025                         case S_TAG:
42026                                 el.setTagName(source.slice(start,p));
42027                         case S_ATTR_END:
42028                         case S_TAG_SPACE:
42029                         case S_TAG_CLOSE:
42030                                 s =S_TAG_CLOSE;
42031                                 el.closed = true;
42032                         case S_ATTR_NOQUOT_VALUE:
42033                         case S_ATTR:
42034                         case S_ATTR_SPACE:
42035                                 break;
42036                         //case S_EQ:
42037                         default:
42038                                 throw new Error("attribute invalid close char('/')")
42039                         }
42040                         break;
42041                 case ''://end document
42042                         //throw new Error('unexpected end of input')
42043                         errorHandler.error('unexpected end of input');
42044                         if(s == S_TAG){
42045                                 el.setTagName(source.slice(start,p));
42046                         }
42047                         return p;
42048                 case '>':
42049                         switch(s){
42050                         case S_TAG:
42051                                 el.setTagName(source.slice(start,p));
42052                         case S_ATTR_END:
42053                         case S_TAG_SPACE:
42054                         case S_TAG_CLOSE:
42055                                 break;//normal
42056                         case S_ATTR_NOQUOT_VALUE://Compatible state
42057                         case S_ATTR:
42058                                 value = source.slice(start,p);
42059                                 if(value.slice(-1) === '/'){
42060                                         el.closed  = true;
42061                                         value = value.slice(0,-1);
42062                                 }
42063                         case S_ATTR_SPACE:
42064                                 if(s === S_ATTR_SPACE){
42065                                         value = attrName;
42066                                 }
42067                                 if(s == S_ATTR_NOQUOT_VALUE){
42068                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
42069                                         el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
42070                                 }else{
42071                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
42072                                                 errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
42073                                         }
42074                                         el.add(value,value,start);
42075                                 }
42076                                 break;
42077                         case S_EQ:
42078                                 throw new Error('attribute value missed!!');
42079                         }
42080   //                    console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
42081                         return p;
42082                 /*xml space '\x20' | #x9 | #xD | #xA; */
42083                 case '\u0080':
42084                         c = ' ';
42085                 default:
42086                         if(c<= ' '){//space
42087                                 switch(s){
42088                                 case S_TAG:
42089                                         el.setTagName(source.slice(start,p));//tagName
42090                                         s = S_TAG_SPACE;
42091                                         break;
42092                                 case S_ATTR:
42093                                         attrName = source.slice(start,p);
42094                                         s = S_ATTR_SPACE;
42095                                         break;
42096                                 case S_ATTR_NOQUOT_VALUE:
42097                                         var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
42098                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
42099                                         el.add(attrName,value,start);
42100                                 case S_ATTR_END:
42101                                         s = S_TAG_SPACE;
42102                                         break;
42103                                 //case S_TAG_SPACE:
42104                                 //case S_EQ:
42105                                 //case S_ATTR_SPACE:
42106                                 //      void();break;
42107                                 //case S_TAG_CLOSE:
42108                                         //ignore warning
42109                                 }
42110                         }else{//not space
42111   //S_TAG,      S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
42112   //S_ATTR_SPACE,       S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
42113                                 switch(s){
42114                                 //case S_TAG:void();break;
42115                                 //case S_ATTR:void();break;
42116                                 //case S_ATTR_NOQUOT_VALUE:void();break;
42117                                 case S_ATTR_SPACE:
42118                                         var tagName =  el.tagName;
42119                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
42120                                                 errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!');
42121                                         }
42122                                         el.add(attrName,attrName,start);
42123                                         start = p;
42124                                         s = S_ATTR;
42125                                         break;
42126                                 case S_ATTR_END:
42127                                         errorHandler.warning('attribute space is required"'+attrName+'"!!');
42128                                 case S_TAG_SPACE:
42129                                         s = S_ATTR;
42130                                         start = p;
42131                                         break;
42132                                 case S_EQ:
42133                                         s = S_ATTR_NOQUOT_VALUE;
42134                                         start = p;
42135                                         break;
42136                                 case S_TAG_CLOSE:
42137                                         throw new Error("elements closed character '/' and '>' must be connected to");
42138                                 }
42139                         }
42140                 }//end outer switch
42141                 //console.log('p++',p)
42142                 p++;
42143         }
42144   }
42145   /**
42146    * @return true if has new namespace define
42147    */
42148   function appendElement(el,domBuilder,currentNSMap){
42149         var tagName = el.tagName;
42150         var localNSMap = null;
42151         //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
42152         var i = el.length;
42153         while(i--){
42154                 var a = el[i];
42155                 var qName = a.qName;
42156                 var value = a.value;
42157                 var nsp = qName.indexOf(':');
42158                 if(nsp>0){
42159                         var prefix = a.prefix = qName.slice(0,nsp);
42160                         var localName = qName.slice(nsp+1);
42161                         var nsPrefix = prefix === 'xmlns' && localName;
42162                 }else{
42163                         localName = qName;
42164                         prefix = null;
42165                         nsPrefix = qName === 'xmlns' && '';
42166                 }
42167                 //can not set prefix,because prefix !== ''
42168                 a.localName = localName ;
42169                 //prefix == null for no ns prefix attribute 
42170                 if(nsPrefix !== false){//hack!!
42171                         if(localNSMap == null){
42172                                 localNSMap = {};
42173                                 //console.log(currentNSMap,0)
42174                                 _copy(currentNSMap,currentNSMap={});
42175                                 //console.log(currentNSMap,1)
42176                         }
42177                         currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
42178                         a.uri = 'http://www.w3.org/2000/xmlns/';
42179                         domBuilder.startPrefixMapping(nsPrefix, value); 
42180                 }
42181         }
42182         var i = el.length;
42183         while(i--){
42184                 a = el[i];
42185                 var prefix = a.prefix;
42186                 if(prefix){//no prefix attribute has no namespace
42187                         if(prefix === 'xml'){
42188                                 a.uri = 'http://www.w3.org/XML/1998/namespace';
42189                         }if(prefix !== 'xmlns'){
42190                                 a.uri = currentNSMap[prefix || ''];
42191                                 
42192                                 //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
42193                         }
42194                 }
42195         }
42196         var nsp = tagName.indexOf(':');
42197         if(nsp>0){
42198                 prefix = el.prefix = tagName.slice(0,nsp);
42199                 localName = el.localName = tagName.slice(nsp+1);
42200         }else{
42201                 prefix = null;//important!!
42202                 localName = el.localName = tagName;
42203         }
42204         //no prefix element has default namespace
42205         var ns = el.uri = currentNSMap[prefix || ''];
42206         domBuilder.startElement(ns,localName,tagName,el);
42207         //endPrefixMapping and startPrefixMapping have not any help for dom builder
42208         //localNSMap = null
42209         if(el.closed){
42210                 domBuilder.endElement(ns,localName,tagName);
42211                 if(localNSMap){
42212                         for(prefix in localNSMap){
42213                                 domBuilder.endPrefixMapping(prefix); 
42214                         }
42215                 }
42216         }else{
42217                 el.currentNSMap = currentNSMap;
42218                 el.localNSMap = localNSMap;
42219                 //parseStack.push(el);
42220                 return true;
42221         }
42222   }
42223   function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
42224         if(/^(?:script|textarea)$/i.test(tagName)){
42225                 var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
42226                 var text = source.substring(elStartEnd+1,elEndStart);
42227                 if(/[&<]/.test(text)){
42228                         if(/^script$/i.test(tagName)){
42229                                 //if(!/\]\]>/.test(text)){
42230                                         //lexHandler.startCDATA();
42231                                         domBuilder.characters(text,0,text.length);
42232                                         //lexHandler.endCDATA();
42233                                         return elEndStart;
42234                                 //}
42235                         }//}else{//text area
42236                                 text = text.replace(/&#?\w+;/g,entityReplacer);
42237                                 domBuilder.characters(text,0,text.length);
42238                                 return elEndStart;
42239                         //}
42240                         
42241                 }
42242         }
42243         return elStartEnd+1;
42244   }
42245   function fixSelfClosed(source,elStartEnd,tagName,closeMap){
42246         //if(tagName in closeMap){
42247         var pos = closeMap[tagName];
42248         if(pos == null){
42249                 //console.log(tagName)
42250                 pos =  source.lastIndexOf('</'+tagName+'>');
42251                 if(pos<elStartEnd){//忘记闭合
42252                         pos = source.lastIndexOf('</'+tagName);
42253                 }
42254                 closeMap[tagName] =pos;
42255         }
42256         return pos<elStartEnd;
42257         //} 
42258   }
42259   function _copy(source,target){
42260         for(var n in source){target[n] = source[n];}
42261   }
42262   function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
42263         var next= source.charAt(start+2);
42264         switch(next){
42265         case '-':
42266                 if(source.charAt(start + 3) === '-'){
42267                         var end = source.indexOf('-->',start+4);
42268                         //append comment source.substring(4,end)//<!--
42269                         if(end>start){
42270                                 domBuilder.comment(source,start+4,end-start-4);
42271                                 return end+3;
42272                         }else{
42273                                 errorHandler.error("Unclosed comment");
42274                                 return -1;
42275                         }
42276                 }else{
42277                         //error
42278                         return -1;
42279                 }
42280         default:
42281                 if(source.substr(start+3,6) == 'CDATA['){
42282                         var end = source.indexOf(']]>',start+9);
42283                         domBuilder.startCDATA();
42284                         domBuilder.characters(source,start+9,end-start-9);
42285                         domBuilder.endCDATA(); 
42286                         return end+3;
42287                 }
42288                 //<!DOCTYPE
42289                 //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
42290                 var matchs = split(source,start);
42291                 var len = matchs.length;
42292                 if(len>1 && /!doctype/i.test(matchs[0][0])){
42293                         var name = matchs[1][0];
42294                         var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0];
42295                         var sysid = len>4 && matchs[4][0];
42296                         var lastMatch = matchs[len-1];
42297                         domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
42298                                         sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
42299                         domBuilder.endDTD();
42300                         
42301                         return lastMatch.index+lastMatch[0].length
42302                 }
42303         }
42304         return -1;
42305   }
42306
42307
42308
42309   function parseInstruction(source,start,domBuilder){
42310         var end = source.indexOf('?>',start);
42311         if(end){
42312                 var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
42313                 if(match){
42314                         var len = match[0].length;
42315                         domBuilder.processingInstruction(match[1], match[2]) ;
42316                         return end+2;
42317                 }else{//error
42318                         return -1;
42319                 }
42320         }
42321         return -1;
42322   }
42323
42324   /**
42325    * @param source
42326    */
42327   function ElementAttributes(source){
42328         
42329   }
42330   ElementAttributes.prototype = {
42331         setTagName:function(tagName){
42332                 if(!tagNamePattern.test(tagName)){
42333                         throw new Error('invalid tagName:'+tagName)
42334                 }
42335                 this.tagName = tagName;
42336         },
42337         add:function(qName,value,offset){
42338                 if(!tagNamePattern.test(qName)){
42339                         throw new Error('invalid attribute:'+qName)
42340                 }
42341                 this[this.length++] = {qName:qName,value:value,offset:offset};
42342         },
42343         length:0,
42344         getLocalName:function(i){return this[i].localName},
42345         getLocator:function(i){return this[i].locator},
42346         getQName:function(i){return this[i].qName},
42347         getURI:function(i){return this[i].uri},
42348         getValue:function(i){return this[i].value}
42349   //    ,getIndex:function(uri, localName)){
42350   //            if(localName){
42351   //                    
42352   //            }else{
42353   //                    var qName = uri
42354   //            }
42355   //    },
42356   //    getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
42357   //    getType:function(uri,localName){}
42358   //    getType:function(i){},
42359   };
42360
42361
42362
42363
42364   function _set_proto_(thiz,parent){
42365         thiz.__proto__ = parent;
42366         return thiz;
42367   }
42368   if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
42369         _set_proto_ = function(thiz,parent){
42370                 function p(){}          p.prototype = parent;
42371                 p = new p();
42372                 for(parent in thiz){
42373                         p[parent] = thiz[parent];
42374                 }
42375                 return p;
42376         };
42377   }
42378
42379   function split(source,start){
42380         var match;
42381         var buf = [];
42382         var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
42383         reg.lastIndex = start;
42384         reg.exec(source);//skip <
42385         while(match = reg.exec(source)){
42386                 buf.push(match);
42387                 if(match[1])return buf;
42388         }
42389   }
42390
42391   var XMLReader_1 = XMLReader;
42392
42393   var sax = {
42394         XMLReader: XMLReader_1
42395   };
42396
42397   /*
42398    * DOM Level 2
42399    * Object DOMException
42400    * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
42401    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
42402    */
42403
42404   function copy$1(src,dest){
42405         for(var p in src){
42406                 dest[p] = src[p];
42407         }
42408   }
42409   /**
42410   ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
42411   ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
42412    */
42413   function _extends(Class,Super){
42414         var pt = Class.prototype;
42415         if(Object.create){
42416                 var ppt = Object.create(Super.prototype);
42417                 pt.__proto__ = ppt;
42418         }
42419         if(!(pt instanceof Super)){
42420                 function t(){}          t.prototype = Super.prototype;
42421                 t = new t();
42422                 copy$1(pt,t);
42423                 Class.prototype = pt = t;
42424         }
42425         if(pt.constructor != Class){
42426                 if(typeof Class != 'function'){
42427                         console.error("unknow Class:"+Class);
42428                 }
42429                 pt.constructor = Class;
42430         }
42431   }
42432   var htmlns = 'http://www.w3.org/1999/xhtml' ;
42433   // Node Types
42434   var NodeType = {};
42435   var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
42436   var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
42437   var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
42438   var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
42439   var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
42440   var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
42441   var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
42442   var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
42443   var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
42444   var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
42445   var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
42446   var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;
42447
42448   // ExceptionCode
42449   var ExceptionCode = {};
42450   var ExceptionMessage = {};
42451   var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = (ExceptionMessage[1]="Index size error", 1);
42452   var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = (ExceptionMessage[2]="DOMString size error", 2);
42453   var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = (ExceptionMessage[3]="Hierarchy request error", 3);
42454   var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = (ExceptionMessage[4]="Wrong document", 4);
42455   var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = (ExceptionMessage[5]="Invalid character", 5);
42456   var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = (ExceptionMessage[6]="No data allowed", 6);
42457   var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = (ExceptionMessage[7]="No modification allowed", 7);
42458   var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = (ExceptionMessage[8]="Not found", 8);
42459   var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = (ExceptionMessage[9]="Not supported", 9);
42460   var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = (ExceptionMessage[10]="Attribute in use", 10);
42461   //level2
42462   var INVALID_STATE_ERR         = ExceptionCode.INVALID_STATE_ERR               = (ExceptionMessage[11]="Invalid state", 11);
42463   var SYNTAX_ERR                = ExceptionCode.SYNTAX_ERR                      = (ExceptionMessage[12]="Syntax error", 12);
42464   var INVALID_MODIFICATION_ERR  = ExceptionCode.INVALID_MODIFICATION_ERR        = (ExceptionMessage[13]="Invalid modification", 13);
42465   var NAMESPACE_ERR             = ExceptionCode.NAMESPACE_ERR                   = (ExceptionMessage[14]="Invalid namespace", 14);
42466   var INVALID_ACCESS_ERR        = ExceptionCode.INVALID_ACCESS_ERR              = (ExceptionMessage[15]="Invalid access", 15);
42467
42468
42469   function DOMException(code, message) {
42470         if(message instanceof Error){
42471                 var error = message;
42472         }else{
42473                 error = this;
42474                 Error.call(this, ExceptionMessage[code]);
42475                 this.message = ExceptionMessage[code];
42476                 if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
42477         }
42478         error.code = code;
42479         if(message) this.message = this.message + ": " + message;
42480         return error;
42481   }DOMException.prototype = Error.prototype;
42482   copy$1(ExceptionCode,DOMException);
42483   /**
42484    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
42485    * 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.
42486    * The items in the NodeList are accessible via an integral index, starting from 0.
42487    */
42488   function NodeList() {
42489   }NodeList.prototype = {
42490         /**
42491          * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
42492          * @standard level1
42493          */
42494         length:0, 
42495         /**
42496          * 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.
42497          * @standard level1
42498          * @param index  unsigned long 
42499          *   Index into the collection.
42500          * @return Node
42501          *      The node at the indexth position in the NodeList, or null if that is not a valid index. 
42502          */
42503         item: function(index) {
42504                 return this[index] || null;
42505         },
42506         toString:function(isHTML,nodeFilter){
42507                 for(var buf = [], i = 0;i<this.length;i++){
42508                         serializeToString(this[i],buf,isHTML,nodeFilter);
42509                 }
42510                 return buf.join('');
42511         }
42512   };
42513   function LiveNodeList(node,refresh){
42514         this._node = node;
42515         this._refresh = refresh;
42516         _updateLiveList(this);
42517   }
42518   function _updateLiveList(list){
42519         var inc = list._node._inc || list._node.ownerDocument._inc;
42520         if(list._inc != inc){
42521                 var ls = list._refresh(list._node);
42522                 //console.log(ls.length)
42523                 __set__(list,'length',ls.length);
42524                 copy$1(ls,list);
42525                 list._inc = inc;
42526         }
42527   }
42528   LiveNodeList.prototype.item = function(i){
42529         _updateLiveList(this);
42530         return this[i];
42531   };
42532
42533   _extends(LiveNodeList,NodeList);
42534   /**
42535    * 
42536    * 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.
42537    * NamedNodeMap objects in the DOM are live.
42538    * used for attributes or DocumentType entities 
42539    */
42540   function NamedNodeMap() {
42541   }
42542   function _findNodeIndex(list,node){
42543         var i = list.length;
42544         while(i--){
42545                 if(list[i] === node){return i}
42546         }
42547   }
42548
42549   function _addNamedNode(el,list,newAttr,oldAttr){
42550         if(oldAttr){
42551                 list[_findNodeIndex(list,oldAttr)] = newAttr;
42552         }else{
42553                 list[list.length++] = newAttr;
42554         }
42555         if(el){
42556                 newAttr.ownerElement = el;
42557                 var doc = el.ownerDocument;
42558                 if(doc){
42559                         oldAttr && _onRemoveAttribute(doc,el,oldAttr);
42560                         _onAddAttribute(doc,el,newAttr);
42561                 }
42562         }
42563   }
42564   function _removeNamedNode(el,list,attr){
42565         //console.log('remove attr:'+attr)
42566         var i = _findNodeIndex(list,attr);
42567         if(i>=0){
42568                 var lastIndex = list.length-1;
42569                 while(i<lastIndex){
42570                         list[i] = list[++i];
42571                 }
42572                 list.length = lastIndex;
42573                 if(el){
42574                         var doc = el.ownerDocument;
42575                         if(doc){
42576                                 _onRemoveAttribute(doc,el,attr);
42577                                 attr.ownerElement = null;
42578                         }
42579                 }
42580         }else{
42581                 throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
42582         }
42583   }
42584   NamedNodeMap.prototype = {
42585         length:0,
42586         item:NodeList.prototype.item,
42587         getNamedItem: function(key) {
42588   //            if(key.indexOf(':')>0 || key == 'xmlns'){
42589   //                    return null;
42590   //            }
42591                 //console.log()
42592                 var i = this.length;
42593                 while(i--){
42594                         var attr = this[i];
42595                         //console.log(attr.nodeName,key)
42596                         if(attr.nodeName == key){
42597                                 return attr;
42598                         }
42599                 }
42600         },
42601         setNamedItem: function(attr) {
42602                 var el = attr.ownerElement;
42603                 if(el && el!=this._ownerElement){
42604                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
42605                 }
42606                 var oldAttr = this.getNamedItem(attr.nodeName);
42607                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
42608                 return oldAttr;
42609         },
42610         /* returns Node */
42611         setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
42612                 var el = attr.ownerElement, oldAttr;
42613                 if(el && el!=this._ownerElement){
42614                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
42615                 }
42616                 oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
42617                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
42618                 return oldAttr;
42619         },
42620
42621         /* returns Node */
42622         removeNamedItem: function(key) {
42623                 var attr = this.getNamedItem(key);
42624                 _removeNamedNode(this._ownerElement,this,attr);
42625                 return attr;
42626                 
42627                 
42628         },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
42629         
42630         //for level2
42631         removeNamedItemNS:function(namespaceURI,localName){
42632                 var attr = this.getNamedItemNS(namespaceURI,localName);
42633                 _removeNamedNode(this._ownerElement,this,attr);
42634                 return attr;
42635         },
42636         getNamedItemNS: function(namespaceURI, localName) {
42637                 var i = this.length;
42638                 while(i--){
42639                         var node = this[i];
42640                         if(node.localName == localName && node.namespaceURI == namespaceURI){
42641                                 return node;
42642                         }
42643                 }
42644                 return null;
42645         }
42646   };
42647   /**
42648    * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
42649    */
42650   function DOMImplementation(/* Object */ features) {
42651         this._features = {};
42652         if (features) {
42653                 for (var feature in features) {
42654                          this._features = features[feature];
42655                 }
42656         }
42657   }
42658   DOMImplementation.prototype = {
42659         hasFeature: function(/* string */ feature, /* string */ version) {
42660                 var versions = this._features[feature.toLowerCase()];
42661                 if (versions && (!version || version in versions)) {
42662                         return true;
42663                 } else {
42664                         return false;
42665                 }
42666         },
42667         // Introduced in DOM Level 2:
42668         createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
42669                 var doc = new Document();
42670                 doc.implementation = this;
42671                 doc.childNodes = new NodeList();
42672                 doc.doctype = doctype;
42673                 if(doctype){
42674                         doc.appendChild(doctype);
42675                 }
42676                 if(qualifiedName){
42677                         var root = doc.createElementNS(namespaceURI,qualifiedName);
42678                         doc.appendChild(root);
42679                 }
42680                 return doc;
42681         },
42682         // Introduced in DOM Level 2:
42683         createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
42684                 var node = new DocumentType();
42685                 node.name = qualifiedName;
42686                 node.nodeName = qualifiedName;
42687                 node.publicId = publicId;
42688                 node.systemId = systemId;
42689                 // Introduced in DOM Level 2:
42690                 //readonly attribute DOMString        internalSubset;
42691                 
42692                 //TODO:..
42693                 //  readonly attribute NamedNodeMap     entities;
42694                 //  readonly attribute NamedNodeMap     notations;
42695                 return node;
42696         }
42697   };
42698
42699
42700   /**
42701    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
42702    */
42703
42704   function Node$2() {
42705   }
42706   Node$2.prototype = {
42707         firstChild : null,
42708         lastChild : null,
42709         previousSibling : null,
42710         nextSibling : null,
42711         attributes : null,
42712         parentNode : null,
42713         childNodes : null,
42714         ownerDocument : null,
42715         nodeValue : null,
42716         namespaceURI : null,
42717         prefix : null,
42718         localName : null,
42719         // Modified in DOM Level 2:
42720         insertBefore:function(newChild, refChild){//raises 
42721                 return _insertBefore(this,newChild,refChild);
42722         },
42723         replaceChild:function(newChild, oldChild){//raises 
42724                 this.insertBefore(newChild,oldChild);
42725                 if(oldChild){
42726                         this.removeChild(oldChild);
42727                 }
42728         },
42729         removeChild:function(oldChild){
42730                 return _removeChild(this,oldChild);
42731         },
42732         appendChild:function(newChild){
42733                 return this.insertBefore(newChild,null);
42734         },
42735         hasChildNodes:function(){
42736                 return this.firstChild != null;
42737         },
42738         cloneNode:function(deep){
42739                 return cloneNode(this.ownerDocument||this,this,deep);
42740         },
42741         // Modified in DOM Level 2:
42742         normalize:function(){
42743                 var child = this.firstChild;
42744                 while(child){
42745                         var next = child.nextSibling;
42746                         if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
42747                                 this.removeChild(next);
42748                                 child.appendData(next.data);
42749                         }else{
42750                                 child.normalize();
42751                                 child = next;
42752                         }
42753                 }
42754         },
42755         // Introduced in DOM Level 2:
42756         isSupported:function(feature, version){
42757                 return this.ownerDocument.implementation.hasFeature(feature,version);
42758         },
42759       // Introduced in DOM Level 2:
42760       hasAttributes:function(){
42761         return this.attributes.length>0;
42762       },
42763       lookupPrefix:function(namespaceURI){
42764         var el = this;
42765         while(el){
42766                 var map = el._nsMap;
42767                 //console.dir(map)
42768                 if(map){
42769                         for(var n in map){
42770                                 if(map[n] == namespaceURI){
42771                                         return n;
42772                                 }
42773                         }
42774                 }
42775                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
42776         }
42777         return null;
42778       },
42779       // Introduced in DOM Level 3:
42780       lookupNamespaceURI:function(prefix){
42781         var el = this;
42782         while(el){
42783                 var map = el._nsMap;
42784                 //console.dir(map)
42785                 if(map){
42786                         if(prefix in map){
42787                                 return map[prefix] ;
42788                         }
42789                 }
42790                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
42791         }
42792         return null;
42793       },
42794       // Introduced in DOM Level 3:
42795       isDefaultNamespace:function(namespaceURI){
42796         var prefix = this.lookupPrefix(namespaceURI);
42797         return prefix == null;
42798       }
42799   };
42800
42801
42802   function _xmlEncoder(c){
42803         return c == '<' && '&lt;' ||
42804            c == '>' && '&gt;' ||
42805            c == '&' && '&amp;' ||
42806            c == '"' && '&quot;' ||
42807            '&#'+c.charCodeAt()+';'
42808   }
42809
42810
42811   copy$1(NodeType,Node$2);
42812   copy$1(NodeType,Node$2.prototype);
42813
42814   /**
42815    * @param callback return true for continue,false for break
42816    * @return boolean true: break visit;
42817    */
42818   function _visitNode(node,callback){
42819         if(callback(node)){
42820                 return true;
42821         }
42822         if(node = node.firstChild){
42823                 do{
42824                         if(_visitNode(node,callback)){return true}
42825           }while(node=node.nextSibling)
42826       }
42827   }
42828
42829
42830
42831   function Document(){
42832   }
42833   function _onAddAttribute(doc,el,newAttr){
42834         doc && doc._inc++;
42835         var ns = newAttr.namespaceURI ;
42836         if(ns == 'http://www.w3.org/2000/xmlns/'){
42837                 //update namespace
42838                 el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
42839         }
42840   }
42841   function _onRemoveAttribute(doc,el,newAttr,remove){
42842         doc && doc._inc++;
42843         var ns = newAttr.namespaceURI ;
42844         if(ns == 'http://www.w3.org/2000/xmlns/'){
42845                 //update namespace
42846                 delete el._nsMap[newAttr.prefix?newAttr.localName:''];
42847         }
42848   }
42849   function _onUpdateChild(doc,el,newChild){
42850         if(doc && doc._inc){
42851                 doc._inc++;
42852                 //update childNodes
42853                 var cs = el.childNodes;
42854                 if(newChild){
42855                         cs[cs.length++] = newChild;
42856                 }else{
42857                         //console.log(1)
42858                         var child = el.firstChild;
42859                         var i = 0;
42860                         while(child){
42861                                 cs[i++] = child;
42862                                 child =child.nextSibling;
42863                         }
42864                         cs.length = i;
42865                 }
42866         }
42867   }
42868
42869   /**
42870    * attributes;
42871    * children;
42872    * 
42873    * writeable properties:
42874    * nodeValue,Attr:value,CharacterData:data
42875    * prefix
42876    */
42877   function _removeChild(parentNode,child){
42878         var previous = child.previousSibling;
42879         var next = child.nextSibling;
42880         if(previous){
42881                 previous.nextSibling = next;
42882         }else{
42883                 parentNode.firstChild = next;
42884         }
42885         if(next){
42886                 next.previousSibling = previous;
42887         }else{
42888                 parentNode.lastChild = previous;
42889         }
42890         _onUpdateChild(parentNode.ownerDocument,parentNode);
42891         return child;
42892   }
42893   /**
42894    * preformance key(refChild == null)
42895    */
42896   function _insertBefore(parentNode,newChild,nextChild){
42897         var cp = newChild.parentNode;
42898         if(cp){
42899                 cp.removeChild(newChild);//remove and update
42900         }
42901         if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
42902                 var newFirst = newChild.firstChild;
42903                 if (newFirst == null) {
42904                         return newChild;
42905                 }
42906                 var newLast = newChild.lastChild;
42907         }else{
42908                 newFirst = newLast = newChild;
42909         }
42910         var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
42911
42912         newFirst.previousSibling = pre;
42913         newLast.nextSibling = nextChild;
42914         
42915         
42916         if(pre){
42917                 pre.nextSibling = newFirst;
42918         }else{
42919                 parentNode.firstChild = newFirst;
42920         }
42921         if(nextChild == null){
42922                 parentNode.lastChild = newLast;
42923         }else{
42924                 nextChild.previousSibling = newLast;
42925         }
42926         do{
42927                 newFirst.parentNode = parentNode;
42928         }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
42929         _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
42930         //console.log(parentNode.lastChild.nextSibling == null)
42931         if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
42932                 newChild.firstChild = newChild.lastChild = null;
42933         }
42934         return newChild;
42935   }
42936   function _appendSingleChild(parentNode,newChild){
42937         var cp = newChild.parentNode;
42938         if(cp){
42939                 var pre = parentNode.lastChild;
42940                 cp.removeChild(newChild);//remove and update
42941                 var pre = parentNode.lastChild;
42942         }
42943         var pre = parentNode.lastChild;
42944         newChild.parentNode = parentNode;
42945         newChild.previousSibling = pre;
42946         newChild.nextSibling = null;
42947         if(pre){
42948                 pre.nextSibling = newChild;
42949         }else{
42950                 parentNode.firstChild = newChild;
42951         }
42952         parentNode.lastChild = newChild;
42953         _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
42954         return newChild;
42955         //console.log("__aa",parentNode.lastChild.nextSibling == null)
42956   }
42957   Document.prototype = {
42958         //implementation : null,
42959         nodeName :  '#document',
42960         nodeType :  DOCUMENT_NODE,
42961         doctype :  null,
42962         documentElement :  null,
42963         _inc : 1,
42964         
42965         insertBefore :  function(newChild, refChild){//raises 
42966                 if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
42967                         var child = newChild.firstChild;
42968                         while(child){
42969                                 var next = child.nextSibling;
42970                                 this.insertBefore(child,refChild);
42971                                 child = next;
42972                         }
42973                         return newChild;
42974                 }
42975                 if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
42976                         this.documentElement = newChild;
42977                 }
42978                 
42979                 return _insertBefore(this,newChild,refChild), newChild.ownerDocument = this, newChild;
42980         },
42981         removeChild :  function(oldChild){
42982                 if(this.documentElement == oldChild){
42983                         this.documentElement = null;
42984                 }
42985                 return _removeChild(this,oldChild);
42986         },
42987         // Introduced in DOM Level 2:
42988         importNode : function(importedNode,deep){
42989                 return importNode(this,importedNode,deep);
42990         },
42991         // Introduced in DOM Level 2:
42992         getElementById :        function(id){
42993                 var rtv = null;
42994                 _visitNode(this.documentElement,function(node){
42995                         if(node.nodeType == ELEMENT_NODE){
42996                                 if(node.getAttribute('id') == id){
42997                                         rtv = node;
42998                                         return true;
42999                                 }
43000                         }
43001                 });
43002                 return rtv;
43003         },
43004         
43005         //document factory method:
43006         createElement : function(tagName){
43007                 var node = new Element();
43008                 node.ownerDocument = this;
43009                 node.nodeName = tagName;
43010                 node.tagName = tagName;
43011                 node.childNodes = new NodeList();
43012                 var attrs       = node.attributes = new NamedNodeMap();
43013                 attrs._ownerElement = node;
43014                 return node;
43015         },
43016         createDocumentFragment :        function(){
43017                 var node = new DocumentFragment();
43018                 node.ownerDocument = this;
43019                 node.childNodes = new NodeList();
43020                 return node;
43021         },
43022         createTextNode :        function(data){
43023                 var node = new Text();
43024                 node.ownerDocument = this;
43025                 node.appendData(data);
43026                 return node;
43027         },
43028         createComment : function(data){
43029                 var node = new Comment();
43030                 node.ownerDocument = this;
43031                 node.appendData(data);
43032                 return node;
43033         },
43034         createCDATASection :    function(data){
43035                 var node = new CDATASection();
43036                 node.ownerDocument = this;
43037                 node.appendData(data);
43038                 return node;
43039         },
43040         createProcessingInstruction :   function(target,data){
43041                 var node = new ProcessingInstruction();
43042                 node.ownerDocument = this;
43043                 node.tagName = node.target = target;
43044                 node.nodeValue= node.data = data;
43045                 return node;
43046         },
43047         createAttribute :       function(name){
43048                 var node = new Attr();
43049                 node.ownerDocument      = this;
43050                 node.name = name;
43051                 node.nodeName   = name;
43052                 node.localName = name;
43053                 node.specified = true;
43054                 return node;
43055         },
43056         createEntityReference : function(name){
43057                 var node = new EntityReference();
43058                 node.ownerDocument      = this;
43059                 node.nodeName   = name;
43060                 return node;
43061         },
43062         // Introduced in DOM Level 2:
43063         createElementNS :       function(namespaceURI,qualifiedName){
43064                 var node = new Element();
43065                 var pl = qualifiedName.split(':');
43066                 var attrs       = node.attributes = new NamedNodeMap();
43067                 node.childNodes = new NodeList();
43068                 node.ownerDocument = this;
43069                 node.nodeName = qualifiedName;
43070                 node.tagName = qualifiedName;
43071                 node.namespaceURI = namespaceURI;
43072                 if(pl.length == 2){
43073                         node.prefix = pl[0];
43074                         node.localName = pl[1];
43075                 }else{
43076                         //el.prefix = null;
43077                         node.localName = qualifiedName;
43078                 }
43079                 attrs._ownerElement = node;
43080                 return node;
43081         },
43082         // Introduced in DOM Level 2:
43083         createAttributeNS :     function(namespaceURI,qualifiedName){
43084                 var node = new Attr();
43085                 var pl = qualifiedName.split(':');
43086                 node.ownerDocument = this;
43087                 node.nodeName = qualifiedName;
43088                 node.name = qualifiedName;
43089                 node.namespaceURI = namespaceURI;
43090                 node.specified = true;
43091                 if(pl.length == 2){
43092                         node.prefix = pl[0];
43093                         node.localName = pl[1];
43094                 }else{
43095                         //el.prefix = null;
43096                         node.localName = qualifiedName;
43097                 }
43098                 return node;
43099         }
43100   };
43101   _extends(Document,Node$2);
43102
43103
43104   function Element() {
43105         this._nsMap = {};
43106   }Element.prototype = {
43107         nodeType : ELEMENT_NODE,
43108         hasAttribute : function(name){
43109                 return this.getAttributeNode(name)!=null;
43110         },
43111         getAttribute : function(name){
43112                 var attr = this.getAttributeNode(name);
43113                 return attr && attr.value || '';
43114         },
43115         getAttributeNode : function(name){
43116                 return this.attributes.getNamedItem(name);
43117         },
43118         setAttribute : function(name, value){
43119                 var attr = this.ownerDocument.createAttribute(name);
43120                 attr.value = attr.nodeValue = "" + value;
43121                 this.setAttributeNode(attr);
43122         },
43123         removeAttribute : function(name){
43124                 var attr = this.getAttributeNode(name);
43125                 attr && this.removeAttributeNode(attr);
43126         },
43127         
43128         //four real opeartion method
43129         appendChild:function(newChild){
43130                 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
43131                         return this.insertBefore(newChild,null);
43132                 }else{
43133                         return _appendSingleChild(this,newChild);
43134                 }
43135         },
43136         setAttributeNode : function(newAttr){
43137                 return this.attributes.setNamedItem(newAttr);
43138         },
43139         setAttributeNodeNS : function(newAttr){
43140                 return this.attributes.setNamedItemNS(newAttr);
43141         },
43142         removeAttributeNode : function(oldAttr){
43143                 //console.log(this == oldAttr.ownerElement)
43144                 return this.attributes.removeNamedItem(oldAttr.nodeName);
43145         },
43146         //get real attribute name,and remove it by removeAttributeNode
43147         removeAttributeNS : function(namespaceURI, localName){
43148                 var old = this.getAttributeNodeNS(namespaceURI, localName);
43149                 old && this.removeAttributeNode(old);
43150         },
43151         
43152         hasAttributeNS : function(namespaceURI, localName){
43153                 return this.getAttributeNodeNS(namespaceURI, localName)!=null;
43154         },
43155         getAttributeNS : function(namespaceURI, localName){
43156                 var attr = this.getAttributeNodeNS(namespaceURI, localName);
43157                 return attr && attr.value || '';
43158         },
43159         setAttributeNS : function(namespaceURI, qualifiedName, value){
43160                 var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
43161                 attr.value = attr.nodeValue = "" + value;
43162                 this.setAttributeNode(attr);
43163         },
43164         getAttributeNodeNS : function(namespaceURI, localName){
43165                 return this.attributes.getNamedItemNS(namespaceURI, localName);
43166         },
43167         
43168         getElementsByTagName : function(tagName){
43169                 return new LiveNodeList(this,function(base){
43170                         var ls = [];
43171                         _visitNode(base,function(node){
43172                                 if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
43173                                         ls.push(node);
43174                                 }
43175                         });
43176                         return ls;
43177                 });
43178         },
43179         getElementsByTagNameNS : function(namespaceURI, localName){
43180                 return new LiveNodeList(this,function(base){
43181                         var ls = [];
43182                         _visitNode(base,function(node){
43183                                 if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
43184                                         ls.push(node);
43185                                 }
43186                         });
43187                         return ls;
43188                         
43189                 });
43190         }
43191   };
43192   Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
43193   Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
43194
43195
43196   _extends(Element,Node$2);
43197   function Attr() {
43198   }Attr.prototype.nodeType = ATTRIBUTE_NODE;
43199   _extends(Attr,Node$2);
43200
43201
43202   function CharacterData() {
43203   }CharacterData.prototype = {
43204         data : '',
43205         substringData : function(offset, count) {
43206                 return this.data.substring(offset, offset+count);
43207         },
43208         appendData: function(text) {
43209                 text = this.data+text;
43210                 this.nodeValue = this.data = text;
43211                 this.length = text.length;
43212         },
43213         insertData: function(offset,text) {
43214                 this.replaceData(offset,0,text);
43215         
43216         },
43217         appendChild:function(newChild){
43218                 throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
43219         },
43220         deleteData: function(offset, count) {
43221                 this.replaceData(offset,count,"");
43222         },
43223         replaceData: function(offset, count, text) {
43224                 var start = this.data.substring(0,offset);
43225                 var end = this.data.substring(offset+count);
43226                 text = start + text + end;
43227                 this.nodeValue = this.data = text;
43228                 this.length = text.length;
43229         }
43230   };
43231   _extends(CharacterData,Node$2);
43232   function Text() {
43233   }Text.prototype = {
43234         nodeName : "#text",
43235         nodeType : TEXT_NODE,
43236         splitText : function(offset) {
43237                 var text = this.data;
43238                 var newText = text.substring(offset);
43239                 text = text.substring(0, offset);
43240                 this.data = this.nodeValue = text;
43241                 this.length = text.length;
43242                 var newNode = this.ownerDocument.createTextNode(newText);
43243                 if(this.parentNode){
43244                         this.parentNode.insertBefore(newNode, this.nextSibling);
43245                 }
43246                 return newNode;
43247         }
43248   };
43249   _extends(Text,CharacterData);
43250   function Comment() {
43251   }Comment.prototype = {
43252         nodeName : "#comment",
43253         nodeType : COMMENT_NODE
43254   };
43255   _extends(Comment,CharacterData);
43256
43257   function CDATASection() {
43258   }CDATASection.prototype = {
43259         nodeName : "#cdata-section",
43260         nodeType : CDATA_SECTION_NODE
43261   };
43262   _extends(CDATASection,CharacterData);
43263
43264
43265   function DocumentType() {
43266   }DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
43267   _extends(DocumentType,Node$2);
43268
43269   function Notation() {
43270   }Notation.prototype.nodeType = NOTATION_NODE;
43271   _extends(Notation,Node$2);
43272
43273   function Entity() {
43274   }Entity.prototype.nodeType = ENTITY_NODE;
43275   _extends(Entity,Node$2);
43276
43277   function EntityReference() {
43278   }EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
43279   _extends(EntityReference,Node$2);
43280
43281   function DocumentFragment() {
43282   }DocumentFragment.prototype.nodeName =        "#document-fragment";
43283   DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE;
43284   _extends(DocumentFragment,Node$2);
43285
43286
43287   function ProcessingInstruction() {
43288   }
43289   ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
43290   _extends(ProcessingInstruction,Node$2);
43291   function XMLSerializer$1(){}
43292   XMLSerializer$1.prototype.serializeToString = function(node,isHtml,nodeFilter){
43293         return nodeSerializeToString.call(node,isHtml,nodeFilter);
43294   };
43295   Node$2.prototype.toString = nodeSerializeToString;
43296   function nodeSerializeToString(isHtml,nodeFilter){
43297         var buf = [];
43298         var refNode = this.nodeType == 9?this.documentElement:this;
43299         var prefix = refNode.prefix;
43300         var uri = refNode.namespaceURI;
43301         
43302         if(uri && prefix == null){
43303                 //console.log(prefix)
43304                 var prefix = refNode.lookupPrefix(uri);
43305                 if(prefix == null){
43306                         //isHTML = true;
43307                         var visibleNamespaces=[
43308                         {namespace:uri,prefix:null}
43309                         //{namespace:uri,prefix:''}
43310                         ];
43311                 }
43312         }
43313         serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
43314         //console.log('###',this.nodeType,uri,prefix,buf.join(''))
43315         return buf.join('');
43316   }
43317   function needNamespaceDefine(node,isHTML, visibleNamespaces) {
43318         var prefix = node.prefix||'';
43319         var uri = node.namespaceURI;
43320         if (!prefix && !uri){
43321                 return false;
43322         }
43323         if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
43324                 || uri == 'http://www.w3.org/2000/xmlns/'){
43325                 return false;
43326         }
43327         
43328         var i = visibleNamespaces.length; 
43329         //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
43330         while (i--) {
43331                 var ns = visibleNamespaces[i];
43332                 // get namespace prefix
43333                 //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
43334                 if (ns.prefix == prefix){
43335                         return ns.namespace != uri;
43336                 }
43337         }
43338         //console.log(isHTML,uri,prefix=='')
43339         //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
43340         //      return false;
43341         //}
43342         //node.flag = '11111'
43343         //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
43344         return true;
43345   }
43346   function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
43347         if(nodeFilter){
43348                 node = nodeFilter(node);
43349                 if(node){
43350                         if(typeof node == 'string'){
43351                                 buf.push(node);
43352                                 return;
43353                         }
43354                 }else{
43355                         return;
43356                 }
43357                 //buf.sort.apply(attrs, attributeSorter);
43358         }
43359         switch(node.nodeType){
43360         case ELEMENT_NODE:
43361                 if (!visibleNamespaces) visibleNamespaces = [];
43362                 var startVisibleNamespaces = visibleNamespaces.length;
43363                 var attrs = node.attributes;
43364                 var len = attrs.length;
43365                 var child = node.firstChild;
43366                 var nodeName = node.tagName;
43367                 
43368                 isHTML =  (htmlns === node.namespaceURI) ||isHTML; 
43369                 buf.push('<',nodeName);
43370                 
43371                 
43372                 
43373                 for(var i=0;i<len;i++){
43374                         // add namespaces for attributes
43375                         var attr = attrs.item(i);
43376                         if (attr.prefix == 'xmlns') {
43377                                 visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
43378                         }else if(attr.nodeName == 'xmlns'){
43379                                 visibleNamespaces.push({ prefix: '', namespace: attr.value });
43380                         }
43381                 }
43382                 for(var i=0;i<len;i++){
43383                         var attr = attrs.item(i);
43384                         if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
43385                                 var prefix = attr.prefix||'';
43386                                 var uri = attr.namespaceURI;
43387                                 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
43388                                 buf.push(ns, '="' , uri , '"');
43389                                 visibleNamespaces.push({ prefix: prefix, namespace:uri });
43390                         }
43391                         serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
43392                 }
43393                 // add namespace for current node               
43394                 if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
43395                         var prefix = node.prefix||'';
43396                         var uri = node.namespaceURI;
43397                         var ns = prefix ? ' xmlns:' + prefix : " xmlns";
43398                         buf.push(ns, '="' , uri , '"');
43399                         visibleNamespaces.push({ prefix: prefix, namespace:uri });
43400                 }
43401                 
43402                 if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
43403                         buf.push('>');
43404                         //if is cdata child node
43405                         if(isHTML && /^script$/i.test(nodeName)){
43406                                 while(child){
43407                                         if(child.data){
43408                                                 buf.push(child.data);
43409                                         }else{
43410                                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
43411                                         }
43412                                         child = child.nextSibling;
43413                                 }
43414                         }else
43415                         {
43416                                 while(child){
43417                                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
43418                                         child = child.nextSibling;
43419                                 }
43420                         }
43421                         buf.push('</',nodeName,'>');
43422                 }else{
43423                         buf.push('/>');
43424                 }
43425                 // remove added visible namespaces
43426                 //visibleNamespaces.length = startVisibleNamespaces;
43427                 return;
43428         case DOCUMENT_NODE:
43429         case DOCUMENT_FRAGMENT_NODE:
43430                 var child = node.firstChild;
43431                 while(child){
43432                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
43433                         child = child.nextSibling;
43434                 }
43435                 return;
43436         case ATTRIBUTE_NODE:
43437                 return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
43438         case TEXT_NODE:
43439                 return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
43440         case CDATA_SECTION_NODE:
43441                 return buf.push( '<![CDATA[',node.data,']]>');
43442         case COMMENT_NODE:
43443                 return buf.push( "<!--",node.data,"-->");
43444         case DOCUMENT_TYPE_NODE:
43445                 var pubid = node.publicId;
43446                 var sysid = node.systemId;
43447                 buf.push('<!DOCTYPE ',node.name);
43448                 if(pubid){
43449                         buf.push(' PUBLIC "',pubid);
43450                         if (sysid && sysid!='.') {
43451                                 buf.push( '" "',sysid);
43452                         }
43453                         buf.push('">');
43454                 }else if(sysid && sysid!='.'){
43455                         buf.push(' SYSTEM "',sysid,'">');
43456                 }else{
43457                         var sub = node.internalSubset;
43458                         if(sub){
43459                                 buf.push(" [",sub,"]");
43460                         }
43461                         buf.push(">");
43462                 }
43463                 return;
43464         case PROCESSING_INSTRUCTION_NODE:
43465                 return buf.push( "<?",node.target," ",node.data,"?>");
43466         case ENTITY_REFERENCE_NODE:
43467                 return buf.push( '&',node.nodeName,';');
43468         //case ENTITY_NODE:
43469         //case NOTATION_NODE:
43470         default:
43471                 buf.push('??',node.nodeName);
43472         }
43473   }
43474   function importNode(doc,node,deep){
43475         var node2;
43476         switch (node.nodeType) {
43477         case ELEMENT_NODE:
43478                 node2 = node.cloneNode(false);
43479                 node2.ownerDocument = doc;
43480                 //var attrs = node2.attributes;
43481                 //var len = attrs.length;
43482                 //for(var i=0;i<len;i++){
43483                         //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
43484                 //}
43485         case DOCUMENT_FRAGMENT_NODE:
43486                 break;
43487         case ATTRIBUTE_NODE:
43488                 deep = true;
43489                 break;
43490         //case ENTITY_REFERENCE_NODE:
43491         //case PROCESSING_INSTRUCTION_NODE:
43492         ////case TEXT_NODE:
43493         //case CDATA_SECTION_NODE:
43494         //case COMMENT_NODE:
43495         //      deep = false;
43496         //      break;
43497         //case DOCUMENT_NODE:
43498         //case DOCUMENT_TYPE_NODE:
43499         //cannot be imported.
43500         //case ENTITY_NODE:
43501         //case NOTATION_NODE:
43502         //can not hit in level3
43503         //default:throw e;
43504         }
43505         if(!node2){
43506                 node2 = node.cloneNode(false);//false
43507         }
43508         node2.ownerDocument = doc;
43509         node2.parentNode = null;
43510         if(deep){
43511                 var child = node.firstChild;
43512                 while(child){
43513                         node2.appendChild(importNode(doc,child,deep));
43514                         child = child.nextSibling;
43515                 }
43516         }
43517         return node2;
43518   }
43519   //
43520   //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
43521   //                                    attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
43522   function cloneNode(doc,node,deep){
43523         var node2 = new node.constructor();
43524         for(var n in node){
43525                 var v = node[n];
43526                 if(typeof v != 'object' ){
43527                         if(v != node2[n]){
43528                                 node2[n] = v;
43529                         }
43530                 }
43531         }
43532         if(node.childNodes){
43533                 node2.childNodes = new NodeList();
43534         }
43535         node2.ownerDocument = doc;
43536         switch (node2.nodeType) {
43537         case ELEMENT_NODE:
43538                 var attrs       = node.attributes;
43539                 var attrs2      = node2.attributes = new NamedNodeMap();
43540                 var len = attrs.length;
43541                 attrs2._ownerElement = node2;
43542                 for(var i=0;i<len;i++){
43543                         node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
43544                 }
43545                 break;
43546         case ATTRIBUTE_NODE:
43547                 deep = true;
43548         }
43549         if(deep){
43550                 var child = node.firstChild;
43551                 while(child){
43552                         node2.appendChild(cloneNode(doc,child,deep));
43553                         child = child.nextSibling;
43554                 }
43555         }
43556         return node2;
43557   }
43558
43559   function __set__(object,key,value){
43560         object[key] = value;
43561   }
43562   //do dynamic
43563   try{
43564         if(Object.defineProperty){
43565                 Object.defineProperty(LiveNodeList.prototype,'length',{
43566                         get:function(){
43567                                 _updateLiveList(this);
43568                                 return this.$$length;
43569                         }
43570                 });
43571                 Object.defineProperty(Node$2.prototype,'textContent',{
43572                         get:function(){
43573                                 return getTextContent(this);
43574                         },
43575                         set:function(data){
43576                                 switch(this.nodeType){
43577                                 case ELEMENT_NODE:
43578                                 case DOCUMENT_FRAGMENT_NODE:
43579                                         while(this.firstChild){
43580                                                 this.removeChild(this.firstChild);
43581                                         }
43582                                         if(data || String(data)){
43583                                                 this.appendChild(this.ownerDocument.createTextNode(data));
43584                                         }
43585                                         break;
43586                                 default:
43587                                         //TODO:
43588                                         this.data = data;
43589                                         this.value = data;
43590                                         this.nodeValue = data;
43591                                 }
43592                         }
43593                 });
43594                 
43595                 function getTextContent(node){
43596                         switch(node.nodeType){
43597                         case ELEMENT_NODE:
43598                         case DOCUMENT_FRAGMENT_NODE:
43599                                 var buf = [];
43600                                 node = node.firstChild;
43601                                 while(node){
43602                                         if(node.nodeType!==7 && node.nodeType !==8){
43603                                                 buf.push(getTextContent(node));
43604                                         }
43605                                         node = node.nextSibling;
43606                                 }
43607                                 return buf.join('');
43608                         default:
43609                                 return node.nodeValue;
43610                         }
43611                 }
43612                 __set__ = function(object,key,value){
43613                         //console.log(value)
43614                         object['$$'+key] = value;
43615                 };
43616         }
43617   }catch(e){//ie8
43618   }
43619
43620   //if(typeof require == 'function'){
43621         var DOMImplementation_1 = DOMImplementation;
43622         var XMLSerializer_1 = XMLSerializer$1;
43623   //}
43624
43625   var dom = {
43626         DOMImplementation: DOMImplementation_1,
43627         XMLSerializer: XMLSerializer_1
43628   };
43629
43630   var domParser = createCommonjsModule(function (module, exports) {
43631   function DOMParser(options){
43632         this.options = options ||{locator:{}};
43633         
43634   }
43635   DOMParser.prototype.parseFromString = function(source,mimeType){
43636         var options = this.options;
43637         var sax$$1 =  new XMLReader();
43638         var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
43639         var errorHandler = options.errorHandler;
43640         var locator = options.locator;
43641         var defaultNSMap = options.xmlns||{};
43642         var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"};
43643         if(locator){
43644                 domBuilder.setDocumentLocator(locator);
43645         }
43646         
43647         sax$$1.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
43648         sax$$1.domBuilder = options.domBuilder || domBuilder;
43649         if(/\/x?html?$/.test(mimeType)){
43650                 entityMap.nbsp = '\xa0';
43651                 entityMap.copy = '\xa9';
43652                 defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
43653         }
43654         defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
43655         if(source){
43656                 sax$$1.parse(source,defaultNSMap,entityMap);
43657         }else{
43658                 sax$$1.errorHandler.error("invalid doc source");
43659         }
43660         return domBuilder.doc;
43661   };
43662   function buildErrorHandler(errorImpl,domBuilder,locator){
43663         if(!errorImpl){
43664                 if(domBuilder instanceof DOMHandler){
43665                         return domBuilder;
43666                 }
43667                 errorImpl = domBuilder ;
43668         }
43669         var errorHandler = {};
43670         var isCallback = errorImpl instanceof Function;
43671         locator = locator||{};
43672         function build(key){
43673                 var fn = errorImpl[key];
43674                 if(!fn && isCallback){
43675                         fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl;
43676                 }
43677                 errorHandler[key] = fn && function(msg){
43678                         fn('[xmldom '+key+']\t'+msg+_locator(locator));
43679                 }||function(){};
43680         }
43681         build('warning');
43682         build('error');
43683         build('fatalError');
43684         return errorHandler;
43685   }
43686
43687   //console.log('#\n\n\n\n\n\n\n####')
43688   /**
43689    * +ContentHandler+ErrorHandler
43690    * +LexicalHandler+EntityResolver2
43691    * -DeclHandler-DTDHandler 
43692    * 
43693    * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
43694    * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
43695    * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
43696    */
43697   function DOMHandler() {
43698       this.cdata = false;
43699   }
43700   function position(locator,node){
43701         node.lineNumber = locator.lineNumber;
43702         node.columnNumber = locator.columnNumber;
43703   }
43704   /**
43705    * @see org.xml.sax.ContentHandler#startDocument
43706    * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
43707    */ 
43708   DOMHandler.prototype = {
43709         startDocument : function() {
43710         this.doc = new DOMImplementation().createDocument(null, null, null);
43711         if (this.locator) {
43712                 this.doc.documentURI = this.locator.systemId;
43713         }
43714         },
43715         startElement:function(namespaceURI, localName, qName, attrs) {
43716                 var doc = this.doc;
43717             var el = doc.createElementNS(namespaceURI, qName||localName);
43718             var len = attrs.length;
43719             appendElement(this, el);
43720             this.currentElement = el;
43721             
43722                 this.locator && position(this.locator,el);
43723             for (var i = 0 ; i < len; i++) {
43724                 var namespaceURI = attrs.getURI(i);
43725                 var value = attrs.getValue(i);
43726                 var qName = attrs.getQName(i);
43727                         var attr = doc.createAttributeNS(namespaceURI, qName);
43728                         this.locator &&position(attrs.getLocator(i),attr);
43729                         attr.value = attr.nodeValue = value;
43730                         el.setAttributeNode(attr);
43731             }
43732         },
43733         endElement:function(namespaceURI, localName, qName) {
43734                 var current = this.currentElement;
43735                 var tagName = current.tagName;
43736                 this.currentElement = current.parentNode;
43737         },
43738         startPrefixMapping:function(prefix, uri) {
43739         },
43740         endPrefixMapping:function(prefix) {
43741         },
43742         processingInstruction:function(target, data) {
43743             var ins = this.doc.createProcessingInstruction(target, data);
43744             this.locator && position(this.locator,ins);
43745             appendElement(this, ins);
43746         },
43747         ignorableWhitespace:function(ch, start, length) {
43748         },
43749         characters:function(chars, start, length) {
43750                 chars = _toString.apply(this,arguments);
43751                 //console.log(chars)
43752                 if(chars){
43753                         if (this.cdata) {
43754                                 var charNode = this.doc.createCDATASection(chars);
43755                         } else {
43756                                 var charNode = this.doc.createTextNode(chars);
43757                         }
43758                         if(this.currentElement){
43759                                 this.currentElement.appendChild(charNode);
43760                         }else if(/^\s*$/.test(chars)){
43761                                 this.doc.appendChild(charNode);
43762                                 //process xml
43763                         }
43764                         this.locator && position(this.locator,charNode);
43765                 }
43766         },
43767         skippedEntity:function(name) {
43768         },
43769         endDocument:function() {
43770                 this.doc.normalize();
43771         },
43772         setDocumentLocator:function (locator) {
43773             if(this.locator = locator){// && !('lineNumber' in locator)){
43774                 locator.lineNumber = 0;
43775             }
43776         },
43777         //LexicalHandler
43778         comment:function(chars, start, length) {
43779                 chars = _toString.apply(this,arguments);
43780             var comm = this.doc.createComment(chars);
43781             this.locator && position(this.locator,comm);
43782             appendElement(this, comm);
43783         },
43784         
43785         startCDATA:function() {
43786             //used in characters() methods
43787             this.cdata = true;
43788         },
43789         endCDATA:function() {
43790             this.cdata = false;
43791         },
43792         
43793         startDTD:function(name, publicId, systemId) {
43794                 var impl = this.doc.implementation;
43795             if (impl && impl.createDocumentType) {
43796                 var dt = impl.createDocumentType(name, publicId, systemId);
43797                 this.locator && position(this.locator,dt);
43798                 appendElement(this, dt);
43799             }
43800         },
43801         /**
43802          * @see org.xml.sax.ErrorHandler
43803          * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
43804          */
43805         warning:function(error) {
43806                 console.warn('[xmldom warning]\t'+error,_locator(this.locator));
43807         },
43808         error:function(error) {
43809                 console.error('[xmldom error]\t'+error,_locator(this.locator));
43810         },
43811         fatalError:function(error) {
43812                 console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
43813             throw error;
43814         }
43815   };
43816   function _locator(l){
43817         if(l){
43818                 return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
43819         }
43820   }
43821   function _toString(chars,start,length){
43822         if(typeof chars == 'string'){
43823                 return chars.substr(start,length)
43824         }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
43825                 if(chars.length >= start+length || start){
43826                         return new java.lang.String(chars,start,length)+'';
43827                 }
43828                 return chars;
43829         }
43830   }
43831
43832   /*
43833    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
43834    * used method of org.xml.sax.ext.LexicalHandler:
43835    *  #comment(chars, start, length)
43836    *  #startCDATA()
43837    *  #endCDATA()
43838    *  #startDTD(name, publicId, systemId)
43839    *
43840    *
43841    * IGNORED method of org.xml.sax.ext.LexicalHandler:
43842    *  #endDTD()
43843    *  #startEntity(name)
43844    *  #endEntity(name)
43845    *
43846    *
43847    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
43848    * IGNORED method of org.xml.sax.ext.DeclHandler
43849    *    #attributeDecl(eName, aName, type, mode, value)
43850    *  #elementDecl(name, model)
43851    *  #externalEntityDecl(name, publicId, systemId)
43852    *  #internalEntityDecl(name, value)
43853    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
43854    * IGNORED method of org.xml.sax.EntityResolver2
43855    *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
43856    *  #resolveEntity(publicId, systemId)
43857    *  #getExternalSubset(name, baseURI)
43858    * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
43859    * IGNORED method of org.xml.sax.DTDHandler
43860    *  #notationDecl(name, publicId, systemId) {};
43861    *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
43862    */
43863   "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
43864         DOMHandler.prototype[key] = function(){return null};
43865   });
43866
43867   /* 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 */
43868   function appendElement (hander,node) {
43869       if (!hander.currentElement) {
43870           hander.doc.appendChild(node);
43871       } else {
43872           hander.currentElement.appendChild(node);
43873       }
43874   }//appendChild and setAttributeNS are preformance key
43875
43876   //if(typeof require == 'function'){
43877         var XMLReader = sax.XMLReader;
43878         var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation;
43879         exports.XMLSerializer = dom.XMLSerializer ;
43880         exports.DOMParser = DOMParser;
43881   //}
43882   });
43883   var domParser_1 = domParser.DOMImplementation;
43884   var domParser_2 = domParser.XMLSerializer;
43885   var domParser_3 = domParser.DOMParser;
43886
43887   var togeojson = createCommonjsModule(function (module, exports) {
43888   var toGeoJSON = (function() {
43889
43890       var removeSpace = /\s*/g,
43891           trimSpace = /^\s*|\s*$/g,
43892           splitSpace = /\s+/;
43893       // generate a short, numeric hash of a string
43894       function okhash(x) {
43895           if (!x || !x.length) return 0;
43896           for (var i = 0, h = 0; i < x.length; i++) {
43897               h = ((h << 5) - h) + x.charCodeAt(i) | 0;
43898           } return h;
43899       }
43900       // all Y children of X
43901       function get(x, y) { return x.getElementsByTagName(y); }
43902       function attr(x, y) { return x.getAttribute(y); }
43903       function attrf(x, y) { return parseFloat(attr(x, y)); }
43904       // one Y child of X, if any, otherwise null
43905       function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
43906       // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
43907       function norm(el) { if (el.normalize) { el.normalize(); } return el; }
43908       // cast array x into numbers
43909       function numarray(x) {
43910           for (var j = 0, o = []; j < x.length; j++) { o[j] = parseFloat(x[j]); }
43911           return o;
43912       }
43913       // get the content of a text node, if any
43914       function nodeVal(x) {
43915           if (x) { norm(x); }
43916           return (x && x.textContent) || '';
43917       }
43918       // get the contents of multiple text nodes, if present
43919       function getMulti(x, ys) {
43920           var o = {}, n, k;
43921           for (k = 0; k < ys.length; k++) {
43922               n = get1(x, ys[k]);
43923               if (n) o[ys[k]] = nodeVal(n);
43924           }
43925           return o;
43926       }
43927       // add properties of Y to X, overwriting if present in both
43928       function extend(x, y) { for (var k in y) x[k] = y[k]; }
43929       // get one coordinate from a coordinate array, if any
43930       function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
43931       // get all coordinates from a coordinate array as [[],[]]
43932       function coord(v) {
43933           var coords = v.replace(trimSpace, '').split(splitSpace),
43934               o = [];
43935           for (var i = 0; i < coords.length; i++) {
43936               o.push(coord1(coords[i]));
43937           }
43938           return o;
43939       }
43940       function coordPair(x) {
43941           var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
43942               ele = get1(x, 'ele'),
43943               // handle namespaced attribute in browser
43944               heartRate = get1(x, 'gpxtpx:hr') || get1(x, 'hr'),
43945               time = get1(x, 'time'),
43946               e;
43947           if (ele) {
43948               e = parseFloat(nodeVal(ele));
43949               if (!isNaN(e)) {
43950                   ll.push(e);
43951               }
43952           }
43953           return {
43954               coordinates: ll,
43955               time: time ? nodeVal(time) : null,
43956               heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
43957           };
43958       }
43959
43960       // create a new feature collection parent object
43961       function fc() {
43962           return {
43963               type: 'FeatureCollection',
43964               features: []
43965           };
43966       }
43967
43968       var serializer;
43969       if (typeof XMLSerializer !== 'undefined') {
43970           /* istanbul ignore next */
43971           serializer = new XMLSerializer();
43972       // only require xmldom in a node environment
43973       } else if ('object' === 'object' && typeof process === 'object' && !process.browser) {
43974           serializer = new (domParser.XMLSerializer)();
43975       }
43976       function xml2str(str) {
43977           // IE9 will create a new XMLSerializer but it'll crash immediately.
43978           // This line is ignored because we don't run coverage tests in IE9
43979           /* istanbul ignore next */
43980           if (str.xml !== undefined) return str.xml;
43981           return serializer.serializeToString(str);
43982       }
43983
43984       var t = {
43985           kml: function(doc) {
43986
43987               var gj = fc(),
43988                   // styleindex keeps track of hashed styles in order to match features
43989                   styleIndex = {}, styleByHash = {},
43990                   // stylemapindex keeps track of style maps to expose in properties
43991                   styleMapIndex = {},
43992                   // atomic geospatial types supported by KML - MultiGeometry is
43993                   // handled separately
43994                   geotypes = ['Polygon', 'LineString', 'Point', 'Track', 'gx:Track'],
43995                   // all root placemarks in the file
43996                   placemarks = get(doc, 'Placemark'),
43997                   styles = get(doc, 'Style'),
43998                   styleMaps = get(doc, 'StyleMap');
43999
44000               for (var k = 0; k < styles.length; k++) {
44001                   var hash = okhash(xml2str(styles[k])).toString(16);
44002                   styleIndex['#' + attr(styles[k], 'id')] = hash;
44003                   styleByHash[hash] = styles[k];
44004               }
44005               for (var l = 0; l < styleMaps.length; l++) {
44006                   styleIndex['#' + attr(styleMaps[l], 'id')] = okhash(xml2str(styleMaps[l])).toString(16);
44007                   var pairs = get(styleMaps[l], 'Pair');
44008                   var pairsMap = {};
44009                   for (var m = 0; m < pairs.length; m++) {
44010                       pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
44011                   }
44012                   styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
44013
44014               }
44015               for (var j = 0; j < placemarks.length; j++) {
44016                   gj.features = gj.features.concat(getPlacemark(placemarks[j]));
44017               }
44018               function kmlColor(v) {
44019                   var color, opacity;
44020                   v = v || '';
44021                   if (v.substr(0, 1) === '#') { v = v.substr(1); }
44022                   if (v.length === 6 || v.length === 3) { color = v; }
44023                   if (v.length === 8) {
44024                       opacity = parseInt(v.substr(0, 2), 16) / 255;
44025                       color = '#' + v.substr(6, 2) +
44026                           v.substr(4, 2) +
44027                           v.substr(2, 2);
44028                   }
44029                   return [color, isNaN(opacity) ? undefined : opacity];
44030               }
44031               function gxCoord(v) { return numarray(v.split(' ')); }
44032               function gxCoords(root) {
44033                   var elems = get(root, 'coord', 'gx'), coords = [], times = [];
44034                   if (elems.length === 0) elems = get(root, 'gx:coord');
44035                   for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
44036                   var timeElems = get(root, 'when');
44037                   for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
44038                   return {
44039                       coords: coords,
44040                       times: times
44041                   };
44042               }
44043               function getGeometry(root) {
44044                   var geomNode, geomNodes, i, j, k, geoms = [], coordTimes = [];
44045                   if (get1(root, 'MultiGeometry')) { return getGeometry(get1(root, 'MultiGeometry')); }
44046                   if (get1(root, 'MultiTrack')) { return getGeometry(get1(root, 'MultiTrack')); }
44047                   if (get1(root, 'gx:MultiTrack')) { return getGeometry(get1(root, 'gx:MultiTrack')); }
44048                   for (i = 0; i < geotypes.length; i++) {
44049                       geomNodes = get(root, geotypes[i]);
44050                       if (geomNodes) {
44051                           for (j = 0; j < geomNodes.length; j++) {
44052                               geomNode = geomNodes[j];
44053                               if (geotypes[i] === 'Point') {
44054                                   geoms.push({
44055                                       type: 'Point',
44056                                       coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
44057                                   });
44058                               } else if (geotypes[i] === 'LineString') {
44059                                   geoms.push({
44060                                       type: 'LineString',
44061                                       coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
44062                                   });
44063                               } else if (geotypes[i] === 'Polygon') {
44064                                   var rings = get(geomNode, 'LinearRing'),
44065                                       coords = [];
44066                                   for (k = 0; k < rings.length; k++) {
44067                                       coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
44068                                   }
44069                                   geoms.push({
44070                                       type: 'Polygon',
44071                                       coordinates: coords
44072                                   });
44073                               } else if (geotypes[i] === 'Track' ||
44074                                   geotypes[i] === 'gx:Track') {
44075                                   var track = gxCoords(geomNode);
44076                                   geoms.push({
44077                                       type: 'LineString',
44078                                       coordinates: track.coords
44079                                   });
44080                                   if (track.times.length) coordTimes.push(track.times);
44081                               }
44082                           }
44083                       }
44084                   }
44085                   return {
44086                       geoms: geoms,
44087                       coordTimes: coordTimes
44088                   };
44089               }
44090               function getPlacemark(root) {
44091                   var geomsAndTimes = getGeometry(root), i, properties = {},
44092                       name = nodeVal(get1(root, 'name')),
44093                       address = nodeVal(get1(root, 'address')),
44094                       styleUrl = nodeVal(get1(root, 'styleUrl')),
44095                       description = nodeVal(get1(root, 'description')),
44096                       timeSpan = get1(root, 'TimeSpan'),
44097                       timeStamp = get1(root, 'TimeStamp'),
44098                       extendedData = get1(root, 'ExtendedData'),
44099                       lineStyle = get1(root, 'LineStyle'),
44100                       polyStyle = get1(root, 'PolyStyle'),
44101                       visibility = get1(root, 'visibility');
44102
44103                   if (!geomsAndTimes.geoms.length) return [];
44104                   if (name) properties.name = name;
44105                   if (address) properties.address = address;
44106                   if (styleUrl) {
44107                       if (styleUrl[0] !== '#') {
44108                           styleUrl = '#' + styleUrl;
44109                       }
44110
44111                       properties.styleUrl = styleUrl;
44112                       if (styleIndex[styleUrl]) {
44113                           properties.styleHash = styleIndex[styleUrl];
44114                       }
44115                       if (styleMapIndex[styleUrl]) {
44116                           properties.styleMapHash = styleMapIndex[styleUrl];
44117                           properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
44118                       }
44119                       // Try to populate the lineStyle or polyStyle since we got the style hash
44120                       var style = styleByHash[properties.styleHash];
44121                       if (style) {
44122                           if (!lineStyle) lineStyle = get1(style, 'LineStyle');
44123                           if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
44124                       }
44125                   }
44126                   if (description) properties.description = description;
44127                   if (timeSpan) {
44128                       var begin = nodeVal(get1(timeSpan, 'begin'));
44129                       var end = nodeVal(get1(timeSpan, 'end'));
44130                       properties.timespan = { begin: begin, end: end };
44131                   }
44132                   if (timeStamp) {
44133                       properties.timestamp = nodeVal(get1(timeStamp, 'when'));
44134                   }
44135                   if (lineStyle) {
44136                       var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
44137                           color = linestyles[0],
44138                           opacity = linestyles[1],
44139                           width = parseFloat(nodeVal(get1(lineStyle, 'width')));
44140                       if (color) properties.stroke = color;
44141                       if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
44142                       if (!isNaN(width)) properties['stroke-width'] = width;
44143                   }
44144                   if (polyStyle) {
44145                       var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
44146                           pcolor = polystyles[0],
44147                           popacity = polystyles[1],
44148                           fill = nodeVal(get1(polyStyle, 'fill')),
44149                           outline = nodeVal(get1(polyStyle, 'outline'));
44150                       if (pcolor) properties.fill = pcolor;
44151                       if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
44152                       if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
44153                       if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
44154                   }
44155                   if (extendedData) {
44156                       var datas = get(extendedData, 'Data'),
44157                           simpleDatas = get(extendedData, 'SimpleData');
44158
44159                       for (i = 0; i < datas.length; i++) {
44160                           properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
44161                       }
44162                       for (i = 0; i < simpleDatas.length; i++) {
44163                           properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
44164                       }
44165                   }
44166                   if (visibility) {
44167                       properties.visibility = nodeVal(visibility);
44168                   }
44169                   if (geomsAndTimes.coordTimes.length) {
44170                       properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
44171                           geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
44172                   }
44173                   var feature = {
44174                       type: 'Feature',
44175                       geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
44176                           type: 'GeometryCollection',
44177                           geometries: geomsAndTimes.geoms
44178                       },
44179                       properties: properties
44180                   };
44181                   if (attr(root, 'id')) feature.id = attr(root, 'id');
44182                   return [feature];
44183               }
44184               return gj;
44185           },
44186           gpx: function(doc) {
44187               var i,
44188                   tracks = get(doc, 'trk'),
44189                   routes = get(doc, 'rte'),
44190                   waypoints = get(doc, 'wpt'),
44191                   // a feature collection
44192                   gj = fc(),
44193                   feature;
44194               for (i = 0; i < tracks.length; i++) {
44195                   feature = getTrack(tracks[i]);
44196                   if (feature) gj.features.push(feature);
44197               }
44198               for (i = 0; i < routes.length; i++) {
44199                   feature = getRoute(routes[i]);
44200                   if (feature) gj.features.push(feature);
44201               }
44202               for (i = 0; i < waypoints.length; i++) {
44203                   gj.features.push(getPoint(waypoints[i]));
44204               }
44205               function getPoints(node, pointname) {
44206                   var pts = get(node, pointname),
44207                       line = [],
44208                       times = [],
44209                       heartRates = [],
44210                       l = pts.length;
44211                   if (l < 2) return {};  // Invalid line in GeoJSON
44212                   for (var i = 0; i < l; i++) {
44213                       var c = coordPair(pts[i]);
44214                       line.push(c.coordinates);
44215                       if (c.time) times.push(c.time);
44216                       if (c.heartRate) heartRates.push(c.heartRate);
44217                   }
44218                   return {
44219                       line: line,
44220                       times: times,
44221                       heartRates: heartRates
44222                   };
44223               }
44224               function getTrack(node) {
44225                   var segments = get(node, 'trkseg'),
44226                       track = [],
44227                       times = [],
44228                       heartRates = [],
44229                       line;
44230                   for (var i = 0; i < segments.length; i++) {
44231                       line = getPoints(segments[i], 'trkpt');
44232                       if (line) {
44233                           if (line.line) track.push(line.line);
44234                           if (line.times && line.times.length) times.push(line.times);
44235                           if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
44236                       }
44237                   }
44238                   if (track.length === 0) return;
44239                   var properties = getProperties(node);
44240                   extend(properties, getLineStyle(get1(node, 'extensions')));
44241                   if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
44242                   if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
44243                   return {
44244                       type: 'Feature',
44245                       properties: properties,
44246                       geometry: {
44247                           type: track.length === 1 ? 'LineString' : 'MultiLineString',
44248                           coordinates: track.length === 1 ? track[0] : track
44249                       }
44250                   };
44251               }
44252               function getRoute(node) {
44253                   var line = getPoints(node, 'rtept');
44254                   if (!line.line) return;
44255                   var prop = getProperties(node);
44256                   extend(prop, getLineStyle(get1(node, 'extensions')));
44257                   var routeObj = {
44258                       type: 'Feature',
44259                       properties: prop,
44260                       geometry: {
44261                           type: 'LineString',
44262                           coordinates: line.line
44263                       }
44264                   };
44265                   return routeObj;
44266               }
44267               function getPoint(node) {
44268                   var prop = getProperties(node);
44269                   extend(prop, getMulti(node, ['sym']));
44270                   return {
44271                       type: 'Feature',
44272                       properties: prop,
44273                       geometry: {
44274                           type: 'Point',
44275                           coordinates: coordPair(node).coordinates
44276                       }
44277                   };
44278               }
44279               function getLineStyle(extensions) {
44280                   var style = {};
44281                   if (extensions) {
44282                       var lineStyle = get1(extensions, 'line');
44283                       if (lineStyle) {
44284                           var color = nodeVal(get1(lineStyle, 'color')),
44285                               opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
44286                               width = parseFloat(nodeVal(get1(lineStyle, 'width')));
44287                           if (color) style.stroke = color;
44288                           if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
44289                           // GPX width is in mm, convert to px with 96 px per inch
44290                           if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
44291                       }
44292                   }
44293                   return style;
44294               }
44295               function getProperties(node) {
44296                   var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
44297                       links = get(node, 'link');
44298                   if (links.length) prop.links = [];
44299                   for (var i = 0, link; i < links.length; i++) {
44300                       link = { href: attr(links[i], 'href') };
44301                       extend(link, getMulti(links[i], ['text', 'type']));
44302                       prop.links.push(link);
44303                   }
44304                   return prop;
44305               }
44306               return gj;
44307           }
44308       };
44309       return t;
44310   })();
44311
44312   module.exports = toGeoJSON;
44313   });
44314
44315   var _initialized = false;
44316   var _enabled = false;
44317   var _geojson;
44318
44319
44320   function svgGpx$$1(projection$$1, context, dispatch) {
44321       var _showLabels = true;
44322       var detected = utilDetect();
44323       var layer;
44324       var _src;
44325
44326
44327       function init() {
44328           if (_initialized) return;  // run once
44329
44330           _geojson = {};
44331           _enabled = true;
44332
44333           function over() {
44334               event.stopPropagation();
44335               event.preventDefault();
44336               event.dataTransfer.dropEffect = 'copy';
44337           }
44338
44339           d3_select('body')
44340               .attr('dropzone', 'copy')
44341               .on('drop.localgpx', function() {
44342                   event.stopPropagation();
44343                   event.preventDefault();
44344                   if (!detected.filedrop) return;
44345                   drawGpx.files(event.dataTransfer.files);
44346               })
44347               .on('dragenter.localgpx', over)
44348               .on('dragexit.localgpx', over)
44349               .on('dragover.localgpx', over);
44350
44351           _initialized = true;
44352       }
44353
44354
44355       function drawGpx(selection$$1) {
44356           var getPath = svgPath(projection$$1).geojson;
44357
44358           layer = selection$$1.selectAll('.layer-gpx')
44359               .data(_enabled ? [0] : []);
44360
44361           layer.exit()
44362               .remove();
44363
44364           layer = layer.enter()
44365               .append('g')
44366               .attr('class', 'layer-gpx')
44367               .merge(layer);
44368
44369
44370           var paths = layer
44371               .selectAll('path')
44372               .data([_geojson]);
44373
44374           paths.exit()
44375               .remove();
44376
44377           paths = paths.enter()
44378               .append('path')
44379               .attr('class', 'gpx')
44380               .merge(paths);
44381
44382           paths
44383               .attr('d', getPath);
44384
44385
44386           var labelData = _showLabels && _geojson.features ? _geojson.features : [];
44387           labelData = labelData.filter(getPath);
44388
44389           layer
44390               .call(drawLabels, 'gpxlabel-halo', labelData)
44391               .call(drawLabels, 'gpxlabel', labelData);
44392
44393
44394           function drawLabels(selection$$1, textClass, data) {
44395               var labels = selection$$1.selectAll('text.' + textClass)
44396                   .data(data);
44397
44398               // exit
44399               labels.exit()
44400                   .remove();
44401
44402               // enter/update
44403               labels = labels.enter()
44404                   .append('text')
44405                   .attr('class', textClass)
44406                   .merge(labels)
44407                   .text(function(d) {
44408                       if (d.properties) {
44409                           return d.properties.desc || d.properties.name;
44410                       }
44411                       return null;
44412                   })
44413                   .attr('x', function(d) {
44414                       var centroid = getPath.centroid(d);
44415                       return centroid[0] + 11;
44416                   })
44417                   .attr('y', function(d) {
44418                       var centroid = getPath.centroid(d);
44419                       return centroid[1];
44420                   });
44421           }
44422       }
44423
44424
44425       function toDom(x) {
44426           return (new DOMParser()).parseFromString(x, 'text/xml');
44427       }
44428
44429
44430       function getExtension(fileName) {
44431           if (isUndefined(fileName)) {
44432               return '';
44433           }
44434
44435           var lastDotIndex = fileName.lastIndexOf('.');
44436           if (lastDotIndex < 0) {
44437               return '';
44438           }
44439
44440           return fileName.substr(lastDotIndex);
44441       }
44442
44443
44444       function parseSaveAndZoom(extension, data) {
44445           switch (extension) {
44446               default:
44447                   drawGpx.geojson(togeojson.gpx(toDom(data))).fitZoom();
44448                   break;
44449               case '.kml':
44450                   drawGpx.geojson(togeojson.kml(toDom(data))).fitZoom();
44451                   break;
44452               case '.geojson':
44453               case '.json':
44454                   drawGpx.geojson(JSON.parse(data)).fitZoom();
44455                   break;
44456           }
44457       }
44458
44459
44460       drawGpx.showLabels = function(_) {
44461           if (!arguments.length) return _showLabels;
44462           _showLabels = _;
44463           return this;
44464       };
44465
44466
44467       drawGpx.enabled = function(_) {
44468           if (!arguments.length) return _enabled;
44469           _enabled = _;
44470           dispatch.call('change');
44471           return this;
44472       };
44473
44474
44475       drawGpx.hasGpx = function() {
44476           return (!(isEmpty(_geojson) || isEmpty(_geojson.features)));
44477       };
44478
44479
44480       drawGpx.geojson = function(gj) {
44481           if (!arguments.length) return _geojson;
44482           if (isEmpty(gj) || isEmpty(gj.features)) return this;
44483           _geojson = gj;
44484           dispatch.call('change');
44485           return this;
44486       };
44487
44488
44489       drawGpx.url = function(url) {
44490           d3_text(url, function(err, data) {
44491               if (!err) {
44492                   _src = url;
44493                   var extension = getExtension(url);
44494                   parseSaveAndZoom(extension, data);
44495               }
44496           });
44497           return this;
44498       };
44499
44500
44501       drawGpx.files = function(fileList) {
44502           if (!fileList.length) return this;
44503           var f = fileList[0],
44504               reader = new FileReader();
44505
44506           reader.onload = (function(file) {
44507               _src = file.name;
44508               var extension = getExtension(file.name);
44509               return function (e) {
44510                   parseSaveAndZoom(extension, e.target.result);
44511               };
44512           })(f);
44513
44514           reader.readAsText(f);
44515           return this;
44516       };
44517
44518
44519       drawGpx.getSrc = function () {
44520           return _src;
44521       };
44522
44523
44524       drawGpx.fitZoom = function() {
44525           if (!this.hasGpx()) return this;
44526
44527           var map = context.map();
44528           var viewport = map.trimmedExtent().polygon();
44529           var coords = reduce(_geojson.features, function(coords, feature) {
44530               var c = feature.geometry.coordinates;
44531
44532               /* eslint-disable no-fallthrough */
44533               switch (feature.geometry.type) {
44534                   case 'Point':
44535                       c = [c];
44536                   case 'MultiPoint':
44537                   case 'LineString':
44538                       break;
44539
44540                   case 'MultiPolygon':
44541                       c = flatten(c);
44542                   case 'Polygon':
44543                   case 'MultiLineString':
44544                       c = flatten(c);
44545                       break;
44546               }
44547               /* eslint-enable no-fallthrough */
44548
44549               return union(coords, c);
44550           }, []);
44551
44552           if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
44553               var extent = geoExtent$$1(d3_geoBounds({ type: 'LineString', coordinates: coords }));
44554               map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
44555           }
44556
44557           return this;
44558       };
44559
44560
44561       init();
44562       return drawGpx;
44563   }
44564
44565   function svgIcon(name, svgklass, useklass) {
44566       return function drawIcon(selection) {
44567           selection.selectAll('svg')
44568               .data([0])
44569               .enter()
44570               .append('svg')
44571               .attr('class', 'icon ' + (svgklass || ''))
44572               .append('use')
44573               .attr('xlink:href', name)
44574               .attr('class', useklass);
44575       };
44576   }
44577
44578   function svgLabels(projection$$1, context) {
44579       var path = d3_geoPath(projection$$1);
44580       var detected = utilDetect();
44581       var baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge');
44582       var _rdrawn = rbush_1();
44583       var _rskipped = rbush_1();
44584       var _textWidthCache = {};
44585       var _entitybboxes = {};
44586
44587       // Listed from highest to lowest priority
44588       var labelStack = [
44589           ['line', 'aeroway', '*', 12],
44590           ['line', 'highway', 'motorway', 12],
44591           ['line', 'highway', 'trunk', 12],
44592           ['line', 'highway', 'primary', 12],
44593           ['line', 'highway', 'secondary', 12],
44594           ['line', 'highway', 'tertiary', 12],
44595           ['line', 'highway', '*', 12],
44596           ['line', 'railway', '*', 12],
44597           ['line', 'waterway', '*', 12],
44598           ['area', 'aeroway', '*', 12],
44599           ['area', 'amenity', '*', 12],
44600           ['area', 'building', '*', 12],
44601           ['area', 'historic', '*', 12],
44602           ['area', 'leisure', '*', 12],
44603           ['area', 'man_made', '*', 12],
44604           ['area', 'natural', '*', 12],
44605           ['area', 'shop', '*', 12],
44606           ['area', 'tourism', '*', 12],
44607           ['area', 'camp_site', '*', 12],
44608           ['point', 'aeroway', '*', 10],
44609           ['point', 'amenity', '*', 10],
44610           ['point', 'building', '*', 10],
44611           ['point', 'historic', '*', 10],
44612           ['point', 'leisure', '*', 10],
44613           ['point', 'man_made', '*', 10],
44614           ['point', 'natural', '*', 10],
44615           ['point', 'shop', '*', 10],
44616           ['point', 'tourism', '*', 10],
44617           ['point', 'camp_site', '*', 10],
44618           ['line', 'name', '*', 12],
44619           ['area', 'name', '*', 12],
44620           ['point', 'name', '*', 10]
44621       ];
44622
44623
44624       function blacklisted(preset) {
44625           var noIcons = ['building', 'landuse', 'natural'];
44626           return some(noIcons, function(s) {
44627               return preset.id.indexOf(s) >= 0;
44628           });
44629       }
44630
44631
44632       function get(array, prop) {
44633           return function(d, i) { return array[i][prop]; };
44634       }
44635
44636
44637       function textWidth(text, size, elem) {
44638           var c = _textWidthCache[size];
44639           if (!c) c = _textWidthCache[size] = {};
44640
44641           if (c[text]) {
44642               return c[text];
44643
44644           } else if (elem) {
44645               c[text] = elem.getComputedTextLength();
44646               return c[text];
44647
44648           } else {
44649               var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
44650               if (str === null) {
44651                   return size / 3 * 2 * text.length;
44652               } else {
44653                   return size / 3 * (2 * text.length + str.length);
44654               }
44655           }
44656       }
44657
44658
44659       function drawLinePaths(selection, entities, filter, classes, labels) {
44660           var paths = selection.selectAll('path')
44661               .filter(filter)
44662               .data(entities, osmEntity$$1.key);
44663
44664           // exit
44665           paths.exit()
44666               .remove();
44667
44668           // enter/update
44669           paths.enter()
44670               .append('path')
44671               .style('stroke-width', get(labels, 'font-size'))
44672               .attr('id', function(d) { return 'labelpath-' + d.id; })
44673               .attr('class', classes)
44674               .merge(paths)
44675               .attr('d', get(labels, 'lineString'));
44676       }
44677
44678
44679       function drawLineLabels(selection, entities, filter, classes, labels) {
44680           var texts = selection.selectAll('text.' + classes)
44681               .filter(filter)
44682               .data(entities, osmEntity$$1.key);
44683
44684           // exit
44685           texts.exit()
44686               .remove();
44687
44688           // enter
44689           texts.enter()
44690               .append('text')
44691               .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
44692               .attr('dy', baselineHack ? '0.35em' : null)
44693               .append('textPath')
44694               .attr('class', 'textpath');
44695
44696           // update
44697           selection.selectAll('text.' + classes).selectAll('.textpath')
44698               .filter(filter)
44699               .data(entities, osmEntity$$1.key)
44700               .attr('startOffset', '50%')
44701               .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
44702               .text(utilDisplayNameForPath);
44703       }
44704
44705
44706       function drawPointLabels(selection, entities, filter, classes, labels) {
44707           var texts = selection.selectAll('text.' + classes)
44708               .filter(filter)
44709               .data(entities, osmEntity$$1.key);
44710
44711           // exit
44712           texts.exit()
44713               .remove();
44714
44715           // enter/update
44716           texts.enter()
44717               .append('text')
44718               .attr('class', function(d, i) {
44719                   return classes + ' ' + labels[i].classes + ' ' + d.id;
44720               })
44721               .merge(texts)
44722               .attr('x', get(labels, 'x'))
44723               .attr('y', get(labels, 'y'))
44724               .style('text-anchor', get(labels, 'textAnchor'))
44725               .text(utilDisplayName)
44726               .each(function(d, i) {
44727                   textWidth(utilDisplayName(d), labels[i].height, this);
44728               });
44729       }
44730
44731
44732       function drawAreaLabels(selection, entities, filter, classes, labels) {
44733           entities = entities.filter(hasText);
44734           labels = labels.filter(hasText);
44735           drawPointLabels(selection, entities, filter, classes, labels);
44736
44737           function hasText(d, i) {
44738               return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
44739           }
44740       }
44741
44742
44743       function drawAreaIcons(selection, entities, filter, classes, labels) {
44744           var icons = selection.selectAll('use.' + classes)
44745               .filter(filter)
44746               .data(entities, osmEntity$$1.key);
44747
44748           // exit
44749           icons.exit()
44750               .remove();
44751
44752           // enter/update
44753           icons.enter()
44754               .append('use')
44755               .attr('class', 'icon ' + classes)
44756               .attr('width', '17px')
44757               .attr('height', '17px')
44758               .merge(icons)
44759               .attr('transform', get(labels, 'transform'))
44760               .attr('xlink:href', function(d) {
44761                   var preset = context.presets().match(d, context.graph());
44762                   var picon = preset && preset.icon;
44763
44764                   if (!picon) {
44765                       return '';
44766                   } else {
44767                       var isMaki = dataFeatureIcons.indexOf(picon) !== -1;
44768                       return '#' + picon + (isMaki ? '-15' : '');
44769                   }
44770               });
44771       }
44772
44773
44774       function drawCollisionBoxes(selection, rtree, which) {
44775           var classes = 'debug ' + which + ' ' + (which === 'debug-skipped' ? 'orange' : 'yellow');
44776
44777           var gj = [];
44778           if (context.getDebug('collision')) {
44779               gj = rtree.all().map(function(d) {
44780                   return { type: 'Polygon', coordinates: [[
44781                       [d.minX, d.minY],
44782                       [d.maxX, d.minY],
44783                       [d.maxX, d.maxY],
44784                       [d.minX, d.maxY],
44785                       [d.minX, d.minY]
44786                   ]]};
44787               });
44788           }
44789
44790           var boxes = selection.selectAll('.' + which)
44791               .data(gj);
44792
44793           // exit
44794           boxes.exit()
44795               .remove();
44796
44797           // enter/update
44798           boxes.enter()
44799               .append('path')
44800               .attr('class', classes)
44801               .merge(boxes)
44802               .attr('d', d3_geoPath());
44803       }
44804
44805
44806       function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
44807           var wireframe = context.surface().classed('fill-wireframe');
44808           var zoom = geoScaleToZoom(projection$$1.scale());
44809
44810           var labelable = [];
44811           var renderNodeAs = {};
44812           var i, j, k, entity, geometry;
44813
44814           for (i = 0; i < labelStack.length; i++) {
44815               labelable.push([]);
44816           }
44817
44818           if (fullRedraw) {
44819               _rdrawn.clear();
44820               _rskipped.clear();
44821               _entitybboxes = {};
44822
44823           } else {
44824               for (i = 0; i < entities.length; i++) {
44825                   entity = entities[i];
44826                   var toRemove = []
44827                       .concat(_entitybboxes[entity.id] || [])
44828                       .concat(_entitybboxes[entity.id + 'I'] || []);
44829
44830                   for (j = 0; j < toRemove.length; j++) {
44831                       _rdrawn.remove(toRemove[j]);
44832                       _rskipped.remove(toRemove[j]);
44833                   }
44834               }
44835           }
44836
44837           // Loop through all the entities to do some preprocessing
44838           for (i = 0; i < entities.length; i++) {
44839               entity = entities[i];
44840               geometry = entity.geometry(graph);
44841
44842               // Insert collision boxes around interesting points/vertices
44843               if (geometry === 'point' || (geometry === 'vertex' && isInterestingVertex(entity))) {
44844                   var hasDirections = entity.directions(graph, projection$$1).length;
44845                   var markerPadding;
44846
44847                   if (!wireframe && geometry === 'point' && !(zoom >= 18 && hasDirections)) {
44848                       renderNodeAs[entity.id] = 'point';
44849                       markerPadding = 20;   // extra y for marker height
44850                   } else {
44851                       renderNodeAs[entity.id] = 'vertex';
44852                       markerPadding = 0;
44853                   }
44854
44855                   var coord = projection$$1(entity.loc);
44856                   var nodePadding = 10;
44857                   var bbox = {
44858                       minX: coord[0] - nodePadding,
44859                       minY: coord[1] - nodePadding - markerPadding,
44860                       maxX: coord[0] + nodePadding,
44861                       maxY: coord[1] + nodePadding
44862                   };
44863
44864                   doInsert(bbox, entity.id + 'P');
44865               }
44866
44867               // From here on, treat vertices like points
44868               if (geometry === 'vertex') {
44869                   geometry = 'point';
44870               }
44871
44872               // Determine which entities are label-able
44873               var preset = geometry === 'area' && context.presets().match(entity, graph);
44874               var icon = preset && !blacklisted(preset) && preset.icon;
44875
44876               if (!icon && !utilDisplayName(entity))
44877                   continue;
44878
44879               for (k = 0; k < labelStack.length; k++) {
44880                   var matchGeom = labelStack[k][0];
44881                   var matchKey = labelStack[k][1];
44882                   var matchVal = labelStack[k][2];
44883                   var hasVal = entity.tags[matchKey];
44884
44885                   if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
44886                       labelable[k].push(entity);
44887                       break;
44888                   }
44889               }
44890           }
44891
44892           var positions = {
44893               point: [],
44894               line: [],
44895               area: []
44896           };
44897
44898           var labelled = {
44899               point: [],
44900               line: [],
44901               area: []
44902           };
44903
44904           // Try and find a valid label for labellable entities
44905           for (k = 0; k < labelable.length; k++) {
44906               var fontSize = labelStack[k][3];
44907
44908               for (i = 0; i < labelable[k].length; i++) {
44909                   entity = labelable[k][i];
44910                   geometry = entity.geometry(graph);
44911
44912                   var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName;
44913                   var name = getName(entity);
44914                   var width = name && textWidth(name, fontSize);
44915                   var p = null;
44916
44917                   if (geometry === 'point' || geometry === 'vertex') {
44918                       // no point or vertex labels in wireframe mode
44919                       // no vertex labels at low zooms (vertices have no icons)
44920                       if (wireframe) continue;
44921                       var renderAs = renderNodeAs[entity.id];
44922                       if (renderAs === 'vertex' && zoom < 17) continue;
44923
44924                       p = getPointLabel(entity, width, fontSize, renderAs);
44925
44926                   } else if (geometry === 'line') {
44927                       p = getLineLabel(entity, width, fontSize);
44928
44929                   } else if (geometry === 'area') {
44930                       p = getAreaLabel(entity, width, fontSize);
44931                   }
44932
44933                   if (p) {
44934                       if (geometry === 'vertex') { geometry = 'point'; }  // treat vertex like point
44935                       p.classes = geometry + ' tag-' + labelStack[k][1];
44936                       positions[geometry].push(p);
44937                       labelled[geometry].push(entity);
44938                   }
44939               }
44940           }
44941
44942
44943           function isInterestingVertex(entity) {
44944               var selectedIDs = context.selectedIDs();
44945
44946               return entity.hasInterestingTags() ||
44947                   entity.isEndpoint(graph) ||
44948                   entity.isConnected(graph) ||
44949                   selectedIDs.indexOf(entity.id) !== -1 ||
44950                   some(graph.parentWays(entity), function(parent) {
44951                       return selectedIDs.indexOf(parent.id) !== -1;
44952                   });
44953           }
44954
44955
44956           function getPointLabel(entity, width, height, geometry) {
44957               var y = (geometry === 'point' ? -12 : 0);
44958               var pointOffsets = {
44959                   ltr: [15, y, 'start'],
44960                   rtl: [-15, y, 'end']
44961               };
44962
44963               var coord = projection$$1(entity.loc);
44964               var textPadding = 2;
44965               var offset = pointOffsets[textDirection];
44966               var p = {
44967                   height: height,
44968                   width: width,
44969                   x: coord[0] + offset[0],
44970                   y: coord[1] + offset[1],
44971                   textAnchor: offset[2]
44972               };
44973
44974               // insert a collision box for the text label..
44975               var bbox;
44976               if (textDirection === 'rtl') {
44977                   bbox = {
44978                       minX: p.x - width - textPadding,
44979                       minY: p.y - (height / 2) - textPadding,
44980                       maxX: p.x + textPadding,
44981                       maxY: p.y + (height / 2) + textPadding
44982                   };
44983               } else {
44984                   bbox = {
44985                       minX: p.x - textPadding,
44986                       minY: p.y - (height / 2) - textPadding,
44987                       maxX: p.x + width + textPadding,
44988                       maxY: p.y + (height / 2) + textPadding
44989                   };
44990               }
44991
44992               if (tryInsert([bbox], entity.id, true)) {
44993                   return p;
44994               }
44995           }
44996
44997
44998           function getLineLabel(entity, width, height) {
44999               var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
45000               var points = map$3(graph.childNodes(entity), 'loc').map(projection$$1);
45001               var length = geoPathLength(points);
45002
45003               if (length < width + 20) return;
45004
45005               // todo: properly clip points to viewport
45006
45007               // % along the line to attempt to place the label
45008               var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
45009                                  25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
45010               var padding = 3;
45011
45012               for (var i = 0; i < lineOffsets.length; i++) {
45013                   var offset = lineOffsets[i];
45014                   var middle = offset / 100 * length;
45015                   var start = middle - width / 2;
45016
45017                   if (start < 0 || start + width > length) continue;
45018
45019                   // generate subpath and ignore paths that are invalid or don't cross viewport.
45020                   var sub = subpath(points, start, start + width);
45021                   if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
45022                       continue;
45023                   }
45024
45025                   var isReverse = reverse(sub);
45026                   if (isReverse) {
45027                       sub = sub.reverse();
45028                   }
45029
45030                   var bboxes = [];
45031                   var boxsize = (height + 2) / 2;
45032
45033                   for (var j = 0; j < sub.length - 1; j++) {
45034                       var a = sub[j];
45035                       var b = sub[j + 1];
45036
45037                       // split up the text into small collision boxes
45038                       var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
45039
45040                       for (var box = 0; box < num; box++) {
45041                           var p = geoVecInterp(a, b, box / num);
45042                           var x0 = p[0] - boxsize - padding;
45043                           var y0 = p[1] - boxsize - padding;
45044                           var x1 = p[0] + boxsize + padding;
45045                           var y1 = p[1] + boxsize + padding;
45046
45047                           bboxes.push({
45048                               minX: Math.min(x0, x1),
45049                               minY: Math.min(y0, y1),
45050                               maxX: Math.max(x0, x1),
45051                               maxY: Math.max(y0, y1)
45052                           });
45053                       }
45054                   }
45055
45056                   if (tryInsert(bboxes, entity.id, false)) {   // accept this one
45057                       return {
45058                           'font-size': height + 2,
45059                           lineString: lineString(sub),
45060                           startOffset: offset + '%'
45061                       };
45062                   }
45063               }
45064
45065               function reverse(p) {
45066                   var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
45067                   return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
45068               }
45069
45070               function lineString(points) {
45071                   return 'M' + points.join('L');
45072               }
45073
45074               function subpath(points, from, to) {
45075                   var sofar = 0;
45076                   var start, end, i0, i1;
45077
45078                   for (var i = 0; i < points.length - 1; i++) {
45079                       var a = points[i];
45080                       var b = points[i + 1];
45081                       var current = geoVecLength(a, b);
45082                       var portion;
45083                       if (!start && sofar + current >= from) {
45084                           portion = (from - sofar) / current;
45085                           start = [
45086                               a[0] + portion * (b[0] - a[0]),
45087                               a[1] + portion * (b[1] - a[1])
45088                           ];
45089                           i0 = i + 1;
45090                       }
45091                       if (!end && sofar + current >= to) {
45092                           portion = (to - sofar) / current;
45093                           end = [
45094                               a[0] + portion * (b[0] - a[0]),
45095                               a[1] + portion * (b[1] - a[1])
45096                           ];
45097                           i1 = i + 1;
45098                       }
45099                       sofar += current;
45100                   }
45101
45102                   var result = points.slice(i0, i1);
45103                   result.unshift(start);
45104                   result.push(end);
45105                   return result;
45106               }
45107           }
45108
45109
45110           function getAreaLabel(entity, width, height) {
45111               var centroid = path.centroid(entity.asGeoJSON(graph, true));
45112               var extent = entity.extent(graph);
45113               var areaWidth = projection$$1(extent[1])[0] - projection$$1(extent[0])[0];
45114
45115               if (isNaN(centroid[0]) || areaWidth < 20) return;
45116
45117               var preset = context.presets().match(entity, context.graph());
45118               var picon = preset && preset.icon;
45119               var iconSize = 17;
45120               var padding = 2;
45121               var p = {};
45122
45123               if (picon) {  // icon and label..
45124                   if (addIcon()) {
45125                       addLabel(iconSize + padding);
45126                       return p;
45127                   }
45128               } else {   // label only..
45129                   if (addLabel(0)) {
45130                       return p;
45131                   }
45132               }
45133
45134
45135               function addIcon() {
45136                   var iconX = centroid[0] - (iconSize / 2);
45137                   var iconY = centroid[1] - (iconSize / 2);
45138                   var bbox = {
45139                       minX: iconX,
45140                       minY: iconY,
45141                       maxX: iconX + iconSize,
45142                       maxY: iconY + iconSize
45143                   };
45144
45145                   if (tryInsert([bbox], entity.id + 'I', true)) {
45146                       p.transform = 'translate(' + iconX + ',' + iconY + ')';
45147                       return true;
45148                   }
45149                   return false;
45150               }
45151
45152               function addLabel(yOffset) {
45153                   if (width && areaWidth >= width + 20) {
45154                       var labelX = centroid[0];
45155                       var labelY = centroid[1] + yOffset;
45156                       var bbox = {
45157                           minX: labelX - (width / 2) - padding,
45158                           minY: labelY - (height / 2) - padding,
45159                           maxX: labelX + (width / 2) + padding,
45160                           maxY: labelY + (height / 2) + padding
45161                       };
45162
45163                       if (tryInsert([bbox], entity.id, true)) {
45164                           p.x = labelX;
45165                           p.y = labelY;
45166                           p.textAnchor = 'middle';
45167                           p.height = height;
45168                           return true;
45169                       }
45170                   }
45171                   return false;
45172               }
45173           }
45174
45175
45176           // force insert a singular bounding box
45177           // singular box only, no array, id better be unique
45178           function doInsert(bbox, id) {
45179               bbox.id = id;
45180
45181               var oldbox = _entitybboxes[id];
45182               if (oldbox) {
45183                   _rdrawn.remove(oldbox);
45184               }
45185               _entitybboxes[id] = bbox;
45186               _rdrawn.insert(bbox);
45187           }
45188
45189
45190           function tryInsert(bboxes, id, saveSkipped) {
45191               var skipped = false;
45192
45193               for (var i = 0; i < bboxes.length; i++) {
45194                   var bbox = bboxes[i];
45195                   bbox.id = id;
45196
45197                   // Check that label is visible
45198                   if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
45199                       skipped = true;
45200                       break;
45201                   }
45202                   if (_rdrawn.collides(bbox)) {
45203                       skipped = true;
45204                       break;
45205                   }
45206               }
45207
45208               _entitybboxes[id] = bboxes;
45209
45210               if (skipped) {
45211                   if (saveSkipped) {
45212                       _rskipped.load(bboxes);
45213                   }
45214               } else {
45215                   _rdrawn.load(bboxes);
45216               }
45217
45218               return !skipped;
45219           }
45220
45221
45222           var layer = selection.selectAll('.layer-labels');
45223           var halo = layer.selectAll('.layer-labels-halo');
45224           var label = layer.selectAll('.layer-labels-label');
45225           var debug = layer.selectAll('.layer-labels-debug');
45226
45227           // points
45228           drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
45229           drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
45230
45231           // lines
45232           drawLinePaths(halo, labelled.line, filter, '', positions.line);
45233           drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
45234           drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
45235
45236           // areas
45237           drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
45238           drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
45239           drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
45240           drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
45241
45242           // debug
45243           drawCollisionBoxes(debug, _rskipped, 'debug-skipped');
45244           drawCollisionBoxes(debug, _rdrawn, 'debug-drawn');
45245
45246           layer.call(filterLabels);
45247       }
45248
45249
45250       function filterLabels(selection) {
45251           var layers = selection
45252               .selectAll('.layer-labels-label, .layer-labels-halo');
45253
45254           layers.selectAll('.nolabel')
45255               .classed('nolabel', false);
45256
45257           var mouse = context.mouse();
45258           var graph = context.graph();
45259           var selectedIDs = context.selectedIDs();
45260           var ids = [];
45261           var pad, bbox;
45262
45263           // hide labels near the mouse
45264           if (mouse) {
45265               pad = 20;
45266               bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
45267               ids.push.apply(ids, map$3(_rdrawn.search(bbox), 'id'));
45268           }
45269
45270           // hide labels on selected nodes (they look weird when dragging / haloed)
45271           for (var i = 0; i < selectedIDs.length; i++) {
45272               var entity = graph.hasEntity(selectedIDs[i]);
45273               if (entity && entity.type === 'node') {
45274                   ids.push(selectedIDs[i]);
45275               }
45276           }
45277
45278           layers.selectAll(utilEntitySelector(ids))
45279               .classed('nolabel', true);
45280
45281
45282           // draw the mouse bbox if debugging is on..
45283           var debug = selection.selectAll('.layer-labels-debug');
45284           var gj = [];
45285           if (context.getDebug('collision')) {
45286               gj = bbox ? [{
45287                   type: 'Polygon',
45288                   coordinates: [[
45289                       [bbox.minX, bbox.minY],
45290                       [bbox.maxX, bbox.minY],
45291                       [bbox.maxX, bbox.maxY],
45292                       [bbox.minX, bbox.maxY],
45293                       [bbox.minX, bbox.minY]
45294                   ]]
45295               }] : [];
45296           }
45297
45298           var box = debug.selectAll('.debug-mouse')
45299               .data(gj);
45300
45301           // exit
45302           box.exit()
45303               .remove();
45304
45305           // enter/update
45306           box.enter()
45307               .append('path')
45308               .attr('class', 'debug debug-mouse yellow')
45309               .merge(box)
45310               .attr('d', d3_geoPath());
45311       }
45312
45313
45314       var throttleFilterLabels = throttle(utilCallWhenIdle(filterLabels), 100);
45315
45316
45317       drawLabels.observe = function(selection) {
45318           var listener = function() { throttleFilterLabels(selection); };
45319           selection.on('mousemove.hidelabels', listener);
45320           context.on('enter.hidelabels', listener);
45321       };
45322
45323
45324       drawLabels.off = function(selection) {
45325           throttleFilterLabels.cancel();
45326           selection.on('mousemove.hidelabels', null);
45327           context.on('enter.hidelabels', null);
45328       };
45329
45330
45331       return drawLabels;
45332   }
45333
45334   function svgMapillaryImages$$1(projection, context, dispatch) {
45335       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
45336       var minZoom = 12;
45337       var minMarkerZoom = 16;
45338       var minViewfieldZoom = 18;
45339       var layer = d3_select(null);
45340       var _mapillary;
45341
45342
45343       function init() {
45344           if (svgMapillaryImages$$1.initialized) return;  // run once
45345           svgMapillaryImages$$1.enabled = false;
45346           svgMapillaryImages$$1.initialized = true;
45347       }
45348
45349
45350       function getService() {
45351           if (services.mapillary && !_mapillary) {
45352               _mapillary = services.mapillary;
45353               _mapillary.event.on('loadedImages', throttledRedraw);
45354           } else if (!services.mapillary && _mapillary) {
45355               _mapillary = null;
45356           }
45357
45358           return _mapillary;
45359       }
45360
45361
45362       function showLayer() {
45363           var service = getService();
45364           if (!service) return;
45365
45366           service.loadViewer(context);
45367           editOn();
45368
45369           layer
45370               .style('opacity', 0)
45371               .transition()
45372               .duration(250)
45373               .style('opacity', 1)
45374               .on('end', function () { dispatch.call('change'); });
45375       }
45376
45377
45378       function hideLayer() {
45379           var service = getService();
45380           if (service) {
45381               service.hideViewer();
45382           }
45383
45384           throttledRedraw.cancel();
45385
45386           layer
45387               .transition()
45388               .duration(250)
45389               .style('opacity', 0)
45390               .on('end', editOff);
45391       }
45392
45393
45394       function editOn() {
45395           layer.style('display', 'block');
45396       }
45397
45398
45399       function editOff() {
45400           layer.selectAll('.viewfield-group').remove();
45401           layer.style('display', 'none');
45402       }
45403
45404
45405       function click(d) {
45406           var service = getService();
45407           if (!service) return;
45408
45409           service
45410               .selectImage(d)
45411               .updateViewer(d.key, context)
45412               .showViewer();
45413
45414           context.map().centerEase(d.loc);
45415       }
45416
45417
45418       function mouseover(d) {
45419           var service = getService();
45420           if (service) service.setStyles(d);
45421       }
45422
45423
45424       function mouseout() {
45425           var service = getService();
45426           if (service) service.setStyles(null);
45427       }
45428
45429
45430       function transform(d) {
45431           var t = svgPointTransform(projection)(d);
45432           if (d.ca) {
45433               t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
45434           }
45435           return t;
45436       }
45437
45438
45439       function update() {
45440           var viewer = d3_select('#photoviewer');
45441           var selected = viewer.empty() ? undefined : viewer.datum();
45442
45443           var z = ~~context.map().zoom();
45444           var showMarkers = (z >= minMarkerZoom);
45445           var showViewfields = (z >= minViewfieldZoom);
45446
45447           var service = getService();
45448           var sequences = (service ? service.sequences(projection) : []);
45449           var images = (service && showMarkers ? service.images(projection) : []);
45450
45451           var traces = layer.selectAll('.sequences').selectAll('.sequence')
45452               .data(sequences, function(d) { return d.properties.key; });
45453
45454           // exit
45455           traces.exit()
45456               .remove();
45457
45458           // enter/update
45459           traces = traces.enter()
45460               .append('path')
45461               .attr('class', 'sequence')
45462               .merge(traces)
45463               .attr('d', svgPath(projection).geojson);
45464
45465
45466           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
45467               .data(images, function(d) { return d.key; });
45468
45469           // exit
45470           groups.exit()
45471               .remove();
45472
45473           // enter
45474           var groupsEnter = groups.enter()
45475               .append('g')
45476               .attr('class', 'viewfield-group')
45477               .on('mouseover', mouseover)
45478               .on('mouseout', mouseout)
45479               .on('click', click);
45480
45481           groupsEnter
45482               .append('g')
45483               .attr('class', 'viewfield-scale');
45484
45485           // update
45486           var markers = groups
45487               .merge(groupsEnter)
45488               .sort(function(a, b) {
45489                   return (a === selected) ? 1
45490                       : (b === selected) ? -1
45491                       : b.loc[1] - a.loc[1];  // sort Y
45492               })
45493               .attr('transform', transform)
45494               .select('.viewfield-scale');
45495
45496
45497           markers.selectAll('circle')
45498               .data([0])
45499               .enter()
45500               .append('circle')
45501               .attr('dx', '0')
45502               .attr('dy', '0')
45503               .attr('r', '6');
45504
45505           var viewfields = markers.selectAll('.viewfield')
45506               .data(showViewfields ? [0] : []);
45507
45508           viewfields.exit()
45509               .remove();
45510
45511           viewfields.enter()               // viewfields may or may not be drawn...
45512               .insert('path', 'circle')    // but if they are, draw below the circles
45513               .attr('class', 'viewfield')
45514               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
45515               .attr('d', viewfieldPath);
45516
45517           function viewfieldPath() {
45518               var d = this.parentNode.__data__;
45519               if (d.pano) {
45520                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
45521               } else {
45522                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
45523               }
45524           }
45525       }
45526
45527
45528       function drawImages(selection$$1) {
45529           var enabled = svgMapillaryImages$$1.enabled,
45530               service = getService();
45531
45532           layer = selection$$1.selectAll('.layer-mapillary-images')
45533               .data(service ? [0] : []);
45534
45535           layer.exit()
45536               .remove();
45537
45538           var layerEnter = layer.enter()
45539               .append('g')
45540               .attr('class', 'layer-mapillary-images')
45541               .style('display', enabled ? 'block' : 'none');
45542
45543           layerEnter
45544               .append('g')
45545               .attr('class', 'sequences');
45546
45547           layerEnter
45548               .append('g')
45549               .attr('class', 'markers');
45550
45551           layer = layerEnter
45552               .merge(layer);
45553
45554           if (enabled) {
45555               if (service && ~~context.map().zoom() >= minZoom) {
45556                   editOn();
45557                   update();
45558                   service.loadImages(projection);
45559               } else {
45560                   editOff();
45561               }
45562           }
45563       }
45564
45565
45566       drawImages.enabled = function(_) {
45567           if (!arguments.length) return svgMapillaryImages$$1.enabled;
45568           svgMapillaryImages$$1.enabled = _;
45569           if (svgMapillaryImages$$1.enabled) {
45570               showLayer();
45571           } else {
45572               hideLayer();
45573           }
45574           dispatch.call('change');
45575           return this;
45576       };
45577
45578
45579       drawImages.supported = function() {
45580           return !!getService();
45581       };
45582
45583
45584       init();
45585       return drawImages;
45586   }
45587
45588   function svgMapillarySigns(projection, context, dispatch) {
45589       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
45590       var minZoom = 12;
45591       var layer = d3_select(null);
45592       var _mapillary;
45593
45594
45595       function init() {
45596           if (svgMapillarySigns.initialized) return;  // run once
45597           svgMapillarySigns.enabled = false;
45598           svgMapillarySigns.initialized = true;
45599       }
45600
45601
45602       function getService() {
45603           if (services.mapillary && !_mapillary) {
45604               _mapillary = services.mapillary;
45605               _mapillary.event.on('loadedSigns', throttledRedraw);
45606           } else if (!services.mapillary && _mapillary) {
45607               _mapillary = null;
45608           }
45609           return _mapillary;
45610       }
45611
45612
45613       function showLayer() {
45614           var service = getService();
45615           if (!service) return;
45616
45617           service.loadViewer(context);
45618           editOn();
45619       }
45620
45621
45622       function hideLayer() {
45623           throttledRedraw.cancel();
45624           editOff();
45625       }
45626
45627
45628       function editOn() {
45629           layer.style('display', 'block');
45630       }
45631
45632
45633       function editOff() {
45634           layer.selectAll('.icon-sign').remove();
45635           layer.style('display', 'none');
45636       }
45637
45638
45639       function click(d) {
45640           var service = getService();
45641           if (!service) return;
45642
45643           context.map().centerEase(d.loc);
45644
45645           var selected = service.getSelectedImage();
45646           var selectedImageKey = selected && selected.key;
45647           var imageKey;
45648
45649           // Pick one of the images the sign was detected in,
45650           // preference given to an image already selected.
45651           d.detections.forEach(function(detection) {
45652               if (!imageKey || selectedImageKey === detection.image_key) {
45653                   imageKey = detection.image_key;
45654               }
45655           });
45656
45657           service
45658               .selectImage(null, imageKey)
45659               .updateViewer(imageKey, context)
45660               .showViewer();
45661       }
45662
45663
45664       function update() {
45665           var service = getService();
45666           var data = (service ? service.signs(projection) : []);
45667           var viewer = d3_select('#photoviewer');
45668           var selected = viewer.empty() ? undefined : viewer.datum();
45669           var selectedImageKey = selected && selected.key;
45670
45671           var signs = layer.selectAll('.icon-sign')
45672               .data(data, function(d) { return d.key; });
45673
45674           signs.exit()
45675               .remove();
45676
45677           var enter = signs.enter()
45678               .append('foreignObject')
45679               .attr('class', 'icon-sign')
45680               .attr('width', '24px')      // for Firefox
45681               .attr('height', '24px')     // for Firefox
45682               .classed('selected', function(d) {
45683                   return some(d.detections, function(detection) {
45684                       return detection.image_key === selectedImageKey;
45685                   });
45686               })
45687               .on('click', click);
45688
45689           enter
45690               .append('xhtml:body')
45691               .attr('class', 'icon-sign-body')
45692               .html(service.signHTML);
45693
45694           signs
45695               .merge(enter)
45696               .attr('x', function(d) { return projection(d.loc)[0] - 12; })   // offset by -12px to
45697               .attr('y', function(d) { return projection(d.loc)[1] - 12; });  // center signs on loc
45698       }
45699
45700
45701       function drawSigns(selection$$1) {
45702           var enabled = svgMapillarySigns.enabled,
45703               service = getService();
45704
45705           layer = selection$$1.selectAll('.layer-mapillary-signs')
45706               .data(service ? [0] : []);
45707
45708           layer.exit()
45709               .remove();
45710
45711           layer = layer.enter()
45712               .append('g')
45713               .attr('class', 'layer-mapillary-signs')
45714               .style('display', enabled ? 'block' : 'none')
45715               .merge(layer);
45716
45717           if (enabled) {
45718               if (service && ~~context.map().zoom() >= minZoom) {
45719                   editOn();
45720                   update();
45721                   service.loadSigns(context, projection);
45722               } else {
45723                   editOff();
45724               }
45725           }
45726       }
45727
45728
45729       drawSigns.enabled = function(_) {
45730           if (!arguments.length) return svgMapillarySigns.enabled;
45731           svgMapillarySigns.enabled = _;
45732           if (svgMapillarySigns.enabled) {
45733               showLayer();
45734           } else {
45735               hideLayer();
45736           }
45737           dispatch.call('change');
45738           return this;
45739       };
45740
45741
45742       drawSigns.supported = function() {
45743           var service = getService();
45744           return (service && service.signsSupported());
45745       };
45746
45747
45748       init();
45749       return drawSigns;
45750   }
45751
45752   function svgOpenstreetcamImages$$1(projection, context, dispatch) {
45753       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
45754       var minZoom = 12;
45755       var minMarkerZoom = 16;
45756       var minViewfieldZoom = 18;
45757       var layer = d3_select(null);
45758       var _openstreetcam;
45759
45760
45761       function init() {
45762           if (svgOpenstreetcamImages$$1.initialized) return;  // run once
45763           svgOpenstreetcamImages$$1.enabled = false;
45764           svgOpenstreetcamImages$$1.initialized = true;
45765       }
45766
45767
45768       function getService() {
45769           if (services.openstreetcam && !_openstreetcam) {
45770               _openstreetcam = services.openstreetcam;
45771               _openstreetcam.event.on('loadedImages', throttledRedraw);
45772           } else if (!services.openstreetcam && _openstreetcam) {
45773               _openstreetcam = null;
45774           }
45775
45776           return _openstreetcam;
45777       }
45778
45779
45780       function showLayer() {
45781           var service = getService();
45782           if (!service) return;
45783
45784           service.loadViewer(context);
45785           editOn();
45786
45787           layer
45788               .style('opacity', 0)
45789               .transition()
45790               .duration(250)
45791               .style('opacity', 1)
45792               .on('end', function () { dispatch.call('change'); });
45793       }
45794
45795
45796       function hideLayer() {
45797           var service = getService();
45798           if (service) {
45799               service.hideViewer();
45800           }
45801
45802           throttledRedraw.cancel();
45803
45804           layer
45805               .transition()
45806               .duration(250)
45807               .style('opacity', 0)
45808               .on('end', editOff);
45809       }
45810
45811
45812       function editOn() {
45813           layer.style('display', 'block');
45814       }
45815
45816
45817       function editOff() {
45818           layer.selectAll('.viewfield-group').remove();
45819           layer.style('display', 'none');
45820       }
45821
45822
45823       function click(d) {
45824           var service = getService();
45825           if (!service) return;
45826
45827           service
45828               .selectImage(d)
45829               .updateViewer(d)
45830               .showViewer();
45831
45832           context.map().centerEase(d.loc);
45833       }
45834
45835
45836       function mouseover(d) {
45837           var service = getService();
45838           if (service) service.setStyles(d);
45839       }
45840
45841
45842       function mouseout() {
45843           var service = getService();
45844           if (service) service.setStyles(null);
45845       }
45846
45847
45848       function transform(d) {
45849           var t = svgPointTransform(projection)(d);
45850           if (d.ca) {
45851               t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
45852           }
45853           return t;
45854       }
45855
45856
45857       function update() {
45858           var viewer = d3_select('#photoviewer');
45859           var selected = viewer.empty() ? undefined : viewer.datum();
45860
45861           var z = ~~context.map().zoom();
45862           var showMarkers = (z >= minMarkerZoom);
45863           var showViewfields = (z >= minViewfieldZoom);
45864
45865           var service = getService();
45866           var sequences = (service ? service.sequences(projection) : []);
45867           var images = (service && showMarkers ? service.images(projection) : []);
45868
45869           var traces = layer.selectAll('.sequences').selectAll('.sequence')
45870               .data(sequences, function(d) { return d.properties.key; });
45871
45872           // exit
45873           traces.exit()
45874               .remove();
45875
45876           // enter/update
45877           traces = traces.enter()
45878               .append('path')
45879               .attr('class', 'sequence')
45880               .merge(traces)
45881               .attr('d', svgPath(projection).geojson);
45882
45883
45884           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
45885               .data(images, function(d) { return d.key; });
45886
45887           // exit
45888           groups.exit()
45889               .remove();
45890
45891           // enter
45892           var groupsEnter = groups.enter()
45893               .append('g')
45894               .attr('class', 'viewfield-group')
45895               .on('mouseover', mouseover)
45896               .on('mouseout', mouseout)
45897               .on('click', click);
45898
45899           groupsEnter
45900               .append('g')
45901               .attr('class', 'viewfield-scale');
45902
45903           // update
45904           var markers = groups
45905               .merge(groupsEnter)
45906               .sort(function(a, b) {
45907                   return (a === selected) ? 1
45908                       : (b === selected) ? -1
45909                       : b.loc[1] - a.loc[1];  // sort Y
45910               })
45911               .attr('transform', transform)
45912               .select('.viewfield-scale');
45913
45914
45915           markers.selectAll('circle')
45916               .data([0])
45917               .enter()
45918               .append('circle')
45919               .attr('dx', '0')
45920               .attr('dy', '0')
45921               .attr('r', '6');
45922
45923           var viewfields = markers.selectAll('.viewfield')
45924               .data(showViewfields ? [0] : []);
45925
45926           viewfields.exit()
45927               .remove();
45928
45929           viewfields.enter()               // viewfields may or may not be drawn...
45930               .insert('path', 'circle')    // but if they are, draw below the circles
45931               .attr('class', 'viewfield')
45932               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
45933               .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');
45934       }
45935
45936
45937       function drawImages(selection$$1) {
45938           var enabled = svgOpenstreetcamImages$$1.enabled,
45939               service = getService();
45940
45941           layer = selection$$1.selectAll('.layer-openstreetcam-images')
45942               .data(service ? [0] : []);
45943
45944           layer.exit()
45945               .remove();
45946
45947           var layerEnter = layer.enter()
45948               .append('g')
45949               .attr('class', 'layer-openstreetcam-images')
45950               .style('display', enabled ? 'block' : 'none');
45951
45952           layerEnter
45953               .append('g')
45954               .attr('class', 'sequences');
45955
45956           layerEnter
45957               .append('g')
45958               .attr('class', 'markers');
45959
45960           layer = layerEnter
45961               .merge(layer);
45962
45963           if (enabled) {
45964               if (service && ~~context.map().zoom() >= minZoom) {
45965                   editOn();
45966                   update();
45967                   service.loadImages(projection);
45968               } else {
45969                   editOff();
45970               }
45971           }
45972       }
45973
45974
45975       drawImages.enabled = function(_) {
45976           if (!arguments.length) return svgOpenstreetcamImages$$1.enabled;
45977           svgOpenstreetcamImages$$1.enabled = _;
45978           if (svgOpenstreetcamImages$$1.enabled) {
45979               showLayer();
45980           } else {
45981               hideLayer();
45982           }
45983           dispatch.call('change');
45984           return this;
45985       };
45986
45987
45988       drawImages.supported = function() {
45989           return !!getService();
45990       };
45991
45992
45993       init();
45994       return drawImages;
45995   }
45996
45997   function svgOsm(projection, context, dispatch) {
45998       var enabled = true;
45999
46000
46001       function drawOsm(selection) {
46002           selection.selectAll('.layer-osm')
46003               .data(['covered', 'areas', 'lines', 'points', 'labels'])
46004               .enter()
46005               .append('g')
46006               .attr('class', function(d) { return 'layer-osm layer-' + d; });
46007
46008           selection.selectAll('.layer-areas').selectAll('.layer-areas-group')
46009               .data(['areas', 'targets'])
46010               .enter()
46011               .append('g')
46012               .attr('class', function(d) { return 'layer-areas-group layer-areas-' + d; });
46013
46014           selection.selectAll('.layer-lines').selectAll('.layer-lines-group')
46015               .data(['lines', 'targets'])
46016               .enter()
46017               .append('g')
46018               .attr('class', function(d) { return 'layer-lines-group layer-lines-' + d; });
46019
46020           selection.selectAll('.layer-points').selectAll('.layer-points-group')
46021               .data(['points', 'midpoints', 'vertices', 'turns', 'targets'])
46022               .enter()
46023               .append('g')
46024               .attr('class', function(d) { return 'layer-points-group layer-points-' + d; });
46025
46026           selection.selectAll('.layer-labels').selectAll('.layer-labels-group')
46027               .data(['halo', 'label', 'debug'])
46028               .enter()
46029               .append('g')
46030               .attr('class', function(d) { return 'layer-labels-group layer-labels-' + d; });
46031       }
46032
46033
46034       function showLayer() {
46035           var layer = context.surface().selectAll('.data-layer-osm');
46036           layer.interrupt();
46037
46038           layer
46039               .classed('disabled', false)
46040               .style('opacity', 0)
46041               .transition()
46042               .duration(250)
46043               .style('opacity', 1)
46044               .on('end interrupt', function () {
46045                   dispatch.call('change');
46046               });
46047       }
46048
46049
46050       function hideLayer() {
46051           var layer = context.surface().selectAll('.data-layer-osm');
46052           layer.interrupt();
46053
46054           layer
46055               .transition()
46056               .duration(250)
46057               .style('opacity', 0)
46058               .on('end interrupt', function () {
46059                   layer.classed('disabled', true);
46060                   dispatch.call('change');
46061               });
46062       }
46063
46064
46065       drawOsm.enabled = function(_) {
46066           if (!arguments.length) return enabled;
46067           enabled = _;
46068
46069           if (enabled) {
46070               showLayer();
46071           } else {
46072               hideLayer();
46073           }
46074
46075           dispatch.call('change');
46076           return this;
46077       };
46078
46079
46080       return drawOsm;
46081   }
46082
46083   function svgLayers(projection, context) {
46084       var dispatch$$1 = dispatch('change'),
46085           svg = d3_select(null),
46086           layers = [
46087               { id: 'osm', layer: svgOsm(projection, context, dispatch$$1) },
46088               { id: 'gpx', layer: svgGpx$$1(projection, context, dispatch$$1) },
46089               { id: 'mapillary-images', layer: svgMapillaryImages$$1(projection, context, dispatch$$1) },
46090               { id: 'mapillary-signs',  layer: svgMapillarySigns(projection, context, dispatch$$1) },
46091               { id: 'openstreetcam-images', layer: svgOpenstreetcamImages$$1(projection, context, dispatch$$1) },
46092               { id: 'debug', layer: svgDebug$$1(projection, context, dispatch$$1) }
46093           ];
46094
46095
46096       function drawLayers(selection$$1) {
46097           svg = selection$$1.selectAll('.surface')
46098               .data([0]);
46099
46100           svg = svg.enter()
46101               .append('svg')
46102               .attr('class', 'surface')
46103               .merge(svg);
46104
46105           var defs = svg.selectAll('.surface-defs')
46106               .data([0]);
46107
46108           defs.enter()
46109               .append('defs')
46110               .attr('class', 'surface-defs');
46111
46112           var groups = svg.selectAll('.data-layer')
46113               .data(layers);
46114
46115           groups.exit()
46116               .remove();
46117
46118           groups.enter()
46119               .append('g')
46120               .attr('class', function(d) { return 'data-layer data-layer-' + d.id; })
46121               .merge(groups)
46122               .each(function(d) { d3_select(this).call(d.layer); });
46123       }
46124
46125
46126       drawLayers.all = function() {
46127           return layers;
46128       };
46129
46130
46131       drawLayers.layer = function(id) {
46132           var obj = find$1(layers, function(o) {return o.id === id;});
46133           return obj && obj.layer;
46134       };
46135
46136
46137       drawLayers.only = function(what) {
46138           var arr = [].concat(what);
46139           drawLayers.remove(difference(map$3(layers, 'id'), arr));
46140           return this;
46141       };
46142
46143
46144       drawLayers.remove = function(what) {
46145           var arr = [].concat(what);
46146           arr.forEach(function(id) {
46147               layers = reject(layers, function(o) {return o.id === id;});
46148           });
46149           dispatch$$1.call('change');
46150           return this;
46151       };
46152
46153
46154       drawLayers.add = function(what) {
46155           var arr = [].concat(what);
46156           arr.forEach(function(obj) {
46157               if ('id' in obj && 'layer' in obj) {
46158                   layers.push(obj);
46159               }
46160           });
46161           dispatch$$1.call('change');
46162           return this;
46163       };
46164
46165
46166       drawLayers.dimensions = function(_) {
46167           if (!arguments.length) return utilGetDimensions(svg);
46168           utilSetDimensions(svg, _);
46169           return this;
46170       };
46171
46172
46173       return utilRebind(drawLayers, dispatch$$1, 'on');
46174   }
46175
46176   function svgLines$$1(projection, context) {
46177       var detected = utilDetect();
46178
46179       var highway_stack = {
46180           motorway: 0,
46181           motorway_link: 1,
46182           trunk: 2,
46183           trunk_link: 3,
46184           primary: 4,
46185           primary_link: 5,
46186           secondary: 6,
46187           tertiary: 7,
46188           unclassified: 8,
46189           residential: 9,
46190           service: 10,
46191           footway: 11
46192       };
46193
46194
46195       function drawTargets(selection, graph, entities, filter$$1) {
46196           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
46197           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
46198           var getPath = svgPath(projection).geojson;
46199           var activeID = context.activeID();
46200
46201           // The targets and nopes will be MultiLineString sub-segments of the ways
46202           var data = { targets: [], nopes: [] };
46203
46204           entities.forEach(function(way) {
46205               var features = svgSegmentWay(way, graph, activeID);
46206               data.targets.push.apply(data.targets, features.passive);
46207               data.nopes.push.apply(data.nopes, features.active);
46208           });
46209
46210
46211           // Targets allow hover and vertex snapping
46212           var targetData = data.targets.filter(getPath);
46213           var targets = selection.selectAll('.line.target-allowed')
46214               .filter(function(d) { return filter$$1(d.properties.entity); })
46215               .data(targetData, function key(d) { return d.id; });
46216
46217           // exit
46218           targets.exit()
46219               .remove();
46220
46221           // enter/update
46222           targets.enter()
46223               .append('path')
46224               .merge(targets)
46225               .attr('d', getPath)
46226               .attr('class', function(d) { return 'way line target target-allowed ' + targetClass + d.id; });
46227
46228
46229           // NOPE
46230           var nopeData = data.nopes.filter(getPath);
46231           var nopes = selection.selectAll('.line.target-nope')
46232               .filter(function(d) { return filter$$1(d.properties.entity); })
46233               .data(nopeData, function key(d) { return d.id; });
46234
46235           // exit
46236           nopes.exit()
46237               .remove();
46238
46239           // enter/update
46240           nopes.enter()
46241               .append('path')
46242               .merge(nopes)
46243               .attr('d', getPath)
46244               .attr('class', function(d) { return 'way line target target-nope ' + nopeClass + d.id; });
46245       }
46246
46247
46248       function drawLines(selection, graph, entities, filter$$1) {
46249
46250           function waystack(a, b) {
46251               var selected = context.selectedIDs();
46252               var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
46253               var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
46254
46255               if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
46256               if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
46257               return scoreA - scoreB;
46258           }
46259
46260
46261           function drawLineGroup(selection, klass, isSelected) {
46262               // Note: Don't add `.selected` class in draw modes
46263               var mode = context.mode();
46264               var isDrawing = mode && /^draw/.test(mode.id);
46265               var selectedClass = (!isDrawing && isSelected) ? 'selected ' : '';
46266
46267               var lines = selection
46268                   .selectAll('path')
46269                   .filter(filter$$1)
46270                   .data(getPathData(isSelected), osmEntity$$1.key);
46271
46272               lines.exit()
46273                   .remove();
46274
46275               // Optimization: Call expensive TagClasses only on enter selection. This
46276               // works because osmEntity.key is defined to include the entity v attribute.
46277               lines.enter()
46278                   .append('path')
46279                   .attr('class', function(d) {
46280                       var oldMPClass = oldMultiPolygonOuters[d.id] ? 'old-multipolygon ' : '';
46281                       return 'way line ' + klass + ' ' + selectedClass + oldMPClass + d.id;
46282                   })
46283                   .call(svgTagClasses())
46284                   .merge(lines)
46285                   .sort(waystack)
46286                   .attr('d', getPath)
46287                   .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
46288
46289               return selection;
46290           }
46291
46292
46293           function getPathData(isSelected) {
46294               return function() {
46295                   var layer = this.parentNode.__data__;
46296                   var data = pathdata[layer] || [];
46297                   return data.filter(function(d) {
46298                       if (isSelected)
46299                           return context.selectedIDs().indexOf(d.id) !== -1;
46300                       else
46301                           return context.selectedIDs().indexOf(d.id) === -1;
46302                   });
46303               };
46304           }
46305
46306
46307           var getPath = svgPath(projection, graph);
46308           var ways = [];
46309           var pathdata = {};
46310           var onewaydata = {};
46311           var oldMultiPolygonOuters = {};
46312
46313           for (var i = 0; i < entities.length; i++) {
46314               var entity = entities[i];
46315               var outer = osmSimpleMultipolygonOuterMember(entity, graph);
46316               if (outer) {
46317                   ways.push(entity.mergeTags(outer.tags));
46318                   oldMultiPolygonOuters[outer.id] = true;
46319               } else if (entity.geometry(graph) === 'line') {
46320                   ways.push(entity);
46321               }
46322           }
46323
46324           ways = ways.filter(getPath);
46325           pathdata = groupBy(ways, function(way) { return way.layer(); });
46326
46327           forOwn(pathdata, function(v, k) {
46328               var arr = filter(v, function(d) { return d.isOneWay(); });
46329               onewaydata[k] = flatten(map$3(arr, svgOneWaySegments(projection, graph, 35)));
46330           });
46331
46332
46333           var covered = selection.selectAll('.layer-covered');                      // under areas
46334           var uncovered = selection.selectAll('.layer-lines .layer-lines-lines');   // over areas
46335
46336           [covered, uncovered].forEach(function(selection) {
46337               var range$$1 = (selection === covered ? d3_range(-10,0) : d3_range(0,11));
46338               var layergroup = selection
46339                   .selectAll('g.layergroup')
46340                   .data(range$$1);
46341
46342               layergroup = layergroup.enter()
46343                   .append('g')
46344                   .attr('class', function(d) { return 'layergroup layer' + String(d); })
46345                   .merge(layergroup);
46346
46347               layergroup
46348                   .selectAll('g.linegroup')
46349                   .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
46350                   .enter()
46351                   .append('g')
46352                   .attr('class', function(d) { return 'linegroup line-' + d; });
46353
46354               layergroup.selectAll('g.line-shadow')
46355                   .call(drawLineGroup, 'shadow', false);
46356               layergroup.selectAll('g.line-casing')
46357                   .call(drawLineGroup, 'casing', false);
46358               layergroup.selectAll('g.line-stroke')
46359                   .call(drawLineGroup, 'stroke', false);
46360
46361               layergroup.selectAll('g.line-shadow-highlighted')
46362                   .call(drawLineGroup, 'shadow', true);
46363               layergroup.selectAll('g.line-casing-highlighted')
46364                   .call(drawLineGroup, 'casing', true);
46365               layergroup.selectAll('g.line-stroke-highlighted')
46366                   .call(drawLineGroup, 'stroke', true);
46367
46368
46369               var onewaygroup = layergroup
46370                   .selectAll('g.onewaygroup')
46371                   .data(['oneway']);
46372
46373               onewaygroup = onewaygroup.enter()
46374                   .append('g')
46375                   .attr('class', 'onewaygroup')
46376                   .merge(onewaygroup);
46377
46378               var oneways = onewaygroup
46379                   .selectAll('path')
46380                   .filter(filter$$1)
46381                   .data(
46382                       function data() { return onewaydata[this.parentNode.__data__] || []; },
46383                       function key(d) { return [d.id, d.index]; }
46384                   );
46385
46386               oneways.exit()
46387                   .remove();
46388
46389               oneways = oneways.enter()
46390                   .append('path')
46391                   .attr('class', 'oneway')
46392                   .attr('marker-mid', 'url(#oneway-marker)')
46393                   .merge(oneways)
46394                   .attr('d', function(d) { return d.d; });
46395
46396               if (detected.ie) {
46397                   oneways.each(function() { this.parentNode.insertBefore(this, this); });
46398               }
46399           });
46400
46401           // touch targets
46402           selection.selectAll('.layer-lines .layer-lines-targets')
46403               .call(drawTargets, graph, ways, filter$$1);
46404       }
46405
46406
46407       return drawLines;
46408   }
46409
46410   function svgMidpoints$$1(projection, context) {
46411       var targetRadius = 8;
46412
46413       function drawTargets(selection, graph, entities, filter) {
46414           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
46415           var getTransform = svgPointTransform(projection).geojson;
46416
46417           var data = entities.map(function(midpoint) {
46418               return {
46419                   type: 'Feature',
46420                   id: midpoint.id,
46421                   properties: {
46422                       target: true,
46423                       entity: midpoint
46424                   },
46425                   geometry: {
46426                       type: 'Point',
46427                       coordinates: midpoint.loc
46428                   }
46429               };
46430           });
46431
46432           var targets = selection.selectAll('.midpoint.target')
46433               .filter(function(d) { return filter(d.properties.entity); })
46434               .data(data, function key(d) { return d.id; });
46435
46436           // exit
46437           targets.exit()
46438               .remove();
46439
46440           // enter/update
46441           targets.enter()
46442               .append('circle')
46443               .attr('r', targetRadius)
46444               .merge(targets)
46445               .attr('class', function(d) { return 'node midpoint target ' + fillClass + d.id; })
46446               .attr('transform', getTransform);
46447       }
46448
46449
46450       function drawMidpoints(selection, graph, entities, filter, extent) {
46451           var layer = selection.selectAll('.layer-points .layer-points-midpoints');
46452
46453           var mode = context.mode();
46454           if (mode && mode.id !== 'select') {
46455               layer.selectAll('g.midpoint')
46456                   .remove();
46457
46458               selection.selectAll('.layer-points .layer-points-targets .midpoint.target')
46459                   .remove();
46460
46461               return;
46462           }
46463
46464           var poly = extent.polygon();
46465           var midpoints = {};
46466
46467           for (var i = 0; i < entities.length; i++) {
46468               var entity = entities[i];
46469
46470               if (entity.type !== 'way')
46471                   continue;
46472               if (!filter(entity))
46473                   continue;
46474               if (context.selectedIDs().indexOf(entity.id) < 0)
46475                   continue;
46476
46477               var nodes = graph.childNodes(entity);
46478               for (var j = 0; j < nodes.length - 1; j++) {
46479
46480                   var a = nodes[j];
46481                   var b = nodes[j + 1];
46482                   var id = [a.id, b.id].sort().join('-');
46483
46484                   if (midpoints[id]) {
46485                       midpoints[id].parents.push(entity);
46486                   } else {
46487                       if (geoVecLength(projection(a.loc), projection(b.loc)) > 40) {
46488                           var point = geoVecInterp(a.loc, b.loc, 0.5);
46489                           var loc = null;
46490
46491                           if (extent.intersects(point)) {
46492                               loc = point;
46493                           } else {
46494                               for (var k = 0; k < 4; k++) {
46495                                   point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
46496                                   if (point &&
46497                                       geoVecLength(projection(a.loc), projection(point)) > 20 &&
46498                                       geoVecLength(projection(b.loc), projection(point)) > 20)
46499                                   {
46500                                       loc = point;
46501                                       break;
46502                                   }
46503                               }
46504                           }
46505
46506                           if (loc) {
46507                               midpoints[id] = {
46508                                   type: 'midpoint',
46509                                   id: id,
46510                                   loc: loc,
46511                                   edge: [a.id, b.id],
46512                                   parents: [entity]
46513                               };
46514                           }
46515                       }
46516                   }
46517               }
46518           }
46519
46520
46521           function midpointFilter(d) {
46522               if (midpoints[d.id])
46523                   return true;
46524
46525               for (var i = 0; i < d.parents.length; i++) {
46526                   if (filter(d.parents[i])) {
46527                       return true;
46528                   }
46529               }
46530
46531               return false;
46532           }
46533
46534
46535           var groups = layer
46536               .selectAll('g.midpoint')
46537               .filter(midpointFilter)
46538               .data(values$1(midpoints), function(d) { return d.id; });
46539
46540           groups.exit()
46541               .remove();
46542
46543           var enter = groups.enter()
46544               .insert('g', ':first-child')
46545               .attr('class', 'midpoint');
46546
46547           enter
46548               .append('polygon')
46549               .attr('points', '-6,8 10,0 -6,-8')
46550               .attr('class', 'shadow');
46551
46552           enter
46553               .append('polygon')
46554               .attr('points', '-3,4 5,0 -3,-4')
46555               .attr('class', 'fill');
46556
46557           groups = groups
46558               .merge(enter)
46559               .attr('transform', function(d) {
46560                   var translate = svgPointTransform(projection);
46561                   var a = graph.entity(d.edge[0]);
46562                   var b = graph.entity(d.edge[1]);
46563                   var angle = geoAngle(a, b, projection) * (180 / Math.PI);
46564                   return translate(d) + ' rotate(' + angle + ')';
46565               })
46566               .call(svgTagClasses().tags(
46567                   function(d) { return d.parents[0].tags; }
46568               ));
46569
46570           // Propagate data bindings.
46571           groups.select('polygon.shadow');
46572           groups.select('polygon.fill');
46573
46574
46575           // Draw touch targets..
46576           selection.selectAll('.layer-points .layer-points-targets')
46577               .call(drawTargets, graph, values$1(midpoints), midpointFilter);
46578       }
46579
46580       return drawMidpoints;
46581   }
46582
46583   // Touch targets control which other vertices we can drag a vertex onto.
46584   //
46585   // - the activeID - nope
46586   // - 1 away (adjacent) to the activeID - yes (vertices will be merged)
46587   // - 2 away from the activeID - nope (would create a self intersecting segment)
46588   // - all others on a linear way - yes
46589   // - all others on a closed way - nope (would create a self intersecting polygon)
46590   //
46591   // returns
46592   // 0 = active vertex - no touch/connect
46593   // 1 = passive vertex - yes touch/connect
46594   // 2 = adjacent vertex - yes but pay attention segmenting a line here
46595   //
46596   function svgPassiveVertex(node, graph, activeID) {
46597       if (!activeID) return 1;
46598       if (activeID === node.id) return 0;
46599
46600       var parents = graph.parentWays(node);
46601
46602       for (var i = 0; i < parents.length; i++) {
46603           var nodes = parents[i].nodes;
46604           var isClosed = parents[i].isClosed();
46605           for (var j = 0; j < nodes.length; j++) {   // find this vertex, look nearby
46606               if (nodes[j] === node.id) {
46607                   var ix1 = j - 2;
46608                   var ix2 = j - 1;
46609                   var ix3 = j + 1;
46610                   var ix4 = j + 2;
46611
46612                   if (isClosed) {  // wraparound if needed
46613                       var max = nodes.length - 1;
46614                       if (ix1 < 0)   ix1 = max + ix1;
46615                       if (ix2 < 0)   ix2 = max + ix2;
46616                       if (ix3 > max) ix3 = ix3 - max;
46617                       if (ix4 > max) ix4 = ix4 - max;
46618                   }
46619
46620                   if (nodes[ix1] === activeID) return 0;        // no - prevent self intersect
46621                   else if (nodes[ix2] === activeID) return 2;   // ok - adjacent
46622                   else if (nodes[ix3] === activeID) return 2;   // ok - adjacent
46623                   else if (nodes[ix4] === activeID) return 0;   // no - prevent self intersect
46624                   else if (isClosed && nodes.indexOf(activeID) !== -1) return 0;  // no - prevent self intersect
46625               }
46626           }
46627       }
46628
46629       return 1;   // ok
46630   }
46631
46632
46633   function svgOneWaySegments(projection$$1, graph, dt) {
46634       return function(entity) {
46635           var i = 0;
46636           var offset = dt;
46637           var segments = [];
46638           var clip = d3_geoIdentity().clipExtent(projection$$1.clipExtent()).stream;
46639           var coordinates = graph.childNodes(entity).map(function(n) { return n.loc; });
46640           var a, b;
46641
46642           if (entity.tags.oneway === '-1') {
46643               coordinates.reverse();
46644           }
46645
46646           var isReversible = (entity.tags.oneway === 'reversible' || entity.tags.oneway === 'alternating');
46647
46648           d3_geoStream({
46649               type: 'LineString',
46650               coordinates: coordinates
46651           }, projection$$1.stream(clip({
46652               lineStart: function() {},
46653               lineEnd: function() { a = null; },
46654               point: function(x, y) {
46655                   b = [x, y];
46656
46657                   if (a) {
46658                       var span = geoVecLength(a, b) - offset;
46659
46660                       if (span >= 0) {
46661                           var heading = geoVecAngle(a, b);
46662                           var dx = dt * Math.cos(heading);
46663                           var dy = dt * Math.sin(heading);
46664                           var p = [
46665                               a[0] + offset * Math.cos(heading),
46666                               a[1] + offset * Math.sin(heading)
46667                           ];
46668
46669                           // gather coordinates
46670                           var coord = [a, p];
46671                           for (span -= dt; span >= 0; span -= dt) {
46672                               p = geoVecAdd(p, [dx, dy]);
46673                               coord.push(p);
46674                           }
46675                           coord.push(b);
46676
46677                           // generate svg paths
46678                           var segment = '';
46679                           var j;
46680
46681                           for (j = 0; j < coord.length; j++) {
46682                               segment += (j === 0 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
46683                           }
46684                           segments.push({ id: entity.id, index: i++, d: segment });
46685
46686                           if (isReversible) {
46687                               segment = '';
46688                               for (j = coord.length - 1; j >= 0; j--) {
46689                                   segment += (j === coord.length - 1 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
46690                               }
46691                               segments.push({ id: entity.id, index: i++, d: segment });
46692                           }
46693                       }
46694
46695                       offset = -span;
46696                   }
46697
46698                   a = b;
46699               }
46700           })));
46701
46702           return segments;
46703       };
46704   }
46705
46706
46707   function svgPath(projection$$1, graph, isArea) {
46708
46709       // Explanation of magic numbers:
46710       // "padding" here allows space for strokes to extend beyond the viewport,
46711       // so that the stroke isn't drawn along the edge of the viewport when
46712       // the shape is clipped.
46713       //
46714       // When drawing lines, pad viewport by 5px.
46715       // When drawing areas, pad viewport by 65px in each direction to allow
46716       // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
46717
46718       var cache = {};
46719       var padding = isArea ? 65 : 5;
46720       var viewport = projection$$1.clipExtent();
46721       var paddedExtent = [
46722           [viewport[0][0] - padding, viewport[0][1] - padding],
46723           [viewport[1][0] + padding, viewport[1][1] + padding]
46724       ];
46725       var clip = d3_geoIdentity().clipExtent(paddedExtent).stream;
46726       var project = projection$$1.stream;
46727       var path = d3_geoPath()
46728           .projection({stream: function(output) { return project(clip(output)); }});
46729
46730       var svgpath = function(entity) {
46731           if (entity.id in cache) {
46732               return cache[entity.id];
46733           } else {
46734               return cache[entity.id] = path(entity.asGeoJSON(graph));
46735           }
46736       };
46737
46738       svgpath.geojson = path;
46739
46740       return svgpath;
46741   }
46742
46743
46744   function svgPointTransform(projection$$1) {
46745       var svgpoint = function(entity) {
46746           // http://jsperf.com/short-array-join
46747           var pt = projection$$1(entity.loc);
46748           return 'translate(' + pt[0] + ',' + pt[1] + ')';
46749       };
46750
46751       svgpoint.geojson = function(d) {
46752           return svgpoint(d.properties.entity);
46753       };
46754
46755       return svgpoint;
46756   }
46757
46758
46759   function svgRelationMemberTags(graph) {
46760       return function(entity) {
46761           var tags = entity.tags;
46762           graph.parentRelations(entity).forEach(function(relation) {
46763               var type = relation.tags.type;
46764               if (type === 'multipolygon' || type === 'boundary') {
46765                   tags = assignIn({}, relation.tags, tags);
46766               }
46767           });
46768           return tags;
46769       };
46770   }
46771
46772
46773   function svgSegmentWay(way, graph, activeID) {
46774       var isActiveWay = (way.nodes.indexOf(activeID) !== -1);
46775       var features = { passive: [], active: [] };
46776       var start = {};
46777       var end = {};
46778       var node, type;
46779
46780       for (var i = 0; i < way.nodes.length; i++) {
46781           node = graph.entity(way.nodes[i]);
46782           type = svgPassiveVertex(node, graph, activeID);
46783           end = { node: node, type: type };
46784
46785           if (start.type !== undefined) {
46786               if (start.node.id === activeID || end.node.id === activeID) {
46787                   // push nothing
46788               } else if (isActiveWay && (start.type === 2 || end.type === 2)) {   // one adjacent vertex
46789                   pushActive(start, end, i);
46790               } else if (start.type === 0 && end.type === 0) {   // both active vertices
46791                   pushActive(start, end, i);
46792               } else {
46793                   pushPassive(start, end, i);
46794               }
46795           }
46796
46797           start = end;
46798       }
46799
46800       return features;
46801
46802
46803       function pushActive(start, end, index) {
46804           features.active.push({
46805               type: 'Feature',
46806               id: way.id + '-' + index + '-nope',
46807               properties: {
46808                   nope: true,
46809                   target: true,
46810                   entity: way,
46811                   nodes: [start.node, end.node],
46812                   index: index
46813               },
46814               geometry: {
46815                   type: 'LineString',
46816                   coordinates: [start.node.loc, end.node.loc]
46817               }
46818           });
46819       }
46820
46821       function pushPassive(start, end, index) {
46822           features.passive.push({
46823               type: 'Feature',
46824               id: way.id + '-' + index,
46825               properties: {
46826                   target: true,
46827                   entity: way,
46828                   nodes: [start.node, end.node],
46829                   index: index
46830               },
46831               geometry: {
46832                   type: 'LineString',
46833                   coordinates: [start.node.loc, end.node.loc]
46834               }
46835           });
46836       }
46837   }
46838
46839   function svgPoints$$1(projection, context) {
46840
46841       function markerPath(selection, klass) {
46842           selection
46843               .attr('class', klass)
46844               .attr('transform', 'translate(-8, -23)')
46845               .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');
46846       }
46847
46848       function sortY(a, b) {
46849           return b.loc[1] - a.loc[1];
46850       }
46851
46852
46853       // Avoid exit/enter if we're just moving stuff around.
46854       // The node will get a new version but we only need to run the update selection.
46855       function fastEntityKey(d) {
46856           var mode = context.mode();
46857           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
46858           return isMoving ? d.id : osmEntity$$1.key(d);
46859       }
46860
46861
46862       function drawTargets(selection, graph, entities, filter) {
46863           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
46864           var getTransform = svgPointTransform(projection).geojson;
46865           var activeID = context.activeID();
46866           var data$$1 = [];
46867
46868           entities.forEach(function(node) {
46869               if (activeID === node.id) return;   // draw no target on the activeID
46870
46871               data$$1.push({
46872                   type: 'Feature',
46873                   id: node.id,
46874                   properties: {
46875                       target: true,
46876                       entity: node
46877                   },
46878                   geometry: node.asGeoJSON()
46879               });
46880           });
46881
46882           var targets = selection.selectAll('.point.target')
46883               .filter(function(d) { return filter(d.properties.entity); })
46884               .data(data$$1, function key(d) { return d.id; });
46885
46886           // exit
46887           targets.exit()
46888               .remove();
46889
46890           // enter/update
46891           targets.enter()
46892               .append('rect')
46893               .attr('x', -10)
46894               .attr('y', -26)
46895               .attr('width', 20)
46896               .attr('height', 30)
46897               .merge(targets)
46898               .attr('class', function(d) { return 'node point target ' + fillClass + d.id; })
46899               .attr('transform', getTransform);
46900       }
46901
46902
46903       function drawPoints(selection, graph, entities, filter) {
46904           var wireframe = context.surface().classed('fill-wireframe');
46905           var zoom = geoScaleToZoom(projection.scale());
46906
46907           // points with a direction will render as vertices at higher zooms
46908           function renderAsPoint(entity) {
46909               return entity.geometry(graph) === 'point' &&
46910                   !(zoom >= 18 && entity.directions(graph, projection).length);
46911           }
46912
46913           // all points will render as vertices in wireframe mode too
46914           var points = wireframe ? [] : entities.filter(renderAsPoint);
46915
46916           points.sort(sortY);
46917
46918
46919           var layer = selection.selectAll('.layer-points .layer-points-points');
46920
46921           var groups = layer.selectAll('g.point')
46922               .filter(filter)
46923               .data(points, fastEntityKey);
46924
46925           groups.exit()
46926               .remove();
46927
46928           var enter = groups.enter()
46929               .append('g')
46930               .attr('class', function(d) { return 'node point ' + d.id; })
46931               .order();
46932
46933           enter
46934               .append('path')
46935               .call(markerPath, 'shadow');
46936
46937           enter
46938               .append('ellipse')
46939               .attr('cx', 0.5)
46940               .attr('cy', 1)
46941               .attr('rx', 6.5)
46942               .attr('ry', 3)
46943               .attr('class', 'stroke');
46944
46945           enter
46946               .append('path')
46947               .call(markerPath, 'stroke');
46948
46949           enter
46950               .append('use')
46951               .attr('transform', 'translate(-5, -19)')
46952               .attr('class', 'icon')
46953               .attr('width', '11px')
46954               .attr('height', '11px');
46955
46956           groups = groups
46957               .merge(enter)
46958               .attr('transform', svgPointTransform(projection))
46959               .call(svgTagClasses());
46960
46961           // Selecting the following implicitly
46962           // sets the data (point entity) on the element
46963           groups.select('.shadow');
46964           groups.select('.stroke');
46965           groups.select('.icon')
46966               .attr('xlink:href', function(entity) {
46967                   var preset = context.presets().match(entity, graph);
46968                   var picon = preset && preset.icon;
46969
46970                   if (!picon)
46971                       return '';
46972                   else {
46973                       var isMaki = dataFeatureIcons.indexOf(picon) !== -1;
46974                       return '#' + picon + (isMaki ? '-11' : '');
46975                   }
46976               });
46977
46978
46979           // touch targets
46980           selection.selectAll('.layer-points .layer-points-targets')
46981               .call(drawTargets, graph, points, filter);
46982       }
46983
46984
46985       return drawPoints;
46986   }
46987
46988   function svgTagClasses() {
46989       var primaries = [
46990               'building', 'highway', 'railway', 'waterway', 'aeroway',
46991               'motorway', 'boundary', 'power', 'amenity', 'natural', 'landuse',
46992               'leisure', 'military', 'place'
46993           ],
46994           statuses = [
46995               'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
46996               'razed', 'demolished', 'obliterated', 'intermittent'
46997           ],
46998           secondaries = [
46999               'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
47000               'surface', 'tracktype', 'crossing', 'service', 'sport'
47001           ],
47002           tagClassRe = /^tag-/,
47003           tags = function(entity) { return entity.tags; };
47004
47005
47006       var tagClasses = function(selection$$1) {
47007           selection$$1.each(function tagClassesEach(entity) {
47008               var value = this.className,
47009                   classes, primary, status;
47010
47011               if (value.baseVal !== undefined) value = value.baseVal;
47012
47013               classes = value.trim().split(/\s+/).filter(function(name) {
47014                   return name.length && !tagClassRe.test(name);
47015               }).join(' ');
47016
47017               var t = tags(entity), i, k, v;
47018
47019               // pick at most one primary classification tag..
47020               for (i = 0; i < primaries.length; i++) {
47021                   k = primaries[i];
47022                   v = t[k];
47023                   if (!v || v === 'no') continue;
47024
47025                   primary = k;
47026                   if (statuses.indexOf(v) !== -1) {   // e.g. `railway=abandoned`
47027                       status = v;
47028                       classes += ' tag-' + k;
47029                   } else {
47030                       classes += ' tag-' + k + ' tag-' + k + '-' + v;
47031                   }
47032
47033                   break;
47034               }
47035
47036               // add at most one status tag, only if relates to primary tag..
47037               if (!status) {
47038                   for (i = 0; i < statuses.length; i++) {
47039                       k = statuses[i];
47040                       v = t[k];
47041                       if (!v || v === 'no') continue;
47042
47043                       if (v === 'yes') {   // e.g. `railway=rail + abandoned=yes`
47044                           status = k;
47045                       }
47046                       else if (primary && primary === v) {  // e.g. `railway=rail + abandoned=railway`
47047                           status = k;
47048                       } else if (!primary && primaries.indexOf(v) !== -1) {  // e.g. `abandoned=railway`
47049                           status = k;
47050                           primary = v;
47051                           classes += ' tag-' + v;
47052                       }  // else ignore e.g.  `highway=path + abandoned=railway`
47053
47054                       if (status) break;
47055                   }
47056               }
47057
47058               if (status) {
47059                   classes += ' tag-status tag-status-' + status;
47060               }
47061
47062               // add any secondary (structure) tags
47063               for (i = 0; i < secondaries.length; i++) {
47064                   k = secondaries[i];
47065                   v = t[k];
47066                   if (!v || v === 'no') continue;
47067                   classes += ' tag-' + k + ' tag-' + k + '-' + v;
47068               }
47069
47070               // For highways, look for surface tagging..
47071               if (primary === 'highway') {
47072                   var paved = (t.highway !== 'track');
47073                   for (k in t) {
47074                       v = t[k];
47075                       if (k in osmPavedTags) {
47076                           paved = !!osmPavedTags[k][v];
47077                           break;
47078                       }
47079                   }
47080                   if (!paved) {
47081                       classes += ' tag-unpaved';
47082                   }
47083               }
47084
47085               classes = classes.trim();
47086
47087               if (classes !== value) {
47088                   d3_select(this).attr('class', classes);
47089               }
47090           });
47091       };
47092
47093
47094       tagClasses.tags = function(_) {
47095           if (!arguments.length) return tags;
47096           tags = _;
47097           return tagClasses;
47098       };
47099
47100       return tagClasses;
47101   }
47102
47103   function svgTurns(projection) {
47104
47105       return function drawTurns(selection, graph, turns) {
47106
47107           function icon(turn) {
47108               var u = turn.u ? '-u' : '';
47109               if (turn.no) return '#turn-no' + u;
47110               if (turn.only) return '#turn-only' + u;
47111               return '#turn-yes' + u;
47112           }
47113
47114           var layer = selection.selectAll('.data-layer-osm').selectAll('.layer-turns')
47115               .data([0]);
47116
47117           layer = layer.enter()
47118               .append('g')
47119               .attr('class', 'layer-osm layer-turns')
47120               .merge(layer);
47121
47122
47123           var groups = layer.selectAll('g.turn')
47124               .data(turns, function(d) { return d.key; });
47125
47126           groups.exit()
47127               .remove();
47128
47129
47130           var enter = groups.enter()
47131               .append('g')
47132               .attr('class', function(d) { return 'turn ' + d.key; });
47133
47134           var nEnter = enter
47135               .filter(function(d) { return !d.u; });
47136
47137           nEnter.append('rect')
47138               .attr('transform', 'translate(-22, -12)')
47139               .attr('width', '44')
47140               .attr('height', '24');
47141
47142           nEnter.append('use')
47143               .attr('transform', 'translate(-22, -12)')
47144               .attr('width', '44')
47145               .attr('height', '24');
47146
47147
47148           var uEnter = enter
47149               .filter(function(d) { return d.u; });
47150
47151           uEnter.append('circle')
47152               .attr('r', '16');
47153
47154           uEnter.append('use')
47155               .attr('transform', 'translate(-16, -16)')
47156               .attr('width', '32')
47157               .attr('height', '32');
47158
47159
47160           groups = groups
47161               .merge(enter);
47162
47163           groups
47164               .attr('opacity', function(d) {
47165                   return d.direct === false ? '0.7' : null;
47166               })
47167               .attr('transform', function(d) {
47168                   var pxRadius = 50;
47169                   var toWay = graph.entity(d.to.way);
47170                   var toPoints = graph.childNodes(toWay)
47171                       .map(function (n) { return n.loc; })
47172                       .map(projection);
47173                   var toLength = geoPathLength(toPoints);
47174                   var mid = toLength / 2;    // midpoint of destination way
47175
47176                   var toNode = graph.entity(d.to.node);
47177                   var toVertex = graph.entity(d.to.vertex);
47178                   var a = geoAngle(toVertex, toNode, projection);
47179                   var o = projection(toVertex.loc);
47180                   var r = d.u ? 0                  // u-turn: no radius
47181                       : !toWay.__via ? pxRadius    // leaf way: put marker at pxRadius
47182                       : Math.min(mid, pxRadius);   // via way: prefer pxRadius, fallback to mid for very short ways
47183
47184                   return 'translate(' + (r * Math.cos(a) + o[0]) + ',' + (r * Math.sin(a) + o[1]) + ') ' +
47185                       'rotate(' + a * 180 / Math.PI + ')';
47186               });
47187
47188           groups.select('use')
47189               .attr('xlink:href', icon);
47190
47191           groups.select('rect');
47192           groups.select('circle');
47193
47194           return this;
47195       };
47196   }
47197
47198   function svgVertices$$1(projection, context) {
47199       var radiuses = {
47200           //       z16-, z17,   z18+,  w/icon
47201           shadow: [6,    7.5,   7.5,   12],
47202           stroke: [2.5,  3.5,   3.5,   8],
47203           fill:   [1,    1.5,   1.5,   1.5]
47204       };
47205
47206       var _currHoverTarget;
47207       var _currPersistent = {};
47208       var _currHover = {};
47209       var _prevHover = {};
47210       var _currSelected = {};
47211       var _prevSelected = {};
47212       var _radii = {};
47213
47214
47215       function sortY(a, b) {
47216           return b.loc[1] - a.loc[1];
47217       }
47218
47219       // Avoid exit/enter if we're just moving stuff around.
47220       // The node will get a new version but we only need to run the update selection.
47221       function fastEntityKey(d) {
47222           var mode = context.mode();
47223           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
47224           return isMoving ? d.id : osmEntity$$1.key(d);
47225       }
47226
47227
47228       function draw(selection$$1, graph, vertices, sets, filter) {
47229           sets = sets || { selected: {}, important: {}, hovered: {} };
47230
47231           var icons = {};
47232           var directions = {};
47233           var wireframe = context.surface().classed('fill-wireframe');
47234           var zoom = geoScaleToZoom(projection.scale());
47235           var z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
47236
47237
47238           function getIcon(entity) {
47239               if (entity.id in icons) return icons[entity.id];
47240
47241               icons[entity.id] =
47242                   entity.hasInterestingTags() &&
47243                   context.presets().match(entity, graph).icon;
47244               return icons[entity.id];
47245           }
47246
47247
47248           // memoize directions results, return false for empty arrays (for use in filter)
47249           function getDirections(entity) {
47250               if (entity.id in directions) return directions[entity.id];
47251
47252               var angles = entity.directions(graph, projection);
47253               directions[entity.id] = angles.length ? angles : false;
47254               return angles;
47255           }
47256
47257
47258           function updateAttributes(selection$$1) {
47259               ['shadow', 'stroke', 'fill'].forEach(function(klass) {
47260                   var rads = radiuses[klass];
47261                   selection$$1.selectAll('.' + klass)
47262                       .each(function(entity) {
47263                           var i = z && getIcon(entity);
47264                           var r = rads[i ? 3 : z];
47265
47266                           // slightly increase the size of unconnected endpoints #3775
47267                           if (entity.isEndpoint(graph) && !entity.isConnected(graph)) {
47268                               r += 1.5;
47269                           }
47270
47271                           if (klass === 'shadow') {   // remember this value, so we don't need to
47272                               _radii[entity.id] = r;  // recompute it when we draw the touch targets
47273                           }
47274
47275                           d3_select(this)
47276                               .attr('r', r)
47277                               .attr('visibility', (i && klass === 'fill') ? 'hidden' : null);
47278                       });
47279               });
47280
47281               selection$$1.selectAll('use')
47282                   .attr('visibility', (z === 0 ? 'hidden' : null));
47283           }
47284
47285           vertices.sort(sortY);
47286
47287           var groups = selection$$1.selectAll('g.vertex')
47288               .filter(filter)
47289               .data(vertices, fastEntityKey);
47290
47291           // exit
47292           groups.exit()
47293               .remove();
47294
47295           // enter
47296           var enter = groups.enter()
47297               .append('g')
47298               .attr('class', function(d) { return 'node vertex ' + d.id; })
47299               .order();
47300
47301           enter
47302               .append('circle')
47303               .attr('class', 'shadow');
47304
47305           enter
47306               .append('circle')
47307               .attr('class', 'stroke');
47308
47309           // Vertices with icons get a `use`.
47310           enter.filter(function(d) { return getIcon(d); })
47311               .append('use')
47312               .attr('class', 'icon')
47313               .attr('width', '11px')
47314               .attr('height', '11px')
47315               .attr('transform', 'translate(-5.5, -5.5)')
47316               .attr('xlink:href', function(d) {
47317                   var picon = getIcon(d);
47318                   var isMaki = dataFeatureIcons.indexOf(picon) !== -1;
47319                   return '#' + picon + (isMaki ? '-11' : '');
47320               });
47321
47322           // Vertices with tags get a fill.
47323           enter.filter(function(d) { return d.hasInterestingTags(); })
47324               .append('circle')
47325               .attr('class', 'fill');
47326
47327           // update
47328           groups = groups
47329               .merge(enter)
47330               .attr('transform', svgPointTransform(projection))
47331               .classed('sibling', function(d) { return d.id in sets.selected; })
47332               .classed('shared', function(d) { return graph.isShared(d); })
47333               .classed('endpoint', function(d) { return d.isEndpoint(graph); })
47334               .call(updateAttributes);
47335
47336
47337           // Directional vertices get viewfields
47338           var dgroups = groups.filter(function(d) { return getDirections(d); })
47339               .selectAll('.viewfieldgroup')
47340               .data(function data$$1(d) { return zoom >= 18 ? [d] : []; }, osmEntity$$1.key);
47341
47342           // exit
47343           dgroups.exit()
47344               .remove();
47345
47346           // enter/update
47347           dgroups = dgroups.enter()
47348               .insert('g', '.shadow')
47349               .attr('class', 'viewfieldgroup')
47350               .merge(dgroups);
47351
47352           var viewfields = dgroups.selectAll('.viewfield')
47353               .data(getDirections, function key(d) { return d; });
47354
47355           // exit
47356           viewfields.exit()
47357               .remove();
47358
47359           // enter/update
47360           viewfields.enter()
47361               .append('path')
47362               .attr('class', 'viewfield')
47363               .attr('d', 'M0,0H0')
47364               .merge(viewfields)
47365               .attr('marker-start', 'url(#viewfield-marker' + (wireframe ? '-wireframe' : '') + ')')
47366               .attr('transform', function(d) { return 'rotate(' + d + ')'; });
47367       }
47368
47369
47370       function drawTargets(selection$$1, graph, entities, filter) {
47371           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
47372           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
47373           var getTransform = svgPointTransform(projection).geojson;
47374           var activeID = context.activeID();
47375           var data$$1 = { targets: [], nopes: [] };
47376
47377           entities.forEach(function(node) {
47378               if (activeID === node.id) return;   // draw no target on the activeID
47379
47380               var vertexType = svgPassiveVertex(node, graph, activeID);
47381               if (vertexType !== 0) {     // passive or adjacent - allow to connect
47382                   data$$1.targets.push({
47383                       type: 'Feature',
47384                       id: node.id,
47385                       properties: {
47386                           target: true,
47387                           entity: node
47388                       },
47389                       geometry: node.asGeoJSON()
47390                   });
47391               } else {
47392                   data$$1.nopes.push({
47393                       type: 'Feature',
47394                       id: node.id + '-nope',
47395                       properties: {
47396                           nope: true,
47397                           target: true,
47398                           entity: node
47399                       },
47400                       geometry: node.asGeoJSON()
47401                   });
47402               }
47403           });
47404
47405
47406           // Targets allow hover and vertex snapping
47407           var targets = selection$$1.selectAll('.vertex.target-allowed')
47408               .filter(function(d) { return filter(d.properties.entity); })
47409               .data(data$$1.targets, function key(d) { return d.id; });
47410
47411           // exit
47412           targets.exit()
47413               .remove();
47414
47415           // enter/update
47416           targets.enter()
47417               .append('circle')
47418               .attr('r', function(d) { return (_radii[d.id] || radiuses.shadow[3]); })
47419               .merge(targets)
47420               .attr('class', function(d) { return 'node vertex target target-allowed ' + targetClass + d.id; })
47421               .attr('transform', getTransform);
47422
47423
47424           // NOPE
47425           var nopes = selection$$1.selectAll('.vertex.target-nope')
47426               .filter(function(d) { return filter(d.properties.entity); })
47427               .data(data$$1.nopes, function key(d) { return d.id; });
47428
47429           // exit
47430           nopes.exit()
47431               .remove();
47432
47433           // enter/update
47434           nopes.enter()
47435               .append('circle')
47436               .attr('r', function(d) { return (_radii[d.properties.entity.id] || radiuses.shadow[3]); })
47437               .merge(nopes)
47438               .attr('class', function(d) { return 'node vertex target target-nope ' + nopeClass + d.id; })
47439               .attr('transform', getTransform);
47440       }
47441
47442
47443       // Points can also render as vertices:
47444       // 1. in wireframe mode or
47445       // 2. at higher zooms if they have a direction
47446       function renderAsVertex(entity, graph, wireframe, zoom) {
47447           var geometry = entity.geometry(graph);
47448           return geometry === 'vertex' || (geometry === 'point' && (
47449               wireframe || (zoom >= 18 && entity.directions(graph, projection).length)
47450           ));
47451       }
47452
47453
47454       function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
47455           var results = {};
47456
47457           function addChildVertices(entity) {
47458               var geometry = entity.geometry(graph);
47459               if (!context.features().isHiddenFeature(entity, graph, geometry)) {
47460                   var i;
47461                   if (entity.type === 'way') {
47462                       for (i = 0; i < entity.nodes.length; i++) {
47463                           var child = graph.hasEntity(entity.nodes[i]);
47464                           if (child) {
47465                               addChildVertices(child);
47466                           }
47467                       }
47468                   } else if (entity.type === 'relation') {
47469                       for (i = 0; i < entity.members.length; i++) {
47470                           var member = graph.hasEntity(entity.members[i].id);
47471                           if (member) {
47472                               addChildVertices(member);
47473                           }
47474                       }
47475                   } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
47476                       results[entity.id] = entity;
47477                   }
47478               }
47479           }
47480
47481           ids.forEach(function(id) {
47482               var entity = graph.hasEntity(id);
47483               if (!entity) return;
47484
47485               if (entity.type === 'node') {
47486                   if (renderAsVertex(entity, graph, wireframe, zoom)) {
47487                       results[entity.id] = entity;
47488                       graph.parentWays(entity).forEach(function(entity) {
47489                           addChildVertices(entity);
47490                       });
47491                   }
47492               } else {  // way, relation
47493                   addChildVertices(entity);
47494               }
47495           });
47496
47497           return results;
47498       }
47499
47500
47501       function drawVertices(selection$$1, graph, entities, filter, extent, fullRedraw) {
47502           var wireframe = context.surface().classed('fill-wireframe');
47503           var zoom = geoScaleToZoom(projection.scale());
47504           var mode = context.mode();
47505           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
47506
47507           if (fullRedraw) {
47508               _currPersistent = {};
47509               _radii = {};
47510           }
47511
47512           // Collect important vertices from the `entities` list..
47513           // (during a paritial redraw, it will not contain everything)
47514           for (var i = 0; i < entities.length; i++) {
47515               var entity = entities[i];
47516               var geometry = entity.geometry(graph);
47517               var keep = false;
47518
47519               // a point that looks like a vertex..
47520               if ((geometry === 'point') && renderAsVertex(entity, graph, wireframe, zoom)) {
47521                   _currPersistent[entity.id] = entity;
47522                   keep = true;
47523
47524               // a vertex of some importance..
47525               } else if (geometry === 'vertex' &&
47526                   (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph))) {
47527                   _currPersistent[entity.id] = entity;
47528                   keep = true;
47529               }
47530
47531               // whatever this is, it's not a persistent vertex..
47532               if (!keep && !fullRedraw) {
47533                   delete _currPersistent[entity.id];
47534               }
47535           }
47536
47537           // 3 sets of vertices to consider:
47538           var sets = {
47539               persistent: _currPersistent,  // persistent = important vertices (render always)
47540               selected: _currSelected,      // selected + siblings of selected (render always)
47541               hovered: _currHover           // hovered + siblings of hovered (render only in draw modes)
47542           };
47543
47544           var all = assign({}, (isMoving ? _currHover : {}), _currSelected, _currPersistent);
47545
47546           // Draw the vertices..
47547           // The filter function controls the scope of what objects d3 will touch (exit/enter/update)
47548           // Adjust the filter function to expand the scope beyond whatever entities were passed in.
47549           var filterRendered = function(d) {
47550               return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter(d);
47551           };
47552           selection$$1.selectAll('.layer-points .layer-points-vertices')
47553               .call(draw, graph, currentVisible(all), sets, filterRendered);
47554
47555           // Draw touch targets..
47556           // When drawing, render all targets (not just those affected by a partial redraw)
47557           var filterTouch = function(d) {
47558               return isMoving ? true : filterRendered(d);
47559           };
47560           selection$$1.selectAll('.layer-points .layer-points-targets')
47561               .call(drawTargets, graph, currentVisible(all), filterTouch);
47562
47563
47564           function currentVisible(which) {
47565               return Object.keys(which)
47566                   .map(graph.hasEntity, graph)     // the current version of this entity
47567                   .filter(function (entity) { return entity && entity.intersects(extent, graph); });
47568           }
47569       }
47570
47571
47572       // partial redraw - only update the selected items..
47573       drawVertices.drawSelected = function(selection$$1, graph, extent) {
47574           var wireframe = context.surface().classed('fill-wireframe');
47575           var zoom = geoScaleToZoom(projection.scale());
47576
47577           _prevSelected = _currSelected || {};
47578           _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
47579
47580           // note that drawVertices will add `_currSelected` automatically if needed..
47581           var filter = function(d) { return d.id in _prevSelected; };
47582           drawVertices(selection$$1, graph, values$1(_prevSelected), filter, extent, false);
47583       };
47584
47585
47586       // partial redraw - only update the hovered items..
47587       drawVertices.drawHover = function(selection$$1, graph, target, extent) {
47588           if (target === _currHoverTarget) return;  // continue only if something changed
47589
47590           var wireframe = context.surface().classed('fill-wireframe');
47591           var zoom = geoScaleToZoom(projection.scale());
47592
47593           _prevHover = _currHover || {};
47594           _currHoverTarget = target;
47595           var entity = target && target.properties && target.properties.entity;
47596
47597           if (entity) {
47598               _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
47599           } else {
47600               _currHover = {};
47601           }
47602
47603           // note that drawVertices will add `_currHover` automatically if needed..
47604           var filter = function(d) { return d.id in _prevHover; };
47605           drawVertices(selection$$1, graph, values$1(_prevHover), filter, extent, false);
47606       };
47607
47608       return drawVertices;
47609   }
47610
47611   function uiAccount(context) {
47612       var osm = context.connection();
47613
47614
47615       function update(selection$$1) {
47616           if (!osm) return;
47617
47618           if (!osm.authenticated()) {
47619               selection$$1.selectAll('#userLink, #logoutLink')
47620                   .classed('hide', true);
47621               return;
47622           }
47623
47624           osm.userDetails(function(err, details) {
47625               var userLink = selection$$1.select('#userLink'),
47626                   logoutLink = selection$$1.select('#logoutLink');
47627
47628               userLink.html('');
47629               logoutLink.html('');
47630
47631               if (err) return;
47632
47633               selection$$1.selectAll('#userLink, #logoutLink')
47634                   .classed('hide', false);
47635
47636               // Link
47637               userLink.append('a')
47638                   .attr('href', osm.userURL(details.display_name))
47639                   .attr('target', '_blank');
47640
47641               // Add thumbnail or dont
47642               if (details.image_url) {
47643                   userLink.append('img')
47644                       .attr('class', 'icon pre-text user-icon')
47645                       .attr('src', details.image_url);
47646               } else {
47647                   userLink
47648                       .call(svgIcon('#icon-avatar', 'pre-text light'));
47649               }
47650
47651               // Add user name
47652               userLink.append('span')
47653                   .attr('class', 'label')
47654                   .text(details.display_name);
47655
47656               logoutLink.append('a')
47657                   .attr('class', 'logout')
47658                   .attr('href', '#')
47659                   .text(t('logout'))
47660                   .on('click.logout', function() {
47661                       event.preventDefault();
47662                       osm.logout();
47663                   });
47664           });
47665       }
47666
47667
47668       return function(selection$$1) {
47669           selection$$1.append('li')
47670               .attr('id', 'logoutLink')
47671               .classed('hide', true);
47672
47673           selection$$1.append('li')
47674               .attr('id', 'userLink')
47675               .classed('hide', true);
47676
47677           if (osm) {
47678               osm.on('change.account', function() { update(selection$$1); });
47679               update(selection$$1);
47680           }
47681       };
47682   }
47683
47684   function uiAttribution(context) {
47685       var selection$$1;
47686
47687
47688       function attribution(data, klass) {
47689           var div = selection$$1.selectAll('.' + klass)
47690               .data([0]);
47691
47692           div = div.enter()
47693               .append('div')
47694               .attr('class', klass)
47695               .merge(div);
47696
47697
47698           var background = div.selectAll('.attribution')
47699               .data(data, function(d) { return d.name(); });
47700
47701           background.exit()
47702               .remove();
47703
47704           background = background.enter()
47705               .append('span')
47706               .attr('class', 'attribution')
47707               .each(function(d) {
47708                   if (d.terms_html) {
47709                       d3_select(this)
47710                           .html(d.terms_html);
47711                       return;
47712                   }
47713
47714                   var selection$$1;
47715                   if (d.terms_url) {
47716                       selection$$1 = d3_select(this)
47717                           .append('a')
47718                           .attr('href', d.terms_url)
47719                           .attr('target', '_blank');
47720                   } else {
47721                       selection$$1 = d3_select(this);
47722                   }
47723
47724
47725                   var id_safe = d.id.replace('.', '<TX_DOT>');
47726                   var terms_text = t('imagery.' + id_safe + '.attribution.text',
47727                       { default: d.terms_text || d.id || d.name() }
47728                   );
47729
47730                   if (d.icon && !d.overlay) {
47731                       selection$$1
47732                           .append('img')
47733                           .attr('class', 'source-image')
47734                           .attr('src', d.icon);
47735                   }
47736
47737                   selection$$1
47738                       .append('span')
47739                       .attr('class', 'attribution-text')
47740                       .text(terms_text);
47741               })
47742               .merge(background);
47743
47744
47745           var copyright = background.selectAll('.copyright-notice')
47746               .data(function(d) {
47747                   var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
47748                   return notice ? [notice] : [];
47749               });
47750
47751           copyright.exit()
47752               .remove();
47753
47754           copyright = copyright.enter()
47755               .append('span')
47756               .attr('class', 'copyright-notice')
47757               .merge(copyright);
47758
47759           copyright
47760               .text(String);
47761       }
47762
47763
47764       function update() {
47765           attribution([context.background().baseLayerSource()], 'base-layer-attribution');
47766           attribution(context.background().overlayLayerSources().filter(function (s) {
47767               return s.validZoom(context.map().zoom());
47768           }), 'overlay-layer-attribution');
47769       }
47770
47771
47772       return function(select$$1) {
47773           selection$$1 = select$$1;
47774
47775           context.background()
47776               .on('change.attribution', update);
47777
47778           context.map()
47779               .on('move.attribution', throttle(update, 400, {leading: false}));
47780
47781           update();
47782       };
47783   }
47784
47785   // toggles the visibility of ui elements, using a combination of the
47786   // hide class, which sets display=none, and a d3 transition for opacity.
47787   // this will cause blinking when called repeatedly, so check that the
47788   // value actually changes between calls.
47789   function uiToggle(show, callback) {
47790       return function(selection$$1) {
47791           selection$$1
47792               .style('opacity', show ? 0 : 1)
47793               .classed('hide', false)
47794               .transition()
47795               .style('opacity', show ? 1 : 0)
47796               .on('end', function() {
47797                   d3_select(this)
47798                       .classed('hide', !show)
47799                       .style('opacity', null);
47800                   if (callback) callback.apply(this);
47801               });
47802       };
47803   }
47804
47805   function uiDisclosure(context, key, expandedDefault) {
47806       var dispatch$$1 = dispatch('toggled'),
47807           _preference = (context.storage('disclosure.' + key + '.expanded')),
47808           _expanded = (_preference === null ? !!expandedDefault : (_preference === 'true')),
47809           _title,
47810           _updatePreference = true,
47811           _content = function () {};
47812
47813
47814       var disclosure = function(selection$$1) {
47815           var hideToggle = selection$$1.selectAll('.hide-toggle-' + key)
47816               .data([0]);
47817
47818           // enter
47819           var hideToggleEnter = hideToggle.enter()
47820               .append('a')
47821               .attr('href', '#')
47822               .attr('class', 'hide-toggle hide-toggle-' + key)
47823               .call(svgIcon('', 'pre-text', 'hide-toggle-icon'));
47824
47825           hideToggleEnter
47826               .append('span')
47827               .attr('class', 'hide-toggle-text');
47828
47829           // update
47830           hideToggle = hideToggleEnter
47831               .merge(hideToggle);
47832
47833           hideToggle
47834               .on('click', toggle)
47835               .classed('expanded', _expanded);
47836
47837           hideToggle.selectAll('.hide-toggle-text')
47838               .text(_title);
47839
47840           hideToggle.selectAll('.hide-toggle-icon')
47841               .attr('xlink:href', _expanded ? '#icon-down'
47842                   : (textDirection === 'rtl') ? '#icon-backward' : '#icon-forward'
47843               );
47844
47845
47846           var wrap = selection$$1.selectAll('.disclosure-wrap')
47847               .data([0]);
47848
47849           wrap = wrap.enter()
47850               .append('div')
47851               .attr('class', 'disclosure-wrap disclosure-wrap-' + key)
47852               .merge(wrap);
47853
47854           wrap
47855               .classed('hide', !_expanded)
47856               .call(_content);
47857
47858
47859           function toggle() {
47860               event.preventDefault();
47861
47862               _expanded = !_expanded;
47863
47864               if (_updatePreference) {
47865                   context.storage('disclosure.' + key + '.expanded', _expanded);
47866               }
47867
47868               hideToggle
47869                   .classed('expanded', _expanded);
47870
47871               hideToggle.selectAll('.hide-toggle-icon')
47872                   .attr('xlink:href', _expanded ? '#icon-down'
47873                       : (textDirection === 'rtl') ? '#icon-backward' : '#icon-forward'
47874                   );
47875
47876               wrap
47877                   .call(uiToggle(_expanded));
47878
47879               dispatch$$1.call('toggled', this, _expanded);
47880           }
47881       };
47882
47883
47884       disclosure.title = function(_) {
47885           if (!arguments.length) return _title;
47886           _title = _;
47887           return disclosure;
47888       };
47889
47890
47891       disclosure.expanded = function(_) {
47892           if (!arguments.length) return _expanded;
47893           _expanded = _;
47894           return disclosure;
47895       };
47896
47897
47898       disclosure.updatePreference = function(_) {
47899           if (!arguments.length) return _updatePreference;
47900           _updatePreference = _;
47901           return disclosure;
47902       };
47903
47904
47905       disclosure.content = function(_) {
47906           if (!arguments.length) return _content;
47907           _content = _;
47908           return disclosure;
47909       };
47910
47911
47912       return utilRebind(disclosure, dispatch$$1, 'on');
47913   }
47914
47915   function uiBackgroundDisplayOptions(context) {
47916       var detected = utilDetect();
47917       var storedOpacity = context.storage('background-opacity');
47918       var minVal = 0.25;
47919       var maxVal = detected.cssfilters ? 2 : 1;
47920
47921       var sliders = detected.cssfilters
47922           ? ['brightness', 'contrast', 'saturation', 'sharpness']
47923           : ['brightness'];
47924
47925       var _options = {
47926           brightness: (storedOpacity !== null ? (+storedOpacity) : 1),
47927           contrast: 1,
47928           saturation: 1,
47929           sharpness: 1
47930       };
47931
47932       var _selection = d3_select(null);
47933
47934
47935       function clamp(x, min, max) {
47936           return Math.max(min, Math.min(x, max));
47937       }
47938
47939
47940       function updateValue(d, val) {
47941           if (!val && event && event.target) {
47942               val = event.target.value;
47943           }
47944
47945           val = clamp(val, minVal, maxVal);
47946
47947           _options[d] = val;
47948           context.background()[d](val);
47949
47950           if (d === 'brightness') {
47951               context.storage('background-opacity', val);
47952           }
47953
47954           _selection
47955               .call(render);
47956       }
47957
47958
47959       function render(selection$$1) {
47960           var container = selection$$1.selectAll('.display-options-container')
47961               .data([0]);
47962
47963           var containerEnter = container.enter()
47964               .append('div')
47965               .attr('class', 'display-options-container controls-list');
47966
47967           // add slider controls
47968           var slidersEnter = containerEnter.selectAll('.display-control')
47969               .data(sliders)
47970               .enter()
47971               .append('div')
47972               .attr('class', function(d) { return 'display-control display-control-' + d; });
47973
47974           slidersEnter
47975               .append('h5')
47976               .text(function(d) { return t('background.' + d); })
47977               .append('span')
47978               .attr('class', function(d) { return 'display-option-value display-option-value-' + d; });
47979
47980           slidersEnter
47981               .append('input')
47982               .attr('class', function(d) { return 'display-option-input display-option-input-' + d; })
47983               .attr('type', 'range')
47984               .attr('min', minVal)
47985               .attr('max', maxVal)
47986               .attr('step', '0.05')
47987               .on('input', function(d) {
47988                   var val = d3_select(this).property('value');
47989                   updateValue(d, val);
47990               });
47991
47992           slidersEnter
47993               .append('button')
47994               .attr('title', t('background.reset'))
47995               .attr('class', function(d) { return 'display-option-reset display-option-reset-' + d; })
47996               .on('click', function(d) {
47997                   if (event.button !== 0) return;
47998                   updateValue(d, 1);
47999               })
48000               .call(svgIcon('#icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
48001
48002
48003           // update
48004           container = containerEnter
48005               .merge(container);
48006
48007           container.selectAll('.display-option-input')
48008               .property('value', function(d) { return _options[d]; });
48009
48010           container.selectAll('.display-option-value')
48011               .text(function(d) { return Math.floor(_options[d] * 100) + '%'; });
48012
48013           container.selectAll('.display-option-reset')
48014               .classed('disabled', function(d) { return _options[d] === 1; });
48015
48016           // first time only, set brightness if needed
48017           if (containerEnter.size() && _options.brightness !== 1) {
48018               context.background().brightness(_options.brightness);
48019           }
48020       }
48021
48022
48023       function backgroundDisplayOptions(selection$$1) {
48024           _selection = selection$$1;
48025
48026           selection$$1
48027               .call(uiDisclosure(context, 'background_display_options', true)
48028                   .title(t('background.display_options'))
48029                   .content(render)
48030               );
48031       }
48032
48033
48034       return backgroundDisplayOptions;
48035   }
48036
48037   function uiBackgroundOffset(context) {
48038       var directions = [
48039           ['right', [0.5, 0]],
48040           ['top', [0, -0.5]],
48041           ['left', [-0.5, 0]],
48042           ['bottom', [0, 0.5]]
48043       ];
48044
48045
48046       function d3_eventCancel() {
48047           event.stopPropagation();
48048           event.preventDefault();
48049       }
48050
48051
48052       function updateValue() {
48053           var meters = geoOffsetToMeters(context.background().offset());
48054           var x = +meters[0].toFixed(2);
48055           var y = +meters[1].toFixed(2);
48056
48057           d3_selectAll('.nudge-inner-rect')
48058               .select('input')
48059               .classed('error', false)
48060               .property('value', x + ', ' + y);
48061
48062           d3_selectAll('.nudge-reset')
48063               .classed('disabled', function() {
48064                   return (x === 0 && y === 0);
48065               });
48066       }
48067
48068
48069       function resetOffset() {
48070           context.background().offset([0, 0]);
48071           updateValue();
48072       }
48073
48074
48075       function nudge(d) {
48076           context.background().nudge(d, context.map().zoom());
48077           updateValue();
48078       }
48079
48080
48081       function clickNudgeButton(d) {
48082           var interval;
48083           var timeout = window.setTimeout(function() {
48084                   interval = window.setInterval(nudge.bind(null, d), 100);
48085               }, 500);
48086
48087           function doneNudge() {
48088               window.clearTimeout(timeout);
48089               window.clearInterval(interval);
48090               d3_select(window)
48091                   .on('mouseup.buttonoffset', null, true)
48092                   .on('mousedown.buttonoffset', null, true);
48093           }
48094
48095           d3_select(window)
48096               .on('mouseup.buttonoffset', doneNudge, true)
48097               .on('mousedown.buttonoffset', doneNudge, true);
48098
48099           nudge(d);
48100       }
48101
48102
48103       function inputOffset() {
48104           var input = d3_select(this);
48105           var d = input.node().value;
48106
48107           if (d === '') return resetOffset();
48108
48109           d = d.replace(/;/g, ',').split(',').map(function(n) {
48110               // if n is NaN, it will always get mapped to false.
48111               return !isNaN(n) && n;
48112           });
48113
48114           if (d.length !== 2 || !d[0] || !d[1]) {
48115               input.classed('error', true);
48116               return;
48117           }
48118
48119           context.background().offset(geoMetersToOffset(d));
48120           updateValue();
48121       }
48122
48123
48124       function dragOffset() {
48125           event.preventDefault();
48126           if (event.button !== 0) return;
48127
48128           var origin = [event.clientX, event.clientY];
48129
48130           context.container()
48131               .append('div')
48132               .attr('class', 'nudge-surface');
48133
48134           d3_select(window)
48135               .on('mousemove.offset', function() {
48136                   var latest = [event.clientX, event.clientY];
48137                   var d = [
48138                       -(origin[0] - latest[0]) / 4,
48139                       -(origin[1] - latest[1]) / 4
48140                   ];
48141
48142                   origin = latest;
48143                   nudge(d);
48144               })
48145               .on('mouseup.offset', function() {
48146                   if (event.button !== 0) return;
48147                   d3_selectAll('.nudge-surface')
48148                       .remove();
48149
48150                   d3_select(window)
48151                       .on('mousemove.offset', null)
48152                       .on('mouseup.offset', null);
48153               });
48154       }
48155
48156
48157       function render(selection$$1) {
48158           var container = selection$$1.selectAll('.nudge-container')
48159               .data([0]);
48160
48161           var containerEnter = container.enter()
48162               .append('div')
48163               .attr('class', 'nudge-container cf');
48164
48165           containerEnter
48166               .append('div')
48167               .attr('class', 'nudge-instructions')
48168               .text(t('background.offset'));
48169
48170           var nudgeEnter = containerEnter
48171               .append('div')
48172               .attr('class', 'nudge-outer-rect')
48173               .on('mousedown', dragOffset);
48174
48175           nudgeEnter
48176               .append('div')
48177               .attr('class', 'nudge-inner-rect')
48178               .append('input')
48179               .on('change', inputOffset);
48180
48181           containerEnter
48182               .append('div')
48183               .selectAll('button')
48184               .data(directions).enter()
48185               .append('button')
48186               .attr('class', function(d) { return d[0] + ' nudge'; })
48187               .on('contextmenu', d3_eventCancel)
48188               .on('mousedown', function(d) {
48189                   if (event.button !== 0) return;
48190                   clickNudgeButton(d[1]);
48191               });
48192
48193           containerEnter
48194               .append('button')
48195               .attr('title', t('background.reset'))
48196               .attr('class', 'nudge-reset disabled')
48197               .on('contextmenu', d3_eventCancel)
48198               .on('click', function() {
48199                   if (event.button !== 0) return;
48200                   resetOffset();
48201               })
48202               .call(svgIcon('#icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
48203
48204           updateValue();
48205       }
48206
48207
48208       function backgroundOffset(selection$$1) {
48209           selection$$1
48210               .call(uiDisclosure(context, 'background_offset', false)
48211                   .title(t('background.fix_misalignment'))
48212                   .content(render)
48213               );
48214       }
48215
48216
48217       context.background()
48218           .on('change.backgroundOffset-update', updateValue);
48219
48220       return backgroundOffset;
48221   }
48222
48223   var marked = createCommonjsModule(function (module, exports) {
48224   (function(root) {
48225
48226   /**
48227    * Block-Level Grammar
48228    */
48229
48230   var block = {
48231     newline: /^\n+/,
48232     code: /^( {4}[^\n]+\n*)+/,
48233     fences: noop,
48234     hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
48235     heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,
48236     nptable: noop,
48237     blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
48238     list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
48239     html: /^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,
48240     def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
48241     table: noop,
48242     lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
48243     paragraph: /^([^\n]+(?:\n?(?!hr|heading|lheading| {0,3}>|tag)[^\n]+)+)/,
48244     text: /^[^\n]+/
48245   };
48246
48247   block._label = /(?:\\[\[\]]|[^\[\]])+/;
48248   block._title = /(?:"(?:\\"|[^"]|"[^"\n]*")*"|'\n?(?:[^'\n]+\n?)*'|\([^()]*\))/;
48249   block.def = edit(block.def)
48250     .replace('label', block._label)
48251     .replace('title', block._title)
48252     .getRegex();
48253
48254   block.bullet = /(?:[*+-]|\d+\.)/;
48255   block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
48256   block.item = edit(block.item, 'gm')
48257     .replace(/bull/g, block.bullet)
48258     .getRegex();
48259
48260   block.list = edit(block.list)
48261     .replace(/bull/g, block.bullet)
48262     .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
48263     .replace('def', '\\n+(?=' + block.def.source + ')')
48264     .getRegex();
48265
48266   block._tag = '(?!(?:'
48267     + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code'
48268     + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo'
48269     + '|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b';
48270
48271   block.html = edit(block.html)
48272     .replace('comment', /<!--[\s\S]*?-->/)
48273     .replace('closed', /<(tag)[\s\S]+?<\/\1>/)
48274     .replace('closing', /<tag(?:"[^"]*"|'[^']*'|\s[^'"\/>\s]*)*?\/?>/)
48275     .replace(/tag/g, block._tag)
48276     .getRegex();
48277
48278   block.paragraph = edit(block.paragraph)
48279     .replace('hr', block.hr)
48280     .replace('heading', block.heading)
48281     .replace('lheading', block.lheading)
48282     .replace('tag', '<' + block._tag)
48283     .getRegex();
48284
48285   block.blockquote = edit(block.blockquote)
48286     .replace('paragraph', block.paragraph)
48287     .getRegex();
48288
48289   /**
48290    * Normal Block Grammar
48291    */
48292
48293   block.normal = merge({}, block);
48294
48295   /**
48296    * GFM Block Grammar
48297    */
48298
48299   block.gfm = merge({}, block.normal, {
48300     fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\n? *\1 *(?:\n+|$)/,
48301     paragraph: /^/,
48302     heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
48303   });
48304
48305   block.gfm.paragraph = edit(block.paragraph)
48306     .replace('(?!', '(?!'
48307       + block.gfm.fences.source.replace('\\1', '\\2') + '|'
48308       + block.list.source.replace('\\1', '\\3') + '|')
48309     .getRegex();
48310
48311   /**
48312    * GFM + Tables Block Grammar
48313    */
48314
48315   block.tables = merge({}, block.gfm, {
48316     nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,
48317     table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/
48318   });
48319
48320   /**
48321    * Block Lexer
48322    */
48323
48324   function Lexer(options) {
48325     this.tokens = [];
48326     this.tokens.links = {};
48327     this.options = options || marked.defaults;
48328     this.rules = block.normal;
48329
48330     if (this.options.gfm) {
48331       if (this.options.tables) {
48332         this.rules = block.tables;
48333       } else {
48334         this.rules = block.gfm;
48335       }
48336     }
48337   }
48338
48339   /**
48340    * Expose Block Rules
48341    */
48342
48343   Lexer.rules = block;
48344
48345   /**
48346    * Static Lex Method
48347    */
48348
48349   Lexer.lex = function(src, options) {
48350     var lexer = new Lexer(options);
48351     return lexer.lex(src);
48352   };
48353
48354   /**
48355    * Preprocessing
48356    */
48357
48358   Lexer.prototype.lex = function(src) {
48359     src = src
48360       .replace(/\r\n|\r/g, '\n')
48361       .replace(/\t/g, '    ')
48362       .replace(/\u00a0/g, ' ')
48363       .replace(/\u2424/g, '\n');
48364
48365     return this.token(src, true);
48366   };
48367
48368   /**
48369    * Lexing
48370    */
48371
48372   Lexer.prototype.token = function(src, top) {
48373     src = src.replace(/^ +$/gm, '');
48374     var next,
48375         loose,
48376         cap,
48377         bull,
48378         b,
48379         item,
48380         space,
48381         i,
48382         tag,
48383         l,
48384         isordered;
48385
48386     while (src) {
48387       // newline
48388       if (cap = this.rules.newline.exec(src)) {
48389         src = src.substring(cap[0].length);
48390         if (cap[0].length > 1) {
48391           this.tokens.push({
48392             type: 'space'
48393           });
48394         }
48395       }
48396
48397       // code
48398       if (cap = this.rules.code.exec(src)) {
48399         src = src.substring(cap[0].length);
48400         cap = cap[0].replace(/^ {4}/gm, '');
48401         this.tokens.push({
48402           type: 'code',
48403           text: !this.options.pedantic
48404             ? cap.replace(/\n+$/, '')
48405             : cap
48406         });
48407         continue;
48408       }
48409
48410       // fences (gfm)
48411       if (cap = this.rules.fences.exec(src)) {
48412         src = src.substring(cap[0].length);
48413         this.tokens.push({
48414           type: 'code',
48415           lang: cap[2],
48416           text: cap[3] || ''
48417         });
48418         continue;
48419       }
48420
48421       // heading
48422       if (cap = this.rules.heading.exec(src)) {
48423         src = src.substring(cap[0].length);
48424         this.tokens.push({
48425           type: 'heading',
48426           depth: cap[1].length,
48427           text: cap[2]
48428         });
48429         continue;
48430       }
48431
48432       // table no leading pipe (gfm)
48433       if (top && (cap = this.rules.nptable.exec(src))) {
48434         src = src.substring(cap[0].length);
48435
48436         item = {
48437           type: 'table',
48438           header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
48439           align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
48440           cells: cap[3].replace(/\n$/, '').split('\n')
48441         };
48442
48443         for (i = 0; i < item.align.length; i++) {
48444           if (/^ *-+: *$/.test(item.align[i])) {
48445             item.align[i] = 'right';
48446           } else if (/^ *:-+: *$/.test(item.align[i])) {
48447             item.align[i] = 'center';
48448           } else if (/^ *:-+ *$/.test(item.align[i])) {
48449             item.align[i] = 'left';
48450           } else {
48451             item.align[i] = null;
48452           }
48453         }
48454
48455         for (i = 0; i < item.cells.length; i++) {
48456           item.cells[i] = item.cells[i].split(/ *\| */);
48457         }
48458
48459         this.tokens.push(item);
48460
48461         continue;
48462       }
48463
48464       // hr
48465       if (cap = this.rules.hr.exec(src)) {
48466         src = src.substring(cap[0].length);
48467         this.tokens.push({
48468           type: 'hr'
48469         });
48470         continue;
48471       }
48472
48473       // blockquote
48474       if (cap = this.rules.blockquote.exec(src)) {
48475         src = src.substring(cap[0].length);
48476
48477         this.tokens.push({
48478           type: 'blockquote_start'
48479         });
48480
48481         cap = cap[0].replace(/^ *> ?/gm, '');
48482
48483         // Pass `top` to keep the current
48484         // "toplevel" state. This is exactly
48485         // how markdown.pl works.
48486         this.token(cap, top);
48487
48488         this.tokens.push({
48489           type: 'blockquote_end'
48490         });
48491
48492         continue;
48493       }
48494
48495       // list
48496       if (cap = this.rules.list.exec(src)) {
48497         src = src.substring(cap[0].length);
48498         bull = cap[2];
48499         isordered = bull.length > 1;
48500
48501         this.tokens.push({
48502           type: 'list_start',
48503           ordered: isordered,
48504           start: isordered ? +bull : ''
48505         });
48506
48507         // Get each top-level item.
48508         cap = cap[0].match(this.rules.item);
48509
48510         next = false;
48511         l = cap.length;
48512         i = 0;
48513
48514         for (; i < l; i++) {
48515           item = cap[i];
48516
48517           // Remove the list item's bullet
48518           // so it is seen as the next token.
48519           space = item.length;
48520           item = item.replace(/^ *([*+-]|\d+\.) +/, '');
48521
48522           // Outdent whatever the
48523           // list item contains. Hacky.
48524           if (~item.indexOf('\n ')) {
48525             space -= item.length;
48526             item = !this.options.pedantic
48527               ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
48528               : item.replace(/^ {1,4}/gm, '');
48529           }
48530
48531           // Determine whether the next list item belongs here.
48532           // Backpedal if it does not belong in this list.
48533           if (this.options.smartLists && i !== l - 1) {
48534             b = block.bullet.exec(cap[i + 1])[0];
48535             if (bull !== b && !(bull.length > 1 && b.length > 1)) {
48536               src = cap.slice(i + 1).join('\n') + src;
48537               i = l - 1;
48538             }
48539           }
48540
48541           // Determine whether item is loose or not.
48542           // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
48543           // for discount behavior.
48544           loose = next || /\n\n(?!\s*$)/.test(item);
48545           if (i !== l - 1) {
48546             next = item.charAt(item.length - 1) === '\n';
48547             if (!loose) loose = next;
48548           }
48549
48550           this.tokens.push({
48551             type: loose
48552               ? 'loose_item_start'
48553               : 'list_item_start'
48554           });
48555
48556           // Recurse.
48557           this.token(item, false);
48558
48559           this.tokens.push({
48560             type: 'list_item_end'
48561           });
48562         }
48563
48564         this.tokens.push({
48565           type: 'list_end'
48566         });
48567
48568         continue;
48569       }
48570
48571       // html
48572       if (cap = this.rules.html.exec(src)) {
48573         src = src.substring(cap[0].length);
48574         this.tokens.push({
48575           type: this.options.sanitize
48576             ? 'paragraph'
48577             : 'html',
48578           pre: !this.options.sanitizer
48579             && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
48580           text: cap[0]
48581         });
48582         continue;
48583       }
48584
48585       // def
48586       if (top && (cap = this.rules.def.exec(src))) {
48587         src = src.substring(cap[0].length);
48588         if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
48589         tag = cap[1].toLowerCase();
48590         if (!this.tokens.links[tag]) {
48591           this.tokens.links[tag] = {
48592             href: cap[2],
48593             title: cap[3]
48594           };
48595         }
48596         continue;
48597       }
48598
48599       // table (gfm)
48600       if (top && (cap = this.rules.table.exec(src))) {
48601         src = src.substring(cap[0].length);
48602
48603         item = {
48604           type: 'table',
48605           header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
48606           align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
48607           cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n')
48608         };
48609
48610         for (i = 0; i < item.align.length; i++) {
48611           if (/^ *-+: *$/.test(item.align[i])) {
48612             item.align[i] = 'right';
48613           } else if (/^ *:-+: *$/.test(item.align[i])) {
48614             item.align[i] = 'center';
48615           } else if (/^ *:-+ *$/.test(item.align[i])) {
48616             item.align[i] = 'left';
48617           } else {
48618             item.align[i] = null;
48619           }
48620         }
48621
48622         for (i = 0; i < item.cells.length; i++) {
48623           item.cells[i] = item.cells[i]
48624             .replace(/^ *\| *| *\| *$/g, '')
48625             .split(/ *\| */);
48626         }
48627
48628         this.tokens.push(item);
48629
48630         continue;
48631       }
48632
48633       // lheading
48634       if (cap = this.rules.lheading.exec(src)) {
48635         src = src.substring(cap[0].length);
48636         this.tokens.push({
48637           type: 'heading',
48638           depth: cap[2] === '=' ? 1 : 2,
48639           text: cap[1]
48640         });
48641         continue;
48642       }
48643
48644       // top-level paragraph
48645       if (top && (cap = this.rules.paragraph.exec(src))) {
48646         src = src.substring(cap[0].length);
48647         this.tokens.push({
48648           type: 'paragraph',
48649           text: cap[1].charAt(cap[1].length - 1) === '\n'
48650             ? cap[1].slice(0, -1)
48651             : cap[1]
48652         });
48653         continue;
48654       }
48655
48656       // text
48657       if (cap = this.rules.text.exec(src)) {
48658         // Top-level should never reach here.
48659         src = src.substring(cap[0].length);
48660         this.tokens.push({
48661           type: 'text',
48662           text: cap[0]
48663         });
48664         continue;
48665       }
48666
48667       if (src) {
48668         throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
48669       }
48670     }
48671
48672     return this.tokens;
48673   };
48674
48675   /**
48676    * Inline-Level Grammar
48677    */
48678
48679   var inline = {
48680     escape: /^\\([\\`*{}\[\]()#+\-.!_>])/,
48681     autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
48682     url: noop,
48683     tag: /^<!--[\s\S]*?-->|^<\/?[a-zA-Z0-9\-]+(?:"[^"]*"|'[^']*'|\s[^<'">\/\s]*)*?\/?>/,
48684     link: /^!?\[(inside)\]\(href\)/,
48685     reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/,
48686     nolink: /^!?\[((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\]/,
48687     strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,
48688     em: /^_([^\s_](?:[^_]|__)+?[^\s_])_\b|^\*((?:\*\*|[^*])+?)\*(?!\*)/,
48689     code: /^(`+)\s*([\s\S]*?[^`]?)\s*\1(?!`)/,
48690     br: /^ {2,}\n(?!\s*$)/,
48691     del: noop,
48692     text: /^[\s\S]+?(?=[\\<!\[`*]|\b_| {2,}\n|$)/
48693   };
48694
48695   inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
48696   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])?)+(?![-_])/;
48697
48698   inline.autolink = edit(inline.autolink)
48699     .replace('scheme', inline._scheme)
48700     .replace('email', inline._email)
48701     .getRegex();
48702
48703   inline._inside = /(?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]]|\](?=[^\[]*\]))*/;
48704   inline._href = /\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;
48705
48706   inline.link = edit(inline.link)
48707     .replace('inside', inline._inside)
48708     .replace('href', inline._href)
48709     .getRegex();
48710
48711   inline.reflink = edit(inline.reflink)
48712     .replace('inside', inline._inside)
48713     .getRegex();
48714
48715   /**
48716    * Normal Inline Grammar
48717    */
48718
48719   inline.normal = merge({}, inline);
48720
48721   /**
48722    * Pedantic Inline Grammar
48723    */
48724
48725   inline.pedantic = merge({}, inline.normal, {
48726     strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
48727     em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/
48728   });
48729
48730   /**
48731    * GFM Inline Grammar
48732    */
48733
48734   inline.gfm = merge({}, inline.normal, {
48735     escape: edit(inline.escape).replace('])', '~|])').getRegex(),
48736     url: edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/)
48737       .replace('email', inline._email)
48738       .getRegex(),
48739     _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
48740     del: /^~~(?=\S)([\s\S]*?\S)~~/,
48741     text: edit(inline.text)
48742       .replace(']|', '~]|')
48743       .replace('|', '|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&\'*+/=?^_`{\\|}~-]+@|')
48744       .getRegex()
48745   });
48746
48747   /**
48748    * GFM + Line Breaks Inline Grammar
48749    */
48750
48751   inline.breaks = merge({}, inline.gfm, {
48752     br: edit(inline.br).replace('{2,}', '*').getRegex(),
48753     text: edit(inline.gfm.text).replace('{2,}', '*').getRegex()
48754   });
48755
48756   /**
48757    * Inline Lexer & Compiler
48758    */
48759
48760   function InlineLexer(links, options) {
48761     this.options = options || marked.defaults;
48762     this.links = links;
48763     this.rules = inline.normal;
48764     this.renderer = this.options.renderer || new Renderer();
48765     this.renderer.options = this.options;
48766
48767     if (!this.links) {
48768       throw new Error('Tokens array requires a `links` property.');
48769     }
48770
48771     if (this.options.gfm) {
48772       if (this.options.breaks) {
48773         this.rules = inline.breaks;
48774       } else {
48775         this.rules = inline.gfm;
48776       }
48777     } else if (this.options.pedantic) {
48778       this.rules = inline.pedantic;
48779     }
48780   }
48781
48782   /**
48783    * Expose Inline Rules
48784    */
48785
48786   InlineLexer.rules = inline;
48787
48788   /**
48789    * Static Lexing/Compiling Method
48790    */
48791
48792   InlineLexer.output = function(src, links, options) {
48793     var inline = new InlineLexer(links, options);
48794     return inline.output(src);
48795   };
48796
48797   /**
48798    * Lexing/Compiling
48799    */
48800
48801   InlineLexer.prototype.output = function(src) {
48802     var out = '',
48803         link,
48804         text,
48805         href,
48806         cap;
48807
48808     while (src) {
48809       // escape
48810       if (cap = this.rules.escape.exec(src)) {
48811         src = src.substring(cap[0].length);
48812         out += cap[1];
48813         continue;
48814       }
48815
48816       // autolink
48817       if (cap = this.rules.autolink.exec(src)) {
48818         src = src.substring(cap[0].length);
48819         if (cap[2] === '@') {
48820           text = escape(this.mangle(cap[1]));
48821           href = 'mailto:' + text;
48822         } else {
48823           text = escape(cap[1]);
48824           href = text;
48825         }
48826         out += this.renderer.link(href, null, text);
48827         continue;
48828       }
48829
48830       // url (gfm)
48831       if (!this.inLink && (cap = this.rules.url.exec(src))) {
48832         cap[0] = this.rules._backpedal.exec(cap[0])[0];
48833         src = src.substring(cap[0].length);
48834         if (cap[2] === '@') {
48835           text = escape(cap[0]);
48836           href = 'mailto:' + text;
48837         } else {
48838           text = escape(cap[0]);
48839           if (cap[1] === 'www.') {
48840             href = 'http://' + text;
48841           } else {
48842             href = text;
48843           }
48844         }
48845         out += this.renderer.link(href, null, text);
48846         continue;
48847       }
48848
48849       // tag
48850       if (cap = this.rules.tag.exec(src)) {
48851         if (!this.inLink && /^<a /i.test(cap[0])) {
48852           this.inLink = true;
48853         } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
48854           this.inLink = false;
48855         }
48856         src = src.substring(cap[0].length);
48857         out += this.options.sanitize
48858           ? this.options.sanitizer
48859             ? this.options.sanitizer(cap[0])
48860             : escape(cap[0])
48861           : cap[0];
48862         continue;
48863       }
48864
48865       // link
48866       if (cap = this.rules.link.exec(src)) {
48867         src = src.substring(cap[0].length);
48868         this.inLink = true;
48869         out += this.outputLink(cap, {
48870           href: cap[2],
48871           title: cap[3]
48872         });
48873         this.inLink = false;
48874         continue;
48875       }
48876
48877       // reflink, nolink
48878       if ((cap = this.rules.reflink.exec(src))
48879           || (cap = this.rules.nolink.exec(src))) {
48880         src = src.substring(cap[0].length);
48881         link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
48882         link = this.links[link.toLowerCase()];
48883         if (!link || !link.href) {
48884           out += cap[0].charAt(0);
48885           src = cap[0].substring(1) + src;
48886           continue;
48887         }
48888         this.inLink = true;
48889         out += this.outputLink(cap, link);
48890         this.inLink = false;
48891         continue;
48892       }
48893
48894       // strong
48895       if (cap = this.rules.strong.exec(src)) {
48896         src = src.substring(cap[0].length);
48897         out += this.renderer.strong(this.output(cap[2] || cap[1]));
48898         continue;
48899       }
48900
48901       // em
48902       if (cap = this.rules.em.exec(src)) {
48903         src = src.substring(cap[0].length);
48904         out += this.renderer.em(this.output(cap[2] || cap[1]));
48905         continue;
48906       }
48907
48908       // code
48909       if (cap = this.rules.code.exec(src)) {
48910         src = src.substring(cap[0].length);
48911         out += this.renderer.codespan(escape(cap[2].trim(), true));
48912         continue;
48913       }
48914
48915       // br
48916       if (cap = this.rules.br.exec(src)) {
48917         src = src.substring(cap[0].length);
48918         out += this.renderer.br();
48919         continue;
48920       }
48921
48922       // del (gfm)
48923       if (cap = this.rules.del.exec(src)) {
48924         src = src.substring(cap[0].length);
48925         out += this.renderer.del(this.output(cap[1]));
48926         continue;
48927       }
48928
48929       // text
48930       if (cap = this.rules.text.exec(src)) {
48931         src = src.substring(cap[0].length);
48932         out += this.renderer.text(escape(this.smartypants(cap[0])));
48933         continue;
48934       }
48935
48936       if (src) {
48937         throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
48938       }
48939     }
48940
48941     return out;
48942   };
48943
48944   /**
48945    * Compile Link
48946    */
48947
48948   InlineLexer.prototype.outputLink = function(cap, link) {
48949     var href = escape(link.href),
48950         title = link.title ? escape(link.title) : null;
48951
48952     return cap[0].charAt(0) !== '!'
48953       ? this.renderer.link(href, title, this.output(cap[1]))
48954       : this.renderer.image(href, title, escape(cap[1]));
48955   };
48956
48957   /**
48958    * Smartypants Transformations
48959    */
48960
48961   InlineLexer.prototype.smartypants = function(text) {
48962     if (!this.options.smartypants) return text;
48963     return text
48964       // em-dashes
48965       .replace(/---/g, '\u2014')
48966       // en-dashes
48967       .replace(/--/g, '\u2013')
48968       // opening singles
48969       .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
48970       // closing singles & apostrophes
48971       .replace(/'/g, '\u2019')
48972       // opening doubles
48973       .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
48974       // closing doubles
48975       .replace(/"/g, '\u201d')
48976       // ellipses
48977       .replace(/\.{3}/g, '\u2026');
48978   };
48979
48980   /**
48981    * Mangle Links
48982    */
48983
48984   InlineLexer.prototype.mangle = function(text) {
48985     if (!this.options.mangle) return text;
48986     var out = '',
48987         l = text.length,
48988         i = 0,
48989         ch;
48990
48991     for (; i < l; i++) {
48992       ch = text.charCodeAt(i);
48993       if (Math.random() > 0.5) {
48994         ch = 'x' + ch.toString(16);
48995       }
48996       out += '&#' + ch + ';';
48997     }
48998
48999     return out;
49000   };
49001
49002   /**
49003    * Renderer
49004    */
49005
49006   function Renderer(options) {
49007     this.options = options || {};
49008   }
49009
49010   Renderer.prototype.code = function(code, lang, escaped) {
49011     if (this.options.highlight) {
49012       var out = this.options.highlight(code, lang);
49013       if (out != null && out !== code) {
49014         escaped = true;
49015         code = out;
49016       }
49017     }
49018
49019     if (!lang) {
49020       return '<pre><code>'
49021         + (escaped ? code : escape(code, true))
49022         + '\n</code></pre>';
49023     }
49024
49025     return '<pre><code class="'
49026       + this.options.langPrefix
49027       + escape(lang, true)
49028       + '">'
49029       + (escaped ? code : escape(code, true))
49030       + '\n</code></pre>\n';
49031   };
49032
49033   Renderer.prototype.blockquote = function(quote) {
49034     return '<blockquote>\n' + quote + '</blockquote>\n';
49035   };
49036
49037   Renderer.prototype.html = function(html) {
49038     return html;
49039   };
49040
49041   Renderer.prototype.heading = function(text, level, raw) {
49042     return '<h'
49043       + level
49044       + ' id="'
49045       + this.options.headerPrefix
49046       + raw.toLowerCase().replace(/[^\w]+/g, '-')
49047       + '">'
49048       + text
49049       + '</h'
49050       + level
49051       + '>\n';
49052   };
49053
49054   Renderer.prototype.hr = function() {
49055     return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
49056   };
49057
49058   Renderer.prototype.list = function(body, ordered, start) {
49059     var type = ordered ? 'ol' : 'ul',
49060         startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
49061     return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
49062   };
49063
49064   Renderer.prototype.listitem = function(text) {
49065     return '<li>' + text + '</li>\n';
49066   };
49067
49068   Renderer.prototype.paragraph = function(text) {
49069     return '<p>' + text + '</p>\n';
49070   };
49071
49072   Renderer.prototype.table = function(header, body) {
49073     return '<table>\n'
49074       + '<thead>\n'
49075       + header
49076       + '</thead>\n'
49077       + '<tbody>\n'
49078       + body
49079       + '</tbody>\n'
49080       + '</table>\n';
49081   };
49082
49083   Renderer.prototype.tablerow = function(content) {
49084     return '<tr>\n' + content + '</tr>\n';
49085   };
49086
49087   Renderer.prototype.tablecell = function(content, flags) {
49088     var type = flags.header ? 'th' : 'td';
49089     var tag = flags.align
49090       ? '<' + type + ' style="text-align:' + flags.align + '">'
49091       : '<' + type + '>';
49092     return tag + content + '</' + type + '>\n';
49093   };
49094
49095   // span level renderer
49096   Renderer.prototype.strong = function(text) {
49097     return '<strong>' + text + '</strong>';
49098   };
49099
49100   Renderer.prototype.em = function(text) {
49101     return '<em>' + text + '</em>';
49102   };
49103
49104   Renderer.prototype.codespan = function(text) {
49105     return '<code>' + text + '</code>';
49106   };
49107
49108   Renderer.prototype.br = function() {
49109     return this.options.xhtml ? '<br/>' : '<br>';
49110   };
49111
49112   Renderer.prototype.del = function(text) {
49113     return '<del>' + text + '</del>';
49114   };
49115
49116   Renderer.prototype.link = function(href, title, text) {
49117     if (this.options.sanitize) {
49118       try {
49119         var prot = decodeURIComponent(unescape(href))
49120           .replace(/[^\w:]/g, '')
49121           .toLowerCase();
49122       } catch (e) {
49123         return text;
49124       }
49125       if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
49126         return text;
49127       }
49128     }
49129     if (this.options.baseUrl && !originIndependentUrl.test(href)) {
49130       href = resolveUrl(this.options.baseUrl, href);
49131     }
49132     var out = '<a href="' + href + '"';
49133     if (title) {
49134       out += ' title="' + title + '"';
49135     }
49136     out += '>' + text + '</a>';
49137     return out;
49138   };
49139
49140   Renderer.prototype.image = function(href, title, text) {
49141     if (this.options.baseUrl && !originIndependentUrl.test(href)) {
49142       href = resolveUrl(this.options.baseUrl, href);
49143     }
49144     var out = '<img src="' + href + '" alt="' + text + '"';
49145     if (title) {
49146       out += ' title="' + title + '"';
49147     }
49148     out += this.options.xhtml ? '/>' : '>';
49149     return out;
49150   };
49151
49152   Renderer.prototype.text = function(text) {
49153     return text;
49154   };
49155
49156   /**
49157    * TextRenderer
49158    * returns only the textual part of the token
49159    */
49160
49161   function TextRenderer() {}
49162
49163   // no need for block level renderers
49164
49165   TextRenderer.prototype.strong =
49166   TextRenderer.prototype.em =
49167   TextRenderer.prototype.codespan =
49168   TextRenderer.prototype.del =
49169   TextRenderer.prototype.text = function (text) {
49170     return text;
49171   };
49172
49173   TextRenderer.prototype.link =
49174   TextRenderer.prototype.image = function(href, title, text) {
49175     return '' + text;
49176   };
49177
49178   TextRenderer.prototype.br = function() {
49179     return '';
49180   };
49181
49182   /**
49183    * Parsing & Compiling
49184    */
49185
49186   function Parser(options) {
49187     this.tokens = [];
49188     this.token = null;
49189     this.options = options || marked.defaults;
49190     this.options.renderer = this.options.renderer || new Renderer();
49191     this.renderer = this.options.renderer;
49192     this.renderer.options = this.options;
49193   }
49194
49195   /**
49196    * Static Parse Method
49197    */
49198
49199   Parser.parse = function(src, options) {
49200     var parser = new Parser(options);
49201     return parser.parse(src);
49202   };
49203
49204   /**
49205    * Parse Loop
49206    */
49207
49208   Parser.prototype.parse = function(src) {
49209     this.inline = new InlineLexer(src.links, this.options);
49210     // use an InlineLexer with a TextRenderer to extract pure text
49211     this.inlineText = new InlineLexer(
49212       src.links,
49213       merge({}, this.options, {renderer: new TextRenderer()})
49214     );
49215     this.tokens = src.reverse();
49216
49217     var out = '';
49218     while (this.next()) {
49219       out += this.tok();
49220     }
49221
49222     return out;
49223   };
49224
49225   /**
49226    * Next Token
49227    */
49228
49229   Parser.prototype.next = function() {
49230     return this.token = this.tokens.pop();
49231   };
49232
49233   /**
49234    * Preview Next Token
49235    */
49236
49237   Parser.prototype.peek = function() {
49238     return this.tokens[this.tokens.length - 1] || 0;
49239   };
49240
49241   /**
49242    * Parse Text Tokens
49243    */
49244
49245   Parser.prototype.parseText = function() {
49246     var body = this.token.text;
49247
49248     while (this.peek().type === 'text') {
49249       body += '\n' + this.next().text;
49250     }
49251
49252     return this.inline.output(body);
49253   };
49254
49255   /**
49256    * Parse Current Token
49257    */
49258
49259   Parser.prototype.tok = function() {
49260     switch (this.token.type) {
49261       case 'space': {
49262         return '';
49263       }
49264       case 'hr': {
49265         return this.renderer.hr();
49266       }
49267       case 'heading': {
49268         return this.renderer.heading(
49269           this.inline.output(this.token.text),
49270           this.token.depth,
49271           unescape(this.inlineText.output(this.token.text)));
49272       }
49273       case 'code': {
49274         return this.renderer.code(this.token.text,
49275           this.token.lang,
49276           this.token.escaped);
49277       }
49278       case 'table': {
49279         var header = '',
49280             body = '',
49281             i,
49282             row,
49283             cell,
49284             j;
49285
49286         // header
49287         cell = '';
49288         for (i = 0; i < this.token.header.length; i++) {
49289           cell += this.renderer.tablecell(
49290             this.inline.output(this.token.header[i]),
49291             { header: true, align: this.token.align[i] }
49292           );
49293         }
49294         header += this.renderer.tablerow(cell);
49295
49296         for (i = 0; i < this.token.cells.length; i++) {
49297           row = this.token.cells[i];
49298
49299           cell = '';
49300           for (j = 0; j < row.length; j++) {
49301             cell += this.renderer.tablecell(
49302               this.inline.output(row[j]),
49303               { header: false, align: this.token.align[j] }
49304             );
49305           }
49306
49307           body += this.renderer.tablerow(cell);
49308         }
49309         return this.renderer.table(header, body);
49310       }
49311       case 'blockquote_start': {
49312         body = '';
49313
49314         while (this.next().type !== 'blockquote_end') {
49315           body += this.tok();
49316         }
49317
49318         return this.renderer.blockquote(body);
49319       }
49320       case 'list_start': {
49321         body = '';
49322         var ordered = this.token.ordered,
49323             start = this.token.start;
49324
49325         while (this.next().type !== 'list_end') {
49326           body += this.tok();
49327         }
49328
49329         return this.renderer.list(body, ordered, start);
49330       }
49331       case 'list_item_start': {
49332         body = '';
49333
49334         while (this.next().type !== 'list_item_end') {
49335           body += this.token.type === 'text'
49336             ? this.parseText()
49337             : this.tok();
49338         }
49339
49340         return this.renderer.listitem(body);
49341       }
49342       case 'loose_item_start': {
49343         body = '';
49344
49345         while (this.next().type !== 'list_item_end') {
49346           body += this.tok();
49347         }
49348
49349         return this.renderer.listitem(body);
49350       }
49351       case 'html': {
49352         var html = !this.token.pre && !this.options.pedantic
49353           ? this.inline.output(this.token.text)
49354           : this.token.text;
49355         return this.renderer.html(html);
49356       }
49357       case 'paragraph': {
49358         return this.renderer.paragraph(this.inline.output(this.token.text));
49359       }
49360       case 'text': {
49361         return this.renderer.paragraph(this.parseText());
49362       }
49363     }
49364   };
49365
49366   /**
49367    * Helpers
49368    */
49369
49370   function escape(html, encode) {
49371     return html
49372       .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&amp;')
49373       .replace(/</g, '&lt;')
49374       .replace(/>/g, '&gt;')
49375       .replace(/"/g, '&quot;')
49376       .replace(/'/g, '&#39;');
49377   }
49378
49379   function unescape(html) {
49380     // explicitly match decimal, hex, and named HTML entities
49381     return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
49382       n = n.toLowerCase();
49383       if (n === 'colon') return ':';
49384       if (n.charAt(0) === '#') {
49385         return n.charAt(1) === 'x'
49386           ? String.fromCharCode(parseInt(n.substring(2), 16))
49387           : String.fromCharCode(+n.substring(1));
49388       }
49389       return '';
49390     });
49391   }
49392
49393   function edit(regex, opt) {
49394     regex = regex.source;
49395     opt = opt || '';
49396     return {
49397       replace: function(name, val) {
49398         val = val.source || val;
49399         val = val.replace(/(^|[^\[])\^/g, '$1');
49400         regex = regex.replace(name, val);
49401         return this;
49402       },
49403       getRegex: function() {
49404         return new RegExp(regex, opt);
49405       }
49406     };
49407   }
49408
49409   function resolveUrl(base, href) {
49410     if (!baseUrls[' ' + base]) {
49411       // we can ignore everything in base after the last slash of its path component,
49412       // but we might need to add _that_
49413       // https://tools.ietf.org/html/rfc3986#section-3
49414       if (/^[^:]+:\/*[^/]*$/.test(base)) {
49415         baseUrls[' ' + base] = base + '/';
49416       } else {
49417         baseUrls[' ' + base] = base.replace(/[^/]*$/, '');
49418       }
49419     }
49420     base = baseUrls[' ' + base];
49421
49422     if (href.slice(0, 2) === '//') {
49423       return base.replace(/:[\s\S]*/, ':') + href;
49424     } else if (href.charAt(0) === '/') {
49425       return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
49426     } else {
49427       return base + href;
49428     }
49429   }
49430   var baseUrls = {};
49431   var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
49432
49433   function noop() {}
49434   noop.exec = noop;
49435
49436   function merge(obj) {
49437     var i = 1,
49438         target,
49439         key;
49440
49441     for (; i < arguments.length; i++) {
49442       target = arguments[i];
49443       for (key in target) {
49444         if (Object.prototype.hasOwnProperty.call(target, key)) {
49445           obj[key] = target[key];
49446         }
49447       }
49448     }
49449
49450     return obj;
49451   }
49452
49453   /**
49454    * Marked
49455    */
49456
49457   function marked(src, opt, callback) {
49458     // throw error in case of non string input
49459     if (typeof src === 'undefined' || src === null) {
49460       throw new Error('marked(): input parameter is undefined or null');
49461     }
49462     if (typeof src !== 'string') {
49463       throw new Error('marked(): input parameter is of type '
49464         + Object.prototype.toString.call(src) + ', string expected');
49465     }
49466
49467     if (callback || typeof opt === 'function') {
49468       if (!callback) {
49469         callback = opt;
49470         opt = null;
49471       }
49472
49473       opt = merge({}, marked.defaults, opt || {});
49474
49475       var highlight = opt.highlight,
49476           tokens,
49477           pending,
49478           i = 0;
49479
49480       try {
49481         tokens = Lexer.lex(src, opt);
49482       } catch (e) {
49483         return callback(e);
49484       }
49485
49486       pending = tokens.length;
49487
49488       var done = function(err) {
49489         if (err) {
49490           opt.highlight = highlight;
49491           return callback(err);
49492         }
49493
49494         var out;
49495
49496         try {
49497           out = Parser.parse(tokens, opt);
49498         } catch (e) {
49499           err = e;
49500         }
49501
49502         opt.highlight = highlight;
49503
49504         return err
49505           ? callback(err)
49506           : callback(null, out);
49507       };
49508
49509       if (!highlight || highlight.length < 3) {
49510         return done();
49511       }
49512
49513       delete opt.highlight;
49514
49515       if (!pending) return done();
49516
49517       for (; i < tokens.length; i++) {
49518         (function(token) {
49519           if (token.type !== 'code') {
49520             return --pending || done();
49521           }
49522           return highlight(token.text, token.lang, function(err, code) {
49523             if (err) return done(err);
49524             if (code == null || code === token.text) {
49525               return --pending || done();
49526             }
49527             token.text = code;
49528             token.escaped = true;
49529             --pending || done();
49530           });
49531         })(tokens[i]);
49532       }
49533
49534       return;
49535     }
49536     try {
49537       if (opt) opt = merge({}, marked.defaults, opt);
49538       return Parser.parse(Lexer.lex(src, opt), opt);
49539     } catch (e) {
49540       e.message += '\nPlease report this to https://github.com/markedjs/marked.';
49541       if ((opt || marked.defaults).silent) {
49542         return '<p>An error occurred:</p><pre>'
49543           + escape(e.message + '', true)
49544           + '</pre>';
49545       }
49546       throw e;
49547     }
49548   }
49549
49550   /**
49551    * Options
49552    */
49553
49554   marked.options =
49555   marked.setOptions = function(opt) {
49556     merge(marked.defaults, opt);
49557     return marked;
49558   };
49559
49560   marked.defaults = {
49561     gfm: true,
49562     tables: true,
49563     breaks: false,
49564     pedantic: false,
49565     sanitize: false,
49566     sanitizer: null,
49567     mangle: true,
49568     smartLists: false,
49569     silent: false,
49570     highlight: null,
49571     langPrefix: 'lang-',
49572     smartypants: false,
49573     headerPrefix: '',
49574     renderer: new Renderer(),
49575     xhtml: false,
49576     baseUrl: null
49577   };
49578
49579   /**
49580    * Expose
49581    */
49582
49583   marked.Parser = Parser;
49584   marked.parser = Parser.parse;
49585
49586   marked.Renderer = Renderer;
49587   marked.TextRenderer = TextRenderer;
49588
49589   marked.Lexer = Lexer;
49590   marked.lexer = Lexer.lex;
49591
49592   marked.InlineLexer = InlineLexer;
49593   marked.inlineLexer = InlineLexer.output;
49594
49595   marked.parse = marked;
49596
49597   {
49598     module.exports = marked;
49599   }
49600   })(commonjsGlobal || (typeof window !== 'undefined' ? window : commonjsGlobal));
49601   });
49602
49603   function pointBox(loc, context) {
49604       var rect = context.surfaceRect();
49605       var point$$1 = context.curtainProjection(loc);
49606       return {
49607           left: point$$1[0] + rect.left - 40,
49608           top: point$$1[1] + rect.top - 60,
49609           width: 80,
49610           height: 90
49611       };
49612   }
49613
49614
49615   function pad$1(locOrBox, padding, context) {
49616       var box;
49617       if (locOrBox instanceof Array) {
49618           var rect = context.surfaceRect();
49619           var point$$1 = context.curtainProjection(locOrBox);
49620           box = {
49621               left: point$$1[0] + rect.left,
49622               top: point$$1[1] + rect.top
49623           };
49624       } else {
49625           box = locOrBox;
49626       }
49627
49628       return {
49629           left: box.left - padding,
49630           top: box.top - padding,
49631           width: (box.width || 0) + 2 * padding,
49632           height: (box.width || 0) + 2 * padding
49633       };
49634   }
49635
49636
49637   function icon(name, svgklass, useklass) {
49638       return '<svg class="icon ' + (svgklass || '') + '">' +
49639            '<use xlink:href="' + name + '"' +
49640            (useklass ? ' class="' + useklass + '"' : '') + '></use></svg>';
49641   }
49642
49643
49644   function slugify(text) {
49645       return text.toString().toLowerCase()
49646           .replace(/\s+/g, '-')           // Replace spaces with -
49647           .replace(/[^\w\-]+/g, '')       // Remove all non-word chars
49648           .replace(/\-\-+/g, '-')         // Replace multiple - with single -
49649           .replace(/^-+/, '')             // Trim - from start of text
49650           .replace(/-+$/, '');            // Trim - from end of text
49651   }
49652
49653
49654   // console warning for missing walkthrough names
49655   var missingStrings = {};
49656   function checkKey(key, text) {
49657       if (t(key, { default: undefined}) === undefined) {
49658           if (missingStrings.hasOwnProperty(key)) return;  // warn once
49659           missingStrings[key] = text;
49660           var missing = key + ': ' + text;
49661           if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
49662       }
49663   }
49664
49665
49666   function localize(obj) {
49667       var key;
49668
49669       // Assign name if entity has one..
49670       var name = obj.tags && obj.tags.name;
49671       if (name) {
49672           key = 'intro.graph.name.' + slugify(name);
49673           obj.tags.name = t(key, { default: name });
49674           checkKey(key, name);
49675       }
49676
49677       // Assign street name if entity has one..
49678       var street = obj.tags && obj.tags['addr:street'];
49679       if (street) {
49680           key = 'intro.graph.name.' + slugify(street);
49681           obj.tags['addr:street'] = t(key, { default: street });
49682           checkKey(key, street);
49683
49684           // Add address details common across walkthrough..
49685           var addrTags = [
49686               'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
49687               'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
49688           ];
49689           addrTags.forEach(function(k) {
49690               var key = 'intro.graph.' + k,
49691                   tag = 'addr:' + k,
49692                   val = obj.tags && obj.tags[tag],
49693                   str = t(key, { default: val });
49694
49695               if (str) {
49696                   if (str.match(/^<.*>$/) !== null) {
49697                       delete obj.tags[tag];
49698                   } else {
49699                       obj.tags[tag] = str;
49700                   }
49701               }
49702           });
49703       }
49704
49705       return obj;
49706   }
49707
49708
49709   // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
49710   function isMostlySquare(points) {
49711       // note: uses 15 here instead of the 12 from actionOrthogonalize because
49712       // actionOrthogonalize can actually straighten some larger angles as it iterates
49713       var threshold = 15, // degrees within right or straight
49714           lowerBound = Math.cos((90 - threshold) * Math.PI / 180),  // near right
49715           upperBound = Math.cos(threshold * Math.PI / 180),         // near straight
49716           mag;
49717
49718       for (var i = 0; i < points.length; i++) {
49719           mag = Math.abs(normalizedDotProduct(i, points));
49720           if (mag > lowerBound && mag < upperBound) {
49721               return false;
49722           }
49723       }
49724
49725       return true;
49726
49727
49728       function normalizedDotProduct(i, points) {
49729           var a = points[(i - 1 + points.length) % points.length],
49730               b = points[i],
49731               c = points[(i + 1) % points.length],
49732               p = subtractPoints(a, b),
49733               q = subtractPoints(c, b);
49734
49735           p = normalizePoint(p);
49736           q = normalizePoint(q);
49737
49738           return p[0] * q[0] + p[1] * q[1];
49739
49740
49741           function subtractPoints(a, b) {
49742               return [a[0] - b[0], a[1] - b[1]];
49743           }
49744
49745           function normalizePoint(point$$1) {
49746               var vector = [0, 0];
49747               var length = Math.sqrt(point$$1[0] * point$$1[0] + point$$1[1] * point$$1[1]);
49748               if (length !== 0) {
49749                   vector[0] = point$$1[0] / length;
49750                   vector[1] = point$$1[1] / length;
49751               }
49752               return vector;
49753           }
49754       }
49755   }
49756
49757
49758   function selectMenuItem(operation) {
49759       var selector$$1 = '.edit-menu .edit-menu-item-' + operation +
49760           ', .radial-menu .radial-menu-item-' + operation;
49761       return d3_select(selector$$1);
49762   }
49763
49764
49765   function transitionTime(point1, point2) {
49766       var distance = geoSphericalDistance(point1, point2);
49767       if (distance === 0)
49768           return 0;
49769       else if (distance < 80)
49770           return 500;
49771       else
49772           return 1000;
49773   }
49774
49775   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]}};
49776
49777   // Tooltips and svg mask used to highlight certain features
49778   function uiCurtain() {
49779
49780       var surface = d3_select(null),
49781           tooltip = d3_select(null),
49782           darkness = d3_select(null);
49783
49784       function curtain(selection$$1) {
49785           surface = selection$$1
49786               .append('svg')
49787               .attr('id', 'curtain')
49788               .style('z-index', 1000)
49789               .style('pointer-events', 'none')
49790               .style('position', 'absolute')
49791               .style('top', 0)
49792               .style('left', 0);
49793
49794           darkness = surface.append('path')
49795               .attr('x', 0)
49796               .attr('y', 0)
49797               .attr('class', 'curtain-darkness');
49798
49799           d3_select(window).on('resize.curtain', resize);
49800
49801           tooltip = selection$$1.append('div')
49802               .attr('class', 'tooltip')
49803               .style('z-index', 1002);
49804
49805           tooltip
49806               .append('div')
49807               .attr('class', 'tooltip-arrow');
49808
49809           tooltip
49810               .append('div')
49811               .attr('class', 'tooltip-inner');
49812
49813           resize();
49814
49815
49816           function resize() {
49817               surface
49818                   .attr('width', window.innerWidth)
49819                   .attr('height', window.innerHeight);
49820               curtain.cut(darkness.datum());
49821           }
49822       }
49823
49824
49825       /**
49826        * Reveal cuts the curtain to highlight the given box,
49827        * and shows a tooltip with instructions next to the box.
49828        *
49829        * @param  {String|ClientRect} [box]   box used to cut the curtain
49830        * @param  {String}    [text]          text for a tooltip
49831        * @param  {Object}    [options]
49832        * @param  {string}    [options.tooltipClass]    optional class to add to the tooltip
49833        * @param  {integer}   [options.duration]        transition time in milliseconds
49834        * @param  {string}    [options.buttonText]      if set, create a button with this text label
49835        * @param  {function}  [options.buttonCallback]  if set, the callback for the button
49836        * @param  {String|ClientRect} [options.tooltipBox]  box for tooltip position, if different from box for the curtain
49837        */
49838       curtain.reveal = function(box, text, options) {
49839           if (typeof box === 'string') {
49840               box = d3_select(box).node();
49841           }
49842           if (box && box.getBoundingClientRect) {
49843               box = copyBox(box.getBoundingClientRect());
49844           }
49845
49846           options = options || {};
49847
49848           var tooltipBox;
49849           if (options.tooltipBox) {
49850               tooltipBox = options.tooltipBox;
49851               if (typeof tooltipBox === 'string') {
49852                   tooltipBox = d3_select(tooltipBox).node();
49853               }
49854               if (tooltipBox && tooltipBox.getBoundingClientRect) {
49855                   tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
49856               }
49857           } else {
49858               tooltipBox = box;
49859           }
49860
49861           if (tooltipBox && text) {
49862               // pseudo markdown bold text for the instruction section..
49863               var parts = text.split('**');
49864               var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
49865               if (parts[1]) {
49866                   html += '<span class="instruction">' + parts[1] + '</span>';
49867               }
49868
49869               html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');   // emphasis
49870               html = html.replace(/\{br\}/g, '<br/><br/>');       // linebreak
49871
49872               if (options.buttonText && options.buttonCallback) {
49873                   html += '<div class="button-section">' +
49874                       '<button href="#" class="button action col8">' + options.buttonText + '</button></div>';
49875               }
49876
49877               var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
49878               tooltip
49879                   .classed(classes, true)
49880                   .selectAll('.tooltip-inner')
49881                   .html(html);
49882
49883               if (options.buttonText && options.buttonCallback) {
49884                   var button = tooltip.selectAll('.button-section .button.action');
49885                   button
49886                       .on('click', function() {
49887                           event.preventDefault();
49888                           options.buttonCallback();
49889                       });
49890               }
49891
49892               var tip = copyBox(tooltip.node().getBoundingClientRect()),
49893                   w = window.innerWidth,
49894                   h = window.innerHeight,
49895                   tooltipWidth = 200,
49896                   tooltipArrow = 5,
49897                   side, pos;
49898
49899
49900               // hack: this will have bottom placement,
49901               // so need to reserve extra space for the tooltip illustration.
49902               if (options.tooltipClass === 'intro-mouse') {
49903                   tip.height += 80;
49904               }
49905
49906               // trim box dimensions to just the portion that fits in the window..
49907               if (tooltipBox.top + tooltipBox.height > h) {
49908                   tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
49909               }
49910               if (tooltipBox.left + tooltipBox.width > w) {
49911                   tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
49912               }
49913
49914               // determine tooltip placement..
49915
49916               if (tooltipBox.top + tooltipBox.height < 100) {
49917                   // tooltip below box..
49918                   side = 'bottom';
49919                   pos = [
49920                       tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
49921                       tooltipBox.top + tooltipBox.height
49922                   ];
49923
49924               } else if (tooltipBox.top > h - 140) {
49925                   // tooltip above box..
49926                   side = 'top';
49927                   pos = [
49928                       tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
49929                       tooltipBox.top - tip.height
49930                   ];
49931
49932               } else {
49933                   // tooltip to the side of the tooltipBox..
49934                   var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
49935
49936                   if (textDirection === 'rtl') {
49937                       if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
49938                           side = 'right';
49939                           pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
49940
49941                       } else {
49942                           side = 'left';
49943                           pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
49944                       }
49945
49946                   } else {
49947                       if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
49948                           side = 'left';
49949                           pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
49950                       }
49951                       else {
49952                           side = 'right';
49953                           pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
49954                       }
49955                   }
49956               }
49957
49958               if (options.duration !== 0 || !tooltip.classed(side)) {
49959                   tooltip.call(uiToggle(true));
49960               }
49961
49962               tooltip
49963                   .style('top', pos[1] + 'px')
49964                   .style('left', pos[0] + 'px')
49965                   .attr('class', classes + ' ' + side);
49966
49967
49968               // shift tooltip-inner if it is very close to the top or bottom edge
49969               // (doesn't affect the placement of the tooltip-arrow)
49970               var shiftY = 0;
49971               if (side === 'left' || side === 'right') {
49972                   if (pos[1] < 60) {
49973                       shiftY = 60 - pos[1];
49974                   }
49975                   else if (pos[1] + tip.height > h - 100) {
49976                       shiftY = h - pos[1] - tip.height - 100;
49977                   }
49978               }
49979               tooltip.selectAll('.tooltip-inner')
49980                   .style('top', shiftY + 'px');
49981
49982           } else {
49983               tooltip
49984                   .classed('in', false)
49985                   .call(uiToggle(false));
49986           }
49987
49988           curtain.cut(box, options.duration);
49989
49990           return tooltip;
49991       };
49992
49993
49994       curtain.cut = function(datum, duration) {
49995           darkness.datum(datum)
49996               .interrupt();
49997
49998           var selection$$1;
49999           if (duration === 0) {
50000               selection$$1 = darkness;
50001           } else {
50002               selection$$1 = darkness
50003                   .transition()
50004                   .duration(duration || 600)
50005                   .ease(linear$1);
50006           }
50007
50008           selection$$1
50009               .attr('d', function(d) {
50010                   var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
50011                       window.innerWidth + ',' + window.innerHeight + 'L' +
50012                       window.innerWidth + ',0 Z';
50013
50014                   if (!d) return string;
50015                   return string + 'M' +
50016                       d.left + ',' + d.top + 'L' +
50017                       d.left + ',' + (d.top + d.height) + 'L' +
50018                       (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
50019                       (d.left + d.width) + ',' + (d.top) + 'Z';
50020
50021               });
50022       };
50023
50024
50025       curtain.remove = function() {
50026           surface.remove();
50027           tooltip.remove();
50028           d3_select(window).on('resize.curtain', null);
50029       };
50030
50031
50032       // ClientRects are immutable, so copy them to an object,
50033       // in case we need to trim the height/width.
50034       function copyBox(src) {
50035           return {
50036               top: src.top,
50037               right: src.right,
50038               bottom: src.bottom,
50039               left: src.left,
50040               width: src.width,
50041               height: src.height
50042           };
50043       }
50044
50045
50046       return curtain;
50047   }
50048
50049   function uiIntroWelcome(context, reveal) {
50050       var dispatch$$1 = dispatch('done'),
50051           listener = clickListener();
50052
50053       var chapter = {
50054           title: 'intro.welcome.title'
50055       };
50056
50057
50058       function welcome() {
50059           context.map().centerZoom([-85.63591, 41.94285], 19);
50060           reveal('.intro-nav-wrap .chapter-welcome',
50061               t('intro.welcome.welcome'),
50062               { buttonText: t('intro.ok'), buttonCallback: practice }
50063           );
50064       }
50065
50066       function practice() {
50067           reveal('.intro-nav-wrap .chapter-welcome',
50068               t('intro.welcome.practice'),
50069               { buttonText: t('intro.ok'), buttonCallback: words }
50070           );
50071       }
50072
50073       function words() {
50074           reveal('.intro-nav-wrap .chapter-welcome',
50075               t('intro.welcome.words'),
50076               { buttonText: t('intro.ok'), buttonCallback: mouse }
50077           );
50078       }
50079
50080
50081       function mouse() {
50082           reveal('.intro-nav-wrap .chapter-welcome',
50083               t('intro.welcome.mouse'),
50084               { buttonText: t('intro.ok'), buttonCallback: leftClick }
50085           );
50086       }
50087
50088
50089       function leftClick() {
50090           var counter = 0,
50091               times = 5;
50092
50093           var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
50094               t('intro.welcome.leftclick', { num: times }),
50095               { tooltipClass: 'intro-mouse' }
50096           );
50097
50098           tooltip.selectAll('.tooltip-inner')
50099               .insert('svg', 'span')
50100               .attr('class', 'tooltip-illustration')
50101               .append('use')
50102               .attr('xlink:href', '#walkthrough-mouse');
50103
50104           tooltip
50105               .append('div')
50106               .attr('class', 'counter');
50107
50108           tooltip.call(listener);
50109
50110           listener.on('click', function(which) {
50111               if (which === 'left') {
50112                   d3_select('.curtain-tooltip.intro-mouse .counter')
50113                       .text(String(++counter));
50114
50115                   if (counter === times) {
50116                       window.setTimeout(function() { continueTo(rightClick); }, 1000);
50117                   }
50118               }
50119           });
50120
50121           function continueTo(nextStep) {
50122               listener.on('click', null);
50123               tooltip.call(listener.off);
50124               tooltip.select('.counter').remove();
50125               nextStep();
50126           }
50127       }
50128
50129
50130       function rightClick() {
50131           var counter = 0,
50132               times = 5;
50133
50134           var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
50135               t('intro.welcome.rightclick', { num: times }),
50136               { tooltipClass: 'intro-mouse' }
50137           );
50138
50139           tooltip.selectAll('.tooltip-inner')
50140               .insert('svg', 'span')
50141               .attr('class', 'tooltip-illustration')
50142               .append('use')
50143               .attr('xlink:href', '#walkthrough-mouse');
50144
50145           tooltip
50146               .append('div')
50147               .attr('class', 'counter');
50148
50149           tooltip.call(listener);
50150
50151           listener.on('click', function(which) {
50152               if (which === 'right') {
50153                   d3_select('.curtain-tooltip.intro-mouse .counter')
50154                       .text(String(++counter));
50155
50156                   if (counter === times) {
50157                       window.setTimeout(function() { continueTo(chapters); }, 1000);
50158                   }
50159               }
50160           });
50161
50162           function continueTo(nextStep) {
50163               listener.on('click', null);
50164               tooltip.call(listener.off);
50165               tooltip.select('.counter').remove();
50166               nextStep();
50167           }
50168       }
50169
50170
50171       function chapters() {
50172           dispatch$$1.call('done');
50173           reveal('.intro-nav-wrap .chapter-navigation',
50174               t('intro.welcome.chapters', { next: t('intro.navigation.title') })
50175           );
50176       }
50177
50178
50179       chapter.enter = function() {
50180           welcome();
50181       };
50182
50183
50184       chapter.exit = function() {
50185           listener.off();
50186           d3_select('.curtain-tooltip.intro-mouse')
50187               .selectAll('.counter')
50188               .remove();
50189       };
50190
50191
50192       chapter.restart = function() {
50193           chapter.exit();
50194           chapter.enter();
50195       };
50196
50197
50198       return utilRebind(chapter, dispatch$$1, 'on');
50199   }
50200
50201
50202
50203   function clickListener() {
50204       var dispatch$$1 = dispatch('click'),
50205           minTime = 120,
50206           tooltip = d3_select(null),
50207           down = {};
50208
50209       // `down` keeps track of which buttons/keys are down.
50210       // Setting a property in `down` happens immediately.
50211       // Unsetting a property in `down` is delayed because
50212       //   on Windows a contextmenu event happens after keyup/mouseup
50213
50214       function keydown() {
50215           if (event.keyCode === 93)  {   // context menu
50216               event.preventDefault();
50217               event.stopPropagation();
50218               down.menu = event.timeStamp;
50219               tooltip.classed('rightclick', true);
50220           }
50221       }
50222
50223
50224       function keyup() {
50225           if (event.keyCode === 93)  {   // context menu
50226               event.preventDefault();
50227               event.stopPropagation();
50228               var endTime = event.timeStamp,
50229                   startTime = down.menu || endTime,
50230                   delay = (endTime - startTime < minTime) ? minTime : 0;
50231
50232               window.setTimeout(function() {
50233                   tooltip.classed('rightclick', false);
50234                   down.menu = undefined;  // delayed, for Windows
50235               }, delay);
50236
50237               dispatch$$1.call('click', this, 'right');
50238           }
50239       }
50240
50241
50242       function mousedown() {
50243           var button = event.button;
50244           if (button === 0 && !event.ctrlKey) {
50245               tooltip.classed('leftclick', true);
50246           } else if (button === 2) {
50247               tooltip.classed('rightclick', true);
50248           }
50249           down[button] = event.timeStamp;
50250       }
50251
50252
50253       function mouseup() {
50254           var button = event.button,
50255               endTime = event.timeStamp,
50256               startTime = down[button] || endTime,
50257               delay = (endTime - startTime < minTime) ? minTime : 0;
50258
50259           if (button === 0 && !event.ctrlKey) {
50260               window.setTimeout(function() {
50261                   tooltip.classed('leftclick', false);
50262                   down[button] = undefined;  // delayed, for Windows
50263               }, delay);
50264
50265               dispatch$$1.call('click', this, 'left');
50266
50267           } else if (button === 2) {
50268               window.setTimeout(function() {
50269                   tooltip.classed('rightclick', false);
50270                   down[button] = undefined;  // delayed, for Windows
50271               }, delay);
50272
50273               dispatch$$1.call('click', this, 'right');
50274
50275           } else {
50276               window.setTimeout(function() {
50277                   down[button] = undefined;  // delayed, for Windows
50278               }, delay);
50279           }
50280       }
50281
50282
50283       function contextmenu() {
50284           event.preventDefault();
50285           event.stopPropagation();
50286           if (!down[2] && !down.menu) {
50287               tooltip.classed('rightclick', true);
50288               window.setTimeout(function() {
50289                   tooltip.classed('rightclick', false);
50290               }, minTime);
50291               dispatch$$1.call('click', this, 'right');
50292           }
50293       }
50294
50295
50296       var behavior = function(selection$$1) {
50297           tooltip = selection$$1;
50298           down = {};
50299
50300           d3_select(window)
50301               .on('keydown.intro', keydown)
50302               .on('keyup.intro', keyup)
50303               .on('mousedown.intro', mousedown)
50304               .on('mouseup.intro', mouseup)
50305               .on('contextmenu.intro', contextmenu);
50306       };
50307
50308
50309       behavior.off = function() {
50310           d3_select(window)
50311               .on('keydown.intro', null)
50312               .on('keyup.intro', null)
50313               .on('mousedown.intro', null)
50314               .on('mouseup.intro', null)
50315               .on('contextmenu.intro', null);
50316
50317           tooltip
50318               .classed('leftclick', false)
50319               .classed('rightclick', false);
50320       };
50321
50322       return utilRebind(behavior, dispatch$$1, 'on');
50323   }
50324
50325   function uiIntroNavigation(context, reveal) {
50326       var dispatch$$1 = dispatch('done'),
50327           timeouts = [],
50328           hallId = 'n2061',
50329           townHall = [-85.63591, 41.94285],
50330           springStreetId = 'w397',
50331           springStreetEndId = 'n1834',
50332           springStreet = [-85.63582, 41.94255],
50333           onewayField = context.presets().field('oneway'),
50334           maxspeedField = context.presets().field('maxspeed');
50335
50336
50337       var chapter = {
50338           title: 'intro.navigation.title'
50339       };
50340
50341
50342       function timeout(f, t$$1) {
50343           timeouts.push(window.setTimeout(f, t$$1));
50344       }
50345
50346
50347       function eventCancel() {
50348           event.stopPropagation();
50349           event.preventDefault();
50350       }
50351
50352
50353       function isTownHallSelected() {
50354           var ids = context.selectedIDs();
50355           return ids.length === 1 && ids[0] === hallId;
50356       }
50357
50358
50359       function dragMap() {
50360           context.enter(modeBrowse(context));
50361           context.history().reset('initial');
50362
50363           var msec = transitionTime(townHall, context.map().center());
50364           if (msec) { reveal(null, null, { duration: 0 }); }
50365           context.map().zoom(19).centerEase(townHall, msec);
50366
50367           timeout(function() {
50368               var centerStart = context.map().center();
50369
50370               reveal('#surface', t('intro.navigation.drag'));
50371               context.map().on('drawn.intro', function() {
50372                   reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
50373               });
50374
50375               context.map().on('move.intro', function() {
50376                   var centerNow = context.map().center();
50377                   if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
50378                       context.map().on('move.intro', null);
50379                       timeout(function() { continueTo(zoomMap); }, 3000);
50380                   }
50381               });
50382
50383           }, msec + 100);
50384
50385           function continueTo(nextStep) {
50386               context.map().on('move.intro drawn.intro', null);
50387               nextStep();
50388           }
50389       }
50390
50391
50392       function zoomMap() {
50393           var zoomStart = context.map().zoom();
50394
50395           reveal('#surface',
50396               t('intro.navigation.zoom', {
50397                   plus: icon('#icon-plus', 'pre-text'),
50398                   minus: icon('#icon-minus', 'pre-text')
50399               })
50400           );
50401
50402           context.map().on('drawn.intro', function() {
50403               reveal('#surface',
50404                   t('intro.navigation.zoom', {
50405                       plus: icon('#icon-plus', 'pre-text'),
50406                       minus: icon('#icon-minus', 'pre-text')
50407                   }), { duration: 0 }
50408               );
50409           });
50410
50411           context.map().on('move.intro', function() {
50412               if (context.map().zoom() !== zoomStart) {
50413                   context.map().on('move.intro', null);
50414                   timeout(function() { continueTo(features); }, 3000);
50415               }
50416           });
50417
50418           function continueTo(nextStep) {
50419               context.map().on('move.intro drawn.intro', null);
50420               nextStep();
50421           }
50422       }
50423
50424
50425       function features() {
50426           var onClick = function() { continueTo(pointsLinesAreas); };
50427
50428           reveal('#surface', t('intro.navigation.features'),
50429               { buttonText: t('intro.ok'), buttonCallback: onClick }
50430           );
50431
50432           context.map().on('drawn.intro', function() {
50433               reveal('#surface', t('intro.navigation.features'),
50434                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50435               );
50436           });
50437
50438           function continueTo(nextStep) {
50439               context.map().on('drawn.intro', null);
50440               nextStep();
50441           }
50442       }
50443
50444       function pointsLinesAreas() {
50445           var onClick = function() { continueTo(nodesWays); };
50446
50447           reveal('#surface', t('intro.navigation.points_lines_areas'),
50448               { buttonText: t('intro.ok'), buttonCallback: onClick }
50449           );
50450
50451           context.map().on('drawn.intro', function() {
50452               reveal('#surface', t('intro.navigation.points_lines_areas'),
50453                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50454               );
50455           });
50456
50457           function continueTo(nextStep) {
50458               context.map().on('drawn.intro', null);
50459               nextStep();
50460           }
50461       }
50462
50463       function nodesWays() {
50464           var onClick = function() { continueTo(clickTownHall); };
50465
50466           reveal('#surface', t('intro.navigation.nodes_ways'),
50467               { buttonText: t('intro.ok'), buttonCallback: onClick }
50468           );
50469
50470           context.map().on('drawn.intro', function() {
50471               reveal('#surface', t('intro.navigation.nodes_ways'),
50472                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50473               );
50474           });
50475
50476           function continueTo(nextStep) {
50477               context.map().on('drawn.intro', null);
50478               nextStep();
50479           }
50480       }
50481
50482       function clickTownHall() {
50483           context.enter(modeBrowse(context));
50484           context.history().reset('initial');
50485
50486           reveal(null, null, { duration: 0 });
50487           context.map().zoomEase(19, 500);
50488
50489           timeout(function() {
50490               var entity = context.hasEntity(hallId);
50491               if (!entity) return;
50492               context.map().centerEase(entity.loc, 500);
50493
50494               timeout(function() {
50495                   var entity = context.hasEntity(hallId);
50496                   if (!entity) return;
50497                   var box = pointBox(entity.loc, context);
50498                   reveal(box, t('intro.navigation.click_townhall'));
50499
50500                   context.map().on('move.intro drawn.intro', function() {
50501                       var entity = context.hasEntity(hallId);
50502                       if (!entity) return;
50503                       var box = pointBox(entity.loc, context);
50504                       reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
50505                   });
50506
50507                   context.on('enter.intro', function() {
50508                       if (isTownHallSelected()) continueTo(selectedTownHall);
50509                   });
50510
50511               }, 550);  // after centerEase
50512
50513           }, 550); // after zoomEase
50514
50515           context.history().on('change.intro', function() {
50516               if (!context.hasEntity(hallId)) {
50517                   continueTo(clickTownHall);
50518               }
50519           });
50520
50521           function continueTo(nextStep) {
50522               context.on('enter.intro', null);
50523               context.map().on('move.intro drawn.intro', null);
50524               context.history().on('change.intro', null);
50525               nextStep();
50526           }
50527       }
50528
50529
50530       function selectedTownHall() {
50531           if (!isTownHallSelected()) return clickTownHall();
50532
50533           var entity = context.hasEntity(hallId);
50534           if (!entity) return clickTownHall();
50535
50536           var box = pointBox(entity.loc, context);
50537           var onClick = function() { continueTo(editorTownHall); };
50538
50539           reveal(box, t('intro.navigation.selected_townhall'),
50540               { buttonText: t('intro.ok'), buttonCallback: onClick }
50541           );
50542
50543           context.map().on('move.intro drawn.intro', function() {
50544               var entity = context.hasEntity(hallId);
50545               if (!entity) return;
50546               var box = pointBox(entity.loc, context);
50547               reveal(box, t('intro.navigation.selected_townhall'),
50548                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50549               );
50550           });
50551
50552           context.history().on('change.intro', function() {
50553               if (!context.hasEntity(hallId)) {
50554                   continueTo(clickTownHall);
50555               }
50556           });
50557
50558           function continueTo(nextStep) {
50559               context.map().on('move.intro drawn.intro', null);
50560               context.history().on('change.intro', null);
50561               nextStep();
50562           }
50563       }
50564
50565
50566       function editorTownHall() {
50567           if (!isTownHallSelected()) return clickTownHall();
50568
50569           // disallow scrolling
50570           d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50571
50572           var onClick = function() { continueTo(presetTownHall); };
50573
50574           reveal('.entity-editor-pane',
50575               t('intro.navigation.editor_townhall'),
50576               { buttonText: t('intro.ok'), buttonCallback: onClick }
50577           );
50578
50579           context.on('exit.intro', function() {
50580               continueTo(clickTownHall);
50581           });
50582
50583           context.history().on('change.intro', function() {
50584               if (!context.hasEntity(hallId)) {
50585                   continueTo(clickTownHall);
50586               }
50587           });
50588
50589           function continueTo(nextStep) {
50590               context.on('exit.intro', null);
50591               context.history().on('change.intro', null);
50592               d3_select('.inspector-wrap').on('wheel.intro', null);
50593               nextStep();
50594           }
50595       }
50596
50597
50598       function presetTownHall() {
50599           if (!isTownHallSelected()) return clickTownHall();
50600
50601           // reset pane, in case user happened to change it..
50602           d3_select('.inspector-wrap .panewrap').style('right', '0%');
50603           // disallow scrolling
50604           d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50605
50606           // preset match, in case the user happened to change it.
50607           var entity = context.entity(context.selectedIDs()[0]);
50608           var preset = context.presets().match(entity, context.graph());
50609
50610           var onClick = function() { continueTo(fieldsTownHall); };
50611
50612           context.on('exit.intro', function() {
50613               continueTo(clickTownHall);
50614           });
50615
50616           context.history().on('change.intro', function() {
50617               if (!context.hasEntity(hallId)) {
50618                   continueTo(clickTownHall);
50619               }
50620           });
50621
50622           reveal('.inspector-body .preset-list-item.inspector-inner',
50623               t('intro.navigation.preset_townhall', { preset: preset.name() }),
50624               { buttonText: t('intro.ok'), buttonCallback: onClick }
50625           );
50626
50627           function continueTo(nextStep) {
50628               context.on('exit.intro', null);
50629               context.history().on('change.intro', null);
50630               d3_select('.inspector-wrap').on('wheel.intro', null);
50631               nextStep();
50632           }
50633       }
50634
50635
50636       function fieldsTownHall() {
50637           if (!isTownHallSelected()) return clickTownHall();
50638
50639           // reset pane, in case user happened to change it..
50640           d3_select('.inspector-wrap .panewrap').style('right', '0%');
50641           // disallow scrolling
50642           d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50643
50644           var onClick = function() { continueTo(closeTownHall); };
50645
50646           reveal('.inspector-body .preset-editor',
50647               t('intro.navigation.fields_townhall'),
50648               { buttonText: t('intro.ok'), buttonCallback: onClick }
50649           );
50650
50651           context.on('exit.intro', function() {
50652               continueTo(clickTownHall);
50653           });
50654
50655           context.history().on('change.intro', function() {
50656               if (!context.hasEntity(hallId)) {
50657                   continueTo(clickTownHall);
50658               }
50659           });
50660
50661           function continueTo(nextStep) {
50662               context.on('exit.intro', null);
50663               context.history().on('change.intro', null);
50664               d3_select('.inspector-wrap').on('wheel.intro', null);
50665               nextStep();
50666           }
50667       }
50668
50669
50670       function closeTownHall() {
50671           if (!isTownHallSelected()) return clickTownHall();
50672
50673           var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50674           var href = d3_select(selector$$1).attr('href') || '#icon-close';
50675
50676           reveal('.entity-editor-pane',
50677               t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
50678           );
50679
50680           context.on('exit.intro', function() {
50681               continueTo(searchStreet);
50682           });
50683
50684           context.history().on('change.intro', function() {
50685               // update the close icon in the tooltip if the user edits something.
50686               var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50687               var href = d3_select(selector$$1).attr('href') || '#icon-close';
50688
50689               reveal('.entity-editor-pane',
50690                   t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
50691                   { duration: 0 }
50692               );
50693           });
50694
50695           function continueTo(nextStep) {
50696               context.on('exit.intro', null);
50697               context.history().on('change.intro', null);
50698               nextStep();
50699           }
50700       }
50701
50702
50703       function searchStreet() {
50704           context.enter(modeBrowse(context));
50705           context.history().reset('initial');  // ensure spring street exists
50706
50707           var msec = transitionTime(springStreet, context.map().center());
50708           if (msec) { reveal(null, null, { duration: 0 }); }
50709           context.map().zoom(19).centerEase(springStreet, msec);  // ..and user can see it
50710
50711           timeout(function() {
50712               reveal('.search-header input',
50713                   t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
50714               );
50715
50716               d3_select('.search-header input')
50717                   .on('keyup.intro', checkSearchResult);
50718           }, msec + 100);
50719       }
50720
50721
50722       function checkSearchResult() {
50723           var first = d3_select('.feature-list-item:nth-child(0n+2)'),  // skip "No Results" item
50724               firstName = first.select('.entity-name'),
50725               name = t('intro.graph.name.spring-street');
50726
50727           if (!firstName.empty() && firstName.text() === name) {
50728               reveal(first.node(),
50729                   t('intro.navigation.choose_street', { name: name }),
50730                   { duration: 300 }
50731               );
50732
50733               context.on('exit.intro', function() {
50734                   continueTo(selectedStreet);
50735               });
50736
50737               d3_select('.search-header input')
50738                   .on('keydown.intro', eventCancel, true)
50739                   .on('keyup.intro', null);
50740           }
50741
50742           function continueTo(nextStep) {
50743               context.on('exit.intro', null);
50744               d3_select('.search-header input')
50745                   .on('keydown.intro', null)
50746                   .on('keyup.intro', null);
50747               nextStep();
50748           }
50749       }
50750
50751
50752       function selectedStreet() {
50753           if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
50754               return searchStreet();
50755           }
50756
50757           var onClick = function() { continueTo(editorStreet); };
50758           var entity = context.entity(springStreetEndId);
50759           var box = pointBox(entity.loc, context);
50760           box.height = 500;
50761
50762           reveal(box,
50763               t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
50764               { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
50765           );
50766
50767           timeout(function() {
50768               context.map().on('move.intro drawn.intro', function() {
50769                   var entity = context.hasEntity(springStreetEndId);
50770                   if (!entity) return;
50771                   var box = pointBox(entity.loc, context);
50772                   box.height = 500;
50773                   reveal(box,
50774                       t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
50775                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50776                   );
50777               });
50778           }, 600);  // after reveal.
50779
50780           context.on('enter.intro', function(mode) {
50781               if (!context.hasEntity(springStreetId)) {
50782                   return continueTo(searchStreet);
50783               }
50784               var ids = context.selectedIDs();
50785               if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
50786                   // keep Spring Street selected..
50787                   context.enter(modeSelect(context, [springStreetId]));
50788               }
50789           });
50790
50791           context.history().on('change.intro', function() {
50792               if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
50793                   timeout(function() {
50794                       continueTo(searchStreet);
50795                   }, 300);  // after any transition (e.g. if user deleted intersection)
50796               }
50797           });
50798
50799           function continueTo(nextStep) {
50800               context.map().on('move.intro drawn.intro', null);
50801               context.on('enter.intro', null);
50802               context.history().on('change.intro', null);
50803               nextStep();
50804           }
50805       }
50806
50807
50808       function editorStreet() {
50809           var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50810           var href = d3_select(selector$$1).attr('href') || '#icon-close';
50811
50812           reveal('.entity-editor-pane',
50813               t('intro.navigation.editor_street', {
50814                   button: icon(href, 'pre-text'),
50815                   field1: onewayField.label(),
50816                   field2: maxspeedField.label()
50817               })
50818           );
50819
50820           context.on('exit.intro', function() {
50821               continueTo(play);
50822           });
50823
50824           context.history().on('change.intro', function() {
50825               // update the close icon in the tooltip if the user edits something.
50826               var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50827               var href = d3_select(selector$$1).attr('href') || '#icon-close';
50828
50829               reveal('.entity-editor-pane',
50830                   t('intro.navigation.editor_street', {
50831                       button: icon(href, 'pre-text'),
50832                       field1: onewayField.label().toLowerCase(),
50833                       field2: maxspeedField.label().toLowerCase()
50834                   }), { duration: 0 }
50835               );
50836           });
50837
50838           function continueTo(nextStep) {
50839               context.on('exit.intro', null);
50840               context.history().on('change.intro', null);
50841               nextStep();
50842           }
50843       }
50844
50845
50846       function play() {
50847           dispatch$$1.call('done');
50848           reveal('#id-container',
50849               t('intro.navigation.play', { next: t('intro.points.title') }), {
50850                   tooltipBox: '.intro-nav-wrap .chapter-point',
50851                   buttonText: t('intro.ok'),
50852                   buttonCallback: function() { reveal('#id-container'); }
50853               }
50854           );
50855       }
50856
50857
50858       chapter.enter = function() {
50859           dragMap();
50860       };
50861
50862
50863       chapter.exit = function() {
50864           timeouts.forEach(window.clearTimeout);
50865           context.on('enter.intro exit.intro', null);
50866           context.map().on('move.intro drawn.intro', null);
50867           context.history().on('change.intro', null);
50868           d3_select('.inspector-wrap').on('wheel.intro', null);
50869           d3_select('.search-header input').on('keydown.intro keyup.intro', null);
50870       };
50871
50872
50873       chapter.restart = function() {
50874           chapter.exit();
50875           chapter.enter();
50876       };
50877
50878
50879       return utilRebind(chapter, dispatch$$1, 'on');
50880   }
50881
50882   function uiIntroPoint(context, reveal) {
50883       var dispatch$$1 = dispatch('done'),
50884           timeouts = [],
50885           intersection = [-85.63279, 41.94394],
50886           building = [-85.632422, 41.944045],
50887           cafePreset = context.presets().item('amenity/cafe'),
50888           pointId = null;
50889
50890
50891       var chapter = {
50892           title: 'intro.points.title'
50893       };
50894
50895
50896       function timeout(f, t$$1) {
50897           timeouts.push(window.setTimeout(f, t$$1));
50898       }
50899
50900
50901       function revealEditMenu(loc, text, options) {
50902           var rect = context.surfaceRect();
50903           var point$$1 = context.curtainProjection(loc);
50904           var pad = 40;
50905           var width = 250 + (2 * pad);
50906           var height = 250;
50907           var startX = rect.left + point$$1[0];
50908           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
50909           var box = {
50910               left: left,
50911               top: point$$1[1] + rect.top - 60,
50912               width: width,
50913               height: height
50914           };
50915           reveal(box, text, options);
50916       }
50917
50918
50919       function eventCancel() {
50920           event.stopPropagation();
50921           event.preventDefault();
50922       }
50923
50924
50925       function addPoint() {
50926           context.enter(modeBrowse(context));
50927           context.history().reset('initial');
50928
50929           var msec = transitionTime(intersection, context.map().center());
50930           if (msec) { reveal(null, null, { duration: 0 }); }
50931           context.map().zoom(19).centerEase(intersection, msec);
50932
50933           timeout(function() {
50934               var tooltip = reveal('button.add-point',
50935                   t('intro.points.add_point', { button: icon('#icon-point', 'pre-text') }));
50936
50937               pointId = null;
50938
50939               tooltip.selectAll('.tooltip-inner')
50940                   .insert('svg', 'span')
50941                   .attr('class', 'tooltip-illustration')
50942                   .append('use')
50943                   .attr('xlink:href', '#poi-images');
50944
50945               context.on('enter.intro', function(mode) {
50946                   if (mode.id !== 'add-point') return;
50947                   continueTo(placePoint);
50948               });
50949           }, msec + 100);
50950
50951           function continueTo(nextStep) {
50952               context.on('enter.intro', null);
50953               nextStep();
50954           }
50955       }
50956
50957
50958       function placePoint() {
50959           if (context.mode().id !== 'add-point') {
50960               return chapter.restart();
50961           }
50962
50963           var pointBox$$1 = pad$1(building, 150, context);
50964           reveal(pointBox$$1, t('intro.points.place_point'));
50965
50966           context.map().on('move.intro drawn.intro', function() {
50967               pointBox$$1 = pad$1(building, 150, context);
50968               reveal(pointBox$$1, t('intro.points.place_point'), { duration: 0 });
50969           });
50970
50971           context.on('enter.intro', function(mode) {
50972               if (mode.id !== 'select') return chapter.restart();
50973               pointId = context.mode().selectedIDs()[0];
50974               continueTo(searchPreset);
50975           });
50976
50977           function continueTo(nextStep) {
50978               context.map().on('move.intro drawn.intro', null);
50979               context.on('enter.intro', null);
50980               nextStep();
50981           }
50982       }
50983
50984
50985       function searchPreset() {
50986           if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
50987               return addPoint();
50988           }
50989
50990           // disallow scrolling
50991           d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50992
50993           d3_select('.preset-search-input')
50994               .on('keydown.intro', null)
50995               .on('keyup.intro', checkPresetSearch);
50996
50997           reveal('.preset-search-input',
50998               t('intro.points.search_cafe', { preset: cafePreset.name() })
50999           );
51000
51001           context.on('enter.intro', function(mode) {
51002               if (!pointId || !context.hasEntity(pointId)) {
51003                   return continueTo(addPoint);
51004               }
51005
51006               var ids = context.selectedIDs();
51007               if (mode.id !== 'select' || !ids.length || ids[0] !== pointId) {
51008                   // keep the user's point selected..
51009                   context.enter(modeSelect(context, [pointId]));
51010
51011                   // disallow scrolling
51012                   d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51013
51014                   d3_select('.preset-search-input')
51015                       .on('keydown.intro', null)
51016                       .on('keyup.intro', checkPresetSearch);
51017
51018                   reveal('.preset-search-input',
51019                       t('intro.points.search_cafe', { preset: cafePreset.name() })
51020                   );
51021
51022                   context.history().on('change.intro', null);
51023               }
51024           });
51025
51026
51027           function checkPresetSearch() {
51028               var first = d3_select('.preset-list-item:first-child');
51029
51030               if (first.classed('preset-amenity-cafe')) {
51031                   d3_select('.preset-search-input')
51032                       .on('keydown.intro', eventCancel, true)
51033                       .on('keyup.intro', null);
51034
51035                   reveal(first.select('.preset-list-button').node(),
51036                       t('intro.points.choose_cafe', { preset: cafePreset.name() }),
51037                       { duration: 300 }
51038                   );
51039
51040                   context.history().on('change.intro', function() {
51041                       continueTo(aboutFeatureEditor);
51042                   });
51043               }
51044           }
51045
51046           function continueTo(nextStep) {
51047               context.on('enter.intro', null);
51048               context.history().on('change.intro', null);
51049               d3_select('.inspector-wrap').on('wheel.intro', null);
51050               d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
51051               nextStep();
51052           }
51053       }
51054
51055
51056       function aboutFeatureEditor() {
51057           if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
51058               return addPoint();
51059           }
51060
51061           timeout(function() {
51062               reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
51063                   tooltipClass: 'intro-points-describe',
51064                   buttonText: t('intro.ok'),
51065                   buttonCallback: function() { continueTo(addName); }
51066               });
51067           }, 400);
51068
51069           context.on('exit.intro', function() {
51070               // if user leaves select mode here, just continue with the tutorial.
51071               continueTo(reselectPoint);
51072           });
51073
51074           function continueTo(nextStep) {
51075               context.on('exit.intro', null);
51076               nextStep();
51077           }
51078       }
51079
51080
51081       function addName() {
51082           if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
51083               return addPoint();
51084           }
51085
51086           // reset pane, in case user happened to change it..
51087           d3_select('.inspector-wrap .panewrap').style('right', '0%');
51088
51089           timeout(function() {
51090               // It's possible for the user to add a name in a previous step..
51091               // If so, don't tell them to add the name in this step.
51092               // Give them an OK button instead.
51093               var entity = context.entity(pointId);
51094               if (entity.tags.name) {
51095                   var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
51096                       tooltipClass: 'intro-points-describe',
51097                       buttonText: t('intro.ok'),
51098                       buttonCallback: function() { continueTo(addCloseEditor); }
51099                   });
51100                   tooltip.select('.instruction').style('display', 'none');
51101
51102               } else {
51103                   reveal('.entity-editor-pane', t('intro.points.add_name'),
51104                       { tooltipClass: 'intro-points-describe' }
51105                   );
51106               }
51107           }, 400);
51108
51109           context.history().on('change.intro', function() {
51110               continueTo(addCloseEditor);
51111           });
51112
51113           context.on('exit.intro', function() {
51114               // if user leaves select mode here, just continue with the tutorial.
51115               continueTo(reselectPoint);
51116           });
51117
51118           function continueTo(nextStep) {
51119               context.on('exit.intro', null);
51120               context.history().on('change.intro', null);
51121               nextStep();
51122           }
51123       }
51124
51125
51126       function addCloseEditor() {
51127           // reset pane, in case user happened to change it..
51128           d3_select('.inspector-wrap .panewrap').style('right', '0%');
51129
51130           var selector$$1 = '.entity-editor-pane button.preset-close svg use';
51131           var href = d3_select(selector$$1).attr('href') || '#icon-close';
51132
51133           context.on('exit.intro', function() {
51134               continueTo(reselectPoint);
51135           });
51136
51137           reveal('.entity-editor-pane',
51138               t('intro.points.add_close', { button: icon(href, 'pre-text') })
51139           );
51140
51141           function continueTo(nextStep) {
51142               context.on('exit.intro', null);
51143               nextStep();
51144           }
51145       }
51146
51147
51148       function reselectPoint() {
51149           if (!pointId) return chapter.restart();
51150           var entity = context.hasEntity(pointId);
51151           if (!entity) return chapter.restart();
51152
51153           // make sure it's still a cafe, in case user somehow changed it..
51154           var oldPreset = context.presets().match(entity, context.graph());
51155           context.replace(actionChangePreset(pointId, oldPreset, cafePreset));
51156
51157           context.enter(modeBrowse(context));
51158
51159           var msec = transitionTime(entity.loc, context.map().center());
51160           if (msec) { reveal(null, null, { duration: 0 }); }
51161           context.map().centerEase(entity.loc, msec);
51162
51163           timeout(function() {
51164               var box = pointBox(entity.loc, context);
51165               reveal(box, t('intro.points.reselect'), { duration: 600 });
51166
51167               timeout(function() {
51168                   context.map().on('move.intro drawn.intro', function() {
51169                       var entity = context.hasEntity(pointId);
51170                       if (!entity) return chapter.restart();
51171                       var box = pointBox(entity.loc, context);
51172                       reveal(box, t('intro.points.reselect'), { duration: 0 });
51173                   });
51174               }, 600); // after reveal..
51175
51176               context.on('enter.intro', function(mode) {
51177                   if (mode.id !== 'select') return;
51178                   continueTo(updatePoint);
51179               });
51180
51181           }, msec + 100);
51182
51183           function continueTo(nextStep) {
51184               context.map().on('move.intro drawn.intro', null);
51185               context.on('enter.intro', null);
51186               nextStep();
51187           }
51188       }
51189
51190
51191       function updatePoint() {
51192           if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
51193               return continueTo(reselectPoint);
51194           }
51195
51196           // reset pane, in case user happened to untag the point..
51197           d3_select('.inspector-wrap .panewrap').style('right', '0%');
51198
51199           context.on('exit.intro', function() {
51200               continueTo(reselectPoint);
51201           });
51202
51203           context.history().on('change.intro', function() {
51204               continueTo(updateCloseEditor);
51205           });
51206
51207           timeout(function() {
51208               reveal('.entity-editor-pane', t('intro.points.update'),
51209                   { tooltipClass: 'intro-points-describe' }
51210               );
51211           }, 400);
51212
51213           function continueTo(nextStep) {
51214               context.on('exit.intro', null);
51215               context.history().on('change.intro', null);
51216               nextStep();
51217           }
51218       }
51219
51220
51221       function updateCloseEditor() {
51222           if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
51223               return continueTo(reselectPoint);
51224           }
51225
51226           // reset pane, in case user happened to change it..
51227           d3_select('.inspector-wrap .panewrap').style('right', '0%');
51228
51229           context.on('exit.intro', function() {
51230               continueTo(rightClickPoint);
51231           });
51232
51233           timeout(function() {
51234               reveal('.entity-editor-pane',
51235                   t('intro.points.update_close', { button: icon('#icon-apply', 'pre-text') })
51236               );
51237           }, 500);
51238
51239           function continueTo(nextStep) {
51240               context.on('exit.intro', null);
51241               nextStep();
51242           }
51243       }
51244
51245
51246       function rightClickPoint() {
51247           if (!pointId) return chapter.restart();
51248           var entity = context.hasEntity(pointId);
51249           if (!entity) return chapter.restart();
51250
51251           context.enter(modeBrowse(context));
51252
51253           var box = pointBox(entity.loc, context);
51254           reveal(box, t('intro.points.rightclick'), { duration: 600 });
51255
51256           timeout(function() {
51257               context.map().on('move.intro drawn.intro', function() {
51258                   var entity = context.hasEntity(pointId);
51259                   if (!entity) return chapter.restart();
51260                   var box = pointBox(entity.loc, context);
51261                   reveal(box, t('intro.points.rightclick'), { duration: 0 });
51262               });
51263           }, 600); // after reveal
51264
51265           context.on('enter.intro', function(mode) {
51266               if (mode.id !== 'select') return;
51267               var ids = context.selectedIDs();
51268               if (ids.length !== 1 || ids[0] !== pointId) return;
51269
51270               timeout(function() {
51271                   var node = selectMenuItem('delete').node();
51272                   if (!node) return;
51273                   continueTo(enterDelete);
51274               }, 300);  // after menu visible
51275           });
51276
51277           function continueTo(nextStep) {
51278               context.on('enter.intro', null);
51279               context.map().on('move.intro drawn.intro', null);
51280               nextStep();
51281           }
51282       }
51283
51284
51285       function enterDelete() {
51286           if (!pointId) return chapter.restart();
51287           var entity = context.hasEntity(pointId);
51288           if (!entity) return chapter.restart();
51289
51290           var node = selectMenuItem('delete').node();
51291           if (!node) { return continueTo(rightClickPoint); }
51292
51293           revealEditMenu(entity.loc,
51294               t('intro.points.delete', { button: icon('#operation-delete', 'pre-text') })
51295           );
51296
51297           timeout(function() {
51298               context.map().on('move.intro drawn.intro', function() {
51299                   revealEditMenu(entity.loc,
51300                       t('intro.points.delete', { button: icon('#operation-delete', 'pre-text') }),
51301                       { duration: 0}
51302                   );
51303               });
51304           }, 300); // after menu visible
51305
51306           context.on('exit.intro', function() {
51307               if (!pointId) return chapter.restart();
51308               var entity = context.hasEntity(pointId);
51309               if (entity) return continueTo(rightClickPoint);  // point still exists
51310           });
51311
51312           context.history().on('change.intro', function(changed) {
51313               if (changed.deleted().length) {
51314                   continueTo(undo);
51315               }
51316           });
51317
51318           function continueTo(nextStep) {
51319               context.map().on('move.intro drawn.intro', null);
51320               context.history().on('change.intro', null);
51321               context.on('exit.intro', null);
51322               nextStep();
51323           }
51324       }
51325
51326
51327       function undo() {
51328           context.history().on('change.intro', function() {
51329               continueTo(play);
51330           });
51331
51332           var iconName = '#icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
51333           reveal('#bar button.undo-button',
51334               t('intro.points.undo', { button: icon(iconName, 'pre-text') })
51335           );
51336
51337           function continueTo(nextStep) {
51338               context.history().on('change.intro', null);
51339               nextStep();
51340           }
51341       }
51342
51343
51344       function play() {
51345           dispatch$$1.call('done');
51346           reveal('#id-container',
51347               t('intro.points.play', { next: t('intro.areas.title') }), {
51348                   tooltipBox: '.intro-nav-wrap .chapter-area',
51349                   buttonText: t('intro.ok'),
51350                   buttonCallback: function() { reveal('#id-container'); }
51351               }
51352           );
51353       }
51354
51355
51356       chapter.enter = function() {
51357           addPoint();
51358       };
51359
51360
51361       chapter.exit = function() {
51362           timeouts.forEach(window.clearTimeout);
51363           context.on('enter.intro exit.intro', null);
51364           context.map().on('move.intro drawn.intro', null);
51365           context.history().on('change.intro', null);
51366           d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51367           d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
51368       };
51369
51370
51371       chapter.restart = function() {
51372           chapter.exit();
51373           chapter.enter();
51374       };
51375
51376
51377       return utilRebind(chapter, dispatch$$1, 'on');
51378   }
51379
51380   function uiIntroArea(context, reveal) {
51381       var dispatch$$1 = dispatch('done'),
51382           playground = [-85.63552, 41.94159],
51383           playgroundPreset = context.presets().item('leisure/playground'),
51384           descriptionField = context.presets().field('description'),
51385           timeouts = [],
51386           areaId;
51387
51388
51389       var chapter = {
51390           title: 'intro.areas.title'
51391       };
51392
51393
51394       function timeout(f, t$$1) {
51395           timeouts.push(window.setTimeout(f, t$$1));
51396       }
51397
51398
51399       function eventCancel() {
51400           event.stopPropagation();
51401           event.preventDefault();
51402       }
51403
51404
51405       function revealPlayground(center, text, options) {
51406           var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
51407           var box = pad$1(center, padding, context);
51408           reveal(box, text, options);
51409       }
51410
51411
51412       function addArea() {
51413           context.enter(modeBrowse(context));
51414           context.history().reset('initial');
51415           areaId = null;
51416
51417           var msec = transitionTime(playground, context.map().center());
51418           if (msec) { reveal(null, null, { duration: 0 }); }
51419           context.map().zoom(19).centerEase(playground, msec);
51420
51421           timeout(function() {
51422               var tooltip = reveal('button.add-area',
51423                   t('intro.areas.add_playground', { button: icon('#icon-area', 'pre-text') }));
51424
51425               tooltip.selectAll('.tooltip-inner')
51426                   .insert('svg', 'span')
51427                   .attr('class', 'tooltip-illustration')
51428                   .append('use')
51429                   .attr('xlink:href', '#landuse-images');
51430
51431               context.on('enter.intro', function(mode) {
51432                   if (mode.id !== 'add-area') return;
51433                   continueTo(startPlayground);
51434               });
51435           }, msec + 100);
51436
51437           function continueTo(nextStep) {
51438               context.on('enter.intro', null);
51439               nextStep();
51440           }
51441       }
51442
51443
51444       function startPlayground() {
51445           if (context.mode().id !== 'add-area') {
51446               return chapter.restart();
51447           }
51448
51449           areaId = null;
51450           context.map().zoomEase(19.5, 500);
51451
51452           timeout(function() {
51453               revealPlayground(playground,
51454                   t('intro.areas.start_playground'), { duration: 250 }
51455               );
51456
51457               timeout(function() {
51458                   context.map().on('move.intro drawn.intro', function() {
51459                       revealPlayground(playground,
51460                           t('intro.areas.start_playground'), { duration: 0 }
51461                       );
51462                   });
51463                   context.on('enter.intro', function(mode) {
51464                       if (mode.id !== 'draw-area') return chapter.restart();
51465                       continueTo(continuePlayground);
51466                   });
51467               }, 250);  // after reveal
51468
51469           }, 550);  // after easing
51470
51471           function continueTo(nextStep) {
51472               context.map().on('move.intro drawn.intro', null);
51473               context.on('enter.intro', null);
51474               nextStep();
51475           }
51476       }
51477
51478
51479       function continuePlayground() {
51480           if (context.mode().id !== 'draw-area') {
51481               return chapter.restart();
51482           }
51483
51484           areaId = null;
51485           revealPlayground(playground,
51486               t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
51487               { duration: 250 }
51488           );
51489
51490           timeout(function() {
51491               context.map().on('move.intro drawn.intro', function() {
51492                   revealPlayground(playground,
51493                       t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
51494                       { duration: 0 }
51495                   );
51496               });
51497           }, 250);  // after reveal
51498
51499           context.on('enter.intro', function(mode) {
51500               if (mode.id === 'draw-area') {
51501                   var entity = context.hasEntity(context.selectedIDs()[0]);
51502                   if (entity && entity.nodes.length >= 6) {
51503                       return continueTo(finishPlayground);
51504                   } else {
51505                       return;
51506                   }
51507               } else if (mode.id === 'select') {
51508                   areaId = context.selectedIDs()[0];
51509                   return continueTo(searchPresets);
51510               } else {
51511                   return chapter.restart();
51512               }
51513           });
51514
51515           function continueTo(nextStep) {
51516               context.map().on('move.intro drawn.intro', null);
51517               context.on('enter.intro', null);
51518               nextStep();
51519           }
51520       }
51521
51522
51523       function finishPlayground() {
51524           if (context.mode().id !== 'draw-area') {
51525               return chapter.restart();
51526           }
51527
51528           areaId = null;
51529           revealPlayground(playground,
51530               t('intro.areas.finish_playground'), { duration: 250 }
51531           );
51532
51533           timeout(function() {
51534               context.map().on('move.intro drawn.intro', function() {
51535                   revealPlayground(playground,
51536                       t('intro.areas.finish_playground'), { duration: 0 }
51537                   );
51538               });
51539           }, 250);  // after reveal
51540
51541           context.on('enter.intro', function(mode) {
51542               if (mode.id === 'draw-area') {
51543                   return;
51544               } else if (mode.id === 'select') {
51545                   areaId = context.selectedIDs()[0];
51546                   return continueTo(searchPresets);
51547               } else {
51548                   return chapter.restart();
51549               }
51550           });
51551
51552           function continueTo(nextStep) {
51553               context.map().on('move.intro drawn.intro', null);
51554               context.on('enter.intro', null);
51555               nextStep();
51556           }
51557       }
51558
51559
51560       function searchPresets() {
51561           if (!areaId || !context.hasEntity(areaId)) {
51562               return addArea();
51563           }
51564           var ids = context.selectedIDs();
51565           if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51566               context.enter(modeSelect(context, [areaId]));
51567           }
51568
51569           // disallow scrolling
51570           d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51571
51572           timeout(function() {
51573               // reset pane, in case user somehow happened to change it..
51574               d3_select('.inspector-wrap .panewrap').style('right', '-100%');
51575
51576               d3_select('.preset-search-input')
51577                   .on('keydown.intro', null)
51578                   .on('keyup.intro', checkPresetSearch);
51579
51580               reveal('.preset-search-input',
51581                   t('intro.areas.search_playground', { preset: playgroundPreset.name() })
51582               );
51583           }, 400);  // after preset list pane visible..
51584
51585           context.on('enter.intro', function(mode) {
51586               if (!areaId || !context.hasEntity(areaId)) {
51587                   return continueTo(addArea);
51588               }
51589
51590               var ids = context.selectedIDs();
51591               if (mode.id !== 'select' || !ids.length || ids[0] !== areaId) {
51592                   // keep the user's area selected..
51593                   context.enter(modeSelect(context, [areaId]));
51594
51595                   // reset pane, in case user somehow happened to change it..
51596                   d3_select('.inspector-wrap .panewrap').style('right', '-100%');
51597                   // disallow scrolling
51598                   d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51599
51600                   d3_select('.preset-search-input')
51601                       .on('keydown.intro', null)
51602                       .on('keyup.intro', checkPresetSearch);
51603
51604                   reveal('.preset-search-input',
51605                       t('intro.areas.search_playground', { preset: playgroundPreset.name() })
51606                   );
51607
51608                   context.history().on('change.intro', null);
51609               }
51610           });
51611
51612           function checkPresetSearch() {
51613               var first = d3_select('.preset-list-item:first-child');
51614
51615               if (first.classed('preset-leisure-playground')) {
51616                   reveal(first.select('.preset-list-button').node(),
51617                       t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
51618                       { duration: 300 }
51619                   );
51620
51621                   d3_select('.preset-search-input')
51622                       .on('keydown.intro', eventCancel, true)
51623                       .on('keyup.intro', null);
51624
51625                   context.history().on('change.intro', function() {
51626                       continueTo(clickAddField);
51627                   });
51628               }
51629           }
51630
51631           function continueTo(nextStep) {
51632               d3_select('.inspector-wrap').on('wheel.intro', null);
51633               context.on('enter.intro', null);
51634               context.history().on('change.intro', null);
51635               d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
51636               nextStep();
51637           }
51638       }
51639
51640
51641       function clickAddField() {
51642           if (!areaId || !context.hasEntity(areaId)) {
51643               return addArea();
51644           }
51645           var ids = context.selectedIDs();
51646           if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51647               return searchPresets();
51648           }
51649
51650           if (!d3_select('.form-field-description').empty()) {
51651               return continueTo(describePlayground);
51652           }
51653
51654           // disallow scrolling
51655           d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51656
51657           timeout(function() {
51658               // reset pane, in case user somehow happened to change it..
51659               d3_select('.inspector-wrap .panewrap').style('right', '0%');
51660
51661               // It's possible for the user to add a description in a previous step..
51662               // If they did this already, just continue to next step.
51663               var entity = context.entity(areaId);
51664               if (entity.tags.description) {
51665                   return continueTo(play);
51666               }
51667
51668               // scroll "Add field" into view
51669               var box = d3_select('.more-fields').node().getBoundingClientRect();
51670               if (box.top > 300) {
51671                   var pane = d3_select('.entity-editor-pane .inspector-body');
51672                   var start = pane.node().scrollTop;
51673                   var end = start + (box.top - 300);
51674
51675                   pane
51676                       .transition()
51677                       .duration(250)
51678                       .tween('scroll.inspector', function() {
51679                           var node = this;
51680                           var i = d3_interpolateNumber(start, end);
51681                           return function(t$$1) {
51682                               node.scrollTop = i(t$$1);
51683                           };
51684                       });
51685               }
51686
51687               timeout(function() {
51688                   reveal('.more-fields .combobox-input',
51689                       t('intro.areas.add_field'),
51690                       { duration: 300 }
51691                   );
51692
51693                   d3_select('.more-fields .combobox-input')
51694                       .on('click.intro', function() {
51695                           continueTo(chooseDescriptionField);
51696                       });
51697               }, 300);  // after "Add Field" visible
51698
51699           }, 400);  // after editor pane visible
51700
51701           context.on('exit.intro', function() {
51702               return continueTo(searchPresets);
51703           });
51704
51705           function continueTo(nextStep) {
51706               d3_select('.inspector-wrap').on('wheel.intro', null);
51707               d3_select('.more-fields .combobox-input').on('click.intro', null);
51708               context.on('exit.intro', null);
51709               nextStep();
51710           }
51711       }
51712
51713
51714       function chooseDescriptionField() {
51715           if (!areaId || !context.hasEntity(areaId)) {
51716               return addArea();
51717           }
51718           var ids = context.selectedIDs();
51719           if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51720               return searchPresets();
51721           }
51722
51723           if (!d3_select('.form-field-description').empty()) {
51724               return continueTo(describePlayground);
51725           }
51726
51727           // Make sure combobox is ready..
51728           if (d3_select('div.combobox').empty()) {
51729               return continueTo(clickAddField);
51730           }
51731           // Watch for the combobox to go away..
51732           var watcher;
51733           watcher = window.setInterval(function() {
51734               if (d3_select('div.combobox').empty()) {
51735                   window.clearInterval(watcher);
51736                   timeout(function() {
51737                       if (d3_select('.form-field-description').empty()) {
51738                           continueTo(retryChooseDescription);
51739                       } else {
51740                           continueTo(describePlayground);
51741                       }
51742                   }, 300);  // after description field added.
51743               }
51744           }, 300);
51745
51746           reveal('div.combobox',
51747               t('intro.areas.choose_field', { field: descriptionField.label() }),
51748               { duration: 300 }
51749           );
51750
51751           context.on('exit.intro', function() {
51752               return continueTo(searchPresets);
51753           });
51754
51755           function continueTo(nextStep) {
51756               if (watcher) window.clearInterval(watcher);
51757               context.on('exit.intro', null);
51758               nextStep();
51759           }
51760       }
51761
51762
51763       function describePlayground() {
51764           if (!areaId || !context.hasEntity(areaId)) {
51765               return addArea();
51766           }
51767           var ids = context.selectedIDs();
51768           if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51769               return searchPresets();
51770           }
51771
51772           // reset pane, in case user happened to change it..
51773           d3_select('.inspector-wrap .panewrap').style('right', '0%');
51774
51775           if (d3_select('.form-field-description').empty()) {
51776               return continueTo(retryChooseDescription);
51777           }
51778
51779           context.on('exit.intro', function() {
51780               continueTo(play);
51781           });
51782
51783           reveal('.entity-editor-pane',
51784               t('intro.areas.describe_playground', { button: icon('#icon-apply', 'pre-text') }),
51785               { duration: 300 }
51786           );
51787
51788           function continueTo(nextStep) {
51789               context.on('exit.intro', null);
51790               nextStep();
51791           }
51792       }
51793
51794
51795       function retryChooseDescription() {
51796           if (!areaId || !context.hasEntity(areaId)) {
51797               return addArea();
51798           }
51799           var ids = context.selectedIDs();
51800           if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51801               return searchPresets();
51802           }
51803
51804           // reset pane, in case user happened to change it..
51805           d3_select('.inspector-wrap .panewrap').style('right', '0%');
51806
51807           reveal('.entity-editor-pane',
51808               t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
51809               buttonText: t('intro.ok'),
51810               buttonCallback: function() { continueTo(clickAddField); }
51811           });
51812
51813           context.on('exit.intro', function() {
51814               return continueTo(searchPresets);
51815           });
51816
51817           function continueTo(nextStep) {
51818               context.on('exit.intro', null);
51819               nextStep();
51820           }
51821       }
51822
51823
51824       function play() {
51825           dispatch$$1.call('done');
51826           reveal('#id-container',
51827               t('intro.areas.play', { next: t('intro.lines.title') }), {
51828                   tooltipBox: '.intro-nav-wrap .chapter-line',
51829                   buttonText: t('intro.ok'),
51830                   buttonCallback: function() { reveal('#id-container'); }
51831               }
51832           );
51833       }
51834
51835
51836       chapter.enter = function() {
51837           addArea();
51838       };
51839
51840
51841       chapter.exit = function() {
51842           timeouts.forEach(window.clearTimeout);
51843           context.on('enter.intro exit.intro', null);
51844           context.map().on('move.intro drawn.intro', null);
51845           context.history().on('change.intro', null);
51846           d3_select('.inspector-wrap').on('wheel.intro', null);
51847           d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
51848           d3_select('.more-fields .combobox-input').on('click.intro', null);
51849       };
51850
51851
51852       chapter.restart = function() {
51853           chapter.exit();
51854           chapter.enter();
51855       };
51856
51857
51858       return utilRebind(chapter, dispatch$$1, 'on');
51859   }
51860
51861   function uiIntroLine(context, reveal) {
51862       var dispatch$$1 = dispatch('done'),
51863           timeouts = [],
51864           tulipRoadId = null,
51865           flowerRoadId = 'w646',
51866           tulipRoadStart = [-85.6297754121684, 41.95805253325314],
51867           tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204],
51868           tulipRoadIntersection = [-85.62974496187628, 41.95742515554585],
51869           roadCategory = context.presets().item('category-road'),
51870           residentialPreset = context.presets().item('highway/residential'),
51871           woodRoadId = 'w525',
51872           woodRoadEndId = 'n2862',
51873           woodRoadAddNode = [-85.62390110349587, 41.95397111462291],
51874           woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487],
51875           woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872],
51876           washingtonStreetId = 'w522',
51877           twelfthAvenueId = 'w1',
51878           eleventhAvenueEndId = 'n3550',
51879           twelfthAvenueEndId = 'n5',
51880           washingtonSegmentId = null,
51881           eleventhAvenueEnd = context.entity(eleventhAvenueEndId).loc,
51882           twelfthAvenueEnd = context.entity(twelfthAvenueEndId).loc,
51883           deleteLinesLoc = [-85.6219395542764, 41.95228033922477],
51884           twelfthAvenue = [-85.62219310052491, 41.952505413152956];
51885
51886
51887       var chapter = {
51888           title: 'intro.lines.title'
51889       };
51890
51891
51892       function timeout(f, t$$1) {
51893           timeouts.push(window.setTimeout(f, t$$1));
51894       }
51895
51896
51897       function eventCancel() {
51898           event.stopPropagation();
51899           event.preventDefault();
51900       }
51901
51902
51903       function revealEditMenu(loc, text, options) {
51904           var rect = context.surfaceRect();
51905           var point$$1 = context.curtainProjection(loc);
51906           var pad = 40;
51907           var width = 250 + (2 * pad);
51908           var height = 350;
51909           var startX = rect.left + point$$1[0];
51910           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
51911           var box = {
51912               left: left,
51913               top: point$$1[1] + rect.top - 60,
51914               width: width,
51915               height: height
51916           };
51917           reveal(box, text, options);
51918       }
51919
51920
51921       function addLine() {
51922           context.enter(modeBrowse(context));
51923           context.history().reset('initial');
51924
51925           var msec = transitionTime(tulipRoadStart, context.map().center());
51926           if (msec) { reveal(null, null, { duration: 0 }); }
51927           context.map().zoom(18.5).centerEase(tulipRoadStart, msec);
51928
51929           timeout(function() {
51930               var tooltip = reveal('button.add-line',
51931                   t('intro.lines.add_line', { button: icon('#icon-line', 'pre-text') }));
51932
51933               tooltip.selectAll('.tooltip-inner')
51934                   .insert('svg', 'span')
51935                   .attr('class', 'tooltip-illustration')
51936                   .append('use')
51937                   .attr('xlink:href', '#feature-images');
51938
51939               context.on('enter.intro', function(mode) {
51940                   if (mode.id !== 'add-line') return;
51941                   continueTo(startLine);
51942               });
51943           }, msec + 100);
51944
51945           function continueTo(nextStep) {
51946               context.on('enter.intro', null);
51947               nextStep();
51948           }
51949       }
51950
51951
51952       function startLine() {
51953           if (context.mode().id !== 'add-line') {
51954               return chapter.restart();
51955           }
51956
51957           tulipRoadId = null;
51958
51959           var padding = 70 * Math.pow(2, context.map().zoom() - 18);
51960           var box = pad$1(tulipRoadStart, padding, context);
51961           box.height = box.height + 100;
51962           reveal(box, t('intro.lines.start_line'));
51963
51964           context.map().on('move.intro drawn.intro', function() {
51965               padding = 70 * Math.pow(2, context.map().zoom() - 18);
51966               box = pad$1(tulipRoadStart, padding, context);
51967               box.height = box.height + 100;
51968               reveal(box, t('intro.lines.start_line'), { duration: 0 });
51969           });
51970
51971           context.on('enter.intro', function(mode) {
51972               if (mode.id !== 'draw-line') return chapter.restart();
51973               continueTo(drawLine);
51974           });
51975
51976           function continueTo(nextStep) {
51977               context.map().on('move.intro drawn.intro', null);
51978               context.on('enter.intro', null);
51979               nextStep();
51980           }
51981       }
51982
51983
51984       function drawLine() {
51985           if (context.mode().id !== 'draw-line') {
51986               return chapter.restart();
51987           }
51988
51989           tulipRoadId = context.mode().selectedIDs()[0];
51990           context.map().centerEase(tulipRoadMidpoint, 500);
51991
51992           timeout(function() {
51993               var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
51994               var box = pad$1(tulipRoadMidpoint, padding, context);
51995               box.height = box.height * 2;
51996               reveal(box,
51997                   t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
51998               );
51999
52000               context.map().on('move.intro drawn.intro', function() {
52001                   padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
52002                   box = pad$1(tulipRoadMidpoint, padding, context);
52003                   box.height = box.height * 2;
52004                   reveal(box,
52005                       t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
52006                       { duration: 0 }
52007                   );
52008               });
52009           }, 550);  // after easing..
52010
52011           context.history().on('change.intro', function() {
52012               var entity = tulipRoadId && context.hasEntity(tulipRoadId);
52013               if (!entity) return chapter.restart();
52014
52015               if (isLineConnected()) {
52016                   continueTo(continueLine);
52017               }
52018           });
52019
52020           context.on('enter.intro', function(mode) {
52021               if (mode.id === 'draw-line')
52022                   return;
52023               else if (mode.id === 'select') {
52024                   continueTo(retryIntersect);
52025                   return;
52026               }
52027               else
52028                   return chapter.restart();
52029           });
52030
52031           function continueTo(nextStep) {
52032               context.map().on('move.intro drawn.intro', null);
52033               context.history().on('change.intro', null);
52034               context.on('enter.intro', null);
52035               nextStep();
52036           }
52037       }
52038
52039
52040       function isLineConnected() {
52041           var entity = tulipRoadId && context.hasEntity(tulipRoadId);
52042           if (!entity) return false;
52043
52044           var drawNodes = context.graph().childNodes(entity);
52045           return some(drawNodes, function(node) {
52046               return some(context.graph().parentWays(node), function(parent) {
52047                   return parent.id === flowerRoadId;
52048               });
52049           });
52050       }
52051
52052
52053       function retryIntersect() {
52054           d3_select(window).on('mousedown.intro', eventCancel, true);
52055
52056           var box = pad$1(tulipRoadIntersection, 80, context);
52057           reveal(box,
52058               t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
52059           );
52060
52061           timeout(chapter.restart, 3000);
52062       }
52063
52064
52065       function continueLine() {
52066           if (context.mode().id !== 'draw-line') return chapter.restart();
52067           var entity = tulipRoadId && context.hasEntity(tulipRoadId);
52068           if (!entity) return chapter.restart();
52069
52070           context.map().centerEase(tulipRoadIntersection, 500);
52071
52072           reveal('#surface', t('intro.lines.continue_line'));
52073
52074           context.on('enter.intro', function(mode) {
52075               if (mode.id === 'draw-line')
52076                   return;
52077               else if (mode.id === 'select')
52078                   return continueTo(chooseCategoryRoad);
52079               else
52080                   return chapter.restart();
52081           });
52082
52083           function continueTo(nextStep) {
52084               context.on('enter.intro', null);
52085               nextStep();
52086           }
52087       }
52088
52089
52090       function chooseCategoryRoad() {
52091           if (context.mode().id !== 'select') {
52092               return chapter.restart();
52093           }
52094
52095           context.on('exit.intro', function() {
52096               return chapter.restart();
52097           });
52098
52099           var button = d3_select('.preset-category-road .preset-list-button');
52100           if (button.empty()) return chapter.restart();
52101
52102           // disallow scrolling
52103           d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
52104
52105           timeout(function() {
52106               // reset pane, in case user somehow happened to change it..
52107               d3_select('.inspector-wrap .panewrap').style('right', '-100%');
52108
52109               reveal(button.node(),
52110                   t('intro.lines.choose_category_road', { category: roadCategory.name() })
52111               );
52112
52113               button.on('click.intro', function() {
52114                   continueTo(choosePresetResidential);
52115               });
52116
52117           }, 400);  // after editor pane visible
52118
52119           function continueTo(nextStep) {
52120               d3_select('.inspector-wrap').on('wheel.intro', null);
52121               d3_select('.preset-list-button').on('click.intro', null);
52122               context.on('exit.intro', null);
52123               nextStep();
52124           }
52125       }
52126
52127
52128       function choosePresetResidential() {
52129           if (context.mode().id !== 'select') {
52130               return chapter.restart();
52131           }
52132
52133           context.on('exit.intro', function() {
52134               return chapter.restart();
52135           });
52136
52137           var subgrid = d3_select('.preset-category-road .subgrid');
52138           if (subgrid.empty()) return chapter.restart();
52139
52140           subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
52141               .on('click.intro', function() {
52142                   continueTo(retryPresetResidential);
52143               });
52144
52145           subgrid.selectAll('.preset-highway-residential .preset-list-button')
52146               .on('click.intro', function() {
52147                   continueTo(nameRoad);
52148               });
52149
52150           timeout(function() {
52151               reveal(subgrid.node(),
52152                   t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
52153                   { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
52154               );
52155           }, 300);
52156
52157           function continueTo(nextStep) {
52158               d3_select('.preset-list-button').on('click.intro', null);
52159               context.on('exit.intro', null);
52160               nextStep();
52161           }
52162       }
52163
52164
52165       // selected wrong road type
52166       function retryPresetResidential() {
52167           if (context.mode().id !== 'select') {
52168               return chapter.restart();
52169           }
52170
52171           context.on('exit.intro', function() {
52172               return chapter.restart();
52173           });
52174
52175           // disallow scrolling
52176           d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
52177
52178           timeout(function() {
52179               var button = d3_select('.entity-editor-pane .preset-list-button');
52180
52181               reveal(button.node(),
52182                   t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
52183               );
52184
52185               button.on('click.intro', function() {
52186                   continueTo(chooseCategoryRoad);
52187               });
52188
52189           }, 500);
52190
52191           function continueTo(nextStep) {
52192               d3_select('.inspector-wrap').on('wheel.intro', null);
52193               d3_select('.preset-list-button').on('click.intro', null);
52194               context.on('exit.intro', null);
52195               nextStep();
52196           }
52197       }
52198
52199
52200       function nameRoad() {
52201           context.on('exit.intro', function() {
52202               continueTo(didNameRoad);
52203           });
52204
52205           timeout(function() {
52206               reveal('.entity-editor-pane',
52207                   t('intro.lines.name_road', { button: icon('#icon-apply', 'pre-text') }),
52208                   { tooltipClass: 'intro-lines-name_road' }
52209               );
52210           }, 500);
52211
52212           function continueTo(nextStep) {
52213               context.on('exit.intro', null);
52214               nextStep();
52215           }
52216       }
52217
52218
52219       function didNameRoad() {
52220           context.history().checkpoint('doneAddLine');
52221
52222           timeout(function() {
52223               reveal('#surface', t('intro.lines.did_name_road'), {
52224                   buttonText: t('intro.ok'),
52225                   buttonCallback: function() { continueTo(updateLine); }
52226               });
52227           }, 500);
52228
52229           function continueTo(nextStep) {
52230               nextStep();
52231           }
52232       }
52233
52234
52235       function updateLine() {
52236           context.history().reset('doneAddLine');
52237           if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52238               return chapter.restart();
52239           }
52240
52241           var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
52242           if (msec) { reveal(null, null, { duration: 0 }); }
52243           context.map().zoom(19).centerEase(woodRoadDragMidpoint, msec);
52244
52245           timeout(function() {
52246               var padding = 250 * Math.pow(2, context.map().zoom() - 19);
52247               var box = pad$1(woodRoadDragMidpoint, padding, context);
52248               var advance = function() { continueTo(addNode); };
52249
52250               reveal(box, t('intro.lines.update_line'),
52251                   { buttonText: t('intro.ok'), buttonCallback: advance }
52252               );
52253
52254               context.map().on('move.intro drawn.intro', function() {
52255                   var padding = 250 * Math.pow(2, context.map().zoom() - 19);
52256                   var box = pad$1(woodRoadDragMidpoint, padding, context);
52257                   reveal(box, t('intro.lines.update_line'),
52258                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
52259                   );
52260               });
52261           }, msec + 100);
52262
52263           function continueTo(nextStep) {
52264               context.map().on('move.intro drawn.intro', null);
52265               nextStep();
52266           }
52267       }
52268
52269
52270       function addNode() {
52271           context.history().reset('doneAddLine');
52272           if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52273               return chapter.restart();
52274           }
52275
52276           var padding = 40 * Math.pow(2, context.map().zoom() - 19);
52277           var box = pad$1(woodRoadAddNode, padding, context);
52278           reveal(box, t('intro.lines.add_node'));
52279
52280           context.map().on('move.intro drawn.intro', function() {
52281               var padding = 40 * Math.pow(2, context.map().zoom() - 19);
52282               var box = pad$1(woodRoadAddNode, padding, context);
52283               reveal(box, t('intro.lines.add_node'), { duration: 0 });
52284           });
52285
52286           context.history().on('change.intro', function(changed) {
52287               if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52288                   return continueTo(updateLine);
52289               }
52290               if (changed.created().length === 1) {
52291                   timeout(function() { continueTo(startDragEndpoint); }, 500);
52292               }
52293           });
52294
52295           context.on('enter.intro', function(mode) {
52296               if (mode.id !== 'select') {
52297                   continueTo(updateLine);
52298               }
52299           });
52300
52301           function continueTo(nextStep) {
52302               context.map().on('move.intro drawn.intro', null);
52303               context.history().on('change.intro', null);
52304               context.on('enter.intro', null);
52305               nextStep();
52306           }
52307       }
52308
52309
52310       function startDragEndpoint() {
52311           if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52312               return continueTo(updateLine);
52313           }
52314           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52315           var box = pad$1(woodRoadDragEndpoint, padding, context);
52316           reveal(box, t('intro.lines.start_drag_endpoint'));
52317
52318           context.map().on('move.intro drawn.intro', function() {
52319               if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52320                   return continueTo(updateLine);
52321               }
52322               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52323               var box = pad$1(woodRoadDragEndpoint, padding, context);
52324               reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
52325
52326               var entity = context.entity(woodRoadEndId);
52327               if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
52328                   continueTo(finishDragEndpoint);
52329               }
52330           });
52331
52332           function continueTo(nextStep) {
52333               context.map().on('move.intro drawn.intro', null);
52334               nextStep();
52335           }
52336       }
52337
52338
52339       function finishDragEndpoint() {
52340           if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52341               return continueTo(updateLine);
52342           }
52343
52344           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52345           var box = pad$1(woodRoadDragEndpoint, padding, context);
52346           reveal(box, t('intro.lines.finish_drag_endpoint'));
52347
52348           context.map().on('move.intro drawn.intro', function() {
52349               if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52350                   return continueTo(updateLine);
52351               }
52352               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52353               var box = pad$1(woodRoadDragEndpoint, padding, context);
52354               reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
52355
52356               var entity = context.entity(woodRoadEndId);
52357               if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
52358                   continueTo(startDragEndpoint);
52359               }
52360           });
52361
52362           context.on('enter.intro', function() {
52363               continueTo(startDragMidpoint);
52364           });
52365
52366           function continueTo(nextStep) {
52367               context.map().on('move.intro drawn.intro', null);
52368               context.on('enter.intro', null);
52369               nextStep();
52370           }
52371       }
52372
52373
52374       function startDragMidpoint() {
52375           if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52376               return continueTo(updateLine);
52377           }
52378           if (context.selectedIDs().indexOf(woodRoadId) === -1) {
52379               context.enter(modeSelect(context, [woodRoadId]));
52380           }
52381
52382           var padding = 80 * Math.pow(2, context.map().zoom() - 19);
52383           var box = pad$1(woodRoadDragMidpoint, padding, context);
52384           reveal(box, t('intro.lines.start_drag_midpoint'));
52385
52386           context.map().on('move.intro drawn.intro', function() {
52387               if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52388                   return continueTo(updateLine);
52389               }
52390               var padding = 80 * Math.pow(2, context.map().zoom() - 19);
52391               var box = pad$1(woodRoadDragMidpoint, padding, context);
52392               reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
52393           });
52394
52395           context.history().on('change.intro', function(changed) {
52396               if (changed.created().length === 1) {
52397                   continueTo(continueDragMidpoint);
52398               }
52399           });
52400
52401           context.on('enter.intro', function(mode) {
52402               if (mode.id !== 'select') {
52403                   // keep Wood Road selected so midpoint triangles are drawn..
52404                   context.enter(modeSelect(context, [woodRoadId]));
52405               }
52406           });
52407
52408           function continueTo(nextStep) {
52409               context.map().on('move.intro drawn.intro', null);
52410               context.history().on('change.intro', null);
52411               context.on('enter.intro', null);
52412               nextStep();
52413           }
52414       }
52415
52416
52417       function continueDragMidpoint() {
52418           if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52419               return continueTo(updateLine);
52420           }
52421
52422           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52423           var box = pad$1(woodRoadDragEndpoint, padding, context);
52424           box.height += 400;
52425
52426           var advance = function() {
52427               context.history().checkpoint('doneUpdateLine');
52428               continueTo(deleteLines);
52429           };
52430
52431           reveal(box, t('intro.lines.continue_drag_midpoint'),
52432               { buttonText: t('intro.ok'), buttonCallback: advance }
52433           );
52434
52435           context.map().on('move.intro drawn.intro', function() {
52436               if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52437                   return continueTo(updateLine);
52438               }
52439               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52440               var box = pad$1(woodRoadDragEndpoint, padding, context);
52441               box.height += 400;
52442               reveal(box, t('intro.lines.continue_drag_midpoint'),
52443                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
52444               );
52445           });
52446
52447           function continueTo(nextStep) {
52448               context.map().on('move.intro drawn.intro', null);
52449               nextStep();
52450           }
52451       }
52452
52453
52454       function deleteLines() {
52455           context.history().reset('doneUpdateLine');
52456           context.enter(modeBrowse(context));
52457
52458           if (!context.hasEntity(washingtonStreetId) ||
52459               !context.hasEntity(twelfthAvenueId) ||
52460               !context.hasEntity(eleventhAvenueEndId)) {
52461               return chapter.restart();
52462           }
52463
52464           var msec = transitionTime(deleteLinesLoc, context.map().center());
52465           if (msec) { reveal(null, null, { duration: 0 }); }
52466           context.map().zoom(18).centerEase(deleteLinesLoc, msec);
52467
52468           timeout(function() {
52469               var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52470               var box = pad$1(deleteLinesLoc, padding, context);
52471               box.top -= 200;
52472               box.height += 400;
52473               var advance = function() { continueTo(rightClickIntersection); };
52474
52475               reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
52476                   { buttonText: t('intro.ok'), buttonCallback: advance }
52477               );
52478
52479               context.map().on('move.intro drawn.intro', function() {
52480                   var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52481                   var box = pad$1(deleteLinesLoc, padding, context);
52482                   box.top -= 200;
52483                   box.height += 400;
52484                   reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
52485                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
52486                   );
52487               });
52488
52489               context.history().on('change.intro', function() {
52490                   timeout(function() {
52491                       continueTo(deleteLines);
52492                   }, 500);  // after any transition (e.g. if user deleted intersection)
52493               });
52494
52495           }, msec + 100);
52496
52497           function continueTo(nextStep) {
52498               context.map().on('move.intro drawn.intro', null);
52499               context.history().on('change.intro', null);
52500               nextStep();
52501           }
52502       }
52503
52504
52505       function rightClickIntersection() {
52506           context.history().reset('doneUpdateLine');
52507           context.enter(modeBrowse(context));
52508
52509           context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
52510
52511           timeout(function() {
52512               var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52513               var box = pad$1(eleventhAvenueEnd, padding, context);
52514               reveal(box, t('intro.lines.rightclick_intersection',
52515                   { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
52516               );
52517
52518               context.map().on('move.intro drawn.intro', function() {
52519                   var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52520                   var box = pad$1(eleventhAvenueEnd, padding, context);
52521                   reveal(box, t('intro.lines.rightclick_intersection',
52522                       { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
52523                       { duration: 0 }
52524                   );
52525               });
52526
52527               context.on('enter.intro', function(mode) {
52528                   if (mode.id !== 'select') return;
52529                   var ids = context.selectedIDs();
52530                   if (ids.length !== 1 || ids[0] !== eleventhAvenueEndId) return;
52531
52532                   timeout(function() {
52533                       var node = selectMenuItem('split').node();
52534                       if (!node) return;
52535                       continueTo(splitIntersection);
52536                   }, 300);  // after menu visible
52537               });
52538
52539               context.history().on('change.intro', function() {
52540                   timeout(function() {
52541                       continueTo(deleteLines);
52542                   }, 300);  // after any transition (e.g. if user deleted intersection)
52543               });
52544
52545           }, 600);
52546
52547           function continueTo(nextStep) {
52548               context.map().on('move.intro drawn.intro', null);
52549               context.on('enter.intro', null);
52550               context.history().on('change.intro', null);
52551               nextStep();
52552           }
52553       }
52554
52555
52556       function splitIntersection() {
52557           if (!context.hasEntity(washingtonStreetId) ||
52558               !context.hasEntity(twelfthAvenueId) ||
52559               !context.hasEntity(eleventhAvenueEndId)) {
52560               return continueTo(deleteLines);
52561           }
52562
52563           var node = selectMenuItem('split').node();
52564           if (!node) { return continueTo(rightClickIntersection); }
52565
52566           var wasChanged = false;
52567           var menuCoords = context.map().mouseCoordinates();
52568           washingtonSegmentId = null;
52569
52570           revealEditMenu(menuCoords, t('intro.lines.split_intersection',
52571               { button: icon('#operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
52572           );
52573
52574           context.map().on('move.intro drawn.intro', function() {
52575               var node = selectMenuItem('split').node();
52576               if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
52577
52578               revealEditMenu(menuCoords, t('intro.lines.split_intersection',
52579                   { button: icon('#operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
52580                   { duration: 0 }
52581               );
52582           });
52583
52584           context.history().on('change.intro', function(changed) {
52585               wasChanged = true;
52586               timeout(function() {
52587                   if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
52588                       washingtonSegmentId = changed.created()[0].id;
52589                       continueTo(didSplit);
52590                   } else {
52591                       washingtonSegmentId = null;
52592                       continueTo(retrySplit);
52593                   }
52594               }, 300);  // after any transition (e.g. if user deleted intersection)
52595           });
52596
52597           function continueTo(nextStep) {
52598               context.map().on('move.intro drawn.intro', null);
52599               context.history().on('change.intro', null);
52600               nextStep();
52601           }
52602       }
52603
52604
52605       function retrySplit() {
52606           context.enter(modeBrowse(context));
52607           context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
52608           var advance = function() { continueTo(rightClickIntersection); };
52609
52610           var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52611           var box = pad$1(eleventhAvenueEnd, padding, context);
52612           reveal(box, t('intro.lines.retry_split'),
52613               { buttonText: t('intro.ok'), buttonCallback: advance }
52614           );
52615
52616           context.map().on('move.intro drawn.intro', function() {
52617               var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52618               var box = pad$1(eleventhAvenueEnd, padding, context);
52619               reveal(box, t('intro.lines.retry_split'),
52620                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
52621               );
52622           });
52623
52624           function continueTo(nextStep) {
52625               context.map().on('move.intro drawn.intro', null);
52626               nextStep();
52627           }
52628       }
52629
52630
52631       function didSplit() {
52632           if (!washingtonSegmentId ||
52633               !context.hasEntity(washingtonSegmentId) ||
52634               !context.hasEntity(washingtonStreetId) ||
52635               !context.hasEntity(twelfthAvenueId) ||
52636               !context.hasEntity(eleventhAvenueEndId)) {
52637               return continueTo(rightClickIntersection);
52638           }
52639
52640           var ids = context.selectedIDs();
52641           var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
52642           var street = t('intro.graph.name.washington-street');
52643
52644           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52645           var box = pad$1(twelfthAvenue, padding, context);
52646           box.width = box.width / 2;
52647           reveal(box, t(string, { street1: street, street2: street }),
52648               { duration: 500 }
52649           );
52650
52651           timeout(function() {
52652               context.map().zoom(18).centerEase(twelfthAvenue, 500);
52653
52654               context.map().on('move.intro drawn.intro', function() {
52655                   var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52656                   var box = pad$1(twelfthAvenue, padding, context);
52657                   box.width = box.width / 2;
52658                   reveal(box, t(string, { street1: street, street2: street }),
52659                       { duration: 0 }
52660                   );
52661               });
52662           }, 600);  // after initial reveal and curtain cut
52663
52664           context.on('enter.intro', function() {
52665               var ids = context.selectedIDs();
52666               if (ids.length === 1 && ids[0] === washingtonSegmentId) {
52667                   continueTo(multiSelect);
52668               }
52669           });
52670
52671           context.history().on('change.intro', function() {
52672               if (!washingtonSegmentId ||
52673                   !context.hasEntity(washingtonSegmentId) ||
52674                   !context.hasEntity(washingtonStreetId) ||
52675                   !context.hasEntity(twelfthAvenueId) ||
52676                   !context.hasEntity(eleventhAvenueEndId)) {
52677                   return continueTo(rightClickIntersection);
52678               }
52679           });
52680
52681           function continueTo(nextStep) {
52682               context.map().on('move.intro drawn.intro', null);
52683               context.on('enter.intro', null);
52684               context.history().on('change.intro', null);
52685               nextStep();
52686           }
52687       }
52688
52689
52690       function multiSelect() {
52691           if (!washingtonSegmentId ||
52692               !context.hasEntity(washingtonSegmentId) ||
52693               !context.hasEntity(washingtonStreetId) ||
52694               !context.hasEntity(twelfthAvenueId) ||
52695               !context.hasEntity(eleventhAvenueEndId)) {
52696               return continueTo(rightClickIntersection);
52697           }
52698
52699           var ids = context.selectedIDs();
52700           var hasWashington = ids.indexOf(washingtonSegmentId) !== -1;
52701           var hasTwelfth = ids.indexOf(twelfthAvenueId) !== -1;
52702
52703           if (hasWashington && hasTwelfth) {
52704               return continueTo(multiRightClick);
52705           } else if (!hasWashington && !hasTwelfth) {
52706               return continueTo(didSplit);
52707           }
52708
52709           context.map().zoom(18).centerEase(twelfthAvenue, 500);
52710
52711           timeout(function() {
52712               var selected, other, padding, box;
52713               if (hasWashington) {
52714                   selected = t('intro.graph.name.washington-street');
52715                   other = t('intro.graph.name.12th-avenue');
52716                   padding = 60 * Math.pow(2, context.map().zoom() - 18);
52717                   box = pad$1(twelfthAvenueEnd, padding, context);
52718                   box.width *= 3;
52719               } else {
52720                   selected = t('intro.graph.name.12th-avenue');
52721                   other = t('intro.graph.name.washington-street');
52722                   padding = 200 * Math.pow(2, context.map().zoom() - 18);
52723                   box = pad$1(twelfthAvenue, padding, context);
52724                   box.width /= 2;
52725               }
52726
52727               reveal(box,
52728                   t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
52729               );
52730
52731               context.map().on('move.intro drawn.intro', function() {
52732                   if (hasWashington) {
52733                       selected = t('intro.graph.name.washington-street');
52734                       other = t('intro.graph.name.12th-avenue');
52735                       padding = 60 * Math.pow(2, context.map().zoom() - 18);
52736                       box = pad$1(twelfthAvenueEnd, padding, context);
52737                       box.width *= 3;
52738                   } else {
52739                       selected = t('intro.graph.name.12th-avenue');
52740                       other = t('intro.graph.name.washington-street');
52741                       padding = 200 * Math.pow(2, context.map().zoom() - 18);
52742                       box = pad$1(twelfthAvenue, padding, context);
52743                       box.width /= 2;
52744                   }
52745
52746                   reveal(box,
52747                       t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
52748                       { duration: 0 }
52749                   );
52750               });
52751
52752               context.on('enter.intro', function() {
52753                   continueTo(multiSelect);
52754               });
52755
52756               context.history().on('change.intro', function() {
52757                   if (!washingtonSegmentId ||
52758                       !context.hasEntity(washingtonSegmentId) ||
52759                       !context.hasEntity(washingtonStreetId) ||
52760                       !context.hasEntity(twelfthAvenueId) ||
52761                       !context.hasEntity(eleventhAvenueEndId)) {
52762                       return continueTo(rightClickIntersection);
52763                   }
52764               });
52765           }, 600);
52766
52767           function continueTo(nextStep) {
52768               context.map().on('move.intro drawn.intro', null);
52769               context.on('enter.intro', null);
52770               context.history().on('change.intro', null);
52771               nextStep();
52772           }
52773       }
52774
52775
52776       function multiRightClick() {
52777           if (!washingtonSegmentId ||
52778               !context.hasEntity(washingtonSegmentId) ||
52779               !context.hasEntity(washingtonStreetId) ||
52780               !context.hasEntity(twelfthAvenueId) ||
52781               !context.hasEntity(eleventhAvenueEndId)) {
52782               return continueTo(rightClickIntersection);
52783           }
52784
52785           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52786           var box = pad$1(twelfthAvenue, padding, context);
52787           reveal(box, t('intro.lines.multi_rightclick'));
52788
52789           context.map().on('move.intro drawn.intro', function() {
52790               var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52791               var box = pad$1(twelfthAvenue, padding, context);
52792               reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
52793           });
52794
52795           d3_select(window).on('click.intro contextmenu.intro', function() {
52796               timeout(function() {
52797                   var ids = context.selectedIDs();
52798                   if (ids.length === 2 &&
52799                       ids.indexOf(twelfthAvenueId) !== -1 &&
52800                       ids.indexOf(washingtonSegmentId) !== -1) {
52801                           var node = selectMenuItem('delete').node();
52802                           if (!node) return;
52803                           continueTo(multiDelete);
52804                   } else if (ids.length === 1 &&
52805                       ids.indexOf(washingtonSegmentId) !== -1) {
52806                       return continueTo(multiSelect);
52807                   } else {
52808                       return continueTo(didSplit);
52809                   }
52810               }, 300);  // after edit menu visible
52811           }, true);
52812
52813           context.history().on('change.intro', function() {
52814               if (!washingtonSegmentId ||
52815                   !context.hasEntity(washingtonSegmentId) ||
52816                   !context.hasEntity(washingtonStreetId) ||
52817                   !context.hasEntity(twelfthAvenueId) ||
52818                   !context.hasEntity(eleventhAvenueEndId)) {
52819                   return continueTo(rightClickIntersection);
52820               }
52821           });
52822
52823           function continueTo(nextStep) {
52824               context.map().on('move.intro drawn.intro', null);
52825               d3_select(window).on('click.intro contextmenu.intro', null, true);
52826               context.history().on('change.intro', null);
52827               nextStep();
52828           }
52829       }
52830
52831
52832       function multiDelete() {
52833           if (!washingtonSegmentId ||
52834               !context.hasEntity(washingtonSegmentId) ||
52835               !context.hasEntity(washingtonStreetId) ||
52836               !context.hasEntity(twelfthAvenueId) ||
52837               !context.hasEntity(eleventhAvenueEndId)) {
52838               return continueTo(rightClickIntersection);
52839           }
52840
52841           var node = selectMenuItem('delete').node();
52842           if (!node) return continueTo(multiRightClick);
52843
52844           var menuCoords = context.map().mouseCoordinates();
52845           revealEditMenu(menuCoords,
52846               t('intro.lines.multi_delete', { button: icon('#operation-delete', 'pre-text') })
52847           );
52848
52849           context.map().on('move.intro drawn.intro', function() {
52850               revealEditMenu(menuCoords,
52851                   t('intro.lines.multi_delete', { button: icon('#operation-delete', 'pre-text') }),
52852                   { duration: 0 }
52853               );
52854           });
52855
52856           context.on('exit.intro', function() {
52857               if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
52858                   return continueTo(multiSelect);  // left select mode but roads still exist
52859               }
52860           });
52861
52862           context.history().on('change.intro', function() {
52863               if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
52864                   continueTo(retryDelete);         // changed something but roads still exist
52865               } else {
52866                   continueTo(play);
52867               }
52868           });
52869
52870           function continueTo(nextStep) {
52871               context.map().on('move.intro drawn.intro', null);
52872               context.on('exit.intro', null);
52873               context.history().on('change.intro', null);
52874               nextStep();
52875           }
52876       }
52877
52878
52879       function retryDelete() {
52880           context.enter(modeBrowse(context));
52881
52882           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52883           var box = pad$1(twelfthAvenue, padding, context);
52884           reveal(box, t('intro.lines.retry_delete'), {
52885               buttonText: t('intro.ok'),
52886               buttonCallback: function() { continueTo(multiSelect); }
52887           });
52888
52889           function continueTo(nextStep) {
52890               nextStep();
52891           }
52892       }
52893
52894
52895       function play() {
52896           dispatch$$1.call('done');
52897           reveal('#id-container',
52898               t('intro.lines.play', { next: t('intro.buildings.title') }), {
52899                   tooltipBox: '.intro-nav-wrap .chapter-building',
52900                   buttonText: t('intro.ok'),
52901                   buttonCallback: function() { reveal('#id-container'); }
52902               }
52903           );
52904      }
52905
52906
52907       chapter.enter = function() {
52908           addLine();
52909       };
52910
52911
52912       chapter.exit = function() {
52913           timeouts.forEach(window.clearTimeout);
52914           d3_select(window).on('mousedown.intro', null, true);
52915           context.on('enter.intro exit.intro', null);
52916           context.map().on('move.intro drawn.intro', null);
52917           context.history().on('change.intro', null);
52918           d3_select('.inspector-wrap').on('wheel.intro', null);
52919           d3_select('.preset-list-button').on('click.intro', null);
52920       };
52921
52922
52923       chapter.restart = function() {
52924           chapter.exit();
52925           chapter.enter();
52926       };
52927
52928
52929       return utilRebind(chapter, dispatch$$1, 'on');
52930   }
52931
52932   function uiIntroBuilding(context, reveal) {
52933       var dispatch$$1 = dispatch('done'),
52934           house = [-85.62815, 41.95638],
52935           tank = [-85.62732, 41.95347],
52936           buildingCatetory = context.presets().item('category-building'),
52937           housePreset = context.presets().item('building/house'),
52938           tankPreset = context.presets().item('man_made/storage_tank'),
52939           timeouts = [],
52940           houseId = null,
52941           tankId = null;
52942
52943
52944       var chapter = {
52945           title: 'intro.buildings.title'
52946       };
52947
52948
52949       function timeout(f, t$$1) {
52950           timeouts.push(window.setTimeout(f, t$$1));
52951       }
52952
52953
52954       function eventCancel() {
52955           event.stopPropagation();
52956           event.preventDefault();
52957       }
52958
52959
52960       function revealHouse(center, text, options) {
52961           var padding = 160 * Math.pow(2, context.map().zoom() - 20);
52962           var box = pad$1(center, padding, context);
52963           reveal(box, text, options);
52964       }
52965
52966
52967       function revealTank(center, text, options) {
52968           var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
52969           var box = pad$1(center, padding, context);
52970           reveal(box, text, options);
52971       }
52972
52973
52974       function revealEditMenu(loc, text, options) {
52975           var rect = context.surfaceRect();
52976           var point$$1 = context.curtainProjection(loc);
52977           var pad = 40;
52978           var width = 250 + (2 * pad);
52979           var height = 350;
52980           var startX = rect.left + point$$1[0];
52981           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
52982           var box = {
52983               left: left,
52984               top: point$$1[1] + rect.top - 60,
52985               width: width,
52986               height: height
52987           };
52988           reveal(box, text, options);
52989       }
52990
52991
52992       function addHouse() {
52993           context.enter(modeBrowse(context));
52994           context.history().reset('initial');
52995           houseId = null;
52996
52997           var msec = transitionTime(house, context.map().center());
52998           if (msec) { reveal(null, null, { duration: 0 }); }
52999           context.map().zoom(19).centerEase(house, msec);
53000
53001           timeout(function() {
53002               var tooltip = reveal('button.add-area',
53003                   t('intro.buildings.add_building', { button: icon('#icon-area', 'pre-text') }));
53004
53005               tooltip.selectAll('.tooltip-inner')
53006                   .insert('svg', 'span')
53007                   .attr('class', 'tooltip-illustration')
53008                   .append('use')
53009                   .attr('xlink:href', '#building-images');
53010
53011               context.on('enter.intro', function(mode) {
53012                   if (mode.id !== 'add-area') return;
53013                   continueTo(startHouse);
53014               });
53015           }, msec + 100);
53016
53017           function continueTo(nextStep) {
53018               context.on('enter.intro', null);
53019               nextStep();
53020           }
53021       }
53022
53023
53024       function startHouse() {
53025           if (context.mode().id !== 'add-area') {
53026               return continueTo(addHouse);
53027           }
53028
53029           houseId = null;
53030           context.map().zoomEase(20, 500);
53031
53032           timeout(function() {
53033               revealHouse(house, t('intro.buildings.start_building'));
53034
53035               context.map().on('move.intro drawn.intro', function() {
53036                   revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
53037               });
53038
53039               context.on('enter.intro', function(mode) {
53040                   if (mode.id !== 'draw-area') return chapter.restart();
53041                   continueTo(continueHouse);
53042               });
53043
53044           }, 550);  // after easing
53045
53046           function continueTo(nextStep) {
53047               context.map().on('move.intro drawn.intro', null);
53048               context.on('enter.intro', null);
53049               nextStep();
53050           }
53051       }
53052
53053
53054       function continueHouse() {
53055           if (context.mode().id !== 'draw-area') {
53056               return continueTo(addHouse);
53057           }
53058
53059           houseId = null;
53060
53061           revealHouse(house, t('intro.buildings.continue_building'));
53062
53063           context.map().on('move.intro drawn.intro', function() {
53064               revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
53065           });
53066
53067           context.on('enter.intro', function(mode) {
53068               if (mode.id === 'draw-area') {
53069                   return;
53070               } else if (mode.id === 'select') {
53071                   var graph = context.graph(),
53072                       way = context.entity(context.selectedIDs()[0]),
53073                       nodes = graph.childNodes(way),
53074                       points = uniq(nodes).map(function(n) { return context.projection(n.loc); });
53075
53076                   if (isMostlySquare(points)) {
53077                       houseId = way.id;
53078                       return continueTo(chooseCategoryBuilding);
53079                   } else {
53080                       return continueTo(retryHouse);
53081                   }
53082
53083               } else {
53084                   return chapter.restart();
53085               }
53086           });
53087
53088           function continueTo(nextStep) {
53089               context.map().on('move.intro drawn.intro', null);
53090               context.on('enter.intro', null);
53091               nextStep();
53092           }
53093       }
53094
53095
53096       function retryHouse() {
53097           var onClick = function() { continueTo(addHouse); };
53098
53099           revealHouse(house, t('intro.buildings.retry_building'),
53100               { buttonText: t('intro.ok'), buttonCallback: onClick }
53101           );
53102
53103           context.map().on('move.intro drawn.intro', function() {
53104               revealHouse(house, t('intro.buildings.retry_building'),
53105                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
53106               );
53107           });
53108
53109           function continueTo(nextStep) {
53110               context.map().on('move.intro drawn.intro', null);
53111               nextStep();
53112           }
53113       }
53114
53115
53116       function chooseCategoryBuilding() {
53117           if (!houseId || !context.hasEntity(houseId)) {
53118               return addHouse();
53119           }
53120           var ids = context.selectedIDs();
53121           if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
53122               context.enter(modeSelect(context, [houseId]));
53123           }
53124
53125           // disallow scrolling
53126           d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
53127
53128           timeout(function() {
53129               // reset pane, in case user somehow happened to change it..
53130               d3_select('.inspector-wrap .panewrap').style('right', '-100%');
53131
53132               var button = d3_select('.preset-category-building .preset-list-button');
53133
53134               reveal(button.node(),
53135                   t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
53136               );
53137
53138               button.on('click.intro', function() {
53139                   button.on('click.intro', null);
53140                   continueTo(choosePresetHouse);
53141               });
53142
53143           }, 400);  // after preset list pane visible..
53144
53145
53146           context.on('enter.intro', function(mode) {
53147               if (!houseId || !context.hasEntity(houseId)) {
53148                   return continueTo(addHouse);
53149               }
53150               var ids = context.selectedIDs();
53151               if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
53152                   return continueTo(chooseCategoryBuilding);
53153               }
53154           });
53155
53156           function continueTo(nextStep) {
53157               d3_select('.inspector-wrap').on('wheel.intro', null);
53158               d3_select('.preset-list-button').on('click.intro', null);
53159               context.on('enter.intro', null);
53160               nextStep();
53161           }
53162       }
53163
53164
53165       function choosePresetHouse() {
53166           if (!houseId || !context.hasEntity(houseId)) {
53167               return addHouse();
53168           }
53169           var ids = context.selectedIDs();
53170           if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
53171               context.enter(modeSelect(context, [houseId]));
53172           }
53173
53174           // disallow scrolling
53175           d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
53176
53177           timeout(function() {
53178               // reset pane, in case user somehow happened to change it..
53179               d3_select('.inspector-wrap .panewrap').style('right', '-100%');
53180
53181               var button = d3_select('.preset-building-house .preset-list-button');
53182
53183               reveal(button.node(),
53184                   t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
53185                   { duration: 300 }
53186               );
53187
53188               button.on('click.intro', function() {
53189                   button.on('click.intro', null);
53190                   continueTo(closeEditorHouse);
53191               });
53192
53193
53194           }, 400);  // after preset list pane visible..
53195
53196           context.on('enter.intro', function(mode) {
53197               if (!houseId || !context.hasEntity(houseId)) {
53198                   return continueTo(addHouse);
53199               }
53200               var ids = context.selectedIDs();
53201               if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
53202                   return continueTo(chooseCategoryBuilding);
53203               }
53204           });
53205
53206           function continueTo(nextStep) {
53207               d3_select('.inspector-wrap').on('wheel.intro', null);
53208               d3_select('.preset-list-button').on('click.intro', null);
53209               context.on('enter.intro', null);
53210               nextStep();
53211           }
53212       }
53213
53214
53215       function closeEditorHouse() {
53216           if (!houseId || !context.hasEntity(houseId)) {
53217               return addHouse();
53218           }
53219           var ids = context.selectedIDs();
53220           if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
53221               context.enter(modeSelect(context, [houseId]));
53222           }
53223
53224           context.history().checkpoint('hasHouse');
53225
53226           context.on('exit.intro', function() {
53227               continueTo(rightClickHouse);
53228           });
53229
53230           timeout(function() {
53231               reveal('.entity-editor-pane',
53232                   t('intro.buildings.close', { button: icon('#icon-apply', 'pre-text') })
53233               );
53234           }, 500);
53235
53236           function continueTo(nextStep) {
53237               context.on('exit.intro', null);
53238               nextStep();
53239           }
53240       }
53241
53242
53243       function rightClickHouse() {
53244           if (!houseId) return chapter.restart();
53245
53246           context.enter(modeBrowse(context));
53247           context.history().reset('hasHouse');
53248           context.map().centerEase(house, 500);
53249
53250           timeout(function() {
53251               if (context.map().zoom() < 20) {
53252                   context.map().zoomEase(20, 500);
53253               }
53254           }, 520);
53255
53256           context.on('enter.intro', function(mode) {
53257               if (mode.id !== 'select') return;
53258               var ids = context.selectedIDs();
53259               if (ids.length !== 1 || ids[0] !== houseId) return;
53260
53261               timeout(function() {
53262                   var node = selectMenuItem('orthogonalize').node();
53263                   if (!node) return;
53264                   continueTo(clickSquare);
53265               }, 300);  // after menu visible
53266           });
53267
53268           context.map().on('move.intro drawn.intro', function() {
53269               revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
53270           });
53271
53272           context.history().on('change.intro', function() {
53273               continueTo(rightClickHouse);
53274           });
53275
53276           function continueTo(nextStep) {
53277               context.on('enter.intro', null);
53278               context.map().on('move.intro drawn.intro', null);
53279               context.history().on('change.intro', null);
53280               nextStep();
53281           }
53282       }
53283
53284
53285       function clickSquare() {
53286           if (!houseId) return chapter.restart();
53287           var entity = context.hasEntity(houseId);
53288           if (!entity) return continueTo(rightClickHouse);
53289
53290           var node = selectMenuItem('orthogonalize').node();
53291           if (!node) { return continueTo(rightClickHouse); }
53292
53293           var wasChanged = false;
53294           var menuCoords = context.map().mouseCoordinates();
53295
53296           revealEditMenu(menuCoords,
53297               t('intro.buildings.square_building', { button: icon('#operation-orthogonalize', 'pre-text') })
53298           );
53299
53300           context.on('enter.intro', function(mode) {
53301               if (mode.id === 'browse') {
53302                   continueTo(rightClickHouse);
53303               } else if (mode.id === 'move' || mode.id === 'rotate') {
53304                   continueTo(retryClickSquare);
53305               }
53306           });
53307
53308           context.map().on('move.intro drawn.intro', function() {
53309               var node = selectMenuItem('orthogonalize').node();
53310               if (!wasChanged && !node) { return continueTo(rightClickHouse); }
53311
53312               revealEditMenu(menuCoords,
53313                   t('intro.buildings.square_building', { button: icon('#operation-orthogonalize', 'pre-text') }),
53314                   { duration: 0 }
53315               );
53316           });
53317
53318           context.history().on('change.intro', function() {
53319               wasChanged = true;
53320               context.history().on('change.intro', null);
53321
53322               // Something changed.  Wait for transition to complete and check undo annotation.
53323               timeout(function() {
53324                   if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
53325                       continueTo(doneSquare);
53326                   } else {
53327                       continueTo(retryClickSquare);
53328                   }
53329               }, 500);  // after transitioned actions
53330           });
53331
53332           function continueTo(nextStep) {
53333               context.on('enter.intro', null);
53334               context.map().on('move.intro drawn.intro', null);
53335               context.history().on('change.intro', null);
53336               nextStep();
53337           }
53338       }
53339
53340
53341       function retryClickSquare() {
53342           context.enter(modeBrowse(context));
53343
53344           revealHouse(house, t('intro.buildings.retry_square'), {
53345               buttonText: t('intro.ok'),
53346               buttonCallback: function() { continueTo(rightClickHouse); }
53347           });
53348
53349           function continueTo(nextStep) {
53350               nextStep();
53351           }
53352       }
53353
53354
53355       function doneSquare() {
53356           context.history().checkpoint('doneSquare');
53357
53358           revealHouse(house, t('intro.buildings.done_square'), {
53359               buttonText: t('intro.ok'),
53360               buttonCallback: function() { continueTo(addTank); }
53361           });
53362
53363           function continueTo(nextStep) {
53364               nextStep();
53365           }
53366       }
53367
53368
53369       function addTank() {
53370           context.enter(modeBrowse(context));
53371           context.history().reset('doneSquare');
53372           tankId = null;
53373
53374           var msec = transitionTime(tank, context.map().center());
53375           if (msec) { reveal(null, null, { duration: 0 }); }
53376           context.map().zoom(19.5).centerEase(tank, msec);
53377
53378           timeout(function() {
53379               reveal('button.add-area',
53380                   t('intro.buildings.add_tank', { button: icon('#icon-area', 'pre-text') })
53381               );
53382
53383               context.on('enter.intro', function(mode) {
53384                   if (mode.id !== 'add-area') return;
53385                   continueTo(startTank);
53386               });
53387           }, msec + 100);
53388
53389           function continueTo(nextStep) {
53390               context.on('enter.intro', null);
53391               nextStep();
53392           }
53393       }
53394
53395
53396       function startTank() {
53397           if (context.mode().id !== 'add-area') {
53398               return continueTo(addTank);
53399           }
53400
53401           tankId = null;
53402
53403           timeout(function() {
53404               revealTank(tank, t('intro.buildings.start_tank'));
53405
53406               context.map().on('move.intro drawn.intro', function() {
53407                   revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
53408               });
53409
53410               context.on('enter.intro', function(mode) {
53411                   if (mode.id !== 'draw-area') return chapter.restart();
53412                   continueTo(continueTank);
53413               });
53414
53415           }, 550);  // after easing
53416
53417           function continueTo(nextStep) {
53418               context.map().on('move.intro drawn.intro', null);
53419               context.on('enter.intro', null);
53420               nextStep();
53421           }
53422       }
53423
53424
53425       function continueTank() {
53426           if (context.mode().id !== 'draw-area') {
53427               return continueTo(addTank);
53428           }
53429
53430           tankId = null;
53431
53432           revealTank(tank, t('intro.buildings.continue_tank'));
53433
53434           context.map().on('move.intro drawn.intro', function() {
53435               revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
53436           });
53437
53438           context.on('enter.intro', function(mode) {
53439               if (mode.id === 'draw-area') {
53440                   return;
53441               } else if (mode.id === 'select') {
53442                   tankId = context.selectedIDs()[0];
53443                   return continueTo(searchPresetTank);
53444               } else {
53445                   return continueTo(addTank);
53446               }
53447           });
53448
53449           function continueTo(nextStep) {
53450               context.map().on('move.intro drawn.intro', null);
53451               context.on('enter.intro', null);
53452               nextStep();
53453           }
53454       }
53455
53456
53457       function searchPresetTank() {
53458           if (!tankId || !context.hasEntity(tankId)) {
53459               return addTank();
53460           }
53461           var ids = context.selectedIDs();
53462           if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
53463               context.enter(modeSelect(context, [tankId]));
53464           }
53465
53466           // disallow scrolling
53467           d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
53468
53469           timeout(function() {
53470               // reset pane, in case user somehow happened to change it..
53471               d3_select('.inspector-wrap .panewrap').style('right', '-100%');
53472
53473               d3_select('.preset-search-input')
53474                   .on('keydown.intro', null)
53475                   .on('keyup.intro', checkPresetSearch);
53476
53477               reveal('.preset-search-input',
53478                   t('intro.buildings.search_tank', { preset: tankPreset.name() })
53479               );
53480           }, 400);  // after preset list pane visible..
53481
53482           context.on('enter.intro', function(mode) {
53483               if (!tankId || !context.hasEntity(tankId)) {
53484                   return continueTo(addTank);
53485               }
53486
53487               var ids = context.selectedIDs();
53488               if (mode.id !== 'select' || !ids.length || ids[0] !== tankId) {
53489                   // keep the user's area selected..
53490                   context.enter(modeSelect(context, [tankId]));
53491
53492                   // reset pane, in case user somehow happened to change it..
53493                   d3_select('.inspector-wrap .panewrap').style('right', '-100%');
53494                   // disallow scrolling
53495                   d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
53496
53497                   d3_select('.preset-search-input')
53498                       .on('keydown.intro', null)
53499                       .on('keyup.intro', checkPresetSearch);
53500
53501                   reveal('.preset-search-input',
53502                       t('intro.buildings.search_tank', { preset: tankPreset.name() })
53503                   );
53504
53505                   context.history().on('change.intro', null);
53506               }
53507           });
53508
53509           function checkPresetSearch() {
53510               var first = d3_select('.preset-list-item:first-child');
53511
53512               if (first.classed('preset-man_made-storage_tank')) {
53513                   reveal(first.select('.preset-list-button').node(),
53514                       t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
53515                       { duration: 300 }
53516                   );
53517
53518                   d3_select('.preset-search-input')
53519                       .on('keydown.intro', eventCancel, true)
53520                       .on('keyup.intro', null);
53521
53522                   context.history().on('change.intro', function() {
53523                       continueTo(closeEditorTank);
53524                   });
53525               }
53526           }
53527
53528           function continueTo(nextStep) {
53529               d3_select('.inspector-wrap').on('wheel.intro', null);
53530               context.on('enter.intro', null);
53531               context.history().on('change.intro', null);
53532               d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
53533               nextStep();
53534           }
53535       }
53536
53537
53538       function closeEditorTank() {
53539           if (!tankId || !context.hasEntity(tankId)) {
53540               return addTank();
53541           }
53542           var ids = context.selectedIDs();
53543           if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
53544               context.enter(modeSelect(context, [tankId]));
53545           }
53546
53547           context.history().checkpoint('hasTank');
53548
53549           context.on('exit.intro', function() {
53550               continueTo(rightClickTank);
53551           });
53552
53553           timeout(function() {
53554               reveal('.entity-editor-pane',
53555                   t('intro.buildings.close', { button: icon('#icon-apply', 'pre-text') })
53556               );
53557           }, 500);
53558
53559           function continueTo(nextStep) {
53560               context.on('exit.intro', null);
53561               nextStep();
53562           }
53563       }
53564
53565
53566       function rightClickTank() {
53567           if (!tankId) return continueTo(addTank);
53568
53569           context.enter(modeBrowse(context));
53570           context.history().reset('hasTank');
53571           context.map().centerEase(tank, 500);
53572
53573           timeout(function() {
53574               context.on('enter.intro', function(mode) {
53575                   if (mode.id !== 'select') return;
53576                   var ids = context.selectedIDs();
53577                   if (ids.length !== 1 || ids[0] !== tankId) return;
53578
53579                   timeout(function() {
53580                       var node = selectMenuItem('circularize').node();
53581                       if (!node) return;
53582                       continueTo(clickCircle);
53583                   }, 300);  // after menu visible
53584               });
53585
53586               revealTank(tank, t('intro.buildings.rightclick_tank'));
53587
53588               context.map().on('move.intro drawn.intro', function() {
53589                   revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
53590               });
53591
53592               context.history().on('change.intro', function() {
53593                   continueTo(rightClickTank);
53594               });
53595
53596           }, 600);
53597
53598           function continueTo(nextStep) {
53599               context.on('enter.intro', null);
53600               context.map().on('move.intro drawn.intro', null);
53601               context.history().on('change.intro', null);
53602               nextStep();
53603           }
53604       }
53605
53606
53607       function clickCircle() {
53608           if (!tankId) return chapter.restart();
53609           var entity = context.hasEntity(tankId);
53610           if (!entity) return continueTo(rightClickTank);
53611
53612           var node = selectMenuItem('circularize').node();
53613           if (!node) { return continueTo(rightClickTank); }
53614
53615           var wasChanged = false;
53616           var menuCoords = context.map().mouseCoordinates();
53617
53618           revealEditMenu(menuCoords,
53619               t('intro.buildings.circle_tank', { button: icon('#operation-circularize', 'pre-text') })
53620           );
53621
53622           context.on('enter.intro', function(mode) {
53623               if (mode.id === 'browse') {
53624                   continueTo(rightClickTank);
53625               } else if (mode.id === 'move' || mode.id === 'rotate') {
53626                   continueTo(retryClickCircle);
53627               }
53628           });
53629
53630           context.map().on('move.intro drawn.intro', function() {
53631               var node = selectMenuItem('circularize').node();
53632               if (!wasChanged && !node) { return continueTo(rightClickTank); }
53633
53634               revealEditMenu(menuCoords,
53635                   t('intro.buildings.circle_tank', { button: icon('#operation-circularize', 'pre-text') }),
53636                   { duration: 0 }
53637               );
53638           });
53639
53640           context.history().on('change.intro', function() {
53641               wasChanged = true;
53642               context.history().on('change.intro', null);
53643
53644               // Something changed.  Wait for transition to complete and check undo annotation.
53645               timeout(function() {
53646                   if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
53647                       continueTo(play);
53648                   } else {
53649                       continueTo(retryClickCircle);
53650                   }
53651               }, 500);  // after transitioned actions
53652           });
53653
53654           function continueTo(nextStep) {
53655               context.on('enter.intro', null);
53656               context.map().on('move.intro drawn.intro', null);
53657               context.history().on('change.intro', null);
53658               nextStep();
53659           }
53660       }
53661
53662
53663       function retryClickCircle() {
53664           context.enter(modeBrowse(context));
53665
53666           revealTank(tank, t('intro.buildings.retry_circle'), {
53667               buttonText: t('intro.ok'),
53668               buttonCallback: function() { continueTo(rightClickTank); }
53669           });
53670
53671           function continueTo(nextStep) {
53672               nextStep();
53673           }
53674       }
53675
53676
53677       function play() {
53678           dispatch$$1.call('done');
53679           reveal('#id-container',
53680               t('intro.buildings.play', { next: t('intro.startediting.title') }), {
53681                   tooltipBox: '.intro-nav-wrap .chapter-startEditing',
53682                   buttonText: t('intro.ok'),
53683                   buttonCallback: function() { reveal('#id-container'); }
53684               }
53685           );
53686       }
53687
53688
53689       chapter.enter = function() {
53690           addHouse();
53691       };
53692
53693
53694       chapter.exit = function() {
53695           timeouts.forEach(window.clearTimeout);
53696           context.on('enter.intro exit.intro', null);
53697           context.map().on('move.intro drawn.intro', null);
53698           context.history().on('change.intro', null);
53699           d3_select('.inspector-wrap').on('wheel.intro', null);
53700           d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
53701           d3_select('.more-fields .combobox-input').on('click.intro', null);
53702       };
53703
53704
53705       chapter.restart = function() {
53706           chapter.exit();
53707           chapter.enter();
53708       };
53709
53710
53711       return utilRebind(chapter, dispatch$$1, 'on');
53712   }
53713
53714   function uiModal(selection$$1, blocking) {
53715       var keybinding = d3keybinding('modal');
53716       var previous = selection$$1.select('div.modal');
53717       var animate = previous.empty();
53718
53719       previous.transition()
53720           .duration(200)
53721           .style('opacity', 0)
53722           .remove();
53723
53724       var shaded = selection$$1
53725           .append('div')
53726           .attr('class', 'shaded')
53727           .style('opacity', 0);
53728
53729       shaded.close = function() {
53730           shaded
53731               .transition()
53732               .duration(200)
53733               .style('opacity',0)
53734               .remove();
53735
53736           modal
53737               .transition()
53738               .duration(200)
53739               .style('top','0px');
53740
53741           keybinding.off();
53742       };
53743
53744
53745       var modal = shaded
53746           .append('div')
53747           .attr('class', 'modal fillL col6');
53748
53749       if (!blocking) {
53750           shaded.on('click.remove-modal', function() {
53751               if (event.target === this) {
53752                   shaded.close();
53753               }
53754           });
53755
53756           modal.append('button')
53757               .attr('class', 'close')
53758               .on('click', shaded.close)
53759               .call(svgIcon('#icon-close'));
53760
53761           keybinding
53762               .on('⌫', shaded.close)
53763               .on('⎋', shaded.close);
53764
53765           d3_select(document)
53766               .call(keybinding);
53767       }
53768
53769       modal
53770           .append('div')
53771           .attr('class', 'content');
53772
53773       if (animate) {
53774           shaded.transition().style('opacity', 1);
53775       } else {
53776           shaded.style('opacity', 1);
53777       }
53778
53779
53780       return shaded;
53781   }
53782
53783   function uiIntroStartEditing(context, reveal) {
53784       var dispatch$$1 = dispatch('done', 'startEditing'),
53785           modalSelection = d3_select(null);
53786
53787
53788       var chapter = {
53789           title: 'intro.startediting.title'
53790       };
53791
53792       function showHelp() {
53793           reveal('.map-control.help-control',
53794               t('intro.startediting.help', { button: icon('#icon-help', 'pre-text'), key: t('help.key') }), {
53795                   buttonText: t('intro.ok'),
53796                   buttonCallback: function() { shortcuts(); }
53797               }
53798           );
53799       }
53800
53801       function shortcuts() {
53802           reveal('.map-control.help-control',
53803               t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
53804                   buttonText: t('intro.ok'),
53805                   buttonCallback: function() { showSave(); }
53806               }
53807           );
53808       }
53809
53810       function showSave() {
53811           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
53812           reveal('#bar button.save',
53813               t('intro.startediting.save'), {
53814                   buttonText: t('intro.ok'),
53815                   buttonCallback: function() { showStart(); }
53816               }
53817           );
53818       }
53819
53820       function showStart() {
53821           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
53822
53823           modalSelection = uiModal(context.container());
53824
53825           modalSelection.select('.modal')
53826               .attr('class', 'modal-splash modal col6');
53827
53828           modalSelection.selectAll('.close').remove();
53829
53830           var startbutton = modalSelection.select('.content')
53831               .attr('class', 'fillL')
53832               .append('button')
53833                   .attr('class', 'modal-section huge-modal-button')
53834                   .on('click', function() {
53835                       modalSelection.remove();
53836                   });
53837
53838               startbutton
53839                   .append('svg')
53840                   .attr('class', 'illustration')
53841                   .append('use')
53842                   .attr('xlink:href', '#logo-walkthrough');
53843
53844               startbutton
53845                   .append('h2')
53846                   .text(t('intro.startediting.start'));
53847
53848           dispatch$$1.call('startEditing');
53849       }
53850
53851
53852       chapter.enter = function() {
53853           showHelp();
53854       };
53855
53856
53857       chapter.exit = function() {
53858           modalSelection.remove();
53859           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
53860       };
53861
53862
53863       return utilRebind(chapter, dispatch$$1, 'on');
53864   }
53865
53866   var chapterUi = {
53867       welcome: uiIntroWelcome,
53868       navigation: uiIntroNavigation,
53869       point: uiIntroPoint,
53870       area: uiIntroArea,
53871       line: uiIntroLine,
53872       building: uiIntroBuilding,
53873       startEditing: uiIntroStartEditing
53874   };
53875
53876   var chapterFlow = [
53877       'welcome',
53878       'navigation',
53879       'point',
53880       'area',
53881       'line',
53882       'building',
53883       'startEditing'
53884   ];
53885
53886
53887   function uiIntro(context) {
53888       var introGraph = {},
53889           currChapter;
53890
53891
53892       // create entities for intro graph and localize names
53893       for (var id in dataIntroGraph) {
53894           introGraph[id] = osmEntity$$1(localize(dataIntroGraph[id]));
53895       }
53896
53897
53898       function intro(selection$$1) {
53899           context.enter(modeBrowse(context));
53900
53901           // Save current map state
53902           var osm = context.connection(),
53903               history = context.history().toJSON(),
53904               hash = window.location.hash,
53905               center = context.map().center(),
53906               zoom = context.map().zoom(),
53907               background = context.background().baseLayerSource(),
53908               overlays = context.background().overlayLayerSources(),
53909               opacity = d3_selectAll('#map .layer-background').style('opacity'),
53910               loadedTiles = osm && osm.loadedTiles(),
53911               baseEntities = context.history().graph().base().entities,
53912               countryCode = services.geocoder.countryCode;
53913
53914           // Block saving
53915           context.inIntro(true);
53916
53917           // Load semi-real data used in intro
53918           if (osm) { osm.toggle(false).reset(); }
53919           context.history().reset();
53920           context.history().merge(values$1(coreGraph$$1().load(introGraph).entities));
53921           context.history().checkpoint('initial');
53922
53923           var esri = context.background().findSource('EsriWorldImagery');
53924           if (esri) {
53925               context.background().baseLayerSource(esri);
53926           } else {
53927               context.background().bing();
53928           }
53929           overlays.forEach(function (d) {
53930               context.background().toggleOverlayLayer(d);
53931           });
53932
53933           // Mock geocoder
53934           services.geocoder.countryCode = function(location, callback) {
53935               callback(null, t('intro.graph.countrycode'));
53936           };
53937
53938           d3_selectAll('#map .layer-background').style('opacity', 1);
53939
53940           var curtain = uiCurtain();
53941           selection$$1.call(curtain);
53942
53943           // store that the user started the walkthrough..
53944           context.storage('walkthrough_started', 'yes');
53945
53946           // restore previous walkthrough progress..
53947           var storedProgress = context.storage('walkthrough_progress') || '';
53948           var progress = storedProgress.split(';').filter(Boolean);
53949
53950           var chapters = chapterFlow.map(function(chapter, i) {
53951               var s = chapterUi[chapter](context, curtain.reveal)
53952                   .on('done', function() {
53953                       context.presets().init();  // clear away "recent" presets
53954
53955                       buttons.filter(function(d) {
53956                           return d.title === s.title;
53957                       }).classed('finished', true);
53958
53959                       if (i < chapterFlow.length - 1) {
53960                           var next = chapterFlow[i + 1];
53961                           d3_select('button.chapter-' + next)
53962                               .classed('next', true);
53963                       }
53964
53965                       // store walkthrough progress..
53966                       progress.push(chapter);
53967                       context.storage('walkthrough_progress', uniq(progress).join(';'));
53968                   });
53969               return s;
53970           });
53971
53972           chapters[chapters.length - 1].on('startEditing', function() {
53973               // store walkthrough progress..
53974               progress.push('startEditing');
53975               context.storage('walkthrough_progress', uniq(progress).join(';'));
53976
53977               // store if walkthrough is completed..
53978               var incomplete = difference(chapterFlow, progress);
53979               if (!incomplete.length) {
53980                   context.storage('walkthrough_completed', 'yes');
53981               }
53982
53983               curtain.remove();
53984               navwrap.remove();
53985               d3_selectAll('#map .layer-background').style('opacity', opacity);
53986               if (osm) { osm.toggle(true).reset().loadedTiles(loadedTiles); }
53987               context.history().reset().merge(values$1(baseEntities));
53988               context.background().baseLayerSource(background);
53989               overlays.forEach(function (d) { context.background().toggleOverlayLayer(d); });
53990               if (history) { context.history().fromJSON(history, false); }
53991               context.map().centerZoom(center, zoom);
53992               window.location.replace(hash);
53993               services.geocoder.countryCode = countryCode;
53994               context.inIntro(false);
53995           });
53996
53997           var navwrap = selection$$1
53998               .append('div')
53999               .attr('class', 'intro-nav-wrap fillD');
54000
54001           navwrap
54002               .append('svg')
54003               .attr('class', 'intro-nav-wrap-logo')
54004               .append('use')
54005               .attr('xlink:href', '#logo-walkthrough');
54006
54007           var buttonwrap = navwrap
54008               .append('div')
54009               .attr('class', 'joined')
54010               .selectAll('button.chapter');
54011
54012           var buttons = buttonwrap
54013               .data(chapters)
54014               .enter()
54015               .append('button')
54016               .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
54017               .on('click', enterChapter);
54018
54019           buttons
54020               .append('span')
54021               .text(function(d) { return t(d.title); });
54022
54023           buttons
54024               .append('span')
54025               .attr('class', 'status')
54026               .call(svgIcon((textDirection === 'rtl' ? '#icon-backward' : '#icon-forward'), 'inline'));
54027
54028           enterChapter(chapters[0]);
54029
54030
54031           function enterChapter(newChapter) {
54032               if (currChapter) { currChapter.exit(); }
54033               context.enter(modeBrowse(context));
54034
54035               currChapter = newChapter;
54036               currChapter.enter();
54037
54038               buttons
54039                   .classed('next', false)
54040                   .classed('active', function(d) {
54041                       return d.title === currChapter.title;
54042                   });
54043           }
54044       }
54045
54046
54047       return intro;
54048   }
54049
54050   function uiTooltipHtml(text, key, heading) {
54051       var s = '';
54052
54053       if (heading) {
54054           s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
54055       }
54056       if (text) {
54057           s += '<div class="tooltip-text"><span>' + text + '</span></div>';
54058       }
54059       if (key) {
54060           s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
54061               '<span class="keyhint">' + key + '</span></div>';
54062       }
54063
54064       return s;
54065   }
54066
54067   function uiMapData(context) {
54068       var key = t('map_data.key');
54069       var features = context.features().keys();
54070       var layers = context.layers();
54071       var fills = ['wireframe', 'partial', 'full'];
54072
54073       var _fillSelected = context.storage('area-fill') || 'partial';
54074       var _shown = false;
54075       var _dataLayerContainer = d3_select(null);
54076       var _fillList = d3_select(null);
54077       var _featureList = d3_select(null);
54078
54079
54080       function showsFeature(d) {
54081           return context.features().enabled(d);
54082       }
54083
54084
54085       function autoHiddenFeature(d) {
54086           return context.features().autoHidden(d);
54087       }
54088
54089
54090       function clickFeature(d) {
54091           context.features().toggle(d);
54092           update();
54093       }
54094
54095
54096       function showsFill(d) {
54097           return _fillSelected === d;
54098       }
54099
54100
54101       function setFill(d) {
54102           fills.forEach(function(opt) {
54103               context.surface().classed('fill-' + opt, Boolean(opt === d));
54104           });
54105
54106           _fillSelected = d;
54107           context.storage('area-fill', d);
54108           if (d !== 'wireframe') {
54109               context.storage('area-fill-toggle', d);
54110           }
54111           update();
54112       }
54113
54114
54115       function showsLayer(which) {
54116           var layer = layers.layer(which);
54117           if (layer) {
54118               return layer.enabled();
54119           }
54120           return false;
54121       }
54122
54123
54124       function setLayer(which, enabled) {
54125           var layer = layers.layer(which);
54126           if (layer) {
54127               layer.enabled(enabled);
54128               update();
54129           }
54130       }
54131
54132
54133       function toggleLayer(which) {
54134           setLayer(which, !showsLayer(which));
54135       }
54136
54137
54138       function drawPhotoItems(selection$$1) {
54139           var photoKeys = ['mapillary-images', 'mapillary-signs', 'openstreetcam-images'];
54140           var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; });
54141           var data = photoLayers.filter(function(obj) { return obj.layer.supported(); });
54142
54143           function layerSupported(d) {
54144               return d.layer && d.layer.supported();
54145           }
54146           function layerEnabled(d) {
54147               return layerSupported(d) && d.layer.enabled();
54148           }
54149
54150           var ul = selection$$1
54151               .selectAll('.layer-list-photos')
54152               .data([0]);
54153
54154           ul = ul.enter()
54155               .append('ul')
54156               .attr('class', 'layer-list layer-list-photos')
54157               .merge(ul);
54158
54159           var li = ul.selectAll('.list-item-photos')
54160               .data(data);
54161
54162           li.exit()
54163               .remove();
54164
54165           var liEnter = li.enter()
54166               .append('li')
54167               .attr('class', function(d) { return 'list-item-photos list-item-' + d.id; });
54168
54169           var labelEnter = liEnter
54170               .append('label')
54171               .each(function(d) {
54172                   d3_select(this)
54173                       .call(tooltip()
54174                           .title(t(d.id.replace('-', '_') + '.tooltip'))
54175                           .placement('top')
54176                       );
54177               });
54178
54179           labelEnter
54180               .append('input')
54181               .attr('type', 'checkbox')
54182               .on('change', function(d) { toggleLayer(d.id); });
54183
54184           labelEnter
54185               .append('span')
54186               .text(function(d) { return t(d.id.replace('-', '_') + '.title'); });
54187
54188
54189           // Update
54190           li = li
54191               .merge(liEnter);
54192
54193           li
54194               .classed('active', layerEnabled)
54195               .selectAll('input')
54196               .property('checked', layerEnabled);
54197       }
54198
54199
54200       function drawOsmItem(selection$$1) {
54201           var osm = layers.layer('osm'),
54202               showsOsm = osm.enabled();
54203
54204           var ul = selection$$1
54205               .selectAll('.layer-list-osm')
54206               .data(osm ? [0] : []);
54207
54208           // Exit
54209           ul.exit()
54210               .remove();
54211
54212           // Enter
54213           var ulEnter = ul.enter()
54214               .append('ul')
54215               .attr('class', 'layer-list layer-list-osm');
54216
54217           var liEnter = ulEnter
54218               .append('li')
54219               .attr('class', 'list-item-osm');
54220
54221           var labelEnter = liEnter
54222               .append('label')
54223               .call(tooltip()
54224                   .title(t('map_data.layers.osm.tooltip'))
54225                   .placement('top')
54226               );
54227
54228           labelEnter
54229               .append('input')
54230               .attr('type', 'checkbox')
54231               .on('change', function() { toggleLayer('osm'); });
54232
54233           labelEnter
54234               .append('span')
54235               .text(t('map_data.layers.osm.title'));
54236
54237           // Update
54238           ul = ul
54239               .merge(ulEnter);
54240
54241           ul.selectAll('.list-item-osm')
54242               .classed('active', showsOsm)
54243               .selectAll('input')
54244               .property('checked', showsOsm);
54245       }
54246
54247
54248       function drawGpxItem(selection$$1) {
54249           var gpx = layers.layer('gpx'),
54250               hasGpx = gpx && gpx.hasGpx(),
54251               showsGpx = hasGpx && gpx.enabled();
54252
54253           var ul = selection$$1
54254               .selectAll('.layer-list-gpx')
54255               .data(gpx ? [0] : []);
54256
54257           // Exit
54258           ul.exit()
54259               .remove();
54260
54261           // Enter
54262           var ulEnter = ul.enter()
54263               .append('ul')
54264               .attr('class', 'layer-list layer-list-gpx');
54265
54266           var liEnter = ulEnter
54267               .append('li')
54268               .attr('class', 'list-item-gpx');
54269
54270           liEnter
54271               .append('button')
54272               .attr('class', 'list-item-gpx-extent')
54273               .call(tooltip()
54274                   .title(t('gpx.zoom'))
54275                   .placement((textDirection === 'rtl') ? 'right' : 'left')
54276               )
54277               .on('click', function() {
54278                   event.preventDefault();
54279                   event.stopPropagation();
54280                   gpx.fitZoom();
54281               })
54282               .call(svgIcon('#icon-search'));
54283
54284           liEnter
54285               .append('button')
54286               .attr('class', 'list-item-gpx-browse')
54287               .call(tooltip()
54288                   .title(t('gpx.browse'))
54289                   .placement((textDirection === 'rtl') ? 'right' : 'left')
54290               )
54291               .on('click', function() {
54292                   d3_select(document.createElement('input'))
54293                       .attr('type', 'file')
54294                       .on('change', function() {
54295                           gpx.files(event.target.files);
54296                       })
54297                       .node().click();
54298               })
54299               .call(svgIcon('#icon-geolocate'));
54300
54301           var labelEnter = liEnter
54302               .append('label')
54303               .call(tooltip()
54304                   .title(t('gpx.drag_drop'))
54305                   .placement('top')
54306               );
54307
54308           labelEnter
54309               .append('input')
54310               .attr('type', 'checkbox')
54311               .on('change', function() { toggleLayer('gpx'); });
54312
54313           labelEnter
54314               .append('span')
54315               .text(t('gpx.local_layer'));
54316
54317           // Update
54318           ul = ul
54319               .merge(ulEnter);
54320
54321           ul.selectAll('.list-item-gpx')
54322               .classed('active', showsGpx)
54323               .selectAll('label')
54324               .classed('deemphasize', !hasGpx)
54325               .selectAll('input')
54326               .property('disabled', !hasGpx)
54327               .property('checked', showsGpx);
54328       }
54329
54330
54331       function drawListItems(selection$$1, data, type, name, change, active) {
54332           var items = selection$$1.selectAll('li')
54333               .data(data);
54334
54335           // Exit
54336           items.exit()
54337               .remove();
54338
54339           // Enter
54340           var enter = items.enter()
54341               .append('li')
54342               .attr('class', 'layer')
54343               .call(tooltip()
54344                   .html(true)
54345                   .title(function(d) {
54346                       var tip = t(name + '.' + d + '.tooltip'),
54347                           key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
54348
54349                       if (name === 'feature' && autoHiddenFeature(d)) {
54350                           var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
54351                           tip += '<div>' + msg + '</div>';
54352                       }
54353                       return uiTooltipHtml(tip, key);
54354                   })
54355                   .placement('top')
54356               );
54357
54358           var label = enter
54359               .append('label');
54360
54361           label
54362               .append('input')
54363               .attr('type', type)
54364               .attr('name', name)
54365               .on('change', change);
54366
54367           label
54368               .append('span')
54369               .text(function(d) { return t(name + '.' + d + '.description'); });
54370
54371           // Update
54372           items = items
54373               .merge(enter);
54374
54375           items
54376               .classed('active', active)
54377               .selectAll('input')
54378               .property('checked', active)
54379               .property('indeterminate', function(d) {
54380                   return (name === 'feature' && autoHiddenFeature(d));
54381               });
54382       }
54383
54384
54385       function renderDataLayers(selection$$1) {
54386           var container = selection$$1.selectAll('data-layer-container')
54387               .data([0]);
54388
54389           _dataLayerContainer = container.enter()
54390               .append('div')
54391               .attr('class', 'data-layer-container')
54392               .merge(container);
54393       }
54394
54395
54396       function renderFillList(selection$$1) {
54397           var container = selection$$1.selectAll('layer-fill-list')
54398               .data([0]);
54399
54400           _fillList = container.enter()
54401               .append('ul')
54402               .attr('class', 'layer-list layer-fill-list')
54403               .merge(container);
54404       }
54405
54406
54407       function renderFeatureList(selection$$1) {
54408           var container = selection$$1.selectAll('layer-feature-list')
54409               .data([0]);
54410
54411           _featureList = container.enter()
54412               .append('ul')
54413               .attr('class', 'layer-list layer-feature-list')
54414               .merge(container);
54415       }
54416
54417
54418       function update() {
54419           _dataLayerContainer
54420               .call(drawOsmItem)
54421               .call(drawPhotoItems)
54422               .call(drawGpxItem);
54423
54424           _fillList
54425               .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill);
54426
54427           _featureList
54428               .call(drawListItems, features, 'checkbox', 'feature', clickFeature, showsFeature);
54429       }
54430
54431
54432       function toggleWireframe() {
54433           if (event) {
54434               event.preventDefault();
54435               event.stopPropagation();
54436           }
54437
54438           if (_fillSelected === 'wireframe') {
54439               _fillSelected = context.storage('area-fill-toggle') || 'partial';
54440           } else {
54441               _fillSelected = 'wireframe';
54442           }
54443
54444           setFill(_fillSelected);
54445           context.map().pan([0,0]);  // trigger a redraw
54446       }
54447
54448
54449       function mapData(selection$$1) {
54450
54451           function hidePane() {
54452               setVisible(false);
54453           }
54454
54455           function togglePane() {
54456               if (event) event.preventDefault();
54457               paneTooltip.hide(button);
54458               setVisible(!button.classed('active'));
54459           }
54460
54461           function setVisible(show) {
54462               if (show !== _shown) {
54463                   button.classed('active', show);
54464                   _shown = show;
54465
54466                   if (show) {
54467                       uiBackground.hidePane();
54468                       uiHelp.hidePane();
54469                       update();
54470
54471                       pane
54472                           .style('display', 'block')
54473                           .style('right', '-300px')
54474                           .transition()
54475                           .duration(200)
54476                           .style('right', '0px');
54477
54478                   } else {
54479                       pane
54480                           .style('display', 'block')
54481                           .style('right', '0px')
54482                           .transition()
54483                           .duration(200)
54484                           .style('right', '-300px')
54485                           .on('end', function() {
54486                               d3_select(this).style('display', 'none');
54487                           });
54488                   }
54489               }
54490           }
54491
54492
54493           var pane = selection$$1
54494               .append('div')
54495               .attr('class', 'fillL map-pane col4 hide');
54496
54497           var paneTooltip = tooltip()
54498               .placement((textDirection === 'rtl') ? 'right' : 'left')
54499               .html(true)
54500               .title(uiTooltipHtml(t('map_data.description'), key));
54501
54502           var button = selection$$1
54503               .append('button')
54504               .attr('tabindex', -1)
54505               .on('click', togglePane)
54506               .call(svgIcon('#icon-data', 'light'))
54507               .call(paneTooltip);
54508
54509
54510           var heading = pane
54511               .append('div')
54512               .attr('class', 'pane-heading');
54513
54514           heading
54515               .append('h2')
54516               .text(t('map_data.title'));
54517
54518           heading
54519               .append('button')
54520               .on('click', function() { uiMapData.hidePane(); })
54521               .call(svgIcon('#icon-close'));
54522
54523
54524           var content = pane
54525               .append('div')
54526               .attr('class', 'pane-content');
54527
54528           // data layers
54529           content
54530               .append('div')
54531               .attr('class', 'map-data-data-layers')
54532               .call(uiDisclosure(context, 'data_layers', true)
54533                   .title(t('map_data.data_layers'))
54534                   .content(renderDataLayers)
54535               );
54536
54537           // area fills
54538           content
54539               .append('div')
54540               .attr('class', 'map-data-area-fills')
54541               .call(uiDisclosure(context, 'fill_area', false)
54542                   .title(t('map_data.fill_area'))
54543                   .content(renderFillList)
54544               );
54545
54546           // feature filters
54547           content
54548               .append('div')
54549               .attr('class', 'map-data-feature-filters')
54550               .call(uiDisclosure(context, 'map_features', false)
54551                   .title(t('map_data.map_features'))
54552                   .content(renderFeatureList)
54553               );
54554
54555
54556           // add listeners
54557           context.features()
54558               .on('change.map_data-update', update);
54559
54560           update();
54561           setFill(_fillSelected);
54562
54563           var keybinding = d3keybinding('features')
54564               .on(key, togglePane)
54565               .on(t('area_fill.wireframe.key'), toggleWireframe)
54566               .on([t('background.key'), t('help.key')], hidePane);
54567
54568           d3_select(document)
54569               .call(keybinding);
54570
54571           uiMapData.hidePane = hidePane;
54572           uiMapData.togglePane = togglePane;
54573           uiMapData.setVisible = setVisible;
54574       }
54575
54576       return mapData;
54577   }
54578
54579   function uiShortcuts() {
54580       var detected = utilDetect();
54581       var activeTab = 0;
54582       var modalSelection;
54583       var savedSelection;
54584
54585
54586       var keybinding = d3keybinding('shortcuts')
54587           .on(t('shortcuts.toggle.key'), function () {
54588               if (d3_selectAll('.modal-shortcuts').size()) {  // already showing
54589                   if (modalSelection) {
54590                       modalSelection.close();
54591                       modalSelection = null;
54592                   }
54593               } else {
54594                   modalSelection = uiModal(savedSelection);
54595                   shortcutsModal(modalSelection);
54596               }
54597           });
54598
54599       d3_select(document)
54600           .call(keybinding);
54601
54602
54603
54604       function shortcutsModal(modalSelection) {
54605           modalSelection.select('.modal')
54606               .classed('modal-shortcuts', true);
54607
54608           var shortcutsModal = modalSelection.select('.content');
54609
54610           shortcutsModal
54611               .append('div')
54612               .attr('class', 'modal-section')
54613               .append('h3')
54614               .text(t('shortcuts.title'));
54615
54616           shortcutsModal
54617               .call(render);
54618       }
54619
54620
54621       function render(selection$$1) {
54622           var wrapper = selection$$1
54623               .selectAll('.wrapper')
54624               .data([0]);
54625
54626           var wrapperEnter = wrapper
54627               .enter()
54628               .append('div')
54629               .attr('class', 'wrapper modal-section');
54630
54631           var tabsBar = wrapperEnter
54632               .append('div')
54633               .attr('class', 'tabs-bar');
54634
54635           var shortcutsList = wrapperEnter
54636               .append('div')
54637               .attr('class', 'shortcuts-list');
54638
54639           wrapper = wrapper.merge(wrapperEnter);
54640
54641           var tabs = tabsBar
54642               .selectAll('.tab')
54643               .data(dataShortcuts);
54644
54645           var tabsEnter = tabs
54646               .enter()
54647               .append('div')
54648               .attr('class', 'tab')
54649               .on('click', function (d, i) {
54650                   activeTab = i;
54651                   render(selection$$1);
54652               });
54653
54654           tabsEnter
54655               .append('span')
54656               .text(function (d) { return t(d.text); });
54657
54658           tabs = tabs
54659               .merge(tabsEnter);
54660
54661           // Update
54662           wrapper.selectAll('.tab')
54663               .classed('active', function (d, i) {
54664                   return i === activeTab;
54665               });
54666
54667
54668           var shortcuts = shortcutsList
54669               .selectAll('.shortcut-tab')
54670               .data(dataShortcuts);
54671
54672           var shortcutsEnter = shortcuts
54673               .enter()
54674               .append('div')
54675               .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
54676
54677           var columnsEnter = shortcutsEnter
54678               .selectAll('.shortcut-column')
54679               .data(function (d) { return d.columns; })
54680               .enter()
54681               .append('table')
54682               .attr('class', 'shortcut-column');
54683
54684           var rowsEnter = columnsEnter
54685               .selectAll('.shortcut-row')
54686               .data(function (d) { return d.rows; })
54687               .enter()
54688               .append('tr')
54689               .attr('class', 'shortcut-row');
54690
54691
54692           var sectionRows = rowsEnter
54693               .filter(function (d) { return !d.shortcuts; });
54694
54695           sectionRows
54696               .append('td');
54697
54698           sectionRows
54699               .append('td')
54700               .attr('class', 'shortcut-section')
54701               .append('h3')
54702               .text(function (d) { return t(d.text); });
54703
54704
54705           var shortcutRows = rowsEnter
54706               .filter(function (d) { return d.shortcuts; });
54707
54708           var shortcutKeys = shortcutRows
54709               .append('td')
54710               .attr('class', 'shortcut-keys');
54711
54712           var modifierKeys = shortcutKeys
54713               .filter(function (d) { return d.modifiers; });
54714
54715           modifierKeys
54716               .selectAll('kbd.modifier')
54717               .data(function (d) {
54718                   if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
54719                       return ['⌘'];
54720                   } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
54721                       return [];
54722                   } else {
54723                       return d.modifiers;
54724                   }
54725               })
54726               .enter()
54727               .each(function () {
54728                   var selection$$1 = d3_select(this);
54729
54730                   selection$$1
54731                       .append('kbd')
54732                       .attr('class', 'modifier')
54733                       .text(function (d) { return uiCmd.display(d); });
54734
54735                   selection$$1
54736                       .append('span')
54737                       .text('+');
54738               });
54739
54740
54741           shortcutKeys
54742               .selectAll('kbd.shortcut')
54743               .data(function (d) {
54744                   var arr = d.shortcuts;
54745                   if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
54746                       arr = ['Y'];
54747                   } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
54748                       arr = ['F11'];
54749                   }
54750
54751                   return arr.map(function(s) {
54752                       return {
54753                           shortcut: s,
54754                           separator: d.separator
54755                       };
54756                   });
54757               })
54758               .enter()
54759               .each(function (d, i, nodes) {
54760                   var selection$$1 = d3_select(this);
54761                   var click = d.shortcut.toLowerCase().match(/(.*).click/);
54762
54763                   if (click && click[1]) {
54764                       selection$$1
54765                           .call(svgIcon('#walkthrough-mouse', 'mouseclick', click[1]));
54766                   } else {
54767                       selection$$1
54768                           .append('kbd')
54769                           .attr('class', 'shortcut')
54770                           .text(function (d) {
54771                               var key = d.shortcut;
54772                               return key.indexOf('.') !== -1 ? uiCmd.display(t(key)) : uiCmd.display(key);
54773                           });
54774                   }
54775
54776                   if (i < nodes.length - 1) {
54777                       selection$$1
54778                           .append('span')
54779                           .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
54780                   }
54781               });
54782
54783
54784           shortcutKeys
54785               .filter(function(d) { return d.gesture; })
54786               .each(function () {
54787                   var selection$$1 = d3_select(this);
54788
54789                   selection$$1
54790                       .append('span')
54791                       .text('+');
54792
54793                   selection$$1
54794                       .append('span')
54795                       .attr('class', 'gesture')
54796                       .text(function (d) { return t(d.gesture); });
54797               });
54798
54799
54800           shortcutRows
54801               .append('td')
54802               .attr('class', 'shortcut-desc')
54803               .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
54804
54805
54806           shortcuts = shortcuts
54807               .merge(shortcutsEnter);
54808
54809           // Update
54810           wrapper.selectAll('.shortcut-tab')
54811               .style('display', function (d, i) {
54812                   return i === activeTab ? 'flex' : 'none';
54813               });
54814       }
54815
54816
54817       return function(selection$$1, show) {
54818           savedSelection = selection$$1;
54819           if (show) {
54820               modalSelection = uiModal(selection$$1);
54821               shortcutsModal(modalSelection);
54822           }
54823       };
54824   }
54825
54826   function uiHelp(context) {
54827       var key = t('help.key');
54828
54829       var docKeys = [
54830           ['help', [
54831               'welcome',
54832               'open_data_h',
54833               'open_data',
54834               'before_start_h',
54835               'before_start',
54836               'open_source_h',
54837               'open_source',
54838               'open_source_help'
54839           ]],
54840           ['overview', [
54841               'navigation_h',
54842               'navigation_drag',
54843               'navigation_zoom',
54844               'features_h',
54845               'features',
54846               'nodes_ways'
54847           ]],
54848           ['editing', [
54849               'select_h',
54850               'select_left_click',
54851               'select_right_click',
54852               'multiselect_h',
54853               'multiselect_shift_click',
54854               'multiselect_lasso',
54855               'undo_redo_h',
54856               'undo_redo',
54857               'save_h',
54858               'save',
54859               'save_validation',
54860               'upload_h',
54861               'upload',
54862               'backups_h',
54863               'backups',
54864               'keyboard_h',
54865               'keyboard'
54866           ]],
54867           ['feature_editor', [
54868               'intro',
54869               'definitions',
54870               'type_h',
54871               'type',
54872               'type_picker',
54873               'fields_h',
54874               'fields_all_fields',
54875               'fields_example',
54876               'fields_add_field',
54877               'tags_h',
54878               'tags_all_tags',
54879               'tags_resources'
54880           ]],
54881           ['points', [
54882               'intro',
54883               'add_point_h',
54884               'add_point',
54885               'add_point_finish',
54886               'move_point_h',
54887               'move_point',
54888               'delete_point_h',
54889               'delete_point',
54890               'delete_point_command'
54891           ]],
54892           ['lines', [
54893               'intro',
54894               'add_line_h',
54895               'add_line',
54896               'add_line_draw',
54897               'add_line_finish',
54898               'modify_line_h',
54899               'modify_line_dragnode',
54900               'modify_line_addnode',
54901               'connect_line_h',
54902               'connect_line',
54903               'connect_line_display',
54904               'connect_line_drag',
54905               'connect_line_tag',
54906               'disconnect_line_h',
54907               'disconnect_line_command',
54908               'move_line_h',
54909               'move_line_command',
54910               'move_line_connected',
54911               'delete_line_h',
54912               'delete_line',
54913               'delete_line_command'
54914           ]],
54915           ['areas', [
54916               'intro',
54917               'point_or_area_h',
54918               'point_or_area',
54919               'add_area_h',
54920               'add_area_command',
54921               'add_area_draw',
54922               'add_area_finish',
54923               'square_area_h',
54924               'square_area_command',
54925               'modify_area_h',
54926               'modify_area_dragnode',
54927               'modify_area_addnode',
54928               'delete_area_h',
54929               'delete_area',
54930               'delete_area_command'
54931           ]],
54932           ['relations', [
54933               'intro',
54934               'edit_relation_h',
54935               'edit_relation',
54936               'edit_relation_add',
54937               'edit_relation_delete',
54938               'maintain_relation_h',
54939               'maintain_relation',
54940               'relation_types_h',
54941               'multipolygon_h',
54942               'multipolygon',
54943               'multipolygon_create',
54944               'multipolygon_merge',
54945               'turn_restriction_h',
54946               'turn_restriction',
54947               'turn_restriction_field',
54948               'turn_restriction_editing',
54949               'route_h',
54950               'route',
54951               'route_add',
54952               'boundary_h',
54953               'boundary',
54954               'boundary_add'
54955           ]],
54956           ['imagery', [
54957               'intro',
54958               'sources_h',
54959               'choosing',
54960               'sources',
54961               'offsets_h',
54962               'offset',
54963               'offset_change'
54964           ]],
54965           ['streetlevel', [
54966               'intro',
54967               'using_h',
54968               'using',
54969               'photos',
54970               'viewer'
54971           ]],
54972           ['gps', [
54973               'intro',
54974               'survey',
54975               'using_h',
54976               'using',
54977               'tracing',
54978               'upload'
54979           ]]
54980       ];
54981
54982       var headings = {
54983           'help.help.open_data_h': 3,
54984           'help.help.before_start_h': 3,
54985           'help.help.open_source_h': 3,
54986           'help.overview.navigation_h': 3,
54987           'help.overview.features_h': 3,
54988           'help.editing.select_h': 3,
54989           'help.editing.multiselect_h': 3,
54990           'help.editing.undo_redo_h': 3,
54991           'help.editing.save_h': 3,
54992           'help.editing.upload_h': 3,
54993           'help.editing.backups_h': 3,
54994           'help.editing.keyboard_h': 3,
54995           'help.feature_editor.type_h': 3,
54996           'help.feature_editor.fields_h': 3,
54997           'help.feature_editor.tags_h': 3,
54998           'help.points.add_point_h': 3,
54999           'help.points.move_point_h': 3,
55000           'help.points.delete_point_h': 3,
55001           'help.lines.add_line_h': 3,
55002           'help.lines.modify_line_h': 3,
55003           'help.lines.connect_line_h': 3,
55004           'help.lines.disconnect_line_h': 3,
55005           'help.lines.move_line_h': 3,
55006           'help.lines.delete_line_h': 3,
55007           'help.areas.point_or_area_h': 3,
55008           'help.areas.add_area_h': 3,
55009           'help.areas.square_area_h': 3,
55010           'help.areas.modify_area_h': 3,
55011           'help.areas.delete_area_h': 3,
55012           'help.relations.edit_relation_h': 3,
55013           'help.relations.maintain_relation_h': 3,
55014           'help.relations.relation_types_h': 2,
55015           'help.relations.multipolygon_h': 3,
55016           'help.relations.turn_restriction_h': 3,
55017           'help.relations.route_h': 3,
55018           'help.relations.boundary_h': 3,
55019           'help.imagery.sources_h': 3,
55020           'help.imagery.offsets_h': 3,
55021           'help.streetlevel.using_h': 3,
55022           'help.gps.using_h': 3,
55023       };
55024
55025       var replacements = {
55026           point: icon('#icon-point', 'pre-text'),
55027           line: icon('#icon-line', 'pre-text'),
55028           area: icon('#icon-area', 'pre-text'),
55029           plus: icon('#icon-plus', 'pre-text'),
55030           minus: icon('#icon-minus', 'pre-text'),
55031           orthogonalize: icon('#operation-orthogonalize', 'pre-text'),
55032           disconnect: icon('#operation-disconnect', 'pre-text'),
55033           layers: icon('#icon-layers', 'pre-text'),
55034           data: icon('#icon-data', 'pre-text'),
55035           inspect: icon('#icon-inspect', 'pre-text'),
55036           move: icon('#operation-move', 'pre-text'),
55037           merge: icon('#operation-merge', 'pre-text'),
55038           delete: icon('#operation-delete', 'pre-text'),
55039           close: icon('#icon-close', 'pre-text'),
55040           undo: icon(textDirection === 'rtl' ? '#icon-redo' : '#icon-undo', 'pre-text'),
55041           redo: icon(textDirection === 'rtl' ? '#icon-undo' : '#icon-redo', 'pre-text'),
55042           save: icon('#icon-save', 'pre-text'),
55043           leftclick: icon('#walkthrough-mouse', 'pre-text mouseclick', 'left'),
55044           rightclick: icon('#walkthrough-mouse', 'pre-text mouseclick', 'right'),
55045           shift: uiCmd.display('⇧'),
55046           alt: uiCmd.display('⌥'),
55047           return: uiCmd.display('↵'),
55048           version: context.version
55049       };
55050
55051       // For each section, squash all the texts into a single markdown document
55052       var docs = docKeys.map(function(key) {
55053           var helpkey = 'help.' + key[0];
55054           var text = key[1].reduce(function(all, part) {
55055               var subkey = helpkey + '.' + part;
55056               var depth = headings[subkey];                              // is this subkey a heading?
55057               var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
55058               return all + hhh + t(subkey, replacements) + '\n\n';
55059           }, '');
55060
55061           return {
55062               title: t(helpkey + '.title'),
55063               html: marked(text.trim())
55064           };
55065       });
55066
55067
55068       function help(selection$$1) {
55069
55070           function hidePane() {
55071               setVisible(false);
55072           }
55073
55074
55075           function togglePane() {
55076               if (event) event.preventDefault();
55077               tooltipBehavior.hide(button);
55078               setVisible(!button.classed('active'));
55079           }
55080
55081
55082           function setVisible(show) {
55083               if (show !== shown) {
55084                   button.classed('active', show);
55085                   shown = show;
55086
55087                   if (show) {
55088                       uiBackground.hidePane();
55089                       uiMapData.hidePane();
55090
55091                       pane.style('display', 'block')
55092                           .style('right', '-500px')
55093                           .transition()
55094                           .duration(200)
55095                           .style('right', '0px');
55096
55097                   } else {
55098                       pane.style('right', '0px')
55099                           .transition()
55100                           .duration(200)
55101                           .style('right', '-500px')
55102                           .on('end', function() {
55103                               d3_select(this).style('display', 'none');
55104                           });
55105                   }
55106               }
55107           }
55108
55109
55110           function clickHelp(d, i) {
55111               var rtl = (textDirection === 'rtl');
55112               pane.property('scrollTop', 0);
55113               doctitle.html(d.title);
55114
55115               body.html(d.html);
55116               body.selectAll('a')
55117                   .attr('target', '_blank');
55118               menuItems.classed('selected', function(m) {
55119                   return m.title === d.title;
55120               });
55121
55122               nav.html('');
55123               if (rtl) {
55124                   nav.call(drawNext).call(drawPrevious);
55125               } else {
55126                   nav.call(drawPrevious).call(drawNext);
55127               }
55128
55129
55130               function drawNext(selection$$1) {
55131                   if (i < docs.length - 1) {
55132                       var nextLink = selection$$1
55133                           .append('a')
55134                           .attr('class', 'next')
55135                           .on('click', function() {
55136                               clickHelp(docs[i + 1], i + 1);
55137                           });
55138
55139                       nextLink
55140                           .append('span')
55141                           .text(docs[i + 1].title)
55142                           .call(svgIcon((rtl ? '#icon-backward' : '#icon-forward'), 'inline'));
55143                   }
55144               }
55145
55146
55147               function drawPrevious(selection$$1) {
55148                   if (i > 0) {
55149                       var prevLink = selection$$1
55150                           .append('a')
55151                           .attr('class', 'previous')
55152                           .on('click', function() {
55153                               clickHelp(docs[i - 1], i - 1);
55154                           });
55155
55156                       prevLink
55157                           .call(svgIcon((rtl ? '#icon-forward' : '#icon-backward'), 'inline'))
55158                           .append('span')
55159                           .text(docs[i - 1].title);
55160                   }
55161               }
55162           }
55163
55164
55165           function clickWalkthrough() {
55166               if (context.inIntro()) return;
55167               context.container().call(uiIntro(context));
55168               setVisible(false);
55169           }
55170
55171
55172           function clickShortcuts() {
55173               context.container().call(uiShortcuts(context), true);
55174           }
55175
55176
55177           var pane = selection$$1.append('div')
55178               .attr('class', 'help-wrap map-pane fillL col6 hide');
55179
55180           var tooltipBehavior = tooltip()
55181               .placement((textDirection === 'rtl') ? 'right' : 'left')
55182               .html(true)
55183               .title(uiTooltipHtml(t('help.title'), key));
55184
55185           var button = selection$$1.append('button')
55186               .attr('tabindex', -1)
55187               .on('click', togglePane)
55188               .call(svgIcon('#icon-help', 'light'))
55189               .call(tooltipBehavior);
55190
55191           var shown = false;
55192
55193
55194           var heading = pane
55195               .append('div')
55196               .attr('class', 'pane-heading');
55197
55198           var doctitle = heading
55199               .append('h2')
55200               .text(t('help.title'));
55201
55202           heading
55203               .append('button')
55204               .on('click', function() { uiHelp.hidePane(); })
55205               .call(svgIcon('#icon-close'));
55206
55207
55208           var content = pane
55209               .append('div')
55210               .attr('class', 'pane-content');
55211
55212           var toc = content
55213               .append('ul')
55214               .attr('class', 'toc');
55215
55216           var menuItems = toc.selectAll('li')
55217               .data(docs)
55218               .enter()
55219               .append('li')
55220               .append('a')
55221               .html(function(d) { return d.title; })
55222               .on('click', clickHelp);
55223
55224           var shortcuts = toc
55225               .append('li')
55226               .attr('class', 'shortcuts')
55227               .call(tooltip()
55228                   .html(true)
55229                   .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
55230                   .placement('top')
55231               )
55232               .append('a')
55233               .on('click', clickShortcuts);
55234
55235           shortcuts
55236               .append('div')
55237               .text(t('shortcuts.title'));
55238
55239           var walkthrough = toc
55240               .append('li')
55241               .attr('class', 'walkthrough')
55242               .append('a')
55243               .on('click', clickWalkthrough);
55244
55245           walkthrough
55246               .append('svg')
55247               .attr('class', 'logo logo-walkthrough')
55248               .append('use')
55249               .attr('xlink:href', '#logo-walkthrough');
55250
55251           walkthrough
55252               .append('div')
55253               .text(t('splash.walkthrough'));
55254
55255
55256           var helpContent = content
55257               .append('div')
55258               .attr('class', 'left-content');
55259
55260           var body = helpContent
55261               .append('div')
55262               .attr('class', 'body');
55263
55264           var nav = helpContent
55265               .append('div')
55266               .attr('class', 'nav');
55267
55268           clickHelp(docs[0], 0);
55269
55270           var keybinding = d3keybinding('help')
55271               .on(key, togglePane)
55272               .on([t('background.key'), t('map_data.key')], hidePane);
55273
55274           d3_select(document)
55275               .call(keybinding);
55276
55277           uiHelp.hidePane = hidePane;
55278           uiHelp.togglePane = togglePane;
55279           uiHelp.setVisible = setVisible;
55280       }
55281
55282       return help;
55283   }
55284
55285   function localeDateString(s) {
55286       if (!s) return null;
55287       var detected = utilDetect();
55288       var options = { day: 'numeric', month: 'short', year: 'numeric' };
55289       var d = new Date(s);
55290       if (isNaN(d.getTime())) return null;
55291       return d.toLocaleDateString(detected.locale, options);
55292   }
55293
55294   function vintageRange(vintage) {
55295       var s;
55296       if (vintage.start || vintage.end) {
55297           s = (vintage.start || '?');
55298           if (vintage.start !== vintage.end) {
55299               s += ' - ' + (vintage.end || '?');
55300           }
55301       }
55302       return s;
55303   }
55304
55305
55306   function rendererBackgroundSource(data) {
55307       var source = clone(data);
55308       var offset = [0, 0];
55309       var name = source.name;
55310       var description = source.description;
55311       var best = !!source.best;
55312       var template = source.template;
55313
55314       source.scaleExtent = data.scaleExtent || [0, 22];
55315       source.overzoom = data.overzoom !== false;
55316
55317
55318       source.offset = function(_) {
55319           if (!arguments.length) return offset;
55320           offset = _;
55321           return source;
55322       };
55323
55324
55325       source.nudge = function(_, zoomlevel) {
55326           offset[0] += _[0] / Math.pow(2, zoomlevel);
55327           offset[1] += _[1] / Math.pow(2, zoomlevel);
55328           return source;
55329       };
55330
55331
55332       source.name = function() {
55333           var id_safe = source.id.replace('.', '<TX_DOT>');
55334           return t('imagery.' + id_safe + '.name', { default: name });
55335       };
55336
55337
55338       source.description = function() {
55339           var id_safe = source.id.replace('.', '<TX_DOT>');
55340           return t('imagery.' + id_safe + '.description', { default: description });
55341       };
55342
55343
55344       source.best = function() {
55345           return best;
55346       };
55347
55348
55349       source.area = function() {
55350           if (!data.polygon) return Number.MAX_VALUE;  // worldwide
55351           var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
55352           return isNaN(area) ? 0 : area;
55353       };
55354
55355
55356       source.imageryUsed = function() {
55357           return name || source.id;
55358       };
55359
55360
55361       source.template = function(_) {
55362           if (!arguments.length) return template;
55363           if (source.id === 'custom') template = _;
55364           return source;
55365       };
55366
55367
55368       source.url = function(coord) {
55369           if (this.type === 'wms') {
55370               var tileToProjectedCoords = (function(x, y, z) {
55371                   //polyfill for IE11, PhantomJS
55372                   var sinh = Math.sinh || function(x) {
55373                       var y = Math.exp(x);
55374                       return (y - 1 / y) / 2;
55375                   };
55376
55377                   var zoomSize = Math.pow(2, z);
55378                   var lon = x / zoomSize * Math.PI * 2 - Math.PI;
55379                   var lat = Math.atan(sinh(Math.PI * (1 - 2 * y / zoomSize)));
55380
55381                   switch (this.projection) {
55382                     case 'EPSG:4326': // todo: alternative codes of WGS 84?
55383                       return {
55384                         x: lon * 180 / Math.PI,
55385                         y: lat * 180 / Math.PI
55386                       };
55387                     default: // EPSG:3857 and synonyms
55388                       var mercCoords = mercatorRaw(lon, lat);
55389                       return {
55390                         x: 20037508.34 / Math.PI * mercCoords[0],
55391                         y: 20037508.34 / Math.PI * mercCoords[1]
55392                       };
55393                   }
55394               }).bind(this);
55395               var minXmaxY = tileToProjectedCoords(coord[0], coord[1], coord[2]);
55396               var maxXminY = tileToProjectedCoords(coord[0]+1, coord[1]+1, coord[2]);
55397               return template
55398                   .replace('{width}', 256)
55399                   .replace('{height}', 256)
55400                   .replace('{proj}', this.projection)
55401                   .replace('{bbox}', minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y);
55402           }
55403           return template
55404               .replace('{x}', coord[0])
55405               .replace('{y}', coord[1])
55406               // TMS-flipped y coordinate
55407               .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
55408               .replace(/\{z(oom)?\}/, coord[2])
55409               .replace(/\{switch:([^}]+)\}/, function(s, r) {
55410                   var subdomains = r.split(',');
55411                   return subdomains[(coord[0] + coord[1]) % subdomains.length];
55412               })
55413               .replace('{u}', function() {
55414                   var u = '';
55415                   for (var zoom = coord[2]; zoom > 0; zoom--) {
55416                       var b = 0;
55417                       var mask = 1 << (zoom - 1);
55418                       if ((coord[0] & mask) !== 0) b++;
55419                       if ((coord[1] & mask) !== 0) b += 2;
55420                       u += b.toString();
55421                   }
55422                   return u;
55423               });
55424       };
55425
55426
55427       source.intersects = function(extent) {
55428           extent = extent.polygon();
55429           return !data.polygon || data.polygon.some(function(polygon) {
55430               return geoPolygonIntersectsPolygon(polygon, extent, true);
55431           });
55432       };
55433
55434
55435       source.validZoom = function(z) {
55436           return source.scaleExtent[0] <= z &&
55437               (source.overzoom || source.scaleExtent[1] > z);
55438       };
55439
55440
55441       source.isLocatorOverlay = function() {
55442           return source.id === 'mapbox_locator_overlay';
55443       };
55444
55445
55446       /* hides a source from the list, but leaves it available for use */
55447       source.isHidden = function() {
55448           return source.id === 'DigitalGlobe-Premium-vintage' ||
55449               source.id === 'DigitalGlobe-Standard-vintage';
55450       };
55451
55452
55453       source.copyrightNotices = function() {};
55454
55455
55456       source.getMetadata = function(center, tileCoord, callback) {
55457           var vintage = {
55458               start: localeDateString(source.startDate),
55459               end: localeDateString(source.endDate)
55460           };
55461           vintage.range = vintageRange(vintage);
55462
55463           var metadata = { vintage: vintage };
55464           callback(null, metadata);
55465       };
55466
55467
55468       return source;
55469   }
55470
55471
55472   rendererBackgroundSource.Bing = function(data, dispatch) {
55473       // http://msdn.microsoft.com/en-us/library/ff701716.aspx
55474       // http://msdn.microsoft.com/en-us/library/ff701701.aspx
55475
55476       data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
55477
55478       var bing = rendererBackgroundSource(data),
55479           key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU', // Same as P2 and JOSM
55480           url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' +
55481               key + '&jsonp={callback}',
55482           cache = {},
55483           inflight = {},
55484           providers = [];
55485
55486       jsonpRequest(url, function(json) {
55487           providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
55488               return {
55489                   attribution: provider.attribution,
55490                   areas: provider.coverageAreas.map(function(area) {
55491                       return {
55492                           zoom: [area.zoomMin, area.zoomMax],
55493                           extent: geoExtent$$1([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
55494                       };
55495                   })
55496               };
55497           });
55498           dispatch.call('change');
55499       });
55500
55501
55502       bing.copyrightNotices = function(zoom, extent) {
55503           zoom = Math.min(zoom, 21);
55504           return providers.filter(function(provider) {
55505               return some(provider.areas, function(area) {
55506                   return extent.intersects(area.extent) &&
55507                       area.zoom[0] <= zoom &&
55508                       area.zoom[1] >= zoom;
55509               });
55510           }).map(function(provider) {
55511               return provider.attribution;
55512           }).join(', ');
55513       };
55514
55515
55516       bing.getMetadata = function(center, tileCoord, callback) {
55517           var tileId = tileCoord.slice(0, 3).join('/'),
55518               zoom = Math.min(tileCoord[2], 21),
55519               centerPoint = center[1] + ',' + center[0],  // lat,lng
55520               url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
55521                   '?zl=' + zoom + '&key=' + key + '&jsonp={callback}';
55522
55523           if (inflight[tileId]) return;
55524
55525           if (!cache[tileId]) {
55526               cache[tileId] = {};
55527           }
55528           if (cache[tileId] && cache[tileId].metadata) {
55529               return callback(null, cache[tileId].metadata);
55530           }
55531
55532           inflight[tileId] = true;
55533           jsonpRequest(url, function(result) {
55534               delete inflight[tileId];
55535
55536               var err = (!result && 'Unknown Error') || result.errorDetails;
55537               if (err) {
55538                   return callback(err);
55539               } else {
55540                   var vintage = {
55541                       start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
55542                       end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
55543                   };
55544                   vintage.range = vintageRange(vintage);
55545
55546                   var metadata = { vintage: vintage };
55547                   cache[tileId].metadata = metadata;
55548                   return callback(null, metadata);
55549               }
55550           });
55551       };
55552
55553
55554       bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
55555
55556
55557       return bing;
55558   };
55559
55560
55561
55562   rendererBackgroundSource.Esri = function(data) {
55563
55564       // don't request blank tiles, instead overzoom real tiles - #4327
55565       // deprecated technique, but it works (for now)
55566       if (data.template.match(/blankTile/) === null) {
55567           data.template = data.template + '?blankTile=false';
55568       }
55569
55570       var esri = rendererBackgroundSource(data),
55571           cache = {},
55572           inflight = {};
55573
55574       esri.getMetadata = function(center, tileCoord, callback) {
55575           var tileId = tileCoord.slice(0, 3).join('/'),
55576               zoom = Math.min(tileCoord[2], esri.scaleExtent[1]),
55577               centerPoint = center[0] + ',' + center[1],  // long, lat (as it should be)
55578               unknown = t('info_panels.background.unknown'),
55579               metadataLayer,
55580               vintage = {},
55581               metadata = {};
55582
55583           if (inflight[tileId]) return;
55584
55585           switch (true) {
55586               case (zoom >= 20 && esri.id === 'EsriWorldImageryClarity'):
55587                   metadataLayer = 4;
55588                   break;
55589               case zoom >= 19:
55590                   metadataLayer = 3;
55591                   break;
55592               case zoom >= 17:
55593                   metadataLayer = 2;
55594                   break;
55595               case zoom >= 13:
55596                   metadataLayer = 0;
55597                   break;
55598               default:
55599                   metadataLayer = 99;
55600           }
55601
55602           var url;
55603           // build up query using the layer appropriate to the current zoom
55604           if (esri.id === 'EsriWorldImagery') {
55605               url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/';
55606           } else if (esri.id === 'EsriWorldImageryClarity') {
55607               url = 'https://serviceslab.arcgisonline.com/arcgis/rest/services/Clarity_World_Imagery/MapServer/';
55608           }
55609
55610           url += metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json&callback={callback}';
55611
55612           if (!cache[tileId]) {
55613               cache[tileId] = {};
55614           }
55615           if (cache[tileId] && cache[tileId].metadata) {
55616               return callback(null, cache[tileId].metadata);
55617           }
55618
55619           // accurate metadata is only available >= 13
55620           if (metadataLayer === 99) {
55621               vintage = {
55622                   start: null,
55623                   end: null,
55624                   range: null
55625               };
55626               metadata = {
55627                   vintage: null,
55628                   source: unknown,
55629                   description: unknown,
55630                   resolution: unknown,
55631                   accuracy: unknown
55632               };
55633
55634               callback(null, metadata);
55635
55636           } else {
55637               inflight[tileId] = true;
55638               jsonpRequest(url, function(result) {
55639                   delete inflight[tileId];
55640
55641                   var err;
55642                   if (!result) {
55643                       err = 'Unknown Error';
55644                   } else if (result.features && result.features.length < 1) {
55645                       err = 'No Results';
55646                   } else if (result.error && result.error.message) {
55647                       err = result.error.message;
55648                   }
55649
55650                   if (err) {
55651                       return callback(err);
55652                   } else {
55653                       // pass through the discrete capture date from metadata
55654                       var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
55655                       vintage = {
55656                           start: captureDate,
55657                           end: captureDate,
55658                           range: captureDate
55659                       };
55660                       metadata = {
55661                           vintage: vintage,
55662                           source: clean(result.features[0].attributes.NICE_NAME),
55663                           description: clean(result.features[0].attributes.NICE_DESC),
55664                           resolution: clean(result.features[0].attributes.SRC_RES),
55665                           accuracy: clean(result.features[0].attributes.SRC_ACC)
55666                       };
55667
55668                       // append units - meters
55669                       if (isFinite(metadata.resolution)) {
55670                           metadata.resolution += ' m';
55671                       }
55672                       if (isFinite(metadata.accuracy)) {
55673                           metadata.accuracy += ' m';
55674                       }
55675
55676                       cache[tileId].metadata = metadata;
55677                       return callback(null, metadata);
55678                   }
55679               });
55680           }
55681
55682
55683           function clean(val) {
55684               return String(val).trim() || unknown;
55685           }
55686       };
55687
55688       return esri;
55689   };
55690
55691
55692   rendererBackgroundSource.None = function() {
55693       var source = rendererBackgroundSource({ id: 'none', template: '' });
55694
55695
55696       source.name = function() {
55697           return t('background.none');
55698       };
55699
55700
55701       source.imageryUsed = function() {
55702           return 'None';
55703       };
55704
55705
55706       source.area = function() {
55707           return -1;  // sources in background pane are sorted by area
55708       };
55709
55710
55711       return source;
55712   };
55713
55714
55715   rendererBackgroundSource.Custom = function(template) {
55716       var source = rendererBackgroundSource({ id: 'custom', template: template });
55717
55718
55719       source.name = function() {
55720           return t('background.custom');
55721       };
55722
55723
55724       source.imageryUsed = function() {
55725           return 'Custom (' + source.template() + ')';
55726       };
55727
55728
55729       source.area = function() {
55730           return -2;  // sources in background pane are sorted by area
55731       };
55732
55733
55734       return source;
55735   };
55736
55737   function rendererTileLayer(context) {
55738       var tileSize = 256;
55739       var transformProp = utilPrefixCSSProperty('Transform');
55740       var geotile = d3geoTile();
55741
55742       var _projection;
55743       var _cache = {};
55744       var _tileOrigin;
55745       var _zoom;
55746       var _source;
55747
55748
55749       // blacklist overlay tiles around Null Island..
55750       function nearNullIsland(x, y, z) {
55751           if (z >= 7) {
55752               var center = Math.pow(2, z - 1);
55753               var width = Math.pow(2, z - 6);
55754               var min = center - (width / 2);
55755               var max = center + (width / 2) - 1;
55756               return x >= min && x <= max && y >= min && y <= max;
55757           }
55758           return false;
55759       }
55760
55761
55762       function tileSizeAtZoom(d, z) {
55763           var EPSILON = 0.002;
55764           return ((tileSize * Math.pow(2, z - d[2])) / tileSize) + EPSILON;
55765       }
55766
55767
55768       function atZoom(t$$1, distance) {
55769           var power = Math.pow(2, distance);
55770           return [
55771               Math.floor(t$$1[0] * power),
55772               Math.floor(t$$1[1] * power),
55773               t$$1[2] + distance
55774           ];
55775       }
55776
55777
55778       function lookUp(d) {
55779           for (var up = -1; up > -d[2]; up--) {
55780               var tile = atZoom(d, up);
55781               if (_cache[_source.url(tile)] !== false) {
55782                   return tile;
55783               }
55784           }
55785       }
55786
55787
55788       function uniqueBy(a, n) {
55789           var o = [];
55790           var seen = {};
55791           for (var i = 0; i < a.length; i++) {
55792               if (seen[a[i][n]] === undefined) {
55793                   o.push(a[i]);
55794                   seen[a[i][n]] = true;
55795               }
55796           }
55797           return o;
55798       }
55799
55800
55801       function addSource(d) {
55802           d.push(_source.url(d));
55803           return d;
55804       }
55805
55806
55807       // Update tiles based on current state of `projection`.
55808       function background(selection$$1) {
55809           _zoom = geoScaleToZoom(_projection.scale(), tileSize);
55810
55811           var pixelOffset;
55812           if (_source) {
55813               pixelOffset = [
55814                   _source.offset()[0] * Math.pow(2, _zoom),
55815                   _source.offset()[1] * Math.pow(2, _zoom)
55816               ];
55817           } else {
55818               pixelOffset = [0, 0];
55819           }
55820
55821           var translate = [
55822               _projection.translate()[0] + pixelOffset[0],
55823               _projection.translate()[1] + pixelOffset[1]
55824           ];
55825
55826           geotile
55827               .scale(_projection.scale() * 2 * Math.PI)
55828               .translate(translate);
55829
55830           _tileOrigin = [
55831               _projection.scale() * Math.PI - translate[0],
55832               _projection.scale() * Math.PI - translate[1]
55833           ];
55834
55835           render(selection$$1);
55836       }
55837
55838
55839       // Derive the tiles onscreen, remove those offscreen and position them.
55840       // Important that this part not depend on `_projection` because it's
55841       // rentered when tiles load/error (see #644).
55842       function render(selection$$1) {
55843           if (!_source) return;
55844           var requests = [];
55845           var showDebug = context.getDebug('tile') && !_source.overlay;
55846
55847           if (_source.validZoom(_zoom)) {
55848               geotile().forEach(function(d) {
55849                   addSource(d);
55850                   if (d[3] === '') return;
55851                   if (typeof d[3] !== 'string') return; // Workaround for #2295
55852                   requests.push(d);
55853                   if (_cache[d[3]] === false && lookUp(d)) {
55854                       requests.push(addSource(lookUp(d)));
55855                   }
55856               });
55857
55858               requests = uniqueBy(requests, 3).filter(function(r) {
55859                   if (!!_source.overlay && nearNullIsland(r[0], r[1], r[2])) {
55860                       return false;
55861                   }
55862                   // don't re-request tiles which have failed in the past
55863                   return _cache[r[3]] !== false;
55864               });
55865           }
55866
55867
55868           function load(d) {
55869               _cache[d[3]] = true;
55870               d3_select(this)
55871                   .on('error', null)
55872                   .on('load', null)
55873                   .classed('tile-loaded', true);
55874               render(selection$$1);
55875           }
55876
55877           function error(d) {
55878               _cache[d[3]] = false;
55879               d3_select(this)
55880                   .on('error', null)
55881                   .on('load', null)
55882                   .remove();
55883               render(selection$$1);
55884           }
55885
55886           function imageTransform(d) {
55887               var ts = tileSize * Math.pow(2, _zoom - d[2]);
55888               var scale = tileSizeAtZoom(d, _zoom);
55889               return 'translate(' +
55890                   ((d[0] * ts) - _tileOrigin[0]) + 'px,' +
55891                   ((d[1] * ts) - _tileOrigin[1]) + 'px) ' +
55892                   'scale(' + scale + ',' + scale + ')';
55893           }
55894
55895           function tileCenter(d) {
55896               var ts = tileSize * Math.pow(2, _zoom - d[2]);
55897               return [
55898                   ((d[0] * ts) - _tileOrigin[0] + (ts / 2)),
55899                   ((d[1] * ts) - _tileOrigin[1] + (ts / 2))
55900               ];
55901           }
55902
55903           function debugTransform(d) {
55904               var coord = tileCenter(d);
55905               return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
55906           }
55907
55908
55909           // Pick a representative tile near the center of the viewport
55910           // (This is useful for sampling the imagery vintage)
55911           var dims = geotile.size();
55912           var mapCenter = [dims[0] / 2, dims[1] / 2];
55913           var minDist = Math.max(dims[0], dims[1]);
55914           var nearCenter;
55915
55916           requests.forEach(function(d) {
55917               var c = tileCenter(d);
55918               var dist = geoVecLength(c, mapCenter);
55919               if (dist < minDist) {
55920                   minDist = dist;
55921                   nearCenter = d;
55922               }
55923           });
55924
55925
55926           var image = selection$$1.selectAll('img')
55927               .data(requests, function(d) { return d[3]; });
55928
55929           image.exit()
55930               .style(transformProp, imageTransform)
55931               .classed('tile-removing', true)
55932               .classed('tile-center', false)
55933               .each(function() {
55934                   var tile = d3_select(this);
55935                   window.setTimeout(function() {
55936                       if (tile.classed('tile-removing')) {
55937                           tile.remove();
55938                       }
55939                   }, 300);
55940               });
55941
55942           image.enter()
55943             .append('img')
55944               .attr('class', 'tile')
55945               .attr('src', function(d) { return d[3]; })
55946               .on('error', error)
55947               .on('load', load)
55948             .merge(image)
55949               .style(transformProp, imageTransform)
55950               .classed('tile-debug', showDebug)
55951               .classed('tile-removing', false)
55952               .classed('tile-center', function(d) { return d === nearCenter; });
55953
55954
55955
55956           var debug = selection$$1.selectAll('.tile-label-debug')
55957               .data(showDebug ? requests : [], function(d) { return d[3]; });
55958
55959           debug.exit()
55960               .remove();
55961
55962           if (showDebug) {
55963               var debugEnter = debug.enter()
55964                   .append('div')
55965                   .attr('class', 'tile-label-debug');
55966
55967               debugEnter
55968                   .append('div')
55969                   .attr('class', 'tile-label-debug-coord');
55970
55971               debugEnter
55972                   .append('div')
55973                   .attr('class', 'tile-label-debug-vintage');
55974
55975               debug = debug.merge(debugEnter);
55976
55977               debug
55978                   .style(transformProp, debugTransform);
55979
55980               debug
55981                   .selectAll('.tile-label-debug-coord')
55982                   .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
55983
55984               debug
55985                   .selectAll('.tile-label-debug-vintage')
55986                   .each(function(d) {
55987                       var span = d3_select(this);
55988                       var center = context.projection.invert(tileCenter(d));
55989                       _source.getMetadata(center, d, function(err, result) {
55990                           span.text((result && result.vintage && result.vintage.range) ||
55991                               t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
55992                           );
55993                       });
55994                   });
55995           }
55996
55997       }
55998
55999
56000       background.projection = function(_) {
56001           if (!arguments.length) return _projection;
56002           _projection = _;
56003           return background;
56004       };
56005
56006
56007       background.dimensions = function(_) {
56008           if (!arguments.length) return geotile.size();
56009           geotile.size(_);
56010           return background;
56011       };
56012
56013
56014       background.source = function(_) {
56015           if (!arguments.length) return _source;
56016           _source = _;
56017           _cache = {};
56018           geotile.scaleExtent(_source.scaleExtent);
56019           return background;
56020       };
56021
56022
56023       return background;
56024   }
56025
56026   function rendererBackground(context) {
56027       var dispatch$$1 = dispatch('change');
56028       var detected = utilDetect();
56029       var baseLayer = rendererTileLayer(context).projection(context.projection);
56030       var _overlayLayers = [];
56031       var _backgroundSources = [];
56032       var _brightness = 1;
56033       var _contrast = 1;
56034       var _saturation = 1;
56035       var _sharpness = 1;
56036
56037
56038       function background(selection$$1) {
56039
56040           var baseFilter = '';
56041           if (detected.cssfilters) {
56042               if (_brightness !== 1) {
56043                   baseFilter += 'brightness(' + _brightness + ')';
56044               }
56045               if (_contrast !== 1) {
56046                   baseFilter += 'contrast(' + _contrast + ')';
56047               }
56048               if (_saturation !== 1) {
56049                   baseFilter += 'saturate(' + _saturation + ')';
56050               }
56051               if (_sharpness < 1) {  // gaussian blur
56052                   var blur = d3_interpolateNumber(0.5, 5)(1 - _sharpness);
56053                   baseFilter += 'blur(' + blur + 'px)';
56054               }
56055           }
56056
56057           var base = selection$$1.selectAll('.layer-background')
56058               .data([0]);
56059
56060           base = base.enter()
56061               .insert('div', '.layer-data')
56062               .attr('class', 'layer layer-background')
56063               .merge(base);
56064
56065           if (detected.cssfilters) {
56066               base.style('filter', baseFilter || null);
56067           } else {
56068               base.style('opacity', _brightness);
56069           }
56070
56071
56072           var imagery = base.selectAll('.layer-imagery')
56073               .data([0]);
56074
56075           imagery.enter()
56076               .append('div')
56077               .attr('class', 'layer layer-imagery')
56078               .merge(imagery)
56079               .call(baseLayer);
56080
56081
56082           var maskFilter = '';
56083           var mixBlendMode = '';
56084           if (detected.cssfilters && _sharpness > 1) {  // apply unsharp mask
56085               mixBlendMode = 'overlay';
56086               maskFilter = 'saturate(0) blur(3px) invert(1)';
56087
56088               var contrast = _sharpness - 1;
56089               maskFilter += ' contrast(' + contrast + ')';
56090
56091               var brightness = d3_interpolateNumber(1, 0.85)(_sharpness - 1);
56092               maskFilter += ' brightness(' + brightness + ')';
56093           }
56094
56095           var mask = base.selectAll('.layer-unsharp-mask')
56096               .data(detected.cssfilters && _sharpness > 1 ? [0] : []);
56097
56098           mask.exit()
56099               .remove();
56100
56101           mask.enter()
56102               .append('div')
56103               .attr('class', 'layer layer-mask layer-unsharp-mask')
56104               .merge(mask)
56105               .call(baseLayer)
56106               .style('filter', maskFilter || null)
56107               .style('mix-blend-mode', mixBlendMode || null);
56108
56109
56110           var overlays = selection$$1.selectAll('.layer-overlay')
56111               .data(_overlayLayers, function(d) { return d.source().name(); });
56112
56113           overlays.exit()
56114               .remove();
56115
56116           overlays.enter()
56117               .insert('div', '.layer-data')
56118               .attr('class', 'layer layer-overlay')
56119               .merge(overlays)
56120               .each(function(layer) { d3_select(this).call(layer); });
56121       }
56122
56123
56124       background.updateImagery = function() {
56125           if (context.inIntro()) return;
56126
56127           var b = background.baseLayerSource(),
56128               o = _overlayLayers
56129                   .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
56130                   .map(function (d) { return d.source().id; })
56131                   .join(','),
56132               meters = geoOffsetToMeters(b.offset()),
56133               epsilon = 0.01,
56134               x = +meters[0].toFixed(2),
56135               y = +meters[1].toFixed(2),
56136               q = utilStringQs(window.location.hash.substring(1));
56137
56138           var id = b.id;
56139           if (id === 'custom') {
56140               id = 'custom:' + b.template();
56141           }
56142
56143           if (id) {
56144               q.background = id;
56145           } else {
56146               delete q.background;
56147           }
56148
56149           if (o) {
56150               q.overlays = o;
56151           } else {
56152               delete q.overlays;
56153           }
56154
56155           if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
56156               q.offset = x + ',' + y;
56157           } else {
56158               delete q.offset;
56159           }
56160
56161           if (!window.mocha) {
56162               window.location.replace('#' + utilQsString(q, true));
56163           }
56164
56165           var imageryUsed = [b.imageryUsed()];
56166
56167           _overlayLayers
56168               .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
56169               .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
56170
56171           var gpx = context.layers().layer('gpx');
56172           if (gpx && gpx.enabled() && gpx.hasGpx()) {
56173               // Include a string like '.gpx data file' or '.geojson data file'
56174               var match = gpx.getSrc().match(/(kml|gpx|(?:geo)?json)$/i);
56175               var extension = match ? ('.' + match[0].toLowerCase() + ' ') : '';
56176               imageryUsed.push(extension + 'data file');
56177           }
56178
56179           var mapillary_images = context.layers().layer('mapillary-images');
56180           if (mapillary_images && mapillary_images.enabled()) {
56181               imageryUsed.push('Mapillary Images');
56182           }
56183
56184           var mapillary_signs = context.layers().layer('mapillary-signs');
56185           if (mapillary_signs && mapillary_signs.enabled()) {
56186               imageryUsed.push('Mapillary Signs');
56187           }
56188
56189           var openstreetcam_images = context.layers().layer('openstreetcam-images');
56190           if (openstreetcam_images && openstreetcam_images.enabled()) {
56191               imageryUsed.push('OpenStreetCam Images');
56192           }
56193
56194           context.history().imageryUsed(imageryUsed);
56195       };
56196
56197
56198       background.sources = function(extent) {
56199           return _backgroundSources.filter(function(source) {
56200               return source.intersects(extent);
56201           });
56202       };
56203
56204
56205       background.dimensions = function(_) {
56206           if (!_) return;
56207           baseLayer.dimensions(_);
56208
56209           _overlayLayers.forEach(function(layer) {
56210               layer.dimensions(_);
56211           });
56212       };
56213
56214
56215       background.baseLayerSource = function(d) {
56216           if (!arguments.length) return baseLayer.source();
56217
56218           // test source against OSM imagery blacklists..
56219           var osm = context.connection();
56220           if (!osm) return background;
56221
56222           var blacklists = context.connection().imageryBlacklists();
56223
56224           var template = d.template(),
56225               fail = false,
56226               tested = 0,
56227               regex, i;
56228
56229           for (i = 0; i < blacklists.length; i++) {
56230               try {
56231                   regex = new RegExp(blacklists[i]);
56232                   fail = regex.test(template);
56233                   tested++;
56234                   if (fail) break;
56235               } catch (e) {
56236                   /* noop */
56237               }
56238           }
56239
56240           // ensure at least one test was run.
56241           if (!tested) {
56242               regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
56243               fail = regex.test(template);
56244           }
56245
56246           baseLayer.source(!fail ? d : background.findSource('none'));
56247           dispatch$$1.call('change');
56248           background.updateImagery();
56249           return background;
56250       };
56251
56252
56253       background.findSource = function(id) {
56254           return find$1(_backgroundSources, function(d) {
56255               return d.id && d.id === id;
56256           });
56257       };
56258
56259
56260       background.bing = function() {
56261           background.baseLayerSource(background.findSource('Bing'));
56262       };
56263
56264
56265       background.showsLayer = function(d) {
56266           return d.id === baseLayer.source().id ||
56267               _overlayLayers.some(function(layer) { return d.id === layer.source().id; });
56268       };
56269
56270
56271       background.overlayLayerSources = function() {
56272           return _overlayLayers.map(function (l) { return l.source(); });
56273       };
56274
56275
56276       background.toggleOverlayLayer = function(d) {
56277           var layer;
56278
56279           for (var i = 0; i < _overlayLayers.length; i++) {
56280               layer = _overlayLayers[i];
56281               if (layer.source() === d) {
56282                   _overlayLayers.splice(i, 1);
56283                   dispatch$$1.call('change');
56284                   background.updateImagery();
56285                   return;
56286               }
56287           }
56288
56289           layer = rendererTileLayer(context)
56290               .source(d)
56291               .projection(context.projection)
56292               .dimensions(baseLayer.dimensions()
56293           );
56294
56295           _overlayLayers.push(layer);
56296           dispatch$$1.call('change');
56297           background.updateImagery();
56298       };
56299
56300
56301       background.nudge = function(d, zoom) {
56302           baseLayer.source().nudge(d, zoom);
56303           dispatch$$1.call('change');
56304           background.updateImagery();
56305           return background;
56306       };
56307
56308
56309       background.offset = function(d) {
56310           if (!arguments.length) return baseLayer.source().offset();
56311           baseLayer.source().offset(d);
56312           dispatch$$1.call('change');
56313           background.updateImagery();
56314           return background;
56315       };
56316
56317
56318       background.brightness = function(d) {
56319           if (!arguments.length) return _brightness;
56320           _brightness = d;
56321           if (context.mode()) dispatch$$1.call('change');
56322           return background;
56323       };
56324
56325
56326       background.contrast = function(d) {
56327           if (!arguments.length) return _contrast;
56328           _contrast = d;
56329           if (context.mode()) dispatch$$1.call('change');
56330           return background;
56331       };
56332
56333
56334       background.saturation = function(d) {
56335           if (!arguments.length) return _saturation;
56336           _saturation = d;
56337           if (context.mode()) dispatch$$1.call('change');
56338           return background;
56339       };
56340
56341
56342       background.sharpness = function(d) {
56343           if (!arguments.length) return _sharpness;
56344           _sharpness = d;
56345           if (context.mode()) dispatch$$1.call('change');
56346           return background;
56347       };
56348
56349
56350       background.init = function() {
56351           function parseMap(qmap) {
56352               if (!qmap) return false;
56353               var args = qmap.split('/').map(Number);
56354               if (args.length < 3 || args.some(isNaN)) return false;
56355               return geoExtent$$1([args[2], args[1]]);
56356           }
56357
56358           var dataImagery = data.imagery || [],
56359               q = utilStringQs(window.location.hash.substring(1)),
56360               requested = q.background || q.layer,
56361               extent = parseMap(q.map),
56362               first,
56363               best;
56364
56365           // Add all the available imagery sources
56366           _backgroundSources = dataImagery.map(function(source) {
56367               if (source.type === 'bing') {
56368                   return rendererBackgroundSource.Bing(source, dispatch$$1);
56369               } else if (/^EsriWorldImagery/.test(source.id)) {
56370                   return rendererBackgroundSource.Esri(source);
56371               } else {
56372                   return rendererBackgroundSource(source);
56373               }
56374           });
56375
56376           first = _backgroundSources.length && _backgroundSources[0];
56377
56378           // Add 'None'
56379           _backgroundSources.unshift(rendererBackgroundSource.None());
56380
56381           // Add 'Custom'
56382           var template = context.storage('background-custom-template') || '';
56383           var custom = rendererBackgroundSource.Custom(template);
56384           _backgroundSources.unshift(custom);
56385
56386
56387           // Decide which background layer to display
56388           if (!requested && extent) {
56389               best = find$1(this.sources(extent), function(s) { return s.best(); });
56390           }
56391           if (requested && requested.indexOf('custom:') === 0) {
56392               template = requested.replace(/^custom:/, '');
56393               background.baseLayerSource(custom.template(template));
56394               context.storage('background-custom-template', template);
56395           } else {
56396               background.baseLayerSource(
56397                   background.findSource(requested) ||
56398                   best ||
56399                   background.findSource(context.storage('background-last-used')) ||
56400                   background.findSource('Bing') ||
56401                   first ||
56402                   background.findSource('none')
56403               );
56404           }
56405
56406           var locator = find$1(_backgroundSources, function(d) {
56407               return d.overlay && d.default;
56408           });
56409
56410           if (locator) {
56411               background.toggleOverlayLayer(locator);
56412           }
56413
56414           var overlays = (q.overlays || '').split(',');
56415           overlays.forEach(function(overlay) {
56416               overlay = background.findSource(overlay);
56417               if (overlay) {
56418                   background.toggleOverlayLayer(overlay);
56419               }
56420           });
56421
56422           if (q.gpx) {
56423               var gpx = context.layers().layer('gpx');
56424               if (gpx) {
56425                   gpx.url(q.gpx);
56426               }
56427           }
56428
56429           if (q.offset) {
56430               var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
56431                   return !isNaN(n) && n;
56432               });
56433
56434               if (offset.length === 2) {
56435                   background.offset(geoMetersToOffset(offset));
56436               }
56437           }
56438       };
56439
56440
56441       return utilRebind(background, dispatch$$1, 'on');
56442   }
56443
56444   function rendererFeatures(context) {
56445       var traffic_roads = {
56446           'motorway': true,
56447           'motorway_link': true,
56448           'trunk': true,
56449           'trunk_link': true,
56450           'primary': true,
56451           'primary_link': true,
56452           'secondary': true,
56453           'secondary_link': true,
56454           'tertiary': true,
56455           'tertiary_link': true,
56456           'residential': true,
56457           'unclassified': true,
56458           'living_street': true
56459       };
56460
56461       var service_roads = {
56462           'service': true,
56463           'road': true,
56464           'track': true
56465       };
56466
56467       var paths = {
56468           'path': true,
56469           'footway': true,
56470           'cycleway': true,
56471           'bridleway': true,
56472           'steps': true,
56473           'pedestrian': true,
56474           'corridor': true
56475       };
56476
56477       var past_futures = {
56478           'proposed': true,
56479           'construction': true,
56480           'abandoned': true,
56481           'dismantled': true,
56482           'disused': true,
56483           'razed': true,
56484           'demolished': true,
56485           'obliterated': true
56486       };
56487
56488       var dispatch$$1 = dispatch('change', 'redraw'),
56489           _cullFactor = 1,
56490           _cache = {},
56491           _features = {},
56492           _stats = {},
56493           _keys = [],
56494           _hidden = [];
56495
56496
56497       function update() {
56498           if (!window.mocha) {
56499               var q = utilStringQs(window.location.hash.substring(1));
56500               var disabled = features.disabled();
56501               if (disabled.length) {
56502                   q.disable_features = disabled.join(',');
56503               } else {
56504                   delete q.disable_features;
56505               }
56506               window.location.replace('#' + utilQsString(q, true));
56507               context.storage('disabled-features', disabled.join(','));
56508           }
56509           _hidden = features.hidden();
56510           dispatch$$1.call('change');
56511           dispatch$$1.call('redraw');
56512       }
56513
56514
56515       function defineFeature(k, filter, max) {
56516           var isEnabled = true;
56517
56518           _keys.push(k);
56519           _features[k] = {
56520               filter: filter,
56521               enabled: isEnabled,   // whether the user wants it enabled..
56522               count: 0,
56523               currentMax: (max || Infinity),
56524               defaultMax: (max || Infinity),
56525               enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
56526               disable: function() { this.enabled = false; this.currentMax = 0; },
56527               hidden: function() { return !context.editable() || this.count > this.currentMax * _cullFactor; },
56528               autoHidden: function() { return this.hidden() && this.currentMax > 0; }
56529           };
56530       }
56531
56532
56533       defineFeature('points', function isPoint(entity, resolver, geometry) {
56534           return geometry === 'point';
56535       }, 200);
56536
56537       defineFeature('traffic_roads', function isTrafficRoad(entity) {
56538           return traffic_roads[entity.tags.highway];
56539       });
56540
56541       defineFeature('service_roads', function isServiceRoad(entity) {
56542           return service_roads[entity.tags.highway];
56543       });
56544
56545       defineFeature('paths', function isPath(entity) {
56546           return paths[entity.tags.highway];
56547       });
56548
56549       defineFeature('buildings', function isBuilding(entity) {
56550           return (
56551               !!entity.tags['building:part'] ||
56552               (!!entity.tags.building && entity.tags.building !== 'no') ||
56553               entity.tags.amenity === 'shelter' ||
56554               entity.tags.parking === 'multi-storey' ||
56555               entity.tags.parking === 'sheds' ||
56556               entity.tags.parking === 'carports' ||
56557               entity.tags.parking === 'garage_boxes'
56558           );
56559       }, 250);
56560
56561       defineFeature('landuse', function isLanduse(entity, resolver, geometry) {
56562           return geometry === 'area' &&
56563               !_features.buildings.filter(entity) &&
56564               !_features.water.filter(entity);
56565       });
56566
56567       defineFeature('boundaries', function isBoundary(entity) {
56568           return (
56569               !!entity.tags.boundary
56570           ) && !(
56571               traffic_roads[entity.tags.highway] ||
56572               service_roads[entity.tags.highway] ||
56573               paths[entity.tags.highway]
56574           );
56575       });
56576
56577       defineFeature('water', function isWater(entity) {
56578           return (
56579               !!entity.tags.waterway ||
56580               entity.tags.natural === 'water' ||
56581               entity.tags.natural === 'coastline' ||
56582               entity.tags.natural === 'bay' ||
56583               entity.tags.landuse === 'pond' ||
56584               entity.tags.landuse === 'basin' ||
56585               entity.tags.landuse === 'reservoir' ||
56586               entity.tags.landuse === 'salt_pond'
56587           );
56588       });
56589
56590       defineFeature('rail', function isRail(entity) {
56591           return (
56592               !!entity.tags.railway ||
56593               entity.tags.landuse === 'railway'
56594           ) && !(
56595               traffic_roads[entity.tags.highway] ||
56596               service_roads[entity.tags.highway] ||
56597               paths[entity.tags.highway]
56598           );
56599       });
56600
56601       defineFeature('power', function isPower(entity) {
56602           return !!entity.tags.power;
56603       });
56604
56605       // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
56606       defineFeature('past_future', function isPastFuture(entity) {
56607           if (
56608               traffic_roads[entity.tags.highway] ||
56609               service_roads[entity.tags.highway] ||
56610               paths[entity.tags.highway]
56611           ) { return false; }
56612
56613           var strings = Object.keys(entity.tags);
56614
56615           for (var i = 0; i < strings.length; i++) {
56616               var s = strings[i];
56617               if (past_futures[s] || past_futures[entity.tags[s]]) { return true; }
56618           }
56619           return false;
56620       });
56621
56622       // Lines or areas that don't match another feature filter.
56623       // IMPORTANT: The 'others' feature must be the last one defined,
56624       //   so that code in getMatches can skip this test if `hasMatch = true`
56625       defineFeature('others', function isOther(entity, resolver, geometry) {
56626           return (geometry === 'line' || geometry === 'area');
56627       });
56628
56629
56630       function features() {}
56631
56632
56633       features.features = function() {
56634           return _features;
56635       };
56636
56637
56638       features.keys = function() {
56639           return _keys;
56640       };
56641
56642
56643       features.enabled = function(k) {
56644           if (!arguments.length) {
56645               return _keys.filter(function(k) { return _features[k].enabled; });
56646           }
56647           return _features[k] && _features[k].enabled;
56648       };
56649
56650
56651       features.disabled = function(k) {
56652           if (!arguments.length) {
56653               return _keys.filter(function(k) { return !_features[k].enabled; });
56654           }
56655           return _features[k] && !_features[k].enabled;
56656       };
56657
56658
56659       features.hidden = function(k) {
56660           if (!arguments.length) {
56661               return _keys.filter(function(k) { return _features[k].hidden(); });
56662           }
56663           return _features[k] && _features[k].hidden();
56664       };
56665
56666
56667       features.autoHidden = function(k) {
56668           if (!arguments.length) {
56669               return _keys.filter(function(k) { return _features[k].autoHidden(); });
56670           }
56671           return _features[k] && _features[k].autoHidden();
56672       };
56673
56674
56675       features.enable = function(k) {
56676           if (_features[k] && !_features[k].enabled) {
56677               _features[k].enable();
56678               update();
56679           }
56680       };
56681
56682
56683       features.disable = function(k) {
56684           if (_features[k] && _features[k].enabled) {
56685               _features[k].disable();
56686               update();
56687           }
56688       };
56689
56690
56691       features.toggle = function(k) {
56692           if (_features[k]) {
56693               (function(f) { return f.enabled ? f.disable() : f.enable(); }(_features[k]));
56694               update();
56695           }
56696       };
56697
56698
56699       features.resetStats = function() {
56700           for (var i = 0; i < _keys.length; i++) {
56701               _features[_keys[i]].count = 0;
56702           }
56703           dispatch$$1.call('change');
56704       };
56705
56706
56707       features.gatherStats = function(d, resolver, dimensions) {
56708           var needsRedraw = false,
56709               type = groupBy(d, function(ent) { return ent.type; }),
56710               entities = [].concat(type.relation || [], type.way || [], type.node || []),
56711               currHidden, geometry, matches, i, j;
56712
56713           for (i = 0; i < _keys.length; i++) {
56714               _features[_keys[i]].count = 0;
56715           }
56716
56717           // adjust the threshold for point/building culling based on viewport size..
56718           // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
56719           _cullFactor = dimensions[0] * dimensions[1] / 1000000;
56720
56721           for (i = 0; i < entities.length; i++) {
56722               geometry = entities[i].geometry(resolver);
56723               if (!(geometry === 'vertex' || geometry === 'relation')) {
56724                   matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
56725                   for (j = 0; j < matches.length; j++) {
56726                       _features[matches[j]].count++;
56727                   }
56728               }
56729           }
56730
56731           currHidden = features.hidden();
56732           if (currHidden !== _hidden) {
56733               _hidden = currHidden;
56734               needsRedraw = true;
56735               dispatch$$1.call('change');
56736           }
56737
56738           return needsRedraw;
56739       };
56740
56741
56742       features.stats = function() {
56743           for (var i = 0; i < _keys.length; i++) {
56744               _stats[_keys[i]] = _features[_keys[i]].count;
56745           }
56746
56747           return _stats;
56748       };
56749
56750
56751       features.clear = function(d) {
56752           for (var i = 0; i < d.length; i++) {
56753               features.clearEntity(d[i]);
56754           }
56755       };
56756
56757
56758       features.clearEntity = function(entity) {
56759           delete _cache[osmEntity$$1.key(entity)];
56760       };
56761
56762
56763       features.reset = function() {
56764           _cache = {};
56765       };
56766
56767
56768       features.getMatches = function(entity, resolver, geometry) {
56769           if (geometry === 'vertex' || geometry === 'relation') return {};
56770
56771           var ent = osmEntity$$1.key(entity);
56772           if (!_cache[ent]) {
56773               _cache[ent] = {};
56774           }
56775
56776           if (!_cache[ent].matches) {
56777               var matches = {},
56778                   hasMatch = false;
56779
56780               for (var i = 0; i < _keys.length; i++) {
56781                   if (_keys[i] === 'others') {
56782                       if (hasMatch) continue;
56783
56784                       // Multipolygon members:
56785                       // If an entity...
56786                       //   1. is a way that hasn't matched other 'interesting' feature rules,
56787                       //   2. and it belongs to a single parent multipolygon relation
56788                       // ...then match whatever feature rules the parent multipolygon has matched.
56789                       // see #2548, #2887
56790                       //
56791                       // IMPORTANT:
56792                       // For this to work, getMatches must be called on relations before ways.
56793                       //
56794                       if (entity.type === 'way') {
56795                           var parents = features.getParents(entity, resolver, geometry);
56796                           if (parents.length === 1 && parents[0].isMultipolygon()) {
56797                               var pkey = osmEntity$$1.key(parents[0]);
56798                               if (_cache[pkey] && _cache[pkey].matches) {
56799                                   matches = clone(_cache[pkey].matches);
56800                                   continue;
56801                               }
56802                           }
56803                       }
56804                   }
56805
56806                   if (_features[_keys[i]].filter(entity, resolver, geometry)) {
56807                       matches[_keys[i]] = hasMatch = true;
56808                   }
56809               }
56810               _cache[ent].matches = matches;
56811           }
56812
56813           return _cache[ent].matches;
56814       };
56815
56816
56817       features.getParents = function(entity, resolver, geometry) {
56818           if (geometry === 'point') return [];
56819
56820           var ent = osmEntity$$1.key(entity);
56821           if (!_cache[ent]) {
56822               _cache[ent] = {};
56823           }
56824
56825           if (!_cache[ent].parents) {
56826               var parents = [];
56827               if (geometry === 'vertex') {
56828                   parents = resolver.parentWays(entity);
56829               } else {   // 'line', 'area', 'relation'
56830                   parents = resolver.parentRelations(entity);
56831               }
56832               _cache[ent].parents = parents;
56833           }
56834           return _cache[ent].parents;
56835       };
56836
56837
56838       features.isHiddenFeature = function(entity, resolver, geometry) {
56839           if (!_hidden.length) return false;
56840           if (!entity.version) return false;
56841
56842           var matches = features.getMatches(entity, resolver, geometry);
56843
56844           for (var i = 0; i < _hidden.length; i++) {
56845               if (matches[_hidden[i]]) return true;
56846           }
56847           return false;
56848       };
56849
56850
56851       features.isHiddenChild = function(entity, resolver, geometry) {
56852           if (!_hidden.length) return false;
56853           if (!entity.version || geometry === 'point') return false;
56854
56855           var parents = features.getParents(entity, resolver, geometry);
56856           if (!parents.length) return false;
56857
56858           for (var i = 0; i < parents.length; i++) {
56859               if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
56860                   return false;
56861               }
56862           }
56863           return true;
56864       };
56865
56866
56867       features.hasHiddenConnections = function(entity, resolver) {
56868           if (!_hidden.length) return false;
56869           var childNodes, connections;
56870
56871           if (entity.type === 'midpoint') {
56872               childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
56873               connections = [];
56874           } else {
56875               childNodes = entity.nodes ? resolver.childNodes(entity) : [];
56876               connections = features.getParents(entity, resolver, entity.geometry(resolver));
56877           }
56878
56879           // gather ways connected to child nodes..
56880           connections = reduce(childNodes, function(result, e) {
56881               return resolver.isShared(e) ? union(result, resolver.parentWays(e)) : result;
56882           }, connections);
56883
56884           return connections.length ? some(connections, function(e) {
56885               return features.isHidden(e, resolver, e.geometry(resolver));
56886           }) : false;
56887       };
56888
56889
56890       features.isHidden = function(entity, resolver, geometry) {
56891           if (!_hidden.length) return false;
56892           if (!entity.version) return false;
56893
56894           var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
56895           return fn(entity, resolver, geometry);
56896       };
56897
56898
56899       features.filter = function(d, resolver) {
56900           if (!_hidden.length) return d;
56901
56902           var result = [];
56903           for (var i = 0; i < d.length; i++) {
56904               var entity = d[i];
56905               if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
56906                   result.push(entity);
56907               }
56908           }
56909           return result;
56910       };
56911
56912
56913       features.init = function() {
56914           var storage = context.storage('disabled-features');
56915           if (storage) {
56916               var storageDisabled = storage.replace(/;/g, ',').split(',');
56917               storageDisabled.forEach(features.disable);
56918           }
56919
56920           var q = utilStringQs(window.location.hash.substring(1));
56921           if (q.disable_features) {
56922               var hashDisabled = q.disable_features.replace(/;/g, ',').split(',');
56923               hashDisabled.forEach(features.disable);
56924           }
56925       };
56926
56927       return utilRebind(features, dispatch$$1, 'on');
56928   }
56929
56930   function utilBindOnce(target, type, listener, capture) {
56931       var typeOnce = type + '.once';
56932       function one() {
56933           target.on(typeOnce, null);
56934           listener.apply(this, arguments);
56935       }
56936       target.on(typeOnce, one, capture);
56937       return this;
56938   }
56939
56940   // constants
56941   var TAU$1 = 2 * Math.PI;
56942   var TILESIZE = 256;
56943   var kMin = geoZoomToScale(2, TILESIZE);
56944   var kMax = geoZoomToScale(24, TILESIZE);
56945
56946
56947   function rendererMap(context) {
56948       var dispatch$$1 = dispatch('move', 'drawn');
56949       var projection = context.projection;
56950       var curtainProjection = context.curtainProjection;
56951       var drawLayers = svgLayers(projection, context);
56952       var drawPoints = svgPoints$$1(projection, context);
56953       var drawVertices = svgVertices$$1(projection, context);
56954       var drawLines = svgLines$$1(projection, context);
56955       var drawAreas = svgAreas$$1(projection, context);
56956       var drawMidpoints = svgMidpoints$$1(projection, context);
56957       var drawLabels = svgLabels(projection, context);
56958
56959       var _selection = d3_select(null);
56960       var supersurface = d3_select(null);
56961       var wrapper = d3_select(null);
56962       var surface = d3_select(null);
56963
56964       var dimensions = [1, 1];
56965       var dblclickEnabled = true;
56966       var redrawEnabled = true;
56967       var transformStart = projection.transform();
56968       var transformLast;
56969       var transformed = false;
56970       var minzoom = 0;
56971       var mouse;
56972       var mousemove;
56973
56974       var zoom$$1 = d3_zoom()
56975           .scaleExtent([kMin, kMax])
56976           .interpolate(d3_interpolate)
56977           .filter(zoomEventFilter)
56978           .on('zoom', zoomPan);
56979
56980       var scheduleRedraw = throttle(redraw, 750);
56981       // var isRedrawScheduled = false;
56982       // var pendingRedrawCall;
56983       // function scheduleRedraw() {
56984       //     // Only schedule the redraw if one has not already been set.
56985       //     if (isRedrawScheduled) return;
56986       //     isRedrawScheduled = true;
56987       //     var that = this;
56988       //     var args = arguments;
56989       //     pendingRedrawCall = window.requestIdleCallback(function () {
56990       //         // Reset the boolean so future redraws can be set.
56991       //         isRedrawScheduled = false;
56992       //         redraw.apply(that, args);
56993       //     }, { timeout: 1400 });
56994       // }
56995
56996       function cancelPendingRedraw() {
56997           scheduleRedraw.cancel();
56998           // isRedrawScheduled = false;
56999           // window.cancelIdleCallback(pendingRedrawCall);
57000       }
57001
57002
57003       function map(selection$$1) {
57004           _selection = selection$$1;
57005
57006           context
57007               .on('change.map', immediateRedraw);
57008
57009           var osm = context.connection();
57010           if (osm) {
57011               osm.on('change.map', immediateRedraw);
57012           }
57013
57014           context.history()
57015               .on('change.map', immediateRedraw)
57016               .on('undone.map redone.map', function(stack) {
57017                   var mode = context.mode().id;
57018                   if (mode !== 'browse' && mode !== 'select') return;
57019
57020                   var followSelected = false;
57021                   if (Array.isArray(stack.selectedIDs)) {
57022                       followSelected = (stack.selectedIDs.length === 1 && stack.selectedIDs[0][0] === 'n');
57023                       context.enter(
57024                           modeSelect(context, stack.selectedIDs).follow(followSelected)
57025                       );
57026                   }
57027                   if (!followSelected && stack.transform) {
57028                       map.transformEase(stack.transform);
57029                   }
57030               });
57031
57032           context.background()
57033               .on('change.map', immediateRedraw);
57034
57035           context.features()
57036               .on('redraw.map', immediateRedraw);
57037
57038           drawLayers
57039               .on('change.map', function() {
57040                   context.background().updateImagery();
57041                   immediateRedraw();
57042               });
57043
57044           selection$$1
57045               .on('dblclick.map', dblClick)
57046               .call(zoom$$1)
57047               .call(zoom$$1.transform, projection.transform());
57048
57049           supersurface = selection$$1.append('div')
57050               .attr('id', 'supersurface')
57051               .call(utilSetTransform, 0, 0);
57052
57053           // Need a wrapper div because Opera can't cope with an absolutely positioned
57054           // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
57055           wrapper = supersurface
57056               .append('div')
57057               .attr('class', 'layer layer-data');
57058
57059           map.surface = surface = wrapper
57060               .call(drawLayers)
57061               .selectAll('.surface')
57062               .attr('id', 'surface');
57063
57064           surface
57065               .call(drawLabels.observe)
57066               .on('mousedown.zoom', function() {
57067                   if (event.button === 2) {
57068                       event.stopPropagation();
57069                   }
57070               }, true)
57071               .on('mouseup.zoom', function() {
57072                   if (resetTransform()) immediateRedraw();
57073               })
57074               .on('mousemove.map', function() {
57075                   mousemove = event;
57076               })
57077               .on('mouseover.vertices', function() {
57078                   if (map.editable() && !transformed) {
57079                       var hover = event.target.__data__;
57080                       surface.selectAll('.data-layer-osm')
57081                           .call(drawVertices.drawHover, context.graph(), hover, map.extent());
57082                       dispatch$$1.call('drawn', this, { full: false });
57083                   }
57084               })
57085               .on('mouseout.vertices', function() {
57086                   if (map.editable() && !transformed) {
57087                       var hover = event.relatedTarget && event.relatedTarget.__data__;
57088                       surface.selectAll('.data-layer-osm')
57089                           .call(drawVertices.drawHover, context.graph(), hover, map.extent());
57090                       dispatch$$1.call('drawn', this, { full: false });
57091                   }
57092               });
57093
57094           supersurface
57095               .call(context.background());
57096
57097           context.on('enter.map',  function() {
57098               if (map.editable() && !transformed) {
57099
57100                   // redraw immediately any objects affected by a change in selectedIDs.
57101                   var graph = context.graph();
57102                   var selectedAndParents = {};
57103                   context.selectedIDs().forEach(function(id) {
57104                       var entity = graph.hasEntity(id);
57105                       if (entity) {
57106                           selectedAndParents[entity.id] = entity;
57107                           if (entity.type === 'node') {
57108                               graph.parentWays(entity).forEach(function(parent) {
57109                                   selectedAndParents[parent.id] = parent;
57110                               });
57111                           }
57112                       }
57113                   });
57114                   var data = values$1(selectedAndParents);
57115                   var filter = function(d) { return d.id in selectedAndParents; };
57116
57117                   data = context.features().filter(data, graph);
57118
57119                   surface.selectAll('.data-layer-osm')
57120                       .call(drawVertices.drawSelected, graph, map.extent())
57121                       .call(drawLines, graph, data, filter)
57122                       .call(drawAreas, graph, data, filter)
57123                       .call(drawMidpoints, graph, data, filter, map.trimmedExtent());
57124
57125                   dispatch$$1.call('drawn', this, { full: false });
57126
57127
57128                   // redraw everything else later
57129                   scheduleRedraw();
57130               }
57131           });
57132
57133           map.dimensions(utilGetDimensions(selection$$1));
57134       }
57135
57136
57137       function zoomEventFilter() {
57138           // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
57139           // Intercept `mousedown` and check if there is an orphaned zoom gesture.
57140           // This can happen if a previous `mousedown` occurred without a `mouseup`.
57141           // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
57142           // so that d3-zoom won't stop propagation of new `mousedown` events.
57143           if (event.type === 'mousedown') {
57144               var hasOrphan = false;
57145               var listeners = window.__on;
57146               for (var i = 0; i < listeners.length; i++) {
57147                   var listener = listeners[i];
57148                   if (listener.name === 'zoom' && listener.type === 'mouseup') {
57149                       hasOrphan = true;
57150                       break;
57151                   }
57152               }
57153               if (hasOrphan) {
57154                   var event$$1 = window.CustomEvent;
57155                   if (event$$1) {
57156                       event$$1 = new event$$1('mouseup');
57157                   } else {
57158                       event$$1 = window.document.createEvent('Event');
57159                       event$$1.initEvent('mouseup', false, false);
57160                   }
57161                   // Event needs to be dispatched with an event.view property.
57162                   event$$1.view = window;
57163                   window.dispatchEvent(event$$1);
57164               }
57165           }
57166
57167           return event.button !== 2;   // ignore right clicks
57168       }
57169
57170
57171       function pxCenter() {
57172           return [dimensions[0] / 2, dimensions[1] / 2];
57173       }
57174
57175
57176       function drawVector(difference, extent) {
57177           var mode = context.mode();
57178           var graph = context.graph();
57179           var features = context.features();
57180           var all = context.intersects(map.extent());
57181           var fullRedraw = false;
57182           var data;
57183           var filter;
57184
57185           if (difference) {
57186               var complete = difference.complete(map.extent());
57187               data = compact(values$1(complete));
57188               filter = function(d) { return d.id in complete; };
57189               features.clear(data);
57190
57191           } else {
57192               // force a full redraw if gatherStats detects that a feature
57193               // should be auto-hidden (e.g. points or buildings)..
57194               if (features.gatherStats(all, graph, dimensions)) {
57195                   extent = undefined;
57196               }
57197
57198               if (extent) {
57199                   data = context.intersects(map.extent().intersection(extent));
57200                   var set$$1 = set$2(map$3(data, 'id'));
57201                   filter = function(d) { return set$$1.has(d.id); };
57202
57203               } else {
57204                   data = all;
57205                   fullRedraw = true;
57206                   filter = utilFunctor(true);
57207               }
57208           }
57209
57210           data = features.filter(data, graph);
57211
57212           if (mode && mode.id === 'select') {
57213               // update selected vertices - the user might have just double-clicked a way,
57214               // creating a new vertex, triggering a partial redraw without a mode change
57215               surface.selectAll('.data-layer-osm')
57216                   .call(drawVertices.drawSelected, graph, map.extent());
57217           }
57218
57219           surface.selectAll('.data-layer-osm')
57220               .call(drawVertices, graph, data, filter, map.extent(), fullRedraw)
57221               .call(drawLines, graph, data, filter)
57222               .call(drawAreas, graph, data, filter)
57223               .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
57224               .call(drawLabels, graph, data, filter, dimensions, fullRedraw)
57225               .call(drawPoints, graph, data, filter);
57226
57227           dispatch$$1.call('drawn', this, {full: true});
57228       }
57229
57230
57231       function editOff() {
57232           context.features().resetStats();
57233           surface.selectAll('.layer-osm *').remove();
57234
57235           var mode = context.mode();
57236           if (mode && mode.id !== 'save') {
57237               context.enter(modeBrowse(context));
57238           }
57239
57240           dispatch$$1.call('drawn', this, {full: true});
57241       }
57242
57243
57244       function dblClick() {
57245           if (!dblclickEnabled) {
57246               event.preventDefault();
57247               event.stopImmediatePropagation();
57248           }
57249       }
57250
57251
57252       function zoomPan(manualEvent) {
57253           var event$$1 = (manualEvent || event);
57254           var source = event$$1.sourceEvent;
57255           var eventTransform = event$$1.transform;
57256
57257           if (transformStart.x === eventTransform.x &&
57258               transformStart.y === eventTransform.y &&
57259               transformStart.k === eventTransform.k) {
57260               return;  // no change
57261           }
57262
57263           // Normalize mousewheel - #3029
57264           // If wheel delta is provided in LINE units, recalculate it in PIXEL units
57265           // We are essentially redoing the calculations that occur here:
57266           //   https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
57267           // See this for more info:
57268           //   https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
57269           if (source && source.type === 'wheel' && source.deltaMode === 1 /* LINE */) {
57270               // pick sensible scroll amount if user scrolling fast or slow..
57271               var lines = Math.abs(source.deltaY);
57272               var scroll = lines > 2 ? 40 : lines * 10;
57273
57274               var t0 = transformed ? transformLast : transformStart;
57275               var p0 = mouse(source);
57276               var p1 = t0.invert(p0);
57277               var k2 = t0.k * Math.pow(2, -source.deltaY * scroll / 500);
57278               var x2 = p0[0] - p1[0] * k2;
57279               var y2 = p0[1] - p1[1] * k2;
57280
57281               eventTransform = identity$7.translate(x2,y2).scale(k2);
57282               _selection.node().__zoom = eventTransform;
57283           }
57284
57285           if (geoScaleToZoom(eventTransform.k, TILESIZE) < minzoom) {
57286               surface.interrupt();
57287               uiFlash().text(t('cannot_zoom'))();
57288               setZoom(context.minEditableZoom(), true);
57289               scheduleRedraw();
57290               dispatch$$1.call('move', this, map);
57291               return;
57292           }
57293
57294           projection.transform(eventTransform);
57295
57296           var scale = eventTransform.k / transformStart.k;
57297           var tX = (eventTransform.x / scale - transformStart.x) * scale;
57298           var tY = (eventTransform.y / scale - transformStart.y) * scale;
57299
57300           if (context.inIntro()) {
57301               curtainProjection.transform({
57302                   x: eventTransform.x - tX,
57303                   y: eventTransform.y - tY,
57304                   k: eventTransform.k
57305               });
57306           }
57307
57308           if (source) mousemove = event$$1;
57309           transformed = true;
57310           transformLast = eventTransform;
57311           utilSetTransform(supersurface, tX, tY, scale);
57312           scheduleRedraw();
57313
57314           dispatch$$1.call('move', this, map);
57315       }
57316
57317
57318       function resetTransform() {
57319           if (!transformed) return false;
57320
57321           // deprecation warning - Radial Menu to be removed in iD v3
57322           surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
57323           utilSetTransform(supersurface, 0, 0);
57324           transformed = false;
57325           if (context.inIntro()) {
57326               curtainProjection.transform(projection.transform());
57327           }
57328           return true;
57329       }
57330
57331
57332       function redraw(difference, extent) {
57333           if (surface.empty() || !redrawEnabled) return;
57334
57335           // If we are in the middle of a zoom/pan, we can't do differenced redraws.
57336           // It would result in artifacts where differenced entities are redrawn with
57337           // one transform and unchanged entities with another.
57338           if (resetTransform()) {
57339               difference = extent = undefined;
57340           }
57341
57342           var z = String(~~map.zoom());
57343           if (surface.attr('data-zoom') !== z) {
57344               surface.attr('data-zoom', z)
57345                   .classed('low-zoom', z <= 16);
57346           }
57347
57348           if (!difference) {
57349               supersurface.call(context.background());
57350           }
57351
57352           wrapper
57353               .call(drawLayers);
57354
57355           // OSM
57356           if (map.editable()) {
57357               context.loadTiles(projection, dimensions);
57358               drawVector(difference, extent);
57359           } else {
57360               editOff();
57361           }
57362
57363           transformStart = projection.transform();
57364
57365           return map;
57366       }
57367
57368
57369
57370       var immediateRedraw = function(difference, extent) {
57371           if (!difference && !extent) cancelPendingRedraw();
57372           redraw(difference, extent);
57373       };
57374
57375
57376       map.mouse = function() {
57377           var event$$1 = mousemove || event;
57378           if (event$$1) {
57379               var s;
57380               while ((s = event$$1.sourceEvent)) { event$$1 = s; }
57381               return mouse(event$$1);
57382           }
57383           return null;
57384       };
57385
57386
57387       // returns Lng/Lat
57388       map.mouseCoordinates = function() {
57389           var coord = map.mouse() || pxCenter();
57390           return projection.invert(coord);
57391       };
57392
57393
57394       map.dblclickEnable = function(_) {
57395           if (!arguments.length) return dblclickEnabled;
57396           dblclickEnabled = _;
57397           return map;
57398       };
57399
57400
57401       map.redrawEnable = function(_) {
57402           if (!arguments.length) return redrawEnabled;
57403           redrawEnabled = _;
57404           return map;
57405       };
57406
57407
57408       function setTransform(t2, duration, force) {
57409           var t$$1 = projection.transform();
57410           if (!force && t2.k === t$$1.k && t2.x === t$$1.x && t2.y === t$$1.y) {
57411               return false;
57412           }
57413
57414           if (duration) {
57415               _selection
57416                   .transition()
57417                   .duration(duration)
57418                   .on('start', function() { map.startEase(); })
57419                   .call(zoom$$1.transform, identity$7.translate(t2.x, t2.y).scale(t2.k));
57420           } else {
57421               projection.transform(t2);
57422               transformStart = t2;
57423               _selection.call(zoom$$1.transform, transformStart);
57424           }
57425       }
57426
57427
57428       function setZoom(z2, force, duration) {
57429           if (z2 === map.zoom() && !force) {
57430               return false;
57431           }
57432
57433           var k = projection.scale();
57434           var k2 = Math.max(kMin, Math.min(kMax, geoZoomToScale(z2, TILESIZE)));
57435           var center = pxCenter();
57436           var l = pointLocation(center);
57437
57438           projection.scale(k2);
57439
57440           var t$$1 = projection.translate();
57441           l = locationPoint(l);
57442
57443           t$$1[0] += center[0] - l[0];
57444           t$$1[1] += center[1] - l[1];
57445
57446           if (duration) {
57447               projection.scale(k);  // reset scale
57448               _selection
57449                   .transition()
57450                   .duration(duration)
57451                   .on('start', function() { map.startEase(); })
57452                   .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k2));
57453           } else {
57454               projection.translate(t$$1);
57455               transformStart = projection.transform();
57456               _selection.call(zoom$$1.transform, transformStart);
57457           }
57458
57459           return true;
57460
57461
57462           function locationPoint(l) {
57463               var translate = projection.translate();
57464               var scale = projection.scale() * TAU$1;
57465               return [l[0] * scale + translate[0], l[1] * scale + translate[1]];
57466           }
57467
57468           function pointLocation(p) {
57469               var translate = projection.translate();
57470               var scale = projection.scale() * TAU$1;
57471               return [(p[0] - translate[0]) / scale, (p[1] - translate[1]) / scale];
57472           }
57473       }
57474
57475
57476       function setCenter(loc2, duration) {
57477           var c = map.center();
57478           if (loc2[0] === c[0] && loc2[1] === c[1]) {
57479               return false;
57480           }
57481
57482           var t$$1 = projection.translate();
57483           var k = projection.scale();
57484           var pxC = pxCenter();
57485           var ll = projection(loc2);
57486
57487           t$$1[0] = t$$1[0] - ll[0] + pxC[0];
57488           t$$1[1] = t$$1[1] - ll[1] + pxC[1];
57489
57490           if (duration) {
57491               _selection
57492                   .transition()
57493                   .duration(duration)
57494                   .on('start', function() { map.startEase(); })
57495                   .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
57496           } else {
57497               projection.translate(t$$1);
57498               transformStart = projection.transform();
57499               _selection.call(zoom$$1.transform, transformStart);
57500           }
57501
57502           return true;
57503       }
57504
57505
57506       map.pan = function(delta, duration) {
57507           var t$$1 = projection.translate();
57508           var k = projection.scale();
57509
57510           t$$1[0] += delta[0];
57511           t$$1[1] += delta[1];
57512
57513           if (duration) {
57514               _selection
57515                   .transition()
57516                   .duration(duration)
57517                   .on('start', function() { map.startEase(); })
57518                   .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
57519           } else {
57520               projection.translate(t$$1);
57521               transformStart = projection.transform();
57522               _selection.call(zoom$$1.transform, transformStart);
57523               dispatch$$1.call('move', this, map);
57524               immediateRedraw();
57525           }
57526
57527           return map;
57528       };
57529
57530
57531       map.dimensions = function(_) {
57532           if (!arguments.length) return dimensions;
57533           var center = map.center();
57534           dimensions = _;
57535           drawLayers.dimensions(dimensions);
57536           context.background().dimensions(dimensions);
57537           projection.clipExtent([[0, 0], dimensions]);
57538           mouse = utilFastMouse(supersurface.node());
57539           setCenter(center);
57540
57541           scheduleRedraw();
57542           return map;
57543       };
57544
57545
57546       function zoomIn(delta) {
57547           setZoom(~~map.zoom() + delta, true, 250);
57548       }
57549
57550       function zoomOut(delta) {
57551           setZoom(~~map.zoom() - delta, true, 250);
57552       }
57553
57554       map.zoomIn = function() { zoomIn(1); };
57555       map.zoomInFurther = function() { zoomIn(4); };
57556
57557       map.zoomOut = function() { zoomOut(1); };
57558       map.zoomOutFurther = function() { zoomOut(4); };
57559
57560
57561       map.center = function(loc2) {
57562           if (!arguments.length) {
57563               return projection.invert(pxCenter());
57564           }
57565
57566           if (setCenter(loc2)) {
57567               dispatch$$1.call('move', this, map);
57568           }
57569
57570           scheduleRedraw();
57571           return map;
57572       };
57573
57574
57575       map.zoom = function(z2) {
57576           if (!arguments.length) {
57577               return Math.max(geoScaleToZoom(projection.scale(), TILESIZE), 0);
57578           }
57579
57580           if (z2 < minzoom) {
57581               surface.interrupt();
57582               uiFlash().text(t('cannot_zoom'))();
57583               z2 = context.minEditableZoom();
57584           }
57585
57586           if (setZoom(z2)) {
57587               dispatch$$1.call('move', this, map);
57588           }
57589
57590           scheduleRedraw();
57591           return map;
57592       };
57593
57594
57595       map.zoomTo = function(entity, zoomLimits) {
57596           var extent = entity.extent(context.graph());
57597           if (!isFinite(extent.area())) return;
57598
57599           var z2 = map.trimmedExtentZoom(extent);
57600           zoomLimits = zoomLimits || [context.minEditableZoom(), 24];
57601           map.centerZoom(extent.center(), Math.min(Math.max(z2, zoomLimits[0]), zoomLimits[1]));
57602       };
57603
57604
57605       map.centerZoom = function(loc2, z2) {
57606           var centered = setCenter(loc2);
57607           var zoomed   = setZoom(z2);
57608
57609           if (centered || zoomed) {
57610               dispatch$$1.call('move', this, map);
57611           }
57612
57613           scheduleRedraw();
57614           return map;
57615       };
57616
57617
57618       map.centerEase = function(loc2, duration) {
57619           duration = duration || 250;
57620           setCenter(loc2, duration);
57621           return map;
57622       };
57623
57624
57625       map.zoomEase = function(z2, duration) {
57626           duration = duration || 250;
57627           setZoom(z2, false, duration);
57628           return map;
57629       };
57630
57631
57632       map.transformEase = function(t2, duration) {
57633           duration = duration || 250;
57634           setTransform(t2, duration, false);
57635           return map;
57636       };
57637
57638
57639       map.startEase = function() {
57640           utilBindOnce(surface, 'mousedown.ease', function() {
57641               map.cancelEase();
57642           });
57643           return map;
57644       };
57645
57646
57647       map.cancelEase = function() {
57648           _selection.interrupt();
57649           return map;
57650       };
57651
57652
57653       map.extent = function(_) {
57654           if (!arguments.length) {
57655               return new geoExtent$$1(
57656                   projection.invert([0, dimensions[1]]),
57657                   projection.invert([dimensions[0], 0])
57658               );
57659           } else {
57660               var extent = geoExtent$$1(_);
57661               map.centerZoom(extent.center(), map.extentZoom(extent));
57662           }
57663       };
57664
57665
57666       map.trimmedExtent = function(_) {
57667           if (!arguments.length) {
57668               var headerY = 60;
57669               var footerY = 30;
57670               var pad = 10;
57671               return new geoExtent$$1(
57672                   projection.invert([pad, dimensions[1] - footerY - pad]),
57673                   projection.invert([dimensions[0] - pad, headerY + pad])
57674               );
57675           } else {
57676               var extent = geoExtent$$1(_);
57677               map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
57678           }
57679       };
57680
57681
57682       function calcZoom(extent, dim) {
57683           var tl = projection([extent[0][0], extent[1][1]]);
57684           var br = projection([extent[1][0], extent[0][1]]);
57685
57686           // Calculate maximum zoom that fits extent
57687           var hFactor = (br[0] - tl[0]) / dim[0];
57688           var vFactor = (br[1] - tl[1]) / dim[1];
57689           var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
57690           var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
57691           var newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
57692
57693           return newZoom;
57694       }
57695
57696
57697       map.extentZoom = function(_) {
57698           return calcZoom(geoExtent$$1(_), dimensions);
57699       };
57700
57701
57702       map.trimmedExtentZoom = function(_) {
57703           var trimY = 120;
57704           var trimX = 40;
57705           var trimmed = [dimensions[0] - trimX, dimensions[1] - trimY];
57706           return calcZoom(geoExtent$$1(_), trimmed);
57707       };
57708
57709
57710       map.editable = function() {
57711           var osmLayer = surface.selectAll('.data-layer-osm');
57712           if (!osmLayer.empty() && osmLayer.classed('disabled')) return false;
57713
57714           return map.zoom() >= context.minEditableZoom();
57715       };
57716
57717
57718       map.minzoom = function(_) {
57719           if (!arguments.length) return minzoom;
57720           minzoom = _;
57721           return map;
57722       };
57723
57724
57725       map.layers = drawLayers;
57726
57727
57728       return utilRebind(map, dispatch$$1, 'on');
57729   }
57730
57731   function uiMapInMap(context) {
57732
57733       function map_in_map(selection$$1) {
57734           var backgroundLayer = rendererTileLayer(context);
57735           var overlayLayers = {};
57736           var projection$$1 = geoRawMercator();
57737           var gpxLayer = svgGpx$$1(projection$$1, context).showLabels(false);
57738           var debugLayer = svgDebug$$1(projection$$1, context);
57739           var zoom$$1 = d3_zoom()
57740               .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)])
57741               .on('start', zoomStarted)
57742               .on('zoom', zoomed)
57743               .on('end', zoomEnded);
57744           var isTransformed = false;
57745           var isHidden = true;
57746           var skipEvents = false;
57747           var gesture = null;
57748           var zDiff = 6;    // by default, minimap renders at (main zoom - 6)
57749           var wrap = d3_select(null);
57750           var tiles = d3_select(null);
57751           var viewport = d3_select(null);
57752           var tStart;    // transform at start of gesture
57753           var tCurr;     // transform at most recent event
57754           var timeoutId;
57755
57756
57757           function zoomStarted() {
57758               if (skipEvents) return;
57759               tStart = tCurr = projection$$1.transform();
57760               gesture = null;
57761           }
57762
57763
57764           function zoomed() {
57765               if (skipEvents) return;
57766
57767               var x = event.transform.x;
57768               var y = event.transform.y;
57769               var k = event.transform.k;
57770               var isZooming = (k !== tStart.k);
57771               var isPanning = (x !== tStart.x || y !== tStart.y);
57772
57773               if (!isZooming && !isPanning) {
57774                   return;  // no change
57775               }
57776
57777               // lock in either zooming or panning, don't allow both in minimap.
57778               if (!gesture) {
57779                   gesture = isZooming ? 'zoom' : 'pan';
57780               }
57781
57782               var tMini = projection$$1.transform();
57783               var tX, tY, scale;
57784
57785               if (gesture === 'zoom') {
57786                   var dMini = utilGetDimensions(wrap);
57787                   var cMini = geoVecScale(dMini, 0.5);
57788                   scale = k / tMini.k;
57789                   tX = (cMini[0] / scale - cMini[0]) * scale;
57790                   tY = (cMini[1] / scale - cMini[1]) * scale;
57791               } else {
57792                   k = tMini.k;
57793                   scale = 1;
57794                   tX = x - tMini.x;
57795                   tY = y - tMini.y;
57796               }
57797
57798               utilSetTransform(tiles, tX, tY, scale);
57799               utilSetTransform(viewport, 0, 0, scale);
57800               isTransformed = true;
57801               tCurr = identity$7.translate(x, y).scale(k);
57802
57803               var zMain = geoScaleToZoom(context.projection.scale());
57804               var zMini = geoScaleToZoom(k);
57805
57806               zDiff = zMain - zMini;
57807
57808               queueRedraw();
57809           }
57810
57811
57812           function zoomEnded() {
57813               if (skipEvents) return;
57814               if (gesture !== 'pan') return;
57815
57816               updateProjection();
57817               gesture = null;
57818               var dMini = utilGetDimensions(wrap);
57819               var cMini = geoVecScale(dMini, 0.5);
57820               context.map().center(projection$$1.invert(cMini));   // recenter main map..
57821           }
57822
57823
57824           function updateProjection() {
57825               var loc = context.map().center();
57826               var dMini = utilGetDimensions(wrap);
57827               var cMini = geoVecScale(dMini, 0.5);
57828               var tMain = context.projection.transform();
57829               var zMain = geoScaleToZoom(tMain.k);
57830               var zMini = Math.max(zMain - zDiff, 0.5);
57831               var kMini = geoZoomToScale(zMini);
57832
57833               projection$$1
57834                   .translate([tMain.x, tMain.y])
57835                   .scale(kMini);
57836
57837               var point$$1 = projection$$1(loc);
57838               var mouse = (gesture === 'pan') ? geoVecSubtract([tCurr.x, tCurr.y], [tStart.x, tStart.y]) : [0, 0];
57839               var xMini = cMini[0] - point$$1[0] + tMain.x + mouse[0];
57840               var yMini = cMini[1] - point$$1[1] + tMain.y + mouse[1];
57841
57842               projection$$1
57843                   .translate([xMini, yMini])
57844                   .clipExtent([[0, 0], dMini]);
57845
57846               tCurr = projection$$1.transform();
57847
57848               if (isTransformed) {
57849                   utilSetTransform(tiles, 0, 0);
57850                   utilSetTransform(viewport, 0, 0);
57851                   isTransformed = false;
57852               }
57853
57854               zoom$$1
57855                   .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
57856
57857               skipEvents = true;
57858               wrap.call(zoom$$1.transform, tCurr);
57859               skipEvents = false;
57860           }
57861
57862
57863           function redraw() {
57864               clearTimeout(timeoutId);
57865               if (isHidden) return;
57866
57867               updateProjection();
57868
57869               var dMini = utilGetDimensions(wrap);
57870               var zMini = geoScaleToZoom(projection$$1.scale());
57871
57872               // setup tile container
57873               tiles = wrap
57874                   .selectAll('.map-in-map-tiles')
57875                   .data([0]);
57876
57877               tiles = tiles.enter()
57878                   .append('div')
57879                   .attr('class', 'map-in-map-tiles')
57880                   .merge(tiles);
57881
57882               // redraw background
57883               backgroundLayer
57884                   .source(context.background().baseLayerSource())
57885                   .projection(projection$$1)
57886                   .dimensions(dMini);
57887
57888               var background = tiles
57889                   .selectAll('.map-in-map-background')
57890                   .data([0]);
57891
57892               background.enter()
57893                   .append('div')
57894                   .attr('class', 'map-in-map-background')
57895                   .merge(background)
57896                   .call(backgroundLayer);
57897
57898
57899               // redraw overlay
57900               var overlaySources = context.background().overlayLayerSources();
57901               var activeOverlayLayers = [];
57902               for (var i = 0; i < overlaySources.length; i++) {
57903                   if (overlaySources[i].validZoom(zMini)) {
57904                       if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
57905                       activeOverlayLayers.push(overlayLayers[i]
57906                           .source(overlaySources[i])
57907                           .projection(projection$$1)
57908                           .dimensions(dMini));
57909                   }
57910               }
57911
57912               var overlay = tiles
57913                   .selectAll('.map-in-map-overlay')
57914                   .data([0]);
57915
57916               overlay = overlay.enter()
57917                   .append('div')
57918                   .attr('class', 'map-in-map-overlay')
57919                   .merge(overlay);
57920
57921
57922               var overlays = overlay
57923                   .selectAll('div')
57924                   .data(activeOverlayLayers, function(d) { return d.source().name(); });
57925
57926               overlays.exit()
57927                   .remove();
57928
57929               overlays = overlays.enter()
57930                   .append('div')
57931                   .merge(overlays)
57932                   .each(function(layer) { d3_select(this).call(layer); });
57933
57934
57935               var dataLayers = tiles
57936                   .selectAll('.map-in-map-data')
57937                   .data([0]);
57938
57939               dataLayers.exit()
57940                   .remove();
57941
57942               dataLayers = dataLayers.enter()
57943                   .append('svg')
57944                   .attr('class', 'map-in-map-data')
57945                   .merge(dataLayers)
57946                   .call(gpxLayer)
57947                   .call(debugLayer);
57948
57949
57950               // redraw viewport bounding box
57951               if (gesture !== 'pan') {
57952                   var getPath = d3_geoPath(projection$$1);
57953                   var bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
57954
57955                   viewport = wrap.selectAll('.map-in-map-viewport')
57956                       .data([0]);
57957
57958                   viewport = viewport.enter()
57959                       .append('svg')
57960                       .attr('class', 'map-in-map-viewport')
57961                       .merge(viewport);
57962
57963
57964                   var path = viewport.selectAll('.map-in-map-bbox')
57965                       .data([bbox]);
57966
57967                   path.enter()
57968                       .append('path')
57969                       .attr('class', 'map-in-map-bbox')
57970                       .merge(path)
57971                       .attr('d', getPath)
57972                       .classed('thick', function(d) { return getPath.area(d) < 30; });
57973               }
57974           }
57975
57976
57977           function queueRedraw() {
57978               clearTimeout(timeoutId);
57979               timeoutId = setTimeout(function() { redraw(); }, 750);
57980           }
57981
57982
57983           function toggle() {
57984               if (event) event.preventDefault();
57985
57986               isHidden = !isHidden;
57987
57988               d3_select('.minimap-toggle-item')
57989                   .classed('active', !isHidden)
57990                   .select('input')
57991                   .property('checked', !isHidden);
57992
57993               if (isHidden) {
57994                   wrap
57995                       .style('display', 'block')
57996                       .style('opacity', '1')
57997                       .transition()
57998                       .duration(200)
57999                       .style('opacity', '0')
58000                       .on('end', function() {
58001                           selection$$1.selectAll('.map-in-map')
58002                               .style('display', 'none');
58003                       });
58004               } else {
58005                   wrap
58006                       .style('display', 'block')
58007                       .style('opacity', '0')
58008                       .transition()
58009                       .duration(200)
58010                       .style('opacity', '1')
58011                       .on('end', function() {
58012                           redraw();
58013                       });
58014               }
58015           }
58016
58017
58018           uiMapInMap.toggle = toggle;
58019
58020           wrap = selection$$1.selectAll('.map-in-map')
58021               .data([0]);
58022
58023           wrap = wrap.enter()
58024               .append('div')
58025               .attr('class', 'map-in-map')
58026               .style('display', (isHidden ? 'none' : 'block'))
58027               .call(zoom$$1)
58028               .on('dblclick.zoom', null)
58029               .merge(wrap);
58030
58031           context.map()
58032               .on('drawn.map-in-map', function(drawn) {
58033                   if (drawn.full === true) {
58034                       redraw();
58035                   }
58036               });
58037
58038           redraw();
58039
58040           var keybinding = d3keybinding('map-in-map')
58041               .on(t('background.minimap.key'), toggle);
58042
58043           d3_select(document)
58044               .call(keybinding);
58045       }
58046
58047       return map_in_map;
58048   }
58049
58050   function uiBackground(context) {
58051       var key = t('background.key');
58052
58053       var _customSource = context.background().findSource('custom');
58054       var _previousBackground = context.background().findSource(context.storage('background-last-used-toggle'));
58055       var _shown = false;
58056
58057       var _backgroundList = d3_select(null);
58058       var _overlayList = d3_select(null);
58059       var _displayOptionsContainer = d3_select(null);
58060       var _offsetContainer = d3_select(null);
58061
58062       var backgroundDisplayOptions = uiBackgroundDisplayOptions(context);
58063       var backgroundOffset = uiBackgroundOffset(context);
58064
58065
58066       function setTooltips(selection$$1) {
58067           selection$$1.each(function(d, i, nodes) {
58068               var item = d3_select(this).select('label');
58069               var span = item.select('span');
58070               var placement = (i < nodes.length / 2) ? 'bottom' : 'top';
58071               var description = d.description();
58072               var isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
58073
58074               if (d === _previousBackground) {
58075                   item.call(tooltip()
58076                       .placement(placement)
58077                       .html(true)
58078                       .title(function() {
58079                           var tip = '<div>' + t('background.switch') + '</div>';
58080                           return uiTooltipHtml(tip, uiCmd('⌘' + key));
58081                       })
58082                   );
58083               } else if (description || isOverflowing) {
58084                   item.call(tooltip()
58085                       .placement(placement)
58086                       .title(description || d.name())
58087                   );
58088               } else {
58089                   item.call(tooltip().destroy);
58090               }
58091           });
58092       }
58093
58094
58095       function updateLayerSelections(selection$$1) {
58096           function active(d) {
58097               return context.background().showsLayer(d);
58098           }
58099
58100           selection$$1.selectAll('.layer')
58101               .classed('active', active)
58102               .classed('switch', function(d) { return d === _previousBackground; })
58103               .call(setTooltips)
58104               .selectAll('input')
58105               .property('checked', active);
58106       }
58107
58108
58109       function chooseBackground(d) {
58110           if (d.id === 'custom' && !d.template()) {
58111               return editCustom();
58112           }
58113
58114           event.preventDefault();
58115           _previousBackground = context.background().baseLayerSource();
58116           context.storage('background-last-used-toggle', _previousBackground.id);
58117           context.storage('background-last-used', d.id);
58118           context.background().baseLayerSource(d);
58119           _backgroundList.call(updateLayerSelections);
58120           document.activeElement.blur();
58121       }
58122
58123
58124       function editCustom() {
58125           event.preventDefault();
58126           var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
58127           var template = window.prompt(
58128               t('background.custom_prompt', { example: example }),
58129               _customSource.template() || example
58130           );
58131
58132           if (template) {
58133               context.storage('background-custom-template', template);
58134               _customSource.template(template);
58135               chooseBackground(_customSource);
58136           } else {
58137               _backgroundList.call(updateLayerSelections);
58138           }
58139       }
58140
58141
58142       function chooseOverlay(d) {
58143           event.preventDefault();
58144           context.background().toggleOverlayLayer(d);
58145           _overlayList.call(updateLayerSelections);
58146           document.activeElement.blur();
58147       }
58148
58149
58150       function drawListItems(layerList, type, change, filter) {
58151           var sources = context.background()
58152               .sources(context.map().extent())
58153               .filter(filter);
58154
58155           var layerLinks = layerList.selectAll('li.layer')
58156               .data(sources, function(d) { return d.name(); });
58157
58158           layerLinks.exit()
58159               .remove();
58160
58161           var enter = layerLinks.enter()
58162               .append('li')
58163               .attr('class', 'layer')
58164               .classed('layer-custom', function(d) { return d.id === 'custom'; })
58165               .classed('best', function(d) { return d.best(); });
58166
58167           enter.filter(function(d) { return d.id === 'custom'; })
58168               .append('button')
58169               .attr('class', 'layer-browse')
58170               .call(tooltip()
58171                   .title(t('background.custom_button'))
58172                   .placement((textDirection === 'rtl') ? 'right' : 'left')
58173               )
58174               .on('click', editCustom)
58175               .call(svgIcon('#icon-edit'));
58176
58177           enter.filter(function(d) { return d.best(); })
58178               .append('div')
58179               .attr('class', 'best')
58180               .call(tooltip()
58181                   .title(t('background.best_imagery'))
58182                   .placement((textDirection === 'rtl') ? 'right' : 'left')
58183               )
58184               .append('span')
58185               .html('&#9733;');
58186
58187           var label = enter
58188               .append('label');
58189
58190           label
58191               .append('input')
58192               .attr('type', type)
58193               .attr('name', 'layers')
58194               .on('change', change);
58195
58196           label
58197               .append('span')
58198               .text(function(d) { return d.name(); });
58199
58200
58201           layerList.selectAll('li.layer')
58202               .sort(sortSources)
58203               .style('display', layerList.selectAll('li.layer').data().length > 0 ? 'block' : 'none');
58204
58205           layerList
58206               .call(updateLayerSelections);
58207
58208
58209           function sortSources(a, b) {
58210               return a.best() && !b.best() ? -1
58211                   : b.best() && !a.best() ? 1
58212                   : d3_descending(a.area(), b.area()) || d3_ascending(a.name(), b.name()) || 0;
58213           }
58214       }
58215
58216
58217       function renderBackgroundList(selection$$1) {
58218
58219           // the background list
58220           var container = selection$$1.selectAll('.layer-background-list')
58221               .data([0]);
58222
58223           _backgroundList = container.enter()
58224               .append('ul')
58225               .attr('class', 'layer-list layer-background-list')
58226               .attr('dir', 'auto')
58227               .merge(container);
58228
58229
58230           // add minimap toggle below list
58231           var minimapEnter = selection$$1.selectAll('.minimap-toggle-list')
58232               .data([0])
58233               .enter()
58234               .append('ul')
58235               .attr('class', 'layer-list minimap-toggle-list')
58236               .append('li')
58237               .attr('class', 'layer minimap-toggle-item');
58238
58239           var minimapLabelEnter = minimapEnter
58240               .append('label')
58241               .call(tooltip()
58242                   .html(true)
58243                   .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
58244                   .placement('top')
58245               );
58246
58247           minimapLabelEnter
58248               .append('input')
58249               .attr('type', 'checkbox')
58250               .on('change', function() {
58251                   event.preventDefault();
58252                   uiMapInMap.toggle();
58253               });
58254
58255           minimapLabelEnter
58256               .append('span')
58257               .text(t('background.minimap.description'));
58258
58259
58260           // "Info / Report a Problem" link
58261           selection$$1.selectAll('.imagery-faq')
58262               .data([0])
58263               .enter()
58264               .append('div')
58265               .attr('class', 'imagery-faq')
58266               .append('a')
58267               .attr('target', '_blank')
58268               .attr('tabindex', -1)
58269               .call(svgIcon('#icon-out-link', 'inline'))
58270               .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
58271               .append('span')
58272               .text(t('background.imagery_source_faq'));
58273       }
58274
58275
58276       function renderOverlayList(selection$$1) {
58277           var container = selection$$1.selectAll('.layer-overlay-list')
58278               .data([0]);
58279
58280           _overlayList = container.enter()
58281               .append('ul')
58282               .attr('class', 'layer-list layer-overlay-list')
58283               .attr('dir', 'auto')
58284               .merge(container);
58285       }
58286
58287
58288       function update() {
58289           _backgroundList
58290               .call(drawListItems, 'radio', chooseBackground, function(d) { return !d.isHidden() && !d.overlay; });
58291
58292           _overlayList
58293               .call(drawListItems, 'checkbox', chooseOverlay, function(d) { return !d.isHidden() && d.overlay; });
58294
58295           _displayOptionsContainer
58296               .call(backgroundDisplayOptions);
58297
58298           _offsetContainer
58299               .call(backgroundOffset);
58300       }
58301
58302
58303       function quickSwitch() {
58304           if (event) {
58305               event.stopImmediatePropagation();
58306               event.preventDefault();
58307           }
58308           if (_previousBackground) {
58309               chooseBackground(_previousBackground);
58310           }
58311       }
58312
58313
58314       function background(selection$$1) {
58315
58316           function hidePane() {
58317               setVisible(false);
58318           }
58319
58320           function togglePane() {
58321               if (event) event.preventDefault();
58322               paneTooltip.hide(button);
58323               setVisible(!button.classed('active'));
58324           }
58325
58326           function setVisible(show) {
58327               if (show !== _shown) {
58328                   button.classed('active', show);
58329                   _shown = show;
58330
58331                   if (show) {
58332                       uiMapData.hidePane();
58333                       uiHelp.hidePane();
58334                       update();
58335
58336                       pane
58337                           .style('display', 'block')
58338                           .style('right', '-300px')
58339                           .transition()
58340                           .duration(200)
58341                           .style('right', '0px');
58342
58343                   } else {
58344                       pane
58345                           .style('display', 'block')
58346                           .style('right', '0px')
58347                           .transition()
58348                           .duration(200)
58349                           .style('right', '-300px')
58350                           .on('end', function() {
58351                               d3_select(this).style('display', 'none');
58352                           });
58353                   }
58354               }
58355           }
58356
58357
58358           var pane = selection$$1
58359               .append('div')
58360               .attr('class', 'fillL map-pane col4 hide');
58361
58362           var paneTooltip = tooltip()
58363               .placement((textDirection === 'rtl') ? 'right' : 'left')
58364               .html(true)
58365               .title(uiTooltipHtml(t('background.description'), key));
58366
58367           var button = selection$$1
58368               .append('button')
58369               .attr('tabindex', -1)
58370               .on('click', togglePane)
58371               .call(svgIcon('#icon-layers', 'light'))
58372               .call(paneTooltip);
58373
58374
58375           var heading = pane
58376               .append('div')
58377               .attr('class', 'pane-heading');
58378
58379           heading
58380               .append('h2')
58381               .text(t('background.title'));
58382
58383           heading
58384               .append('button')
58385               .on('click', function() { uiBackground.hidePane(); })
58386               .call(svgIcon('#icon-close'));
58387
58388
58389           var content = pane
58390               .append('div')
58391               .attr('class', 'pane-content');
58392
58393           // background list
58394           content
58395               .append('div')
58396               .attr('class', 'background-background-list-container')
58397               .call(uiDisclosure(context, 'background_list', true)
58398                   .title(t('background.backgrounds'))
58399                   .content(renderBackgroundList)
58400               );
58401
58402           // overlay list
58403           content
58404               .append('div')
58405               .attr('class', 'background-overlay-list-container')
58406               .call(uiDisclosure(context, 'overlay_list', true)
58407                   .title(t('background.overlays'))
58408                   .content(renderOverlayList)
58409               );
58410
58411           // display options
58412           _displayOptionsContainer = content
58413               .append('div')
58414               .attr('class', 'background-display-options');
58415
58416           // offset controls
58417           _offsetContainer = content
58418               .append('div')
58419               .attr('class', 'background-offset');
58420
58421
58422           // add listeners
58423           context.map()
58424               .on('move.background-update', debounce(utilCallWhenIdle(update), 1000));
58425
58426           context.background()
58427               .on('change.background-update', update);
58428
58429
58430           update();
58431
58432           var keybinding = d3keybinding('background')
58433               .on(key, togglePane)
58434               .on(uiCmd('⌘' + key), quickSwitch)
58435               .on([t('map_data.key'), t('help.key')], hidePane);
58436
58437           d3_select(document)
58438               .call(keybinding);
58439
58440           uiBackground.hidePane = hidePane;
58441           uiBackground.togglePane = togglePane;
58442           uiBackground.setVisible = setVisible;
58443       }
58444
58445       return background;
58446   }
58447
58448   function uiContributors(context) {
58449       var osm = context.connection(),
58450           debouncedUpdate = debounce(function() { update(); }, 1000),
58451           limit = 4,
58452           hidden = false,
58453           wrap = d3_select(null);
58454
58455
58456       function update() {
58457           if (!osm) return;
58458
58459           var users = {},
58460               entities = context.intersects(context.map().extent());
58461
58462           entities.forEach(function(entity) {
58463               if (entity && entity.user) users[entity.user] = true;
58464           });
58465
58466           var u = Object.keys(users),
58467               subset = u.slice(0, u.length > limit ? limit - 1 : limit);
58468
58469           wrap.html('')
58470               .call(svgIcon('#icon-nearby', 'pre-text light'));
58471
58472           var userList = d3_select(document.createElement('span'));
58473
58474           userList.selectAll()
58475               .data(subset)
58476               .enter()
58477               .append('a')
58478               .attr('class', 'user-link')
58479               .attr('href', function(d) { return osm.userURL(d); })
58480               .attr('target', '_blank')
58481               .attr('tabindex', -1)
58482               .text(String);
58483
58484           if (u.length > limit) {
58485               var count = d3_select(document.createElement('span'));
58486
58487               count.append('a')
58488                   .attr('target', '_blank')
58489                   .attr('tabindex', -1)
58490                   .attr('href', function() {
58491                       return osm.changesetsURL(context.map().center(), context.map().zoom());
58492                   })
58493                   .text(u.length - limit + 1);
58494
58495               wrap.append('span')
58496                   .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
58497
58498           } else {
58499               wrap.append('span')
58500                   .html(t('contributors.list', { users: userList.html() }));
58501           }
58502
58503           if (!u.length) {
58504               hidden = true;
58505               wrap
58506                   .transition()
58507                   .style('opacity', 0);
58508
58509           } else if (hidden) {
58510               wrap
58511                   .transition()
58512                   .style('opacity', 1);
58513           }
58514       }
58515
58516
58517       return function(selection$$1) {
58518           if (!osm) return;
58519           wrap = selection$$1;
58520           update();
58521
58522           osm.on('loaded.contributors', debouncedUpdate);
58523           context.map().on('move.contributors', debouncedUpdate);
58524       };
58525   }
58526
58527   function uiFeatureInfo(context) {
58528       function update(selection$$1) {
58529           var features = context.features(),
58530               stats = features.stats(),
58531               count = 0,
58532               hiddenList = compact(map$3(features.hidden(), function(k) {
58533                   if (stats[k]) {
58534                       count += stats[k];
58535                       return String(stats[k]) + ' ' + t('feature.' + k + '.description');
58536                   }
58537               }));
58538
58539           selection$$1.html('');
58540
58541           if (hiddenList.length) {
58542               var tooltipBehavior = tooltip()
58543                   .placement('top')
58544                   .html(true)
58545                   .title(function() {
58546                       return uiTooltipHtml(hiddenList.join('<br/>'));
58547                   });
58548
58549               var warning = selection$$1.append('a')
58550                   .attr('href', '#')
58551                   .attr('tabindex', -1)
58552                   .html(t('feature_info.hidden_warning', { count: count }))
58553                   .call(tooltipBehavior)
58554                   .on('click', function() {
58555                       tooltipBehavior.hide(warning);
58556                       // open map data panel?
58557                       event.preventDefault();
58558                   });
58559           }
58560
58561           selection$$1
58562               .classed('hide', !hiddenList.length);
58563       }
58564
58565
58566       return function(selection$$1) {
58567           update(selection$$1);
58568
58569           context.features().on('change.feature_info', function() {
58570               update(selection$$1);
58571           });
58572       };
58573   }
58574
58575   function uiFullScreen(context) {
58576       var element = context.container().node(),
58577           keybinding = d3keybinding('full-screen');
58578           // button;
58579
58580
58581       function getFullScreenFn() {
58582           if (element.requestFullscreen) {
58583               return element.requestFullscreen;
58584           } else if (element.msRequestFullscreen) {
58585               return element.msRequestFullscreen;
58586           } else if (element.mozRequestFullScreen) {
58587               return element.mozRequestFullScreen;
58588           } else if (element.webkitRequestFullscreen) {
58589               return element.webkitRequestFullscreen;
58590           }
58591       }
58592
58593
58594       function getExitFullScreenFn() {
58595           if (document.exitFullscreen) {
58596               return document.exitFullscreen;
58597           } else if (document.msExitFullscreen) {
58598               return document.msExitFullscreen;
58599           } else if (document.mozCancelFullScreen) {
58600               return document.mozCancelFullScreen;
58601           } else if (document.webkitExitFullscreen) {
58602               return document.webkitExitFullscreen;
58603           }
58604       }
58605
58606
58607       function isFullScreen() {
58608           return document.fullscreenElement ||
58609               document.mozFullScreenElement ||
58610               document.webkitFullscreenElement ||
58611               document.msFullscreenElement;
58612       }
58613
58614
58615       function isSupported() {
58616           return !!getFullScreenFn();
58617       }
58618
58619
58620       function fullScreen() {
58621           event.preventDefault();
58622           if (!isFullScreen()) {
58623               // button.classed('active', true);
58624               getFullScreenFn().apply(element);
58625           } else {
58626               // button.classed('active', false);
58627               getExitFullScreenFn().apply(document);
58628           }
58629       }
58630
58631
58632       return function() { // selection) {
58633           if (!isSupported())
58634               return;
58635
58636           // button = selection.append('button')
58637           //     .attr('title', t('full_screen'))
58638           //     .attr('tabindex', -1)
58639           //     .on('click', fullScreen)
58640           //     .call(tooltip);
58641
58642           // button.append('span')
58643           //     .attr('class', 'icon full-screen');
58644
58645           var detected = utilDetect();
58646           var keys = detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11'];
58647           keybinding.on(keys, fullScreen);
58648
58649           d3_select(document)
58650               .call(keybinding);
58651       };
58652   }
58653
58654   function uiLoading(context) {
58655       var _modalSelection = d3_select(null);
58656       var _message = '';
58657       var _blocking = false;
58658
58659
58660       var loading = function(selection$$1) {
58661           _modalSelection = uiModal(selection$$1, _blocking);
58662
58663           var loadertext = _modalSelection.select('.content')
58664               .classed('loading-modal', true)
58665               .append('div')
58666               .attr('class', 'modal-section fillL');
58667
58668           loadertext
58669               .append('img')
58670               .attr('class', 'loader')
58671               .attr('src', context.imagePath('loader-white.gif'));
58672
58673           loadertext
58674               .append('h3')
58675               .text(_message);
58676
58677           _modalSelection.select('button.close')
58678               .attr('class', 'hide');
58679
58680           return loading;
58681       };
58682
58683
58684       loading.message = function(_) {
58685           if (!arguments.length) return _message;
58686           _message = _;
58687           return loading;
58688       };
58689
58690
58691       loading.blocking = function(_) {
58692           if (!arguments.length) return _blocking;
58693           _blocking = _;
58694           return loading;
58695       };
58696
58697
58698       loading.close = function() {
58699           _modalSelection.remove();
58700       };
58701
58702
58703       return loading;
58704   }
58705
58706   function uiGeolocate(context) {
58707       var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ },
58708           locating = uiLoading(context).message(t('geolocate.locating')).blocking(true),
58709           timeoutId;
58710
58711
58712       function click() {
58713           if (context.inIntro()) return;
58714           context.enter(modeBrowse(context));
58715           context.container().call(locating);
58716           navigator.geolocation.getCurrentPosition(success, error, geoOptions);
58717
58718           // This timeout ensures that we still call finish() even if
58719           // the user declines to share their location in Firefox
58720           timeoutId = setTimeout(finish, 10000 /* 10sec */ );
58721       }
58722
58723
58724       function success(position) {
58725           var map = context.map(),
58726               extent = geoExtent$$1([position.coords.longitude, position.coords.latitude])
58727                   .padByMeters(position.coords.accuracy);
58728
58729           map.centerZoom(extent.center(), Math.min(20, map.extentZoom(extent)));
58730           finish();
58731       }
58732
58733
58734       function error() {
58735           finish();
58736       }
58737
58738
58739       function finish() {
58740           locating.close();  // unblock ui
58741           if (timeoutId) { clearTimeout(timeoutId); }
58742           timeoutId = undefined;
58743       }
58744
58745
58746       return function(selection) {
58747           if (!navigator.geolocation) return;
58748
58749           selection
58750               .append('button')
58751               .attr('tabindex', -1)
58752               .attr('title', t('geolocate.title'))
58753               .on('click', click)
58754               .call(svgIcon('#icon-geolocate', 'light'))
58755               .call(tooltip()
58756                   .placement((textDirection === 'rtl') ? 'right' : 'left'));
58757       };
58758   }
58759
58760   function uiPanelBackground(context) {
58761       var background = context.background();
58762       var currSourceName = null;
58763       var metadata = {};
58764       var metadataKeys = [
58765           'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
58766       ];
58767
58768       var debouncedRedraw = debounce(redraw, 250);
58769
58770       function redraw(selection$$1) {
58771           var source = background.baseLayerSource(),
58772               isDG = (source.id.match(/^DigitalGlobe/i) !== null);
58773
58774           if (currSourceName !== source.name()) {
58775               currSourceName = source.name();
58776               metadata = {};
58777           }
58778
58779           selection$$1.html('');
58780
58781           var list = selection$$1
58782               .append('ul')
58783               .attr('class', 'background-info');
58784
58785           list
58786               .append('li')
58787               .text(currSourceName);
58788
58789           metadataKeys.forEach(function(k) {
58790               // DigitalGlobe vintage is available in raster layers for now.
58791               if (isDG && k === 'vintage') return;
58792
58793               list
58794                   .append('li')
58795                   .attr('class', 'background-info-list-' + k)
58796                   .classed('hide', !metadata[k])
58797                   .text(t('info_panels.background.' + k) + ':')
58798                   .append('span')
58799                   .attr('class', 'background-info-span-' + k)
58800                   .text(metadata[k]);
58801           });
58802
58803           debouncedGetMetadata(selection$$1);
58804
58805           var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
58806
58807           selection$$1
58808               .append('a')
58809               .text(t('info_panels.background.' + toggleTiles))
58810               .attr('href', '#')
58811               .attr('class', 'button button-toggle-tiles')
58812               .on('click', function() {
58813                   event.preventDefault();
58814                   context.setDebug('tile', !context.getDebug('tile'));
58815                   selection$$1.call(redraw);
58816               });
58817
58818           if (isDG) {
58819               var key = source.id + '-vintage';
58820               var sourceVintage = context.background().findSource(key);
58821               var showsVintage = context.background().showsLayer(sourceVintage);
58822               var toggleVintage = showsVintage ? 'hide_vintage' : 'show_vintage';
58823               selection$$1
58824                   .append('a')
58825                   .text(t('info_panels.background.' + toggleVintage))
58826                   .attr('href', '#')
58827                   .attr('class', 'button button-toggle-vintage')
58828                   .on('click', function() {
58829                       event.preventDefault();
58830                       context.background().toggleOverlayLayer(sourceVintage);
58831                       selection$$1.call(redraw);
58832                   });
58833           }
58834
58835           // disable if necessary
58836           ['DigitalGlobe-Premium', 'DigitalGlobe-Standard'].forEach(function(layerId) {
58837               if (source.id !== layerId) {
58838                   var key = layerId + '-vintage';
58839                   var sourceVintage = context.background().findSource(key);
58840                   if (context.background().showsLayer(sourceVintage)) {
58841                       context.background().toggleOverlayLayer(sourceVintage);
58842                   }
58843               }
58844           });
58845       }
58846
58847
58848       var debouncedGetMetadata = debounce(getMetadata, 250);
58849
58850       function getMetadata(selection$$1) {
58851           var tile = d3_select('.layer-background img.tile-center');   // tile near viewport center
58852           if (tile.empty()) return;
58853
58854           var sourceName = currSourceName,
58855               d = tile.datum(),
58856               zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom()),
58857               center = context.map().center();
58858
58859           // update zoom
58860           metadata.zoom = String(zoom);
58861           selection$$1.selectAll('.background-info-list-zoom')
58862               .classed('hide', false)
58863               .selectAll('.background-info-span-zoom')
58864               .text(metadata.zoom);
58865
58866           if (!d || !d.length >= 3) return;
58867
58868           background.baseLayerSource().getMetadata(center, d, function(err, result) {
58869               if (err || currSourceName !== sourceName) return;
58870
58871               // update vintage
58872               var vintage = result.vintage;
58873               metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
58874               selection$$1.selectAll('.background-info-list-vintage')
58875                   .classed('hide', false)
58876                   .selectAll('.background-info-span-vintage')
58877                   .text(metadata.vintage);
58878
58879               // update other metdata
58880               without(metadataKeys, 'zoom', 'vintage')
58881                   .forEach(function(k) {
58882                       var val = result[k];
58883                       metadata[k] = val;
58884                       selection$$1.selectAll('.background-info-list-' + k)
58885                           .classed('hide', !val)
58886                           .selectAll('.background-info-span-' + k)
58887                           .text(val);
58888                   });
58889           });
58890       }
58891
58892
58893       var panel = function(selection$$1) {
58894           selection$$1.call(redraw);
58895
58896           context.map()
58897               .on('drawn.info-background', function() {
58898                   selection$$1.call(debouncedRedraw);
58899               })
58900               .on('move.info-background', function() {
58901                   selection$$1.call(debouncedGetMetadata);
58902               });
58903
58904       };
58905
58906       panel.off = function() {
58907           context.map()
58908               .on('drawn.info-background', null)
58909               .on('move.info-background', null);
58910       };
58911
58912       panel.id = 'background';
58913       panel.title = t('info_panels.background.title');
58914       panel.key = t('info_panels.background.key');
58915
58916
58917       return panel;
58918   }
58919
58920   function uiPanelHistory(context) {
58921       var osm;
58922
58923       function displayTimestamp(entity) {
58924           if (!entity.timestamp) return t('info_panels.history.unknown');
58925           var detected = utilDetect();
58926           var options = {
58927               day: 'numeric', month: 'short', year: 'numeric',
58928               hour: 'numeric', minute: 'numeric', second: 'numeric'
58929           };
58930           var d = new Date(entity.timestamp);
58931           if (isNaN(d.getTime())) return t('info_panels.history.unknown');
58932           return d.toLocaleString(detected.locale, options);
58933       }
58934
58935
58936       function displayUser(selection, entity) {
58937           if (!entity.user) {
58938               selection
58939                   .append('span')
58940                   .text(t('info_panels.history.unknown'));
58941               return;
58942           }
58943
58944           selection
58945               .append('span')
58946               .attr('class', 'user-name')
58947               .text(entity.user);
58948
58949           var links = selection
58950               .append('div')
58951               .attr('class', 'links');
58952
58953           if (osm) {
58954               links
58955                   .append('a')
58956                   .attr('class', 'user-osm-link')
58957                   .attr('href', osm.userURL(entity.user))
58958                   .attr('target', '_blank')
58959                   .attr('tabindex', -1)
58960                   .text('OSM');
58961           }
58962
58963           links
58964               .append('a')
58965               .attr('class', 'user-hdyc-link')
58966               .attr('href', 'https://hdyc.neis-one.org/?' + entity.user)
58967               .attr('target', '_blank')
58968               .attr('tabindex', -1)
58969               .text('HDYC');
58970       }
58971
58972
58973       function displayChangeset(selection, entity) {
58974           if (!entity.changeset) {
58975               selection
58976                   .append('span')
58977                   .text(t('info_panels.history.unknown'));
58978               return;
58979           }
58980
58981           selection
58982               .append('span')
58983               .attr('class', 'changeset-id')
58984               .text(entity.changeset);
58985
58986           var links = selection
58987               .append('div')
58988               .attr('class', 'links');
58989
58990           if (osm) {
58991               links
58992                   .append('a')
58993                   .attr('class', 'changeset-osm-link')
58994                   .attr('href', osm.changesetURL(entity.changeset))
58995                   .attr('target', '_blank')
58996                   .attr('tabindex', -1)
58997                   .text('OSM');
58998           }
58999
59000           links
59001               .append('a')
59002               .attr('class', 'changeset-osmcha-link')
59003               .attr('href', 'https://osmcha.mapbox.com/changesets/' + entity.changeset)
59004               .attr('target', '_blank')
59005               .attr('tabindex', -1)
59006               .text('OSMCha');
59007       }
59008
59009
59010       function redraw(selection) {
59011           var selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
59012           var singular = selected.length === 1 ? selected[0] : null;
59013
59014           osm = context.connection();
59015
59016           selection.html('');
59017
59018           selection
59019               .append('h4')
59020               .attr('class', 'history-heading')
59021               .text(singular || t('info_panels.history.selected', { n: selected.length }));
59022
59023           if (!singular) return;
59024
59025           var entity = context.entity(singular);
59026
59027           if (!entity.version) {
59028               selection
59029                   .append('div')
59030                   .text(t('info_panels.history.no_history'));
59031               return;
59032           }
59033
59034           var list = selection
59035               .append('ul');
59036
59037           list
59038               .append('li')
59039               .text(t('info_panels.history.version') + ':')
59040               .append('span')
59041               .text(entity.version);
59042
59043           list
59044               .append('li')
59045               .text(t('info_panels.history.last_edit') + ':')
59046               .append('span')
59047               .text(displayTimestamp(entity));
59048
59049           list
59050               .append('li')
59051               .text(t('info_panels.history.edited_by') + ':')
59052               .call(displayUser, entity);
59053
59054           list
59055               .append('li')
59056               .text(t('info_panels.history.changeset') + ':')
59057               .call(displayChangeset, entity);
59058
59059           if (osm) {
59060               selection
59061                   .append('a')
59062                   .attr('class', 'view-history-on-osm')
59063                   .attr('target', '_blank')
59064                   .attr('tabindex', -1)
59065                   .attr('href', osm.historyURL(entity))
59066                   .call(svgIcon('#icon-out-link', 'inline'))
59067                   .append('span')
59068                   .text(t('info_panels.history.link_text'));
59069           }
59070       }
59071
59072
59073       var panel = function(selection) {
59074           selection.call(redraw);
59075
59076           context.map()
59077               .on('drawn.info-history', function() {
59078                   selection.call(redraw);
59079               });
59080       };
59081
59082       panel.off = function() {
59083           context.map()
59084               .on('drawn.info-history', null);
59085       };
59086
59087       panel.id = 'history';
59088       panel.title = t('info_panels.history.title');
59089       panel.key = t('info_panels.history.key');
59090
59091
59092       return panel;
59093   }
59094
59095   var OSM_PRECISION = 7;
59096   var locale$2 = utilDetect().locale;
59097
59098   /**
59099    * Returns a localized representation of the given length measurement.
59100    *
59101    * @param {Number} m area in meters
59102    * @param {Boolean} isImperial true for U.S. customary units; false for metric
59103    */
59104   function displayLength(m, isImperial) {
59105       var d = m * (isImperial ? 3.28084 : 1);
59106       var unit;
59107
59108       if (isImperial) {
59109           if (d >= 5280) {
59110               d /= 5280;
59111               unit = 'miles';
59112           } else {
59113               unit = 'feet';
59114           }
59115       } else {
59116           if (d >= 1000) {
59117               d /= 1000;
59118               unit = 'kilometers';
59119           } else {
59120               unit = 'meters';
59121           }
59122       }
59123
59124       return t('units.' + unit, {
59125           quantity: d.toLocaleString(locale$2, {
59126               maximumSignificantDigits: 4
59127           })
59128       });
59129   }
59130
59131   /**
59132    * Returns a localized representation of the given area measurement.
59133    *
59134    * @param {Number} m2 area in square meters
59135    * @param {Boolean} isImperial true for U.S. customary units; false for metric
59136    */
59137   function displayArea(m2, isImperial) {
59138       var d = m2 * (isImperial ? 10.7639111056 : 1);
59139       var d1, d2, area;
59140       var unit1 = '';
59141       var unit2 = '';
59142
59143       if (isImperial) {
59144           if (d >= 6969600) { // > 0.25mi² show mi²
59145               d1 = d / 27878400;
59146               unit1 = 'square_miles';
59147           } else {
59148               d1 = d;
59149               unit1 = 'square_feet';
59150           }
59151
59152           if (d > 4356 && d < 43560000) { // 0.1 - 1000 acres
59153               d2 = d / 43560;
59154               unit2 = 'acres';
59155           }
59156
59157       } else {
59158           if (d >= 250000) { // > 0.25km² show km²
59159               d1 = d / 1000000;
59160               unit1 = 'square_kilometers';
59161           } else {
59162               d1 = d;
59163               unit1 = 'square_meters';
59164           }
59165
59166           if (d > 1000 && d < 10000000) { // 0.1 - 1000 hectares
59167               d2 = d / 10000;
59168               unit2 = 'hectares';
59169           }
59170       }
59171
59172       area = t('units.' + unit1, {
59173           quantity: d1.toLocaleString(locale$2, {
59174               maximumSignificantDigits: 4
59175           })
59176       });
59177
59178       if (d2) {
59179           return t('units.area_pair', {
59180               area1: area,
59181               area2: t('units.' + unit2, {
59182                   quantity: d2.toLocaleString(locale$2, {
59183                       maximumSignificantDigits: 2
59184                   })
59185               })
59186           });
59187       } else {
59188           return area;
59189       }
59190   }
59191
59192   function wrap(x, min, max) {
59193       var d = max - min;
59194       return ((x - min) % d + d) % d + min;
59195   }
59196
59197   function clamp(x, min, max) {
59198       return Math.max(min, Math.min(x, max));
59199   }
59200
59201   function displayCoordinate(deg, pos, neg) {
59202       var min = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60;
59203       var sec = (min - Math.floor(min)) * 60;
59204       var displayDegrees = t('units.arcdegrees', {
59205           quantity: Math.floor(Math.abs(deg)).toLocaleString(locale$2)
59206       });
59207       var displayCoordinate;
59208
59209       if (Math.floor(sec) > 0) {
59210           displayCoordinate = displayDegrees +
59211               t('units.arcminutes', {
59212                   quantity: Math.floor(min).toLocaleString(locale$2)
59213               }) +
59214               t('units.arcseconds', {
59215                   quantity: Math.round(sec).toLocaleString(locale$2)
59216               });
59217       } else if (Math.floor(min) > 0) {
59218           displayCoordinate = displayDegrees +
59219               t('units.arcminutes', {
59220                   quantity: Math.round(min).toLocaleString(locale$2)
59221               });
59222       } else {
59223           displayCoordinate = t('units.arcdegrees', {
59224               quantity: Math.round(Math.abs(deg)).toLocaleString(locale$2)
59225           });
59226       }
59227
59228       if (deg === 0) {
59229           return displayCoordinate;
59230       } else {
59231           return t('units.coordinate', {
59232               coordinate: displayCoordinate,
59233               direction: t('units.' + (deg > 0 ? pos : neg))
59234           });
59235       }
59236   }
59237
59238   /**
59239    * Returns given coordinate pair in degree-minute-second format.
59240    *
59241    * @param {Array<Number>} coord longitude and latitude
59242    */
59243   function dmsCoordinatePair(coord) {
59244       return t('units.coordinate_pair', {
59245           latitude: displayCoordinate(clamp(coord[1], -90, 90), 'north', 'south'),
59246           longitude: displayCoordinate(wrap(coord[0], -180, 180), 'east', 'west')
59247       });
59248   }
59249
59250   /**
59251    * Returns the given coordinate pair in decimal format.
59252    * note: unlocalized to avoid comma ambiguity - see #4765
59253    *
59254    * @param {Array<Number>} coord longitude and latitude
59255    */
59256   function decimalCoordinatePair(coord) {
59257       return t('units.coordinate_pair', {
59258           latitude: clamp(coord[1], -90, 90).toFixed(OSM_PRECISION),
59259           longitude: wrap(coord[0], -180, 180).toFixed(OSM_PRECISION)
59260       });
59261   }
59262
59263   function uiPanelLocation(context) {
59264       var currLocation = '';
59265
59266
59267       function redraw(selection) {
59268           selection.html('');
59269
59270           var list = selection
59271               .append('ul');
59272
59273           // Mouse coordinates
59274           var coord = context.map().mouseCoordinates();
59275           if (coord.some(isNaN)) {
59276               coord = context.map().center();
59277           }
59278
59279           list
59280               .append('li')
59281               .text(dmsCoordinatePair(coord))
59282               .append('li')
59283               .text(decimalCoordinatePair(coord));
59284
59285           // Location Info
59286           selection
59287               .append('div')
59288               .attr('class', 'location-info')
59289               .text(currLocation || ' ');
59290
59291           debouncedGetLocation(selection, coord);
59292       }
59293
59294
59295       var debouncedGetLocation = debounce(getLocation, 250);
59296       function getLocation(selection, coord) {
59297           if (!services.geocoder) {
59298               currLocation = t('info_panels.location.unknown_location');
59299               selection.selectAll('.location-info')
59300                   .text(currLocation);
59301           } else {
59302               services.geocoder.reverse(coord, function(err, result) {
59303                   currLocation = result ? result.display_name : t('info_panels.location.unknown_location');
59304                   selection.selectAll('.location-info')
59305                       .text(currLocation);
59306               });
59307           }
59308       }
59309
59310
59311       var panel = function(selection) {
59312           selection.call(redraw);
59313
59314           context.surface()
59315               .on('mousemove.info-location', function() {
59316                   selection.call(redraw);
59317               });
59318       };
59319
59320       panel.off = function() {
59321           context.surface()
59322               .on('mousemove.info-location', null);
59323       };
59324
59325       panel.id = 'location';
59326       panel.title = t('info_panels.location.title');
59327       panel.key = t('info_panels.location.key');
59328
59329
59330       return panel;
59331   }
59332
59333   function uiPanelMeasurement(context) {
59334       var locale = utilDetect().locale,
59335           isImperial = (locale.toLowerCase() === 'en-us');
59336
59337
59338       function radiansToMeters(r) {
59339           // using WGS84 authalic radius (6371007.1809 m)
59340           return r * 6371007.1809;
59341       }
59342
59343       function steradiansToSqmeters(r) {
59344           // http://gis.stackexchange.com/a/124857/40446
59345           return r / (4 * Math.PI) * 510065621724000;
59346       }
59347
59348
59349       function toLineString(feature) {
59350           if (feature.type === 'LineString') return feature;
59351
59352           var result = { type: 'LineString', coordinates: [] };
59353           if (feature.type === 'Polygon') {
59354               result.coordinates = feature.coordinates[0];
59355           } else if (feature.type === 'MultiPolygon') {
59356               result.coordinates = feature.coordinates[0][0];
59357           }
59358
59359           return result;
59360       }
59361
59362       function nodeCount(feature) {
59363         if (feature.type === 'LineString') return feature.coordinates.length;
59364
59365         if (feature.type === 'Polygon') {
59366             return feature.coordinates[0].length - 1;
59367         }
59368       }
59369
59370
59371       function redraw(selection$$1) {
59372           var resolver = context.graph();
59373           var selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
59374           var singular = selected.length === 1 ? selected[0] : null;
59375           var extent = geoExtent$$1();
59376           var entity;
59377
59378           selection$$1.html('');
59379
59380           selection$$1
59381               .append('h4')
59382               .attr('class', 'measurement-heading')
59383               .text(singular || t('info_panels.measurement.selected', { n: selected.length.toLocaleString(locale) }));
59384
59385           if (!selected.length) return;
59386
59387           var center;
59388           for (var i = 0; i < selected.length; i++) {
59389               entity = context.entity(selected[i]);
59390               extent._extend(entity.extent(resolver));
59391           }
59392           center = extent.center();
59393
59394
59395           var list = selection$$1
59396               .append('ul');
59397           var coordItem;
59398
59399           // multiple features, just display extent center..
59400           if (!singular) {
59401               coordItem = list
59402                   .append('li')
59403                   .text(t('info_panels.measurement.center') + ':');
59404               coordItem.append('span')
59405                   .text(dmsCoordinatePair(center));
59406               coordItem.append('span')
59407                   .text(decimalCoordinatePair(center));
59408               return;
59409           }
59410
59411           // single feature, display details..
59412           if (!entity) return;
59413           var geometry = entity.geometry(resolver);
59414
59415           if (geometry === 'line' || geometry === 'area') {
59416               var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate()),
59417                   feature = entity.asGeoJSON(resolver),
59418                   length = radiansToMeters(d3_geoLength(toLineString(feature))),
59419                   lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length')),
59420                   centroid = d3_geoCentroid(feature);
59421
59422               list
59423                   .append('li')
59424                   .text(t('info_panels.measurement.geometry') + ':')
59425                   .append('span')
59426                   .text(
59427                       closed ? t('info_panels.measurement.closed_' + geometry) : t('geometry.' + geometry)
59428                   );
59429
59430               if (entity.type !== 'relation') {
59431                   list
59432                       .append('li')
59433                       .text(t('info_panels.measurement.node_count') + ':')
59434                       .append('span')
59435                       .text(nodeCount(feature).toLocaleString(locale));
59436               }
59437
59438               if (closed) {
59439                   var area = steradiansToSqmeters(entity.area(resolver));
59440                   list
59441                       .append('li')
59442                       .text(t('info_panels.measurement.area') + ':')
59443                       .append('span')
59444                       .text(displayArea(area, isImperial));
59445               }
59446
59447
59448               list
59449                   .append('li')
59450                   .text(lengthLabel + ':')
59451                   .append('span')
59452                   .text(displayLength(length, isImperial));
59453
59454               coordItem = list
59455                   .append('li')
59456                   .text(t('info_panels.measurement.centroid') + ':');
59457               coordItem.append('span')
59458                   .text(dmsCoordinatePair(centroid));
59459               coordItem.append('span')
59460                   .text(decimalCoordinatePair(centroid));
59461
59462               var toggle  = isImperial ? 'imperial' : 'metric';
59463
59464               selection$$1
59465                   .append('a')
59466                   .text(t('info_panels.measurement.' + toggle))
59467                   .attr('href', '#')
59468                   .attr('class', 'button button-toggle-units')
59469                   .on('click', function() {
59470                       event.preventDefault();
59471                       isImperial = !isImperial;
59472                       selection$$1.call(redraw);
59473                   });
59474
59475           } else {
59476               var centerLabel = t('info_panels.measurement.' + (entity.type === 'node' ? 'location' : 'center'));
59477
59478               list
59479                   .append('li')
59480                   .text(t('info_panels.measurement.geometry') + ':')
59481                   .append('span')
59482                   .text(t('geometry.' + geometry));
59483
59484               coordItem = list
59485                   .append('li')
59486                   .text(centerLabel + ':');
59487               coordItem.append('span')
59488                   .text(dmsCoordinatePair(center));
59489               coordItem.append('span')
59490                   .text(decimalCoordinatePair(center));
59491           }
59492       }
59493
59494
59495       var panel = function(selection$$1) {
59496           selection$$1.call(redraw);
59497
59498           context.map()
59499               .on('drawn.info-measurement', function() {
59500                   selection$$1.call(redraw);
59501               });
59502       };
59503
59504       panel.off = function() {
59505           context.map()
59506               .on('drawn.info-measurement', null);
59507       };
59508
59509       panel.id = 'measurement';
59510       panel.title = t('info_panels.measurement.title');
59511       panel.key = t('info_panels.measurement.key');
59512
59513
59514       return panel;
59515   }
59516
59517   var uiInfoPanels = {
59518       background: uiPanelBackground,
59519       history: uiPanelHistory,
59520       location: uiPanelLocation,
59521       measurement: uiPanelMeasurement,
59522   };
59523
59524   function uiInfo(context) {
59525       var ids = Object.keys(uiInfoPanels),
59526           wasActive = ['measurement'],
59527           panels = {},
59528           active = {};
59529
59530       // create panels
59531       ids.forEach(function(k) {
59532           if (!panels[k]) {
59533               panels[k] = uiInfoPanels[k](context);
59534               active[k] = false;
59535           }
59536       });
59537
59538
59539       function info(selection$$1) {
59540
59541           function redraw() {
59542               var activeids = ids.filter(function(k) { return active[k]; }).sort();
59543
59544               var containers = infoPanels.selectAll('.panel-container')
59545                   .data(activeids, function(k) { return k; });
59546
59547               containers.exit()
59548                   .style('opacity', 1)
59549                   .transition()
59550                   .duration(200)
59551                   .style('opacity', 0)
59552                   .on('end', function(d) {
59553                       d3_select(this)
59554                           .call(panels[d].off)
59555                           .remove();
59556                   });
59557
59558               var enter = containers.enter()
59559                   .append('div')
59560                   .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
59561
59562               enter
59563                   .style('opacity', 0)
59564                   .transition()
59565                   .duration(200)
59566                   .style('opacity', 1);
59567
59568               var title = enter
59569                   .append('div')
59570                   .attr('class', 'panel-title fillD2');
59571
59572               title
59573                   .append('h3')
59574                   .text(function(d) { return panels[d].title; });
59575
59576               title
59577                   .append('button')
59578                   .attr('class', 'close')
59579                   .on('click', function (d) { toggle(d); })
59580                   .call(svgIcon('#icon-close'));
59581
59582               enter
59583                   .append('div')
59584                   .attr('class', function(d) { return 'panel-content panel-content-' + d; });
59585
59586
59587               // redraw the panels
59588               infoPanels.selectAll('.panel-content')
59589                   .each(function(d) {
59590                       d3_select(this).call(panels[d]);
59591                   });
59592           }
59593
59594
59595           function toggle(which) {
59596               if (event) {
59597                   event.stopImmediatePropagation();
59598                   event.preventDefault();
59599               }
59600
59601               var activeids = ids.filter(function(k) { return active[k]; });
59602
59603               if (which) {  // toggle one
59604                   active[which] = !active[which];
59605                   if (activeids.length === 1 && activeids[0] === which) {  // none active anymore
59606                       wasActive = [which];
59607                   }
59608               } else {      // toggle all
59609                   if (activeids.length) {
59610                       wasActive = activeids;
59611                       activeids.forEach(function(k) { active[k] = false; });
59612                   } else {
59613                       wasActive.forEach(function(k) { active[k] = true; });
59614                   }
59615               }
59616
59617               redraw();
59618           }
59619
59620
59621           var infoPanels = selection$$1.selectAll('.info-panels')
59622               .data([0]);
59623
59624           infoPanels = infoPanels.enter()
59625               .append('div')
59626               .attr('class', 'info-panels')
59627               .merge(infoPanels);
59628
59629           redraw();
59630
59631           var keybinding = d3keybinding('info')
59632               .on(uiCmd('⌘' + t('info_panels.key')), toggle);
59633
59634           ids.forEach(function(k) {
59635               var key = t('info_panels.' + k + '.key', { default: null });
59636               if (!key) return;
59637               keybinding
59638                   .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
59639           });
59640
59641           d3_select(document)
59642               .call(keybinding);
59643       }
59644
59645       return info;
59646   }
59647
59648   function uiModes(context) {
59649       var modes = [
59650           modeAddPoint$$1(context),
59651           modeAddLine$$1(context),
59652           modeAddArea$$1(context)
59653       ];
59654
59655
59656       function editable() {
59657           var mode = context.mode();
59658           return context.editable() && mode && mode.id !== 'save';
59659       }
59660
59661
59662       return function(selection$$1) {
59663           var buttons = selection$$1.selectAll('button.add-button')
59664               .data(modes);
59665
59666           buttons = buttons.enter()
59667               .append('button')
59668               .attr('tabindex', -1)
59669               .attr('class', function(mode) { return mode.id + ' add-button col4'; })
59670               .on('click.mode-buttons', function(mode) {
59671                   // When drawing, ignore accidental clicks on mode buttons - #4042
59672                   var currMode = context.mode().id;
59673                   if (currMode.match(/^draw/) !== null) return;
59674
59675                   if (mode.id === currMode) {
59676                       context.enter(modeBrowse(context));
59677                   } else {
59678                       context.enter(mode);
59679                   }
59680               })
59681               .call(tooltip()
59682                   .placement('bottom')
59683                   .html(true)
59684                   .title(function(mode) {
59685                       return uiTooltipHtml(mode.description, mode.key);
59686                   })
59687               );
59688
59689           buttons
59690               .each(function(d) {
59691                   d3_select(this)
59692                       .call(svgIcon('#icon-' + d.button, 'pre-text'));
59693               });
59694
59695           buttons
59696               .append('span')
59697               .attr('class', 'label')
59698               .text(function(mode) { return mode.title; });
59699
59700           context
59701               .on('enter.editor', function(entered) {
59702                   selection$$1.selectAll('button.add-button')
59703                       .classed('active', function(mode) { return entered.button === mode.button; });
59704                   context.container()
59705                       .classed('mode-' + entered.id, true);
59706               });
59707
59708           context
59709               .on('exit.editor', function(exited) {
59710                   context.container()
59711                       .classed('mode-' + exited.id, false);
59712               });
59713
59714           var keybinding = d3keybinding('mode-buttons');
59715
59716           modes.forEach(function(mode) {
59717               keybinding.on(mode.key, function() {
59718                   if (editable()) {
59719                       if (mode.id === context.mode().id) {
59720                           context.enter(modeBrowse(context));
59721                       } else {
59722                           context.enter(mode);
59723                       }
59724                   }
59725               });
59726           });
59727
59728           d3_select(document)
59729               .call(keybinding);
59730
59731
59732           var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
59733
59734           context.map()
59735               .on('move.modes', debouncedUpdate)
59736               .on('drawn.modes', debouncedUpdate);
59737
59738           context
59739               .on('enter.modes', update);
59740
59741
59742
59743           function update() {
59744               selection$$1.selectAll('button.add-button')
59745                   .property('disabled', !editable());
59746           }
59747       };
59748   }
59749
59750   function uiNotice(context) {
59751
59752       return function(selection$$1) {
59753           var div = selection$$1
59754               .append('div')
59755               .attr('class', 'notice');
59756
59757           var button = div
59758               .append('button')
59759               .attr('class', 'zoom-to notice fillD')
59760               .on('click', function() {
59761                   context.map().zoomEase(context.minEditableZoom());
59762               })
59763               .on('wheel', function() {   // let wheel events pass through #4482
59764                   var e2 = new WheelEvent(event.type, event);
59765                   context.surface().node().dispatchEvent(e2);
59766               });
59767
59768           button
59769               .call(svgIcon('#icon-plus', 'pre-text'))
59770               .append('span')
59771               .attr('class', 'label')
59772               .text(t('zoom_in_edit'));
59773
59774
59775           function disableTooHigh() {
59776               var canEdit = context.map().zoom() >= context.minEditableZoom();
59777               div.style('display', canEdit ? 'none' : 'block');
59778           }
59779
59780           context.map()
59781               .on('move.notice', debounce(disableTooHigh, 500));
59782
59783           disableTooHigh();
59784       };
59785   }
59786
59787   function uiRestore(context) {
59788
59789       return function(selection) {
59790           if (!context.history().lock() || !context.history().restorableChanges())
59791               return;
59792
59793           var modalSelection = uiModal(selection, true);
59794
59795           modalSelection.select('.modal')
59796               .attr('class', 'modal fillL col6');
59797
59798           var introModal = modalSelection.select('.content');
59799
59800           introModal
59801               .attr('class','cf');
59802
59803           introModal
59804               .append('div')
59805               .attr('class', 'modal-section')
59806               .append('h3')
59807               .text(t('restore.heading'));
59808
59809           introModal
59810               .append('div')
59811               .attr('class','modal-section')
59812               .append('p')
59813               .text(t('restore.description'));
59814
59815           var buttonWrap = introModal
59816               .append('div')
59817               .attr('class', 'modal-actions cf');
59818
59819           var restore = buttonWrap
59820               .append('button')
59821               .attr('class', 'restore col6')
59822               .on('click', function() {
59823                   context.history().restore();
59824                   modalSelection.remove();
59825               });
59826
59827           restore
59828               .append('svg')
59829               .attr('class', 'logo logo-restore')
59830               .append('use')
59831               .attr('xlink:href', '#logo-restore');
59832
59833           restore
59834               .append('div')
59835               .text(t('restore.restore'));
59836
59837           var reset = buttonWrap
59838               .append('button')
59839               .attr('class', 'reset col6')
59840               .on('click', function() {
59841                   context.history().clearSaved();
59842                   modalSelection.remove();
59843               });
59844
59845           reset
59846               .append('svg')
59847               .attr('class', 'logo logo-reset')
59848               .append('use')
59849               .attr('xlink:href', '#logo-reset');
59850
59851           reset
59852               .append('div')
59853               .text(t('restore.reset'));
59854
59855           restore.node().focus();
59856       };
59857   }
59858
59859   function uiSave(context) {
59860       var history = context.history();
59861       var key = uiCmd('⌘S');
59862
59863
59864       function saving() {
59865           var mode = context.mode();
59866           return mode && mode.id === 'save';
59867       }
59868
59869
59870       function save() {
59871           event.preventDefault();
59872           if (!context.inIntro() && !saving() && history.hasChanges()) {
59873               context.enter(modeSave$$1(context));
59874           }
59875       }
59876
59877
59878       function getBackground(numChanges) {
59879           var step;
59880           if (numChanges === 0) {
59881               return null;
59882           } else if (numChanges <= 50) {
59883               step = numChanges / 50;
59884               return d3_interpolateRgb('#fff', '#ff8')(step);  // white -> yellow
59885           } else {
59886               step = Math.min((numChanges - 50) / 50, 1.0);
59887               return d3_interpolateRgb('#ff8', '#f88')(step);  // yellow -> red
59888           }
59889       }
59890
59891
59892       return function(selection$$1) {
59893           var numChanges = 0;
59894
59895           function updateCount() {
59896               var _ = history.difference().summary().length;
59897               if (_ === numChanges) return;
59898               numChanges = _;
59899
59900               tooltipBehavior
59901                   .title(uiTooltipHtml(
59902                       t(numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
59903                   );
59904
59905               var background = getBackground(numChanges);
59906
59907               button
59908                   .classed('disabled', numChanges === 0)
59909                   .classed('has-count', numChanges > 0)
59910                   .style('background', background);
59911
59912               button.select('span.count')
59913                   .text(numChanges)
59914                   .style('background', background)
59915                   .style('border-color', background);
59916           }
59917
59918
59919           var tooltipBehavior = tooltip()
59920               .placement('bottom')
59921               .html(true)
59922               .title(uiTooltipHtml(t('save.no_changes'), key));
59923
59924           var button = selection$$1
59925               .append('button')
59926               .attr('class', 'save col12 disabled')
59927               .attr('tabindex', -1)
59928               .on('click', save)
59929               .call(tooltipBehavior);
59930
59931           button
59932               .call(svgIcon('#icon-save', 'pre-text'))
59933               .append('span')
59934               .attr('class', 'label')
59935               .text(t('save.title'));
59936
59937           button
59938               .append('span')
59939               .attr('class', 'count')
59940               .text('0');
59941
59942           updateCount();
59943
59944
59945           var keybinding = d3keybinding('uiSave')
59946               .on(key, save, true);
59947
59948           d3_select(document)
59949               .call(keybinding);
59950
59951           context.history()
59952               .on('change.save', updateCount);
59953
59954           context
59955               .on('enter.save', function() {
59956                   button.property('disabled', saving());
59957                   if (saving()) button.call(tooltipBehavior.hide);
59958               });
59959       };
59960   }
59961
59962   function uiScale(context) {
59963       var projection = context.projection,
59964           isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
59965           maxLength = 180,
59966           tickHeight = 8;
59967
59968
59969       function scaleDefs(loc1, loc2) {
59970           var lat = (loc2[1] + loc1[1]) / 2,
59971               conversion = (isImperial ? 3.28084 : 1),
59972               dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
59973               scale = { dist: 0, px: 0, text: '' },
59974               buckets, i, val, dLon;
59975
59976           if (isImperial) {
59977               buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
59978           } else {
59979               buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
59980           }
59981
59982           // determine a user-friendly endpoint for the scale
59983           for (i = 0; i < buckets.length; i++) {
59984               val = buckets[i];
59985               if (dist >= val) {
59986                   scale.dist = Math.floor(dist / val) * val;
59987                   break;
59988               } else {
59989                   scale.dist = +dist.toFixed(2);
59990               }
59991           }
59992
59993           dLon = geoMetersToLon(scale.dist / conversion, lat);
59994           scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
59995
59996           scale.text = displayLength(scale.dist / conversion, isImperial);
59997
59998           return scale;
59999       }
60000
60001
60002       function update(selection) {
60003           // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
60004           var dims = context.map().dimensions(),
60005               loc1 = projection.invert([0, dims[1]]),
60006               loc2 = projection.invert([maxLength, dims[1]]),
60007               scale = scaleDefs(loc1, loc2);
60008
60009           selection.select('#scale-path')
60010               .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
60011
60012           selection.select('#scale-textgroup')
60013               .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
60014
60015           selection.select('#scale-text')
60016               .text(scale.text);
60017       }
60018
60019
60020       return function(selection) {
60021           function switchUnits() {
60022               isImperial = !isImperial;
60023               selection.call(update);
60024           }
60025
60026           var scalegroup = selection.append('svg')
60027               .attr('id', 'scale')
60028               .on('click', switchUnits)
60029               .append('g')
60030               .attr('transform', 'translate(10,11)');
60031
60032           scalegroup
60033               .append('path')
60034               .attr('id', 'scale-path');
60035
60036           scalegroup
60037               .append('g')
60038               .attr('id', 'scale-textgroup')
60039               .append('text')
60040               .attr('id', 'scale-text');
60041
60042           selection.call(update);
60043
60044           context.map().on('move.scale', function() {
60045               update(selection);
60046           });
60047       };
60048   }
60049
60050   var pair_1 = pair$1;
60051
60052   function search(x, dims, r) {
60053     if (!dims) dims = 'NSEW';
60054     if (typeof x !== 'string') return { val: null, regex: r };
60055
60056     r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
60057
60058     var m = r.exec(x);
60059     if (!m) return { val: null, regex: r };
60060
60061     var dim = m[1] || m[5];
60062     if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
60063
60064     return {
60065       val: (((m[2]) ? parseFloat(m[2]) : 0) +
60066             ((m[3] ? parseFloat(m[3]) / 60 : 0)) +
60067             ((m[4] ? parseFloat(m[4]) / 3600 : 0))) *
60068             ((dim === 'S' || dim === 'W') ? -1 : 1),
60069       regex: r,
60070       raw: m[0],
60071       dim: dim
60072     };
60073   }
60074
60075   function pair$1(x, dims) {
60076     x = x.trim();
60077     var one = search(x, dims);
60078     if (one.val === null) return null;
60079     var two = search(x, dims, one.regex);
60080     if (two.val === null) return null;
60081     // null if one/two are not contiguous.
60082     if (one.raw + two.raw !== x) return null;
60083     if (one.dim) {
60084       return swapdim(one.val, two.val, one.dim);
60085     } else {
60086       return [one.val, two.val];
60087     }
60088   }
60089
60090   function swapdim(a, b, dim) {
60091     if (dim === 'N' || dim === 'S') return [a, b];
60092     if (dim === 'W' || dim === 'E') return [b, a];
60093   }
60094
60095   function uiFeatureList(context) {
60096       var keybinding = d3keybinding('uiFeatureList');
60097       var _geocodeResults;
60098
60099
60100       function featureList(selection$$1) {
60101           var header = selection$$1
60102               .append('div')
60103               .attr('class', 'header fillL cf');
60104
60105           header
60106               .append('h3')
60107               .text(t('inspector.feature_list'));
60108
60109           var searchWrap = selection$$1
60110               .append('div')
60111               .attr('class', 'search-header');
60112
60113           var search = searchWrap
60114               .append('input')
60115               .attr('placeholder', t('inspector.search'))
60116               .attr('type', 'search')
60117               .call(utilNoAuto)
60118               .on('keypress', keypress)
60119               .on('keydown', keydown)
60120               .on('input', inputevent);
60121
60122           searchWrap
60123               .call(svgIcon('#icon-search', 'pre-text'));
60124
60125           var listWrap = selection$$1
60126               .append('div')
60127               .attr('class', 'inspector-body');
60128
60129           var list = listWrap
60130               .append('div')
60131               .attr('class', 'feature-list cf');
60132
60133           context
60134               .on('exit.feature-list', clearSearch);
60135           context.map()
60136               .on('drawn.feature-list', mapDrawn);
60137
60138           keybinding
60139               .on(uiCmd('⌘F'), focusSearch);
60140
60141           d3_select(document)
60142               .call(keybinding);
60143
60144
60145           function focusSearch() {
60146               var mode = context.mode() && context.mode().id;
60147               if (mode !== 'browse') return;
60148
60149               event.preventDefault();
60150               search.node().focus();
60151           }
60152
60153
60154           function keydown() {
60155               if (event.keyCode === 27) {  // escape
60156                   search.node().blur();
60157               }
60158           }
60159
60160
60161           function keypress() {
60162               var q = search.property('value'),
60163                   items = list.selectAll('.feature-list-item');
60164               if (event.keyCode === 13 && q.length && items.size()) {  // return
60165                   click(items.datum());
60166               }
60167           }
60168
60169
60170           function inputevent() {
60171               _geocodeResults = undefined;
60172               drawList();
60173           }
60174
60175
60176           function clearSearch() {
60177               search.property('value', '');
60178               drawList();
60179           }
60180
60181
60182           function mapDrawn(e) {
60183               if (e.full) {
60184                   drawList();
60185               }
60186           }
60187
60188
60189           function features() {
60190               var entities = {};
60191               var result = [];
60192               var graph = context.graph();
60193               var q = search.property('value').toLowerCase();
60194
60195               if (!q) return result;
60196
60197               var idMatch = q.match(/^([nwr])([0-9]+)$/);
60198
60199               if (idMatch) {
60200                   result.push({
60201                       id: idMatch[0],
60202                       geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
60203                       type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
60204                       name: idMatch[2]
60205                   });
60206               }
60207
60208               var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
60209
60210               if (locationMatch) {
60211                   var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
60212                   result.push({
60213                       id: -1,
60214                       geometry: 'point',
60215                       type: t('inspector.location'),
60216                       name: dmsCoordinatePair([loc[1], loc[0]]),
60217                       location: loc
60218                   });
60219               }
60220
60221               function addEntity(entity) {
60222                   if (entity.id in entities || result.length > 200)
60223                       return;
60224
60225                   entities[entity.id] = true;
60226
60227                   var name = utilDisplayName(entity) || '';
60228                   if (name.toLowerCase().indexOf(q) >= 0) {
60229                       var matched = context.presets().match(entity, graph);
60230                       var type = (matched && matched.name()) || utilDisplayType(entity.id);
60231
60232                       result.push({
60233                           id: entity.id,
60234                           entity: entity,
60235                           geometry: context.geometry(entity.id),
60236                           type: type,
60237                           name: name
60238                       });
60239                   }
60240
60241                   graph.parentRelations(entity).forEach(function(parent) {
60242                       addEntity(parent);
60243                   });
60244               }
60245
60246               var visible = context.surface().selectAll('.point, .line, .area').nodes();
60247               for (var i = 0; i < visible.length && result.length <= 200; i++) {
60248                   var datum = visible[i].__data__;
60249                   var entity = datum && datum.properties && datum.properties.entity;
60250                   if (entity) { addEntity(entity); }
60251               }
60252
60253               (_geocodeResults || []).forEach(function(d) {
60254                   if (d.osm_type && d.osm_id) {    // some results may be missing these - #1890
60255
60256                       // Make a temporary osmEntity so we can preset match
60257                       // and better localize the search result - #4725
60258                       var id = osmEntity$$1.id.fromOSM(d.osm_type, d.osm_id);
60259                       var tags = {};
60260                       tags[d.class] = d.type;
60261
60262                       var attrs = { id: id, type: d.osm_type, tags: tags };
60263                       if (d.osm_type === 'way') {   // for ways, add some fake closed nodes
60264                           attrs.nodes = ['a','a'];  // so that geometry area is possible
60265                       }
60266
60267                       var tempEntity = osmEntity$$1(attrs);
60268                       var tempGraph = coreGraph$$1([tempEntity]);
60269                       var matched = context.presets().match(tempEntity, tempGraph);
60270                       var type = (matched && matched.name()) || utilDisplayType(id);
60271
60272                       result.push({
60273                           id: tempEntity.id,
60274                           geometry: tempEntity.geometry(tempGraph),
60275                           type: type,
60276                           name: d.display_name,
60277                           extent: new geoExtent$$1(
60278                               [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
60279                               [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
60280                       });
60281                   }
60282               });
60283
60284               return result;
60285           }
60286
60287
60288           function drawList() {
60289               var value = search.property('value');
60290               var results = features();
60291
60292               list.classed('filtered', value.length);
60293
60294               var noResultsWorldwide = _geocodeResults && _geocodeResults.length === 0;
60295
60296               var resultsIndicator = list.selectAll('.no-results-item')
60297                   .data([0])
60298                   .enter()
60299                   .append('button')
60300                   .property('disabled', true)
60301                   .attr('class', 'no-results-item')
60302                   .call(svgIcon('#icon-alert', 'pre-text'));
60303
60304               resultsIndicator.append('span')
60305                   .attr('class', 'entity-name');
60306
60307               list.selectAll('.no-results-item .entity-name')
60308                   .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
60309
60310               if (services.geocoder) {
60311                 list.selectAll('.geocode-item')
60312                     .data([0])
60313                     .enter()
60314                     .append('button')
60315                     .attr('class', 'geocode-item')
60316                     .on('click', geocoderSearch)
60317                     .append('div')
60318                     .attr('class', 'label')
60319                     .append('span')
60320                     .attr('class', 'entity-name')
60321                     .text(t('geocoder.search'));
60322               }
60323
60324               list.selectAll('.no-results-item')
60325                   .style('display', (value.length && !results.length) ? 'block' : 'none');
60326
60327               list.selectAll('.geocode-item')
60328                   .style('display', (value && _geocodeResults === undefined) ? 'block' : 'none');
60329
60330               list.selectAll('.feature-list-item')
60331                   .data([-1])
60332                   .remove();
60333
60334               var items = list.selectAll('.feature-list-item')
60335                   .data(results, function(d) { return d.id; });
60336
60337               var enter = items.enter()
60338                   .insert('button', '.geocode-item')
60339                   .attr('class', 'feature-list-item')
60340                   .on('mouseover', mouseover)
60341                   .on('mouseout', mouseout)
60342                   .on('click', click);
60343
60344               var label = enter
60345                   .append('div')
60346                   .attr('class', 'label');
60347
60348               label
60349                   .each(function(d) {
60350                       d3_select(this)
60351                           .call(svgIcon('#icon-' + d.geometry, 'pre-text'));
60352                   });
60353
60354               label
60355                   .append('span')
60356                   .attr('class', 'entity-type')
60357                   .text(function(d) { return d.type; });
60358
60359               label
60360                   .append('span')
60361                   .attr('class', 'entity-name')
60362                   .text(function(d) { return d.name; });
60363
60364               enter
60365                   .style('opacity', 0)
60366                   .transition()
60367                   .style('opacity', 1);
60368
60369               items.order();
60370
60371               items.exit()
60372                   .remove();
60373           }
60374
60375
60376           function mouseover(d) {
60377               if (d.id === -1) return;
60378
60379               context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
60380                   .classed('hover', true);
60381           }
60382
60383
60384           function mouseout() {
60385               context.surface().selectAll('.hover')
60386                   .classed('hover', false);
60387           }
60388
60389
60390           function click(d) {
60391               event.preventDefault();
60392               if (d.location) {
60393                   context.map().centerZoom([d.location[1], d.location[0]], 20);
60394               }
60395               else if (d.entity) {
60396                   if (d.entity.type === 'node') {
60397                       context.map().center(d.entity.loc);
60398                   } else if (d.entity.type === 'way') {
60399                       var center = context.projection(context.map().center());
60400                       var edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
60401                       context.map().center(edge.loc);
60402                   }
60403                   context.enter(modeSelect(context, [d.entity.id]));
60404               } else {
60405                   context.zoomToEntity(d.id);
60406               }
60407           }
60408
60409
60410           function geocoderSearch() {
60411               services.geocoder.search(search.property('value'), function (err, resp) {
60412                   _geocodeResults = resp || [];
60413                   drawList();
60414               });
60415           }
60416       }
60417
60418
60419       return featureList;
60420   }
60421
60422   function uiPresetIcon() {
60423       var preset, geometry;
60424
60425
60426       function presetIcon(selection$$1) {
60427           selection$$1.each(render);
60428       }
60429
60430
60431       function getIcon(p, geom) {
60432           if (p.icon)
60433               return p.icon;
60434           else if (geom === 'line')
60435               return 'other-line';
60436           else if (geom === 'vertex')
60437               return p.isFallback() ? '' : 'poi-vertex';
60438           else
60439               return 'marker-stroked';
60440       }
60441
60442
60443       function render() {
60444           var selection$$1 = d3_select(this),
60445               p = preset.apply(this, arguments),
60446               geom = geometry.apply(this, arguments),
60447               picon = getIcon(p, geom),
60448               isPoi = picon.match(/^poi-/) !== null,
60449               isMaki = dataFeatureIcons.indexOf(picon) !== -1,
60450               isFramed = (geom === 'area' || geom === 'verex');
60451
60452
60453           function tag_classes(p) {
60454               var s = '';
60455               for (var i in p.tags) {
60456                   s += ' tag-' + i;
60457                   if (p.tags[i] !== '*') {
60458                       s += ' tag-' + i + '-' + p.tags[i];
60459                   }
60460               }
60461               return s;
60462           }
60463
60464
60465           var fill = selection$$1.selectAll('.preset-icon-fill')
60466               .data([0]);
60467
60468           fill = fill.enter()
60469               .append('div')
60470               .merge(fill);
60471
60472           fill
60473               .attr('class', function() {
60474                   return 'preset-icon-fill preset-icon-fill-' + geom + tag_classes(p);
60475               });
60476
60477
60478           var areaFrame = selection$$1.selectAll('.preset-icon-frame')
60479               .data((geom === 'area') ? [0] : []);
60480
60481           areaFrame.exit()
60482               .remove();
60483
60484           areaFrame = areaFrame.enter()
60485               .append('div')
60486               .attr('class', 'preset-icon-frame')
60487               .call(svgIcon('#preset-icon-frame'));
60488
60489
60490           var icon = selection$$1.selectAll('.preset-icon')
60491               .data([0]);
60492
60493           icon = icon.enter()
60494               .append('div')
60495               .attr('class', 'preset-icon')
60496               .call(svgIcon(''))
60497               .merge(icon);
60498
60499           icon
60500               .attr('class', 'preset-icon preset-icon-' +
60501                   ((isMaki || isPoi) ? (isFramed ? '24' : '28') : (isFramed ? '44' : '60'))
60502               );
60503
60504           icon.selectAll('svg')
60505               .attr('class', function() {
60506                   return 'icon ' + picon + (isMaki || isPoi ? '' : tag_classes(p));
60507               });
60508
60509           icon.selectAll('use')
60510               .attr('href', '#' + picon + (isMaki ? '-15' : ''));
60511       }
60512
60513
60514       presetIcon.preset = function(_) {
60515           if (!arguments.length) return preset;
60516           preset = utilFunctor(_);
60517           return presetIcon;
60518       };
60519
60520
60521       presetIcon.geometry = function(_) {
60522           if (!arguments.length) return geometry;
60523           geometry = utilFunctor(_);
60524           return presetIcon;
60525       };
60526
60527       return presetIcon;
60528   }
60529
60530   function d3combobox() {
60531       var dispatch$$1 = dispatch('accept');
60532       var _container = d3_select(document.body);
60533       var _data = [];
60534       var _suggestions = [];
60535       var _minItems = 2;
60536       var _caseSensitive = false;
60537
60538       var _fetcher = function(val, cb) {
60539           cb(_data.filter(function(d) {
60540               return d.value
60541                   .toString()
60542                   .toLowerCase()
60543                   .indexOf(val.toLowerCase()) !== -1;
60544           }));
60545       };
60546
60547       var combobox = function(input, attachTo) {
60548           var idx = -1;
60549           var wrapper = _container
60550               .selectAll('div.combobox')
60551               .filter(function(d) { return d === input.node(); });
60552           var shown = !wrapper.empty();
60553           var tagName = input.node() ? input.node().tagName.toLowerCase() : '';
60554
60555           input
60556               .classed('combobox-input', true)
60557               .on('focus.typeahead', focus)
60558               .on('blur.typeahead', blur)
60559               .on('keydown.typeahead', keydown)
60560               .on('keyup.typeahead', keyup)
60561               .on('input.typeahead', change)
60562               .each(function() {
60563                   var parent = this.parentNode;
60564                   var sibling = this.nextSibling;
60565
60566                   var caret = d3_select(parent).selectAll('.combobox-caret')
60567                       .filter(function(d) { return d === input.node(); })
60568                       .data([input.node()]);
60569
60570                   caret = caret.enter()
60571                       .insert('div', function() { return sibling; })
60572                       .attr('class', 'combobox-caret')
60573                       .merge(caret);
60574
60575                   caret
60576                       .on('mousedown', function () {
60577                           // prevent the form element from blurring. it blurs
60578                           // on mousedown
60579                           event.stopPropagation();
60580                           event.preventDefault();
60581                           if (!shown) {
60582                               input.node().focus();
60583                               fetch('', render);
60584                           } else {
60585                               hide();
60586                           }
60587                       });
60588               });
60589
60590           function focus() {
60591               fetch(value(), render);
60592           }
60593
60594           function blur() {
60595               window.setTimeout(hide, 150);
60596           }
60597
60598           function show() {
60599               if (!shown) {
60600                   wrapper = _container
60601                       .insert('div', ':first-child')
60602                       .datum(input.node())
60603                       .attr('class', 'combobox')
60604                       .style('position', 'absolute')
60605                       .style('display', 'block')
60606                       .style('left', '0px')
60607                       .on('mousedown', function () {
60608                           // prevent moving focus out of the text field
60609                           event.preventDefault();
60610                       });
60611
60612                   d3_select('body')
60613                       .on('scroll.combobox', render, true);
60614
60615                   shown = true;
60616               }
60617           }
60618
60619           function hide() {
60620               if (shown) {
60621                   idx = -1;
60622                   wrapper.remove();
60623
60624                   d3_select('body')
60625                       .on('scroll.combobox', null);
60626
60627                   shown = false;
60628               }
60629           }
60630
60631           function keydown() {
60632              switch (event.keyCode) {
60633                  // backspace, delete
60634                  case 8:
60635                  case 46:
60636                      input.on('input.typeahead', function() {
60637                          idx = -1;
60638                          render();
60639                          var start = input.property('selectionStart');
60640                          input.node().setSelectionRange(start, start);
60641                          input.on('input.typeahead', change);
60642                      });
60643                      break;
60644                  // tab
60645                  case 9:
60646                      wrapper.selectAll('a.selected').each(function (d) {
60647                          dispatch$$1.call('accept', this, d);
60648                      });
60649                      hide();
60650                      break;
60651                  // return
60652                  case 13:
60653                      event.preventDefault();
60654                      break;
60655                  // up arrow
60656                  case 38:
60657                      if (tagName === 'textarea' && !shown) return;
60658                      nav(-1);
60659                      event.preventDefault();
60660                      break;
60661                  // down arrow
60662                  case 40:
60663                      if (tagName === 'textarea' && !shown) return;
60664                      nav(+1);
60665                      event.preventDefault();
60666                      break;
60667              }
60668              event.stopPropagation();
60669           }
60670
60671           function keyup() {
60672               switch (event.keyCode) {
60673                   // escape
60674                   case 27:
60675                       hide();
60676                       break;
60677                   // return
60678                   case 13:
60679                       wrapper.selectAll('a.selected').each(function (d) {
60680                          dispatch$$1.call('accept', this, d);
60681                       });
60682                       hide();
60683                       break;
60684               }
60685           }
60686
60687           function change() {
60688               fetch(value(), function() {
60689                   if (input.property('selectionEnd') === input.property('value').length) {
60690                       autocomplete();
60691                   }
60692                   render();
60693               });
60694           }
60695
60696           function nav(dir) {
60697               if (!_suggestions.length) return;
60698               idx = Math.max(Math.min(idx + dir, _suggestions.length - 1), 0);
60699               input.property('value', _suggestions[idx].value);
60700               render();
60701               ensureVisible();
60702           }
60703
60704           function value() {
60705               var value = input.property('value');
60706               var start = input.property('selectionStart');
60707               var end = input.property('selectionEnd');
60708
60709               if (start && end) {
60710                   value = value.substring(0, start);
60711               }
60712
60713               return value;
60714           }
60715
60716           function fetch(v, cb) {
60717               _fetcher.call(input, v, function(_) {
60718                   _suggestions = _;
60719                   cb();
60720               });
60721           }
60722
60723           function autocomplete() {
60724               var v = _caseSensitive ? value() : value().toLowerCase();
60725               idx = -1;
60726               if (!v) return;
60727
60728               // Don't autocomplete if user is typing a number - #4935
60729               if (!isNaN(parseFloat(v)) && isFinite(v)) return;
60730
60731               var best = -1;
60732               var suggestion, compare;
60733
60734               for (var i = 0; i < _suggestions.length; i++) {
60735                   suggestion = _suggestions[i].value;
60736                   compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
60737
60738                   // if search string matches suggestion exactly, pick it..
60739                   if (compare === v) {
60740                       best = i;
60741                       break;
60742
60743                   // otherwise lock in the first result that starts with the search string..
60744                   } else if (best === -1 && compare.indexOf(v) === 0) {
60745                       best = i;
60746                   }
60747               }
60748
60749               if (best !== -1) {
60750                   idx = best;
60751                   suggestion = _suggestions[best].value;
60752                   input.property('value', suggestion);
60753                   input.node().setSelectionRange(v.length, suggestion.length);
60754               }
60755           }
60756
60757           function render() {
60758               if (_suggestions.length >= _minItems && document.activeElement === input.node()) {
60759                   show();
60760               } else {
60761                   hide();
60762                   return;
60763               }
60764
60765               var options = wrapper
60766                   .selectAll('a.combobox-option')
60767                   .data(_suggestions, function(d) { return d.value; });
60768
60769               options.exit()
60770                   .remove();
60771
60772               options.enter()
60773                   .append('a')
60774                   .attr('class', 'combobox-option')
60775                   .text(function(d) { return d.value; })
60776                   .merge(options)
60777                   .attr('title', function(d) { return d.title; })
60778                   .classed('selected', function(d, i) { return i === idx; })
60779                   .on('mouseover', select$$1)
60780                   .on('click', accept)
60781                   .order();
60782
60783
60784               var node = attachTo ? attachTo.node() : input.node();
60785               var rect = node.getBoundingClientRect();
60786
60787               wrapper
60788                   .style('left', (rect.left + 5) + 'px')
60789                   .style('width', (rect.width - 10) + 'px')
60790                   .style('top', rect.height + rect.top + 'px');
60791           }
60792
60793           function select$$1(d, i) {
60794               idx = i;
60795               render();
60796           }
60797
60798           function ensureVisible() {
60799               var node = wrapper.selectAll('a.selected').node();
60800               if (node) node.scrollIntoView();
60801           }
60802
60803           function accept(d) {
60804               if (!shown) return;
60805               input.property('value', d.value);
60806               utilTriggerEvent(input, 'change');
60807               dispatch$$1.call('accept', this, d);
60808               hide();
60809           }
60810       };
60811
60812       combobox.fetcher = function(_) {
60813           if (!arguments.length) return _fetcher;
60814           _fetcher = _;
60815           return combobox;
60816       };
60817
60818       combobox.data = function(_) {
60819           if (!arguments.length) return _data;
60820           _data = _;
60821           return combobox;
60822       };
60823
60824       combobox.minItems = function(_) {
60825           if (!arguments.length) return _minItems;
60826           _minItems = _;
60827           return combobox;
60828       };
60829
60830       combobox.caseSensitive = function(_) {
60831           if (!arguments.length) return _caseSensitive;
60832           _caseSensitive = _;
60833           return combobox;
60834       };
60835
60836       combobox.container = function(_) {
60837           if (!arguments.length) return _container;
60838           _container = _;
60839           return combobox;
60840       };
60841
60842       return utilRebind(combobox, dispatch$$1, 'on');
60843   }
60844
60845
60846   d3combobox.off = function(input) {
60847       input
60848           .on('focus.typeahead', null)
60849           .on('blur.typeahead', null)
60850           .on('keydown.typeahead', null)
60851           .on('keyup.typeahead', null)
60852           .on('input.typeahead', null)
60853           .each(function() {
60854               d3_select(this.parentNode).selectAll('.combobox-caret')
60855                   .filter(function(d) { return d === input.node(); })
60856                   .on('mousedown', null);
60857           });
60858
60859       d3_select('body')
60860           .on('scroll.combobox', null);
60861   };
60862
60863   function uiRawMemberEditor(context) {
60864       var taginfo = services.taginfo,
60865           _entityID;
60866
60867
60868       function selectMember(d) {
60869           event.preventDefault();
60870           context.enter(modeSelect(context, [d.id]));
60871       }
60872
60873
60874       function changeRole(d) {
60875           var role = d3_select(this).property('value');
60876           var member = { id: d.id, type: d.type, role: role };
60877           context.perform(
60878               actionChangeMember(d.relation.id, member, d.index),
60879               t('operations.change_role.annotation')
60880           );
60881       }
60882
60883
60884       function deleteMember(d) {
60885           context.perform(
60886               actionDeleteMember(d.relation.id, d.index),
60887               t('operations.delete_member.annotation')
60888           );
60889
60890           if (!context.hasEntity(d.relation.id)) {
60891               context.enter(modeBrowse(context));
60892           }
60893       }
60894
60895
60896       function rawMemberEditor(selection$$1) {
60897           var entity = context.entity(_entityID),
60898               memberships = [];
60899
60900           entity.members.slice(0, 1000).forEach(function(member, index) {
60901               memberships.push({
60902                   index: index,
60903                   id: member.id,
60904                   type: member.type,
60905                   role: member.role,
60906                   relation: entity,
60907                   member: context.hasEntity(member.id)
60908               });
60909           });
60910
60911           var gt = entity.members.length > 1000 ? '>' : '';
60912           selection$$1.call(uiDisclosure(context, 'raw_member_editor', true)
60913               .title(t('inspector.all_members') + ' (' + gt + memberships.length + ')')
60914               .expanded(true)
60915               .updatePreference(false)
60916               .on('toggled', function(expanded) {
60917                   if (expanded) { selection$$1.node().parentNode.scrollTop += 200; }
60918               })
60919               .content(content)
60920           );
60921
60922
60923           function content(wrap) {
60924               var list = wrap.selectAll('.member-list')
60925                   .data([0]);
60926
60927               list = list.enter()
60928                   .append('ul')
60929                   .attr('class', 'member-list')
60930                   .merge(list);
60931
60932
60933               var items = list.selectAll('li')
60934                   .data(memberships, function(d) {
60935                       return osmEntity$$1.key(d.relation) + ',' + d.index + ',' +
60936                           (d.member ? osmEntity$$1.key(d.member) : 'incomplete');
60937                   });
60938
60939               items.exit()
60940                   .each(unbind)
60941                   .remove();
60942
60943               var enter = items.enter()
60944                   .append('li')
60945                   .attr('class', 'member-row form-field')
60946                   .classed('member-incomplete', function(d) { return !d.member; });
60947
60948               enter
60949                   .each(function(d) {
60950                       if (d.member) {
60951                           var label = d3_select(this).append('label')
60952                               .attr('class', 'form-label')
60953                               .append('a')
60954                               .attr('href', '#')
60955                               .on('click', selectMember);
60956
60957                           label.append('span')
60958                               .attr('class', 'member-entity-type')
60959                               .text(function(d) {
60960                                   var matched = context.presets().match(d.member, context.graph());
60961                                   return (matched && matched.name()) || utilDisplayType(d.member.id);
60962                               });
60963
60964                           label.append('span')
60965                               .attr('class', 'member-entity-name')
60966                               .text(function(d) { return utilDisplayName(d.member); });
60967
60968                       } else {
60969                           d3_select(this).append('label')
60970                               .attr('class', 'form-label')
60971                               .text(t('inspector.incomplete', { id: d.id }));
60972                       }
60973                   });
60974
60975               enter
60976                   .append('input')
60977                   .attr('class', 'member-role')
60978                   .property('type', 'text')
60979                   .attr('maxlength', 255)
60980                   .attr('placeholder', t('inspector.role'))
60981                   .call(utilNoAuto)
60982                   .property('value', function(d) { return d.role; })
60983                   .on('change', changeRole);
60984
60985               enter
60986                   .append('button')
60987                   .attr('tabindex', -1)
60988                   .attr('class', 'remove button-input-action member-delete minor')
60989                   .on('click', deleteMember)
60990                   .call(svgIcon('#operation-delete'));
60991
60992               if (taginfo) {
60993                   enter.each(bindTypeahead);
60994               }
60995
60996
60997               function bindTypeahead(d) {
60998                   var row = d3_select(this),
60999                       role = row.selectAll('input.member-role');
61000
61001                   function sort(value, data) {
61002                       var sameletter = [],
61003                           other = [];
61004                       for (var i = 0; i < data.length; i++) {
61005                           if (data[i].value.substring(0, value.length) === value) {
61006                               sameletter.push(data[i]);
61007                           } else {
61008                               other.push(data[i]);
61009                           }
61010                       }
61011                       return sameletter.concat(other);
61012                   }
61013
61014                   role.call(d3combobox()
61015                       .container(context.container())
61016                       .fetcher(function(role, callback) {
61017                           var rtype = entity.tags.type;
61018                           taginfo.roles({
61019                               debounce: true,
61020                               rtype: rtype || '',
61021                               geometry: context.geometry(d.member.id),
61022                               query: role
61023                           }, function(err, data) {
61024                               if (!err) callback(sort(role, data));
61025                           });
61026                       }));
61027               }
61028
61029
61030               function unbind() {
61031                   var row = d3_select(this);
61032
61033                   row.selectAll('input.member-role')
61034                       .call(d3combobox.off);
61035               }
61036           }
61037       }
61038
61039
61040       rawMemberEditor.entityID = function(_) {
61041           if (!arguments.length) return _entityID;
61042           _entityID = _;
61043           return rawMemberEditor;
61044       };
61045
61046
61047       return rawMemberEditor;
61048   }
61049
61050   function uiRawMembershipEditor(context) {
61051       var taginfo = services.taginfo,
61052           _entityID,
61053           _showBlank;
61054
61055
61056       function selectRelation(d) {
61057           event.preventDefault();
61058           context.enter(modeSelect(context, [d.relation.id]));
61059       }
61060
61061
61062       function changeRole(d) {
61063           var role = d3_select(this).property('value');
61064           context.perform(
61065               actionChangeMember(d.relation.id, assignIn({}, d.member, { role: role }), d.index),
61066               t('operations.change_role.annotation')
61067           );
61068       }
61069
61070
61071       function addMembership(d, role) {
61072           _showBlank = false;
61073
61074           var member = { id: _entityID, type: context.entity(_entityID).type, role: role };
61075
61076           if (d.relation) {
61077               context.perform(
61078                   actionAddMember(d.relation.id, member),
61079                   t('operations.add_member.annotation')
61080               );
61081
61082           } else {
61083               var relation = osmRelation();
61084               context.perform(
61085                   actionAddEntity(relation),
61086                   actionAddMember(relation.id, member),
61087                   t('operations.add.annotation.relation')
61088               );
61089
61090               context.enter(modeSelect(context, [relation.id]));
61091           }
61092       }
61093
61094
61095       function deleteMembership(d) {
61096           context.perform(
61097               actionDeleteMember(d.relation.id, d.index),
61098               t('operations.delete_member.annotation')
61099           );
61100       }
61101
61102
61103       function relations(q) {
61104           var newRelation = { relation: null, value: t('inspector.new_relation') };
61105           var result = [];
61106           var graph = context.graph();
61107
61108           context.intersects(context.extent()).forEach(function(entity) {
61109               if (entity.type !== 'relation' || entity.id === _entityID)
61110                   return;
61111
61112               var matched = context.presets().match(entity, graph),
61113                   presetName = (matched && matched.name()) || t('inspector.relation'),
61114                   entityName = utilDisplayName(entity) || '';
61115
61116               var value = presetName + ' ' + entityName;
61117               if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1)
61118                   return;
61119
61120               result.push({ relation: entity, value: value });
61121           });
61122
61123           result.sort(function(a, b) {
61124               return osmRelation.creationOrder(a.relation, b.relation);
61125           });
61126
61127           // Dedupe identical names by appending relation id - see #2891
61128           var dupeGroups = filter(
61129               groupBy(result, 'value'),
61130               function(v) { return v.length > 1; }
61131           );
61132
61133           dupeGroups.forEach(function(group) {
61134               group.forEach(function(obj) {
61135                   obj.value += ' ' + obj.relation.id;
61136               });
61137           });
61138
61139           forEach(result, function(obj) {
61140               obj.title = obj.value;
61141           });
61142
61143           result.unshift(newRelation);
61144           return result;
61145       }
61146
61147
61148       function rawMembershipEditor(selection$$1) {
61149           var entity = context.entity(_entityID),
61150               parents = context.graph().parentRelations(entity),
61151               memberships = [];
61152
61153           parents.slice(0, 1000).forEach(function(relation) {
61154               relation.members.forEach(function(member, index) {
61155                   if (member.id === entity.id) {
61156                       memberships.push({ relation: relation, member: member, index: index });
61157                   }
61158               });
61159           });
61160
61161           var gt = parents.length > 1000 ? '>' : '';
61162           selection$$1.call(uiDisclosure(context, 'raw_membership_editor', true)
61163               .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
61164               .expanded(true)
61165               .updatePreference(false)
61166               .on('toggled', function(expanded) {
61167                   if (expanded) { selection$$1.node().parentNode.scrollTop += 200; }
61168               })
61169               .content(content)
61170           );
61171
61172
61173           function content(wrap) {
61174               var list = wrap.selectAll('.member-list')
61175                   .data([0]);
61176
61177               list = list.enter()
61178                   .append('ul')
61179                   .attr('class', 'member-list')
61180                   .merge(list);
61181
61182
61183               var items = list.selectAll('li.member-row-normal')
61184                   .data(memberships, function(d) {
61185                       return osmEntity$$1.key(d.relation) + ',' + d.index;
61186                   });
61187
61188               items.exit()
61189                   .each(unbind)
61190                   .remove();
61191
61192               var enter = items.enter()
61193                   .append('li')
61194                   .attr('class', 'member-row member-row-normal form-field');
61195
61196               var label = enter
61197                   .append('label')
61198                   .attr('class', 'form-label')
61199                   .append('a')
61200                   .attr('href', '#')
61201                   .on('click', selectRelation);
61202
61203               label
61204                   .append('span')
61205                   .attr('class', 'member-entity-type')
61206                   .text(function(d) {
61207                       var matched = context.presets().match(d.relation, context.graph());
61208                       return (matched && matched.name()) || t('inspector.relation');
61209                   });
61210
61211               label
61212                   .append('span')
61213                   .attr('class', 'member-entity-name')
61214                   .text(function(d) { return utilDisplayName(d.relation); });
61215
61216               enter
61217                   .append('input')
61218                   .attr('class', 'member-role')
61219                   .property('type', 'text')
61220                   .attr('maxlength', 255)
61221                   .attr('placeholder', t('inspector.role'))
61222                   .call(utilNoAuto)
61223                   .property('value', function(d) { return d.member.role; })
61224                   .on('change', changeRole);
61225
61226               enter
61227                   .append('button')
61228                   .attr('tabindex', -1)
61229                   .attr('class', 'remove button-input-action member-delete minor')
61230                   .on('click', deleteMembership)
61231                   .call(svgIcon('#operation-delete'));
61232
61233               if (taginfo) {
61234                   enter.each(bindTypeahead);
61235               }
61236
61237
61238               var newrow = list.selectAll('.member-row-new')
61239                   .data(_showBlank ? [0] : []);
61240
61241               newrow.exit()
61242                   .remove();
61243
61244               enter = newrow.enter()
61245                   .append('li')
61246                   .attr('class', 'member-row member-row-new form-field');
61247
61248               enter
61249                   .append('input')
61250                   .attr('type', 'text')
61251                   .attr('class', 'member-entity-input')
61252                   .call(utilNoAuto);
61253
61254               enter
61255                   .append('input')
61256                   .attr('class', 'member-role')
61257                   .property('type', 'text')
61258                   .attr('maxlength', 255)
61259                   .attr('placeholder', t('inspector.role'))
61260                   .call(utilNoAuto)
61261                   .on('change', changeRole);
61262
61263               enter
61264                   .append('button')
61265                   .attr('tabindex', -1)
61266                   .attr('class', 'remove button-input-action member-delete minor')
61267                   .on('click', deleteMembership)
61268                   .call(svgIcon('#operation-delete'));
61269
61270               newrow = newrow
61271                   .merge(enter);
61272
61273               newrow.selectAll('.member-entity-input')
61274                   .call(d3combobox()
61275                       .container(context.container())
61276                       .minItems(1)
61277                       .fetcher(function(value, callback) { callback(relations(value)); })
61278                       .on('accept', onAccept)
61279                   );
61280
61281
61282               var addrel = wrap.selectAll('.add-relation')
61283                   .data([0]);
61284
61285               addrel = addrel.enter()
61286                   .append('button')
61287                   .attr('class', 'add-relation')
61288                   .merge(addrel);
61289
61290               addrel
61291                   .call(svgIcon('#icon-plus', 'light'))
61292                   .on('click', function() {
61293                       _showBlank = true;
61294                       content(wrap);
61295                       list.selectAll('.member-entity-input').node().focus();
61296                   });
61297
61298
61299               function onAccept(d) {
61300                   var role = list.selectAll('.member-row-new .member-role').property('value');
61301                   addMembership(d, role);
61302               }
61303
61304
61305               function bindTypeahead(d) {
61306                   var row = d3_select(this),
61307                       role = row.selectAll('input.member-role');
61308
61309                   function sort(value, data) {
61310                       var sameletter = [],
61311                           other = [];
61312                       for (var i = 0; i < data.length; i++) {
61313                           if (data[i].value.substring(0, value.length) === value) {
61314                               sameletter.push(data[i]);
61315                           } else {
61316                               other.push(data[i]);
61317                           }
61318                       }
61319                       return sameletter.concat(other);
61320                   }
61321
61322                   role.call(d3combobox()
61323                       .container(context.container())
61324                       .fetcher(function(role, callback) {
61325                           var rtype = d.relation.tags.type;
61326                           taginfo.roles({
61327                               debounce: true,
61328                               rtype: rtype || '',
61329                               geometry: context.geometry(_entityID),
61330                               query: role
61331                           }, function(err, data) {
61332                               if (!err) callback(sort(role, data));
61333                           });
61334                       }));
61335               }
61336
61337
61338               function unbind() {
61339                   var row = d3_select(this);
61340
61341                   row.selectAll('input.member-role')
61342                       .call(d3combobox.off);
61343               }
61344           }
61345       }
61346
61347
61348       rawMembershipEditor.entityID = function(_) {
61349           if (!arguments.length) return _entityID;
61350           _entityID = _;
61351           return rawMembershipEditor;
61352       };
61353
61354
61355       return rawMembershipEditor;
61356   }
61357
61358   function uiTagReference(tag) {
61359       var taginfo = services.taginfo;
61360       var tagReference = {};
61361
61362       var _button = d3_select(null);
61363       var _body = d3_select(null);
61364       var _loaded;
61365       var _showing;
61366
61367
61368       function findLocal(data) {
61369           var locale = utilDetect().locale.toLowerCase();
61370           var localized;
61371
61372           if (locale !== 'pt-br') {  // see #3776, prefer 'pt' over 'pt-br'
61373               localized = find$1(data, function(d) {
61374                   return d.lang.toLowerCase() === locale;
61375               });
61376               if (localized) return localized;
61377           }
61378
61379           // try the non-regional version of a language, like
61380           // 'en' if the language is 'en-US'
61381           if (locale.indexOf('-') !== -1) {
61382               var first = locale.split('-')[0];
61383               localized = find$1(data, function(d) {
61384                   return d.lang.toLowerCase() === first;
61385               });
61386               if (localized) return localized;
61387           }
61388
61389           // finally fall back to english
61390           return find$1(data, function(d) {
61391               return d.lang.toLowerCase() === 'en';
61392           });
61393       }
61394
61395
61396       function load(param) {
61397           if (!taginfo) return;
61398
61399           _button
61400               .classed('tag-reference-loading', true);
61401
61402           taginfo.docs(param, function show(err, data) {
61403               var docs;
61404               if (!err && data) {
61405                   docs = findLocal(data);
61406               }
61407
61408               _body.html('');
61409
61410               if (!docs || !docs.title) {
61411                   if (param.hasOwnProperty('value')) {
61412                       load(omit(param, 'value'));   // retry with key only
61413                   } else {
61414                       _body
61415                           .append('p')
61416                           .attr('class', 'tag-reference-description')
61417                           .text(t('inspector.no_documentation_key'));
61418                       done();
61419                   }
61420                   return;
61421               }
61422
61423               if (docs.image && docs.image.thumb_url_prefix) {
61424                   _body
61425                       .append('img')
61426                       .attr('class', 'tag-reference-wiki-image')
61427                       .attr('src', docs.image.thumb_url_prefix + '100' + docs.image.thumb_url_suffix)
61428                       .on('load', function() { done(); })
61429                       .on('error', function() { d3_select(this).remove(); done(); });
61430               } else {
61431                   done();
61432               }
61433
61434               _body
61435                   .append('p')
61436                   .attr('class', 'tag-reference-description')
61437                   .text(docs.description || t('inspector.documentation_redirect'));
61438
61439               _body
61440                   .append('a')
61441                   .attr('class', 'tag-reference-link')
61442                   .attr('target', '_blank')
61443                   .attr('tabindex', -1)
61444                   .attr('href', 'https://wiki.openstreetmap.org/wiki/' + docs.title)
61445                   .call(svgIcon('#icon-out-link', 'inline'))
61446                   .append('span')
61447                   .text(t('inspector.reference'));
61448
61449               // Add link to info about "good changeset comments" - #2923
61450               if (param.key === 'comment') {
61451                   _body
61452                       .append('a')
61453                       .attr('class', 'tag-reference-comment-link')
61454                       .attr('target', '_blank')
61455                       .attr('tabindex', -1)
61456                       .call(svgIcon('#icon-out-link', 'inline'))
61457                       .attr('href', t('commit.about_changeset_comments_link'))
61458                       .append('span')
61459                       .text(t('commit.about_changeset_comments'));
61460               }
61461           });
61462       }
61463
61464
61465       function done() {
61466           _loaded = true;
61467
61468           _button
61469               .classed('tag-reference-loading', false);
61470
61471           _body
61472               .classed('expanded', true)
61473               .transition()
61474               .duration(200)
61475               .style('max-height', '200px')
61476               .style('opacity', '1');
61477
61478           _showing = true;
61479       }
61480
61481
61482       function hide() {
61483           _body
61484               .transition()
61485               .duration(200)
61486               .style('max-height', '0px')
61487               .style('opacity', '0')
61488               .on('end', function () {
61489                   _body.classed('expanded', false);
61490               });
61491
61492           _showing = false;
61493       }
61494
61495
61496       tagReference.button = function(selection$$1) {
61497           _button = selection$$1.selectAll('.tag-reference-button')
61498               .data([0]);
61499
61500           _button = _button.enter()
61501               .append('button')
61502               .attr('class', 'tag-reference-button')
61503               .attr('title', t('icons.information'))
61504               .attr('tabindex', -1)
61505               .call(svgIcon('#icon-inspect'))
61506               .merge(_button);
61507
61508           _button
61509               .on('click', function () {
61510                   event.stopPropagation();
61511                   event.preventDefault();
61512                   if (_showing) {
61513                       hide();
61514                   } else if (_loaded) {
61515                       done();
61516                   } else {
61517                       load(tag);
61518                   }
61519               });
61520       };
61521
61522
61523       tagReference.body = function(selection$$1) {
61524           var tagid = tag.rtype || (tag.key + '-' + tag.value);
61525           _body = selection$$1.selectAll('.tag-reference-body')
61526               .data([tagid], function(d) { return d; });
61527
61528           _body.exit()
61529               .remove();
61530
61531           _body = _body.enter()
61532               .append('div')
61533               .attr('class', 'tag-reference-body cf')
61534               .style('max-height', '0')
61535               .style('opacity', '0')
61536               .merge(_body);
61537
61538           if (_showing === false) {
61539               hide();
61540           }
61541       };
61542
61543
61544       tagReference.showing = function(_) {
61545           if (!arguments.length) return _showing;
61546           _showing = _;
61547           return tagReference;
61548       };
61549
61550
61551       return tagReference;
61552   }
61553
61554   function uiRawTagEditor(context) {
61555       var taginfo = services.taginfo,
61556           dispatch$$1 = dispatch('change'),
61557           _readOnlyTags = [],
61558           _showBlank = false,
61559           _updatePreference = true,
61560           _expanded = false,
61561           _newRow,
61562           _state,
61563           _preset,
61564           _tags,
61565           _entityID;
61566
61567
61568       function rawTagEditor(selection$$1) {
61569           var count = Object.keys(_tags).filter(function(d) { return d; }).length;
61570
61571           var disclosure = uiDisclosure(context, 'raw_tag_editor', false)
61572               .title(t('inspector.all_tags') + ' (' + count + ')')
61573               .on('toggled', toggled)
61574               .updatePreference(_updatePreference)
61575               .content(content);
61576
61577           // Sometimes we want to force the raw_tag_editor to be opened/closed..
61578           // When undefined, uiDisclosure will use the user's stored preference.
61579           if (_expanded !== undefined) {
61580               disclosure.expanded(_expanded);
61581           }
61582
61583           selection$$1.call(disclosure);
61584
61585           function toggled(expanded) {
61586               _expanded = expanded;
61587               if (expanded) {
61588                   selection$$1.node().parentNode.scrollTop += 200;
61589               }
61590           }
61591       }
61592
61593
61594       function content(wrap) {
61595           var entries = map$3(_tags, function(v, k) {
61596               return { key: k, value: v };
61597           });
61598
61599           if (!entries.length || _showBlank) {
61600               _showBlank = false;
61601               entries.push({key: '', value: ''});
61602               _newRow = '';
61603           }
61604
61605           var list = wrap.selectAll('.tag-list')
61606               .data([0]);
61607
61608           list = list.enter()
61609               .append('ul')
61610               .attr('class', 'tag-list')
61611               .merge(list);
61612
61613           var newTag = wrap.selectAll('.add-tag')
61614               .data([0]);
61615
61616           newTag.enter()
61617               .append('button')
61618               .attr('class', 'add-tag')
61619               .on('click', addTag)
61620               .call(svgIcon('#icon-plus', 'light'));
61621
61622
61623           var items = list.selectAll('.tag-row')
61624               .data(entries, function(d) { return d.key; });
61625
61626           items.exit()
61627               .each(unbind)
61628               .remove();
61629
61630           // Enter
61631
61632           var enter = items.enter()
61633               .append('li')
61634               .attr('class', 'tag-row cf')
61635               .classed('readonly', isReadOnly);
61636
61637           enter
61638               .append('div')
61639               .attr('class', 'key-wrap')
61640               .append('input')
61641               .property('type', 'text')
61642               .attr('class', 'key')
61643               .attr('maxlength', 255)
61644               .call(utilNoAuto)
61645               .on('blur', keyChange)
61646               .on('change', keyChange);
61647
61648           enter
61649               .append('div')
61650               .attr('class', 'input-wrap-position')
61651               .append('input')
61652               .property('type', 'text')
61653               .attr('class', 'value')
61654               .attr('maxlength', 255)
61655               .call(utilNoAuto)
61656               .on('blur', valueChange)
61657               .on('change', valueChange)
61658               .on('keydown.push-more', pushMore);
61659
61660           enter
61661               .append('button')
61662               .attr('tabindex', -1)
61663               .attr('class', 'remove minor')
61664               .call(svgIcon('#operation-delete'));
61665
61666
61667           // Update
61668
61669           items = items
61670               .merge(enter)
61671               .sort(function(a, b) {
61672                   return (a.key === _newRow && b.key !== _newRow) ? 1
61673                       : (a.key !== _newRow && b.key === _newRow) ? -1
61674                       : d3_ascending(a.key, b.key);
61675               });
61676
61677           items
61678               .each(function(tag) {
61679                   var row = d3_select(this),
61680                       key = row.select('input.key'),      // propagate bound data to child
61681                       value = row.select('input.value');  // propagate bound data to child
61682
61683                   if (_entityID && taginfo) {
61684                       bindTypeahead(key, value);
61685                   }
61686
61687                   var isRelation = (_entityID && context.entity(_entityID).type === 'relation'),
61688                       reference;
61689
61690                   if (isRelation && tag.key === 'type') {
61691                       reference = uiTagReference({ rtype: tag.value }, context);
61692                   } else {
61693                       reference = uiTagReference({ key: tag.key, value: tag.value }, context);
61694                   }
61695
61696                   if (_state === 'hover') {
61697                       reference.showing(false);
61698                   }
61699
61700                   row
61701                       .call(reference.button)
61702                       .call(reference.body);
61703               });
61704
61705           items.selectAll('input.key')
61706               .attr('title', function(d) { return d.key; })
61707               .call(utilGetSetValue, function(d) { return d.key; })
61708               .property('disabled', isReadOnly);
61709
61710           items.selectAll('input.value')
61711               .attr('title', function(d) { return d.value; })
61712               .call(utilGetSetValue, function(d) { return d.value; })
61713               .property('disabled', isReadOnly);
61714
61715           items.selectAll('button.remove')
61716               .on('click', removeTag);
61717
61718
61719
61720           function isReadOnly(d) {
61721               for (var i = 0; i < _readOnlyTags.length; i++) {
61722                   if (d.key.match(_readOnlyTags[i]) !== null) {
61723                       return true;
61724                   }
61725               }
61726               return false;
61727           }
61728
61729
61730           function pushMore() {
61731               if (event.keyCode === 9 && !event.shiftKey &&
61732                   list.selectAll('li:last-child input.value').node() === this) {
61733                   addTag();
61734               }
61735           }
61736
61737
61738           function bindTypeahead(key, value) {
61739               if (isReadOnly({ key: key })) return;
61740               var geometry = context.geometry(_entityID);
61741
61742               key.call(d3combobox()
61743                   .container(context.container())
61744                   .fetcher(function(value, callback) {
61745                       taginfo.keys({
61746                           debounce: true,
61747                           geometry: geometry,
61748                           query: value
61749                       }, function(err, data) {
61750                           if (!err) callback(sort(value, data));
61751                       });
61752                   }));
61753
61754               value.call(d3combobox()
61755                   .container(context.container())
61756                   .fetcher(function(value, callback) {
61757                       taginfo.values({
61758                           debounce: true,
61759                           key: utilGetSetValue(key),
61760                           geometry: geometry,
61761                           query: value
61762                       }, function(err, data) {
61763                           if (!err) callback(sort(value, data));
61764                       });
61765                   }));
61766
61767
61768               function sort(value, data) {
61769                   var sameletter = [],
61770                       other = [];
61771                   for (var i = 0; i < data.length; i++) {
61772                       if (data[i].value.substring(0, value.length) === value) {
61773                           sameletter.push(data[i]);
61774                       } else {
61775                           other.push(data[i]);
61776                       }
61777                   }
61778                   return sameletter.concat(other);
61779               }
61780           }
61781
61782
61783           function unbind() {
61784               var row = d3_select(this);
61785
61786               row.selectAll('input.key')
61787                   .call(d3combobox.off);
61788
61789               row.selectAll('input.value')
61790                   .call(d3combobox.off);
61791           }
61792
61793
61794           function keyChange(d) {
61795               var kOld = d.key,
61796                   kNew = this.value.trim(),
61797                   tag = {};
61798
61799
61800               if (isReadOnly({ key: kNew })) {
61801                   this.value = kOld;
61802                   return;
61803               }
61804
61805               if (kNew && kNew !== kOld) {
61806                   var match = kNew.match(/^(.*?)(?:_(\d+))?$/),
61807                       base = match[1],
61808                       suffix = +(match[2] || 1);
61809                   while (_tags[kNew]) {  // rename key if already in use
61810                       kNew = base + '_' + suffix++;
61811                   }
61812               }
61813               tag[kOld] = undefined;
61814               tag[kNew] = d.value;
61815
61816               d.key = kNew; // Maintain DOM identity through the subsequent update.
61817
61818               if (_newRow === kOld) {  // see if this row is still a new row
61819                   _newRow = ((d.value === '' || kNew === '') ? kNew : undefined);
61820               }
61821
61822               this.value = kNew;
61823               dispatch$$1.call('change', this, tag);
61824           }
61825
61826
61827           function valueChange(d) {
61828               if (isReadOnly(d)) return;
61829               var tag = {};
61830               tag[d.key] = this.value;
61831
61832               if (_newRow === d.key && d.key !== '' && d.value !== '') {   // not a new row anymore
61833                   _newRow = undefined;
61834               }
61835
61836               dispatch$$1.call('change', this, tag);
61837           }
61838
61839
61840           function removeTag(d) {
61841               if (isReadOnly(d)) return;
61842               var tag = {};
61843               tag[d.key] = undefined;
61844               dispatch$$1.call('change', this, tag);
61845               d3_select(this.parentNode).remove();
61846           }
61847
61848
61849           function addTag() {
61850               // Wrapped in a setTimeout in case it's being called from a blur
61851               // handler. Without the setTimeout, the call to `content` would
61852               // wipe out the pending value change.
61853               setTimeout(function() {
61854                   _showBlank = true;
61855                   content(wrap);
61856                   list.selectAll('li:last-child input.key').node().focus();
61857               }, 0);
61858           }
61859       }
61860
61861
61862       rawTagEditor.state = function(_) {
61863           if (!arguments.length) return _state;
61864           _state = _;
61865           return rawTagEditor;
61866       };
61867
61868
61869       rawTagEditor.preset = function(_) {
61870           if (!arguments.length) return _preset;
61871           _preset = _;
61872           if (_preset.isFallback()) {
61873               _expanded = true;
61874               _updatePreference = false;
61875           } else {
61876               _expanded = undefined;
61877               _updatePreference = true;
61878           }
61879           return rawTagEditor;
61880       };
61881
61882
61883       rawTagEditor.tags = function(_) {
61884           if (!arguments.length) return _tags;
61885           _tags = _;
61886           return rawTagEditor;
61887       };
61888
61889
61890       rawTagEditor.entityID = function(_) {
61891           if (!arguments.length) return _entityID;
61892           _entityID = _;
61893           return rawTagEditor;
61894       };
61895
61896
61897       rawTagEditor.expanded = function(_) {
61898           if (!arguments.length) return _expanded;
61899           _expanded = _;
61900           _updatePreference = false;
61901           return rawTagEditor;
61902       };
61903
61904
61905       rawTagEditor.readOnlyTags = function(_) {
61906           if (!arguments.length) return _readOnlyTags;
61907           _readOnlyTags = _;
61908           return rawTagEditor;
61909       };
61910
61911
61912       return utilRebind(rawTagEditor, dispatch$$1, 'on');
61913   }
61914
61915   // This currently only works with the 'restrictions' field
61916   // It borrows some code from uiHelp
61917
61918   function uiFieldHelp(context, fieldName) {
61919       var fieldHelp = {};
61920       var _inspector = d3_select(null);
61921       var _wrap = d3_select(null);
61922       var _body = d3_select(null);
61923
61924       var fieldHelpKeys = {
61925           restrictions: [
61926               ['about',[
61927                   'about',
61928                   'from_via_to',
61929                   'maxdist',
61930                   'maxvia'
61931               ]],
61932               ['inspecting',[
61933                   'about',
61934                   'from_shadow',
61935                   'allow_shadow',
61936                   'restrict_shadow',
61937                   'only_shadow',
61938                   'restricted',
61939                   'only'
61940               ]],
61941               ['modifying',[
61942                   'about',
61943                   'indicators',
61944                   'allow_turn',
61945                   'restrict_turn',
61946                   'only_turn'
61947               ]],
61948               ['tips',[
61949                   'simple',
61950                   'simple_example',
61951                   'indirect',
61952                   'indirect_example',
61953                   'indirect_noedit'
61954               ]]
61955           ]
61956       };
61957
61958       var fieldHelpHeadings = {};
61959
61960       var replacements = {
61961           distField: t('restriction.controls.distance'),
61962           viaField: t('restriction.controls.via'),
61963           fromShadow: icon('#turn-shadow', 'pre-text shadow from'),
61964           allowShadow: icon('#turn-shadow', 'pre-text shadow allow'),
61965           restrictShadow: icon('#turn-shadow', 'pre-text shadow restrict'),
61966           onlyShadow: icon('#turn-shadow', 'pre-text shadow only'),
61967           allowTurn: icon('#turn-yes', 'pre-text turn'),
61968           restrictTurn: icon('#turn-no', 'pre-text turn'),
61969           onlyTurn: icon('#turn-only', 'pre-text turn')
61970       };
61971
61972
61973       // For each section, squash all the texts into a single markdown document
61974       var docs = fieldHelpKeys[fieldName].map(function(key) {
61975           var helpkey = 'help.field.' + fieldName + '.' + key[0];
61976           var text = key[1].reduce(function(all, part) {
61977               var subkey = helpkey + '.' + part;
61978               var depth = fieldHelpHeadings[subkey];                     // is this subkey a heading?
61979               var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
61980               return all + hhh + t(subkey, replacements) + '\n\n';
61981           }, '');
61982
61983           return {
61984               key: helpkey,
61985               title: t(helpkey + '.title'),
61986               html: marked(text.trim())
61987           };
61988       });
61989
61990
61991       function show() {
61992           updatePosition();
61993
61994           _body
61995               .classed('hide', false)
61996               .style('opacity', '0')
61997               .transition()
61998               .duration(200)
61999               .style('opacity', '1');
62000       }
62001
62002
62003       function hide() {
62004           _body
62005               .classed('hide', true)
62006               .transition()
62007               .duration(200)
62008               .style('opacity', '0')
62009               .on('end', function () {
62010                   _body.classed('hide', true);
62011               });
62012       }
62013
62014
62015       function clickHelp(index) {
62016           var d = docs[index];
62017           var tkeys = fieldHelpKeys[fieldName][index][1];
62018
62019           _body.selectAll('.field-help-nav-item')
62020               .classed('active', function(d, i) { return i === index; });
62021
62022           var content = _body.selectAll('.field-help-content')
62023               .html(d.html);
62024
62025           // class the paragraphs so we can find and style them
62026           content.selectAll('p')
62027               .attr('class', function(d, i) { return tkeys[i]; });
62028
62029           // insert special content for certain help sections
62030           if (d.key === 'help.field.restrictions.inspecting') {
62031               content
62032                   .insert('img', 'p.from_shadow')
62033                   .attr('class', 'field-help-image cf')
62034                   .attr('src', context.imagePath('tr_inspect.gif'));
62035
62036           } else if (d.key === 'help.field.restrictions.modifying') {
62037               content
62038                   .insert('img', 'p.allow_turn')
62039                   .attr('class', 'field-help-image cf')
62040                   .attr('src', context.imagePath('tr_modify.gif'));
62041           }
62042       }
62043
62044
62045       fieldHelp.button = function(selection$$1) {
62046           if (_body.empty()) return;
62047
62048           var button = selection$$1.selectAll('.field-help-button')
62049               .data([0]);
62050
62051           // enter/update
62052           button.enter()
62053               .append('button')
62054               .attr('class', 'field-help-button')
62055               .attr('tabindex', -1)
62056               .call(svgIcon('#icon-help'))
62057               .merge(button)
62058               .on('click', function () {
62059                   event.stopPropagation();
62060                   event.preventDefault();
62061                   if (_body.classed('hide')) {
62062                       show();
62063                   } else {
62064                       hide();
62065                   }
62066               });
62067       };
62068
62069
62070       function updatePosition() {
62071           var wrap = _wrap.node();
62072           var inspector = _inspector.node();
62073           var wRect = wrap.getBoundingClientRect();
62074           var iRect = inspector.getBoundingClientRect();
62075
62076           _body
62077               .style('top', wRect.top + inspector.scrollTop - iRect.top + 'px');
62078       }
62079
62080
62081       fieldHelp.body = function(selection$$1) {
62082           // This control expects the field to have a preset-input-wrap div
62083           _wrap = selection$$1.selectAll('.preset-input-wrap');
62084           if (_wrap.empty()) return;
62085
62086           // absolute position relative to the inspector, so it "floats" above the fields
62087           _inspector = d3_select('#sidebar .entity-editor-pane .inspector-body');
62088           if (_inspector.empty()) return;
62089
62090           _body = _inspector.selectAll('.field-help-body')
62091               .data([0]);
62092
62093           var enter = _body.enter()
62094               .append('div')
62095               .attr('class', 'field-help-body hide');   // initially hidden
62096
62097           var titleEnter = enter
62098               .append('div')
62099               .attr('class', 'field-help-title cf');
62100
62101           titleEnter
62102               .append('h2')
62103               .attr('class', 'fl')
62104               .text(t('help.field.' + fieldName + '.title'));
62105
62106           titleEnter
62107               .append('button')
62108               .attr('class', 'fr close')
62109               .on('click', function() {
62110                   event.stopPropagation();
62111                   event.preventDefault();
62112                   hide();
62113               })
62114               .call(svgIcon('#icon-close'));
62115
62116           var navEnter = enter
62117               .append('div')
62118               .attr('class', 'field-help-nav cf');
62119
62120           var titles = docs.map(function(d) { return d.title; });
62121           navEnter.selectAll('.field-help-nav-item')
62122               .data(titles)
62123               .enter()
62124               .append('div')
62125               .attr('class', 'field-help-nav-item')
62126               .text(function(d) { return d; })
62127               .on('click', function(d, i) {
62128                   event.stopPropagation();
62129                   event.preventDefault();
62130                   clickHelp(i);
62131               });
62132
62133           enter
62134               .append('div')
62135               .attr('class', 'field-help-content');
62136
62137           _body = _body
62138               .merge(enter);
62139
62140           clickHelp(0);
62141       };
62142
62143
62144       return fieldHelp;
62145   }
62146
62147   function uiFieldCheck(field, context) {
62148       var dispatch$$1 = dispatch('change');
62149       var options = field.strings && field.strings.options;
62150       var values = [];
62151       var texts = [];
62152
62153       var input = d3_select(null);
62154       var text = d3_select(null);
62155       var label = d3_select(null);
62156       var reverser = d3_select(null);
62157
62158       var _impliedYes;
62159       var _entityID;
62160       var _value;
62161
62162
62163       if (options) {
62164           for (var k in options) {
62165               values.push(k === 'undefined' ? undefined : k);
62166               texts.push(field.t('options.' + k, { 'default': options[k] }));
62167           }
62168       } else {
62169           values = [undefined, 'yes'];
62170           texts = [t('inspector.unknown'), t('inspector.check.yes')];
62171           if (field.type !== 'defaultCheck') {
62172               values.push('no');
62173               texts.push(t('inspector.check.no'));
62174           }
62175       }
62176
62177
62178       // Checks tags to see whether an undefined value is "Assumed to be Yes"
62179       function checkImpliedYes() {
62180           _impliedYes = (field.id === 'oneway_yes');
62181
62182           // hack: pretend `oneway` field is a `oneway_yes` field
62183           // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
62184           if (field.id === 'oneway') {
62185               var entity = context.entity(_entityID);
62186               for (var key in entity.tags) {
62187                   if (key in osmOneWayTags && (entity.tags[key] in osmOneWayTags[key])) {
62188                       _impliedYes = true;
62189                       texts[0] = t('presets.fields.oneway_yes.options.undefined');
62190                       break;
62191                   }
62192               }
62193           }
62194       }
62195
62196
62197       function reverserHidden() {
62198           if (!d3_select('div.inspector-hover').empty()) return true;
62199           return !(_value === 'yes' || (_impliedYes && !_value));
62200       }
62201
62202
62203       function reverserSetText(selection$$1) {
62204           var entity = context.hasEntity(_entityID);
62205           if (reverserHidden() || !entity) return selection$$1;
62206
62207           var first = entity.first();
62208           var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
62209           var pseudoDirection = first < last;
62210           var icon = pseudoDirection ? '#icon-forward' : '#icon-backward';
62211
62212           selection$$1.selectAll('.reverser-span')
62213               .text(t('inspector.check.reverser'))
62214               .call(svgIcon(icon, 'inline'));
62215
62216           return selection$$1;
62217       }
62218
62219
62220       var check = function(selection$$1) {
62221           checkImpliedYes();
62222           selection$$1.classed('checkselect', 'true');
62223
62224           label = selection$$1.selectAll('.preset-input-wrap')
62225               .data([0]);
62226
62227           var enter = label.enter()
62228               .append('label')
62229               .attr('class', 'preset-input-wrap');
62230
62231           enter
62232               .append('input')
62233               .property('indeterminate', field.type !== 'defaultCheck')
62234               .attr('type', 'checkbox')
62235               .attr('id', 'preset-input-' + field.safeid);
62236
62237           enter
62238               .append('span')
62239               .text(texts[0])
62240               .attr('class', 'value');
62241
62242           if (field.type === 'onewayCheck') {
62243               enter
62244                   .append('a')
62245                   .attr('id', 'preset-input-' + field.safeid + '-reverser')
62246                   .attr('class', 'reverser button' + (reverserHidden() ? ' hide' : ''))
62247                   .attr('href', '#')
62248                   .append('span')
62249                   .attr('class', 'reverser-span');
62250           }
62251
62252           label = label.merge(enter);
62253           input = label.selectAll('input');
62254           text = label.selectAll('span.value');
62255
62256           input
62257               .on('click', function() {
62258                   event.stopPropagation();
62259                   var t$$1 = {};
62260                   t$$1[field.key] = values[(values.indexOf(_value) + 1) % values.length];
62261
62262                   // Don't cycle through `alternating` or `reversible` states - #4970
62263                   // (They are supported as translated strings, but should not toggle with clicks)
62264                   if (t$$1[field.key] === 'reversible' || t$$1[field.key] === 'alternating') {
62265                       t$$1[field.key] = values[0];
62266                   }
62267
62268                   dispatch$$1.call('change', this, t$$1);
62269               });
62270
62271           if (field.type === 'onewayCheck') {
62272               reverser = label.selectAll('.reverser');
62273
62274               reverser
62275                   .call(reverserSetText)
62276                   .on('click', function() {
62277                       event.preventDefault();
62278                       event.stopPropagation();
62279                       context.perform(
62280                           actionReverse(_entityID),
62281                           t('operations.reverse.annotation')
62282                       );
62283                       d3_select(this)
62284                           .call(reverserSetText);
62285                   });
62286           }
62287       };
62288
62289
62290       check.entity = function(_) {
62291           if (!arguments.length) return context.hasEntity(_entityID);
62292           _entityID = _.id;
62293           return check;
62294       };
62295
62296
62297       check.tags = function(tags) {
62298
62299           function isChecked(val) {
62300               return val !== 'no' && val !== '' && val !== undefined && val !== null;
62301           }
62302
62303           function textFor(val) {
62304               if (val === '') val = undefined;
62305               var index = values.indexOf(val);
62306               return (index !== -1 ? texts[index] : ('"' + val + '"'));
62307           }
62308
62309           checkImpliedYes();
62310           _value = tags[field.key] && tags[field.key].toLowerCase();
62311
62312           if (field.type === 'onewayCheck' && (_value === '1' || _value === '-1')) {
62313               _value = 'yes';
62314           }
62315
62316           input
62317               .property('indeterminate', field.type !== 'defaultCheck' && !_value)
62318               .property('checked', isChecked(_value));
62319
62320           text
62321               .text(textFor(_value));
62322
62323           label
62324               .classed('set', !!_value);
62325
62326           if (field.type === 'onewayCheck') {
62327               reverser
62328                   .classed('hide', reverserHidden())
62329                   .call(reverserSetText);
62330           }
62331       };
62332
62333
62334       check.focus = function() {
62335           input.node().focus();
62336       };
62337
62338       return utilRebind(check, dispatch$$1, 'on');
62339   }
62340
62341   /** Used for built-in method references. */
62342   var arrayProto$1 = Array.prototype;
62343
62344   /** Built-in value references. */
62345   var splice$1 = arrayProto$1.splice;
62346
62347   /**
62348    * The base implementation of `_.pullAt` without support for individual
62349    * indexes or capturing the removed elements.
62350    *
62351    * @private
62352    * @param {Array} array The array to modify.
62353    * @param {number[]} indexes The indexes of elements to remove.
62354    * @returns {Array} Returns `array`.
62355    */
62356   function basePullAt(array, indexes) {
62357     var length = array ? indexes.length : 0,
62358         lastIndex = length - 1;
62359
62360     while (length--) {
62361       var index = indexes[length];
62362       if (length == lastIndex || index !== previous) {
62363         var previous = index;
62364         if (isIndex(index)) {
62365           splice$1.call(array, index, 1);
62366         } else {
62367           baseUnset(array, index);
62368         }
62369       }
62370     }
62371     return array;
62372   }
62373
62374   /**
62375    * Removes all elements from `array` that `predicate` returns truthy for
62376    * and returns an array of the removed elements. The predicate is invoked
62377    * with three arguments: (value, index, array).
62378    *
62379    * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
62380    * to pull elements from an array by value.
62381    *
62382    * @static
62383    * @memberOf _
62384    * @since 2.0.0
62385    * @category Array
62386    * @param {Array} array The array to modify.
62387    * @param {Function} [predicate=_.identity] The function invoked per iteration.
62388    * @returns {Array} Returns the new array of removed elements.
62389    * @example
62390    *
62391    * var array = [1, 2, 3, 4];
62392    * var evens = _.remove(array, function(n) {
62393    *   return n % 2 == 0;
62394    * });
62395    *
62396    * console.log(array);
62397    * // => [1, 3]
62398    *
62399    * console.log(evens);
62400    * // => [2, 4]
62401    */
62402   function remove$8(array, predicate) {
62403     var result = [];
62404     if (!(array && array.length)) {
62405       return result;
62406     }
62407     var index = -1,
62408         indexes = [],
62409         length = array.length;
62410
62411     predicate = baseIteratee(predicate, 3);
62412     while (++index < length) {
62413       var value = array[index];
62414       if (predicate(value, index, array)) {
62415         result.push(value);
62416         indexes.push(index);
62417       }
62418     }
62419     basePullAt(array, indexes);
62420     return result;
62421   }
62422
62423   function uiFieldCombo(field, context) {
62424       var dispatch$$1 = dispatch('change'),
62425           nominatim = services.geocoder,
62426           taginfo = services.taginfo,
62427           isMulti = (field.type === 'multiCombo'),
62428           isNetwork = (field.type === 'networkCombo'),
62429           isSemi = (field.type === 'semiCombo'),
62430           optstrings = field.strings && field.strings.options,
62431           optarray = field.options,
62432           snake_case = (field.snake_case || (field.snake_case === undefined)),
62433           caseSensitive = field.caseSensitive,
62434           combobox = d3combobox()
62435               .container(context.container())
62436               .caseSensitive(caseSensitive)
62437               .minItems(isMulti || isSemi ? 1 : 2),
62438           comboData = [],
62439           multiData = [],
62440           container,
62441           input,
62442           entity,
62443           country;
62444
62445       // ensure multiCombo field.key ends with a ':'
62446       if (isMulti && field.key.match(/:$/) === null) {
62447           field.key += ':';
62448       }
62449
62450
62451       function snake(s) {
62452           return s.replace(/\s+/g, '_');
62453       }
62454
62455       function unsnake(s) {
62456           return s.replace(/_+/g, ' ');
62457       }
62458
62459       function clean(s) {
62460           return s.split(';')
62461               .map(function(s) { return s.trim(); })
62462               .join(';');
62463       }
62464
62465
62466       // returns the tag value for a display value
62467       // (for multiCombo, dval should be the key suffix, not the entire key)
62468       function tagValue(dval) {
62469           dval = clean(dval || '');
62470
62471           if (optstrings) {
62472               var match = find$1(comboData, function(o) {
62473                   return o.key && clean(o.value) === dval;
62474               });
62475               if (match) {
62476                   return match.key;
62477               }
62478           }
62479
62480           if (field.type === 'typeCombo' && !dval) {
62481               return 'yes';
62482           }
62483
62484           return (snake_case ? snake(dval) : dval) || undefined;
62485       }
62486
62487
62488       // returns the display value for a tag value
62489       // (for multiCombo, tval should be the key suffix, not the entire key)
62490       function displayValue(tval) {
62491           tval = tval || '';
62492
62493           if (optstrings) {
62494               var match = find$1(comboData, function(o) { return o.key === tval && o.value; });
62495               if (match) {
62496                   return match.value;
62497               }
62498           }
62499
62500           if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
62501               return '';
62502           }
62503
62504           return snake_case ? unsnake(tval) : tval;
62505       }
62506
62507
62508       function objectDifference(a, b) {
62509           return reject(a, function(d1) {
62510               return some(b, function(d2) { return d1.value === d2.value; });
62511           });
62512       }
62513
62514
62515       function initCombo(selection$$1, attachTo) {
62516           if (optstrings) {
62517               selection$$1.attr('readonly', 'readonly');
62518               selection$$1.call(combobox, attachTo);
62519               setStaticValues(setPlaceholder);
62520
62521           } else if (optarray) {
62522               selection$$1.call(combobox, attachTo);
62523               setStaticValues(setPlaceholder);
62524
62525           } else if (taginfo) {
62526               selection$$1.call(combobox.fetcher(setTaginfoValues), attachTo);
62527               setTaginfoValues('', setPlaceholder);
62528           }
62529       }
62530
62531
62532       function setStaticValues(callback) {
62533           if (!(optstrings || optarray)) return;
62534
62535           if (optstrings) {
62536               comboData = Object.keys(optstrings).map(function(k) {
62537                   var v = field.t('options.' + k, { 'default': optstrings[k] });
62538                   return {
62539                       key: k,
62540                       value: v,
62541                       title: v
62542                   };
62543               });
62544
62545           } else if (optarray) {
62546               comboData = optarray.map(function(k) {
62547                   var v = snake_case ? unsnake(k) : k;
62548                   return {
62549                       key: k,
62550                       value: v,
62551                       title: v
62552                   };
62553               });
62554           }
62555
62556           combobox.data(objectDifference(comboData, multiData));
62557           if (callback) callback(comboData);
62558       }
62559
62560
62561       function setTaginfoValues(q, callback) {
62562           var fn = isMulti ? 'multikeys' : 'values';
62563           var query = (isMulti ? field.key : '') + q;
62564           var hasCountryPrefix = isNetwork && country && country.indexOf(q.toLowerCase()) === 0;
62565           if (hasCountryPrefix) {
62566               query = country + ':';
62567           }
62568
62569           var params = {
62570               debounce: (q !== ''),
62571               key: field.key,
62572               query: query
62573           };
62574
62575           if (entity) {
62576               params.geometry = context.geometry(entity.id);
62577           }
62578
62579           taginfo[fn](params, function(err, data) {
62580               if (err) return;
62581               if (hasCountryPrefix) {
62582                   data = filter(data, function(d) {
62583                       return d.value.toLowerCase().indexOf(country + ':') === 0;
62584                   });
62585               }
62586
62587               comboData = map$3(data, function(d) {
62588                   var k = d.value;
62589                   if (isMulti) k = k.replace(field.key, '');
62590                   var v = snake_case ? unsnake(k) : k;
62591                   return {
62592                       key: k,
62593                       value: v,
62594                       title: isMulti ? v : d.title
62595                   };
62596               });
62597
62598               comboData = objectDifference(comboData, multiData);
62599               if (callback) callback(comboData);
62600           });
62601       }
62602
62603
62604       function setPlaceholder(d) {
62605           var ph;
62606
62607           if (isMulti || isSemi) {
62608               ph = field.placeholder() || t('inspector.add');
62609           } else {
62610               var vals = map$3(d, 'value').filter(function(s) { return s.length < 20; }),
62611                   placeholders = vals.length > 1 ? vals : map$3(d, 'key');
62612               ph = field.placeholder() || placeholders.slice(0, 3).join(', ');
62613           }
62614
62615           if (ph.match(/(…|\.\.\.)$/) === null) {
62616               ph += '…';
62617           }
62618
62619           container.selectAll('input')
62620               .attr('placeholder', ph);
62621       }
62622
62623
62624       function change() {
62625           var val = tagValue(utilGetSetValue(input)),
62626               t$$1 = {};
62627
62628           if (isMulti || isSemi) {
62629               if (!val) return;
62630               container.classed('active', false);
62631               utilGetSetValue(input, '');
62632               if (isMulti) {
62633                   field.keys.push(field.key + val);
62634                   t$$1[field.key + val] = 'yes';
62635               } else if (isSemi) {
62636                   var arr = multiData.map(function(d) { return d.key; });
62637                   arr.push(val);
62638                   t$$1[field.key] = compact(uniq(arr)).join(';');
62639               }
62640               window.setTimeout(function() { input.node().focus(); }, 10);
62641
62642           } else {
62643               t$$1[field.key] = val;
62644           }
62645
62646           dispatch$$1.call('change', this, t$$1);
62647       }
62648
62649
62650       function removeMultikey(d) {
62651           event.stopPropagation();
62652           var t$$1 = {};
62653           if (isMulti) {
62654               t$$1[d.key] = undefined;
62655           } else if (isSemi) {
62656               remove$8(multiData, function(md) { return md.key === d.key; });
62657               var arr = multiData.map(function(md) { return md.key; });
62658               arr = compact(uniq(arr));
62659               t$$1[field.key] = arr.length ? arr.join(';') : undefined;
62660           }
62661           dispatch$$1.call('change', this, t$$1);
62662       }
62663
62664
62665       function combo(selection$$1) {
62666           if (isMulti || isSemi) {
62667               container = selection$$1.selectAll('ul').data([0]);
62668
62669               container = container.enter()
62670                   .append('ul')
62671                   .attr('class', 'form-field-multicombo')
62672                   .on('click', function() {
62673                       window.setTimeout(function() { input.node().focus(); }, 10);
62674                   })
62675                   .merge(container);
62676
62677           } else {
62678               container = selection$$1;
62679           }
62680
62681           input = container.selectAll('input')
62682               .data([0]);
62683
62684           input = input.enter()
62685               .append('input')
62686               .attr('type', 'text')
62687               .attr('id', 'preset-input-' + field.safeid)
62688               .call(utilNoAuto)
62689               .call(initCombo, selection$$1)
62690               .merge(input);
62691
62692           if (isNetwork && nominatim && entity) {
62693               var center = entity.extent(context.graph()).center();
62694               nominatim.countryCode(center, function (err, code) {
62695                   country = code;
62696               });
62697           }
62698
62699           input
62700               .on('change', change)
62701               .on('blur', change);
62702
62703           if (isMulti || isSemi) {
62704               combobox
62705                   .on('accept', function() {
62706                       input.node().blur();
62707                       input.node().focus();
62708                   });
62709
62710               input
62711                   .on('focus', function() { container.classed('active', true); });
62712           }
62713       }
62714
62715
62716       combo.tags = function(tags) {
62717           if (isMulti || isSemi) {
62718               multiData = [];
62719
62720               if (isMulti) {
62721                   // Build multiData array containing keys already set..
62722                   Object.keys(tags).forEach(function(key) {
62723                       if (key.indexOf(field.key) !== 0 || tags[key].toLowerCase() !== 'yes') return;
62724
62725                       var suffix = key.substring(field.key.length);
62726                       multiData.push({
62727                           key: key,
62728                           value: displayValue(suffix)
62729                       });
62730                   });
62731
62732                   // Set keys for form-field modified (needed for undo and reset buttons)..
62733                   field.keys = map$3(multiData, 'key');
62734
62735               } else if (isSemi) {
62736                   var arr = compact(uniq((tags[field.key] || '').split(';')));
62737                   multiData = arr.map(function(key) {
62738                       return {
62739                           key: key,
62740                           value: displayValue(key)
62741                       };
62742                   });
62743               }
62744
62745               // Exclude existing multikeys from combo options..
62746               var available = objectDifference(comboData, multiData);
62747               combobox.data(available);
62748
62749               // Hide 'Add' button if this field uses fixed set of
62750               // translateable optstrings and they're all currently used..
62751               container.selectAll('.combobox-input, .combobox-caret')
62752                   .classed('hide', optstrings && !available.length);
62753
62754
62755               // Render chips
62756               var chips = container.selectAll('.chips')
62757                   .data(multiData);
62758
62759               chips.exit()
62760                   .remove();
62761
62762               var enter = chips.enter()
62763                   .insert('li', 'input')
62764                   .attr('class', 'chips');
62765
62766               enter.append('span');
62767               enter.append('a');
62768
62769               chips = chips.merge(enter);
62770
62771               chips.select('span')
62772                   .text(function(d) { return d.value; });
62773
62774               chips.select('a')
62775                   .on('click', removeMultikey)
62776                   .attr('class', 'remove')
62777                   .text('×');
62778
62779           } else {
62780               utilGetSetValue(input, displayValue(tags[field.key]));
62781           }
62782       };
62783
62784
62785       combo.focus = function() {
62786           input.node().focus();
62787       };
62788
62789
62790       combo.entity = function(_) {
62791           if (!arguments.length) return entity;
62792           entity = _;
62793           return combo;
62794       };
62795
62796
62797       return utilRebind(combo, dispatch$$1, 'on');
62798   }
62799
62800   function uiFieldText(field, context) {
62801       var dispatch$$1 = dispatch('change'),
62802           nominatim = services.geocoder,
62803           input,
62804           entity;
62805
62806
62807       function i(selection$$1) {
62808           var fieldId = 'preset-input-' + field.safeid;
62809
62810           input = selection$$1.selectAll('input')
62811               .data([0]);
62812
62813           input = input.enter()
62814               .append('input')
62815               .attr('type', field.type)
62816               .attr('id', fieldId)
62817               .attr('placeholder', field.placeholder() || t('inspector.unknown'))
62818               .call(utilNoAuto)
62819               .merge(input);
62820
62821           input
62822               .on('input', change(true))
62823               .on('blur', change())
62824               .on('change', change());
62825
62826           if (field.type === 'tel' && nominatim && entity) {
62827               var center = entity.extent(context.graph()).center();
62828               nominatim.countryCode(center, function (err, countryCode) {
62829                   if (err || !dataPhoneFormats[countryCode]) return;
62830                   selection$$1.selectAll('#' + fieldId)
62831                       .attr('placeholder', dataPhoneFormats[countryCode]);
62832               });
62833
62834           } else if (field.type === 'number') {
62835               var rtl = (textDirection === 'rtl');
62836
62837               input.attr('type', 'text');
62838
62839               var spinControl = selection$$1.selectAll('.spin-control')
62840                   .data([0]);
62841
62842               var enter = spinControl.enter()
62843                   .append('div')
62844                   .attr('class', 'spin-control');
62845
62846               enter
62847                   .append('button')
62848                   .datum(rtl ? 1 : -1)
62849                   .attr('class', rtl ? 'increment' : 'decrement')
62850                   .attr('tabindex', -1);
62851
62852               enter
62853                   .append('button')
62854                   .datum(rtl ? -1 : 1)
62855                   .attr('class', rtl ? 'decrement' : 'increment')
62856                   .attr('tabindex', -1);
62857
62858               spinControl = spinControl
62859                   .merge(enter);
62860
62861               spinControl.selectAll('button')
62862                   .on('click', function(d) {
62863                       event.preventDefault();
62864                       var num = parseInt(input.node().value || 0, 10);
62865                       if (!isNaN(num)) input.node().value = num + d;
62866                       change()();
62867                   });
62868           }
62869       }
62870
62871
62872       function change(onInput) {
62873           return function() {
62874               var t$$1 = {};
62875               t$$1[field.key] = utilGetSetValue(input) || undefined;
62876               dispatch$$1.call('change', this, t$$1, onInput);
62877           };
62878       }
62879
62880
62881       i.entity = function(_) {
62882           if (!arguments.length) return entity;
62883           entity = _;
62884           return i;
62885       };
62886
62887
62888       i.tags = function(tags) {
62889           utilGetSetValue(input, tags[field.key] || '');
62890       };
62891
62892
62893       i.focus = function() {
62894           var node = input.node();
62895           if (node) node.focus();
62896       };
62897
62898       return utilRebind(i, dispatch$$1, 'on');
62899   }
62900
62901   function uiFieldAccess(field, context) {
62902       var dispatch$$1 = dispatch('change'),
62903           items;
62904
62905       function access(selection$$1) {
62906           var wrap = selection$$1.selectAll('.preset-input-wrap')
62907               .data([0]);
62908
62909           wrap = wrap.enter()
62910               .append('div')
62911               .attr('class', 'cf preset-input-wrap')
62912               .append('ul')
62913               .merge(wrap);
62914
62915           var list = wrap.selectAll('ul')
62916               .data([0]);
62917
62918           list = list.enter()
62919               .append('ul')
62920               .merge(list);
62921
62922
62923           items = list.selectAll('li')
62924               .data(field.keys);
62925
62926           // Enter
62927           var enter = items.enter()
62928               .append('li')
62929               .attr('class', function(d) { return 'cf preset-access-' + d; });
62930
62931           enter
62932               .append('span')
62933               .attr('class', 'col6 label preset-label-access')
62934               .attr('for', function(d) { return 'preset-input-access-' + d; })
62935               .text(function(d) { return field.t('types.' + d); });
62936
62937           enter
62938               .append('div')
62939               .attr('class', 'col6 preset-input-access-wrap')
62940               .append('input')
62941               .attr('type', 'text')
62942               .attr('class', 'preset-input-access')
62943               .attr('id', function(d) { return 'preset-input-access-' + d; })
62944               .call(utilNoAuto)
62945               .each(function(d) {
62946                   d3_select(this)
62947                       .call(d3combobox()
62948                           .container(context.container())
62949                           .data(access.options(d))
62950                       );
62951               });
62952
62953
62954           // Update
62955           items = items.merge(enter);
62956
62957           wrap.selectAll('.preset-input-access')
62958               .on('change', change)
62959               .on('blur', change);
62960       }
62961
62962
62963       function change(d) {
62964           var tag = {};
62965           tag[d] = utilGetSetValue(d3_select(this)) || undefined;
62966           dispatch$$1.call('change', this, tag);
62967       }
62968
62969
62970       access.options = function(type) {
62971           var options = ['no', 'permissive', 'private', 'destination'];
62972
62973           if (type !== 'access') {
62974               options.unshift('yes');
62975               options.push('designated');
62976
62977               if (type === 'bicycle') {
62978                   options.push('dismount');
62979               }
62980           }
62981
62982           return options.map(function(option) {
62983               return {
62984                   title: field.t('options.' + option + '.description'),
62985                   value: option
62986               };
62987           });
62988       };
62989
62990
62991       var placeholders = {
62992           footway: {
62993               foot: 'designated',
62994               motor_vehicle: 'no'
62995           },
62996           steps: {
62997               foot: 'yes',
62998               motor_vehicle: 'no',
62999               bicycle: 'no',
63000               horse: 'no'
63001           },
63002           pedestrian: {
63003               foot: 'yes',
63004               motor_vehicle: 'no'
63005           },
63006           cycleway: {
63007               motor_vehicle: 'no',
63008               bicycle: 'designated'
63009           },
63010           bridleway: {
63011               motor_vehicle: 'no',
63012               horse: 'designated'
63013           },
63014           path: {
63015               foot: 'yes',
63016               motor_vehicle: 'no',
63017               bicycle: 'yes',
63018               horse: 'yes'
63019           },
63020           motorway: {
63021               foot: 'no',
63022               motor_vehicle: 'yes',
63023               bicycle: 'no',
63024               horse: 'no'
63025           },
63026           trunk: {
63027               motor_vehicle: 'yes'
63028           },
63029           primary: {
63030               foot: 'yes',
63031               motor_vehicle: 'yes',
63032               bicycle: 'yes',
63033               horse: 'yes'
63034           },
63035           secondary: {
63036               foot: 'yes',
63037               motor_vehicle: 'yes',
63038               bicycle: 'yes',
63039               horse: 'yes'
63040           },
63041           tertiary: {
63042               foot: 'yes',
63043               motor_vehicle: 'yes',
63044               bicycle: 'yes',
63045               horse: 'yes'
63046           },
63047           residential: {
63048               foot: 'yes',
63049               motor_vehicle: 'yes',
63050               bicycle: 'yes',
63051               horse: 'yes'
63052           },
63053           unclassified: {
63054               foot: 'yes',
63055               motor_vehicle: 'yes',
63056               bicycle: 'yes',
63057               horse: 'yes'
63058           },
63059           service: {
63060               foot: 'yes',
63061               motor_vehicle: 'yes',
63062               bicycle: 'yes',
63063               horse: 'yes'
63064           },
63065           motorway_link: {
63066               foot: 'no',
63067               motor_vehicle: 'yes',
63068               bicycle: 'no',
63069               horse: 'no'
63070           },
63071           trunk_link: {
63072               motor_vehicle: 'yes'
63073           },
63074           primary_link: {
63075               foot: 'yes',
63076               motor_vehicle: 'yes',
63077               bicycle: 'yes',
63078               horse: 'yes'
63079           },
63080           secondary_link: {
63081               foot: 'yes',
63082               motor_vehicle: 'yes',
63083               bicycle: 'yes',
63084               horse: 'yes'
63085           },
63086           tertiary_link: {
63087               foot: 'yes',
63088               motor_vehicle: 'yes',
63089               bicycle: 'yes',
63090               horse: 'yes'
63091           }
63092       };
63093
63094
63095       access.tags = function(tags) {
63096           utilGetSetValue(items.selectAll('.preset-input-access'),
63097               function(d) { return tags[d] || ''; })
63098               .attr('placeholder', function() {
63099                   return tags.access ? tags.access : field.placeholder();
63100               });
63101
63102           items.selectAll('#preset-input-access-access')
63103               .attr('placeholder', 'yes');
63104
63105           forEach(placeholders[tags.highway], function(v, k) {
63106               items.selectAll('#preset-input-access-' + k)
63107                   .attr('placeholder', function() { return (tags.access || v); });
63108           });
63109       };
63110
63111
63112       access.focus = function() {
63113           items.selectAll('.preset-input-access')
63114               .node().focus();
63115       };
63116
63117
63118       return utilRebind(access, dispatch$$1, 'on');
63119   }
63120
63121   function uiFieldAddress(field, context) {
63122       var dispatch$$1 = dispatch('init', 'change'),
63123           nominatim = services.geocoder,
63124           wrap = d3_select(null),
63125           isInitialized = false,
63126           entity;
63127
63128       function getNearStreets() {
63129           var extent = entity.extent(context.graph()),
63130               l = extent.center(),
63131               box = geoExtent$$1(l).padByMeters(200);
63132
63133           var streets = context.intersects(box)
63134               .filter(isAddressable)
63135               .map(function(d) {
63136                   var loc = context.projection([
63137                       (extent[0][0] + extent[1][0]) / 2,
63138                       (extent[0][1] + extent[1][1]) / 2]),
63139                       choice = geoChooseEdge(context.childNodes(d), loc, context.projection);
63140                   return {
63141                       title: d.tags.name,
63142                       value: d.tags.name,
63143                       dist: choice.distance
63144                   };
63145               })
63146               .sort(function(a, b) {
63147                   return a.dist - b.dist;
63148               });
63149
63150           return uniqBy(streets, 'value');
63151
63152           function isAddressable(d) {
63153               return d.tags.highway && d.tags.name && d.type === 'way';
63154           }
63155       }
63156
63157
63158       function getNearCities() {
63159           var extent = entity.extent(context.graph()),
63160               l = extent.center(),
63161               box = geoExtent$$1(l).padByMeters(200);
63162
63163           var cities = context.intersects(box)
63164               .filter(isAddressable)
63165               .map(function(d) {
63166                   return {
63167                       title: d.tags['addr:city'] || d.tags.name,
63168                       value: d.tags['addr:city'] || d.tags.name,
63169                       dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
63170                   };
63171               })
63172               .sort(function(a, b) {
63173                   return a.dist - b.dist;
63174               });
63175
63176           return uniqBy(cities, 'value');
63177
63178
63179           function isAddressable(d) {
63180               if (d.tags.name &&
63181                   (d.tags.admin_level === '8' || d.tags.border_type === 'city'))
63182                   return true;
63183
63184               if (d.tags.place && d.tags.name && (
63185                       d.tags.place === 'city' ||
63186                       d.tags.place === 'town' ||
63187                       d.tags.place === 'village'))
63188                   return true;
63189
63190               if (d.tags['addr:city']) return true;
63191
63192               return false;
63193           }
63194       }
63195
63196       function getNearValues(key) {
63197           var extent = entity.extent(context.graph()),
63198               l = extent.center(),
63199               box = geoExtent$$1(l).padByMeters(200);
63200
63201           var results = context.intersects(box)
63202               .filter(function hasTag(d) {
63203                   return d.tags[key];
63204               })
63205               .map(function(d) {
63206                   return {
63207                       title: d.tags[key],
63208                       value: d.tags[key],
63209                       dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
63210                   };
63211               })
63212               .sort(function(a, b) {
63213                   return a.dist - b.dist;
63214               });
63215
63216           return uniqBy(results, 'value');
63217       }
63218
63219
63220       function initCallback(err, countryCode) {
63221           if (err) return;
63222
63223           var addressFormat = find$1(dataAddressFormats, function (a) {
63224               return a && a.countryCodes && includes(a.countryCodes, countryCode.toLowerCase());
63225           }) || dataAddressFormats[0];
63226
63227           var widths = addressFormat.widths || {
63228               housenumber: 1/3, street: 2/3,
63229               city: 2/3, state: 1/4, postcode: 1/3
63230           };
63231
63232           function row(r) {
63233               // Normalize widths.
63234               var total = reduce(r, function(sum, field) {
63235                   return sum + (widths[field] || 0.5);
63236               }, 0);
63237
63238               return r.map(function (field) {
63239                   return {
63240                       id: field,
63241                       width: (widths[field] || 0.5) / total
63242                   };
63243               });
63244           }
63245
63246           wrap.selectAll('div.addr-row')
63247               .data(addressFormat.format)
63248               .enter()
63249               .append('div')
63250               .attr('class', 'addr-row')
63251               .selectAll('input')
63252               .data(row)
63253               .enter()
63254               .append('input')
63255               .property('type', 'text')
63256               .attr('placeholder', function (d) {
63257                   var localkey = d.id + '!' + countryCode.toLowerCase(),
63258                       tkey = field.strings.placeholders[localkey] ? localkey : d.id;
63259                   return field.t('placeholders.' + tkey);
63260               })
63261               .attr('class', function (d) { return 'addr-' + d.id; })
63262               .call(utilNoAuto)
63263               .style('width', function (d) { return d.width * 100 + '%'; });
63264
63265           // Update
63266
63267           // setup dropdowns for common address tags
63268           var dropdowns = addressFormat.dropdowns || [
63269               'city', 'county', 'country', 'district', 'hamlet',
63270               'neighbourhood', 'place', 'postcode', 'province',
63271               'quarter', 'state', 'street', 'subdistrict', 'suburb'
63272           ];
63273
63274           // If fields exist for any of these tags, create dropdowns to pick nearby values..
63275           dropdowns.forEach(function(tag) {
63276               var nearValues = (tag === 'street') ? getNearStreets
63277                       : (tag === 'city') ? getNearCities
63278                       : getNearValues;
63279
63280               wrap.selectAll('input.addr-' + tag)
63281                   .call(d3combobox()
63282                       .container(context.container())
63283                       .minItems(1)
63284                       .fetcher(function(value, callback) {
63285                           callback(nearValues('addr:' + tag));
63286                       })
63287                   );
63288           });
63289
63290           wrap.selectAll('input')
63291               .on('blur', change())
63292               .on('change', change());
63293
63294           wrap.selectAll('input:not(.combobox-input)')
63295               .on('input', change(true));
63296
63297           dispatch$$1.call('init');
63298           isInitialized = true;
63299       }
63300
63301
63302       function address(selection$$1) {
63303           isInitialized = false;
63304
63305           wrap = selection$$1.selectAll('.preset-input-wrap')
63306               .data([0]);
63307
63308           wrap = wrap.enter()
63309               .append('div')
63310               .attr('class', 'preset-input-wrap')
63311               .merge(wrap);
63312
63313           if (nominatim && entity) {
63314               var center = entity.extent(context.graph()).center();
63315               nominatim.countryCode(center, initCallback);
63316           }
63317       }
63318
63319
63320       function change(onInput) {
63321           return function() {
63322               var tags = {};
63323
63324               wrap.selectAll('input')
63325                   .each(function (field) {
63326                       tags['addr:' + field.id] = this.value || undefined;
63327                   });
63328
63329               dispatch$$1.call('change', this, tags, onInput);
63330           };
63331       }
63332
63333
63334       function updateTags(tags) {
63335           utilGetSetValue(wrap.selectAll('input'), function (field) {
63336               return tags['addr:' + field.id] || '';
63337           });
63338       }
63339
63340
63341       address.entity = function(_) {
63342           if (!arguments.length) return entity;
63343           entity = _;
63344           return address;
63345       };
63346
63347
63348       address.tags = function(tags) {
63349           if (isInitialized) {
63350               updateTags(tags);
63351           } else {
63352               dispatch$$1.on('init', function () {
63353                   dispatch$$1.on('init', null);
63354                   updateTags(tags);
63355               });
63356           }
63357       };
63358
63359
63360       address.focus = function() {
63361           var node = wrap.selectAll('input').node();
63362           if (node) node.focus();
63363       };
63364
63365
63366       return utilRebind(address, dispatch$$1, 'on');
63367   }
63368
63369   function uiFieldCycleway(field, context) {
63370       var dispatch$$1 = dispatch('change'),
63371           items = d3_select(null);
63372
63373
63374       function cycleway(selection$$1) {
63375
63376           function stripcolon(s) {
63377               return s.replace(':', '');
63378           }
63379
63380
63381           var wrap = selection$$1.selectAll('.preset-input-wrap')
63382               .data([0]);
63383
63384           wrap = wrap.enter()
63385               .append('div')
63386               .attr('class', 'cf preset-input-wrap')
63387               .merge(wrap);
63388
63389
63390           var div = wrap.selectAll('ul')
63391               .data([0]);
63392
63393           div = div.enter()
63394               .append('ul')
63395               .merge(div);
63396
63397
63398           items = div.selectAll('li')
63399               .data(field.keys);
63400
63401           var enter = items.enter()
63402               .append('li')
63403               .attr('class', function(d) { return 'cf preset-cycleway-' + stripcolon(d); });
63404
63405           enter
63406               .append('span')
63407               .attr('class', 'col6 label preset-label-cycleway')
63408               .attr('for', function(d) { return 'preset-input-cycleway-' + stripcolon(d); })
63409               .text(function(d) { return field.t('types.' + d); });
63410
63411           enter
63412               .append('div')
63413               .attr('class', 'col6 preset-input-cycleway-wrap')
63414               .append('input')
63415               .attr('type', 'text')
63416               .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
63417               .call(utilNoAuto)
63418               .each(function(d) {
63419                   d3_select(this)
63420                       .call(d3combobox()
63421                           .container(context.container())
63422                           .data(cycleway.options(d))
63423                       );
63424               });
63425
63426
63427           // Update
63428           wrap.selectAll('.preset-input-cycleway')
63429               .on('change', change)
63430               .on('blur', change);
63431       }
63432
63433
63434       function change() {
63435           var left = utilGetSetValue(d3_select('.preset-input-cyclewayleft')),
63436               right = utilGetSetValue(d3_select('.preset-input-cyclewayright')),
63437               tag = {};
63438
63439           if (left === 'none' || left === '') { left = undefined; }
63440           if (right === 'none' || right === '') { right = undefined; }
63441
63442           // Always set both left and right as changing one can affect the other
63443           tag = {
63444               cycleway: undefined,
63445               'cycleway:left': left,
63446               'cycleway:right': right
63447           };
63448
63449           // If the left and right tags match, use the cycleway tag to tag both
63450           // sides the same way
63451           if (left === right) {
63452               tag = {
63453                   cycleway: left,
63454                   'cycleway:left': undefined,
63455                   'cycleway:right': undefined
63456               };
63457           }
63458
63459           dispatch$$1.call('change', this, tag);
63460       }
63461
63462
63463       cycleway.options = function() {
63464           return keys$1(field.strings.options).map(function(option) {
63465               return {
63466                   title: field.t('options.' + option + '.description'),
63467                   value: option
63468               };
63469           });
63470       };
63471
63472
63473       cycleway.tags = function(tags) {
63474           utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
63475                   // If cycleway is set, always return that
63476                   if (tags.cycleway) {
63477                       return tags.cycleway;
63478                   }
63479                   return tags[d] || '';
63480               })
63481               .attr('placeholder', field.placeholder());
63482       };
63483
63484
63485       cycleway.focus = function() {
63486           items.selectAll('.preset-input-cycleway')
63487               .node().focus();
63488       };
63489
63490
63491       return utilRebind(cycleway, dispatch$$1, 'on');
63492   }
63493
63494   function uiFieldLanes(field, context) {
63495       var dispatch$$1 = dispatch('change'),
63496           LANE_WIDTH = 40,
63497           LANE_HEIGHT = 200,
63498           wayID,
63499           lanesData;
63500
63501       function lanes(selection$$1) {
63502           lanesData = context.entity(wayID).lanes();
63503
63504           if (!d3_select('.inspector-wrap.inspector-hidden').empty() || !selection$$1.node().parentNode) {
63505               selection$$1.call(lanes.off);
63506               return;
63507           }
63508
63509           var wrap = selection$$1.selectAll('.preset-input-wrap')
63510               .data([0]);
63511
63512           wrap = wrap.enter()
63513               .append('div')
63514               .attr('class', 'preset-input-wrap')
63515               .merge(wrap);
63516
63517           var surface =  wrap.selectAll('.surface')
63518               .data([0]);
63519
63520           var d = utilGetDimensions(wrap);
63521           var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
63522
63523           surface = surface.enter()
63524               .append('svg')
63525               .attr('width', d[0])
63526               .attr('height', 300)
63527               .attr('class', 'surface')
63528               .merge(surface);
63529
63530
63531           var lanesSelection = surface.selectAll('.lanes')
63532               .data([0]);
63533
63534           lanesSelection = lanesSelection.enter()
63535               .append('g')
63536               .attr('class', 'lanes')
63537               .merge(lanesSelection);
63538
63539           lanesSelection
63540               .attr('transform', function () {
63541                   return 'translate(' + (freeSpace / 2) + ', 0)';
63542               });
63543
63544
63545           var lane = lanesSelection.selectAll('.lane')
63546              .data(lanesData.lanes);
63547
63548           lane.exit()
63549               .remove();
63550
63551           var enter = lane.enter()
63552               .append('g')
63553               .attr('class', 'lane');
63554
63555           enter
63556               .append('g')
63557               .append('rect')
63558               .attr('y', 50)
63559               .attr('width', LANE_WIDTH)
63560               .attr('height', LANE_HEIGHT);
63561
63562           enter
63563               .append('g')
63564               .attr('class', 'forward')
63565               .append('text')
63566               .attr('y', 40)
63567               .attr('x', 14)
63568               .text('▲');
63569
63570           enter
63571               .append('g')
63572               .attr('class', 'bothways')
63573               .append('text')
63574               .attr('y', 40)
63575               .attr('x', 14)
63576               .text('▲▼');
63577
63578           enter
63579               .append('g')
63580               .attr('class', 'backward')
63581               .append('text')
63582               .attr('y', 40)
63583               .attr('x', 14)
63584               .text('▼');
63585
63586
63587           lane = lane
63588               .merge(enter);
63589
63590           lane
63591               .attr('transform', function(d) {
63592                   return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
63593               });
63594
63595           lane.select('.forward')
63596               .style('visibility', function(d) {
63597                   return d.direction === 'forward' ? 'visible' : 'hidden';
63598               });
63599
63600           lane.select('.bothways')
63601               .style('visibility', function(d) {
63602                   return d.direction === 'bothways' ? 'visible' : 'hidden';
63603               });
63604
63605           lane.select('.backward')
63606               .style('visibility', function(d) {
63607                   return d.direction === 'backward' ? 'visible' : 'hidden';
63608               });
63609       }
63610
63611
63612       lanes.entity = function(_) {
63613           if (!wayID || wayID !== _.id) {
63614               wayID = _.id;
63615           }
63616       };
63617
63618       lanes.tags = function() {};
63619       lanes.focus = function() {};
63620       lanes.off = function() {};
63621
63622       return utilRebind(lanes, dispatch$$1, 'on');
63623   }
63624
63625   function uiFieldLocalized(field, context) {
63626       var dispatch$$1 = dispatch('change', 'input'),
63627           wikipedia = services.wikipedia,
63628           input = d3_select(null),
63629           localizedInputs = d3_select(null),
63630           wikiTitles,
63631           entity;
63632
63633
63634       function localized(selection$$1) {
63635           input = selection$$1.selectAll('.localized-main')
63636               .data([0]);
63637
63638           input = input.enter()
63639               .append('input')
63640               .attr('type', 'text')
63641               .attr('id', 'preset-input-' + field.safeid)
63642               .attr('class', 'localized-main')
63643               .attr('placeholder', field.placeholder())
63644               .call(utilNoAuto)
63645               .merge(input);
63646
63647           if (field.id === 'name') {
63648               var preset = context.presets().match(entity, context.graph());
63649               input
63650                   .call(d3combobox()
63651                       .container(context.container())
63652                       .fetcher(utilSuggestNames(preset, dataSuggestions))
63653                   );
63654           }
63655
63656           input
63657               .on('input', change(true))
63658               .on('blur', change())
63659               .on('change', change());
63660
63661
63662           var translateButton = selection$$1.selectAll('.localized-add')
63663               .data([0]);
63664
63665           translateButton = translateButton.enter()
63666               .append('button')
63667               .attr('class', 'button-input-action localized-add minor')
63668               .attr('tabindex', -1)
63669               .call(svgIcon('#icon-plus'))
63670               .call(tooltip()
63671                   .title(t('translate.translate'))
63672                   .placement('left'))
63673               .merge(translateButton);
63674
63675           translateButton
63676               .on('click', addNew);
63677
63678
63679           localizedInputs = selection$$1.selectAll('.localized-wrap')
63680               .data([0]);
63681
63682           localizedInputs = localizedInputs.enter().append('div')
63683               .attr('class', 'localized-wrap')
63684               .merge(localizedInputs);
63685       }
63686
63687
63688       function addNew() {
63689           event.preventDefault();
63690           var data$$1 = localizedInputs.selectAll('div.entry').data();
63691           var defaultLang = utilDetect().locale.toLowerCase().split('-')[0];
63692           var langExists = find$1(data$$1, function(datum) { return datum.lang === defaultLang;});
63693           var isLangEn = defaultLang.indexOf('en') > -1;
63694           if (isLangEn || langExists) {
63695               defaultLang = '';
63696           }
63697           data$$1.push({ lang: defaultLang, value: '' });
63698           localizedInputs.call(render, data$$1);
63699       }
63700
63701
63702       function change(onInput) {
63703           return function() {
63704               var t$$1 = {};
63705               t$$1[field.key] = utilGetSetValue(d3_select(this)) || undefined;
63706               dispatch$$1.call('change', this, t$$1, onInput);
63707           };
63708       }
63709
63710
63711       function key(lang) {
63712           return field.key + ':' + lang;
63713       }
63714
63715
63716       function changeLang(d) {
63717           var lang = utilGetSetValue(d3_select(this)),
63718               t$$1 = {},
63719               language = find$1(wikipedia$2, function(d) {
63720                   return d[0].toLowerCase() === lang.toLowerCase() ||
63721                       d[1].toLowerCase() === lang.toLowerCase();
63722               });
63723
63724           if (language) lang = language[2];
63725
63726           if (d.lang && d.lang !== lang) {
63727               t$$1[key(d.lang)] = undefined;
63728           }
63729
63730           var value = utilGetSetValue(d3_select(this.parentNode)
63731               .selectAll('.localized-value'));
63732
63733           if (lang && value) {
63734               t$$1[key(lang)] = value;
63735           } else if (lang && wikiTitles && wikiTitles[d.lang]) {
63736               t$$1[key(lang)] = wikiTitles[d.lang];
63737           }
63738
63739           d.lang = lang;
63740           dispatch$$1.call('change', this, t$$1);
63741       }
63742
63743
63744       function changeValue(d) {
63745           if (!d.lang) return;
63746           var t$$1 = {};
63747           t$$1[key(d.lang)] = utilGetSetValue(d3_select(this)) || undefined;
63748           dispatch$$1.call('change', this, t$$1);
63749       }
63750
63751
63752       function fetcher(value, cb) {
63753           var v = value.toLowerCase();
63754
63755           cb(wikipedia$2.filter(function(d) {
63756               return d[0].toLowerCase().indexOf(v) >= 0 ||
63757               d[1].toLowerCase().indexOf(v) >= 0 ||
63758               d[2].toLowerCase().indexOf(v) >= 0;
63759           }).map(function(d) {
63760               return { value: d[1] };
63761           }));
63762       }
63763
63764
63765       function render(selection$$1, data$$1) {
63766           var wraps = selection$$1.selectAll('div.entry').
63767               data(data$$1, function(d) { return d.lang; });
63768
63769           wraps.exit()
63770               .transition()
63771               .duration(200)
63772               .style('max-height','0px')
63773               .style('opacity', '0')
63774               .style('top','-10px')
63775               .remove();
63776
63777           var innerWrap = wraps.enter()
63778               .insert('div', ':first-child');
63779
63780           innerWrap.attr('class', 'entry')
63781               .each(function() {
63782                   var wrap = d3_select(this);
63783                   var langcombo = d3combobox()
63784                       .container(context.container())
63785                       .fetcher(fetcher)
63786                       .minItems(0);
63787
63788                   var label = wrap
63789                       .append('label')
63790                       .attr('class','form-label')
63791                       .text(t('translate.localized_translation_label'))
63792                       .attr('for','localized-lang');
63793
63794                   label
63795                       .append('button')
63796                       .attr('class', 'minor remove')
63797                       .on('click', function(d){
63798                           event.preventDefault();
63799                           var t$$1 = {};
63800                           t$$1[key(d.lang)] = undefined;
63801                           dispatch$$1.call('change', this, t$$1);
63802                           d3_select(this.parentNode.parentNode)
63803                               .style('top','0')
63804                               .style('max-height','240px')
63805                               .transition()
63806                               .style('opacity', '0')
63807                               .style('max-height','0px')
63808                               .remove();
63809                       })
63810                       .call(svgIcon('#operation-delete'));
63811
63812                   wrap
63813                       .append('input')
63814                       .attr('class', 'localized-lang')
63815                       .attr('type', 'text')
63816                       .attr('placeholder',t('translate.localized_translation_language'))
63817                       .on('blur', changeLang)
63818                       .on('change', changeLang)
63819                       .call(langcombo);
63820
63821                   wrap
63822                       .append('input')
63823                       .on('blur', changeValue)
63824                       .on('change', changeValue)
63825                       .attr('type', 'text')
63826                       .attr('placeholder', t('translate.localized_translation_name'))
63827                       .attr('class', 'localized-value');
63828               });
63829
63830           innerWrap
63831               .style('margin-top', '0px')
63832               .style('max-height', '0px')
63833               .style('opacity', '0')
63834               .transition()
63835               .duration(200)
63836               .style('margin-top', '10px')
63837               .style('max-height', '240px')
63838               .style('opacity', '1')
63839               .on('end', function() {
63840                   d3_select(this)
63841                       .style('max-height', '')
63842                       .style('overflow', 'visible');
63843               });
63844
63845
63846           var entry = selection$$1.selectAll('.entry');
63847
63848           utilGetSetValue(entry.select('.localized-lang'), function(d) {
63849                   var lang = find$1(wikipedia$2, function(lang) { return lang[2] === d.lang; });
63850                   return lang ? lang[1] : d.lang;
63851               });
63852
63853           utilGetSetValue(entry.select('.localized-value'),
63854               function(d) { return d.value; });
63855       }
63856
63857
63858       localized.tags = function(tags) {
63859           // Fetch translations from wikipedia
63860           if (tags.wikipedia && !wikiTitles) {
63861               wikiTitles = {};
63862               var wm = tags.wikipedia.match(/([^:]+):(.+)/);
63863               if (wm && wm[0] && wm[1]) {
63864                   wikipedia.translations(wm[1], wm[2], function(d) {
63865                       wikiTitles = d;
63866                   });
63867               }
63868           }
63869
63870           utilGetSetValue(input, tags[field.key] || '');
63871
63872           var postfixed = [], k, m;
63873           for (k in tags) {
63874               m = k.match(/^(.*):([a-zA-Z_-]+)$/);
63875               if (m && m[1] === field.key && m[2]) {
63876                   postfixed.push({ lang: m[2], value: tags[k] });
63877               }
63878           }
63879
63880           localizedInputs.call(render, postfixed.reverse());
63881       };
63882
63883
63884       localized.focus = function() {
63885           input.node().focus();
63886       };
63887
63888
63889       localized.entity = function(_) {
63890           if (!arguments.length) return entity;
63891           entity = _;
63892           return localized;
63893       };
63894
63895       return utilRebind(localized, dispatch$$1, 'on');
63896   }
63897
63898   function uiFieldMaxspeed(field, context) {
63899       var dispatch$$1 = dispatch('change'),
63900           entity,
63901           isImperial,
63902           unitInput = d3_select(null),
63903           input = d3_select(null),
63904           combobox;
63905
63906       var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120],
63907           imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
63908
63909
63910       function maxspeed(selection$$1) {
63911           combobox = d3combobox()
63912               .container(context.container());
63913
63914           var unitCombobox = d3combobox()
63915               .container(context.container())
63916               .data(['km/h', 'mph'].map(comboValues));
63917
63918           input = selection$$1.selectAll('#preset-input-' + field.safeid)
63919               .data([0]);
63920
63921           input = input.enter()
63922               .append('input')
63923               .attr('type', 'text')
63924               .attr('id', 'preset-input-' + field.safeid)
63925               .attr('placeholder', field.placeholder())
63926               .call(utilNoAuto)
63927               .call(combobox)
63928               .merge(input);
63929
63930           input
63931               .on('change', change)
63932               .on('blur', change);
63933
63934           var childNodes = context.graph().childNodes(context.entity(entity.id)),
63935               loc = childNodes[~~(childNodes.length/2)].loc;
63936
63937           isImperial = some(dataImperial.features, function(f) {
63938               return some(f.geometry.coordinates, function(d) {
63939                   return geoPointInPolygon(loc, d);
63940               });
63941           });
63942
63943           unitInput = selection$$1.selectAll('input.maxspeed-unit')
63944               .data([0]);
63945
63946           unitInput = unitInput.enter()
63947               .append('input')
63948               .attr('type', 'text')
63949               .attr('class', 'maxspeed-unit')
63950               .call(unitCombobox)
63951               .merge(unitInput);
63952
63953           unitInput
63954               .on('blur', changeUnits)
63955               .on('change', changeUnits);
63956
63957
63958           function changeUnits() {
63959               isImperial = utilGetSetValue(unitInput) === 'mph';
63960               utilGetSetValue(unitInput, isImperial ? 'mph' : 'km/h');
63961               setSuggestions();
63962               change();
63963           }
63964       }
63965
63966
63967       function setSuggestions() {
63968           combobox.data((isImperial ? imperialValues : metricValues).map(comboValues));
63969           utilGetSetValue(unitInput, isImperial ? 'mph' : 'km/h');
63970       }
63971
63972
63973       function comboValues(d) {
63974           return {
63975               value: d.toString(),
63976               title: d.toString()
63977           };
63978       }
63979
63980
63981       function change() {
63982           var tag = {},
63983               value = utilGetSetValue(input);
63984
63985           if (!value) {
63986               tag[field.key] = undefined;
63987           } else if (isNaN(value) || !isImperial) {
63988               tag[field.key] = value;
63989           } else {
63990               tag[field.key] = value + ' mph';
63991           }
63992
63993           dispatch$$1.call('change', this, tag);
63994       }
63995
63996
63997       maxspeed.tags = function(tags) {
63998           var value = tags[field.key];
63999
64000           if (value && value.indexOf('mph') >= 0) {
64001               value = parseInt(value, 10);
64002               isImperial = true;
64003           } else if (value) {
64004               isImperial = false;
64005           }
64006
64007           setSuggestions();
64008           utilGetSetValue(input, value || '');
64009       };
64010
64011
64012       maxspeed.focus = function() {
64013           input.node().focus();
64014       };
64015
64016
64017       maxspeed.entity = function(_) {
64018           entity = _;
64019       };
64020
64021
64022       return utilRebind(maxspeed, dispatch$$1, 'on');
64023   }
64024
64025   /**
64026    * This function is like `baseIndexOf` except that it accepts a comparator.
64027    *
64028    * @private
64029    * @param {Array} array The array to inspect.
64030    * @param {*} value The value to search for.
64031    * @param {number} fromIndex The index to search from.
64032    * @param {Function} comparator The comparator invoked per element.
64033    * @returns {number} Returns the index of the matched value, else `-1`.
64034    */
64035   function baseIndexOfWith(array, value, fromIndex, comparator) {
64036     var index = fromIndex - 1,
64037         length = array.length;
64038
64039     while (++index < length) {
64040       if (comparator(array[index], value)) {
64041         return index;
64042       }
64043     }
64044     return -1;
64045   }
64046
64047   /** Used for built-in method references. */
64048   var arrayProto$2 = Array.prototype;
64049
64050   /** Built-in value references. */
64051   var splice$2 = arrayProto$2.splice;
64052
64053   /**
64054    * The base implementation of `_.pullAllBy` without support for iteratee
64055    * shorthands.
64056    *
64057    * @private
64058    * @param {Array} array The array to modify.
64059    * @param {Array} values The values to remove.
64060    * @param {Function} [iteratee] The iteratee invoked per element.
64061    * @param {Function} [comparator] The comparator invoked per element.
64062    * @returns {Array} Returns `array`.
64063    */
64064   function basePullAll(array, values, iteratee, comparator) {
64065     var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
64066         index = -1,
64067         length = values.length,
64068         seen = array;
64069
64070     if (array === values) {
64071       values = copyArray(values);
64072     }
64073     if (iteratee) {
64074       seen = arrayMap(array, baseUnary(iteratee));
64075     }
64076     while (++index < length) {
64077       var fromIndex = 0,
64078           value = values[index],
64079           computed = iteratee ? iteratee(value) : value;
64080
64081       while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
64082         if (seen !== array) {
64083           splice$2.call(seen, fromIndex, 1);
64084         }
64085         splice$2.call(array, fromIndex, 1);
64086       }
64087     }
64088     return array;
64089   }
64090
64091   /**
64092    * This method is like `_.pull` except that it accepts an array of values to remove.
64093    *
64094    * **Note:** Unlike `_.difference`, this method mutates `array`.
64095    *
64096    * @static
64097    * @memberOf _
64098    * @since 4.0.0
64099    * @category Array
64100    * @param {Array} array The array to modify.
64101    * @param {Array} values The values to remove.
64102    * @returns {Array} Returns `array`.
64103    * @example
64104    *
64105    * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
64106    *
64107    * _.pullAll(array, ['a', 'c']);
64108    * console.log(array);
64109    * // => ['b', 'b']
64110    */
64111   function pullAll(array, values) {
64112     return (array && array.length && values && values.length)
64113       ? basePullAll(array, values)
64114       : array;
64115   }
64116
64117   /**
64118    * Removes all given values from `array` using
64119    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
64120    * for equality comparisons.
64121    *
64122    * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
64123    * to remove elements from an array by predicate.
64124    *
64125    * @static
64126    * @memberOf _
64127    * @since 2.0.0
64128    * @category Array
64129    * @param {Array} array The array to modify.
64130    * @param {...*} [values] The values to remove.
64131    * @returns {Array} Returns `array`.
64132    * @example
64133    *
64134    * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
64135    *
64136    * _.pull(array, 'a', 'c');
64137    * console.log(array);
64138    * // => ['b', 'b']
64139    */
64140   var pull = baseRest(pullAll);
64141
64142   function uiFieldRadio(field, context) {
64143       var dispatch$$1 = dispatch('change'),
64144           placeholder = d3_select(null),
64145           wrap = d3_select(null),
64146           labels = d3_select(null),
64147           radios = d3_select(null),
64148           radioData = clone(field.options || field.keys),
64149           typeField,
64150           layerField,
64151           oldType = {},
64152           entity;
64153
64154
64155       function selectedKey() {
64156           var node = wrap.selectAll('.toggle-list label.active input');
64157           return !node.empty() && node.datum();
64158       }
64159
64160
64161       function radio(selection$$1) {
64162           selection$$1.classed('preset-radio', true);
64163
64164           wrap = selection$$1.selectAll('.preset-input-wrap')
64165               .data([0]);
64166
64167           var enter = wrap.enter()
64168               .append('div')
64169               .attr('class', 'preset-input-wrap toggle-list');
64170
64171           enter
64172               .append('span')
64173               .attr('class', 'placeholder');
64174
64175           wrap = wrap
64176               .merge(enter);
64177
64178
64179           placeholder = wrap.selectAll('.placeholder');
64180
64181           labels = wrap.selectAll('label')
64182               .data(radioData);
64183
64184           enter = labels.enter()
64185               .append('label');
64186
64187           enter
64188               .append('input')
64189               .attr('type', 'radio')
64190               .attr('name', field.id)
64191               .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
64192               .attr('checked', false);
64193
64194           enter
64195               .append('span')
64196               .text(function(d) { return field.t('options.' + d, { 'default': d }); });
64197
64198           labels = labels
64199               .merge(enter);
64200
64201           radios = labels.selectAll('input')
64202               .on('change', changeRadio);
64203
64204       }
64205
64206
64207       function structureExtras(selection$$1, tags) {
64208           var selected = selectedKey(),
64209               type = context.presets().field(selected),
64210               layer = context.presets().field('layer'),
64211               showLayer = (selected === 'bridge' || selected === 'tunnel');
64212
64213
64214           var extrasWrap = selection$$1.selectAll('.structure-extras-wrap')
64215               .data(selected ? [0] : []);
64216
64217           extrasWrap.exit()
64218               .remove();
64219
64220           extrasWrap = extrasWrap.enter()
64221               .append('div')
64222               .attr('class', 'structure-extras-wrap')
64223               .merge(extrasWrap);
64224
64225           var list = extrasWrap.selectAll('ul')
64226               .data([0]);
64227
64228           list = list.enter()
64229               .append('ul')
64230               .merge(list);
64231
64232
64233           // Type
64234           if (type) {
64235               if (!typeField || typeField.id !== selected) {
64236                   typeField = uiField(context, type, entity, { wrap: false })
64237                       .on('change', changeType);
64238               }
64239               typeField.tags(tags);
64240           } else {
64241               typeField = null;
64242           }
64243
64244           var typeItem = list.selectAll('.structure-type-item')
64245               .data(typeField ? [typeField] : [], function(d) { return d.id; });
64246
64247           // Exit
64248           typeItem.exit()
64249               .remove();
64250
64251           // Enter
64252           var typeEnter = typeItem.enter()
64253               .insert('li', ':first-child')
64254               .attr('class', 'cf structure-type-item');
64255
64256           typeEnter
64257               .append('span')
64258               .attr('class', 'col6 label structure-label-type')
64259               .attr('for', 'preset-input-' + selected)
64260               .text(t('inspector.radio.structure.type'));
64261
64262           typeEnter
64263               .append('div')
64264               .attr('class', 'col6 structure-input-type-wrap');
64265
64266           // Update
64267           typeItem = typeItem
64268               .merge(typeEnter);
64269
64270           if (typeField) {
64271               typeItem.selectAll('.structure-input-type-wrap')
64272                   .call(typeField.render);
64273           }
64274
64275
64276           // Layer
64277           if (layer && showLayer) {
64278               if (!layerField) {
64279                   layerField = uiField(context, layer, entity, { wrap: false })
64280                       .on('change', changeLayer);
64281               }
64282               layerField.tags(tags);
64283               field.keys = union(field.keys, ['layer']);
64284           } else {
64285               layerField = null;
64286               pull(field.keys, 'layer');
64287           }
64288
64289           var layerItem = list.selectAll('.structure-layer-item')
64290               .data(layerField ? [layerField] : []);
64291
64292           // Exit
64293           layerItem.exit()
64294               .remove();
64295
64296           // Enter
64297           var layerEnter = layerItem.enter()
64298               .append('li')
64299               .attr('class', 'cf structure-layer-item');
64300
64301           layerEnter
64302               .append('span')
64303               .attr('class', 'col6 label structure-label-layer')
64304               .attr('for', 'preset-input-layer')
64305               .text(t('inspector.radio.structure.layer'));
64306
64307           layerEnter
64308               .append('div')
64309               .attr('class', 'col6 structure-input-layer-wrap');
64310
64311           // Update
64312           layerItem = layerItem
64313               .merge(layerEnter);
64314
64315           if (layerField) {
64316               layerItem.selectAll('.structure-input-layer-wrap')
64317                   .call(layerField.render);
64318           }
64319       }
64320
64321
64322       function changeType(t$$1, onInput) {
64323           var key = selectedKey();
64324           if (!key) return;
64325
64326           var val = t$$1[key];
64327           if (val !== 'no') {
64328               oldType[key] = val;
64329           }
64330
64331           if (field.type === 'structureRadio') {
64332               // remove layer if it should not be set
64333               if (val === 'no' ||
64334                   (key !== 'bridge' && key !== 'tunnel') ||
64335                   (key === 'tunnel' && val === 'building_passage')) {
64336                   t$$1.layer = undefined;
64337               }
64338               // add layer if it should be set
64339               if (t$$1.layer === undefined) {
64340                   if (key === 'bridge' && val !== 'no') {
64341                       t$$1.layer = '1';
64342                   }
64343                   if (key === 'tunnel' && val !== 'no' && val !== 'building_passage') {
64344                       t$$1.layer = '-1';
64345                   }
64346               }
64347            }
64348
64349           dispatch$$1.call('change', this, t$$1, onInput);
64350       }
64351
64352
64353       function changeLayer(t$$1, onInput) {
64354           if (t$$1.layer === '0') {
64355               t$$1.layer = undefined;
64356           }
64357           dispatch$$1.call('change', this, t$$1, onInput);
64358       }
64359
64360
64361       function changeRadio() {
64362           var t$$1 = {},
64363               activeKey;
64364
64365           if (field.key) {
64366               t$$1[field.key] = undefined;
64367           }
64368
64369           radios.each(function(d) {
64370               var active = d3_select(this).property('checked');
64371               if (active) activeKey = d;
64372
64373               if (field.key) {
64374                   if (active) t$$1[field.key] = d;
64375               } else {
64376                   var val = oldType[activeKey] || 'yes';
64377                   t$$1[d] = active ? val : undefined;
64378               }
64379           });
64380
64381           if (field.type === 'structureRadio') {
64382               if (activeKey === 'bridge') {
64383                   t$$1.layer = '1';
64384               } else if (activeKey === 'tunnel' && t$$1.tunnel !== 'building_passage') {
64385                   t$$1.layer = '-1';
64386               } else {
64387                   t$$1.layer = undefined;
64388               }
64389           }
64390
64391           dispatch$$1.call('change', this, t$$1);
64392       }
64393
64394
64395       radio.tags = function(tags) {
64396           function checked(d) {
64397               if (field.key) {
64398                   return tags[field.key] === d;
64399               } else {
64400                   return !!(tags[d] && tags[d].toLowerCase() !== 'no');
64401               }
64402           }
64403
64404           labels.classed('active', checked);
64405           radios.property('checked', checked);
64406
64407           var selection$$1 = radios.filter(function() { return this.checked; });
64408
64409           if (selection$$1.empty()) {
64410               placeholder.text(t('inspector.none'));
64411           } else {
64412               placeholder.text(selection$$1.attr('value'));
64413               oldType[selection$$1.datum()] = tags[selection$$1.datum()];
64414           }
64415
64416           if (field.type === 'structureRadio') {
64417               // For waterways without a tunnel tag, set 'culvert' as
64418               // the oldType to default to if the user picks 'tunnel'
64419               if (!!tags.waterway && !oldType.tunnel) {
64420                   oldType.tunnel = 'culvert';
64421               }
64422
64423               wrap.call(structureExtras, tags);
64424           }
64425       };
64426
64427
64428       radio.focus = function() {
64429           radios.node().focus();
64430       };
64431
64432
64433       radio.entity = function(_) {
64434           if (!arguments.length) return entity;
64435           entity = _;
64436           oldType = {};
64437           return radio;
64438       };
64439
64440
64441       return utilRebind(radio, dispatch$$1, 'on');
64442   }
64443
64444   function uiFieldRestrictions(field, context) {
64445       var dispatch$$1 = dispatch('change');
64446       var breathe = behaviorBreathe(context);
64447       var storedViaWay = context.storage('turn-restriction-via-way');
64448       var storedDistance = context.storage('turn-restriction-distance');
64449
64450       var _maxViaWay = storedViaWay !== null ? (+storedViaWay) : 1;
64451       var _maxDistance = storedDistance ? (+storedDistance) : 30;
64452       var _initialized = false;
64453       var _parent = d3_select(null);       // the entire field
64454       var _container = d3_select(null);    // just the map
64455       var _oldTurns;
64456       var _graph;
64457       var _vertexID;
64458       var _intersection;
64459       var _fromWayID;
64460
64461
64462       function restrictions(selection$$1) {
64463           _parent = selection$$1;
64464
64465           // try to reuse the intersection, but always rebuild it if the graph has changed
64466           if (_vertexID && (context.graph() !== _graph || !_intersection)) {
64467               _graph = context.graph();
64468               _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
64469           }
64470
64471           // It's possible for there to be no actual intersection here.
64472           // for example, a vertex of two `highway=path`
64473           // In this case, hide the field.
64474           var isOK = (
64475               _intersection &&
64476               _intersection.vertices.length &&           // has vertices
64477               _intersection.vertices                     // has the vertex that the user selected
64478                   .filter(function(vertex) { return vertex.id === _vertexID; }).length &&
64479               _intersection.ways.length > 2 &&           // has more than 2 ways
64480               _intersection.ways                         // has more than 1 TO way
64481                   .filter(function(way) { return way.__to; }).length > 1
64482           );
64483
64484           // Also hide in the case where
64485           d3_select(selection$$1.node().parentNode).classed('hide', !isOK);
64486
64487           // if form field is hidden or has detached from dom, clean up.
64488           if (!isOK ||
64489               !d3_select('.inspector-wrap.inspector-hidden').empty() ||
64490               !selection$$1.node().parentNode ||
64491               !selection$$1.node().parentNode.parentNode) {
64492               selection$$1.call(restrictions.off);
64493               return;
64494           }
64495
64496
64497           var wrap = selection$$1.selectAll('.preset-input-wrap')
64498               .data([0]);
64499
64500           wrap = wrap.enter()
64501               .append('div')
64502               .attr('class', 'preset-input-wrap')
64503               .merge(wrap);
64504
64505           var container = wrap.selectAll('.restriction-container')
64506               .data([0]);
64507
64508           // enter
64509           var containerEnter = container.enter()
64510               .append('div')
64511               .attr('class', 'restriction-container');
64512
64513           containerEnter
64514               .append('div')
64515               .attr('class', 'restriction-help');
64516
64517           // update
64518           _container = containerEnter
64519               .merge(container)
64520               .call(renderViewer);
64521
64522           var controls = wrap.selectAll('.restriction-controls')
64523               .data([0]);
64524
64525           // enter/update
64526           controls.enter()
64527               .append('div')
64528               .attr('class', 'restriction-controls-container')
64529               .append('div')
64530               .attr('class', 'restriction-controls')
64531               .merge(controls)
64532               .call(renderControls);
64533       }
64534
64535
64536       function renderControls(selection$$1) {
64537           var distControl = selection$$1.selectAll('.restriction-distance')
64538               .data([0]);
64539
64540           distControl.exit()
64541               .remove();
64542
64543           var distControlEnter = distControl.enter()
64544               .append('div')
64545               .attr('class', 'restriction-control restriction-distance');
64546
64547           distControlEnter
64548               .append('span')
64549               .attr('class', 'restriction-control-label restriction-distance-label')
64550               .text(t('restriction.controls.distance') + ':');
64551
64552           distControlEnter
64553               .append('input')
64554               .attr('class', 'restriction-distance-input')
64555               .attr('type', 'range')
64556               .attr('min', '20')
64557               .attr('max', '50')
64558               .attr('step', '5');
64559
64560           distControlEnter
64561               .append('span')
64562               .attr('class', 'restriction-distance-text');
64563
64564           // update
64565           selection$$1.selectAll('.restriction-distance-input')
64566               .property('value', _maxDistance)
64567               .on('input', function() {
64568                   var val = d3_select(this).property('value');
64569                   _maxDistance = +val;
64570                   _intersection = null;
64571                   _container.selectAll('.layer-osm .layer-turns *').remove();
64572                   context.storage('turn-restriction-distance', _maxDistance);
64573                   _parent.call(restrictions);
64574               });
64575
64576           selection$$1.selectAll('.restriction-distance-text')
64577               .text(displayMaxDistance(_maxDistance));
64578
64579
64580           var viaControl = selection$$1.selectAll('.restriction-via-way')
64581               .data([0]);
64582
64583           viaControl.exit()
64584               .remove();
64585
64586           var viaControlEnter = viaControl.enter()
64587               .append('div')
64588               .attr('class', 'restriction-control restriction-via-way');
64589
64590           viaControlEnter
64591               .append('span')
64592               .attr('class', 'restriction-control-label restriction-via-way-label')
64593               .text(t('restriction.controls.via') + ':');
64594
64595           viaControlEnter
64596               .append('input')
64597               .attr('class', 'restriction-via-way-input')
64598               .attr('type', 'range')
64599               .attr('min', '0')
64600               .attr('max', '2')
64601               .attr('step', '1');
64602
64603           viaControlEnter
64604               .append('span')
64605               .attr('class', 'restriction-via-way-text');
64606
64607           // update
64608           selection$$1.selectAll('.restriction-via-way-input')
64609               .property('value', _maxViaWay)
64610               .on('input', function() {
64611                   var val = d3_select(this).property('value');
64612                   _maxViaWay = +val;
64613                   _container.selectAll('.layer-osm .layer-turns *').remove();
64614                   context.storage('turn-restriction-via-way', _maxViaWay);
64615                   _parent.call(restrictions);
64616               });
64617
64618           selection$$1.selectAll('.restriction-via-way-text')
64619               .text(displayMaxVia(_maxViaWay));
64620       }
64621
64622
64623       function renderViewer(selection$$1) {
64624           if (!_intersection) return;
64625
64626           var vgraph = _intersection.graph;
64627           var filter = utilFunctor(true);
64628           var projection = geoRawMercator();
64629
64630           var d = utilGetDimensions(selection$$1);
64631           var c = geoVecScale(d, 0.5);
64632           var z = 22;
64633
64634           projection.scale(geoZoomToScale(z));
64635
64636           // Calculate extent of all key vertices
64637           var extent = geoExtent$$1();
64638           for (var i = 0; i < _intersection.vertices.length; i++) {
64639               extent._extend(_intersection.vertices[i].extent());
64640           }
64641
64642           // If this is a large intersection, adjust zoom to fit extent
64643           if (_intersection.vertices.length > 1) {
64644               var padding = 180;   // in z22 pixels
64645               var tl = projection([extent[0][0], extent[1][1]]);
64646               var br = projection([extent[1][0], extent[0][1]]);
64647               var hFactor = (br[0] - tl[0]) / (d[0] - padding);
64648               var vFactor = (br[1] - tl[1]) / (d[1] - padding);
64649               var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
64650               var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
64651               z = z - Math.max(hZoomDiff, vZoomDiff);
64652               projection.scale(geoZoomToScale(z));
64653           }
64654
64655           var padTop = 35;   // reserve top space for hint text
64656           var extentCenter = projection(extent.center());
64657           extentCenter[1] = extentCenter[1] - padTop;
64658
64659           projection
64660               .translate(geoVecSubtract(c, extentCenter))
64661               .clipExtent([[0, 0], d]);
64662
64663           var drawLayers = svgLayers(projection, context).only('osm').dimensions(d);
64664           var drawVertices = svgVertices$$1(projection, context);
64665           var drawLines = svgLines$$1(projection, context);
64666           var drawTurns = svgTurns(projection, context);
64667
64668           var firstTime = selection$$1.selectAll('.surface').empty();
64669
64670           selection$$1
64671               .call(drawLayers);
64672
64673           var surface = selection$$1.selectAll('.surface')
64674               .classed('tr', true);
64675
64676           if (firstTime) {
64677               _initialized = true;
64678
64679               surface
64680                   .call(breathe);
64681
64682               d3_select(window)
64683                   .on('resize.restrictions', function() {
64684                       utilSetDimensions(_container, null);
64685                       redraw();
64686                   });
64687           }
64688
64689
64690           // This can happen if we've lowered the detail while a FROM way
64691           // is selected, and that way is no longer part of the intersection.
64692           if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
64693               _fromWayID = null;
64694               _oldTurns = null;
64695           }
64696
64697           surface
64698               .call(utilSetDimensions, d)
64699               .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z)
64700               .call(drawLines, vgraph, _intersection.ways, filter)
64701               .call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay));
64702
64703           surface
64704               .on('click.restrictions', click)
64705               .on('mouseover.restrictions', mouseover);
64706
64707           surface
64708               .selectAll('.selected')
64709               .classed('selected', false);
64710
64711           surface
64712               .selectAll('.related')
64713               .classed('related', false);
64714
64715           if (_fromWayID) {
64716               var way = vgraph.entity(_fromWayID);
64717               surface
64718                   .selectAll('.' + _fromWayID)
64719                   .classed('selected', true)
64720                   .classed('related', true);
64721           }
64722
64723           updateHints(null);
64724
64725
64726           function click() {
64727               surface
64728                   .call(breathe.off)
64729                   .call(breathe);
64730
64731               var datum = event.target.__data__;
64732               var entity = datum && datum.properties && datum.properties.entity;
64733               if (entity) {
64734                   datum = entity;
64735               }
64736
64737               if (datum instanceof osmWay && (datum.__from || datum.__via)) {
64738                   _fromWayID = datum.id;
64739                   _oldTurns = null;
64740                   redraw();
64741
64742               } else if (datum instanceof osmTurn) {
64743                   var actions, extraActions, turns, i;
64744                   var restrictionType = osmInferRestriction(vgraph, datum, projection);
64745
64746                   if (datum.restrictionID && !datum.direct) {
64747                       return;
64748
64749                   } else if (datum.restrictionID && !datum.only) {    // NO -> ONLY
64750                       var seen = {};
64751                       var datumOnly = cloneDeep(datum);
64752                       datumOnly.only = true;
64753                       restrictionType = restrictionType.replace(/^no/, 'only');
64754
64755                       // Adding an ONLY restriction should destroy all other direct restrictions from the FROM towards the VIA.
64756                       // We will remember them in _oldTurns, and restore them if the user clicks again.
64757                       turns = _intersection.turns(_fromWayID, 2);
64758                       extraActions = [];
64759                       _oldTurns = [];
64760                       for (i = 0; i < turns.length; i++) {
64761                           var turn = turns[i];
64762                           if (seen[turn.restrictionID]) continue;  // avoid deleting the turn twice (#4968, #4928)
64763
64764                           if (turn.direct && turn.path[1] === datum.path[1]) {
64765                               seen[turns[i].restrictionID] = true;
64766                               turn.restrictionType = osmInferRestriction(vgraph, turn, projection);
64767                               _oldTurns.push(turn);
64768                               extraActions.push(actionUnrestrictTurn(turn));
64769                           }
64770                       }
64771
64772                       actions = _intersection.actions.concat(extraActions, [
64773                           actionRestrictTurn(datumOnly, restrictionType),
64774                           t('operations.restriction.annotation.create')
64775                       ]);
64776
64777                   } else if (datum.restrictionID) {   // ONLY -> Allowed
64778                       // Restore whatever restrictions we might have destroyed by cycling thru the ONLY state.
64779                       // This relies on the assumption that the intersection was already split up when we
64780                       // performed the previous action (NO -> ONLY), so the IDs in _oldTurns shouldn't have changed.
64781                       turns = _oldTurns || [];
64782                       extraActions = [];
64783                       for (i = 0; i < turns.length; i++) {
64784                           if (turns[i].key !== datum.key) {
64785                               extraActions.push(actionRestrictTurn(turns[i], turns[i].restrictionType));
64786                           }
64787                       }
64788                       _oldTurns = null;
64789
64790                       actions = _intersection.actions.concat(extraActions, [
64791                           actionUnrestrictTurn(datum),
64792                           t('operations.restriction.annotation.delete')
64793                       ]);
64794
64795                   } else {    // Allowed -> NO
64796                       actions = _intersection.actions.concat([
64797                           actionRestrictTurn(datum, restrictionType),
64798                           t('operations.restriction.annotation.create')
64799                       ]);
64800                   }
64801
64802                   context.perform.apply(context, actions);
64803
64804                   // At this point the datum will be changed, but will have same key..
64805                   // Refresh it and update the help..
64806                   var s = surface.selectAll('.' + datum.key);
64807                   datum = s.empty() ? null : s.datum();
64808                   updateHints(datum);
64809
64810               } else {
64811                   _fromWayID = null;
64812                   _oldTurns = null;
64813                   redraw();
64814               }
64815           }
64816
64817
64818           function mouseover() {
64819               var datum = event.target.__data__;
64820               updateHints(datum);
64821           }
64822
64823
64824           function redraw() {
64825               if (context.hasEntity(_vertexID)) {
64826                   _container.call(renderViewer);
64827               }
64828           }
64829
64830
64831           function highlightPathsFrom(wayID) {
64832               surface.selectAll('.related')
64833                   .classed('related', false)
64834                   .classed('allow', false)
64835                   .classed('restrict', false)
64836                   .classed('only', false);
64837
64838               surface.selectAll('.' + wayID)
64839                   .classed('related', true);
64840
64841               if (wayID) {
64842                   var turns = _intersection.turns(wayID, _maxViaWay);
64843                   for (var i = 0; i < turns.length; i++) {
64844                       var turn = turns[i];
64845                       var ids = [turn.to.way];
64846                       var klass = (turn.no ? 'restrict' : (turn.only ? 'only' : 'allow'));
64847
64848                       if (turn.only || turns.length === 1) {
64849                           if (turn.via.ways) {
64850                               ids = ids.concat(turn.via.ways);
64851                           }
64852                       } else if (turn.to.way === wayID) {
64853                           continue;
64854                       }
64855
64856                       surface.selectAll(utilEntitySelector(ids))
64857                           .classed('related', true)
64858                           .classed('allow', (klass === 'allow'))
64859                           .classed('restrict', (klass === 'restrict'))
64860                           .classed('only', (klass === 'only'));
64861                   }
64862               }
64863           }
64864
64865
64866           function updateHints(datum) {
64867               var help = _container.selectAll('.restriction-help').html('');
64868
64869               var placeholders = {};
64870               ['from', 'via', 'to'].forEach(function(k) {
64871                   placeholders[k] = '<span class="qualifier">' + t('restriction.help.' + k) + '</span>';
64872               });
64873
64874               var entity = datum && datum.properties && datum.properties.entity;
64875               if (entity) {
64876                   datum = entity;
64877               }
64878
64879               if (_fromWayID) {
64880                   way = vgraph.entity(_fromWayID);
64881                   surface
64882                       .selectAll('.' + _fromWayID)
64883                       .classed('selected', true)
64884                       .classed('related', true);
64885               }
64886
64887               // Hovering a way
64888               if (datum instanceof osmWay && datum.__from) {
64889                   way = datum;
64890
64891                   highlightPathsFrom(_fromWayID ? null : way.id);
64892                   surface.selectAll('.' + way.id)
64893                       .classed('related', true);
64894
64895                   var clickSelect = (!_fromWayID || _fromWayID !== way.id);
64896                   help
64897                       .append('div')      // "Click to select FROM {fromName}." / "FROM {fromName}"
64898                       .html(t('restriction.help.' + (clickSelect ? 'select_from_name' : 'from_name'), {
64899                           from: placeholders.from,
64900                           fromName: displayName(way.id, vgraph)
64901                       }));
64902
64903
64904               // Hovering a turn arrow
64905               } else if (datum instanceof osmTurn) {
64906                   var restrictionType = osmInferRestriction(vgraph, datum, projection);
64907                   var turnType = restrictionType.replace(/^(only|no)\_/, '');
64908                   var indirect = (datum.direct === false ? t('restriction.help.indirect') : '');
64909                   var klass, turnText, nextText;
64910
64911                   if (datum.no) {
64912                       klass = 'restrict';
64913                       turnText = t('restriction.help.turn.no_' + turnType, { indirect: indirect });
64914                       nextText = t('restriction.help.turn.only_' + turnType, { indirect: '' });
64915                   } else if (datum.only) {
64916                       klass = 'only';
64917                       turnText = t('restriction.help.turn.only_' + turnType, { indirect: indirect });
64918                       nextText = t('restriction.help.turn.allowed_' + turnType, { indirect: '' });
64919                   } else {
64920                       klass = 'allow';
64921                       turnText = t('restriction.help.turn.allowed_' + turnType, { indirect: indirect });
64922                       nextText = t('restriction.help.turn.no_' + turnType, { indirect: '' });
64923                   }
64924
64925                   help
64926                       .append('div')      // "NO Right Turn (indirect)"
64927                       .attr('class', 'qualifier ' + klass)
64928                       .text(turnText);
64929
64930                   help
64931                       .append('div')      // "FROM {fromName} TO {toName}"
64932                       .html(t('restriction.help.from_name_to_name', {
64933                           from: placeholders.from,
64934                           fromName: displayName(datum.from.way, vgraph),
64935                           to: placeholders.to,
64936                           toName: displayName(datum.to.way, vgraph)
64937                       }));
64938
64939                   if (datum.via.ways && datum.via.ways.length) {
64940                       var names = [];
64941                       for (var i = 0; i < datum.via.ways.length; i++) {
64942                           var prev = names[names.length - 1];
64943                           var curr = displayName(datum.via.ways[i], vgraph);
64944                           if (!prev || curr !== prev)   // collapse identical names
64945                               names.push(curr);
64946                       }
64947
64948                       help
64949                           .append('div')      // "VIA {viaNames}"
64950                           .html(t('restriction.help.via_names', {
64951                               via: placeholders.via,
64952                               viaNames: names.join(', ')
64953                           }));
64954                   }
64955
64956                   if (!indirect) {
64957                       help
64958                           .append('div')      // Click for "No Right Turn"
64959                           .text(t('restriction.help.toggle', { turn: nextText.trim() }));
64960                   }
64961
64962                   highlightPathsFrom(null);
64963                   var alongIDs = datum.path.slice();
64964                   surface.selectAll(utilEntitySelector(alongIDs))
64965                       .classed('related', true)
64966                       .classed('allow', (klass === 'allow'))
64967                       .classed('restrict', (klass === 'restrict'))
64968                       .classed('only', (klass === 'only'));
64969
64970
64971               // Hovering empty surface
64972               } else {
64973                   highlightPathsFrom(null);
64974                   if (_fromWayID) {
64975                       help
64976                           .append('div')      // "FROM {fromName}"
64977                           .html(t('restriction.help.from_name', {
64978                               from: placeholders.from,
64979                               fromName: displayName(_fromWayID, vgraph)
64980                           }));
64981
64982                   } else {
64983                       help
64984                           .append('div')      // "Click to select a FROM segment."
64985                           .html(t('restriction.help.select_from', {
64986                               from: placeholders.from
64987                           }));
64988                   }
64989               }
64990           }
64991       }
64992
64993
64994       function displayMaxDistance(maxDist) {
64995           var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
64996           var opts;
64997
64998           if (isImperial) {
64999               var distToFeet = {   // imprecise conversion for prettier display
65000                   20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160
65001               }[maxDist];
65002               opts = { distance: t('units.feet', { quantity: distToFeet }) };
65003           } else {
65004               opts = { distance: t('units.meters', { quantity: maxDist }) };
65005           }
65006
65007           return t('restriction.controls.distance_up_to', opts);
65008       }
65009
65010
65011       function displayMaxVia(maxVia) {
65012           return maxVia === 0 ? t('restriction.controls.via_node_only')
65013               : maxVia === 1 ? t('restriction.controls.via_up_to_one')
65014               : t('restriction.controls.via_up_to_two');
65015       }
65016
65017
65018       function displayName(entityID, graph) {
65019           var entity = graph.entity(entityID);
65020           var name = utilDisplayName(entity) || '';
65021           var matched = context.presets().match(entity, graph);
65022           var type = (matched && matched.name()) || utilDisplayType(entity.id);
65023           return name || type;
65024       }
65025
65026
65027       restrictions.entity = function(_) {
65028           _intersection = null;
65029           _fromWayID = null;
65030           _oldTurns = null;
65031           _vertexID = _.id;
65032       };
65033
65034
65035       restrictions.tags = function() {};
65036       restrictions.focus = function() {};
65037
65038
65039       restrictions.off = function(selection$$1) {
65040           if (!_initialized) return;
65041
65042           selection$$1.selectAll('.surface')
65043               .call(breathe.off)
65044               .on('click.restrictions', null)
65045               .on('mouseover.restrictions', null);
65046
65047           d3_select(window)
65048               .on('resize.restrictions', null);
65049       };
65050
65051
65052       return utilRebind(restrictions, dispatch$$1, 'on');
65053   }
65054
65055   function uiFieldTextarea(field) {
65056       var dispatch$$1 = dispatch('change'),
65057           input = d3_select(null);
65058
65059
65060       function textarea(selection$$1) {
65061           input = selection$$1.selectAll('textarea')
65062               .data([0]);
65063
65064           input = input.enter()
65065               .append('textarea')
65066               .attr('id', 'preset-input-' + field.safeid)
65067               .attr('placeholder', field.placeholder() || t('inspector.unknown'))
65068               .attr('maxlength', 255)
65069               .call(utilNoAuto)
65070               .on('input', change(true))
65071               .on('blur', change())
65072               .on('change', change())
65073               .merge(input);
65074       }
65075
65076
65077       function change(onInput) {
65078           return function() {
65079               var t$$1 = {};
65080               t$$1[field.key] = utilGetSetValue(input) || undefined;
65081               dispatch$$1.call('change', this, t$$1, onInput);
65082           };
65083       }
65084
65085
65086       textarea.tags = function(tags) {
65087           utilGetSetValue(input, tags[field.key] || '');
65088       };
65089
65090
65091       textarea.focus = function() {
65092           input.node().focus();
65093       };
65094
65095
65096       return utilRebind(textarea, dispatch$$1, 'on');
65097   }
65098
65099   function uiFieldWikipedia(field, context) {
65100       var dispatch$$1 = dispatch('change'),
65101           wikipedia = services.wikipedia,
65102           wikidata = services.wikidata,
65103           link = d3_select(null),
65104           lang = d3_select(null),
65105           title = d3_select(null),
65106           wikiURL = '',
65107           entity;
65108
65109
65110       function wiki(selection$$1) {
65111           var langcombo = d3combobox()
65112               .container(context.container())
65113               .fetcher(function(value, cb) {
65114                   var v = value.toLowerCase();
65115
65116                   cb(wikipedia$2.filter(function(d) {
65117                       return d[0].toLowerCase().indexOf(v) >= 0 ||
65118                           d[1].toLowerCase().indexOf(v) >= 0 ||
65119                           d[2].toLowerCase().indexOf(v) >= 0;
65120                   }).map(function(d) {
65121                       return { value: d[1] };
65122                   }));
65123               });
65124
65125           var titlecombo = d3combobox()
65126               .container(context.container())
65127               .fetcher(function(value, cb) {
65128                   if (!value) {
65129                       value = context.entity(entity.id).tags.name || '';
65130                   }
65131
65132                   var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
65133                   searchfn(language()[2], value, function(query, data$$1) {
65134                       cb(data$$1.map(function(d) {
65135                           return { value: d };
65136                       }));
65137                   });
65138               });
65139
65140
65141           lang = selection$$1.selectAll('input.wiki-lang')
65142               .data([0]);
65143
65144           lang = lang.enter()
65145               .append('input')
65146               .attr('type', 'text')
65147               .attr('class', 'wiki-lang')
65148               .attr('placeholder', t('translate.localized_translation_language'))
65149               .call(utilNoAuto)
65150               .merge(lang);
65151
65152           utilGetSetValue(lang, language()[1]);
65153
65154           lang
65155               .call(langcombo)
65156               .on('blur', changeLang)
65157               .on('change', changeLang);
65158
65159
65160           title = selection$$1.selectAll('input.wiki-title')
65161               .data([0]);
65162
65163           title = title.enter()
65164               .append('input')
65165               .attr('type', 'text')
65166               .attr('class', 'wiki-title')
65167               .attr('id', 'preset-input-' + field.safeid)
65168               .call(utilNoAuto)
65169               .merge(title);
65170
65171           title
65172               .call(titlecombo)
65173               .on('blur', blur)
65174               .on('change', change);
65175
65176
65177           link = selection$$1.selectAll('.wiki-link')
65178               .data([0]);
65179
65180           link = link.enter()
65181               .append('button')
65182               .attr('class', 'button-input-action wiki-link minor')
65183               .attr('tabindex', -1)
65184               .call(svgIcon('#icon-out-link'))
65185               .merge(link);
65186
65187           link
65188               .on('click', function() {
65189                   event.preventDefault();
65190                   if (wikiURL) window.open(wikiURL, '_blank');
65191               });
65192       }
65193
65194
65195       function language() {
65196           var value = utilGetSetValue(lang).toLowerCase();
65197           var locale = utilDetect().locale.toLowerCase();
65198           var localeLanguage;
65199           return find$1(wikipedia$2, function(d) {
65200               if (d[2] === locale) localeLanguage = d;
65201               return d[0].toLowerCase() === value ||
65202                   d[1].toLowerCase() === value ||
65203                   d[2] === value;
65204           }) || localeLanguage || ['English', 'English', 'en'];
65205       }
65206
65207
65208       function changeLang() {
65209           utilGetSetValue(lang, language()[1]);
65210           change(true);
65211       }
65212
65213
65214       function blur() {
65215           change(true);
65216       }
65217
65218
65219       function change(skipWikidata) {
65220           var value = utilGetSetValue(title),
65221               m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/),
65222               l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; }),
65223               syncTags = {};
65224
65225           if (l) {
65226               // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
65227               value = decodeURIComponent(m[2]).replace(/_/g, ' ');
65228               if (m[3]) {
65229                   var anchor;
65230                   try {
65231                       // Best-effort `anchordecode:` implementation
65232                       anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
65233                   } catch (e) {
65234                       anchor = decodeURIComponent(m[3]);
65235                   }
65236                   value += '#' + anchor.replace(/_/g, ' ');
65237               }
65238               value = value.slice(0, 1).toUpperCase() + value.slice(1);
65239               utilGetSetValue(lang, l[1]);
65240               utilGetSetValue(title, value);
65241           }
65242
65243           if (value) {
65244               syncTags.wikipedia = language()[2] + ':' + value;
65245           } else {
65246               syncTags.wikipedia = undefined;
65247               syncTags.wikidata = undefined;
65248           }
65249
65250           dispatch$$1.call('change', this, syncTags);
65251
65252
65253           if (skipWikidata || !value || !language()[2]) return;
65254
65255           // attempt asynchronous update of wikidata tag..
65256           var initGraph = context.graph(),
65257               initEntityId = entity.id;
65258
65259           wikidata.itemsByTitle(language()[2], value, function(title, data$$1) {
65260               // If graph has changed, we can't apply this update.
65261               if (context.graph() !== initGraph) return;
65262
65263               if (!data$$1 || !Object.keys(data$$1).length) return;
65264
65265               var qids = Object.keys(data$$1);
65266               var value = qids && find$1(qids, function(id) { return id.match(/^Q\d+$/); });
65267               var currTags = clone(context.entity(initEntityId).tags);
65268
65269               currTags.wikidata = value;
65270
65271               // Coalesce the update of wikidata tag into the previous tag change
65272               context.overwrite(
65273                   actionChangeTags(initEntityId, currTags),
65274                   context.history().undoAnnotation()
65275               );
65276
65277               // do not dispatch.call('change') here, because entity_editor
65278               // changeTags() is not intended to be called asynchronously
65279           });
65280       }
65281
65282
65283       wiki.tags = function(tags) {
65284           var value = tags[field.key] || '',
65285               m = value.match(/([^:]+):([^#]+)(?:#(.+))?/),
65286               l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; }),
65287               anchor = m && m[3];
65288
65289           // value in correct format
65290           if (l) {
65291               utilGetSetValue(lang, l[1]);
65292               utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
65293               if (anchor) {
65294                   try {
65295                       // Best-effort `anchorencode:` implementation
65296                       anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
65297                   } catch (e) {
65298                       anchor = anchor.replace(/ /g, '_');
65299                   }
65300               }
65301               wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
65302                   m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
65303
65304           // unrecognized value format
65305           } else {
65306               utilGetSetValue(title, value);
65307               if (value && value !== '') {
65308                   utilGetSetValue(lang, '');
65309                   wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
65310               } else {
65311                   wikiURL = '';
65312               }
65313           }
65314       };
65315
65316
65317       wiki.entity = function(_) {
65318           if (!arguments.length) return entity;
65319           entity = _;
65320           return wiki;
65321       };
65322
65323
65324       wiki.focus = function() {
65325           title.node().focus();
65326       };
65327
65328
65329       return utilRebind(wiki, dispatch$$1, 'on');
65330   }
65331
65332   var uiFields = {
65333       access: uiFieldAccess,
65334       address: uiFieldAddress,
65335       check: uiFieldCheck,
65336       combo: uiFieldCombo,
65337       cycleway: uiFieldCycleway,
65338       defaultCheck: uiFieldCheck,
65339       email: uiFieldText,
65340       lanes: uiFieldLanes,
65341       localized: uiFieldLocalized,
65342       maxspeed: uiFieldMaxspeed,
65343       multiCombo: uiFieldCombo,
65344       networkCombo: uiFieldCombo,
65345       number: uiFieldText,
65346       onewayCheck: uiFieldCheck,
65347       radio: uiFieldRadio,
65348       restrictions: uiFieldRestrictions,
65349       semiCombo: uiFieldCombo,
65350       structureRadio: uiFieldRadio,
65351       tel: uiFieldText,
65352       text: uiFieldText,
65353       textarea: uiFieldTextarea,
65354       typeCombo: uiFieldCombo,
65355       url: uiFieldText,
65356       wikipedia: uiFieldWikipedia
65357   };
65358
65359   function uiField(context, presetField, entity, options) {
65360       options = assignIn({
65361           show: true,
65362           wrap: true,
65363           remove: true,
65364           revert: true,
65365           info: true
65366       }, options);
65367
65368       var dispatch$$1 = dispatch('change');
65369       var field = clone(presetField);
65370       var _show = options.show;
65371       var _state = '';
65372       var _tags = {};
65373
65374
65375       field.impl = uiFields[field.type](field, context)
65376           .on('change', function(t$$1, onInput) {
65377               dispatch$$1.call('change', field, t$$1, onInput);
65378           });
65379
65380       if (entity && field.impl.entity) {
65381           field.impl.entity(entity);
65382       }
65383
65384       field.keys = field.keys || [field.key];
65385
65386
65387       function isModified() {
65388           if (!entity) return false;
65389           var original = context.graph().base().entities[entity.id];
65390           return some(field.keys, function(key) {
65391               return original ? _tags[key] !== original.tags[key] : _tags[key];
65392           });
65393       }
65394
65395
65396       function isPresent() {
65397           return some(field.keys, function(key) {
65398               return _tags[key];
65399           });
65400       }
65401
65402
65403       function revert(d) {
65404           event.stopPropagation();
65405           event.preventDefault();
65406           if (!entity) return false;
65407
65408           var original = context.graph().base().entities[entity.id];
65409           var t$$1 = {};
65410           d.keys.forEach(function(key) {
65411               t$$1[key] = original ? original.tags[key] : undefined;
65412           });
65413
65414           dispatch$$1.call('change', d, t$$1);
65415       }
65416
65417
65418       function remove(d) {
65419           event.stopPropagation();
65420           event.preventDefault();
65421
65422           var t$$1 = {};
65423           d.keys.forEach(function(key) {
65424               t$$1[key] = undefined;
65425           });
65426
65427           dispatch$$1.call('change', d, t$$1);
65428       }
65429
65430
65431       field.render = function(selection$$1) {
65432           var container = selection$$1.selectAll('.form-field')
65433               .data([field]);
65434
65435           // Enter
65436           var enter = container.enter()
65437               .append('div')
65438               .attr('class', function(d) { return 'form-field form-field-' + d.safeid; })
65439               .classed('nowrap', !options.wrap);
65440
65441           if (options.wrap) {
65442               var label = enter
65443                   .append('label')
65444                   .attr('class', 'form-label')
65445                   .attr('for', function(d) { return 'preset-input-' + d.safeid; })
65446                   .text(function(d) { return d.label(); });
65447
65448               var wrap = label
65449                   .append('div')
65450                   .attr('class', 'form-label-button-wrap');
65451
65452               if (options.remove) {
65453                   wrap
65454                       .append('button')
65455                       .attr('class', 'remove-icon')
65456                       .attr('title', t('icons.remove'))
65457                       .attr('tabindex', -1)
65458                       .call(svgIcon('#operation-delete'));
65459               }
65460
65461               if (options.revert) {
65462                   wrap
65463                       .append('button')
65464                       .attr('class', 'modified-icon')
65465                       .attr('title', t('icons.undo'))
65466                       .attr('tabindex', -1)
65467                       .call(
65468                           (textDirection === 'rtl') ? svgIcon('#icon-redo') : svgIcon('#icon-undo')
65469                       );
65470               }
65471           }
65472
65473
65474           // Update
65475           container = container
65476               .merge(enter);
65477
65478           container.selectAll('.form-label-button-wrap .remove-icon')
65479               .on('click', remove);
65480
65481           container.selectAll('.form-label-button-wrap .modified-icon')
65482               .on('click', revert);
65483
65484           container
65485               .classed('modified', isModified())
65486               .classed('present', isPresent())
65487               .each(function(d) {
65488                   var reference, help;
65489
65490                   // instantiate field help
65491                   if (options.wrap && field.type === 'restrictions') {
65492                       help = uiFieldHelp(context, 'restrictions');
65493                   }
65494
65495                   // instantiate tag reference
65496                   if (options.wrap && options.info) {
65497                       var referenceKey = d.key;
65498                       if (d.type === 'multiCombo') {   // lookup key without the trailing ':'
65499                           referenceKey = referenceKey.replace(/:$/, '');
65500                       }
65501
65502                       reference = uiTagReference(d.reference || { key: referenceKey }, context);
65503                       if (_state === 'hover') {
65504                           reference.showing(false);
65505                       }
65506                   }
65507
65508                   d3_select(this)
65509                       .call(d.impl);
65510
65511                   // add field help components
65512                   if (help) {
65513                       d3_select(this)
65514                           .call(help.body)
65515                           .select('.form-label-button-wrap')
65516                           .call(help.button);
65517                   }
65518
65519                   // add tag reference components
65520                   if (reference) {
65521                       d3_select(this)
65522                           .call(reference.body)
65523                           .select('.form-label-button-wrap')
65524                           .call(reference.button);
65525                   }
65526
65527                   d.impl.tags(_tags);
65528               });
65529       };
65530
65531
65532       field.state = function(_) {
65533           if (!arguments.length) return _state;
65534           _state = _;
65535           return field;
65536       };
65537
65538
65539       field.tags = function(_) {
65540           if (!arguments.length) return _tags;
65541           _tags = _;
65542           return field;
65543       };
65544
65545
65546       field.show = function() {
65547           _show = true;
65548           if (field.default && field.key && _tags[field.key] !== field.default) {
65549               var t$$1 = {};
65550               t$$1[field.key] = field.default;
65551               dispatch$$1.call('change', this, t$$1);
65552           }
65553       };
65554
65555
65556       field.isShown = function() {
65557           return _show || some(field.keys, function(key) { return !!_tags[key]; });
65558       };
65559
65560
65561       field.focus = function() {
65562           field.impl.focus();
65563       };
65564
65565
65566       return utilRebind(field, dispatch$$1, 'on');
65567   }
65568
65569   function uiFormFields(context) {
65570       var fieldsArr;
65571
65572
65573       function formFields(selection$$1, klass) {
65574           render(selection$$1, klass);
65575       }
65576
65577
65578       function render(selection$$1, klass) {
65579
65580           var shown = fieldsArr.filter(function(field) { return field.isShown(); }),
65581               notShown = fieldsArr.filter(function(field) { return !field.isShown(); });
65582
65583           var container = selection$$1.selectAll('.form-fields-container')
65584               .data([0]);
65585
65586           container = container.enter()
65587               .append('div')
65588               .attr('class', 'form-fields-container ' + (klass || ''))
65589               .merge(container);
65590
65591
65592           var fields = container.selectAll('.wrap-form-field')
65593               .data(shown, function(d) { return d.id; });
65594
65595           fields.exit()
65596               .remove();
65597
65598           // Enter
65599           var enter = fields.enter()
65600               .append('div')
65601               .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.safeid; });
65602
65603           // Update
65604           fields = fields
65605               .merge(enter);
65606
65607           fields
65608               .order()
65609               .each(function(d) {
65610                   d3_select(this)
65611                       .call(d.render);
65612               });
65613
65614
65615           notShown = notShown.map(function(field) {
65616               return {
65617                   title: field.label(),
65618                   value: field.label(),
65619                   field: field
65620               };
65621           });
65622
65623
65624           var more = selection$$1.selectAll('.more-fields')
65625               .data((notShown.length > 0) ? [0] : []);
65626
65627           more.exit()
65628               .remove();
65629
65630           more = more.enter()
65631               .append('div')
65632               .attr('class', 'more-fields')
65633               .append('label')
65634               .text(t('inspector.add_fields'))
65635               .merge(more);
65636
65637
65638           var input = more.selectAll('.value')
65639               .data([0]);
65640
65641           input.exit()
65642               .remove();
65643
65644           input = input.enter()
65645               .append('input')
65646               .attr('class', 'value')
65647               .attr('type', 'text')
65648               .call(utilNoAuto)
65649               .merge(input);
65650
65651           input
65652               .call(utilGetSetValue, '')
65653               .attr('placeholder', function() {
65654                   var placeholder = [];
65655                   for (var field in notShown) {
65656                       placeholder.push(notShown[field].title);
65657                   }
65658                   return placeholder.slice(0,3).join(', ') + ((placeholder.length > 3) ? '…' : '');
65659               })
65660               .call(d3combobox()
65661                   .container(context.container())
65662                   .data(notShown)
65663                   .minItems(1)
65664                   .on('accept', function (d) {
65665                       var field = d.field;
65666                       field.show();
65667                       render(selection$$1);
65668                       if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
65669                           field.focus();
65670                       }
65671                   })
65672               );
65673       }
65674
65675
65676       formFields.fieldsArr = function(_) {
65677           if (!arguments.length) return fieldsArr;
65678           fieldsArr = _;
65679           return formFields;
65680       };
65681
65682
65683       return formFields;
65684   }
65685
65686   function uiPresetEditor(context) {
65687       var dispatch$$1 = dispatch('change'),
65688           formFields = uiFormFields(context),
65689           state,
65690           fieldsArr,
65691           preset,
65692           tags,
65693           entityId;
65694
65695
65696       function presetEditor(selection$$1) {
65697           selection$$1.call(uiDisclosure(context, 'preset_fields', true)
65698               .title(t('inspector.all_fields'))
65699               .content(render)
65700           );
65701       }
65702
65703
65704       function render(selection$$1) {
65705           if (!fieldsArr) {
65706               var entity = context.entity(entityId),
65707                   geometry = context.geometry(entityId),
65708                   presets = context.presets();
65709
65710               fieldsArr = [];
65711
65712               preset.fields.forEach(function(field) {
65713                   if (field.matchGeometry(geometry)) {
65714                       fieldsArr.push(
65715                           uiField(context, field, entity)
65716                       );
65717                   }
65718               });
65719
65720               if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
65721                   fieldsArr.push(
65722                       uiField(context, presets.field('restrictions'), entity)
65723                   );
65724               }
65725
65726               presets.universal().forEach(function(field) {
65727                   if (preset.fields.indexOf(field) === -1) {
65728                       fieldsArr.push(
65729                           uiField(context, field, entity, { show: false })
65730                       );
65731                   }
65732               });
65733
65734               fieldsArr.forEach(function(field) {
65735                   field
65736                       .on('change', function(t$$1, onInput) {
65737                           dispatch$$1.call('change', field, t$$1, onInput);
65738                       });
65739               });
65740           }
65741
65742           fieldsArr.forEach(function(field) {
65743               field
65744                   .state(state)
65745                   .tags(tags);
65746           });
65747
65748
65749           selection$$1
65750               .call(formFields.fieldsArr(fieldsArr), 'inspector-inner fillL3');
65751
65752
65753           selection$$1.selectAll('.wrap-form-field input')
65754               .on('keydown', function() {
65755                   // if user presses enter, and combobox is not active, accept edits..
65756                   if (event.keyCode === 13 && d3_select('.combobox').empty()) {
65757                       context.enter(modeBrowse(context));
65758                   }
65759               });
65760       }
65761
65762
65763       presetEditor.preset = function(_) {
65764           if (!arguments.length) return preset;
65765           if (preset && preset.id === _.id) return presetEditor;
65766           preset = _;
65767           fieldsArr = null;
65768           return presetEditor;
65769       };
65770
65771
65772       presetEditor.state = function(_) {
65773           if (!arguments.length) return state;
65774           state = _;
65775           return presetEditor;
65776       };
65777
65778
65779       presetEditor.tags = function(_) {
65780           if (!arguments.length) return tags;
65781           tags = _;
65782           // Don't reset fieldsArr here.
65783           return presetEditor;
65784       };
65785
65786
65787       presetEditor.entityID = function(_) {
65788           if (!arguments.length) return entityId;
65789           if (entityId === _) return presetEditor;
65790           entityId = _;
65791           fieldsArr = null;
65792           return presetEditor;
65793       };
65794
65795
65796       return utilRebind(presetEditor, dispatch$$1, 'on');
65797   }
65798
65799   function uiEntityEditor(context) {
65800       var dispatch$$1 = dispatch('choose');
65801       var _state = 'select';
65802       var _coalesceChanges = false;
65803       var _modified = false;
65804       var _base;
65805       var _entityID;
65806       var _activePreset;
65807       var _tagReference;
65808
65809       var presetEditor = uiPresetEditor(context)
65810           .on('change', changeTags);
65811       var rawTagEditor = uiRawTagEditor(context)
65812           .on('change', changeTags);
65813
65814
65815       function entityEditor(selection$$1) {
65816           var entity = context.entity(_entityID);
65817           var tags = clone(entity.tags);
65818
65819           // Header
65820           var header = selection$$1.selectAll('.header')
65821               .data([0]);
65822
65823           // Enter
65824           var enter = header.enter()
65825               .append('div')
65826               .attr('class', 'header fillL cf');
65827
65828           enter
65829               .append('button')
65830               .attr('class', 'fl preset-reset preset-choose')
65831               .call(svgIcon((textDirection === 'rtl') ? '#icon-forward' : '#icon-backward'));
65832
65833           enter
65834               .append('button')
65835               .attr('class', 'fr preset-close')
65836               .on('click', function() { context.enter(modeBrowse(context)); })
65837               .call(svgIcon(_modified ? '#icon-apply' : '#icon-close'));
65838
65839           enter
65840               .append('h3')
65841               .text(t('inspector.edit'));
65842
65843           // Update
65844           header = header
65845               .merge(enter);
65846
65847           header.selectAll('.preset-reset')
65848               .on('click', function() {
65849                   dispatch$$1.call('choose', this, _activePreset);
65850               });
65851
65852
65853           // Body
65854           var body = selection$$1.selectAll('.inspector-body')
65855               .data([0]);
65856
65857           // Enter
65858           enter = body.enter()
65859               .append('div')
65860               .attr('class', 'inspector-body');
65861
65862           enter
65863               .append('div')
65864               .attr('class', 'preset-list-item inspector-inner')
65865               .append('div')
65866               .attr('class', 'preset-list-button-wrap')
65867               .append('button')
65868               .attr('class', 'preset-list-button preset-reset')
65869               .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
65870               .append('div')
65871               .attr('class', 'label');
65872
65873           enter
65874               .append('div')
65875               .attr('class', 'inspector-border preset-editor');
65876
65877           enter
65878               .append('div')
65879               .attr('class', 'inspector-border raw-tag-editor inspector-inner');
65880
65881           enter
65882               .append('div')
65883               .attr('class', 'inspector-border raw-member-editor inspector-inner');
65884
65885           enter
65886               .append('div')
65887               .attr('class', 'raw-membership-editor inspector-inner');
65888
65889           enter
65890               .append('input')
65891               .attr('type', 'text')
65892               .attr('class', 'key-trap');
65893
65894
65895           // Update
65896           body = body
65897               .merge(enter);
65898
65899           if (_tagReference) {
65900               body.selectAll('.preset-list-button-wrap')
65901                   .call(_tagReference.button);
65902
65903               body.selectAll('.preset-list-item')
65904                   .call(_tagReference.body);
65905           }
65906
65907           body.selectAll('.preset-reset')
65908               .on('click', function() {
65909                   dispatch$$1.call('choose', this, _activePreset);
65910               });
65911
65912           body.select('.preset-list-item button')
65913               .call(uiPresetIcon()
65914                   .geometry(context.geometry(_entityID))
65915                   .preset(_activePreset)
65916               );
65917
65918           body.select('.preset-list-item .label')
65919               .text(_activePreset.name());
65920
65921           body.select('.preset-editor')
65922               .call(presetEditor
65923                   .preset(_activePreset)
65924                   .entityID(_entityID)
65925                   .tags(tags)
65926                   .state(_state)
65927               );
65928
65929           body.select('.raw-tag-editor')
65930               .call(rawTagEditor
65931                   .preset(_activePreset)
65932                   .entityID(_entityID)
65933                   .tags(tags)
65934                   .state(_state)
65935               );
65936
65937           if (entity.type === 'relation') {
65938               body.select('.raw-member-editor')
65939                   .style('display', 'block')
65940                   .call(uiRawMemberEditor(context)
65941                       .entityID(_entityID)
65942                   );
65943           } else {
65944               body.select('.raw-member-editor')
65945                   .style('display', 'none');
65946           }
65947
65948           body.select('.raw-membership-editor')
65949               .call(uiRawMembershipEditor(context)
65950                   .entityID(_entityID)
65951               );
65952
65953           body.select('.key-trap')
65954               .on('keydown.key-trap', function() {
65955                   // On tabbing, send focus back to the first field on the inspector-body
65956                   // (probably the `name` field) #4159
65957                   if (event.keyCode === 9 && !event.shiftKey) {
65958                       event.preventDefault();
65959                       body.select('input').node().focus();
65960                   }
65961               });
65962
65963           context.history()
65964               .on('change.entity-editor', historyChanged);
65965
65966
65967           function historyChanged() {
65968               if (_state === 'hide') return;
65969
65970               var entity = context.hasEntity(_entityID);
65971               var graph = context.graph();
65972               if (!entity) return;
65973
65974               var match = context.presets().match(entity, graph);
65975               var activePreset = entityEditor.preset();
65976               var weakPreset = activePreset && isEmpty(activePreset.addTags);
65977
65978               // A "weak" preset doesn't set any tags. (e.g. "Address")
65979               // Don't replace a weak preset with a fallback preset (e.g. "Point")
65980               if (!(weakPreset && match.isFallback())) {
65981                   entityEditor.preset(match);
65982               }
65983               entityEditor.modified(_base !== graph);
65984               entityEditor(selection$$1);
65985           }
65986       }
65987
65988
65989       // Tag changes that fire on input can all get coalesced into a single
65990       // history operation when the user leaves the field.  #2342
65991       function changeTags(changed, onInput) {
65992           var entity = context.entity(_entityID);
65993           var annotation = t('operations.change_tags.annotation');
65994           var tags = clone(entity.tags);
65995
65996           for (var k in changed) {
65997               if (!k) continue;
65998               var v = changed[k];
65999               if (v !== undefined || tags.hasOwnProperty(k)) {
66000                   tags[k] = v;
66001               }
66002           }
66003
66004           if (!onInput) {
66005               tags = utilCleanTags(tags);
66006           }
66007
66008           if (!isEqual(entity.tags, tags)) {
66009               if (_coalesceChanges) {
66010                   context.overwrite(actionChangeTags(_entityID, tags), annotation);
66011               } else {
66012                   context.perform(actionChangeTags(_entityID, tags), annotation);
66013                   _coalesceChanges = !!onInput;
66014               }
66015           }
66016       }
66017
66018
66019       entityEditor.modified = function(_) {
66020           if (!arguments.length) return _modified;
66021           _modified = _;
66022           d3_selectAll('button.preset-close use')
66023               .attr('xlink:href', (_modified ? '#icon-apply' : '#icon-close'));
66024           return entityEditor;
66025       };
66026
66027
66028       entityEditor.state = function(_) {
66029           if (!arguments.length) return _state;
66030           _state = _;
66031           return entityEditor;
66032       };
66033
66034
66035       entityEditor.entityID = function(_) {
66036           if (!arguments.length) return _entityID;
66037           _entityID = _;
66038           _base = context.graph();
66039           _coalesceChanges = false;
66040
66041           var presetMatch = context.presets().match(context.entity(_entityID), _base);
66042
66043           return entityEditor
66044               .preset(presetMatch)
66045               .modified(false);
66046       };
66047
66048
66049       entityEditor.preset = function(_) {
66050           if (!arguments.length) return _activePreset;
66051           if (_ !== _activePreset) {
66052               _activePreset = _;
66053               _tagReference = uiTagReference(_activePreset.reference(context.geometry(_entityID)), context)
66054                   .showing(false);
66055           }
66056           return entityEditor;
66057       };
66058
66059
66060       return utilRebind(entityEditor, dispatch$$1, 'on');
66061   }
66062
66063   function uiPresetList(context) {
66064       var dispatch$$1 = dispatch('choose'),
66065           id,
66066           currentPreset,
66067           autofocus = false;
66068
66069
66070       function presetList(selection$$1) {
66071           var entity = context.entity(id),
66072               geometry = context.geometry(id);
66073
66074           // Treat entities on addr:interpolation lines as points, not vertices (#3241)
66075           if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
66076               geometry = 'point';
66077           }
66078
66079           var presets = context.presets().matchGeometry(geometry);
66080
66081           selection$$1.html('');
66082
66083           var messagewrap = selection$$1
66084               .append('div')
66085               .attr('class', 'header fillL cf');
66086
66087           var message = messagewrap
66088               .append('h3')
66089               .text(t('inspector.choose'));
66090
66091           if (context.entity(id).isUsed(context.graph())) {
66092               messagewrap
66093                   .append('button')
66094                   .attr('class', 'preset-choose')
66095                   .on('click', function() { dispatch$$1.call('choose', this, currentPreset); })
66096                   .call(svgIcon((textDirection === 'rtl') ? '#icon-backward' : '#icon-forward'));
66097           } else {
66098               messagewrap
66099                   .append('button')
66100                   .attr('class', 'close')
66101                   .on('click', function() {
66102                       context.enter(modeBrowse(context));
66103                   })
66104                   .call(svgIcon('#icon-close'));
66105           }
66106
66107           function keydown() {
66108               // hack to let delete shortcut work when search is autofocused
66109               if (search.property('value').length === 0 &&
66110                   (event.keyCode === d3keybinding.keyCodes['⌫'] ||
66111                    event.keyCode === d3keybinding.keyCodes['⌦'])) {
66112                   event.preventDefault();
66113                   event.stopPropagation();
66114                   operationDelete([id], context)();
66115               } else if (search.property('value').length === 0 &&
66116                   (event.ctrlKey || event.metaKey) &&
66117                   event.keyCode === d3keybinding.keyCodes.z) {
66118                   event.preventDefault();
66119                   event.stopPropagation();
66120                   context.undo();
66121               } else if (!event.ctrlKey && !event.metaKey) {
66122                   d3_select(this).on('keydown', null);
66123               }
66124           }
66125
66126           function keypress() {
66127               // enter
66128               var value = search.property('value');
66129               if (event.keyCode === 13 && value.length) {
66130                   list.selectAll('.preset-list-item:first-child').datum().choose();
66131               }
66132           }
66133
66134           function inputevent() {
66135               var value = search.property('value');
66136               list.classed('filtered', value.length);
66137               if (value.length) {
66138                   var results = presets.search(value, geometry);
66139                   message.text(t('inspector.results', {
66140                       n: results.collection.length,
66141                       search: value
66142                   }));
66143                   list.call(drawList, results);
66144               } else {
66145                   list.call(drawList, context.presets().defaults(geometry, 36));
66146                   message.text(t('inspector.choose'));
66147               }
66148           }
66149
66150           var searchWrap = selection$$1
66151               .append('div')
66152               .attr('class', 'search-header');
66153
66154           var search = searchWrap
66155               .append('input')
66156               .attr('class', 'preset-search-input')
66157               .attr('placeholder', t('inspector.search'))
66158               .attr('type', 'search')
66159               .call(utilNoAuto)
66160               .on('keydown', keydown)
66161               .on('keypress', keypress)
66162               .on('input', inputevent);
66163
66164           searchWrap
66165               .call(svgIcon('#icon-search', 'pre-text'));
66166
66167           if (autofocus) {
66168               search.node().focus();
66169           }
66170
66171           var listWrap = selection$$1
66172               .append('div')
66173               .attr('class', 'inspector-body');
66174
66175           var list = listWrap
66176               .append('div')
66177               .attr('class', 'preset-list fillL cf')
66178               .call(drawList, context.presets().defaults(geometry, 36));
66179       }
66180
66181
66182       function drawList(list, presets) {
66183           var collection = presets.collection.map(function(preset) {
66184               return preset.members ? CategoryItem(preset) : PresetItem(preset);
66185           });
66186
66187           var items = list.selectAll('.preset-list-item')
66188               .data(collection, function(d) { return d.preset.id; });
66189
66190           items.order();
66191
66192           items.exit()
66193               .remove();
66194
66195           items.enter()
66196               .append('div')
66197               .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
66198               .classed('current', function(item) { return item.preset === currentPreset; })
66199               .each(function(item) { d3_select(this).call(item); })
66200               .style('opacity', 0)
66201               .transition()
66202               .style('opacity', 1);
66203       }
66204
66205
66206       function CategoryItem(preset) {
66207           var box, sublist, shown = false;
66208
66209           function item(selection$$1) {
66210               var wrap = selection$$1.append('div')
66211                   .attr('class', 'preset-list-button-wrap category col12');
66212
66213               var button = wrap
66214                   .append('button')
66215                   .attr('class', 'preset-list-button')
66216                   .classed('expanded', false)
66217                   .call(uiPresetIcon()
66218                       .geometry(context.geometry(id))
66219                       .preset(preset))
66220                   .on('click', function() {
66221                       var isExpanded = d3_select(this).classed('expanded');
66222                       var iconName = isExpanded ?
66223                           (textDirection === 'rtl' ? '#icon-backward' : '#icon-forward') : '#icon-down';
66224                       d3_select(this)
66225                           .classed('expanded', !isExpanded);
66226                       d3_select(this).selectAll('div.label svg.icon use')
66227                           .attr('href', iconName);
66228                       item.choose();
66229                   });
66230
66231               var label = button
66232                   .append('div')
66233                   .attr('class', 'label');
66234
66235               label
66236                   .call(svgIcon((textDirection === 'rtl' ? '#icon-backward' : '#icon-forward'), 'inline'))
66237                   .append('span')
66238                   .html(function() { return preset.name() + '&hellip;'; });
66239
66240               box = selection$$1.append('div')
66241                   .attr('class', 'subgrid col12')
66242                   .style('max-height', '0px')
66243                   .style('opacity', 0);
66244
66245               box.append('div')
66246                   .attr('class', 'arrow');
66247
66248               sublist = box.append('div')
66249                   .attr('class', 'preset-list fillL3 cf fl');
66250           }
66251
66252
66253           item.choose = function() {
66254               if (!box || !sublist) return;
66255
66256               if (shown) {
66257                   shown = false;
66258                   box.transition()
66259                       .duration(200)
66260                       .style('opacity', '0')
66261                       .style('max-height', '0px')
66262                       .style('padding-bottom', '0px');
66263               } else {
66264                   shown = true;
66265                   sublist.call(drawList, preset.members);
66266                   box.transition()
66267                       .duration(200)
66268                       .style('opacity', '1')
66269                       .style('max-height', 200 + preset.members.collection.length * 190 + 'px')
66270                       .style('padding-bottom', '20px');
66271               }
66272           };
66273
66274           item.preset = preset;
66275
66276           return item;
66277       }
66278
66279
66280       function PresetItem(preset) {
66281           function item(selection$$1) {
66282               var wrap = selection$$1.append('div')
66283                   .attr('class', 'preset-list-button-wrap col12');
66284
66285               wrap.append('button')
66286                   .attr('class', 'preset-list-button')
66287                   .call(uiPresetIcon()
66288                       .geometry(context.geometry(id))
66289                       .preset(preset))
66290                   .on('click', item.choose)
66291                   .append('div')
66292                   .attr('class', 'label')
66293                   .text(preset.name());
66294
66295               wrap.call(item.reference.button);
66296               selection$$1.call(item.reference.body);
66297           }
66298
66299           item.choose = function() {
66300               context.presets().choose(preset);
66301
66302               context.perform(
66303                   actionChangePreset(id, currentPreset, preset),
66304                   t('operations.change_tags.annotation')
66305               );
66306
66307               dispatch$$1.call('choose', this, preset);
66308           };
66309
66310           item.help = function() {
66311               event.stopPropagation();
66312               item.reference.toggle();
66313           };
66314
66315           item.preset = preset;
66316           item.reference = uiTagReference(preset.reference(context.geometry(id)), context);
66317
66318           return item;
66319       }
66320
66321
66322       presetList.autofocus = function(_) {
66323           if (!arguments.length) return autofocus;
66324           autofocus = _;
66325           return presetList;
66326       };
66327
66328
66329       presetList.entityID = function(_) {
66330           if (!arguments.length) return id;
66331           id = _;
66332           presetList.preset(context.presets().match(context.entity(id), context.graph()));
66333           return presetList;
66334       };
66335
66336
66337       presetList.preset = function(_) {
66338           if (!arguments.length) return currentPreset;
66339           currentPreset = _;
66340           return presetList;
66341       };
66342
66343
66344       return utilRebind(presetList, dispatch$$1, 'on');
66345   }
66346
66347   function uiViewOnOSM(context) {
66348       var id;
66349
66350       function viewOnOSM(selection) {
66351           var entity = context.entity(id);
66352
66353           selection.style('display', entity.isNew() ? 'none' : null);
66354
66355           var link = selection.selectAll('.view-on-osm')
66356               .data([0]);
66357
66358           var enter = link.enter()
66359               .append('a')
66360               .attr('class', 'view-on-osm')
66361               .attr('target', '_blank')
66362               .call(svgIcon('#icon-out-link', 'inline'));
66363
66364           enter
66365               .append('span')
66366               .text(t('inspector.view_on_osm'));
66367
66368           link
66369               .merge(enter)
66370               .attr('href', context.connection().entityURL(entity));
66371       }
66372
66373
66374       viewOnOSM.entityID = function(_) {
66375           if (!arguments.length) return id;
66376           id = _;
66377           return viewOnOSM;
66378       };
66379
66380       return viewOnOSM;
66381   }
66382
66383   function uiInspector(context) {
66384       var presetList = uiPresetList(context);
66385       var entityEditor = uiEntityEditor(context);
66386       var _state = 'select';
66387       var _entityID;
66388       var _newFeature = false;
66389
66390
66391       function inspector(selection$$1) {
66392           presetList
66393               .entityID(_entityID)
66394               .autofocus(_newFeature)
66395               .on('choose', setPreset);
66396
66397           entityEditor
66398               .state(_state)
66399               .entityID(_entityID)
66400               .on('choose', showList);
66401
66402           var wrap = selection$$1.selectAll('.panewrap')
66403               .data([0]);
66404
66405           var enter = wrap.enter()
66406               .append('div')
66407               .attr('class', 'panewrap');
66408
66409           enter
66410               .append('div')
66411               .attr('class', 'preset-list-pane pane');
66412
66413           enter
66414               .append('div')
66415               .attr('class', 'entity-editor-pane pane');
66416
66417           wrap = wrap.merge(enter);
66418           var presetPane = wrap.selectAll('.preset-list-pane');
66419           var editorPane = wrap.selectAll('.entity-editor-pane');
66420
66421           var graph = context.graph(),
66422               entity = context.entity(_entityID),
66423               showEditor = _state === 'hover' ||
66424                   entity.isUsed(graph) ||
66425                   entity.isHighwayIntersection(graph);
66426
66427           if (showEditor) {
66428               wrap.style('right', '0%');
66429               editorPane.call(entityEditor);
66430           } else {
66431               wrap.style('right', '-100%');
66432               presetPane.call(presetList);
66433           }
66434
66435           var footer = selection$$1.selectAll('.footer')
66436               .data([0]);
66437
66438           footer = footer.enter()
66439               .append('div')
66440               .attr('class', 'footer')
66441               .merge(footer);
66442
66443           footer
66444               .call(uiViewOnOSM(context).entityID(_entityID));
66445
66446
66447           function showList(preset) {
66448               wrap.transition()
66449                   .styleTween('right', function() { return d3_interpolate('0%', '-100%'); });
66450
66451               presetPane
66452                   .call(presetList.preset(preset).autofocus(true));
66453           }
66454
66455
66456           function setPreset(preset) {
66457               wrap.transition()
66458                   .styleTween('right', function() { return d3_interpolate('-100%', '0%'); });
66459
66460               editorPane
66461                   .call(entityEditor.preset(preset));
66462           }
66463       }
66464
66465
66466       inspector.state = function(_) {
66467           if (!arguments.length) return _state;
66468           _state = _;
66469           entityEditor.state(_state);
66470
66471           // remove any old field help overlay that might have gotten attached to the inspector
66472           d3_selectAll('.field-help-body').remove();
66473
66474           return inspector;
66475       };
66476
66477
66478       inspector.entityID = function(_) {
66479           if (!arguments.length) return _entityID;
66480           _entityID = _;
66481           return inspector;
66482       };
66483
66484
66485       inspector.newFeature = function(_) {
66486           if (!arguments.length) return _newFeature;
66487           _newFeature = _;
66488           return inspector;
66489       };
66490
66491
66492       return inspector;
66493   }
66494
66495   function uiSidebar(context) {
66496       var inspector = uiInspector(context),
66497           current;
66498
66499
66500       function sidebar(selection) {
66501           var featureListWrap = selection
66502               .append('div')
66503               .attr('class', 'feature-list-pane')
66504               .call(uiFeatureList(context));
66505
66506
66507           var inspectorWrap = selection
66508               .append('div')
66509               .attr('class', 'inspector-hidden inspector-wrap fr');
66510
66511
66512           function hover(id) {
66513               if (!current && context.hasEntity(id)) {
66514                   featureListWrap
66515                       .classed('inspector-hidden', true);
66516
66517                   inspectorWrap
66518                       .classed('inspector-hidden', false)
66519                       .classed('inspector-hover', true);
66520
66521                   if (inspector.entityID() !== id || inspector.state() !== 'hover') {
66522                       inspector
66523                           .state('hover')
66524                           .entityID(id);
66525
66526                       inspectorWrap
66527                           .call(inspector);
66528                   }
66529
66530               } else if (!current) {
66531                   featureListWrap
66532                       .classed('inspector-hidden', false);
66533                   inspectorWrap
66534                       .classed('inspector-hidden', true);
66535                   inspector
66536                       .state('hide');
66537               }
66538           }
66539
66540
66541           sidebar.hover = throttle(hover, 200);
66542
66543
66544           sidebar.select = function(id, newFeature) {
66545               if (!current && id) {
66546                   featureListWrap
66547                       .classed('inspector-hidden', true);
66548
66549                   inspectorWrap
66550                       .classed('inspector-hidden', false)
66551                       .classed('inspector-hover', false);
66552
66553                   if (inspector.entityID() !== id || inspector.state() !== 'select') {
66554                       inspector
66555                           .state('select')
66556                           .entityID(id)
66557                           .newFeature(newFeature);
66558
66559                       inspectorWrap
66560                           .call(inspector);
66561                   }
66562
66563               } else if (!current) {
66564                   featureListWrap
66565                       .classed('inspector-hidden', false);
66566                   inspectorWrap
66567                       .classed('inspector-hidden', true);
66568                   inspector
66569                       .state('hide');
66570               }
66571           };
66572
66573
66574           sidebar.show = function(component) {
66575               featureListWrap
66576                   .classed('inspector-hidden', true);
66577               inspectorWrap
66578                   .classed('inspector-hidden', true);
66579
66580               if (current) current.remove();
66581               current = selection
66582                   .append('div')
66583                   .attr('class', 'sidebar-component')
66584                   .call(component);
66585           };
66586
66587
66588           sidebar.hide = function() {
66589               featureListWrap
66590                   .classed('inspector-hidden', false);
66591               inspectorWrap
66592                   .classed('inspector-hidden', true);
66593
66594               if (current) current.remove();
66595               current = null;
66596           };
66597       }
66598
66599
66600       sidebar.hover = function() {};
66601       sidebar.hover.cancel = function() {};
66602       sidebar.select = function() {};
66603       sidebar.show = function() {};
66604       sidebar.hide = function() {};
66605
66606       return sidebar;
66607   }
66608
66609   function uiSpinner(context) {
66610       var osm = context.connection();
66611
66612
66613       return function(selection) {
66614           var img = selection
66615               .append('img')
66616               .attr('src', context.imagePath('loader-black.gif'))
66617               .style('opacity', 0);
66618
66619           if (osm) {
66620               osm
66621                   .on('loading.spinner', function() {
66622                       img.transition()
66623                           .style('opacity', 1);
66624                   })
66625                   .on('loaded.spinner', function() {
66626                       img.transition()
66627                           .style('opacity', 0);
66628                   });
66629           }
66630       };
66631   }
66632
66633   function uiSplash(context) {
66634
66635       return function(selection) {
66636           if (context.storage('sawSplash'))
66637                return;
66638
66639           context.storage('sawSplash', true);
66640
66641           var modalSelection = uiModal(selection);
66642
66643           modalSelection.select('.modal')
66644               .attr('class', 'modal-splash modal col6');
66645
66646           var introModal = modalSelection.select('.content')
66647               .append('div')
66648               .attr('class', 'fillL');
66649
66650           introModal
66651               .append('div')
66652               .attr('class','modal-section cf')
66653               .append('h3').text(t('splash.welcome'));
66654
66655           introModal
66656               .append('div')
66657               .attr('class','modal-section')
66658               .append('p')
66659               .html(t('splash.text', {
66660                   version: context.version,
66661                   website: '<a href="http://ideditor.com/">ideditor.com</a>',
66662                   github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
66663               }));
66664
66665           var buttonWrap = introModal
66666               .append('div')
66667               .attr('class', 'modal-actions cf');
66668
66669           var walkthrough = buttonWrap
66670               .append('button')
66671               .attr('class', 'walkthrough col6')
66672               .on('click', function() {
66673                   context.container().call(uiIntro(context));
66674                   modalSelection.close();
66675               });
66676
66677           walkthrough
66678               .append('svg')
66679               .attr('class', 'logo logo-walkthrough')
66680               .append('use')
66681               .attr('xlink:href', '#logo-walkthrough');
66682
66683           walkthrough
66684               .append('div')
66685               .text(t('splash.walkthrough'));
66686
66687           var startEditing = buttonWrap
66688               .append('button')
66689               .attr('class', 'start-editing col6')
66690               .on('click', modalSelection.close);
66691
66692           startEditing
66693               .append('svg')
66694               .attr('class', 'logo logo-features')
66695               .append('use')
66696               .attr('xlink:href', '#logo-features');
66697
66698           startEditing
66699               .append('div')
66700               .text(t('splash.start'));
66701
66702
66703           modalSelection.select('button.close')
66704               .attr('class','hide');
66705
66706       };
66707   }
66708
66709   function uiStatus(context) {
66710       var osm = context.connection();
66711
66712
66713       return function(selection$$1) {
66714           if (!osm) return;
66715
66716           function update() {
66717               osm.status(function(err, apiStatus) {
66718                   selection$$1.html('');
66719
66720                   if (err) {
66721                       if (apiStatus === 'connectionSwitched') {
66722                           // if the connection was just switched, we can't rely on
66723                           // the status (we're getting the status of the previous api)
66724                           return;
66725
66726                       } else if (apiStatus === 'rateLimited') {
66727                           selection$$1
66728                               .text(t('status.rateLimit'))
66729                               .append('a')
66730                               .attr('class', 'api-status-login')
66731                               .attr('target', '_blank')
66732                               .call(svgIcon('#icon-out-link', 'inline'))
66733                               .append('span')
66734                               .text(t('login'))
66735                               .on('click.login', function() {
66736                                   event.preventDefault();
66737                                   osm.authenticate();
66738                               });
66739                       } else {
66740                           // eslint-disable-next-line no-warning-comments
66741                           // TODO: nice messages for different error types
66742                           selection$$1.text(t('status.error'));
66743                       }
66744
66745                   } else if (apiStatus === 'readonly') {
66746                       selection$$1.text(t('status.readonly'));
66747                   } else if (apiStatus === 'offline') {
66748                       selection$$1.text(t('status.offline'));
66749                   }
66750
66751                   selection$$1.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
66752               });
66753           }
66754
66755           osm.on('change', function() { update(selection$$1); });
66756
66757           window.setInterval(update, 90000);
66758           update(selection$$1);
66759       };
66760   }
66761
66762   function uiUndoRedo(context) {
66763       var commands = [{
66764           id: 'undo',
66765           cmd: uiCmd('⌘Z'),
66766           action: function() { if (editable()) context.undo(); },
66767           annotation: function() { return context.history().undoAnnotation(); }
66768       }, {
66769           id: 'redo',
66770           cmd: uiCmd('⌘⇧Z'),
66771           action: function() { if (editable()) context.redo(); },
66772           annotation: function() { return context.history().redoAnnotation(); }
66773       }];
66774
66775
66776       function editable() {
66777           var mode = context.mode();
66778           return context.editable() && mode && mode.id !== 'save';
66779       }
66780
66781
66782       return function(selection$$1) {
66783           var tooltipBehavior = tooltip()
66784               .placement('bottom')
66785               .html(true)
66786               .title(function (d) {
66787                   return uiTooltipHtml(d.annotation() ?
66788                       t(d.id + '.tooltip', {action: d.annotation()}) :
66789                       t(d.id + '.nothing'), d.cmd);
66790               });
66791
66792           var buttons = selection$$1.selectAll('button')
66793               .data(commands)
66794               .enter()
66795               .append('button')
66796               .attr('class', function(d) { return 'col6 disabled ' + d.id + '-button'; })
66797               .on('click', function(d) { return d.action(); })
66798               .call(tooltipBehavior);
66799
66800           buttons.each(function(d) {
66801               var iconName = d.id;
66802               if (textDirection === 'rtl') {
66803                   if (iconName === 'undo') {
66804                       iconName = 'redo';
66805                   } else if (iconName === 'redo') {
66806                       iconName = 'undo';
66807                   }
66808               }
66809               d3_select(this)
66810                   .call(svgIcon('#icon-' + iconName));
66811           });
66812
66813           var keybinding = d3keybinding('undo')
66814               .on(commands[0].cmd, function() { event.preventDefault(); commands[0].action(); })
66815               .on(commands[1].cmd, function() { event.preventDefault(); commands[1].action(); });
66816
66817           d3_select(document)
66818               .call(keybinding);
66819
66820
66821           var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
66822
66823           context.map()
66824               .on('move.undo_redo', debouncedUpdate)
66825               .on('drawn.undo_redo', debouncedUpdate);
66826
66827           context.history()
66828               .on('change.undo_redo', update);
66829
66830           context
66831               .on('enter.undo_redo', update);
66832
66833
66834           function update() {
66835               buttons
66836                   .property('disabled', !editable())
66837                   .classed('disabled', function(d) { return !d.annotation(); })
66838                   .each(function() {
66839                       var selection$$1 = d3_select(this);
66840                       if (selection$$1.property('tooltipVisible')) {
66841                           selection$$1.call(tooltipBehavior.show);
66842                       }
66843                   });
66844           }
66845       };
66846   }
66847
66848   // these are module variables so they are preserved through a ui.restart()
66849   var sawVersion = null,
66850       isNewVersion = false,
66851       isNewUser = false;
66852
66853
66854   function uiVersion(context) {
66855
66856       var currVersion = context.version,
66857           matchedVersion = currVersion.match(/\d\.\d\.\d.*/);
66858
66859       if (sawVersion === null && matchedVersion !== null) {
66860           isNewVersion = (context.storage('sawVersion') !== currVersion);
66861           isNewUser = !context.storage('sawSplash');
66862           context.storage('sawVersion', currVersion);
66863           sawVersion = currVersion;
66864       }
66865
66866       return function(selection) {
66867           selection
66868               .append('a')
66869               .attr('target', '_blank')
66870               .attr('tabindex', -1)
66871               .attr('href', 'https://github.com/openstreetmap/iD')
66872               .text(currVersion);
66873
66874           // only show new version indicator to users that have used iD before
66875           if (isNewVersion && !isNewUser) {
66876               selection
66877                   .append('div')
66878                   .attr('class', 'badge')
66879                   .append('a')
66880                   .attr('target', '_blank')
66881                   .attr('tabindex', -1)
66882                   .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CHANGELOG.md#whats-new')
66883                   .call(svgIcon('#gift-11'))
66884                   .call(tooltip()
66885                       .title(t('version.whats_new', { version: currVersion }))
66886                       .placement('top')
66887                   );
66888           }
66889       };
66890   }
66891
66892   function uiZoom(context) {
66893       var zooms = [{
66894           id: 'zoom-in',
66895           icon: 'plus',
66896           title: t('zoom.in'),
66897           action: context.zoomIn,
66898           key: '+'
66899       }, {
66900           id: 'zoom-out',
66901           icon: 'minus',
66902           title: t('zoom.out'),
66903           action: context.zoomOut,
66904           key: '-'
66905       }];
66906
66907
66908       function zoomIn() {
66909           event.preventDefault();
66910           context.zoomIn();
66911       }
66912
66913
66914       function zoomOut() {
66915           event.preventDefault();
66916           context.zoomOut();
66917       }
66918
66919
66920       function zoomInFurther() {
66921           event.preventDefault();
66922           context.zoomInFurther();
66923       }
66924
66925
66926       function zoomOutFurther() {
66927           event.preventDefault();
66928           context.zoomOutFurther();
66929       }
66930
66931
66932       return function(selection$$1) {
66933           var button = selection$$1.selectAll('button')
66934               .data(zooms)
66935               .enter()
66936               .append('button')
66937               .attr('tabindex', -1)
66938               .attr('class', function(d) { return d.id; })
66939               .on('click.editor', function(d) { d.action(); })
66940               .call(tooltip()
66941                   .placement((textDirection === 'rtl') ? 'right' : 'left')
66942                   .html(true)
66943                   .title(function(d) {
66944                       return uiTooltipHtml(d.title, d.key);
66945                   })
66946               );
66947
66948           button.each(function(d) {
66949               d3_select(this)
66950                   .call(svgIcon('#icon-' + d.icon, 'light'));
66951           });
66952
66953           var keybinding = d3keybinding('zoom');
66954
66955           ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
66956               keybinding.on([key], zoomIn);
66957               keybinding.on([uiCmd('⌘' + key)], zoomInFurther);
66958           });
66959
66960           ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
66961               keybinding.on([key], zoomOut);
66962               keybinding.on([uiCmd('⌘' + key)], zoomOutFurther);
66963           });
66964
66965           d3_select(document)
66966               .call(keybinding);
66967       };
66968   }
66969
66970   function uiInit(context) {
66971       var uiInitCounter = 0;
66972
66973
66974       function render(container) {
66975           container
66976               .attr('dir', textDirection);
66977
66978           var map = context.map();
66979
66980           var hash = behaviorHash(context);
66981           hash();
66982
66983           if (!hash.hadHash) {
66984               map.centerZoom([0, 0], 2);
66985           }
66986
66987           container
66988               .append('svg')
66989               .attr('id', 'defs')
66990               .call(svgDefs(context));
66991
66992           container
66993               .append('div')
66994               .attr('id', 'sidebar')
66995               .attr('class', 'col4')
66996               .call(ui.sidebar);
66997
66998           var content = container
66999               .append('div')
67000               .attr('id', 'content')
67001               .attr('class', 'active');
67002
67003           var bar = content
67004               .append('div')
67005               .attr('id', 'bar')
67006               .attr('class', 'fillD');
67007
67008           content
67009               .append('div')
67010               .attr('id', 'map')
67011               .attr('dir', 'ltr')
67012               .call(map);
67013
67014           content
67015               .call(uiMapInMap(context))
67016               .call(uiInfo(context))
67017               .call(uiNotice(context));
67018
67019           bar
67020               .append('div')
67021               .attr('class', 'spacer col4');
67022
67023           var limiter = bar.append('div')
67024               .attr('class', 'limiter');
67025
67026           limiter
67027               .append('div')
67028               .attr('class', 'button-wrap joined col3')
67029               .call(uiModes(context), limiter);
67030
67031           limiter
67032               .append('div')
67033               .attr('class', 'button-wrap joined col1')
67034               .call(uiUndoRedo(context));
67035
67036           limiter
67037               .append('div')
67038               .attr('class', 'button-wrap col1')
67039               .call(uiSave(context));
67040
67041           bar
67042               .append('div')
67043               .attr('class', 'full-screen')
67044               .call(uiFullScreen(context));
67045
67046           bar
67047               .append('div')
67048               .attr('class', 'spinner')
67049               .call(uiSpinner(context));
67050
67051
67052           var controls = bar
67053               .append('div')
67054               .attr('class', 'map-controls');
67055
67056           controls
67057               .append('div')
67058               .attr('class', 'map-control zoombuttons')
67059               .call(uiZoom(context));
67060
67061           controls
67062               .append('div')
67063               .attr('class', 'map-control geolocate-control')
67064               .call(uiGeolocate(context));
67065
67066           controls
67067               .append('div')
67068               .attr('class', 'map-control background-control')
67069               .call(uiBackground(context));
67070
67071           controls
67072               .append('div')
67073               .attr('class', 'map-control map-data-control')
67074               .call(uiMapData(context));
67075
67076           controls
67077               .append('div')
67078               .attr('class', 'map-control help-control')
67079               .call(uiHelp(context));
67080
67081
67082           var about = content
67083               .append('div')
67084               .attr('id', 'about');
67085
67086           about
67087               .append('div')
67088               .attr('id', 'attrib')
67089               .attr('dir', 'ltr')
67090               .call(uiAttribution(context));
67091
67092           about
67093               .append('div')
67094               .attr('class', 'api-status')
67095               .call(uiStatus(context));
67096
67097
67098           var footer = about
67099               .append('div')
67100               .attr('id', 'footer')
67101               .attr('class', 'fillD');
67102
67103           footer
67104               .append('div')
67105               .attr('id', 'flash-wrap')
67106               .attr('class', 'footer-hide');
67107
67108           var footerWrap = footer
67109               .append('div')
67110               .attr('id', 'footer-wrap')
67111               .attr('class', 'footer-show');
67112
67113           footerWrap
67114               .append('div')
67115               .attr('id', 'scale-block')
67116               .call(uiScale(context));
67117
67118           var aboutList = footerWrap
67119               .append('div')
67120               .attr('id', 'info-block')
67121               .append('ul')
67122               .attr('id', 'about-list');
67123
67124           if (!context.embed()) {
67125               aboutList
67126                   .call(uiAccount(context));
67127           }
67128
67129           aboutList
67130               .append('li')
67131               .attr('class', 'version')
67132               .call(uiVersion(context));
67133
67134           var issueLinks = aboutList
67135               .append('li');
67136
67137           issueLinks
67138               .append('a')
67139               .attr('target', '_blank')
67140               .attr('tabindex', -1)
67141               .attr('href', 'https://github.com/openstreetmap/iD/issues')
67142               .call(svgIcon('#icon-bug', 'light'))
67143               .call(tooltip().title(t('report_a_bug')).placement('top'));
67144
67145           issueLinks
67146               .append('a')
67147               .attr('target', '_blank')
67148               .attr('tabindex', -1)
67149               .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
67150               .call(svgIcon('#icon-translate', 'light'))
67151               .call(tooltip().title(t('help_translate')).placement('top'));
67152
67153           aboutList
67154               .append('li')
67155               .attr('class', 'feature-warning')
67156               .attr('tabindex', -1)
67157               .call(uiFeatureInfo(context));
67158
67159           aboutList
67160               .append('li')
67161               .attr('class', 'user-list')
67162               .attr('tabindex', -1)
67163               .call(uiContributors(context));
67164
67165
67166           var photoviewer = content
67167               .append('div')
67168               .attr('id', 'photoviewer')
67169               .classed('al', true)       // 'al'=left,  'ar'=right
67170               .classed('hide', true);
67171
67172           photoviewer
67173               .append('button')
67174               .attr('class', 'thumb-hide')
67175               .on('click', function () {
67176                   if (services.mapillary) { services.mapillary.hideViewer(); }
67177                   if (services.openstreetcam) { services.openstreetcam.hideViewer(); }
67178               })
67179               .append('div')
67180               .call(svgIcon('#icon-close'));
67181
67182
67183           window.onbeforeunload = function() {
67184               return context.save();
67185           };
67186
67187           window.onunload = function() {
67188               context.history().unlock();
67189           };
67190
67191           var mapDimensions = map.dimensions();
67192
67193
67194           function onResize() {
67195               mapDimensions = utilGetDimensions(content, true);
67196               map.dimensions(mapDimensions);
67197           }
67198
67199           d3_select(window)
67200               .on('resize.editor', onResize);
67201
67202           onResize();
67203
67204           function pan(d) {
67205               return function() {
67206                   event.preventDefault();
67207                   context.pan(d, 100);
67208               };
67209           }
67210
67211
67212           // pan amount
67213           var pa = 80;
67214
67215           var keybinding = d3keybinding('main')
67216               .on('⌫', function() { event.preventDefault(); })
67217               .on('←', pan([pa, 0]))
67218               .on('↑', pan([0, pa]))
67219               .on('→', pan([-pa, 0]))
67220               .on('↓', pan([0, -pa]))
67221               .on(['⇧←', uiCmd('⌘←')], pan([mapDimensions[0], 0]))
67222               .on(['⇧↑', uiCmd('⌘↑')], pan([0, mapDimensions[1]]))
67223               .on(['⇧→', uiCmd('⌘→')], pan([-mapDimensions[0], 0]))
67224               .on(['⇧↓', uiCmd('⌘↓')], pan([0, -mapDimensions[1]]));
67225
67226           d3_select(document)
67227               .call(keybinding);
67228
67229           context.enter(modeBrowse(context));
67230
67231           if (!uiInitCounter++) {
67232               if (!hash.startWalkthrough) {
67233                   context.container()
67234                       .call(uiSplash(context))
67235                       .call(uiRestore(context));
67236               }
67237
67238               context.container()
67239                   .call(uiShortcuts(context));
67240           }
67241
67242           var osm = context.connection(),
67243               auth = uiLoading(context).message(t('loading_auth')).blocking(true);
67244
67245           if (osm && auth) {
67246               osm
67247                   .on('authLoading.ui', function() {
67248                       context.container()
67249                           .call(auth);
67250                   })
67251                   .on('authDone.ui', function() {
67252                       auth.close();
67253                   });
67254           }
67255
67256           uiInitCounter++;
67257
67258           if (hash.startWalkthrough) {
67259               hash.startWalkthrough = false;
67260               context.container().call(uiIntro(context));
67261           }
67262       }
67263
67264
67265       var renderCallback;
67266
67267       function ui(node, callback) {
67268           renderCallback = callback;
67269           var container = d3_select(node);
67270           context.container(container);
67271           context.loadLocale(function(err) {
67272               if (!err) {
67273                   render(container);
67274               }
67275               if (callback) {
67276                   callback(err);
67277               }
67278           });
67279       }
67280
67281
67282       ui.restart = function(arg) {
67283           context.locale(arg);
67284           context.loadLocale(function(err) {
67285               if (!err) {
67286                   context.container().selectAll('*').remove();
67287                   render(context.container());
67288                   if (renderCallback) renderCallback();
67289               }
67290           });
67291       };
67292
67293
67294       ui.sidebar = uiSidebar(context);
67295
67296       return ui;
67297   }
67298
67299   function uiChangesetEditor(context) {
67300       var dispatch$$1 = dispatch('change'),
67301           formFields = uiFormFields(context),
67302           fieldsArr,
67303           tags,
67304           changesetId;
67305
67306
67307
67308       function changesetEditor(selection) {
67309           render(selection);
67310       }
67311
67312
67313       function render(selection) {
67314           var initial = false;
67315
67316           if (!fieldsArr) {
67317               initial = true;
67318               var presets = context.presets();
67319
67320               fieldsArr = [
67321                   uiField(context, presets.field('comment'), null, { show: true, revert: false }),
67322                   uiField(context, presets.field('source'), null, { show: false, revert: false }),
67323                   uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
67324               ];
67325
67326               fieldsArr.forEach(function(field) {
67327                   field
67328                       .on('change', function(t$$1, onInput) {
67329                           dispatch$$1.call('change', field, t$$1, onInput);
67330                       });
67331               });
67332           }
67333
67334           fieldsArr.forEach(function(field) {
67335               field
67336                   .tags(tags);
67337           });
67338
67339
67340           selection
67341               .call(formFields.fieldsArr(fieldsArr));
67342
67343
67344           if (initial) {
67345               var commentField = selection.select('#preset-input-comment'),
67346                   commentNode = commentField.node();
67347
67348               if (commentNode) {
67349                   commentNode.focus();
67350                   commentNode.select();
67351               }
67352
67353               // trigger a 'blur' event so that comment field can be cleaned
67354               // and checked for hashtags, even if retrieved from localstorage
67355               utilTriggerEvent(commentField, 'blur');
67356
67357               var osm = context.connection();
67358               if (osm) {
67359                   osm.userChangesets(function (err, changesets) {
67360                       if (err) return;
67361
67362                       var comments = changesets.map(function(changeset) {
67363                           return {
67364                               title: changeset.tags.comment,
67365                               value: changeset.tags.comment
67366                           };
67367                       });
67368
67369                       commentField
67370                           .call(d3combobox()
67371                               .container(context.container())
67372                               .caseSensitive(true)
67373                               .data(uniqBy(comments, 'title'))
67374                           );
67375                   });
67376               }
67377           }
67378
67379           // Add warning if comment mentions Google
67380           var hasGoogle = tags.comment.match(/google/i);
67381           var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning')
67382               .data(hasGoogle ? [0] : []);
67383
67384           commentWarning.exit()
67385               .transition()
67386               .duration(200)
67387               .style('opacity', 0)
67388               .remove();
67389
67390           var commentEnter = commentWarning.enter()
67391               .insert('div', '.tag-reference-body')
67392               .attr('class', 'field-warning comment-warning')
67393               .style('opacity', 0);
67394
67395           commentEnter
67396               .append('a')
67397               .attr('target', '_blank')
67398               .attr('tabindex', -1)
67399               .call(svgIcon('#icon-alert', 'inline'))
67400               .attr('href', t('commit.google_warning_link'))
67401               .append('span')
67402               .text(t('commit.google_warning'));
67403
67404           commentEnter
67405               .transition()
67406               .duration(200)
67407               .style('opacity', 1);
67408       }
67409
67410
67411       changesetEditor.tags = function(_) {
67412           if (!arguments.length) return tags;
67413           tags = _;
67414           // Don't reset fieldsArr here.
67415           return changesetEditor;
67416       };
67417
67418
67419       changesetEditor.changesetID = function(_) {
67420           if (!arguments.length) return changesetId;
67421           if (changesetId === _) return changesetEditor;
67422           changesetId = _;
67423           fieldsArr = null;
67424           return changesetEditor;
67425       };
67426
67427
67428       return utilRebind(changesetEditor, dispatch$$1, 'on');
67429   }
67430
67431   /**
67432    * This method is like `_.union` except that it accepts `iteratee` which is
67433    * invoked for each element of each `arrays` to generate the criterion by
67434    * which uniqueness is computed. Result values are chosen from the first
67435    * array in which the value occurs. The iteratee is invoked with one argument:
67436    * (value).
67437    *
67438    * @static
67439    * @memberOf _
67440    * @since 4.0.0
67441    * @category Array
67442    * @param {...Array} [arrays] The arrays to inspect.
67443    * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
67444    * @returns {Array} Returns the new array of combined values.
67445    * @example
67446    *
67447    * _.unionBy([2.1], [1.2, 2.3], Math.floor);
67448    * // => [2.1, 1.2]
67449    *
67450    * // The `_.property` iteratee shorthand.
67451    * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
67452    * // => [{ 'x': 1 }, { 'x': 2 }]
67453    */
67454   var unionBy = baseRest(function(arrays) {
67455     var iteratee = last(arrays);
67456     if (isArrayLikeObject(iteratee)) {
67457       iteratee = undefined;
67458     }
67459     return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2));
67460   });
67461
67462   function uiCommitChanges(context) {
67463       var detected = utilDetect();
67464       var _entityID;
67465
67466
67467       function commitChanges(selection$$1) {
67468           var history = context.history();
67469           var summary = history.difference().summary();
67470
67471           var container = selection$$1.selectAll('.modal-section.commit-section')
67472               .data([0]);
67473
67474           var containerEnter = container.enter()
67475               .append('div')
67476               .attr('class', 'commit-section modal-section fillL2');
67477
67478           containerEnter
67479               .append('h3')
67480               .text(t('commit.changes', { count: summary.length }));
67481
67482           containerEnter
67483               .append('ul')
67484               .attr('class', 'changeset-list');
67485
67486           container = containerEnter
67487               .merge(container);
67488
67489
67490           var items = container.select('ul').selectAll('li')
67491               .data(summary);
67492
67493           var itemsEnter = items.enter()
67494               .append('li')
67495               .attr('class', 'change-item');
67496
67497           itemsEnter
67498               .each(function(d) {
67499                   d3_select(this)
67500                       .call(svgIcon('#icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
67501               });
67502
67503           itemsEnter
67504               .append('span')
67505               .attr('class', 'change-type')
67506               .text(function(d) { return t('commit.' + d.changeType) + ' '; });
67507
67508           itemsEnter
67509               .append('strong')
67510               .attr('class', 'entity-type')
67511               .text(function(d) {
67512                   var matched = context.presets().match(d.entity, d.graph);
67513                   return (matched && matched.name()) || utilDisplayType(d.entity.id);
67514               });
67515
67516           itemsEnter
67517               .append('span')
67518               .attr('class', 'entity-name')
67519               .text(function(d) {
67520                   var name = utilDisplayName(d.entity) || '',
67521                       string = '';
67522                   if (name !== '') {
67523                       string += ':';
67524                   }
67525                   return string += ' ' + name;
67526               });
67527
67528           itemsEnter
67529               .style('opacity', 0)
67530               .transition()
67531               .style('opacity', 1);
67532
67533           items = itemsEnter
67534               .merge(items);
67535
67536           items
67537               .on('mouseover', mouseover)
67538               .on('mouseout', mouseout)
67539               .on('click', click);
67540
67541
67542           // Download changeset link
67543           var changeset = new osmChangeset().update({ id: undefined });
67544           var changes = history.changes(actionDiscardTags(history.difference()));
67545
67546           delete changeset.id;  // Export without chnageset_id
67547
67548           var data = JXON.stringify(changeset.osmChangeJXON(changes));
67549           var blob = new Blob([data], {type: 'text/xml;charset=utf-8;'});
67550           var fileName = 'changes.osc';
67551
67552           var linkEnter = container.selectAll('.download-changes')
67553               .data([0])
67554               .enter()
67555               .append('a')
67556               .attr('class', 'download-changes');
67557
67558           if (detected.download) {      // All except IE11 and Edge
67559               linkEnter                 // download the data as a file
67560                   .attr('href', window.URL.createObjectURL(blob))
67561                   .attr('download', fileName);
67562
67563           } else {                      // IE11 and Edge
67564               linkEnter                 // open data uri in a new tab
67565                   .attr('target', '_blank')
67566                   .on('click.download', function() {
67567                       navigator.msSaveBlob(blob, fileName);
67568                   });
67569           }
67570
67571           linkEnter
67572               .call(svgIcon('#icon-load', 'inline'))
67573               .append('span')
67574               .text(t('commit.download_changes'));
67575
67576
67577           function mouseover(d) {
67578               if (d.entity) {
67579                   context.surface().selectAll(
67580                       utilEntityOrMemberSelector([d.entity.id], context.graph())
67581                   ).classed('hover', true);
67582               }
67583           }
67584
67585
67586           function mouseout() {
67587               context.surface().selectAll('.hover')
67588                   .classed('hover', false);
67589           }
67590
67591
67592           function click(change) {
67593               if (change.changeType === 'deleted') {
67594                   _entityID = null;
67595               } else {
67596                   var entity = change.entity;
67597                   _entityID = change.entity.id;
67598                   context.map().zoomTo(entity);
67599                   context.surface().selectAll(utilEntityOrMemberSelector([_entityID], context.graph()))
67600                       .classed('hover', true);
67601               }
67602           }
67603       }
67604
67605
67606       commitChanges.entityID = function(_) {
67607           if (!arguments.length) return _entityID;
67608           _entityID = _;
67609           return commitChanges;
67610       };
67611
67612
67613       return commitChanges;
67614   }
67615
67616   function uiCommitWarnings(context) {
67617
67618       function commitWarnings(selection) {
67619
67620           var changes = context.history().changes();
67621           var warnings = context.history().validate(changes);
67622
67623           var container = selection.selectAll('.warning-section')
67624               .data(warnings.length ? [0] : []);
67625
67626           container.exit()
67627               .remove();
67628
67629           var containerEnter = container.enter()
67630               .append('div')
67631               .attr('class', 'modal-section warning-section fillL2');
67632
67633           containerEnter
67634               .append('h3')
67635               .text(t('commit.warnings'));
67636
67637           containerEnter
67638               .append('ul')
67639               .attr('class', 'changeset-list');
67640
67641           container = containerEnter
67642               .merge(container);
67643
67644
67645           var items = container.select('ul').selectAll('li')
67646               .data(warnings);
67647
67648           items.exit()
67649               .remove();
67650
67651           var itemsEnter = items.enter()
67652               .append('li')
67653               .attr('class', 'warning-item');
67654
67655           itemsEnter
67656               .call(svgIcon('#icon-alert', 'pre-text'));
67657
67658           itemsEnter
67659               .append('strong')
67660               .text(function(d) { return d.message; });
67661
67662           itemsEnter.filter(function(d) { return d.tooltip; })
67663               .call(tooltip()
67664                   .title(function(d) { return d.tooltip; })
67665                   .placement('top')
67666               );
67667
67668           items = itemsEnter
67669               .merge(items);
67670
67671           items
67672               .on('mouseover', mouseover)
67673               .on('mouseout', mouseout)
67674               .on('click', warningClick);
67675
67676
67677           function mouseover(d) {
67678               if (d.entity) {
67679                   context.surface().selectAll(
67680                       utilEntityOrMemberSelector([d.entity.id], context.graph())
67681                   ).classed('hover', true);
67682               }
67683           }
67684
67685
67686           function mouseout() {
67687               context.surface().selectAll('.hover')
67688                   .classed('hover', false);
67689           }
67690
67691
67692           function warningClick(d) {
67693               if (d.entity) {
67694                   context.map().zoomTo(d.entity);
67695                   context.enter(modeSelect(context, [d.entity.id]));
67696               }
67697           }
67698
67699       }
67700
67701
67702       return commitWarnings;
67703   }
67704
67705   var _changeset$1;
67706   var readOnlyTags = [
67707       /^_changesets_count$/,
67708       /^created_by$/,
67709       /^ideditor:/,
67710       /^imagery_used$/,
67711       /^host$/,
67712       /^locale$/
67713   ];
67714
67715   // treat most punctuation (except -, _, +, &) as hashtag delimiters - #4398
67716   // from https://stackoverflow.com/a/25575009
67717   var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
67718
67719
67720   function uiCommit(context) {
67721       var dispatch$$1 = dispatch('cancel', 'save');
67722       var _userDetails;
67723       var _selection;
67724
67725       var changesetEditor = uiChangesetEditor(context)
67726           .on('change', changeTags);
67727       var rawTagEditor = uiRawTagEditor(context)
67728           .on('change', changeTags);
67729       var commitChanges = uiCommitChanges(context);
67730       var commitWarnings = uiCommitWarnings(context);
67731
67732
67733       function commit(selection$$1) {
67734           _selection = selection$$1;
67735
67736           var osm = context.connection();
67737           if (!osm) return;
67738
67739           // expire stored comment, hashtags, source after cutoff datetime - #3947 #4899
67740           var commentDate = +context.storage('commentDate') || 0;
67741           var currDate = Date.now();
67742           var cutoff = 2 * 86400 * 1000;   // 2 days
67743           if (commentDate > currDate || currDate - commentDate > cutoff) {
67744               context.storage('comment', null);
67745               context.storage('hashtags', null);
67746               context.storage('source', null);
67747           }
67748
67749           var tags;
67750           if (!_changeset$1) {
67751               var detected = utilDetect();
67752               tags = {
67753                   comment: context.storage('comment') || '',
67754                   source: context.storage('source') || '',
67755                   created_by: ('iD ' + context.version).substr(0, 255),
67756                   host: detected.host.substr(0, 255),
67757                   locale: detected.locale.substr(0, 255)
67758               };
67759
67760               // call findHashtags initially - this will remove stored
67761               // hashtags if any hashtags are found in the comment - #4304
67762               findHashtags(tags, true);
67763
67764               var hashtags = context.storage('hashtags');
67765               if (hashtags) {
67766                   tags.hashtags = hashtags;
67767               }
67768
67769               _changeset$1 = new osmChangeset({ tags: tags });
67770           }
67771
67772           tags = clone(_changeset$1.tags);
67773           tags.imagery_used = context.history().imageryUsed().join(';').substr(0, 255);
67774           _changeset$1 = _changeset$1.update({ tags: tags });
67775
67776           var header = selection$$1.selectAll('.header')
67777               .data([0]);
67778
67779           header.enter()
67780               .append('div')
67781               .attr('class', 'header fillL')
67782               .append('h3')
67783               .text(t('commit.title'));
67784
67785           var body = selection$$1.selectAll('.body')
67786               .data([0]);
67787
67788           body = body.enter()
67789               .append('div')
67790               .attr('class', 'body')
67791               .merge(body);
67792
67793
67794           // Changeset Section
67795           var changesetSection = body.selectAll('.changeset-editor')
67796               .data([0]);
67797
67798           changesetSection = changesetSection.enter()
67799               .append('div')
67800               .attr('class', 'modal-section changeset-editor')
67801               .merge(changesetSection);
67802
67803           changesetSection
67804               .call(changesetEditor
67805                   .changesetID(_changeset$1.id)
67806                   .tags(tags)
67807               );
67808
67809
67810           // Warnings
67811           body.call(commitWarnings);
67812
67813
67814           // Upload Explanation
67815           var saveSection = body.selectAll('.save-section')
67816               .data([0]);
67817
67818           saveSection = saveSection.enter()
67819               .append('div')
67820               .attr('class','modal-section save-section fillL cf')
67821               .merge(saveSection);
67822
67823           var prose = saveSection.selectAll('.commit-info')
67824               .data([0]);
67825
67826           prose = prose.enter()
67827               .append('p')
67828               .attr('class', 'commit-info')
67829               .text(t('commit.upload_explanation'))
67830               .merge(prose);
67831
67832           osm.userDetails(function(err, user) {
67833               if (err) return;
67834
67835               var userLink = d3_select(document.createElement('div'));
67836
67837               _userDetails = user;
67838
67839               if (user.image_url) {
67840                   userLink
67841                       .append('img')
67842                       .attr('src', user.image_url)
67843                       .attr('class', 'icon pre-text user-icon');
67844               }
67845
67846               userLink
67847                   .append('a')
67848                   .attr('class','user-info')
67849                   .text(user.display_name)
67850                   .attr('href', osm.userURL(user.display_name))
67851                   .attr('tabindex', -1)
67852                   .attr('target', '_blank');
67853
67854               prose
67855                   .html(t('commit.upload_explanation_with_user', { user: userLink.html() }));
67856           });
67857
67858
67859           // Request Review
67860           var requestReview = saveSection.selectAll('.request-review')
67861               .data([0]);
67862
67863           // Enter
67864           var requestReviewEnter = requestReview.enter()
67865               .append('div')
67866               .attr('class', 'request-review');
67867
67868           var labelEnter = requestReviewEnter
67869               .append('label')
67870               .attr('for', 'commit-input-request-review');
67871
67872           labelEnter
67873               .append('input')
67874               .attr('type', 'checkbox')
67875               .attr('id', 'commit-input-request-review');
67876
67877           labelEnter
67878               .append('span')
67879               .text(t('commit.request_review'));
67880
67881           // Update
67882           requestReview = requestReview
67883               .merge(requestReviewEnter);
67884
67885           var requestReviewInput = requestReview.selectAll('input')
67886               .property('checked', isReviewRequested(_changeset$1.tags))
67887               .on('change', toggleRequestReview);
67888
67889
67890           // Buttons
67891           var buttonSection = saveSection.selectAll('.buttons')
67892               .data([0]);
67893
67894           // enter
67895           var buttonEnter = buttonSection.enter()
67896               .append('div')
67897               .attr('class', 'buttons fillL cf');
67898
67899           buttonEnter
67900               .append('button')
67901               .attr('class', 'secondary-action col5 button cancel-button')
67902               .append('span')
67903               .attr('class', 'label')
67904               .text(t('commit.cancel'));
67905
67906           buttonEnter
67907               .append('button')
67908               .attr('class', 'action col5 button save-button')
67909               .append('span')
67910               .attr('class', 'label')
67911               .text(t('commit.save'));
67912
67913           // update
67914           buttonSection = buttonSection
67915               .merge(buttonEnter);
67916
67917           buttonSection.selectAll('.cancel-button')
67918               .on('click.cancel', function() {
67919                   var selectedID = commitChanges.entityID();
67920                   dispatch$$1.call('cancel', this, selectedID);
67921               });
67922
67923           buttonSection.selectAll('.save-button')
67924               .attr('disabled', function() {
67925                   var n = d3_select('#preset-input-comment').node();
67926                   return (n && n.value.length) ? null : true;
67927               })
67928               .on('click.save', function() {
67929                   this.blur();    // avoid keeping focus on the button - #4641
67930                   dispatch$$1.call('save', this, _changeset$1);
67931               });
67932
67933
67934           // Raw Tag Editor
67935           var tagSection = body.selectAll('.tag-section.raw-tag-editor')
67936               .data([0]);
67937
67938           tagSection = tagSection.enter()
67939               .append('div')
67940               .attr('class', 'modal-section tag-section raw-tag-editor')
67941               .merge(tagSection);
67942
67943           var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
67944           tagSection
67945               .call(rawTagEditor
67946                   .expanded(expanded)
67947                   .readOnlyTags(readOnlyTags)
67948                   .tags(clone(_changeset$1.tags))
67949               );
67950
67951
67952           // Change summary
67953           body.call(commitChanges);
67954
67955
67956           function toggleRequestReview() {
67957               var rr = requestReviewInput.property('checked');
67958               updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
67959
67960               var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
67961               tagSection
67962                   .call(rawTagEditor
67963                       .expanded(expanded)
67964                       .readOnlyTags(readOnlyTags)
67965                       .tags(clone(_changeset$1.tags))
67966                   );
67967           }
67968       }
67969
67970
67971       function changeTags(changed, onInput) {
67972           if (changed.hasOwnProperty('comment')) {
67973               if (changed.comment === undefined) {
67974                   changed.comment = '';
67975               }
67976               if (!onInput) {
67977                   context.storage('comment', changed.comment);
67978                   context.storage('commentDate', Date.now());
67979               }
67980           }
67981           if (changed.hasOwnProperty('source')) {
67982               if (changed.source === undefined) {
67983                   changed.source = '';
67984               }
67985               if (!onInput) {
67986                   context.storage('source', changed.source);
67987                   context.storage('commentDate', Date.now());
67988               }
67989           }
67990
67991           updateChangeset(changed, onInput);
67992
67993           if (_selection) {
67994               _selection.call(commit);
67995           }
67996       }
67997
67998
67999       function findHashtags(tags, commentOnly) {
68000           var inComment = commentTags();
68001           var inHashTags = hashTags();
68002
68003           if (inComment !== null) {                    // when hashtags are detected in comment...
68004               context.storage('hashtags', null);       // always remove stored hashtags - #4304
68005               if (commentOnly) { inHashTags = null; }  // optionally override hashtags field
68006           }
68007           return unionBy(inComment, inHashTags, function (s) {
68008               return s.toLowerCase();
68009           });
68010
68011           // Extract hashtags from `comment`
68012           function commentTags() {
68013               return tags.comment
68014                   .replace(/http\S*/g, '')  // drop anything that looks like a URL - #4289
68015                   .match(hashtagRegex);
68016           }
68017
68018           // Extract and clean hashtags from `hashtags`
68019           function hashTags() {
68020               var t$$1 = tags.hashtags || '';
68021               return t$$1
68022                   .split(/[,;\s]+/)
68023                   .map(function (s) {
68024                       if (s[0] !== '#') { s = '#' + s; }    // prepend '#'
68025                       var matched = s.match(hashtagRegex);
68026                       return matched && matched[0];
68027                   }).filter(Boolean);                       // exclude falsey
68028           }
68029       }
68030
68031
68032       function isReviewRequested(tags) {
68033           var rr = tags.review_requested;
68034           if (rr === undefined) return false;
68035           rr = rr.trim().toLowerCase();
68036           return !(rr === '' || rr === 'no');
68037       }
68038
68039
68040       function updateChangeset(changed, onInput) {
68041           var tags = clone(_changeset$1.tags);
68042
68043           forEach(changed, function(v, k) {
68044               k = k.trim().substr(0, 255);
68045               if (readOnlyTags.indexOf(k) !== -1) return;
68046
68047               if (k !== '' && v !== undefined) {
68048                   if (onInput) {
68049                       tags[k] = v;
68050                   } else {
68051                       tags[k] = v.trim().substr(0, 255);
68052                   }
68053               } else {
68054                   delete tags[k];
68055               }
68056           });
68057
68058           if (!onInput) {
68059               // when changing the comment, override hashtags with any found in comment.
68060               var commentOnly = changed.hasOwnProperty('comment') && (changed.comment !== '');
68061               var arr = findHashtags(tags, commentOnly);
68062               if (arr.length) {
68063                   tags.hashtags = arr.join(';').substr(0, 255);
68064                   context.storage('hashtags', tags.hashtags);
68065               } else {
68066                   delete tags.hashtags;
68067                   context.storage('hashtags', null);
68068               }
68069           }
68070
68071           // always update userdetails, just in case user reauthenticates as someone else
68072           if (_userDetails && _userDetails.changesets_count !== undefined) {
68073               var changesetsCount = parseInt(_userDetails.changesets_count, 10) + 1;  // #4283
68074               tags.changesets_count = String(changesetsCount);
68075
68076               // first 100 edits - new user
68077               if (changesetsCount <= 100) {
68078                   var s;
68079                   s = context.storage('walkthrough_completed');
68080                   if (s) {
68081                       tags['ideditor:walkthrough_completed'] = s;
68082                   }
68083
68084                   s = context.storage('walkthrough_progress');
68085                   if (s) {
68086                       tags['ideditor:walkthrough_progress'] = s;
68087                   }
68088
68089                   s = context.storage('walkthrough_started');
68090                   if (s) {
68091                       tags['ideditor:walkthrough_started'] = s;
68092                   }
68093               }
68094           } else {
68095               delete tags.changesets_count;
68096           }
68097
68098           if (!isEqual(_changeset$1.tags, tags)) {
68099               _changeset$1 = _changeset$1.update({ tags: tags });
68100           }
68101       }
68102
68103
68104       commit.reset = function() {
68105           _changeset$1 = null;
68106       };
68107
68108
68109       return utilRebind(commit, dispatch$$1, 'on');
68110   }
68111
68112   function uiConfirm(selection) {
68113       var modalSelection = uiModal(selection);
68114
68115       modalSelection.select('.modal')
68116           .classed('modal-alert', true);
68117
68118       var section = modalSelection.select('.content');
68119
68120       section.append('div')
68121           .attr('class', 'modal-section header');
68122
68123       section.append('div')
68124           .attr('class', 'modal-section message-text');
68125
68126       var buttons = section.append('div')
68127           .attr('class', 'modal-section buttons cf');
68128
68129
68130       modalSelection.okButton = function() {
68131           buttons
68132               .append('button')
68133               .attr('class', 'action col4')
68134               .on('click.confirm', function() {
68135                   modalSelection.remove();
68136               })
68137               .text(t('confirm.okay'))
68138               .node()
68139               .focus();
68140
68141           return modalSelection;
68142       };
68143
68144
68145       return modalSelection;
68146   }
68147
68148   function uiConflicts(context) {
68149       var dispatch$$1 = dispatch('cancel', 'save');
68150       var keybinding = d3keybinding('conflicts');
68151       var _origChanges;
68152       var _conflictList;
68153
68154
68155       function keybindingOn() {
68156           d3_select(document)
68157               .call(keybinding.on('⎋', cancel, true));
68158       }
68159
68160       function keybindingOff() {
68161           d3_select(document)
68162               .call(keybinding.off);
68163       }
68164
68165       function tryAgain() {
68166           keybindingOff();
68167           dispatch$$1.call('save');
68168       }
68169
68170       function cancel() {
68171           keybindingOff();
68172           dispatch$$1.call('cancel');
68173       }
68174
68175
68176       function conflicts(selection$$1) {
68177           keybindingOn();
68178
68179           var headerEnter = selection$$1.selectAll('.header')
68180               .data([0])
68181               .enter()
68182               .append('div')
68183               .attr('class', 'header fillL');
68184
68185           headerEnter
68186               .append('button')
68187               .attr('class', 'fr')
68188               .on('click', cancel)
68189               .call(svgIcon('#icon-close'));
68190
68191           headerEnter
68192               .append('h3')
68193               .text(t('save.conflict.header'));
68194
68195           var bodyEnter = selection$$1.selectAll('.body')
68196               .data([0])
68197               .enter()
68198               .append('div')
68199               .attr('class', 'body fillL');
68200
68201           var conflictsHelpEnter = bodyEnter
68202               .append('div')
68203               .attr('class', 'conflicts-help')
68204               .text(t('save.conflict.help'));
68205
68206
68207           // Download changes link
68208           var detected = utilDetect();
68209           var changeset = new osmChangeset();
68210
68211           delete changeset.id;  // Export without changeset_id
68212
68213           var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
68214           var blob = new Blob([data], { type: 'text/xml;charset=utf-8;' });
68215           var fileName = 'changes.osc';
68216
68217           var linkEnter = conflictsHelpEnter.selectAll('.download-changes')
68218               .append('a')
68219               .attr('class', 'download-changes');
68220
68221           if (detected.download) {      // All except IE11 and Edge
68222               linkEnter                 // download the data as a file
68223                   .attr('href', window.URL.createObjectURL(blob))
68224                   .attr('download', fileName);
68225
68226           } else {                      // IE11 and Edge
68227               linkEnter                 // open data uri in a new tab
68228                   .attr('target', '_blank')
68229                   .on('click.download', function() {
68230                       navigator.msSaveBlob(blob, fileName);
68231                   });
68232           }
68233
68234           linkEnter
68235               .call(svgIcon('#icon-load', 'inline'))
68236               .append('span')
68237               .text(t('save.conflict.download_changes'));
68238
68239
68240           bodyEnter
68241               .append('div')
68242               .attr('class', 'conflict-container fillL3')
68243               .call(showConflict, 0);
68244
68245           bodyEnter
68246               .append('div')
68247               .attr('class', 'conflicts-done')
68248               .attr('opacity', 0)
68249               .style('display', 'none')
68250               .text(t('save.conflict.done'));
68251
68252           var buttonsEnter = bodyEnter
68253               .append('div')
68254               .attr('class','buttons col12 joined conflicts-buttons');
68255
68256           buttonsEnter
68257               .append('button')
68258               .attr('disabled', _conflictList.length > 1)
68259               .attr('class', 'action conflicts-button col6')
68260               .text(t('save.title'))
68261               .on('click.try_again', tryAgain);
68262
68263           buttonsEnter
68264               .append('button')
68265               .attr('class', 'secondary-action conflicts-button col6')
68266               .text(t('confirm.cancel'))
68267               .on('click.cancel', cancel);
68268       }
68269
68270
68271       function showConflict(selection$$1, index) {
68272           index = utilWrap(index, _conflictList.length);
68273
68274           var parent = d3_select(selection$$1.node().parentNode);
68275
68276           // enable save button if this is the last conflict being reviewed..
68277           if (index === _conflictList.length - 1) {
68278               window.setTimeout(function() {
68279                   parent.select('.conflicts-button')
68280                       .attr('disabled', null);
68281
68282                   parent.select('.conflicts-done')
68283                       .transition()
68284                       .attr('opacity', 1)
68285                       .style('display', 'block');
68286               }, 250);
68287           }
68288
68289           var conflict = selection$$1
68290               .selectAll('.conflict')
68291               .data([_conflictList[index]]);
68292
68293           conflict.exit()
68294               .remove();
68295
68296           var conflictEnter = conflict.enter()
68297               .append('div')
68298               .attr('class', 'conflict');
68299
68300           conflictEnter
68301               .append('h4')
68302               .attr('class', 'conflict-count')
68303               .text(t('save.conflict.count', { num: index + 1, total: _conflictList.length }));
68304
68305           conflictEnter
68306               .append('a')
68307               .attr('class', 'conflict-description')
68308               .attr('href', '#')
68309               .text(function(d) { return d.name; })
68310               .on('click', function(d) {
68311                   event.preventDefault();
68312                   zoomToEntity(d.id);
68313               });
68314
68315           var details = conflictEnter
68316               .append('div')
68317               .attr('class', 'conflict-detail-container');
68318
68319           details
68320               .append('ul')
68321               .attr('class', 'conflict-detail-list')
68322               .selectAll('li')
68323               .data(function(d) { return d.details || []; })
68324               .enter()
68325               .append('li')
68326               .attr('class', 'conflict-detail-item')
68327               .html(function(d) { return d; });
68328
68329           details
68330               .append('div')
68331               .attr('class', 'conflict-choices')
68332               .call(addChoices);
68333
68334           details
68335               .append('div')
68336               .attr('class', 'conflict-nav-buttons joined cf')
68337               .selectAll('button')
68338               .data(['previous', 'next'])
68339               .enter()
68340               .append('button')
68341               .text(function(d) { return t('save.conflict.' + d); })
68342               .attr('class', 'conflict-nav-button action col6')
68343               .attr('disabled', function(d, i) {
68344                   return (i === 0 && index === 0) ||
68345                       (i === 1 && index === _conflictList.length - 1) || null;
68346               })
68347               .on('click', function(d, i) {
68348                   event.preventDefault();
68349
68350                   var container = parent.selectAll('.conflict-container');
68351                   var sign = (i === 0 ? -1 : 1);
68352
68353                   container
68354                       .selectAll('.conflict')
68355                       .remove();
68356
68357                   container
68358                       .call(showConflict, index + sign);
68359               });
68360
68361       }
68362
68363
68364       function addChoices(selection$$1) {
68365           var choices = selection$$1
68366               .append('ul')
68367               .attr('class', 'layer-list')
68368               .selectAll('li')
68369               .data(function(d) { return d.choices || []; });
68370
68371           // enter
68372           var choicesEnter = choices.enter()
68373               .append('li')
68374               .attr('class', 'layer');
68375
68376           var labelEnter = choicesEnter
68377               .append('label');
68378
68379           labelEnter
68380               .append('input')
68381               .attr('type', 'radio')
68382               .attr('name', function(d) { return d.id; })
68383               .on('change', function(d, i) {
68384                   var ul = this.parentNode.parentNode.parentNode;
68385                   ul.__data__.chosen = i;
68386                   choose(ul, d);
68387               });
68388
68389           labelEnter
68390               .append('span')
68391               .text(function(d) { return d.text; });
68392
68393           // update
68394           choicesEnter
68395               .merge(choices)
68396               .each(function(d, i) {
68397                   var ul = this.parentNode;
68398                   if (ul.__data__.chosen === i) {
68399                       choose(ul, d);
68400                   }
68401               });
68402       }
68403
68404
68405       function choose(ul, datum) {
68406           if (event) event.preventDefault();
68407
68408           d3_select(ul)
68409               .selectAll('li')
68410               .classed('active', function(d) { return d === datum; })
68411               .selectAll('input')
68412               .property('checked', function(d) { return d === datum; });
68413
68414           var extent = geoExtent$$1();
68415           var entity;
68416
68417           entity = context.graph().hasEntity(datum.id);
68418           if (entity) extent._extend(entity.extent(context.graph()));
68419
68420           datum.action();
68421
68422           entity = context.graph().hasEntity(datum.id);
68423           if (entity) extent._extend(entity.extent(context.graph()));
68424
68425           zoomToEntity(datum.id, extent);
68426       }
68427
68428
68429       function zoomToEntity(id, extent) {
68430           context.surface().selectAll('.hover')
68431               .classed('hover', false);
68432
68433           var entity = context.graph().hasEntity(id);
68434           if (entity) {
68435               if (extent) {
68436                   context.map().trimmedExtent(extent);
68437               } else {
68438                   context.map().zoomTo(entity);
68439               }
68440               context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
68441                   .classed('hover', true);
68442           }
68443       }
68444
68445
68446       // The conflict list should be an array of objects like:
68447       // {
68448       //     id: id,
68449       //     name: entityName(local),
68450       //     details: merge.conflicts(),
68451       //     chosen: 1,
68452       //     choices: [
68453       //         choice(id, keepMine, forceLocal),
68454       //         choice(id, keepTheirs, forceRemote)
68455       //     ]
68456       // }
68457       conflicts.conflictList = function(_) {
68458           if (!arguments.length) return _conflictList;
68459           _conflictList = _;
68460           return conflicts;
68461       };
68462
68463
68464       conflicts.origChanges = function(_) {
68465           if (!arguments.length) return _origChanges;
68466           _origChanges = _;
68467           return conflicts;
68468       };
68469
68470
68471       return utilRebind(conflicts, dispatch$$1, 'on');
68472   }
68473
68474   function uiEditMenu(context, operations) {
68475       var menu,
68476           center = [0, 0],
68477           offset = [0, 0],
68478           tooltip;
68479
68480       var p = 8,               // top padding
68481           m = 4,               // top margin
68482           h = 15,              // height of icon
68483           vpBottomMargin = 45, // viewport bottom margin
68484           vpSideMargin = 35,   // viewport side margin
68485           buttonWidth = 44,
68486           buttonHeight = (2 * p + h),
68487           menuWidth = buttonWidth,
68488           menuHeight = (2 * m) + operations.length * buttonHeight,
68489           menuSideMargin = 10,
68490           tooltipWidth = 200,
68491           tooltipHeight = 200;  // a reasonable guess, real height depends on tooltip contents
68492
68493
68494       var editMenu = function (selection$$1) {
68495           if (!operations.length) return;
68496
68497           selection$$1.node().parentNode.focus();
68498
68499           var isRTL = textDirection === 'rtl',
68500               viewport = context.surfaceRect();
68501
68502           if (!isRTL && (center[0] + menuSideMargin + menuWidth) > (viewport.width - vpSideMargin)) {
68503               // menu is going left-to-right and near right viewport edge, go left instead
68504               isRTL = true;
68505           } else if (isRTL && (center[0] - menuSideMargin - menuWidth) < vpSideMargin) {
68506               // menu is going right-to-left and near left viewport edge, go right instead
68507               isRTL = false;
68508           }
68509
68510           offset[0] = (isRTL ? -1 * (menuSideMargin + menuWidth) : menuSideMargin);
68511
68512           if (center[1] + menuHeight > (viewport.height - vpBottomMargin)) {
68513               // menu is near bottom viewport edge, shift upwards
68514               offset[1] = -1 * (center[1] + menuHeight - viewport.height + vpBottomMargin);
68515           }
68516
68517           var origin = [ center[0] + offset[0], center[1] + offset[1] ];
68518
68519           menu = selection$$1
68520               .append('g')
68521               .attr('class', 'edit-menu')
68522               .attr('transform', 'translate(' + origin + ')')
68523               .attr('opacity', 0);
68524
68525           menu
68526               .transition()
68527               .attr('opacity', 1);
68528
68529           menu
68530               .append('rect')
68531               .attr('class', 'edit-menu-background')
68532               .attr('x', 4)
68533               .attr('rx', 4)
68534               .attr('ry', 4)
68535               .attr('width', menuWidth)
68536               .attr('height', menuHeight)
68537               .attr('stroke-linecap', 'round');
68538
68539
68540           var button = menu.selectAll('.edit-menu-item')
68541               .data(operations)
68542               .enter()
68543               .append('g')
68544               .attr('class', function (d) { return 'edit-menu-item edit-menu-item-' + d.id; })
68545               .classed('disabled', function (d) { return d.disabled(); })
68546               .attr('transform', function (d, i) {
68547                   return 'translate(' + geoVecFloor([
68548                       0,
68549                       m + i * buttonHeight
68550                   ]).join(',') + ')';
68551               });
68552
68553           button
68554               .append('rect')
68555               .attr('x', 4)
68556               .attr('width', buttonWidth)
68557               .attr('height', buttonHeight)
68558               .on('click', click)
68559               .on('mousedown', mousedown)
68560               .on('mouseover', mouseover)
68561               .on('mouseout', mouseout);
68562
68563           button
68564               .append('use')
68565               .attr('width', '20')
68566               .attr('height', '20')
68567               .attr('transform', function () {
68568                   return 'translate(' + [2 * p, 5] + ')';
68569               })
68570               .attr('xlink:href', function (d) { return '#operation-' + d.id; });
68571
68572           tooltip = d3_select(document.body)
68573               .append('div')
68574               .attr('class', 'tooltip-inner edit-menu-tooltip');
68575
68576
68577           function click(operation) {
68578               event.stopPropagation();
68579               if (operation.disabled()) return;
68580               operation();
68581               editMenu.close();
68582           }
68583
68584           function mousedown() {
68585               event.stopPropagation();  // https://github.com/openstreetmap/iD/issues/1869
68586           }
68587
68588           function mouseover(d, i) {
68589               var tipX, tipY;
68590
68591               if (!isRTL) {
68592                   tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
68593               } else {
68594                   tipX = viewport.left + origin[0] - 4 - tooltipWidth;
68595               }
68596
68597               if (tipX + tooltipWidth > viewport.right) {
68598                   // tip is going left-to-right and near right viewport edge, go left instead
68599                   tipX = viewport.left + origin[0] - 4 - tooltipWidth;
68600               } else if (tipX < viewport.left) {
68601                   // tip is going right-to-left and near left viewport edge, go right instead
68602                   tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
68603               }
68604
68605               tipY = viewport.top + origin[1] + (i * buttonHeight);
68606               if (tipY + tooltipHeight > viewport.bottom) {
68607                   // tip is near bottom viewport edge, shift upwards
68608                   tipY -= tipY + tooltipHeight - viewport.bottom;
68609               }
68610
68611               tooltip
68612                   .style('left', tipX + 'px')
68613                   .style('top', tipY + 'px')
68614                   .style('display', 'block')
68615                   .html(uiTooltipHtml(d.tooltip(), d.keys[0], d.title));
68616           }
68617
68618           function mouseout() {
68619               tooltip.style('display', 'none');
68620           }
68621       };
68622
68623
68624       editMenu.close = function () {
68625           if (menu) {
68626               menu
68627                   .style('pointer-events', 'none')
68628                   .transition()
68629                   .attr('opacity', 0)
68630                   .remove();
68631           }
68632
68633           if (tooltip) {
68634               tooltip.remove();
68635           }
68636       };
68637
68638
68639       editMenu.center = function (_) {
68640           if (!arguments.length) return center;
68641           center = _;
68642           return editMenu;
68643       };
68644
68645
68646       return editMenu;
68647   }
68648
68649   var _flashTimer;
68650
68651
68652   function uiFlash() {
68653       var _duration = 2000;
68654       var _iconName = '#icon-no';
68655       var _iconClass = 'disabled';
68656       var _text = '';
68657       var _textClass;
68658
68659
68660       function flash() {
68661           if (_flashTimer) {
68662               _flashTimer.stop();
68663           }
68664
68665           d3_select('#footer-wrap')
68666               .attr('class', 'footer-hide');
68667           d3_select('#flash-wrap')
68668               .attr('class', 'footer-show');
68669
68670           var content = d3_select('#flash-wrap').selectAll('.flash-content')
68671               .data([0]);
68672
68673           // Enter
68674           var contentEnter = content.enter()
68675               .append('div')
68676               .attr('class', 'flash-content');
68677
68678           var iconEnter = contentEnter
68679               .append('svg')
68680               .attr('class', 'flash-icon')
68681               .append('g')
68682               .attr('transform', 'translate(10,10)');
68683
68684           iconEnter
68685               .append('circle')
68686               .attr('r', 9);
68687
68688           iconEnter
68689               .append('use')
68690               .attr('transform', 'translate(-7,-7)')
68691               .attr('width', '14')
68692               .attr('height', '14');
68693
68694           contentEnter
68695               .append('div')
68696               .attr('class', 'flash-text');
68697
68698
68699           // Update
68700           content = content
68701               .merge(contentEnter);
68702
68703           content
68704               .selectAll('.flash-icon')
68705               .attr('class', 'flash-icon ' + (_iconClass || ''));
68706
68707           content
68708               .selectAll('.flash-icon use')
68709               .attr('xlink:href', _iconName);
68710
68711           content
68712               .selectAll('.flash-text')
68713               .attr('class', 'flash-text ' + (_textClass || ''))
68714               .text(_text);
68715
68716
68717           _flashTimer = d3_timeout(function() {
68718               _flashTimer = null;
68719               d3_select('#footer-wrap')
68720                   .attr('class', 'footer-show');
68721               d3_select('#flash-wrap')
68722                   .attr('class', 'footer-hide');
68723           }, _duration);
68724
68725           return content;
68726       }
68727
68728
68729       flash.duration = function(_) {
68730           if (!arguments.length) return _duration;
68731           _duration = _;
68732           return flash;
68733       };
68734
68735       flash.text = function(_) {
68736           if (!arguments.length) return _text;
68737           _text = _;
68738           return flash;
68739       };
68740
68741       flash.textClass = function(_) {
68742           if (!arguments.length) return _textClass;
68743           _textClass = _;
68744           return flash;
68745       };
68746
68747       flash.iconName = function(_) {
68748           if (!arguments.length) return _iconName;
68749           _iconName = _;
68750           return flash;
68751       };
68752
68753       flash.iconClass = function(_) {
68754           if (!arguments.length) return _iconClass;
68755           _iconClass = _;
68756           return flash;
68757       };
68758
68759       return flash;
68760   }
68761
68762   function uiLasso(context) {
68763       var group, polygon;
68764
68765       lasso.coordinates = [];
68766
68767       function lasso(selection$$1) {
68768           context.container()
68769               .classed('lasso', true);
68770
68771           group = selection$$1
68772               .append('g')
68773               .attr('class', 'lasso hide');
68774
68775           polygon = group
68776               .append('path')
68777               .attr('class', 'lasso-path');
68778
68779           group
68780               .call(uiToggle(true));
68781       }
68782
68783
68784       function draw() {
68785           if (polygon) {
68786               polygon.data([lasso.coordinates])
68787                   .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
68788           }
68789       }
68790
68791
68792       lasso.extent = function () {
68793           return lasso.coordinates.reduce(function(extent, point$$1) {
68794               return extent.extend(geoExtent$$1(point$$1));
68795           }, geoExtent$$1());
68796       };
68797
68798
68799       lasso.p = function(_) {
68800           if (!arguments.length) return lasso;
68801           lasso.coordinates.push(_);
68802           draw();
68803           return lasso;
68804       };
68805
68806
68807       lasso.close = function() {
68808           if (group) {
68809               group.call(uiToggle(false, function() {
68810                   d3_select(this).remove();
68811               }));
68812           }
68813           context.container().classed('lasso', false);
68814       };
68815
68816
68817       return lasso;
68818   }
68819
68820   function uiRadialMenu(context, operations) {
68821       var menu,
68822           center = [0, 0],
68823           tooltip;
68824
68825
68826       var radialMenu = function(selection$$1) {
68827           if (!operations.length) return;
68828
68829           selection$$1.node().parentNode.focus();
68830
68831           function click(operation) {
68832               event.stopPropagation();
68833               if (operation.disabled()) return;
68834               operation();
68835               radialMenu.close();
68836           }
68837
68838           menu = selection$$1
68839               .append('g')
68840               .attr('class', 'radial-menu')
68841               .attr('transform', 'translate(' + center + ')')
68842               .attr('opacity', 0);
68843
68844           menu
68845               .transition()
68846               .attr('opacity', 1);
68847
68848           var r = 50,
68849               a = Math.PI / 4,
68850               a0 = -Math.PI / 4,
68851               a1 = a0 + (operations.length - 1) * a;
68852
68853           menu
68854               .append('path')
68855               .attr('class', 'radial-menu-background')
68856               .attr('d', 'M' + r * Math.sin(a0) + ',' +
68857                                r * Math.cos(a0) +
68858                         ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
68859                                (r * Math.sin(a1) + 1e-3) + ',' +
68860                                (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
68861               .attr('stroke-width', 50)
68862               .attr('stroke-linecap', 'round');
68863
68864           var button = menu.selectAll()
68865               .data(operations)
68866               .enter()
68867               .append('g')
68868               .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
68869               .classed('disabled', function(d) { return d.disabled(); })
68870               .attr('transform', function(d, i) {
68871                   return 'translate(' + geoVecFloor([
68872                           r * Math.sin(a0 + i * a),
68873                           r * Math.cos(a0 + i * a)]).join(',') + ')';
68874               });
68875
68876           button
68877               .append('circle')
68878               .attr('r', 15)
68879               .on('click', click)
68880               .on('mousedown', mousedown)
68881               .on('mouseover', mouseover)
68882               .on('mouseout', mouseout);
68883
68884           button
68885               .append('use')
68886               .attr('transform', 'translate(-10,-10)')
68887               .attr('width', '20')
68888               .attr('height', '20')
68889               .attr('xlink:href', function(d) { return '#operation-' + d.id; });
68890
68891           tooltip = d3_select(document.body)
68892               .append('div')
68893               .attr('class', 'tooltip-inner radial-menu-tooltip');
68894
68895           function mousedown() {
68896               event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
68897           }
68898
68899           function mouseover(d, i) {
68900               var rect = context.surfaceRect(),
68901                   angle = a0 + i * a,
68902                   top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px',
68903                   left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px',
68904                   bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px',
68905                   right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
68906
68907               tooltip
68908                   .style('top', null)
68909                   .style('left', null)
68910                   .style('bottom', null)
68911                   .style('right', null)
68912                   .style('display', 'block')
68913                   .html(uiTooltipHtml(d.tooltip(), d.keys[0]));
68914
68915               if (i === 0) {
68916                   tooltip
68917                       .style('right', right)
68918                       .style('top', top);
68919               } else if (i >= 4) {
68920                   tooltip
68921                       .style('left', left)
68922                       .style('bottom', bottom);
68923               } else {
68924                   tooltip
68925                       .style('left', left)
68926                       .style('top', top);
68927               }
68928           }
68929
68930           function mouseout() {
68931               tooltip.style('display', 'none');
68932           }
68933       };
68934
68935
68936       radialMenu.close = function() {
68937           if (menu) {
68938               menu
68939                   .style('pointer-events', 'none')
68940                   .transition()
68941                   .attr('opacity', 0)
68942                   .remove();
68943           }
68944
68945           if (tooltip) {
68946               tooltip.remove();
68947           }
68948       };
68949
68950
68951       radialMenu.center = function(_) {
68952           if (!arguments.length) return center;
68953           center = _;
68954           return radialMenu;
68955       };
68956
68957
68958       return radialMenu;
68959   }
68960
68961   function uiSelectionList(context, selectedIDs) {
68962
68963       function selectEntity(entity) {
68964           context.enter(modeSelect(context, [entity.id]));
68965       }
68966
68967
68968       function deselectEntity(entity) {
68969           event.stopPropagation();
68970           var index = selectedIDs.indexOf(entity.id);
68971           if (index > -1) {
68972               selectedIDs.splice(index, 1);
68973           }
68974           context.enter(modeSelect(context, selectedIDs));
68975       }
68976
68977
68978       function selectionList(selection$$1) {
68979           selection$$1.classed('selection-list-pane', true);
68980
68981           var header = selection$$1
68982               .append('div')
68983               .attr('class', 'header fillL cf');
68984
68985           header
68986               .append('h3')
68987               .text(t('inspector.multiselect'));
68988
68989           var listWrap = selection$$1
68990               .append('div')
68991               .attr('class', 'inspector-body');
68992
68993           var list = listWrap
68994               .append('div')
68995               .attr('class', 'feature-list cf');
68996
68997           context.history().on('change.selection-list', drawList);
68998           drawList();
68999
69000
69001           function drawList() {
69002               var entities = selectedIDs
69003                   .map(function(id) { return context.hasEntity(id); })
69004                   .filter(function(entity) { return entity; });
69005
69006               var items = list.selectAll('.feature-list-item')
69007                   .data(entities, osmEntity$$1.key);
69008
69009               items.exit()
69010                   .remove();
69011
69012               // Enter
69013               var enter = items.enter()
69014                   .append('div')
69015                   .attr('class', 'feature-list-item')
69016                   .on('click', selectEntity);
69017
69018               var label = enter
69019                   .append('button')
69020                   .attr('class', 'label');
69021
69022               enter
69023                   .append('button')
69024                   .attr('class', 'close')
69025                   .on('click', deselectEntity)
69026                   .call(svgIcon('#icon-close'));
69027
69028               label
69029                   .append('span')
69030                   .attr('class', 'entity-geom-icon')
69031                   .call(svgIcon('', 'pre-text'));
69032
69033               label
69034                   .append('span')
69035                   .attr('class', 'entity-type');
69036
69037               label
69038                   .append('span')
69039                   .attr('class', 'entity-name');
69040
69041               // Update
69042               items = items.merge(enter);
69043
69044               items.selectAll('.entity-geom-icon use')
69045                   .attr('href', function() {
69046                       var entity = this.parentNode.parentNode.__data__;
69047                       return '#icon-' + context.geometry(entity.id);
69048                   });
69049
69050               items.selectAll('.entity-type')
69051                   .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
69052
69053               items.selectAll('.entity-name')
69054                   .text(function(entity) { return utilDisplayName(entity); });
69055           }
69056       }
69057
69058       return selectionList;
69059   }
69060
69061   function uiSourceSwitch(context) {
69062       var keys;
69063
69064
69065       function click() {
69066           event.preventDefault();
69067
69068           var osm = context.connection();
69069           if (!osm) return;
69070
69071           if (context.inIntro()) return;
69072
69073           if (context.history().hasChanges() &&
69074               !window.confirm(t('source_switch.lose_changes'))) return;
69075
69076           var isLive = d3_select(this)
69077               .classed('live');
69078
69079           isLive = !isLive;
69080           context.enter(modeBrowse(context));
69081           context.history().clearSaved();          // remove saved history
69082           context.flush();                         // remove stored data
69083
69084           d3_select(this)
69085               .text(isLive ? t('source_switch.live') : t('source_switch.dev'))
69086               .classed('live', isLive);
69087
69088           osm.switch(isLive ? keys[0] : keys[1]);  // switch connection (warning: dispatches 'change' event)
69089       }
69090
69091       var sourceSwitch = function(selection$$1) {
69092           selection$$1
69093               .append('a')
69094               .attr('href', '#')
69095               .text(t('source_switch.live'))
69096               .classed('live', true)
69097               .attr('tabindex', -1)
69098               .on('click', click);
69099       };
69100
69101
69102       sourceSwitch.keys = function(_) {
69103           if (!arguments.length) return keys;
69104           keys = _;
69105           return sourceSwitch;
69106       };
69107
69108
69109       return sourceSwitch;
69110   }
69111
69112   function uiSuccess$$1(context) {
69113       var MAXEVENTS = 2;
69114
69115       // All else being equal, rank more "social" communities higher
69116       // (anything not in this list receives no adjustment)
69117       var COMMUNITYRANK = {
69118           'meetup': +5,
69119           'slack': +4,
69120           'facebook': +3,
69121           'reddit': +2,
69122           'forum': -2,
69123           'mailinglist': -3,
69124           'irc': -4
69125       };
69126
69127       var detected = utilDetect();
69128       var dispatch$$1 = dispatch('cancel');
69129       var _changeset;
69130       var _location;
69131
69132
69133       function success(selection$$1) {
69134           var header = selection$$1
69135               .append('div')
69136               .attr('class', 'header fillL');
69137
69138           header
69139               .append('button')
69140               .attr('class', 'fr')
69141               .on('click', function() { dispatch$$1.call('cancel'); })
69142               .call(svgIcon('#icon-close'));
69143
69144           header
69145               .append('h3')
69146               .text(t('success.just_edited'));
69147
69148           var body = selection$$1
69149               .append('div')
69150               .attr('class', 'body save-success fillL');
69151
69152           var summary = body
69153               .append('div')
69154               .attr('class', 'save-summary');
69155
69156           summary
69157               .append('h3')
69158               .text(t('success.thank_you' + (_location ? '_location' : ''), { where: _location }));
69159
69160           summary
69161               .append('p')
69162               .text(t('success.help_html'))
69163               .append('a')
69164               .attr('class', 'link-out')
69165               .attr('target', '_blank')
69166               .attr('tabindex', -1)
69167               .attr('href', t('success.help_link_url'))
69168               .call(svgIcon('#icon-out-link', 'inline'))
69169               .append('span')
69170               .text(t('success.help_link_text'));
69171
69172           var osm = context.connection();
69173           if (!osm) return;
69174
69175           var changesetURL = osm.changesetURL(_changeset.id);
69176
69177           var table = summary
69178               .append('table')
69179               .attr('class', 'summary-table');
69180
69181           var row = table
69182               .append('tr')
69183               .attr('class', 'summary-row');
69184
69185           row
69186               .append('td')
69187               .attr('class', 'cell-icon summary-icon')
69188               .append('a')
69189               .attr('target', '_blank')
69190               .attr('href', changesetURL)
69191               .append('svg')
69192               .attr('class', 'logo-small')
69193               .append('use')
69194               .attr('xlink:href', '#logo-osm');
69195
69196           var summaryDetail = row
69197               .append('td')
69198               .attr('class', 'cell-detail summary-detail');
69199
69200           summaryDetail
69201               .append('a')
69202               .attr('class', 'cell-detail summary-view-on-osm')
69203               .attr('target', '_blank')
69204               .attr('href', changesetURL)
69205               .text(t('success.view_on_osm'));
69206
69207           summaryDetail
69208               .append('div')
69209               .text(t('success.changeset_id', { changeset_id: _changeset.id }));
69210
69211
69212           // Gather community polygon IDs intersecting the map..
69213           var matchFeatures = data.community.query(context.map().center(), true);
69214           var matchIDs = matchFeatures.map(function(feature) { return feature.id; });
69215
69216           // Gather community resources that are either global or match a polygon.
69217           var matchResources = filter(data.community.resources, function(v) {
69218               return !v.featureId || matchIDs.indexOf(v.featureId) !== -1;
69219           });
69220
69221           if (matchResources.length) {
69222               // sort by size ascending, then by community rank
69223               matchResources.sort(function(a, b) {
69224                   var aSize = Infinity;
69225                   var bSize = Infinity;
69226                   var aRank = COMMUNITYRANK[a.type] || 0;
69227                   var bRank = COMMUNITYRANK[b.type] || 0;
69228
69229                   if (a.featureId) {
69230                       aSize = data.community.features[a.featureId].properties.area;
69231                   }
69232                   if (b.featureId) {
69233                       bSize = data.community.features[b.featureId].properties.area;
69234                   }
69235
69236                   return aSize < bSize ? -1 : aSize > bSize ? 1 : bRank - aRank;
69237               });
69238
69239               body
69240                   .call(showCommunityLinks, matchResources);
69241           }
69242       }
69243
69244
69245       function showCommunityLinks(selection$$1, matchResources) {
69246           var communityLinks = selection$$1
69247               .append('div')
69248               .attr('class', 'save-communityLinks');
69249
69250           communityLinks
69251               .append('h3')
69252               .text(t('success.like_osm'));
69253
69254           var table = communityLinks
69255               .append('table')
69256               .attr('class', 'community-table');
69257
69258           var row = table.selectAll('.community-row')
69259               .data(matchResources);
69260
69261           var rowEnter = row.enter()
69262               .append('tr')
69263               .attr('class', 'community-row');
69264
69265           rowEnter
69266               .append('td')
69267               .attr('class', 'cell-icon community-icon')
69268               .append('a')
69269               .attr('target', '_blank')
69270               .attr('href', function(d) { return d.url; })
69271               .append('svg')
69272               .attr('class', 'logo-small')
69273               .append('use')
69274               .attr('xlink:href', function(d) { return '#community-' + d.type; });
69275
69276           var communityDetail = rowEnter
69277               .append('td')
69278               .attr('class', 'cell-detail community-detail');
69279
69280           communityDetail
69281               .each(showCommunityDetails);
69282
69283           communityLinks
69284               .append('div')
69285               .attr('class', 'community-missing')
69286               .text(t('success.missing'))
69287               .append('a')
69288               .attr('class', 'link-out')
69289               .attr('target', '_blank')
69290               .attr('tabindex', -1)
69291               .call(svgIcon('#icon-out-link', 'inline'))
69292               .attr('href', 'https://github.com/osmlab/osm-community-index/issues')
69293               .append('span')
69294               .text(t('success.tell_us'));
69295       }
69296
69297
69298       function showCommunityDetails(d) {
69299           var selection$$1 = d3_select(this);
69300           var communityID = d.id;
69301           var replacements = {
69302               url: linkify(d.url),
69303               signupUrl: linkify(d.signupUrl || d.url)
69304           };
69305
69306           selection$$1
69307               .append('div')
69308               .attr('class', 'community-name')
69309               .append('a')
69310               .attr('target', '_blank')
69311               .attr('href', d.url)
69312               .text(t('community.' + d.id + '.name'));
69313
69314           selection$$1
69315               .append('div')
69316               .attr('class', 'community-description')
69317               .html(t('community.' + d.id + '.description', replacements));
69318
69319           if (d.extendedDescription || (d.languageCodes && d.languageCodes.length)) {
69320               selection$$1
69321                   .append('div')
69322                   .call(uiDisclosure(context, 'community-more-' + d.id, false)
69323                       .expanded(false)
69324                       .updatePreference(false)
69325                       .title(t('success.more'))
69326                       .content(showMore)
69327                   );
69328           }
69329
69330           var nextEvents = (d.events || [])
69331               .map(function(event$$1) {                  // add parsed date
69332                   event$$1.date = new Date(event$$1.when);
69333                   return event$$1;
69334               })
69335               .filter(function(event$$1) {               // date is valid and future (or today)
69336                   var t$$1 = event$$1.date.getTime();
69337                   var now = (new Date()).setHours(0,0,0,0);
69338                   return !isNaN(t$$1) && t$$1 >= now;
69339               })
69340               .sort(function(a, b) {                  // sort by date ascending
69341                   return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;
69342               })
69343               .slice(0, MAXEVENTS);                   // limit number of events shown
69344
69345           if (nextEvents.length) {
69346               selection$$1
69347                   .append('div')
69348                   .call(uiDisclosure(context, 'community-events-' + d.id, false)
69349                       .expanded(false)
69350                       .updatePreference(false)
69351                       .title(t('success.events'))
69352                       .content(showNextEvents)
69353                   )
69354                   .select('.hide-toggle')
69355                   .append('span')
69356                   .attr('class', 'badge-text')
69357                   .text(nextEvents.length);
69358           }
69359
69360
69361           function showMore(selection$$1) {
69362               var more = selection$$1
69363                   .append('div')
69364                   .attr('class', 'community-more');
69365
69366               if (d.extendedDescription) {
69367                   more
69368                       .append('div')
69369                       .attr('class', 'community-extended-description')
69370                       .html(t('community.' + d.id + '.extendedDescription', replacements));
69371               }
69372
69373               if (d.languageCodes && d.languageCodes.length) {
69374                   more
69375                       .append('div')
69376                       .attr('class', 'community-languages')
69377                       .text(t('success.languages', { languages: d.languageCodes.join(', ') }));
69378               }
69379           }
69380
69381
69382           function showNextEvents(selection$$1) {
69383               var events = selection$$1
69384                   .append('div')
69385                   .attr('class', 'community-events');
69386
69387               var item = events.selectAll('.community-event')
69388                   .data(nextEvents);
69389
69390               var itemEnter = item.enter()
69391                   .append('div')
69392                   .attr('class', 'community-event');
69393
69394               itemEnter
69395                   .append('div')
69396                   .attr('class', 'community-event-name')
69397                   .append('a')
69398                   .attr('target', '_blank')
69399                   .attr('href', function(d) { return d.url; })
69400                   .text(function(d) {
69401                       var name = d.name;
69402                       if (d.i18n && d.id) {
69403                           name = t('community.' + communityID + '.events.' + d.id + '.name', { default: name });
69404                       }
69405                       return name;
69406                   });
69407
69408               itemEnter
69409                   .append('div')
69410                   .attr('class', 'community-event-when')
69411                   .text(function(d) {
69412                       var options = {
69413                           weekday: 'short', day: 'numeric', month: 'short', year: 'numeric'
69414                       };
69415                       if (d.date.getHours() || d.date.getMinutes()) {   // include time if it has one
69416                           options.hour = 'numeric';
69417                           options.minute = 'numeric';
69418                       }
69419                       return d.date.toLocaleString(detected.locale, options);
69420                   });
69421
69422               itemEnter
69423                   .append('div')
69424                   .attr('class', 'community-event-where')
69425                   .text(function(d) {
69426                       var where = d.where;
69427                       if (d.i18n && d.id) {
69428                           where = t('community.' + communityID + '.events.' + d.id + '.where', { default: where });
69429                       }
69430                       return where;
69431                   });
69432
69433               itemEnter
69434                   .append('div')
69435                   .attr('class', 'community-event-description')
69436                   .text(function(d) {
69437                       var description = d.description;
69438                       if (d.i18n && d.id) {
69439                           description = t('community.' + communityID + '.events.' + d.id + '.description', { default: description });
69440                       }
69441                       return description;
69442                   });
69443           }
69444
69445
69446           function linkify(url) {
69447               return '<a target="_blank" href="' + url + '">' + url + '</a>';
69448           }
69449       }
69450
69451
69452       success.changeset = function(_) {
69453           if (!arguments.length) return _changeset;
69454           _changeset = _;
69455           return success;
69456       };
69457
69458
69459       success.location = function(_) {
69460           if (!arguments.length) return _location;
69461           _location = _;
69462           return success;
69463       };
69464
69465
69466       return utilRebind(success, dispatch$$1, 'on');
69467   }
69468
69469   function coreHistory(context) {
69470       var imageryUsed = ['Bing'];
69471       var dispatch$$1 = dispatch('change', 'undone', 'redone');
69472       var lock = utilSessionMutex('lock');
69473       var duration = 150;
69474       var _checkpoints = {};
69475       var _stack;
69476       var _index;
69477       var _tree;
69478
69479
69480       // internal _act, accepts list of actions and eased time
69481       function _act(actions, t) {
69482           actions = Array.prototype.slice.call(actions);
69483
69484           var annotation;
69485           if (!isFunction(actions[actions.length - 1])) {
69486               annotation = actions.pop();
69487           }
69488
69489           _stack[_index].transform = context.projection.transform();
69490           _stack[_index].selectedIDs = context.selectedIDs();
69491
69492           var graph = _stack[_index].graph;
69493           for (var i = 0; i < actions.length; i++) {
69494               graph = actions[i](graph, t);
69495           }
69496
69497           return {
69498               graph: graph,
69499               annotation: annotation,
69500               imageryUsed: imageryUsed
69501           };
69502       }
69503
69504
69505       // internal _perform with eased time
69506       function _perform(args, t) {
69507           var previous = _stack[_index].graph;
69508           _stack = _stack.slice(0, _index + 1);
69509           _stack.push(_act(args, t));
69510           _index++;
69511           return change(previous);
69512       }
69513
69514
69515       // internal _replace with eased time
69516       function _replace(args, t) {
69517           var previous = _stack[_index].graph;
69518           // assert(_index == _stack.length - 1)
69519           _stack[_index] = _act(args, t);
69520           return change(previous);
69521       }
69522
69523
69524       // internal _overwrite with eased time
69525       function _overwrite(args, t) {
69526           var previous = _stack[_index].graph;
69527           if (_index > 0) {
69528               _index--;
69529               _stack.pop();
69530           }
69531           _stack = _stack.slice(0, _index + 1);
69532           _stack.push(_act(args, t));
69533           _index++;
69534           return change(previous);
69535       }
69536
69537
69538       // determine diffrence and dispatch a change event
69539       function change(previous) {
69540           var difference$$1 = coreDifference(previous, history.graph());
69541           dispatch$$1.call('change', this, difference$$1);
69542           return difference$$1;
69543       }
69544
69545
69546       // iD uses namespaced keys so multiple installations do not conflict
69547       function getKey(n) {
69548           return 'iD_' + window.location.origin + '_' + n;
69549       }
69550
69551
69552       var history = {
69553
69554           graph: function() {
69555               return _stack[_index].graph;
69556           },
69557
69558
69559           base: function() {
69560               return _stack[0].graph;
69561           },
69562
69563
69564           merge: function(entities, extent) {
69565               _stack[0].graph.rebase(entities, map$3(_stack, 'graph'), false);
69566               _tree.rebase(entities, false);
69567
69568               dispatch$$1.call('change', this, undefined, extent);
69569           },
69570
69571
69572           perform: function() {
69573               // complete any transition already in progress
69574               d3_select(document).interrupt('history.perform');
69575
69576               var transitionable = false;
69577               var action0 = arguments[0];
69578
69579               if (arguments.length === 1 ||
69580                   arguments.length === 2 && !isFunction(arguments[1])) {
69581                   transitionable = !!action0.transitionable;
69582               }
69583
69584               if (transitionable) {
69585                   var origArguments = arguments;
69586                   d3_select(document)
69587                       .transition('history.perform')
69588                       .duration(duration)
69589                       .ease(linear$1)
69590                       .tween('history.tween', function() {
69591                           return function(t) {
69592                               if (t < 1) _overwrite([action0], t);
69593                           };
69594                       })
69595                       .on('start', function() {
69596                           _perform([action0], 0);
69597                       })
69598                       .on('end interrupt', function() {
69599                           _overwrite(origArguments, 1);
69600                       });
69601
69602               } else {
69603                   return _perform(arguments);
69604               }
69605           },
69606
69607
69608           replace: function() {
69609               d3_select(document).interrupt('history.perform');
69610               return _replace(arguments, 1);
69611           },
69612
69613
69614           // Same as calling pop and then perform
69615           overwrite: function() {
69616               d3_select(document).interrupt('history.perform');
69617               return _overwrite(arguments, 1);
69618           },
69619
69620
69621           pop: function(n) {
69622               d3_select(document).interrupt('history.perform');
69623
69624               var previous = _stack[_index].graph;
69625               if (isNaN(+n) || +n < 0) {
69626                   n = 1;
69627               }
69628               while (n-- > 0 && _index > 0) {
69629                   _index--;
69630                   _stack.pop();
69631               }
69632               return change(previous);
69633           },
69634
69635
69636           // Back to the previous annotated state or _index = 0.
69637           undo: function() {
69638               d3_select(document).interrupt('history.perform');
69639
69640               var previous = _stack[_index].graph;
69641               while (_index > 0) {
69642                   _index--;
69643                   if (_stack[_index].annotation) break;
69644               }
69645
69646               dispatch$$1.call('undone', this, _stack[_index]);
69647               return change(previous);
69648           },
69649
69650
69651           // Forward to the next annotated state.
69652           redo: function() {
69653               d3_select(document).interrupt('history.perform');
69654
69655               var previous = _stack[_index].graph;
69656               var tryIndex = _index;
69657               while (tryIndex < _stack.length - 1) {
69658                   tryIndex++;
69659                   if (_stack[tryIndex].annotation) {
69660                       _index = tryIndex;
69661                       dispatch$$1.call('redone', this, _stack[_index]);
69662                       break;
69663                   }
69664               }
69665
69666               return change(previous);
69667           },
69668
69669
69670           undoAnnotation: function() {
69671               var i = _index;
69672               while (i >= 0) {
69673                   if (_stack[i].annotation) return _stack[i].annotation;
69674                   i--;
69675               }
69676           },
69677
69678
69679           redoAnnotation: function() {
69680               var i = _index + 1;
69681               while (i <= _stack.length - 1) {
69682                   if (_stack[i].annotation) return _stack[i].annotation;
69683                   i++;
69684               }
69685           },
69686
69687
69688           intersects: function(extent) {
69689               return _tree.intersects(extent, _stack[_index].graph);
69690           },
69691
69692
69693           difference: function() {
69694               var base = _stack[0].graph;
69695               var head = _stack[_index].graph;
69696               return coreDifference(base, head);
69697           },
69698
69699
69700           changes: function(action) {
69701               var base = _stack[0].graph;
69702               var head = _stack[_index].graph;
69703
69704               if (action) {
69705                   head = action(head);
69706               }
69707
69708               var difference$$1 = coreDifference(base, head);
69709
69710               return {
69711                   modified: difference$$1.modified(),
69712                   created: difference$$1.created(),
69713                   deleted: difference$$1.deleted()
69714               };
69715           },
69716
69717
69718           validate: function(changes) {
69719               return flatten(
69720                   map$3(Validations, function(fn) { return fn()(changes, _stack[_index].graph); })
69721               );
69722           },
69723
69724
69725           hasChanges: function() {
69726               return this.difference().length() > 0;
69727           },
69728
69729
69730           imageryUsed: function(sources) {
69731               if (sources) {
69732                   imageryUsed = sources;
69733                   return history;
69734               } else {
69735                   var arr = map$3(_stack.slice(1, _index + 1), 'imageryUsed');
69736                   return without(uniq(flatten(arr)), 'Custom');
69737               }
69738           },
69739
69740
69741           // save the current history state
69742           checkpoint: function(key) {
69743               _checkpoints[key] = {
69744                   stack: cloneDeep(_stack),
69745                   index: _index
69746               };
69747               return history;
69748           },
69749
69750
69751           // restore history state to a given checkpoint or reset completely
69752           reset: function(key) {
69753               if (key !== undefined && _checkpoints.hasOwnProperty(key)) {
69754                   _stack = cloneDeep(_checkpoints[key].stack);
69755                   _index = _checkpoints[key].index;
69756               } else {
69757                   _stack = [{graph: coreGraph$$1()}];
69758                   _index = 0;
69759                   _tree = coreTree(_stack[0].graph);
69760                   _checkpoints = {};
69761               }
69762               dispatch$$1.call('change');
69763               return history;
69764           },
69765
69766
69767           toIntroGraph: function() {
69768               var nextId = { n: 0, r: 0, w: 0 };
69769               var permIds = {};
69770               var graph = this.graph();
69771               var baseEntities = {};
69772
69773               // clone base entities..
69774               forEach(graph.base().entities, function(entity) {
69775                   var copy = cloneDeepWith(entity, customizer);
69776                   baseEntities[copy.id] = copy;
69777               });
69778
69779               // replace base entities with head entities..
69780               forEach(graph.entities, function(entity, id) {
69781                   if (entity) {
69782                       var copy = cloneDeepWith(entity, customizer);
69783                       baseEntities[copy.id] = copy;
69784                   } else {
69785                       delete baseEntities[id];
69786                   }
69787               });
69788
69789               // swap temporary for permanent ids..
69790               forEach(baseEntities, function(entity) {
69791                   if (Array.isArray(entity.nodes)) {
69792                       entity.nodes = entity.nodes.map(function(node) {
69793                           return permIds[node] || node;
69794                       });
69795                   }
69796                   if (Array.isArray(entity.members)) {
69797                       entity.members = entity.members.map(function(member) {
69798                           member.id = permIds[member.id] || member.id;
69799                           return member;
69800                       });
69801                   }
69802               });
69803
69804               return JSON.stringify({ dataIntroGraph: baseEntities });
69805
69806
69807               function customizer(src) {
69808                   var copy = omit(cloneDeep(src), ['type', 'user', 'v', 'version', 'visible']);
69809                   if (isEmpty(copy.tags)) {
69810                       delete copy.tags;
69811                   }
69812
69813                   if (Array.isArray(copy.loc)) {
69814                       copy.loc[0] = +copy.loc[0].toFixed(6);
69815                       copy.loc[1] = +copy.loc[1].toFixed(6);
69816                   }
69817
69818                   var match = src.id.match(/([nrw])-\d*/);  // temporary id
69819                   if (match !== null) {
69820                       var nrw = match[1], permId;
69821                       do { permId = nrw + (++nextId[nrw]); }
69822                       while (baseEntities.hasOwnProperty(permId));
69823
69824                       copy.id = permIds[src.id] = permId;
69825                   }
69826                   return copy;
69827               }
69828           },
69829
69830
69831           toJSON: function() {
69832               if (!this.hasChanges()) return;
69833
69834               var allEntities = {};
69835               var baseEntities = {};
69836               var base = _stack[0];
69837
69838               var s = _stack.map(function(i) {
69839                   var modified = [], deleted = [];
69840
69841                   forEach(i.graph.entities, function(entity, id) {
69842                       if (entity) {
69843                           var key = osmEntity$$1.key(entity);
69844                           allEntities[key] = entity;
69845                           modified.push(key);
69846                       } else {
69847                           deleted.push(id);
69848                       }
69849
69850                       // make sure that the originals of changed or deleted entities get merged
69851                       // into the base of the _stack after restoring the data from JSON.
69852                       if (id in base.graph.entities) {
69853                           baseEntities[id] = base.graph.entities[id];
69854                       }
69855                       // get originals of parent entities too
69856                       forEach(base.graph._parentWays[id], function(parentId) {
69857                           if (parentId in base.graph.entities) {
69858                               baseEntities[parentId] = base.graph.entities[parentId];
69859                           }
69860                       });
69861                   });
69862
69863                   var x = {};
69864
69865                   if (modified.length) x.modified = modified;
69866                   if (deleted.length) x.deleted = deleted;
69867                   if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
69868                   if (i.annotation) x.annotation = i.annotation;
69869
69870                   return x;
69871               });
69872
69873               return JSON.stringify({
69874                   version: 3,
69875                   entities: values$1(allEntities),
69876                   baseEntities: values$1(baseEntities),
69877                   stack: s,
69878                   nextIDs: osmEntity$$1.id.next,
69879                   index: _index
69880               });
69881           },
69882
69883
69884           fromJSON: function(json, loadChildNodes) {
69885               var h = JSON.parse(json);
69886               var loadComplete = true;
69887
69888               osmEntity$$1.id.next = h.nextIDs;
69889               _index = h.index;
69890
69891               if (h.version === 2 || h.version === 3) {
69892                   var allEntities = {};
69893
69894                   h.entities.forEach(function(entity) {
69895                       allEntities[osmEntity$$1.key(entity)] = osmEntity$$1(entity);
69896                   });
69897
69898                   if (h.version === 3) {
69899                       // This merges originals for changed entities into the base of
69900                       // the _stack even if the current _stack doesn't have them (for
69901                       // example when iD has been restarted in a different region)
69902                       var baseEntities = h.baseEntities.map(function(d) { return osmEntity$$1(d); });
69903                       _stack[0].graph.rebase(baseEntities, map$3(_stack, 'graph'), true);
69904                       _tree.rebase(baseEntities, true);
69905
69906                       // When we restore a modified way, we also need to fetch any missing
69907                       // childnodes that would normally have been downloaded with it.. #2142
69908                       if (loadChildNodes) {
69909                           var osm = context.connection();
69910                           var nodes = flatten(uniq(map$3(filter(baseEntities, { type: 'way' }), 'nodes')));
69911                           var missing = reject(nodes, function(n) { return _stack[0].graph.hasEntity(n); });
69912
69913                           if (!isEmpty(missing) && osm) {
69914                               loadComplete = false;
69915                               context.redrawEnable(false);
69916
69917                               var loading = uiLoading(context).blocking(true);
69918                               context.container().call(loading);
69919
69920                               var childNodesLoaded = function(err, result) {
69921                                   if (!err) {
69922                                       var visible = groupBy(result.data, 'visible');
69923                                       if (!isEmpty(visible.true)) {
69924                                           missing = difference(missing, map$3(visible.true, 'id'));
69925                                           _stack[0].graph.rebase(visible.true, map$3(_stack, 'graph'), true);
69926                                           _tree.rebase(visible.true, true);
69927                                       }
69928
69929                                       // fetch older versions of nodes that were deleted..
69930                                       forEach(visible.false, function(entity) {
69931                                           osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
69932                                       });
69933                                   }
69934
69935                                   if (err || isEmpty(missing)) {
69936                                       loading.close();
69937                                       context.redrawEnable(true);
69938                                       dispatch$$1.call('change');
69939                                   }
69940                               };
69941
69942                               osm.loadMultiple(missing, childNodesLoaded);
69943                           }
69944                       }
69945                   }
69946
69947                   _stack = h.stack.map(function(d) {
69948                       var entities = {}, entity;
69949
69950                       if (d.modified) {
69951                           d.modified.forEach(function(key) {
69952                               entity = allEntities[key];
69953                               entities[entity.id] = entity;
69954                           });
69955                       }
69956
69957                       if (d.deleted) {
69958                           d.deleted.forEach(function(id) {
69959                               entities[id] = undefined;
69960                           });
69961                       }
69962
69963                       return {
69964                           graph: coreGraph$$1(_stack[0].graph).load(entities),
69965                           annotation: d.annotation,
69966                           imageryUsed: d.imageryUsed
69967                       };
69968                   });
69969
69970               } else { // original version
69971                   _stack = h.stack.map(function(d) {
69972                       var entities = {};
69973
69974                       for (var i in d.entities) {
69975                           var entity = d.entities[i];
69976                           entities[i] = entity === 'undefined' ? undefined : osmEntity$$1(entity);
69977                       }
69978
69979                       d.graph = coreGraph$$1(_stack[0].graph).load(entities);
69980                       return d;
69981                   });
69982               }
69983
69984               if (loadComplete) {
69985                   dispatch$$1.call('change');
69986               }
69987
69988               return history;
69989           },
69990
69991
69992           save: function() {
69993               if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
69994               return history;
69995           },
69996
69997
69998           clearSaved: function() {
69999               context.debouncedSave.cancel();
70000               if (lock.locked()) context.storage(getKey('saved_history'), null);
70001               return history;
70002           },
70003
70004
70005           lock: function() {
70006               return lock.lock();
70007           },
70008
70009
70010           unlock: function() {
70011               lock.unlock();
70012           },
70013
70014
70015           // is iD not open in another window and it detects that
70016           // there's a history stored in localStorage that's recoverable?
70017           restorableChanges: function() {
70018               return lock.locked() && !!context.storage(getKey('saved_history'));
70019           },
70020
70021
70022           // load history from a version stored in localStorage
70023           restore: function() {
70024               if (!lock.locked()) return;
70025
70026               var json = context.storage(getKey('saved_history'));
70027               if (json) history.fromJSON(json, true);
70028           },
70029
70030
70031           _getKey: getKey
70032
70033       };
70034
70035
70036       history.reset();
70037
70038       return utilRebind(history, dispatch$$1, 'on');
70039   }
70040
70041   /** Used to store function metadata. */
70042   var metaMap = WeakMap && new WeakMap;
70043
70044   /**
70045    * The base implementation of `setData` without support for hot loop shorting.
70046    *
70047    * @private
70048    * @param {Function} func The function to associate metadata with.
70049    * @param {*} data The metadata.
70050    * @returns {Function} Returns `func`.
70051    */
70052   var baseSetData = !metaMap ? identity$8 : function(func, data) {
70053     metaMap.set(func, data);
70054     return func;
70055   };
70056
70057   /**
70058    * Creates a function that produces an instance of `Ctor` regardless of
70059    * whether it was invoked as part of a `new` expression or by `call` or `apply`.
70060    *
70061    * @private
70062    * @param {Function} Ctor The constructor to wrap.
70063    * @returns {Function} Returns the new wrapped function.
70064    */
70065   function createCtor(Ctor) {
70066     return function() {
70067       // Use a `switch` statement to work with class constructors. See
70068       // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
70069       // for more details.
70070       var args = arguments;
70071       switch (args.length) {
70072         case 0: return new Ctor;
70073         case 1: return new Ctor(args[0]);
70074         case 2: return new Ctor(args[0], args[1]);
70075         case 3: return new Ctor(args[0], args[1], args[2]);
70076         case 4: return new Ctor(args[0], args[1], args[2], args[3]);
70077         case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
70078         case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
70079         case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
70080       }
70081       var thisBinding = baseCreate(Ctor.prototype),
70082           result = Ctor.apply(thisBinding, args);
70083
70084       // Mimic the constructor's `return` behavior.
70085       // See https://es5.github.io/#x13.2.2 for more details.
70086       return isObject(result) ? result : thisBinding;
70087     };
70088   }
70089
70090   /** Used to compose bitmasks for function metadata. */
70091   var WRAP_BIND_FLAG = 1;
70092
70093   /**
70094    * Creates a function that wraps `func` to invoke it with the optional `this`
70095    * binding of `thisArg`.
70096    *
70097    * @private
70098    * @param {Function} func The function to wrap.
70099    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
70100    * @param {*} [thisArg] The `this` binding of `func`.
70101    * @returns {Function} Returns the new wrapped function.
70102    */
70103   function createBind(func, bitmask, thisArg) {
70104     var isBind = bitmask & WRAP_BIND_FLAG,
70105         Ctor = createCtor(func);
70106
70107     function wrapper() {
70108       var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
70109       return fn.apply(isBind ? thisArg : this, arguments);
70110     }
70111     return wrapper;
70112   }
70113
70114   /* Built-in method references for those with the same name as other `lodash` methods. */
70115   var nativeMax$5 = Math.max;
70116
70117   /**
70118    * Creates an array that is the composition of partially applied arguments,
70119    * placeholders, and provided arguments into a single array of arguments.
70120    *
70121    * @private
70122    * @param {Array} args The provided arguments.
70123    * @param {Array} partials The arguments to prepend to those provided.
70124    * @param {Array} holders The `partials` placeholder indexes.
70125    * @params {boolean} [isCurried] Specify composing for a curried function.
70126    * @returns {Array} Returns the new array of composed arguments.
70127    */
70128   function composeArgs(args, partials, holders, isCurried) {
70129     var argsIndex = -1,
70130         argsLength = args.length,
70131         holdersLength = holders.length,
70132         leftIndex = -1,
70133         leftLength = partials.length,
70134         rangeLength = nativeMax$5(argsLength - holdersLength, 0),
70135         result = Array(leftLength + rangeLength),
70136         isUncurried = !isCurried;
70137
70138     while (++leftIndex < leftLength) {
70139       result[leftIndex] = partials[leftIndex];
70140     }
70141     while (++argsIndex < holdersLength) {
70142       if (isUncurried || argsIndex < argsLength) {
70143         result[holders[argsIndex]] = args[argsIndex];
70144       }
70145     }
70146     while (rangeLength--) {
70147       result[leftIndex++] = args[argsIndex++];
70148     }
70149     return result;
70150   }
70151
70152   /* Built-in method references for those with the same name as other `lodash` methods. */
70153   var nativeMax$6 = Math.max;
70154
70155   /**
70156    * This function is like `composeArgs` except that the arguments composition
70157    * is tailored for `_.partialRight`.
70158    *
70159    * @private
70160    * @param {Array} args The provided arguments.
70161    * @param {Array} partials The arguments to append to those provided.
70162    * @param {Array} holders The `partials` placeholder indexes.
70163    * @params {boolean} [isCurried] Specify composing for a curried function.
70164    * @returns {Array} Returns the new array of composed arguments.
70165    */
70166   function composeArgsRight(args, partials, holders, isCurried) {
70167     var argsIndex = -1,
70168         argsLength = args.length,
70169         holdersIndex = -1,
70170         holdersLength = holders.length,
70171         rightIndex = -1,
70172         rightLength = partials.length,
70173         rangeLength = nativeMax$6(argsLength - holdersLength, 0),
70174         result = Array(rangeLength + rightLength),
70175         isUncurried = !isCurried;
70176
70177     while (++argsIndex < rangeLength) {
70178       result[argsIndex] = args[argsIndex];
70179     }
70180     var offset = argsIndex;
70181     while (++rightIndex < rightLength) {
70182       result[offset + rightIndex] = partials[rightIndex];
70183     }
70184     while (++holdersIndex < holdersLength) {
70185       if (isUncurried || argsIndex < argsLength) {
70186         result[offset + holders[holdersIndex]] = args[argsIndex++];
70187       }
70188     }
70189     return result;
70190   }
70191
70192   /**
70193    * Gets the number of `placeholder` occurrences in `array`.
70194    *
70195    * @private
70196    * @param {Array} array The array to inspect.
70197    * @param {*} placeholder The placeholder to search for.
70198    * @returns {number} Returns the placeholder count.
70199    */
70200   function countHolders(array, placeholder) {
70201     var length = array.length,
70202         result = 0;
70203
70204     while (length--) {
70205       if (array[length] === placeholder) {
70206         ++result;
70207       }
70208     }
70209     return result;
70210   }
70211
70212   /**
70213    * The function whose prototype chain sequence wrappers inherit from.
70214    *
70215    * @private
70216    */
70217   function baseLodash() {
70218     // No operation performed.
70219   }
70220
70221   /** Used as references for the maximum length and index of an array. */
70222   var MAX_ARRAY_LENGTH = 4294967295;
70223
70224   /**
70225    * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
70226    *
70227    * @private
70228    * @constructor
70229    * @param {*} value The value to wrap.
70230    */
70231   function LazyWrapper(value) {
70232     this.__wrapped__ = value;
70233     this.__actions__ = [];
70234     this.__dir__ = 1;
70235     this.__filtered__ = false;
70236     this.__iteratees__ = [];
70237     this.__takeCount__ = MAX_ARRAY_LENGTH;
70238     this.__views__ = [];
70239   }
70240
70241   // Ensure `LazyWrapper` is an instance of `baseLodash`.
70242   LazyWrapper.prototype = baseCreate(baseLodash.prototype);
70243   LazyWrapper.prototype.constructor = LazyWrapper;
70244
70245   /**
70246    * Gets metadata for `func`.
70247    *
70248    * @private
70249    * @param {Function} func The function to query.
70250    * @returns {*} Returns the metadata for `func`.
70251    */
70252   var getData = !metaMap ? noop$3 : function(func) {
70253     return metaMap.get(func);
70254   };
70255
70256   /** Used to lookup unminified function names. */
70257   var realNames = {};
70258
70259   /** Used for built-in method references. */
70260   var objectProto$20 = Object.prototype;
70261
70262   /** Used to check objects for own properties. */
70263   var hasOwnProperty$17 = objectProto$20.hasOwnProperty;
70264
70265   /**
70266    * Gets the name of `func`.
70267    *
70268    * @private
70269    * @param {Function} func The function to query.
70270    * @returns {string} Returns the function name.
70271    */
70272   function getFuncName(func) {
70273     var result = (func.name + ''),
70274         array = realNames[result],
70275         length = hasOwnProperty$17.call(realNames, result) ? array.length : 0;
70276
70277     while (length--) {
70278       var data = array[length],
70279           otherFunc = data.func;
70280       if (otherFunc == null || otherFunc == func) {
70281         return data.name;
70282       }
70283     }
70284     return result;
70285   }
70286
70287   /**
70288    * The base constructor for creating `lodash` wrapper objects.
70289    *
70290    * @private
70291    * @param {*} value The value to wrap.
70292    * @param {boolean} [chainAll] Enable explicit method chain sequences.
70293    */
70294   function LodashWrapper(value, chainAll) {
70295     this.__wrapped__ = value;
70296     this.__actions__ = [];
70297     this.__chain__ = !!chainAll;
70298     this.__index__ = 0;
70299     this.__values__ = undefined;
70300   }
70301
70302   LodashWrapper.prototype = baseCreate(baseLodash.prototype);
70303   LodashWrapper.prototype.constructor = LodashWrapper;
70304
70305   /**
70306    * Creates a clone of `wrapper`.
70307    *
70308    * @private
70309    * @param {Object} wrapper The wrapper to clone.
70310    * @returns {Object} Returns the cloned wrapper.
70311    */
70312   function wrapperClone(wrapper) {
70313     if (wrapper instanceof LazyWrapper) {
70314       return wrapper.clone();
70315     }
70316     var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
70317     result.__actions__ = copyArray(wrapper.__actions__);
70318     result.__index__  = wrapper.__index__;
70319     result.__values__ = wrapper.__values__;
70320     return result;
70321   }
70322
70323   /** Used for built-in method references. */
70324   var objectProto$21 = Object.prototype;
70325
70326   /** Used to check objects for own properties. */
70327   var hasOwnProperty$18 = objectProto$21.hasOwnProperty;
70328
70329   /**
70330    * Creates a `lodash` object which wraps `value` to enable implicit method
70331    * chain sequences. Methods that operate on and return arrays, collections,
70332    * and functions can be chained together. Methods that retrieve a single value
70333    * or may return a primitive value will automatically end the chain sequence
70334    * and return the unwrapped value. Otherwise, the value must be unwrapped
70335    * with `_#value`.
70336    *
70337    * Explicit chain sequences, which must be unwrapped with `_#value`, may be
70338    * enabled using `_.chain`.
70339    *
70340    * The execution of chained methods is lazy, that is, it's deferred until
70341    * `_#value` is implicitly or explicitly called.
70342    *
70343    * Lazy evaluation allows several methods to support shortcut fusion.
70344    * Shortcut fusion is an optimization to merge iteratee calls; this avoids
70345    * the creation of intermediate arrays and can greatly reduce the number of
70346    * iteratee executions. Sections of a chain sequence qualify for shortcut
70347    * fusion if the section is applied to an array and iteratees accept only
70348    * one argument. The heuristic for whether a section qualifies for shortcut
70349    * fusion is subject to change.
70350    *
70351    * Chaining is supported in custom builds as long as the `_#value` method is
70352    * directly or indirectly included in the build.
70353    *
70354    * In addition to lodash methods, wrappers have `Array` and `String` methods.
70355    *
70356    * The wrapper `Array` methods are:
70357    * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
70358    *
70359    * The wrapper `String` methods are:
70360    * `replace` and `split`
70361    *
70362    * The wrapper methods that support shortcut fusion are:
70363    * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
70364    * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
70365    * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
70366    *
70367    * The chainable wrapper methods are:
70368    * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
70369    * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
70370    * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
70371    * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
70372    * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
70373    * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
70374    * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
70375    * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
70376    * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
70377    * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
70378    * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
70379    * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
70380    * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
70381    * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
70382    * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
70383    * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
70384    * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
70385    * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
70386    * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
70387    * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
70388    * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
70389    * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
70390    * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
70391    * `zipObject`, `zipObjectDeep`, and `zipWith`
70392    *
70393    * The wrapper methods that are **not** chainable by default are:
70394    * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
70395    * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
70396    * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
70397    * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
70398    * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
70399    * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
70400    * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
70401    * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
70402    * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
70403    * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
70404    * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
70405    * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
70406    * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
70407    * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
70408    * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
70409    * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
70410    * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
70411    * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
70412    * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
70413    * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
70414    * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
70415    * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
70416    * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
70417    * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
70418    * `upperFirst`, `value`, and `words`
70419    *
70420    * @name _
70421    * @constructor
70422    * @category Seq
70423    * @param {*} value The value to wrap in a `lodash` instance.
70424    * @returns {Object} Returns the new `lodash` wrapper instance.
70425    * @example
70426    *
70427    * function square(n) {
70428    *   return n * n;
70429    * }
70430    *
70431    * var wrapped = _([1, 2, 3]);
70432    *
70433    * // Returns an unwrapped value.
70434    * wrapped.reduce(_.add);
70435    * // => 6
70436    *
70437    * // Returns a wrapped value.
70438    * var squares = wrapped.map(square);
70439    *
70440    * _.isArray(squares);
70441    * // => false
70442    *
70443    * _.isArray(squares.value());
70444    * // => true
70445    */
70446   function lodash(value) {
70447     if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
70448       if (value instanceof LodashWrapper) {
70449         return value;
70450       }
70451       if (hasOwnProperty$18.call(value, '__wrapped__')) {
70452         return wrapperClone(value);
70453       }
70454     }
70455     return new LodashWrapper(value);
70456   }
70457
70458   // Ensure wrappers are instances of `baseLodash`.
70459   lodash.prototype = baseLodash.prototype;
70460   lodash.prototype.constructor = lodash;
70461
70462   /**
70463    * Checks if `func` has a lazy counterpart.
70464    *
70465    * @private
70466    * @param {Function} func The function to check.
70467    * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
70468    *  else `false`.
70469    */
70470   function isLaziable(func) {
70471     var funcName = getFuncName(func),
70472         other = lodash[funcName];
70473
70474     if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
70475       return false;
70476     }
70477     if (func === other) {
70478       return true;
70479     }
70480     var data = getData(other);
70481     return !!data && func === data[0];
70482   }
70483
70484   /**
70485    * Sets metadata for `func`.
70486    *
70487    * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
70488    * period of time, it will trip its breaker and transition to an identity
70489    * function to avoid garbage collection pauses in V8. See
70490    * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
70491    * for more details.
70492    *
70493    * @private
70494    * @param {Function} func The function to associate metadata with.
70495    * @param {*} data The metadata.
70496    * @returns {Function} Returns `func`.
70497    */
70498   var setData = shortOut(baseSetData);
70499
70500   /** Used to match wrap detail comments. */
70501   var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
70502       reSplitDetails = /,? & /;
70503
70504   /**
70505    * Extracts wrapper details from the `source` body comment.
70506    *
70507    * @private
70508    * @param {string} source The source to inspect.
70509    * @returns {Array} Returns the wrapper details.
70510    */
70511   function getWrapDetails(source) {
70512     var match = source.match(reWrapDetails);
70513     return match ? match[1].split(reSplitDetails) : [];
70514   }
70515
70516   /** Used to match wrap detail comments. */
70517   var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;
70518
70519   /**
70520    * Inserts wrapper `details` in a comment at the top of the `source` body.
70521    *
70522    * @private
70523    * @param {string} source The source to modify.
70524    * @returns {Array} details The details to insert.
70525    * @returns {string} Returns the modified source.
70526    */
70527   function insertWrapDetails(source, details) {
70528     var length = details.length;
70529     if (!length) {
70530       return source;
70531     }
70532     var lastIndex = length - 1;
70533     details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
70534     details = details.join(length > 2 ? ', ' : ' ');
70535     return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
70536   }
70537
70538   /** Used to compose bitmasks for function metadata. */
70539   var WRAP_BIND_FLAG$1 = 1,
70540       WRAP_BIND_KEY_FLAG = 2,
70541       WRAP_CURRY_FLAG = 8,
70542       WRAP_CURRY_RIGHT_FLAG = 16,
70543       WRAP_PARTIAL_FLAG = 32,
70544       WRAP_PARTIAL_RIGHT_FLAG = 64,
70545       WRAP_ARY_FLAG = 128,
70546       WRAP_REARG_FLAG = 256,
70547       WRAP_FLIP_FLAG = 512;
70548
70549   /** Used to associate wrap methods with their bit flags. */
70550   var wrapFlags = [
70551     ['ary', WRAP_ARY_FLAG],
70552     ['bind', WRAP_BIND_FLAG$1],
70553     ['bindKey', WRAP_BIND_KEY_FLAG],
70554     ['curry', WRAP_CURRY_FLAG],
70555     ['curryRight', WRAP_CURRY_RIGHT_FLAG],
70556     ['flip', WRAP_FLIP_FLAG],
70557     ['partial', WRAP_PARTIAL_FLAG],
70558     ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
70559     ['rearg', WRAP_REARG_FLAG]
70560   ];
70561
70562   /**
70563    * Updates wrapper `details` based on `bitmask` flags.
70564    *
70565    * @private
70566    * @returns {Array} details The details to modify.
70567    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
70568    * @returns {Array} Returns `details`.
70569    */
70570   function updateWrapDetails(details, bitmask) {
70571     arrayEach(wrapFlags, function(pair) {
70572       var value = '_.' + pair[0];
70573       if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
70574         details.push(value);
70575       }
70576     });
70577     return details.sort();
70578   }
70579
70580   /**
70581    * Sets the `toString` method of `wrapper` to mimic the source of `reference`
70582    * with wrapper details in a comment at the top of the source body.
70583    *
70584    * @private
70585    * @param {Function} wrapper The function to modify.
70586    * @param {Function} reference The reference function.
70587    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
70588    * @returns {Function} Returns `wrapper`.
70589    */
70590   function setWrapToString(wrapper, reference, bitmask) {
70591     var source = (reference + '');
70592     return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
70593   }
70594
70595   /** Used to compose bitmasks for function metadata. */
70596   var WRAP_BIND_FLAG$2 = 1,
70597       WRAP_BIND_KEY_FLAG$1 = 2,
70598       WRAP_CURRY_BOUND_FLAG = 4,
70599       WRAP_CURRY_FLAG$1 = 8,
70600       WRAP_PARTIAL_FLAG$1 = 32,
70601       WRAP_PARTIAL_RIGHT_FLAG$1 = 64;
70602
70603   /**
70604    * Creates a function that wraps `func` to continue currying.
70605    *
70606    * @private
70607    * @param {Function} func The function to wrap.
70608    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
70609    * @param {Function} wrapFunc The function to create the `func` wrapper.
70610    * @param {*} placeholder The placeholder value.
70611    * @param {*} [thisArg] The `this` binding of `func`.
70612    * @param {Array} [partials] The arguments to prepend to those provided to
70613    *  the new function.
70614    * @param {Array} [holders] The `partials` placeholder indexes.
70615    * @param {Array} [argPos] The argument positions of the new function.
70616    * @param {number} [ary] The arity cap of `func`.
70617    * @param {number} [arity] The arity of `func`.
70618    * @returns {Function} Returns the new wrapped function.
70619    */
70620   function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
70621     var isCurry = bitmask & WRAP_CURRY_FLAG$1,
70622         newHolders = isCurry ? holders : undefined,
70623         newHoldersRight = isCurry ? undefined : holders,
70624         newPartials = isCurry ? partials : undefined,
70625         newPartialsRight = isCurry ? undefined : partials;
70626
70627     bitmask |= (isCurry ? WRAP_PARTIAL_FLAG$1 : WRAP_PARTIAL_RIGHT_FLAG$1);
70628     bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG$1 : WRAP_PARTIAL_FLAG$1);
70629
70630     if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
70631       bitmask &= ~(WRAP_BIND_FLAG$2 | WRAP_BIND_KEY_FLAG$1);
70632     }
70633     var newData = [
70634       func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
70635       newHoldersRight, argPos, ary, arity
70636     ];
70637
70638     var result = wrapFunc.apply(undefined, newData);
70639     if (isLaziable(func)) {
70640       setData(result, newData);
70641     }
70642     result.placeholder = placeholder;
70643     return setWrapToString(result, func, bitmask);
70644   }
70645
70646   /**
70647    * Gets the argument placeholder value for `func`.
70648    *
70649    * @private
70650    * @param {Function} func The function to inspect.
70651    * @returns {*} Returns the placeholder value.
70652    */
70653   function getHolder(func) {
70654     var object = func;
70655     return object.placeholder;
70656   }
70657
70658   /* Built-in method references for those with the same name as other `lodash` methods. */
70659   var nativeMin$2 = Math.min;
70660
70661   /**
70662    * Reorder `array` according to the specified indexes where the element at
70663    * the first index is assigned as the first element, the element at
70664    * the second index is assigned as the second element, and so on.
70665    *
70666    * @private
70667    * @param {Array} array The array to reorder.
70668    * @param {Array} indexes The arranged array indexes.
70669    * @returns {Array} Returns `array`.
70670    */
70671   function reorder(array, indexes) {
70672     var arrLength = array.length,
70673         length = nativeMin$2(indexes.length, arrLength),
70674         oldArray = copyArray(array);
70675
70676     while (length--) {
70677       var index = indexes[length];
70678       array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
70679     }
70680     return array;
70681   }
70682
70683   /** Used as the internal argument placeholder. */
70684   var PLACEHOLDER = '__lodash_placeholder__';
70685
70686   /**
70687    * Replaces all `placeholder` elements in `array` with an internal placeholder
70688    * and returns an array of their indexes.
70689    *
70690    * @private
70691    * @param {Array} array The array to modify.
70692    * @param {*} placeholder The placeholder to replace.
70693    * @returns {Array} Returns the new array of placeholder indexes.
70694    */
70695   function replaceHolders(array, placeholder) {
70696     var index = -1,
70697         length = array.length,
70698         resIndex = 0,
70699         result = [];
70700
70701     while (++index < length) {
70702       var value = array[index];
70703       if (value === placeholder || value === PLACEHOLDER) {
70704         array[index] = PLACEHOLDER;
70705         result[resIndex++] = index;
70706       }
70707     }
70708     return result;
70709   }
70710
70711   /** Used to compose bitmasks for function metadata. */
70712   var WRAP_BIND_FLAG$3 = 1,
70713       WRAP_BIND_KEY_FLAG$2 = 2,
70714       WRAP_CURRY_FLAG$2 = 8,
70715       WRAP_CURRY_RIGHT_FLAG$1 = 16,
70716       WRAP_ARY_FLAG$1 = 128,
70717       WRAP_FLIP_FLAG$1 = 512;
70718
70719   /**
70720    * Creates a function that wraps `func` to invoke it with optional `this`
70721    * binding of `thisArg`, partial application, and currying.
70722    *
70723    * @private
70724    * @param {Function|string} func The function or method name to wrap.
70725    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
70726    * @param {*} [thisArg] The `this` binding of `func`.
70727    * @param {Array} [partials] The arguments to prepend to those provided to
70728    *  the new function.
70729    * @param {Array} [holders] The `partials` placeholder indexes.
70730    * @param {Array} [partialsRight] The arguments to append to those provided
70731    *  to the new function.
70732    * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
70733    * @param {Array} [argPos] The argument positions of the new function.
70734    * @param {number} [ary] The arity cap of `func`.
70735    * @param {number} [arity] The arity of `func`.
70736    * @returns {Function} Returns the new wrapped function.
70737    */
70738   function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
70739     var isAry = bitmask & WRAP_ARY_FLAG$1,
70740         isBind = bitmask & WRAP_BIND_FLAG$3,
70741         isBindKey = bitmask & WRAP_BIND_KEY_FLAG$2,
70742         isCurried = bitmask & (WRAP_CURRY_FLAG$2 | WRAP_CURRY_RIGHT_FLAG$1),
70743         isFlip = bitmask & WRAP_FLIP_FLAG$1,
70744         Ctor = isBindKey ? undefined : createCtor(func);
70745
70746     function wrapper() {
70747       var length = arguments.length,
70748           args = Array(length),
70749           index = length;
70750
70751       while (index--) {
70752         args[index] = arguments[index];
70753       }
70754       if (isCurried) {
70755         var placeholder = getHolder(wrapper),
70756             holdersCount = countHolders(args, placeholder);
70757       }
70758       if (partials) {
70759         args = composeArgs(args, partials, holders, isCurried);
70760       }
70761       if (partialsRight) {
70762         args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
70763       }
70764       length -= holdersCount;
70765       if (isCurried && length < arity) {
70766         var newHolders = replaceHolders(args, placeholder);
70767         return createRecurry(
70768           func, bitmask, createHybrid, wrapper.placeholder, thisArg,
70769           args, newHolders, argPos, ary, arity - length
70770         );
70771       }
70772       var thisBinding = isBind ? thisArg : this,
70773           fn = isBindKey ? thisBinding[func] : func;
70774
70775       length = args.length;
70776       if (argPos) {
70777         args = reorder(args, argPos);
70778       } else if (isFlip && length > 1) {
70779         args.reverse();
70780       }
70781       if (isAry && ary < length) {
70782         args.length = ary;
70783       }
70784       if (this && this !== root$2 && this instanceof wrapper) {
70785         fn = Ctor || createCtor(fn);
70786       }
70787       return fn.apply(thisBinding, args);
70788     }
70789     return wrapper;
70790   }
70791
70792   /**
70793    * Creates a function that wraps `func` to enable currying.
70794    *
70795    * @private
70796    * @param {Function} func The function to wrap.
70797    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
70798    * @param {number} arity The arity of `func`.
70799    * @returns {Function} Returns the new wrapped function.
70800    */
70801   function createCurry(func, bitmask, arity) {
70802     var Ctor = createCtor(func);
70803
70804     function wrapper() {
70805       var length = arguments.length,
70806           args = Array(length),
70807           index = length,
70808           placeholder = getHolder(wrapper);
70809
70810       while (index--) {
70811         args[index] = arguments[index];
70812       }
70813       var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
70814         ? []
70815         : replaceHolders(args, placeholder);
70816
70817       length -= holders.length;
70818       if (length < arity) {
70819         return createRecurry(
70820           func, bitmask, createHybrid, wrapper.placeholder, undefined,
70821           args, holders, undefined, undefined, arity - length);
70822       }
70823       var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
70824       return apply(fn, this, args);
70825     }
70826     return wrapper;
70827   }
70828
70829   /** Used to compose bitmasks for function metadata. */
70830   var WRAP_BIND_FLAG$4 = 1;
70831
70832   /**
70833    * Creates a function that wraps `func` to invoke it with the `this` binding
70834    * of `thisArg` and `partials` prepended to the arguments it receives.
70835    *
70836    * @private
70837    * @param {Function} func The function to wrap.
70838    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
70839    * @param {*} thisArg The `this` binding of `func`.
70840    * @param {Array} partials The arguments to prepend to those provided to
70841    *  the new function.
70842    * @returns {Function} Returns the new wrapped function.
70843    */
70844   function createPartial(func, bitmask, thisArg, partials) {
70845     var isBind = bitmask & WRAP_BIND_FLAG$4,
70846         Ctor = createCtor(func);
70847
70848     function wrapper() {
70849       var argsIndex = -1,
70850           argsLength = arguments.length,
70851           leftIndex = -1,
70852           leftLength = partials.length,
70853           args = Array(leftLength + argsLength),
70854           fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
70855
70856       while (++leftIndex < leftLength) {
70857         args[leftIndex] = partials[leftIndex];
70858       }
70859       while (argsLength--) {
70860         args[leftIndex++] = arguments[++argsIndex];
70861       }
70862       return apply(fn, isBind ? thisArg : this, args);
70863     }
70864     return wrapper;
70865   }
70866
70867   /** Used as the internal argument placeholder. */
70868   var PLACEHOLDER$1 = '__lodash_placeholder__';
70869
70870   /** Used to compose bitmasks for function metadata. */
70871   var WRAP_BIND_FLAG$5 = 1,
70872       WRAP_BIND_KEY_FLAG$3 = 2,
70873       WRAP_CURRY_BOUND_FLAG$1 = 4,
70874       WRAP_CURRY_FLAG$3 = 8,
70875       WRAP_ARY_FLAG$2 = 128,
70876       WRAP_REARG_FLAG$1 = 256;
70877
70878   /* Built-in method references for those with the same name as other `lodash` methods. */
70879   var nativeMin$3 = Math.min;
70880
70881   /**
70882    * Merges the function metadata of `source` into `data`.
70883    *
70884    * Merging metadata reduces the number of wrappers used to invoke a function.
70885    * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
70886    * may be applied regardless of execution order. Methods like `_.ary` and
70887    * `_.rearg` modify function arguments, making the order in which they are
70888    * executed important, preventing the merging of metadata. However, we make
70889    * an exception for a safe combined case where curried functions have `_.ary`
70890    * and or `_.rearg` applied.
70891    *
70892    * @private
70893    * @param {Array} data The destination metadata.
70894    * @param {Array} source The source metadata.
70895    * @returns {Array} Returns `data`.
70896    */
70897   function mergeData(data, source) {
70898     var bitmask = data[1],
70899         srcBitmask = source[1],
70900         newBitmask = bitmask | srcBitmask,
70901         isCommon = newBitmask < (WRAP_BIND_FLAG$5 | WRAP_BIND_KEY_FLAG$3 | WRAP_ARY_FLAG$2);
70902
70903     var isCombo =
70904       ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_CURRY_FLAG$3)) ||
70905       ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_REARG_FLAG$1) && (data[7].length <= source[8])) ||
70906       ((srcBitmask == (WRAP_ARY_FLAG$2 | WRAP_REARG_FLAG$1)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG$3));
70907
70908     // Exit early if metadata can't be merged.
70909     if (!(isCommon || isCombo)) {
70910       return data;
70911     }
70912     // Use source `thisArg` if available.
70913     if (srcBitmask & WRAP_BIND_FLAG$5) {
70914       data[2] = source[2];
70915       // Set when currying a bound function.
70916       newBitmask |= bitmask & WRAP_BIND_FLAG$5 ? 0 : WRAP_CURRY_BOUND_FLAG$1;
70917     }
70918     // Compose partial arguments.
70919     var value = source[3];
70920     if (value) {
70921       var partials = data[3];
70922       data[3] = partials ? composeArgs(partials, value, source[4]) : value;
70923       data[4] = partials ? replaceHolders(data[3], PLACEHOLDER$1) : source[4];
70924     }
70925     // Compose partial right arguments.
70926     value = source[5];
70927     if (value) {
70928       partials = data[5];
70929       data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
70930       data[6] = partials ? replaceHolders(data[5], PLACEHOLDER$1) : source[6];
70931     }
70932     // Use source `argPos` if available.
70933     value = source[7];
70934     if (value) {
70935       data[7] = value;
70936     }
70937     // Use source `ary` if it's smaller.
70938     if (srcBitmask & WRAP_ARY_FLAG$2) {
70939       data[8] = data[8] == null ? source[8] : nativeMin$3(data[8], source[8]);
70940     }
70941     // Use source `arity` if one is not provided.
70942     if (data[9] == null) {
70943       data[9] = source[9];
70944     }
70945     // Use source `func` and merge bitmasks.
70946     data[0] = source[0];
70947     data[1] = newBitmask;
70948
70949     return data;
70950   }
70951
70952   /** Error message constants. */
70953   var FUNC_ERROR_TEXT$4 = 'Expected a function';
70954
70955   /** Used to compose bitmasks for function metadata. */
70956   var WRAP_BIND_FLAG$6 = 1,
70957       WRAP_BIND_KEY_FLAG$4 = 2,
70958       WRAP_CURRY_FLAG$4 = 8,
70959       WRAP_CURRY_RIGHT_FLAG$2 = 16,
70960       WRAP_PARTIAL_FLAG$2 = 32,
70961       WRAP_PARTIAL_RIGHT_FLAG$2 = 64;
70962
70963   /* Built-in method references for those with the same name as other `lodash` methods. */
70964   var nativeMax$7 = Math.max;
70965
70966   /**
70967    * Creates a function that either curries or invokes `func` with optional
70968    * `this` binding and partially applied arguments.
70969    *
70970    * @private
70971    * @param {Function|string} func The function or method name to wrap.
70972    * @param {number} bitmask The bitmask flags.
70973    *    1 - `_.bind`
70974    *    2 - `_.bindKey`
70975    *    4 - `_.curry` or `_.curryRight` of a bound function
70976    *    8 - `_.curry`
70977    *   16 - `_.curryRight`
70978    *   32 - `_.partial`
70979    *   64 - `_.partialRight`
70980    *  128 - `_.rearg`
70981    *  256 - `_.ary`
70982    *  512 - `_.flip`
70983    * @param {*} [thisArg] The `this` binding of `func`.
70984    * @param {Array} [partials] The arguments to be partially applied.
70985    * @param {Array} [holders] The `partials` placeholder indexes.
70986    * @param {Array} [argPos] The argument positions of the new function.
70987    * @param {number} [ary] The arity cap of `func`.
70988    * @param {number} [arity] The arity of `func`.
70989    * @returns {Function} Returns the new wrapped function.
70990    */
70991   function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
70992     var isBindKey = bitmask & WRAP_BIND_KEY_FLAG$4;
70993     if (!isBindKey && typeof func != 'function') {
70994       throw new TypeError(FUNC_ERROR_TEXT$4);
70995     }
70996     var length = partials ? partials.length : 0;
70997     if (!length) {
70998       bitmask &= ~(WRAP_PARTIAL_FLAG$2 | WRAP_PARTIAL_RIGHT_FLAG$2);
70999       partials = holders = undefined;
71000     }
71001     ary = ary === undefined ? ary : nativeMax$7(toInteger(ary), 0);
71002     arity = arity === undefined ? arity : toInteger(arity);
71003     length -= holders ? holders.length : 0;
71004
71005     if (bitmask & WRAP_PARTIAL_RIGHT_FLAG$2) {
71006       var partialsRight = partials,
71007           holdersRight = holders;
71008
71009       partials = holders = undefined;
71010     }
71011     var data = isBindKey ? undefined : getData(func);
71012
71013     var newData = [
71014       func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
71015       argPos, ary, arity
71016     ];
71017
71018     if (data) {
71019       mergeData(newData, data);
71020     }
71021     func = newData[0];
71022     bitmask = newData[1];
71023     thisArg = newData[2];
71024     partials = newData[3];
71025     holders = newData[4];
71026     arity = newData[9] = newData[9] === undefined
71027       ? (isBindKey ? 0 : func.length)
71028       : nativeMax$7(newData[9] - length, 0);
71029
71030     if (!arity && bitmask & (WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2)) {
71031       bitmask &= ~(WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2);
71032     }
71033     if (!bitmask || bitmask == WRAP_BIND_FLAG$6) {
71034       var result = createBind(func, bitmask, thisArg);
71035     } else if (bitmask == WRAP_CURRY_FLAG$4 || bitmask == WRAP_CURRY_RIGHT_FLAG$2) {
71036       result = createCurry(func, bitmask, arity);
71037     } else if ((bitmask == WRAP_PARTIAL_FLAG$2 || bitmask == (WRAP_BIND_FLAG$6 | WRAP_PARTIAL_FLAG$2)) && !holders.length) {
71038       result = createPartial(func, bitmask, thisArg, partials);
71039     } else {
71040       result = createHybrid.apply(undefined, newData);
71041     }
71042     var setter = data ? baseSetData : setData;
71043     return setWrapToString(setter(result, newData), func, bitmask);
71044   }
71045
71046   /** Used to compose bitmasks for function metadata. */
71047   var WRAP_BIND_FLAG$7 = 1,
71048       WRAP_PARTIAL_FLAG$3 = 32;
71049
71050   /**
71051    * Creates a function that invokes `func` with the `this` binding of `thisArg`
71052    * and `partials` prepended to the arguments it receives.
71053    *
71054    * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
71055    * may be used as a placeholder for partially applied arguments.
71056    *
71057    * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
71058    * property of bound functions.
71059    *
71060    * @static
71061    * @memberOf _
71062    * @since 0.1.0
71063    * @category Function
71064    * @param {Function} func The function to bind.
71065    * @param {*} thisArg The `this` binding of `func`.
71066    * @param {...*} [partials] The arguments to be partially applied.
71067    * @returns {Function} Returns the new bound function.
71068    * @example
71069    *
71070    * function greet(greeting, punctuation) {
71071    *   return greeting + ' ' + this.user + punctuation;
71072    * }
71073    *
71074    * var object = { 'user': 'fred' };
71075    *
71076    * var bound = _.bind(greet, object, 'hi');
71077    * bound('!');
71078    * // => 'hi fred!'
71079    *
71080    * // Bound with placeholders.
71081    * var bound = _.bind(greet, object, _, '!');
71082    * bound('hi');
71083    * // => 'hi fred!'
71084    */
71085   var bind$2 = baseRest(function(func, thisArg, partials) {
71086     var bitmask = WRAP_BIND_FLAG$7;
71087     if (partials.length) {
71088       var holders = replaceHolders(partials, getHolder(bind$2));
71089       bitmask |= WRAP_PARTIAL_FLAG$3;
71090     }
71091     return createWrap(func, bitmask, thisArg, partials, holders);
71092   });
71093
71094   // Assign default placeholders.
71095   bind$2.placeholder = {};
71096
71097   function presetCollection(collection) {
71098       var maxSearchResults = 50,
71099           maxSuggestionResults = 10;
71100
71101       var presets = {
71102
71103           collection: collection,
71104
71105
71106           item: function(id) {
71107               return find$1(this.collection, function(d) {
71108                   return d.id === id;
71109               });
71110           },
71111
71112
71113           matchGeometry: function(geometry) {
71114               return presetCollection(this.collection.filter(function(d) {
71115                   return d.matchGeometry(geometry);
71116               }));
71117           },
71118
71119
71120           search: function(value, geometry) {
71121               if (!value) return this;
71122
71123               function leading(a) {
71124                   var index = a.indexOf(value);
71125                   return index === 0 || a[index - 1] === ' ';
71126               }
71127
71128               function suggestionName(name) {
71129                   var nameArray = name.split(' - ');
71130                   if (nameArray.length > 1) {
71131                       name = nameArray.slice(0, nameArray.length - 1).join(' - ');
71132                   }
71133                   return name.toLowerCase();
71134               }
71135
71136
71137               value = value.toLowerCase();
71138
71139               var searchable = filter(this.collection, function(a) {
71140                       return a.searchable !== false && a.suggestion !== true;
71141                   }),
71142                   suggestions = filter(this.collection, function(a) {
71143                       return a.suggestion === true;
71144                   });
71145
71146
71147               // matches value to preset.name
71148               var leading_name = filter(searchable, function(a) {
71149                       return leading(a.name().toLowerCase());
71150                   }).sort(function(a, b) {
71151                       var aCompare = a.name().toLowerCase(),
71152                           bCompare = b.name().toLowerCase(),
71153                           i;
71154
71155                       // priority if search string matches preset name exactly - #4325
71156                       if (value === aCompare) return -1;
71157                       if (value === bCompare) return 1;
71158
71159                       // priority for higher matchScore
71160                       i = b.originalScore - a.originalScore;
71161                       if (i !== 0) return i;
71162
71163                       // priority if search string appears earlier in preset name
71164                       i = aCompare.indexOf(value) - bCompare.indexOf(value);
71165                       if (i !== 0) return i;
71166
71167                       // priority for shorter preset names
71168                       return a.name().length - b.name().length;
71169                   });
71170
71171               // matches value to preset.terms values
71172               var leading_terms = filter(searchable, function(a) {
71173                       return some(a.terms() || [], leading);
71174                   });
71175
71176               // matches value to preset.tags values
71177               var leading_tag_values = filter(searchable, function(a) {
71178                       return some(without(values$1(a.tags || {}), '*'), leading);
71179                   });
71180
71181
71182               // finds close matches to value in preset.name
71183               var similar_name = searchable.map(function(a) {
71184                       return {
71185                           preset: a,
71186                           dist: utilEditDistance(value, a.name())
71187                       };
71188                   }).filter(function(a) {
71189                       return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
71190                   }).sort(function(a, b) {
71191                       return a.dist - b.dist;
71192                   }).map(function(a) {
71193                       return a.preset;
71194                   });
71195
71196               // finds close matches to value in preset.terms
71197               var similar_terms = filter(searchable, function(a) {
71198                       return some(a.terms() || [], function(b) {
71199                           return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
71200                       });
71201                   });
71202
71203               var leading_suggestions = filter(suggestions, function(a) {
71204                       return leading(suggestionName(a.name()));
71205                   }).sort(function(a, b) {
71206                       a = suggestionName(a.name());
71207                       b = suggestionName(b.name());
71208                       var i = a.indexOf(value) - b.indexOf(value);
71209                       if (i === 0) return a.length - b.length;
71210                       else return i;
71211                   });
71212
71213               var similar_suggestions = suggestions.map(function(a) {
71214                       return {
71215                           preset: a,
71216                           dist: utilEditDistance(value, suggestionName(a.name()))
71217                       };
71218                   }).filter(function(a) {
71219                       return a.dist + Math.min(value.length - suggestionName(a.preset.name()).length, 0) < 1;
71220                   }).sort(function(a, b) {
71221                       return a.dist - b.dist;
71222                   }).map(function(a) {
71223                       return a.preset;
71224                   });
71225
71226               var other = presets.item(geometry);
71227
71228               var results = leading_name.concat(
71229                       leading_terms,
71230                       leading_tag_values,
71231                       leading_suggestions.slice(0, maxSuggestionResults + 5),
71232                       similar_name,
71233                       similar_terms,
71234                       similar_suggestions.slice(0, maxSuggestionResults)
71235                   ).slice(0, maxSearchResults - 1);
71236
71237               return presetCollection(uniq(results.concat(other)));
71238           }
71239       };
71240
71241
71242       return presets;
71243   }
71244
71245   function presetCategory(id, category, all) {
71246       category = clone(category);
71247
71248       category.id = id;
71249
71250
71251       category.members = presetCollection(category.members.map(function(id) {
71252           return all.item(id);
71253       }));
71254
71255
71256       category.matchGeometry = function(geometry) {
71257           return category.geometry.indexOf(geometry) >= 0;
71258       };
71259
71260
71261       category.matchScore = function() {
71262           return -1;
71263       };
71264
71265
71266       category.name = function() {
71267           return t('presets.categories.' + id + '.name', {'default': id});
71268       };
71269
71270
71271       category.terms = function() {
71272           return [];
71273       };
71274
71275
71276       return category;
71277   }
71278
71279   function presetField(id, field) {
71280       field = clone(field);
71281
71282       field.id = id;
71283
71284       // for use in classes, element ids, css selectors
71285       field.safeid = id.replace(/[^_a-zA-Z0-9\-]/g, '_');
71286
71287       field.matchGeometry = function(geometry) {
71288           return !field.geometry || field.geometry === geometry;
71289       };
71290
71291
71292       field.t = function(scope, options) {
71293           return t('presets.fields.' + id + '.' + scope, options);
71294       };
71295
71296
71297       field.label = function() {
71298           return field.t('label', {'default': id});
71299       };
71300
71301
71302       var placeholder = field.placeholder;
71303       field.placeholder = function() {
71304           return field.t('placeholder', {'default': placeholder});
71305       };
71306
71307
71308       return field;
71309   }
71310
71311   function presetPreset(id, preset, fields) {
71312       preset = clone(preset);
71313
71314       preset.id = id;
71315       preset.fields = (preset.fields || []).map(getFields);
71316       preset.geometry = (preset.geometry || []);
71317
71318
71319       function getFields(f) {
71320           return fields[f];
71321       }
71322
71323
71324       preset.matchGeometry = function(geometry) {
71325           return preset.geometry.indexOf(geometry) >= 0;
71326       };
71327
71328
71329       preset.originalScore = preset.matchScore || 1;
71330
71331
71332       preset.matchScore = function(entity) {
71333           var tags = preset.tags,
71334               score = 0;
71335
71336           for (var t$$1 in tags) {
71337               if (entity.tags[t$$1] === tags[t$$1]) {
71338                   score += preset.originalScore;
71339               } else if (tags[t$$1] === '*' && t$$1 in entity.tags) {
71340                   score += preset.originalScore / 2;
71341               } else {
71342                   return -1;
71343               }
71344           }
71345
71346           return score;
71347       };
71348
71349
71350       preset.t = function(scope, options) {
71351           return t('presets.presets.' + id + '.' + scope, options);
71352       };
71353
71354
71355       var origName = preset.name || '';
71356       preset.name = function() {
71357           if (preset.suggestion) {
71358               id = id.split('/');
71359               id = id[0] + '/' + id[1];
71360               return origName + ' - ' + t('presets.presets.' + id + '.name');
71361           }
71362           return preset.t('name', { 'default': origName });
71363       };
71364
71365       var origTerms = (preset.terms || []).join();
71366       preset.terms = function() {
71367           return preset.t('terms', { 'default': origTerms }).toLowerCase().trim().split(/\s*,+\s*/);
71368       };
71369
71370
71371       preset.isFallback = function() {
71372           var tagCount = Object.keys(preset.tags).length;
71373           return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
71374       };
71375
71376
71377       var reference = preset.reference || {};
71378       preset.reference = function(geometry) {
71379           var key = reference.key || Object.keys(omit(preset.tags, 'name'))[0],
71380               value = reference.value || preset.tags[key];
71381
71382           if (geometry === 'relation' && key === 'type') {
71383               if (value in preset.tags) {
71384                   key = value;
71385                   value = preset.tags[key];
71386               } else {
71387                   return { rtype: value };
71388               }
71389           }
71390
71391           if (value === '*') {
71392               return { key: key };
71393           } else {
71394               return { key: key, value: value };
71395           }
71396       };
71397
71398
71399       var removeTags = preset.removeTags || preset.tags || {};
71400       preset.removeTags = function(tags, geometry) {
71401           tags = omit(tags, keys$1(removeTags));
71402
71403           for (var f in preset.fields) {
71404               var field = preset.fields[f];
71405               if (field.matchGeometry(geometry) && field.default === tags[field.key]) {
71406                   delete tags[field.key];
71407               }
71408           }
71409
71410           delete tags.area;
71411           return tags;
71412       };
71413
71414
71415       var applyTags = preset.addTags || preset.tags || {};
71416       preset.applyTags = function(tags, geometry) {
71417           var k;
71418
71419           tags = clone(tags);
71420
71421           for (k in applyTags) {
71422               if (applyTags[k] === '*') {
71423                   tags[k] = 'yes';
71424               } else {
71425                   tags[k] = applyTags[k];
71426               }
71427           }
71428
71429           // Add area=yes if necessary.
71430           // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
71431           // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
71432           // 2. chosen preset doesn't have a key in areaKeys (`railway=station`)
71433           if (!applyTags.hasOwnProperty('area')) {
71434               delete tags.area;
71435               if (geometry === 'area') {
71436                   var needsAreaTag = true;
71437                   if (preset.geometry.indexOf('line') === -1) {
71438                       for (k in applyTags) {
71439                           if (k in areaKeys) {
71440                               needsAreaTag = false;
71441                               break;
71442                           }
71443                       }
71444                   }
71445                   if (needsAreaTag) {
71446                       tags.area = 'yes';
71447                   }
71448               }
71449           }
71450
71451           for (var f in preset.fields) {
71452               var field = preset.fields[f];
71453               if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
71454                   tags[field.key] = field.default;
71455               }
71456           }
71457
71458           return tags;
71459       };
71460
71461
71462       return preset;
71463   }
71464
71465   function presetIndex() {
71466       // a presetCollection with methods for
71467       // loading new data and returning defaults
71468
71469       var all = presetCollection([]);
71470       var _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
71471       var _fields = {};
71472       var _universal = [];
71473       var _recent = presetCollection([]);
71474
71475       // Index of presets by (geometry, tag key).
71476       var _index = {
71477           point: {},
71478           vertex: {},
71479           line: {},
71480           area: {},
71481           relation: {}
71482       };
71483
71484       all.match = function(entity, resolver) {
71485           var geometry = entity.geometry(resolver);
71486           var address;
71487
71488           // Treat entities on addr:interpolation lines as points, not vertices - #3241
71489           if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
71490               geometry = 'point';
71491           }
71492
71493           var geometryMatches = _index[geometry];
71494           var best = -1;
71495           var match;
71496
71497           for (var k in entity.tags) {
71498               // If any part of an address is present,
71499               // allow fallback to "Address" preset - #4353
71500               if (k.match(/^addr:/) !== null && geometryMatches['addr:*']) {
71501                   address = geometryMatches['addr:*'][0];
71502               }
71503
71504               var keyMatches = geometryMatches[k];
71505               if (!keyMatches) continue;
71506
71507               for (var i = 0; i < keyMatches.length; i++) {
71508                   var score = keyMatches[i].matchScore(entity);
71509                   if (score > best) {
71510                       best = score;
71511                       match = keyMatches[i];
71512                   }
71513               }
71514           }
71515
71516           if (address && (!match || match.isFallback())) {
71517               match = address;
71518           }
71519
71520           return match || all.item(geometry);
71521       };
71522
71523
71524       // Because of the open nature of tagging, iD will never have a complete
71525       // list of tags used in OSM, so we want it to have logic like "assume
71526       // that a closed way with an amenity tag is an area, unless the amenity
71527       // is one of these specific types". This function computes a structure
71528       // that allows testing of such conditions, based on the presets designated
71529       // as as supporting (or not supporting) the area geometry.
71530       //
71531       // The returned object L is a whitelist/blacklist of tags. A closed way
71532       // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
71533       // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
71534       // and the subkeys form the blacklist.
71535       all.areaKeys = function() {
71536           var areaKeys = {};
71537           var ignore = ['barrier', 'highway', 'footway', 'railway', 'type'];  // probably a line..
71538           var presets = reject(all.collection, 'suggestion');
71539
71540           // whitelist
71541           presets.forEach(function(d) {
71542               for (var key in d.tags) break;
71543               if (!key) return;
71544               if (ignore.indexOf(key) !== -1) return;
71545
71546               if (d.geometry.indexOf('area') !== -1) {    // probably an area..
71547                   areaKeys[key] = areaKeys[key] || {};
71548               }
71549           });
71550
71551           // blacklist
71552           presets.forEach(function(d) {
71553               for (var key in d.tags) break;
71554               if (!key) return;
71555               if (ignore.indexOf(key) !== -1) return;
71556
71557               var value = d.tags[key];
71558               if (key in areaKeys &&                      // probably an area...
71559                   d.geometry.indexOf('line') !== -1 &&    // but sometimes a line
71560                   value !== '*') {
71561                   areaKeys[key][value] = true;
71562               }
71563           });
71564
71565           return areaKeys;
71566       };
71567
71568
71569       all.init = function() {
71570           var d = data.presets;
71571
71572           all.collection = [];
71573           _recent.collection = [];
71574           _fields = {};
71575           _universal = [];
71576           _index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
71577
71578           if (d.fields) {
71579               forEach(d.fields, function(d, id) {
71580                   _fields[id] = presetField(id, d);
71581                   if (d.universal) {
71582                       _universal.push(_fields[id]);
71583                   }
71584               });
71585           }
71586
71587           if (d.presets) {
71588               forEach(d.presets, function(d, id) {
71589                   all.collection.push(presetPreset(id, d, _fields));
71590               });
71591           }
71592
71593           if (d.categories) {
71594               forEach(d.categories, function(d, id) {
71595                   all.collection.push(presetCategory(id, d, all));
71596               });
71597           }
71598
71599           if (d.defaults) {
71600               var getItem = bind$2(all.item, all);
71601               _defaults = {
71602                   area: presetCollection(d.defaults.area.map(getItem)),
71603                   line: presetCollection(d.defaults.line.map(getItem)),
71604                   point: presetCollection(d.defaults.point.map(getItem)),
71605                   vertex: presetCollection(d.defaults.vertex.map(getItem)),
71606                   relation: presetCollection(d.defaults.relation.map(getItem))
71607               };
71608           }
71609
71610           for (var i = 0; i < all.collection.length; i++) {
71611               var preset = all.collection[i];
71612               var geometry = preset.geometry;
71613
71614               for (var j = 0; j < geometry.length; j++) {
71615                   var g = _index[geometry[j]];
71616                   for (var k in preset.tags) {
71617                       (g[k] = g[k] || []).push(preset);
71618                   }
71619               }
71620           }
71621
71622           return all;
71623       };
71624
71625       all.field = function(id) {
71626           return _fields[id];
71627       };
71628
71629       all.universal = function() {
71630           return _universal;
71631       };
71632
71633       all.defaults = function(geometry, n) {
71634           var rec = _recent.matchGeometry(geometry).collection.slice(0, 4);
71635           var def = uniq(rec.concat(_defaults[geometry].collection)).slice(0, n - 1);
71636           return presetCollection(uniq(rec.concat(def).concat(all.item(geometry))));
71637       };
71638
71639       all.choose = function(preset) {
71640           _recent = presetCollection(uniq([preset].concat(_recent.collection)));
71641           return all;
71642       };
71643
71644       return all;
71645   }
71646
71647   var areaKeys = {};
71648
71649   function setAreaKeys(value) {
71650       areaKeys = value;
71651   }
71652
71653
71654   function coreContext() {
71655       var context = {};
71656       context.version = '2.8.0';
71657
71658       // create a special translation that contains the keys in place of the strings
71659       var tkeys = cloneDeep(en);
71660       var parents = [];
71661
71662       function traverser(v, k, obj) {
71663           parents.push(k);
71664           if (isObject(v)) {
71665               forOwn(v, traverser);
71666           } else if (isString(v)) {
71667               obj[k] = parents.join('.');
71668           }
71669           parents.pop();
71670       }
71671
71672       forOwn(tkeys, traverser);
71673       addTranslation('_tkeys_', tkeys);
71674
71675       addTranslation('en', en);
71676       setLocale('en');
71677
71678       var dispatch$$1 = dispatch('enter', 'exit', 'change');
71679
71680       // https://github.com/openstreetmap/iD/issues/772
71681       // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
71682       var storage;
71683       try { storage = localStorage; } catch (e) {}  // eslint-disable-line no-empty
71684       storage = storage || (function() {
71685           var s = {};
71686           return {
71687               getItem: function(k) { return s[k]; },
71688               setItem: function(k, v) { s[k] = v; },
71689               removeItem: function(k) { delete s[k]; }
71690           };
71691       })();
71692
71693       context.storage = function(k, v) {
71694           try {
71695               if (arguments.length === 1) return storage.getItem(k);
71696               else if (v === null) storage.removeItem(k);
71697               else storage.setItem(k, v);
71698           } catch (e) {
71699               // localstorage quota exceeded
71700               /* eslint-disable no-console */
71701               if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
71702               /* eslint-enable no-console */
71703           }
71704       };
71705
71706
71707       /* Straight accessors. Avoid using these if you can. */
71708       var ui, connection, history;
71709       context.ui = function() { return ui; };
71710       context.connection = function() { return connection; };
71711       context.history = function() { return history; };
71712
71713
71714       /* Connection */
71715       context.preauth = function(options) {
71716           if (connection) {
71717               connection.switch(options);
71718           }
71719           return context;
71720       };
71721
71722       context.loadTiles = utilCallWhenIdle(function(projection, dimensions, callback) {
71723           var cid;
71724           function done(err, result) {
71725               if (connection.getConnectionId() !== cid) {
71726                   if (callback) callback({ message: 'Connection Switched', status: -1 });
71727                   return;
71728               }
71729               if (!err) history.merge(result.data, result.extent);
71730               if (callback) callback(err, result);
71731           }
71732           if (connection && context.editable()) {
71733               cid = connection.getConnectionId();
71734               connection.loadTiles(projection, dimensions, done);
71735           }
71736       });
71737
71738       context.loadEntity = function(entityId, callback) {
71739           var cid;
71740           function done(err, result) {
71741               if (connection.getConnectionId() !== cid) {
71742                   if (callback) callback({ message: 'Connection Switched', status: -1 });
71743                   return;
71744               }
71745               if (!err) history.merge(result.data, result.extent);
71746               if (callback) callback(err, result);
71747           }
71748           if (connection) {
71749               cid = connection.getConnectionId();
71750               connection.loadEntity(entityId, done);
71751           }
71752       };
71753
71754       context.zoomToEntity = function(entityId, zoomTo) {
71755           if (zoomTo !== false) {
71756               this.loadEntity(entityId, function(err, result) {
71757                   if (err) return;
71758                   var entity = find$1(result.data, function(e) { return e.id === entityId; });
71759                   if (entity) { map.zoomTo(entity); }
71760               });
71761           }
71762
71763           map.on('drawn.zoomToEntity', function() {
71764               if (!context.hasEntity(entityId)) return;
71765               map.on('drawn.zoomToEntity', null);
71766               context.on('enter.zoomToEntity', null);
71767               context.enter(modeSelect(context, [entityId]));
71768           });
71769
71770           context.on('enter.zoomToEntity', function() {
71771               if (mode.id !== 'browse') {
71772                   map.on('drawn.zoomToEntity', null);
71773                   context.on('enter.zoomToEntity', null);
71774               }
71775           });
71776       };
71777
71778       var minEditableZoom = 16;
71779       context.minEditableZoom = function(_) {
71780           if (!arguments.length) return minEditableZoom;
71781           minEditableZoom = _;
71782           if (connection) {
71783               connection.tileZoom(_);
71784           }
71785           return context;
71786       };
71787
71788
71789       /* History */
71790       var inIntro = false;
71791       context.inIntro = function(_) {
71792           if (!arguments.length) return inIntro;
71793           inIntro = _;
71794           return context;
71795       };
71796
71797       context.save = function() {
71798           // no history save, no message onbeforeunload
71799           if (inIntro || d3_select('.modal').size()) return;
71800
71801           var canSave;
71802           if (mode && mode.id === 'save') {
71803               canSave = false;
71804           } else {
71805               canSave = context.selectedIDs().every(function(id) {
71806                   var entity = context.hasEntity(id);
71807                   return entity && !entity.isDegenerate();
71808               });
71809           }
71810
71811           if (canSave) {
71812               history.save();
71813           }
71814           if (history.hasChanges()) {
71815               return t('save.unsaved_changes');
71816           }
71817       };
71818
71819
71820       /* Graph */
71821       context.hasEntity = function(id) {
71822           return history.graph().hasEntity(id);
71823       };
71824       context.entity = function(id) {
71825           return history.graph().entity(id);
71826       };
71827       context.childNodes = function(way) {
71828           return history.graph().childNodes(way);
71829       };
71830       context.geometry = function(id) {
71831           return context.entity(id).geometry(history.graph());
71832       };
71833
71834
71835       /* Modes */
71836       var mode;
71837       context.mode = function() {
71838           return mode;
71839       };
71840       context.enter = function(newMode) {
71841           if (mode) {
71842               mode.exit();
71843               dispatch$$1.call('exit', this, mode);
71844           }
71845
71846           mode = newMode;
71847           mode.enter();
71848           dispatch$$1.call('enter', this, mode);
71849       };
71850
71851       context.selectedIDs = function() {
71852           if (mode && mode.selectedIDs) {
71853               return mode.selectedIDs();
71854           } else {
71855               return [];
71856           }
71857       };
71858       context.activeID = function() {
71859           return mode && mode.activeID && mode.activeID();
71860       };
71861
71862
71863       /* Behaviors */
71864       context.install = function(behavior) {
71865           context.surface().call(behavior);
71866       };
71867       context.uninstall = function(behavior) {
71868           context.surface().call(behavior.off);
71869       };
71870
71871
71872       /* Copy/Paste */
71873       var copyIDs = [], copyGraph;
71874       context.copyGraph = function() { return copyGraph; };
71875       context.copyIDs = function(_) {
71876           if (!arguments.length) return copyIDs;
71877           copyIDs = _;
71878           copyGraph = history.graph();
71879           return context;
71880       };
71881
71882
71883       /* Background */
71884       var background;
71885       context.background = function() { return background; };
71886
71887
71888       /* Features */
71889       var features;
71890       context.features = function() { return features; };
71891       context.hasHiddenConnections = function(id) {
71892           var graph = history.graph(),
71893               entity = graph.entity(id);
71894           return features.hasHiddenConnections(entity, graph);
71895       };
71896
71897
71898       /* Presets */
71899       var presets;
71900       context.presets = function() { return presets; };
71901
71902
71903       /* Map */
71904       var map;
71905       context.map = function() { return map; };
71906       context.layers = function() { return map.layers; };
71907       context.surface = function() { return map.surface; };
71908       context.editable = function() { return map.editable(); };
71909       context.surfaceRect = function() {
71910           return map.surface.node().getBoundingClientRect();
71911       };
71912
71913
71914       /* Debug */
71915       var debugFlags = {
71916           tile: false,        // tile boundaries
71917           collision: false,   // label collision bounding boxes
71918           imagery: false,     // imagery bounding polygons
71919           community: false,   // community bounding polygons
71920           imperial: false,    // imperial (not metric) bounding polygons
71921           driveLeft: false,   // driveLeft bounding polygons
71922           target: false       // touch targets
71923       };
71924       context.debugFlags = function() {
71925           return debugFlags;
71926       };
71927       context.setDebug = function(flag, val) {
71928           if (arguments.length === 1) val = true;
71929           debugFlags[flag] = val;
71930           dispatch$$1.call('change');
71931           return context;
71932       };
71933       context.getDebug = function(flag) {
71934           return flag && debugFlags[flag];
71935       };
71936
71937
71938       /* Container */
71939       var container = d3_select(document.body);
71940       context.container = function(_) {
71941           if (!arguments.length) return container;
71942           container = _;
71943           container.classed('id-container', true);
71944           return context;
71945       };
71946       var embed;
71947       context.embed = function(_) {
71948           if (!arguments.length) return embed;
71949           embed = _;
71950           return context;
71951       };
71952
71953
71954       /* Assets */
71955       var assetPath = '';
71956       context.assetPath = function(_) {
71957           if (!arguments.length) return assetPath;
71958           assetPath = _;
71959           return context;
71960       };
71961
71962       var assetMap = {};
71963       context.assetMap = function(_) {
71964           if (!arguments.length) return assetMap;
71965           assetMap = _;
71966           return context;
71967       };
71968
71969       context.asset = function(_) {
71970           var filename = assetPath + _;
71971           return assetMap[filename] || filename;
71972       };
71973
71974       context.imagePath = function(_) {
71975           return context.asset('img/' + _);
71976       };
71977
71978
71979       /* locales */
71980       // `locale` variable contains a "requested locale".
71981       // It won't become the `currentLocale` until after loadLocale() is called.
71982       var locale, localePath;
71983
71984       context.locale = function(loc, path) {
71985           if (!arguments.length) return currentLocale;
71986           locale = loc;
71987           localePath = path;
71988           return context;
71989       };
71990
71991       context.loadLocale = function(callback) {
71992           if (locale && locale !== 'en' && dataLocales.hasOwnProperty(locale)) {
71993               localePath = localePath || context.asset('locales/' + locale + '.json');
71994               d3_json(localePath, function(err, result) {
71995                   if (!err) {
71996                       addTranslation(locale, result[locale]);
71997                       setLocale(locale);
71998                       utilDetect(true);
71999                   }
72000                   if (callback) {
72001                       callback(err);
72002                   }
72003               });
72004           } else {
72005               if (locale) {
72006                   setLocale(locale);
72007                   utilDetect(true);
72008               }
72009               if (callback) {
72010                   callback();
72011               }
72012           }
72013       };
72014
72015
72016       /* reset (aka flush) */
72017       context.reset = context.flush = function() {
72018           context.debouncedSave.cancel();
72019           forEach(services, function(service) {
72020               if (service && typeof service.reset === 'function') {
72021                   service.reset(context);
72022               }
72023           });
72024           features.reset();
72025           history.reset();
72026           return context;
72027       };
72028
72029
72030       /* Init */
72031
72032       context.projection = geoRawMercator();
72033       context.curtainProjection = geoRawMercator();
72034
72035       locale = utilDetect().locale;
72036       if (locale && !dataLocales.hasOwnProperty(locale)) {
72037           locale = locale.split('-')[0];
72038       }
72039
72040       history = coreHistory(context);
72041       context.graph = history.graph;
72042       context.changes = history.changes;
72043       context.intersects = history.intersects;
72044
72045       // Debounce save, since it's a synchronous localStorage write,
72046       // and history changes can happen frequently (e.g. when dragging).
72047       context.debouncedSave = debounce(context.save, 350);
72048       function withDebouncedSave(fn) {
72049           return function() {
72050               var result = fn.apply(history, arguments);
72051               context.debouncedSave();
72052               return result;
72053           };
72054       }
72055
72056       context.perform = withDebouncedSave(history.perform);
72057       context.replace = withDebouncedSave(history.replace);
72058       context.pop = withDebouncedSave(history.pop);
72059       context.overwrite = withDebouncedSave(history.overwrite);
72060       context.undo = withDebouncedSave(history.undo);
72061       context.redo = withDebouncedSave(history.redo);
72062
72063       ui = uiInit(context);
72064
72065       connection = services.osm;
72066       background = rendererBackground(context);
72067       features = rendererFeatures(context);
72068       presets = presetIndex();
72069
72070       map = rendererMap(context);
72071       context.mouse = map.mouse;
72072       context.extent = map.extent;
72073       context.pan = map.pan;
72074       context.zoomIn = map.zoomIn;
72075       context.zoomOut = map.zoomOut;
72076       context.zoomInFurther = map.zoomInFurther;
72077       context.zoomOutFurther = map.zoomOutFurther;
72078       context.redrawEnable = map.redrawEnable;
72079
72080       forEach(services, function(service) {
72081           if (service && typeof service.init === 'function') {
72082               service.init(context);
72083           }
72084       });
72085
72086       background.init();
72087       features.init();
72088       presets.init();
72089       areaKeys = presets.areaKeys();
72090
72091
72092       return utilRebind(context, dispatch$$1, 'on');
72093   }
72094
72095   function osmWay() {
72096       if (!(this instanceof osmWay)) {
72097           return (new osmWay()).initialize(arguments);
72098       } else if (arguments.length) {
72099           this.initialize(arguments);
72100       }
72101   }
72102
72103
72104   osmEntity$$1.way = osmWay;
72105
72106   osmWay.prototype = Object.create(osmEntity$$1.prototype);
72107
72108
72109   assignIn(osmWay.prototype, {
72110       type: 'way',
72111       nodes: [],
72112
72113
72114       copy: function(resolver, copies) {
72115           if (copies[this.id])
72116               return copies[this.id];
72117
72118           var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
72119
72120           var nodes = this.nodes.map(function(id) {
72121               return resolver.entity(id).copy(resolver, copies).id;
72122           });
72123
72124           copy = copy.update({ nodes: nodes });
72125           copies[this.id] = copy;
72126
72127           return copy;
72128       },
72129
72130
72131       extent: function(resolver) {
72132           return resolver.transient(this, 'extent', function() {
72133               var extent = geoExtent$$1();
72134               for (var i = 0; i < this.nodes.length; i++) {
72135                   var node = resolver.hasEntity(this.nodes[i]);
72136                   if (node) {
72137                       extent._extend(node.extent());
72138                   }
72139               }
72140               return extent;
72141           });
72142       },
72143
72144
72145       first: function() {
72146           return this.nodes[0];
72147       },
72148
72149
72150       last: function() {
72151           return this.nodes[this.nodes.length - 1];
72152       },
72153
72154
72155       contains: function(node) {
72156           return this.nodes.indexOf(node) >= 0;
72157       },
72158
72159
72160       affix: function(node) {
72161           if (this.nodes[0] === node) return 'prefix';
72162           if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
72163       },
72164
72165
72166       layer: function() {
72167           // explicit layer tag, clamp between -10, 10..
72168           if (isFinite(this.tags.layer)) {
72169               return Math.max(-10, Math.min(+(this.tags.layer), 10));
72170           }
72171
72172           // implied layer tag..
72173           if (this.tags.covered === 'yes') return -1;
72174           if (this.tags.location === 'overground') return 1;
72175           if (this.tags.location === 'underground') return -1;
72176           if (this.tags.location === 'underwater') return -10;
72177
72178           if (this.tags.power === 'line') return 10;
72179           if (this.tags.power === 'minor_line') return 10;
72180           if (this.tags.aerialway) return 10;
72181           if (this.tags.bridge) return 1;
72182           if (this.tags.cutting) return -1;
72183           if (this.tags.tunnel) return -1;
72184           if (this.tags.waterway) return -1;
72185           if (this.tags.man_made === 'pipeline') return -10;
72186           if (this.tags.boundary) return -10;
72187           return 0;
72188       },
72189
72190
72191       isOneWay: function() {
72192           // explicit oneway tag..
72193           var values = {
72194               'yes': true,
72195               '1': true,
72196               '-1': true,
72197               'reversible': true,
72198               'alternating': true,
72199               'no': false,
72200               '0': false
72201           };
72202           if (values[this.tags.oneway] !== undefined) {
72203               return values[this.tags.oneway];
72204           }
72205
72206           // implied oneway tag..
72207           for (var key in this.tags) {
72208               if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
72209                   return true;
72210           }
72211           return false;
72212       },
72213
72214
72215       lanes: function() {
72216           return osmLanes(this);
72217       },
72218
72219
72220       isClosed: function() {
72221           return this.nodes.length > 1 && this.first() === this.last();
72222       },
72223
72224
72225       isConvex: function(resolver) {
72226           if (!this.isClosed() || this.isDegenerate()) return null;
72227
72228           var nodes = uniq(resolver.childNodes(this));
72229           var coords = map$3(nodes, 'loc');
72230           var curr = 0;
72231           var prev = 0;
72232
72233           for (var i = 0; i < coords.length; i++) {
72234               var o = coords[(i+1) % coords.length];
72235               var a = coords[i];
72236               var b = coords[(i+2) % coords.length];
72237               var res = geoVecCross(a, b, o);
72238
72239               curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
72240               if (curr === 0) {
72241                   continue;
72242               } else if (prev && curr !== prev) {
72243                   return false;
72244               }
72245               prev = curr;
72246           }
72247           return true;
72248       },
72249
72250
72251       isArea: function() {
72252           // `highway` and `railway` are typically linear features, but there
72253           // are a few exceptions that should be treated as areas, even in the
72254           // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
72255           var lineKeys = {
72256               highway: {
72257                   rest_area: true,
72258                   services: true
72259               },
72260               railway: {
72261                   roundhouse: true,
72262                   station: true,
72263                   traverser: true,
72264                   turntable: true,
72265                   wash: true
72266               }
72267           };
72268
72269           if (this.tags.area === 'yes')
72270               return true;
72271           if (!this.isClosed() || this.tags.area === 'no')
72272               return false;
72273           for (var key in this.tags) {
72274               if (key in areaKeys && !(this.tags[key] in areaKeys[key])) {
72275                   return true;
72276               }
72277               if (key in lineKeys && this.tags[key] in lineKeys[key]) {
72278                   return true;
72279               }
72280           }
72281           return false;
72282       },
72283
72284
72285       isDegenerate: function() {
72286           return uniq(this.nodes).length < (this.isArea() ? 3 : 2);
72287       },
72288
72289
72290       areAdjacent: function(n1, n2) {
72291           for (var i = 0; i < this.nodes.length; i++) {
72292               if (this.nodes[i] === n1) {
72293                   if (this.nodes[i - 1] === n2) return true;
72294                   if (this.nodes[i + 1] === n2) return true;
72295               }
72296           }
72297           return false;
72298       },
72299
72300
72301       geometry: function(graph) {
72302           return graph.transient(this, 'geometry', function() {
72303               return this.isArea() ? 'area' : 'line';
72304           });
72305       },
72306
72307
72308       // If this way is not closed, append the beginning node to the end of the nodelist to close it.
72309       close: function() {
72310           if (this.isClosed() || !this.nodes.length) return this;
72311
72312           var nodes = this.nodes.slice();
72313           nodes = nodes.filter(noRepeatNodes);
72314           nodes.push(nodes[0]);
72315           return this.update({ nodes: nodes });
72316       },
72317
72318
72319       // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
72320       unclose: function() {
72321           if (!this.isClosed()) return this;
72322
72323           var nodes = this.nodes.slice(),
72324               connector = this.first(),
72325               i = nodes.length - 1;
72326
72327           // remove trailing connectors..
72328           while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
72329               nodes.splice(i, 1);
72330               i = nodes.length - 1;
72331           }
72332
72333           nodes = nodes.filter(noRepeatNodes);
72334           return this.update({ nodes: nodes });
72335       },
72336
72337
72338       // Adds a node (id) in front of the node which is currently at position index.
72339       // If index is undefined, the node will be added to the end of the way for linear ways,
72340       //   or just before the final connecting node for circular ways.
72341       // Consecutive duplicates are eliminated including existing ones.
72342       // Circularity is always preserved when adding a node.
72343       addNode: function(id, index) {
72344           var nodes = this.nodes.slice(),
72345               isClosed = this.isClosed(),
72346               max = isClosed ? nodes.length - 1 : nodes.length;
72347
72348           if (index === undefined) {
72349               index = max;
72350           }
72351
72352           if (index < 0 || index > max) {
72353               throw new RangeError('index ' + index + ' out of range 0..' + max);
72354           }
72355
72356           // If this is a closed way, remove all connector nodes except the first one
72357           // (there may be duplicates) and adjust index if necessary..
72358           if (isClosed) {
72359               var connector = this.first();
72360
72361               // leading connectors..
72362               var i = 1;
72363               while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
72364                   nodes.splice(i, 1);
72365                   if (index > i) index--;
72366               }
72367
72368               // trailing connectors..
72369               i = nodes.length - 1;
72370               while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
72371                   nodes.splice(i, 1);
72372                   if (index > i) index--;
72373                   i = nodes.length - 1;
72374               }
72375           }
72376
72377           nodes.splice(index, 0, id);
72378           nodes = nodes.filter(noRepeatNodes);
72379
72380           // If the way was closed before, append a connector node to keep it closed..
72381           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
72382               nodes.push(nodes[0]);
72383           }
72384
72385           return this.update({ nodes: nodes });
72386       },
72387
72388
72389       // Replaces the node which is currently at position index with the given node (id).
72390       // Consecutive duplicates are eliminated including existing ones.
72391       // Circularity is preserved when updating a node.
72392       updateNode: function(id, index) {
72393           var nodes = this.nodes.slice(),
72394               isClosed = this.isClosed(),
72395               max = nodes.length - 1;
72396
72397           if (index === undefined || index < 0 || index > max) {
72398               throw new RangeError('index ' + index + ' out of range 0..' + max);
72399           }
72400
72401           // If this is a closed way, remove all connector nodes except the first one
72402           // (there may be duplicates) and adjust index if necessary..
72403           if (isClosed) {
72404               var connector = this.first();
72405
72406               // leading connectors..
72407               var i = 1;
72408               while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
72409                   nodes.splice(i, 1);
72410                   if (index > i) index--;
72411               }
72412
72413               // trailing connectors..
72414               i = nodes.length - 1;
72415               while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
72416                   nodes.splice(i, 1);
72417                   if (index === i) index = 0;  // update leading connector instead
72418                   i = nodes.length - 1;
72419               }
72420           }
72421
72422           nodes.splice(index, 1, id);
72423           nodes = nodes.filter(noRepeatNodes);
72424
72425           // If the way was closed before, append a connector node to keep it closed..
72426           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
72427               nodes.push(nodes[0]);
72428           }
72429
72430           return this.update({nodes: nodes});
72431       },
72432
72433
72434       // Replaces each occurrence of node id needle with replacement.
72435       // Consecutive duplicates are eliminated including existing ones.
72436       // Circularity is preserved.
72437       replaceNode: function(needle, replacement) {
72438           var nodes = this.nodes.slice(),
72439               isClosed = this.isClosed();
72440
72441           for (var i = 0; i < nodes.length; i++) {
72442               if (nodes[i] === needle) {
72443                   nodes[i] = replacement;
72444               }
72445           }
72446
72447           nodes = nodes.filter(noRepeatNodes);
72448
72449           // If the way was closed before, append a connector node to keep it closed..
72450           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
72451               nodes.push(nodes[0]);
72452           }
72453
72454           return this.update({nodes: nodes});
72455       },
72456
72457
72458       // Removes each occurrence of node id needle with replacement.
72459       // Consecutive duplicates are eliminated including existing ones.
72460       // Circularity is preserved.
72461       removeNode: function(id) {
72462           var nodes = this.nodes.slice(),
72463               isClosed = this.isClosed();
72464
72465           nodes = nodes
72466               .filter(function(node) { return node !== id; })
72467               .filter(noRepeatNodes);
72468
72469           // If the way was closed before, append a connector node to keep it closed..
72470           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
72471               nodes.push(nodes[0]);
72472           }
72473
72474           return this.update({nodes: nodes});
72475       },
72476
72477
72478       asJXON: function(changeset_id) {
72479           var r = {
72480               way: {
72481                   '@id': this.osmId(),
72482                   '@version': this.version || 0,
72483                   nd: map$3(this.nodes, function(id) {
72484                       return { keyAttributes: { ref: osmEntity$$1.id.toOSM(id) } };
72485                   }),
72486                   tag: map$3(this.tags, function(v, k) {
72487                       return { keyAttributes: { k: k, v: v } };
72488                   })
72489               }
72490           };
72491           if (changeset_id) {
72492               r.way['@changeset'] = changeset_id;
72493           }
72494           return r;
72495       },
72496
72497
72498       asGeoJSON: function(resolver) {
72499           return resolver.transient(this, 'GeoJSON', function() {
72500               var coordinates = map$3(resolver.childNodes(this), 'loc');
72501               if (this.isArea() && this.isClosed()) {
72502                   return {
72503                       type: 'Polygon',
72504                       coordinates: [coordinates]
72505                   };
72506               } else {
72507                   return {
72508                       type: 'LineString',
72509                       coordinates: coordinates
72510                   };
72511               }
72512           });
72513       },
72514
72515
72516       area: function(resolver) {
72517           return resolver.transient(this, 'area', function() {
72518               var nodes = resolver.childNodes(this);
72519
72520               var json = {
72521                   type: 'Polygon',
72522                   coordinates: [map$3(nodes, 'loc')]
72523               };
72524
72525               if (!this.isClosed() && nodes.length) {
72526                   json.coordinates[0].push(nodes[0].loc);
72527               }
72528
72529               var area = d3_geoArea(json);
72530
72531               // Heuristic for detecting counterclockwise winding order. Assumes
72532               // that OpenStreetMap polygons are not hemisphere-spanning.
72533               if (area > 2 * Math.PI) {
72534                   json.coordinates[0] = json.coordinates[0].reverse();
72535                   area = d3_geoArea(json);
72536               }
72537
72538               return isNaN(area) ? 0 : area;
72539           });
72540       }
72541   });
72542
72543
72544   // Filter function to eliminate consecutive duplicates.
72545   function noRepeatNodes(node, i, arr) {
72546       return i === 0 || node !== arr[i - 1];
72547   }
72548
72549   // For fixing up rendering of multipolygons with tags on the outer member.
72550   // https://github.com/openstreetmap/iD/issues/613
72551   function osmIsSimpleMultipolygonOuterMember(entity, graph) {
72552       if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
72553           return false;
72554
72555       var parents = graph.parentRelations(entity);
72556       if (parents.length !== 1)
72557           return false;
72558
72559       var parent = parents[0];
72560       if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
72561           return false;
72562
72563       var members = parent.members, member;
72564       for (var i = 0; i < members.length; i++) {
72565           member = members[i];
72566           if (member.id === entity.id && member.role && member.role !== 'outer')
72567               return false; // Not outer member
72568           if (member.id !== entity.id && (!member.role || member.role === 'outer'))
72569               return false; // Not a simple multipolygon
72570       }
72571
72572       return parent;
72573   }
72574
72575
72576   function osmSimpleMultipolygonOuterMember(entity, graph) {
72577       if (entity.type !== 'way')
72578           return false;
72579
72580       var parents = graph.parentRelations(entity);
72581       if (parents.length !== 1)
72582           return false;
72583
72584       var parent = parents[0];
72585       if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
72586           return false;
72587
72588       var members = parent.members, member, outerMember;
72589       for (var i = 0; i < members.length; i++) {
72590           member = members[i];
72591           if (!member.role || member.role === 'outer') {
72592               if (outerMember)
72593                   return false; // Not a simple multipolygon
72594               outerMember = member;
72595           }
72596       }
72597
72598       if (!outerMember)
72599           return false;
72600
72601       var outerEntity = graph.hasEntity(outerMember.id);
72602       if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
72603           return false;
72604
72605       return outerEntity;
72606   }
72607
72608
72609   // Join `toJoin` array into sequences of connecting ways.
72610
72611   // Segments which share identical start/end nodes will, as much as possible,
72612   // be connected with each other.
72613   //
72614   // The return value is a nested array. Each constituent array contains elements
72615   // of `toJoin` which have been determined to connect.
72616   //
72617   // Each consitituent array also has a `nodes` property whose value is an
72618   // ordered array of member nodes, with appropriate order reversal and
72619   // start/end coordinate de-duplication.
72620   //
72621   // Members of `toJoin` must have, at minimum, `type` and `id` properties.
72622   // Thus either an array of `osmWay`s or a relation member array may be used.
72623   //
72624   // If an member is an `osmWay`, its tags and childnodes may be reversed via
72625   // `actionReverse` in the output.
72626   //
72627   // The returned sequences array also has an `actions` array property, containing
72628   // any reversal actions that should be applied to the graph, should the calling
72629   // code attempt to actually join the given ways.
72630   //
72631   // Incomplete members (those for which `graph.hasEntity(element.id)` returns
72632   // false) and non-way members are ignored.
72633   //
72634   function osmJoinWays(toJoin, graph) {
72635       function resolve(member) {
72636           return graph.childNodes(graph.entity(member.id));
72637       }
72638
72639       function reverse(item) {
72640           var action = actionReverse(item.id, { reverseOneway: true });
72641           sequences.actions.push(action);
72642           return (item instanceof osmWay) ? action(graph).entity(item.id) : item;
72643       }
72644
72645       // make a copy containing only the items to join
72646       toJoin = toJoin.filter(function(member) {
72647           return member.type === 'way' && graph.hasEntity(member.id);
72648       });
72649
72650
72651       var sequences = [];
72652       sequences.actions = [];
72653
72654       while (toJoin.length) {
72655           // start a new sequence
72656           var item = toJoin.shift();
72657           var currWays = [item];
72658           var currNodes = resolve(item).slice();
72659           var doneSequence = false;
72660
72661           // add to it
72662           while (toJoin.length && !doneSequence) {
72663               var start = currNodes[0];
72664               var end = currNodes[currNodes.length - 1];
72665               var fn = null;
72666               var nodes = null;
72667               var i;
72668
72669               // Find the next way/member to join.
72670               for (i = 0; i < toJoin.length; i++) {
72671                   item = toJoin[i];
72672                   nodes = resolve(item);
72673
72674                   // Strongly prefer to generate a forward path that preserves the order
72675                   // of the members array. For multipolygons and most relations, member
72676                   // order does not matter - but for routes, it does. If we started this
72677                   // sequence backwards (i.e. next member way attaches to the start node
72678                   // and not the end node), reverse the initial way before continuing.
72679                   if (currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end &&
72680                       (nodes[nodes.length - 1] === start || nodes[0] === start)
72681                   ) {
72682                       currWays[0] = reverse(currWays[0]);
72683                       currNodes.reverse();
72684                       start = currNodes[0];
72685                       end = currNodes[currNodes.length - 1];
72686                   }
72687
72688                   if (nodes[0] === end) {
72689                       fn = currNodes.push;               // join to end
72690                       nodes = nodes.slice(1);
72691                       break;
72692                   } else if (nodes[nodes.length - 1] === end) {
72693                       fn = currNodes.push;               // join to end
72694                       nodes = nodes.slice(0, -1).reverse();
72695                       item = reverse(item);
72696                       break;
72697                   } else if (nodes[nodes.length - 1] === start) {
72698                       fn = currNodes.unshift;            // join to beginning
72699                       nodes = nodes.slice(0, -1);
72700                       break;
72701                   } else if (nodes[0] === start) {
72702                       fn = currNodes.unshift;            // join to beginning
72703                       nodes = nodes.slice(1).reverse();
72704                       item = reverse(item);
72705                       break;
72706                   } else {
72707                       fn = nodes = null;
72708                   }
72709               }
72710
72711               if (!nodes) {     // couldn't find a joinable way/member
72712                   doneSequence = true;
72713                   break;
72714               }
72715
72716               fn.apply(currWays, [item]);
72717               fn.apply(currNodes, nodes);
72718
72719               toJoin.splice(i, 1);
72720           }
72721
72722           currWays.nodes = currNodes;
72723           sequences.push(currWays);
72724       }
72725
72726       return sequences;
72727   }
72728
72729   function osmRelation() {
72730       if (!(this instanceof osmRelation)) {
72731           return (new osmRelation()).initialize(arguments);
72732       } else if (arguments.length) {
72733           this.initialize(arguments);
72734       }
72735   }
72736
72737
72738   osmEntity$$1.relation = osmRelation;
72739
72740   osmRelation.prototype = Object.create(osmEntity$$1.prototype);
72741
72742
72743   osmRelation.creationOrder = function(a, b) {
72744       var aId = parseInt(osmEntity$$1.id.toOSM(a.id), 10);
72745       var bId = parseInt(osmEntity$$1.id.toOSM(b.id), 10);
72746
72747       if (aId < 0 || bId < 0) return aId - bId;
72748       return bId - aId;
72749   };
72750
72751
72752   assignIn(osmRelation.prototype, {
72753       type: 'relation',
72754       members: [],
72755
72756
72757       copy: function(resolver, copies) {
72758           if (copies[this.id])
72759               return copies[this.id];
72760
72761           var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
72762
72763           var members = this.members.map(function(member) {
72764               return assignIn({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
72765           });
72766
72767           copy = copy.update({members: members});
72768           copies[this.id] = copy;
72769
72770           return copy;
72771       },
72772
72773
72774       extent: function(resolver, memo) {
72775           return resolver.transient(this, 'extent', function() {
72776               if (memo && memo[this.id]) return geoExtent$$1();
72777               memo = memo || {};
72778               memo[this.id] = true;
72779
72780               var extent = geoExtent$$1();
72781               for (var i = 0; i < this.members.length; i++) {
72782                   var member = resolver.hasEntity(this.members[i].id);
72783                   if (member) {
72784                       extent._extend(member.extent(resolver, memo));
72785                   }
72786               }
72787               return extent;
72788           });
72789       },
72790
72791
72792       geometry: function(graph) {
72793           return graph.transient(this, 'geometry', function() {
72794               return this.isMultipolygon() ? 'area' : 'relation';
72795           });
72796       },
72797
72798
72799       isDegenerate: function() {
72800           return this.members.length === 0;
72801       },
72802
72803
72804       // Return an array of members, each extended with an 'index' property whose value
72805       // is the member index.
72806       indexedMembers: function() {
72807           var result = new Array(this.members.length);
72808           for (var i = 0; i < this.members.length; i++) {
72809               result[i] = assignIn({}, this.members[i], {index: i});
72810           }
72811           return result;
72812       },
72813
72814
72815       // Return the first member with the given role. A copy of the member object
72816       // is returned, extended with an 'index' property whose value is the member index.
72817       memberByRole: function(role) {
72818           for (var i = 0; i < this.members.length; i++) {
72819               if (this.members[i].role === role) {
72820                   return assignIn({}, this.members[i], {index: i});
72821               }
72822           }
72823       },
72824
72825       // Same as memberByRole, but returns all members with the given role
72826       membersByRole: function(role) {
72827           var result = [];
72828           for (var i = 0; i < this.members.length; i++) {
72829               if (this.members[i].role === role) {
72830                   result.push(assignIn({}, this.members[i], {index: i}));
72831               }
72832           }
72833           return result;
72834       },
72835
72836       // Return the first member with the given id. A copy of the member object
72837       // is returned, extended with an 'index' property whose value is the member index.
72838       memberById: function(id) {
72839           for (var i = 0; i < this.members.length; i++) {
72840               if (this.members[i].id === id) {
72841                   return assignIn({}, this.members[i], {index: i});
72842               }
72843           }
72844       },
72845
72846
72847       // Return the first member with the given id and role. A copy of the member object
72848       // is returned, extended with an 'index' property whose value is the member index.
72849       memberByIdAndRole: function(id, role) {
72850           for (var i = 0; i < this.members.length; i++) {
72851               if (this.members[i].id === id && this.members[i].role === role) {
72852                   return assignIn({}, this.members[i], {index: i});
72853               }
72854           }
72855       },
72856
72857
72858       addMember: function(member, index) {
72859           var members = this.members.slice();
72860           members.splice(index === undefined ? members.length : index, 0, member);
72861           return this.update({members: members});
72862       },
72863
72864
72865       updateMember: function(member, index) {
72866           var members = this.members.slice();
72867           members.splice(index, 1, assignIn({}, members[index], member));
72868           return this.update({members: members});
72869       },
72870
72871
72872       removeMember: function(index) {
72873           var members = this.members.slice();
72874           members.splice(index, 1);
72875           return this.update({members: members});
72876       },
72877
72878
72879       removeMembersWithID: function(id) {
72880           var members = reject(this.members, function(m) { return m.id === id; });
72881           return this.update({members: members});
72882       },
72883
72884
72885       // Wherever a member appears with id `needle.id`, replace it with a member
72886       // with id `replacement.id`, type `replacement.type`, and the original role,
72887       // By default, adding a duplicate member (by id and role) is prevented.
72888       // Return an updated relation.
72889       replaceMember: function(needle, replacement, keepDuplicates) {
72890           if (!this.memberById(needle.id))
72891               return this;
72892
72893           var members = [];
72894
72895           for (var i = 0; i < this.members.length; i++) {
72896               var member = this.members[i];
72897               if (member.id !== needle.id) {
72898                   members.push(member);
72899               } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
72900                   members.push({id: replacement.id, type: replacement.type, role: member.role});
72901               }
72902           }
72903
72904           return this.update({members: members});
72905       },
72906
72907
72908       asJXON: function(changeset_id) {
72909           var r = {
72910               relation: {
72911                   '@id': this.osmId(),
72912                   '@version': this.version || 0,
72913                   member: map$3(this.members, function(member) {
72914                       return {
72915                           keyAttributes: {
72916                               type: member.type,
72917                               role: member.role,
72918                               ref: osmEntity$$1.id.toOSM(member.id)
72919                           }
72920                       };
72921                   }),
72922                   tag: map$3(this.tags, function(v, k) {
72923                       return { keyAttributes: { k: k, v: v } };
72924                   })
72925               }
72926           };
72927           if (changeset_id) r.relation['@changeset'] = changeset_id;
72928           return r;
72929       },
72930
72931
72932       asGeoJSON: function(resolver) {
72933           return resolver.transient(this, 'GeoJSON', function () {
72934               if (this.isMultipolygon()) {
72935                   return {
72936                       type: 'MultiPolygon',
72937                       coordinates: this.multipolygon(resolver)
72938                   };
72939               } else {
72940                   return {
72941                       type: 'FeatureCollection',
72942                       properties: this.tags,
72943                       features: this.members.map(function (member) {
72944                           return assignIn({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
72945                       })
72946                   };
72947               }
72948           });
72949       },
72950
72951
72952       area: function(resolver) {
72953           return resolver.transient(this, 'area', function() {
72954               return d3_geoArea(this.asGeoJSON(resolver));
72955           });
72956       },
72957
72958
72959       isMultipolygon: function() {
72960           return this.tags.type === 'multipolygon';
72961       },
72962
72963
72964       isComplete: function(resolver) {
72965           for (var i = 0; i < this.members.length; i++) {
72966               if (!resolver.hasEntity(this.members[i].id)) {
72967                   return false;
72968               }
72969           }
72970           return true;
72971       },
72972
72973
72974       isRestriction: function() {
72975           return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
72976       },
72977
72978
72979       isValidRestriction: function() {
72980           if (!this.isRestriction()) return false;
72981
72982           var froms = this.members.filter(function(m) { return m.role === 'from'; });
72983           var vias = this.members.filter(function(m) { return m.role === 'via'; });
72984           var tos = this.members.filter(function(m) { return m.role === 'to'; });
72985
72986           if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
72987           if (froms.some(function(m) { return m.type !== 'way'; })) return false;
72988
72989           if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
72990           if (tos.some(function(m) { return m.type !== 'way'; })) return false;
72991
72992           if (vias.length === 0) return false;
72993           if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) return false;
72994
72995           return true;
72996       },
72997
72998
72999       // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
73000       // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
73001       //
73002       // This corresponds to the structure needed for rendering a multipolygon path using a
73003       // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
73004       //
73005       // In the case of invalid geometries, this function will still return a result which
73006       // includes the nodes of all way members, but some Nds may be unclosed and some inner
73007       // rings not matched with the intended outer ring.
73008       //
73009       multipolygon: function(resolver) {
73010           var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); });
73011           var inners = this.members.filter(function(m) { return 'inner' === m.role; });
73012
73013           outers = osmJoinWays(outers, resolver);
73014           inners = osmJoinWays(inners, resolver);
73015
73016           outers = outers.map(function(outer) { return map$3(outer.nodes, 'loc'); });
73017           inners = inners.map(function(inner) { return map$3(inner.nodes, 'loc'); });
73018
73019           var result = outers.map(function(o) {
73020               // Heuristic for detecting counterclockwise winding order. Assumes
73021               // that OpenStreetMap polygons are not hemisphere-spanning.
73022               return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
73023           });
73024
73025           function findOuter(inner) {
73026               var o, outer;
73027
73028               for (o = 0; o < outers.length; o++) {
73029                   outer = outers[o];
73030                   if (geoPolygonContainsPolygon(outer, inner))
73031                       return o;
73032               }
73033
73034               for (o = 0; o < outers.length; o++) {
73035                   outer = outers[o];
73036                   if (geoPolygonIntersectsPolygon(outer, inner, false))
73037                       return o;
73038               }
73039           }
73040
73041           for (var i = 0; i < inners.length; i++) {
73042               var inner = inners[i];
73043
73044               if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
73045                   inner = inner.reverse();
73046               }
73047
73048               var o = findOuter(inners[i]);
73049               if (o !== undefined)
73050                   result[o].push(inners[i]);
73051               else
73052                   result.push([inners[i]]); // Invalid geometry
73053           }
73054
73055           return result;
73056       }
73057   });
73058
73059   function osmTurn(turn) {
73060       if (!(this instanceof osmTurn)) {
73061           return new osmTurn(turn);
73062       }
73063       assignIn(this, turn);
73064   }
73065
73066
73067   function osmIntersection(graph, startVertexId, maxDistance) {
73068       maxDistance = maxDistance || 30;    // in meters
73069       var vgraph = coreGraph$$1();           // virtual graph
73070       var i, j, k;
73071
73072
73073       function memberOfRestriction(entity) {
73074           return graph.parentRelations(entity)
73075               .some(function(r) { return r.isRestriction(); });
73076       }
73077
73078       function isRoad(way) {
73079           if (way.isArea() || way.isDegenerate()) return false;
73080           var roads = {
73081               'motorway': true,
73082               'motorway_link': true,
73083               'trunk': true,
73084               'trunk_link': true,
73085               'primary': true,
73086               'primary_link': true,
73087               'secondary': true,
73088               'secondary_link': true,
73089               'tertiary': true,
73090               'tertiary_link': true,
73091               'residential': true,
73092               'unclassified': true,
73093               'living_street': true,
73094               'service': true,
73095               'road': true,
73096               'track': true
73097           };
73098           return roads[way.tags.highway];
73099       }
73100
73101
73102       var startNode = graph.entity(startVertexId);
73103       var checkVertices = [startNode];
73104       var checkWays;
73105       var vertices = [];
73106       var vertexIds = [];
73107       var vertex;
73108       var ways = [];
73109       var wayIds = [];
73110       var way;
73111       var nodes = [];
73112       var node;
73113       var parents = [];
73114       var parent;
73115
73116       // `actions` will store whatever actions must be performed to satisfy
73117       // preconditions for adding a turn restriction to this intersection.
73118       //  - Remove any existing degenerate turn restrictions (missing from/to, etc)
73119       //  - Reverse oneways so that they are drawn in the forward direction
73120       //  - Split ways on key vertices
73121       var actions = [];
73122
73123
73124       // STEP 1:  walk the graph outwards from starting vertex to search
73125       //  for more key vertices and ways to include in the intersection..
73126
73127       while (checkVertices.length) {
73128           vertex = checkVertices.pop();
73129
73130           // check this vertex for parent ways that are roads
73131           checkWays = graph.parentWays(vertex);
73132           var hasWays = false;
73133           for (i = 0; i < checkWays.length; i++) {
73134               way = checkWays[i];
73135               if (!isRoad(way) && !memberOfRestriction(way)) continue;
73136
73137               ways.push(way);   // it's a road, or it's already in a turn restriction
73138               hasWays = true;
73139
73140               // check the way's children for more key vertices
73141               nodes = uniq(graph.childNodes(way));
73142               for (j = 0; j < nodes.length; j++) {
73143                   node = nodes[j];
73144                   if (node === vertex) continue;                                           // same thing
73145                   if (vertices.indexOf(node) !== -1) continue;                             // seen it already
73146                   if (node.loc && startNode.loc &&
73147                       geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue;   // too far from start
73148
73149                   // a key vertex will have parents that are also roads
73150                   var hasParents = false;
73151                   parents = graph.parentWays(node);
73152                   for (k = 0; k < parents.length; k++) {
73153                       parent = parents[k];
73154                       if (parent === way) continue;                 // same thing
73155                       if (ways.indexOf(parent) !== -1) continue;    // seen it already
73156                       if (!isRoad(parent)) continue;                // not a road
73157                       hasParents = true;
73158                       break;
73159                   }
73160
73161                   if (hasParents) {
73162                       checkVertices.push(node);
73163                   }
73164               }
73165           }
73166
73167           if (hasWays) {
73168               vertices.push(vertex);
73169           }
73170       }
73171
73172       vertices = uniq(vertices);
73173       ways = uniq(ways);
73174
73175
73176       // STEP 2:  Build a virtual graph containing only the entities in the intersection..
73177       // Everything done after this step should act on the virtual graph
73178       // Any actions that must be performed later to the main graph go in `actions` array
73179       ways.forEach(function(way) {
73180           graph.childNodes(way).forEach(function(node) {
73181               vgraph = vgraph.replace(node);
73182           });
73183
73184           vgraph = vgraph.replace(way);
73185
73186           graph.parentRelations(way).forEach(function(relation) {
73187               if (relation.isRestriction()) {
73188                   if (relation.isValidRestriction(graph)) {
73189                       vgraph = vgraph.replace(relation);
73190                   } else if (relation.isComplete(graph)) {
73191                       actions.push(actionDeleteRelation(relation.id));
73192                   }
73193               }
73194           });
73195       });
73196
73197
73198       // STEP 3:  Force all oneways to be drawn in the forward direction
73199       ways.forEach(function(w) {
73200           var way = vgraph.entity(w.id);
73201           if (way.tags.oneway === '-1') {
73202               var action = actionReverse(way.id, { reverseOneway: true });
73203               actions.push(action);
73204               vgraph = action(vgraph);
73205           }
73206       });
73207
73208
73209       // STEP 4:  Split ways on key vertices
73210       var origCount = osmEntity$$1.id.next.way;
73211       vertices.forEach(function(v) {
73212           // This is an odd way to do it, but we need to find all the ways that
73213           // will be split here, then split them one at a time to ensure that these
73214           // actions can be replayed on the main graph exactly in the same order.
73215           // (It is unintuitive, but the order of ways returned from graph.parentWays()
73216           // is arbitrary, depending on how the main graph and vgraph were built)
73217           var splitAll = actionSplit(v.id);
73218           if (!splitAll.disabled(vgraph)) {
73219               splitAll.ways(vgraph).forEach(function(way) {
73220                   var splitOne = actionSplit(v.id).limitWays([way.id]);
73221                   actions.push(splitOne);
73222                   vgraph = splitOne(vgraph);
73223               });
73224           }
73225       });
73226
73227       // In here is where we should also split the intersection at nearby junction.
73228       //   for https://github.com/mapbox/iD-internal/issues/31
73229       // nearbyVertices.forEach(function(v) {
73230       // });
73231
73232       // Reasons why we reset the way id count here:
73233       //  1. Continuity with way ids created by the splits so that we can replay
73234       //     these actions later if the user decides to create a turn restriction
73235       //  2. Avoids churning way ids just by hovering over a vertex
73236       //     and displaying the turn restriction editor
73237       osmEntity$$1.id.next.way = origCount;
73238
73239
73240       // STEP 5:  Update arrays to point to vgraph entities
73241       vertexIds = vertices.map(function(v) { return v.id; });
73242       vertices = [];
73243       ways = [];
73244
73245       vertexIds.forEach(function(id) {
73246           var vertex = vgraph.entity(id);
73247           var parents = vgraph.parentWays(vertex);
73248           vertices.push(vertex);
73249           ways = ways.concat(parents);
73250       });
73251
73252       vertices = uniq(vertices);
73253       ways = uniq(ways);
73254
73255       vertexIds = vertices.map(function(v) { return v.id; });
73256       wayIds = ways.map(function(w) { return w.id; });
73257
73258
73259       // STEP 6:  Update the ways with some metadata that will be useful for
73260       // walking the intersection graph later and rendering turn arrows.
73261
73262       function withMetadata(way, vertexIds) {
73263           var __oneWay = way.isOneWay();
73264
73265           // which affixes are key vertices?
73266           var __first = (vertexIds.indexOf(way.first()) !== -1);
73267           var __last = (vertexIds.indexOf(way.last()) !== -1);
73268
73269           // what roles is this way eligible for?
73270           var __via = (__first && __last);
73271           var __from = ((__first && !__oneWay) || __last);
73272           var __to = (__first || (__last && !__oneWay));
73273
73274           return way.update({
73275               __first:  __first,
73276               __last:  __last,
73277               __from:  __from,
73278               __via: __via,
73279               __to:  __to,
73280               __oneWay:  __oneWay
73281           });
73282       }
73283
73284       ways = [];
73285       wayIds.forEach(function(id) {
73286           var way = withMetadata(vgraph.entity(id), vertexIds);
73287           vgraph = vgraph.replace(way);
73288           ways.push(way);
73289       });
73290
73291
73292       // STEP 7:  Simplify - This is an iterative process where we:
73293       //  1. Find trivial vertices with only 2 parents
73294       //  2. trim off the leaf way from those vertices and remove from vgraph
73295
73296       var keepGoing;
73297       var removeWayIds = [];
73298       var removeVertexIds = [];
73299
73300       do {
73301           keepGoing = false;
73302           checkVertices = vertexIds.slice();
73303
73304           for (i = 0; i < checkVertices.length; i++) {
73305               var vertexId = checkVertices[i];
73306               vertex = vgraph.hasEntity(vertexId);
73307
73308               if (!vertex) {
73309                   if (vertexIds.indexOf(vertexId) !== -1) {
73310                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
73311                   }
73312                   removeVertexIds.push(vertexId);
73313                   continue;
73314               }
73315
73316               parents = vgraph.parentWays(vertex);
73317               if (parents.length < 3) {
73318                   if (vertexIds.indexOf(vertexId) !== -1) {
73319                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
73320                   }
73321               }
73322
73323               if (parents.length === 2) {     // vertex with 2 parents is trivial
73324                   var a = parents[0];
73325                   var b = parents[1];
73326                   var aIsLeaf = a && !a.__via;
73327                   var bIsLeaf = b && !b.__via;
73328                   var leaf, survivor;
73329
73330                   if (aIsLeaf && !bIsLeaf) {
73331                       leaf = a;
73332                       survivor = b;
73333                   } else if (!aIsLeaf && bIsLeaf) {
73334                       leaf = b;
73335                       survivor = a;
73336                   }
73337
73338                   if (leaf && survivor) {
73339                       survivor = withMetadata(survivor, vertexIds);      // update survivor way
73340                       vgraph = vgraph.replace(survivor).remove(leaf);    // update graph
73341                       removeWayIds.push(leaf.id);
73342                       keepGoing = true;
73343                   }
73344               }
73345
73346               parents = vgraph.parentWays(vertex);
73347
73348               if (parents.length < 2) {     // vertex is no longer a key vertex
73349                   if (vertexIds.indexOf(vertexId) !== -1) {
73350                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
73351                   }
73352                   removeVertexIds.push(vertexId);
73353                   keepGoing = true;
73354               }
73355
73356               if (parents.length < 1) {     // vertex is no longer attached to anything
73357                   vgraph = vgraph.remove(vertex);
73358               }
73359
73360           }
73361       } while (keepGoing);
73362
73363
73364       vertices = vertices
73365           .filter(function(vertex) { return removeVertexIds.indexOf(vertex.id) === -1; })
73366           .map(function(vertex) { return vgraph.entity(vertex.id); });
73367       ways = ways
73368           .filter(function(way) { return removeWayIds.indexOf(way.id) === -1; })
73369           .map(function(way) { return vgraph.entity(way.id); });
73370
73371
73372       // OK!  Here is our intersection..
73373       var intersection = {
73374           graph: vgraph,
73375           actions: actions,
73376           vertices: vertices,
73377           ways: ways,
73378       };
73379
73380
73381
73382       // Get all the valid turns through this intersection given a starting way id.
73383       // This operates on the virtual graph for everything.
73384       //
73385       // Basically, walk through all possible paths from starting way,
73386       //   honoring the existing turn restrictions as we go (watch out for loops!)
73387       //
73388       // For each path found, generate and return a `osmTurn` datastructure.
73389       //
73390       intersection.turns = function(fromWayId, maxViaWay) {
73391           if (!fromWayId) return [];
73392           if (!maxViaWay) maxViaWay = 0;
73393
73394           var vgraph = intersection.graph;
73395           var keyVertexIds = intersection.vertices.map(function(v) { return v.id; });
73396
73397           var start = vgraph.entity(fromWayId);
73398           if (!start || !(start.__from || start.__via)) return [];
73399
73400           // maxViaWay=0   from-*-to              (0 vias)
73401           // maxViaWay=1   from-*-via-*-to        (1 via max)
73402           // maxViaWay=2   from-*-via-*-via-*-to  (2 vias max)
73403           var maxPathLength = (maxViaWay * 2) + 3;
73404           var turns = [];
73405
73406           step(start);
73407           return turns;
73408
73409
73410           // traverse the intersection graph and find all the valid paths
73411           function step(entity, currPath, currRestrictions, matchedRestriction) {
73412               currPath = clone(currPath || []);
73413               if (currPath.length >= maxPathLength) return;
73414               currPath.push(entity.id);
73415               currRestrictions = clone(currRestrictions || []);
73416               var i, j;
73417
73418               if (entity.type === 'node') {
73419                   var parents = vgraph.parentWays(entity);
73420                   var nextWays = [];
73421
73422                   // which ways can we step into?
73423                   for (i = 0; i < parents.length; i++) {
73424                       var way = parents[i];
73425
73426                       // if next way is a oneway incoming to this vertex, skip
73427                       if (way.__oneWay && way.nodes[0] !== entity.id) continue;
73428
73429                       // if we have seen it before (allowing for an initial u-turn), skip
73430                       if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue;
73431
73432                       // Check all "current" restrictions (where we've already walked the `FROM`)
73433                       var restrict = undefined;
73434                       for (j = 0; j < currRestrictions.length; j++) {
73435                           var restriction = currRestrictions[j];
73436                           var f = restriction.memberByRole('from');
73437                           var v = restriction.membersByRole('via');
73438                           var t = restriction.memberByRole('to');
73439                           var isOnly = /^only_/.test(restriction.tags.restriction);
73440
73441                           // Does the current path match this turn restriction?
73442                           var matchesFrom = (f.id === fromWayId);
73443                           var matchesViaTo = false;
73444                           var isAlongOnlyPath = false;
73445
73446                           if (t.id === way.id) {     // match TO
73447
73448                               if (v.length === 1 && v[0].type === 'node') {    // match VIA node
73449                                   matchesViaTo = (v[0].id === entity.id && (
73450                                       (matchesFrom && currPath.length === 2) ||
73451                                       (!matchesFrom && currPath.length > 2)
73452                                   ));
73453
73454                               } else {                                         // match all VIA ways
73455                                   var pathVias = [];
73456                                   for (k = 2; k < currPath.length; k +=2 ) {   // k = 2 skips FROM
73457                                       pathVias.push(currPath[k]);              // (path goes way-node-way...)
73458                                   }
73459                                   var restrictionVias = [];
73460                                   for (k = 0; k < v.length; k++) {
73461                                       if (v[k].type === 'way') {
73462                                           restrictionVias.push(v[k].id);
73463                                       }
73464                                   }
73465                                   var diff = difference(pathVias, restrictionVias);
73466                                   matchesViaTo = !diff.length;
73467                               }
73468
73469                           } else if (isOnly) {
73470                               for (k = 0; k < v.length; k++) {
73471                                   // way doesn't match TO, but is one of the via ways along the path of an "only"
73472                                   if (v[k].type === 'way' && v[k].id === way.id) {
73473                                       isAlongOnlyPath = true;
73474                                       break;
73475                                   }
73476                               }
73477                           }
73478
73479                           if (matchesViaTo) {
73480                               if (isOnly) {
73481                                   restrict = { id: restriction.id, direct: matchesFrom, from: f.id, only: true, end: true };
73482                               } else {
73483                                   restrict = { id: restriction.id, direct: matchesFrom, from: f.id, no: true, end: true };
73484                               }
73485                           } else {    // indirect - caused by a different nearby restriction
73486                               if (isAlongOnlyPath) {
73487                                   restrict = { id: restriction.id, direct: false, from: f.id, only: true, end: false };
73488                               } else if (isOnly) {
73489                                   restrict = { id: restriction.id, direct: false, from: f.id, no: true, end: true };
73490                               }
73491                           }
73492
73493                           // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
73494                           if (restrict && restrict.direct)
73495                               break;
73496                       }
73497
73498                       nextWays.push({ way: way, restrict: restrict });
73499                   }
73500
73501                   nextWays.forEach(function(nextWay) {
73502                       step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
73503                   });
73504
73505
73506               } else {  // entity.type === 'way'
73507                   if (currPath.length >= 3) {     // this is a "complete" path..
73508                       var turnPath = clone(currPath);
73509
73510                       // an indirect restriction - only include the partial path (starting at FROM)
73511                       if (matchedRestriction && matchedRestriction.direct === false) {
73512                           for (i = 0; i < turnPath.length; i++) {
73513                               if (turnPath[i] === matchedRestriction.from) {
73514                                   turnPath = turnPath.slice(i);
73515                                   break;
73516                               }
73517                           }
73518                       }
73519
73520                       var turn = pathToTurn(turnPath);
73521                       if (turn) {
73522                           if (matchedRestriction) {
73523                               turn.restrictionID = matchedRestriction.id;
73524                               turn.no = matchedRestriction.no;
73525                               turn.only = matchedRestriction.only;
73526                               turn.direct = matchedRestriction.direct;
73527                           }
73528                           turns.push(osmTurn(turn));
73529                       }
73530
73531                       if (currPath[0] === currPath[2]) return;   // if we made a u-turn - stop here
73532                   }
73533
73534                   if (matchedRestriction && matchedRestriction.end) return;  // don't advance any further
73535
73536                   // which nodes can we step into?
73537                   var n1 = vgraph.entity(entity.first());
73538                   var n2 = vgraph.entity(entity.last());
73539                   var dist = n1.loc && n2.loc && geoSphericalDistance(n1.loc, n2.loc);
73540                   var nextNodes = [];
73541
73542                   if (currPath.length > 1) {
73543                       if (dist > maxDistance) return;   // the next node is too far
73544                       if (!entity.__via) return;        // this way is a leaf / can't be a via
73545                   }
73546
73547                   if (!entity.__oneWay &&                     // bidirectional..
73548                       keyVertexIds.indexOf(n1.id) !== -1 &&   // key vertex..
73549                       currPath.indexOf(n1.id) === -1) {       // haven't seen it yet..
73550                       nextNodes.push(n1);                     // can advance to first node
73551                   }
73552                   if (keyVertexIds.indexOf(n2.id) !== -1 &&   // key vertex..
73553                       currPath.indexOf(n2.id) === -1) {       // haven't seen it yet..
73554                       nextNodes.push(n2);                     // can advance to last node
73555                   }
73556
73557                   nextNodes.forEach(function(nextNode) {
73558                       // gather restrictions FROM this way
73559                       var fromRestrictions = vgraph.parentRelations(entity).filter(function(r) {
73560                           if (!r.isRestriction()) return false;
73561
73562                           var f = r.memberByRole('from');
73563                           if (!f || f.id !== entity.id) return false;
73564
73565                           var isOnly = /^only_/.test(r.tags.restriction);
73566                           if (!isOnly) return true;
73567
73568                           // `only_` restrictions only matter along the direction of the VIA - #4849
73569                           var isOnlyVia = false;
73570                           var v = r.membersByRole('via');
73571                           if (v.length === 1 && v[0].type === 'node') {   // via node
73572                               isOnlyVia = (v[0].id === nextNode.id);
73573                           } else {                                        // via way(s)
73574                               for (var i = 0; i < v.length; i++) {
73575                                   if (v[i].type !== 'way') continue;
73576                                   var viaWay = vgraph.entity(v[i].id);
73577                                   if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
73578                                       isOnlyVia = true;
73579                                       break;
73580                                   }
73581                               }
73582                           }
73583                           return isOnlyVia;
73584                       });
73585
73586                       step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
73587                   });
73588               }
73589           }
73590
73591
73592           // assumes path is alternating way-node-way of odd length
73593           function pathToTurn(path) {
73594               if (path.length < 3) return;
73595               var fromWayId, fromNodeId, fromVertexId;
73596               var toWayId, toNodeId, toVertexId;
73597               var viaWayIds, viaNodeId, isUturn;
73598
73599               fromWayId = path[0];
73600               toWayId = path[path.length - 1];
73601
73602               if (path.length === 3 && fromWayId === toWayId) {  // u turn
73603                   var way = vgraph.entity(fromWayId);
73604                   if (way.__oneWay) return null;
73605
73606                   isUturn = true;
73607                   viaNodeId = fromVertexId = toVertexId = path[1];
73608                   fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
73609
73610               } else {
73611                   isUturn = false;
73612                   fromVertexId = path[1];
73613                   fromNodeId = adjacentNode(fromWayId, fromVertexId);
73614                   toVertexId = path[path.length - 2];
73615                   toNodeId = adjacentNode(toWayId, toVertexId);
73616
73617                   if (path.length === 3) {
73618                       viaNodeId = path[1];
73619                   } else {
73620                       viaWayIds = path.filter(function(entityId) { return entityId[0] === 'w'; });
73621                       viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1);  // remove first, last
73622                   }
73623               }
73624
73625               return {
73626                   key:  path.join('_'),
73627                   path: path,
73628                   from: { node: fromNodeId, way:  fromWayId, vertex: fromVertexId },
73629                   via:  { node: viaNodeId,  ways: viaWayIds },
73630                   to:   { node: toNodeId,   way:  toWayId, vertex: toVertexId },
73631                   u:    isUturn
73632               };
73633
73634
73635               function adjacentNode(wayId, affixId) {
73636                   var nodes = vgraph.entity(wayId).nodes;
73637                   return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
73638               }
73639           }
73640
73641       };
73642
73643       return intersection;
73644   }
73645
73646
73647   function osmInferRestriction(graph, turn, projection) {
73648       var fromWay = graph.entity(turn.from.way);
73649       var fromNode = graph.entity(turn.from.node);
73650       var fromVertex = graph.entity(turn.from.vertex);
73651       var toWay = graph.entity(turn.to.way);
73652       var toNode = graph.entity(turn.to.node);
73653       var toVertex = graph.entity(turn.to.vertex);
73654
73655       var fromOneWay = (fromWay.tags.oneway === 'yes');
73656       var toOneWay = (toWay.tags.oneway === 'yes');
73657       var angle = (geoAngle(fromVertex, fromNode, projection) -
73658                   geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
73659
73660       while (angle < 0)
73661           angle += 360;
73662
73663       if (fromNode === toNode)
73664           return 'no_u_turn';
73665       if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
73666           return 'no_u_turn';   // wider tolerance for u-turn if both ways are oneway
73667       if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex)
73668           return 'no_u_turn';   // even wider tolerance for u-turn if there is a via way (from !== to)
73669       if (angle < 158)
73670           return 'no_right_turn';
73671       if (angle > 202)
73672           return 'no_left_turn';
73673
73674       return 'no_straight_on';
73675   }
73676
73677   function actionAddMember(relationId, member, memberIndex, insertPair) {
73678
73679       return function action(graph) {
73680           var relation = graph.entity(relationId);
73681
73682           // There are some special rules for Public Transport v2 routes.
73683           var isPTv2 = /stop|platform/.test(member.role);
73684
73685           if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) {
73686               // Try to perform sensible inserts based on how the ways join together
73687               graph = addWayMember(relation, graph);
73688           } else {
73689               // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
73690               // Stops and Platforms for PTv2 should be ordered first.
73691               // hack: We do not currently have the ability to place them in the exactly correct order.
73692               if (isPTv2 && isNaN(memberIndex)) {
73693                   memberIndex = 0;
73694               }
73695
73696               graph = graph.replace(relation.addMember(member, memberIndex));
73697           }
73698
73699           return graph;
73700       };
73701
73702
73703       // Add a way member into the relation "wherever it makes sense".
73704       // In this situation we were not supplied a memberIndex.
73705       function addWayMember(relation, graph) {
73706           var groups, tempWay, item, i, j, k;
73707
73708           // remove PTv2 stops and platforms before doing anything.
73709           var PTv2members = [];
73710           var members = [];
73711           for (i = 0; i < relation.members.length; i++) {
73712               var m = relation.members[i];
73713               if (/stop|platform/.test(m.role)) {
73714                   PTv2members.push(m);
73715               } else {
73716                   members.push(m);
73717               }
73718           }
73719           relation = relation.update({ members: members });
73720
73721
73722           if (insertPair) {
73723               // We're adding a member that must stay paired with an existing member.
73724               // (This feature is used by `actionSplit`)
73725               //
73726               // This is tricky because the members may exist multiple times in the
73727               // member list, and with different A-B/B-A ordering and different roles.
73728               // (e.g. a bus route that loops out and back - #4589).
73729               //
73730               // Replace the existing member with a temporary way,
73731               // so that `osmJoinWays` can treat the pair like a single way.
73732               tempWay = osmWay({ id: 'wTemp', nodes: insertPair.nodes });
73733               graph = graph.replace(tempWay);
73734               var tempMember = { id: tempWay.id, type: 'way', role: member.role };
73735               var tempRelation = relation.replaceMember({id: insertPair.originalID}, tempMember, true);
73736               groups = groupBy(tempRelation.members, function(m) { return m.type; });
73737               groups.way = groups.way || [];
73738
73739           } else {
73740               // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
73741               groups = groupBy(relation.members, function(m) { return m.type; });
73742               groups.way = groups.way || [];
73743               groups.way.push(member);
73744           }
73745
73746           members = withIndex(groups.way);
73747           var joined = osmJoinWays(members, graph);
73748
73749           // `joined` might not contain all of the way members,
73750           // But will contain only the completed (downloaded) members
73751           for (i = 0; i < joined.length; i++) {
73752               var segment = joined[i];
73753               var nodes = segment.nodes.slice();
73754               var startIndex = segment[0].index;
73755
73756               // j = array index in `members` where this segment starts
73757               for (j = 0; j < members.length; j++) {
73758                   if (members[j].index === startIndex) {
73759                       break;
73760                   }
73761               }
73762
73763               // k = each member in segment
73764               for (k = 0; k < segment.length; k++) {
73765                   item = segment[k];
73766                   var way = graph.entity(item.id);
73767
73768                   // If this is a paired item, generate members in correct order and role
73769                   if (tempWay && item.id === tempWay.id) {
73770                       if (nodes[0].id === insertPair.nodes[0]) {
73771                           item.pair = [
73772                               { id: insertPair.originalID, type: 'way', role: item.role },
73773                               { id: insertPair.insertedID, type: 'way', role: item.role }
73774                           ];
73775                       } else {
73776                           item.pair = [
73777                               { id: insertPair.insertedID, type: 'way', role: item.role },
73778                               { id: insertPair.originalID, type: 'way', role: item.role }
73779                           ];
73780                       }
73781                   }
73782
73783                   // reorder `members` if necessary
73784                   if (k > 0) {
73785                       if (j+k >= members.length || item.index !== members[j+k].index) {
73786                           moveMember(members, item.index, j+k);
73787                       }
73788                   }
73789
73790                   nodes.splice(0, way.nodes.length - 1);
73791               }
73792           }
73793
73794           if (tempWay) {
73795               graph = graph.remove(tempWay);
73796           }
73797
73798           // Final pass: skip dead items, split pairs, remove index properties
73799           var wayMembers = [];
73800           for (i = 0; i < members.length; i++) {
73801               item = members[i];
73802               if (item.index === -1) continue;
73803
73804               if (item.pair) {
73805                   wayMembers.push(item.pair[0]);
73806                   wayMembers.push(item.pair[1]);
73807               } else {
73808                   wayMembers.push(omit(item, 'index'));
73809               }
73810           }
73811
73812           // Put stops and platforms first, then nodes, ways, relations
73813           // This is recommended for Public Transport v2 routes:
73814           // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
73815           var newMembers = PTv2members.concat( (groups.node || []), wayMembers, (groups.relation || []) );
73816
73817           return graph.replace(relation.update({members: newMembers}));
73818
73819
73820           // `moveMember()` changes the `members` array in place by splicing
73821           // the item with `.index = findIndex` to where it belongs,
73822           // and marking the old position as "dead" with `.index = -1`
73823           //
73824           // j=5, k=0                jk
73825           // segment                 5 4 7 6
73826           // members       0 1 2 3 4 5 6 7 8 9        keep 5 in j+k
73827           //
73828           // j=5, k=1                j k
73829           // segment                 5 4 7 6
73830           // members       0 1 2 3 4 5 6 7 8 9        move 4 to j+k
73831           // members       0 1 2 3 x 5 4 6 7 8 9      moved
73832           //
73833           // j=5, k=2                j   k
73834           // segment                 5 4 7 6
73835           // members       0 1 2 3 x 5 4 6 7 8 9      move 7 to j+k
73836           // members       0 1 2 3 x 5 4 7 6 x 8 9    moved
73837           //
73838           // j=5, k=3                j     k
73839           // segment                 5 4 7 6
73840           // members       0 1 2 3 x 5 4 7 6 x 8 9    keep 6 in j+k
73841           //
73842           function moveMember(arr, findIndex, toIndex) {
73843               for (var i = 0; i < arr.length; i++) {
73844                   if (arr[i].index === findIndex) {
73845                       break;
73846                   }
73847               }
73848
73849               var item = clone(arr[i]);
73850               arr[i].index = -1;   // mark as dead
73851               item.index = toIndex;
73852               arr.splice(toIndex, 0, item);
73853           }
73854
73855
73856           // This is the same as `Relation.indexedMembers`,
73857           // Except we don't want to index all the members, only the ways
73858           function withIndex(arr) {
73859               var result = new Array(arr.length);
73860               for (var i = 0; i < arr.length; i++) {
73861                   result[i] = arr[i];
73862                   result[i].index = i;
73863               }
73864               return result;
73865           }
73866       }
73867
73868   }
73869
73870   function actionAddMidpoint(midpoint, node) {
73871       return function(graph) {
73872           graph = graph.replace(node.move(midpoint.loc));
73873
73874           var parents = intersection(
73875               graph.parentWays(graph.entity(midpoint.edge[0])),
73876               graph.parentWays(graph.entity(midpoint.edge[1])));
73877
73878           parents.forEach(function(way) {
73879               for (var i = 0; i < way.nodes.length - 1; i++) {
73880                   if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
73881                       graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
73882
73883                       // Add only one midpoint on doubled-back segments,
73884                       // turning them into self-intersections.
73885                       return;
73886                   }
73887               }
73888           });
73889
73890           return graph;
73891       };
73892   }
73893
73894   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
73895   function actionAddVertex(wayId, nodeId, index) {
73896       return function(graph) {
73897           return graph.replace(graph.entity(wayId).addNode(nodeId, index));
73898       };
73899   }
73900
73901   function actionChangeMember(relationId, member, memberIndex) {
73902       return function(graph) {
73903           return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
73904       };
73905   }
73906
73907   function actionChangePreset(entityId, oldPreset, newPreset) {
73908       return function(graph) {
73909           var entity = graph.entity(entityId),
73910               geometry = entity.geometry(graph),
73911               tags = entity.tags;
73912
73913           if (oldPreset) tags = oldPreset.removeTags(tags, geometry);
73914           if (newPreset) tags = newPreset.applyTags(tags, geometry);
73915
73916           return graph.replace(entity.update({tags: tags}));
73917       };
73918   }
73919
73920   function actionChangeTags(entityId, tags) {
73921       return function(graph) {
73922           var entity = graph.entity(entityId);
73923           return graph.replace(entity.update({tags: tags}));
73924       };
73925   }
73926
73927   function actionCircularize(wayId, projection, maxAngle) {
73928       maxAngle = (maxAngle || 20) * Math.PI / 180;
73929
73930
73931       var action = function(graph, t) {
73932           if (t === null || !isFinite(t)) t = 1;
73933           t = Math.min(Math.max(+t, 0), 1);
73934
73935           var way = graph.entity(wayId),
73936               origNodes = {};
73937
73938           graph.childNodes(way).forEach(function(node) {
73939               if (!origNodes[node.id]) origNodes[node.id] = node;
73940           });
73941
73942           if (!way.isConvex(graph)) {
73943               graph = action.makeConvex(graph);
73944           }
73945
73946           var nodes = uniq(graph.childNodes(way)),
73947               keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; }),
73948               points = nodes.map(function(n) { return projection(n.loc); }),
73949               keyPoints = keyNodes.map(function(n) { return projection(n.loc); }),
73950               centroid = (points.length === 2) ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points),
73951               radius = d3_median(points, function(p) { return geoVecLength(centroid, p); }),
73952               sign = d3_polygonArea(points) > 0 ? 1 : -1,
73953               ids;
73954
73955           // we need atleast two key nodes for the algorithm to work
73956           if (!keyNodes.length) {
73957               keyNodes = [nodes[0]];
73958               keyPoints = [points[0]];
73959           }
73960
73961           if (keyNodes.length === 1) {
73962               var index = nodes.indexOf(keyNodes[0]),
73963                   oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
73964
73965               keyNodes.push(nodes[oppositeIndex]);
73966               keyPoints.push(points[oppositeIndex]);
73967           }
73968
73969           // key points and nodes are those connected to the ways,
73970           // they are projected onto the circle, inbetween nodes are moved
73971           // to constant intervals between key nodes, extra inbetween nodes are
73972           // added if necessary.
73973           for (var i = 0; i < keyPoints.length; i++) {
73974               var nextKeyNodeIndex = (i + 1) % keyNodes.length,
73975                   startNode = keyNodes[i],
73976                   endNode = keyNodes[nextKeyNodeIndex],
73977                   startNodeIndex = nodes.indexOf(startNode),
73978                   endNodeIndex = nodes.indexOf(endNode),
73979                   numberNewPoints = -1,
73980                   indexRange = endNodeIndex - startNodeIndex,
73981                   nearNodes = {},
73982                   inBetweenNodes = [],
73983                   startAngle, endAngle, totalAngle, eachAngle,
73984                   angle, loc, node, origNode, j;
73985
73986               if (indexRange < 0) {
73987                   indexRange += nodes.length;
73988               }
73989
73990               // position this key node
73991               var distance = geoVecLength(centroid, keyPoints[i]);
73992               if (distance === 0) { distance = 1e-4; }
73993               keyPoints[i] = [
73994                   centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
73995                   centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
73996               ];
73997               loc = projection.invert(keyPoints[i]);
73998               node = keyNodes[i];
73999               origNode = origNodes[node.id];
74000               node = node.move(geoVecInterp(origNode.loc, loc, t));
74001               graph = graph.replace(node);
74002
74003               // figure out the between delta angle we want to match to
74004               startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
74005               endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
74006               totalAngle = endAngle - startAngle;
74007
74008               // detects looping around -pi/pi
74009               if (totalAngle * sign > 0) {
74010                   totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
74011               }
74012
74013               do {
74014                   numberNewPoints++;
74015                   eachAngle = totalAngle / (indexRange + numberNewPoints);
74016               } while (Math.abs(eachAngle) > maxAngle);
74017
74018
74019               // move existing nodes
74020               for (j = 1; j < indexRange; j++) {
74021                   angle = startAngle + j * eachAngle;
74022                   loc = projection.invert([
74023                       centroid[0] + Math.cos(angle) * radius,
74024                       centroid[1] + Math.sin(angle) * radius
74025                   ]);
74026
74027                   node = nodes[(j + startNodeIndex) % nodes.length];
74028                   origNode = origNodes[node.id];
74029                   nearNodes[node.id] = angle;
74030
74031                   node = node.move(geoVecInterp(origNode.loc, loc, t));
74032                   graph = graph.replace(node);
74033               }
74034
74035               // add new inbetween nodes if necessary
74036               for (j = 0; j < numberNewPoints; j++) {
74037                   angle = startAngle + (indexRange + j) * eachAngle;
74038                   loc = projection.invert([
74039                       centroid[0] + Math.cos(angle) * radius,
74040                       centroid[1] + Math.sin(angle) * radius
74041                   ]);
74042
74043                   // choose a nearnode to use as the original
74044                   var min$$1 = Infinity;
74045                   for (var nodeId in nearNodes) {
74046                       var nearAngle = nearNodes[nodeId],
74047                           dist = Math.abs(nearAngle - angle);
74048                       if (dist < min$$1) {
74049                           dist = min$$1;
74050                           origNode = origNodes[nodeId];
74051                       }
74052                   }
74053
74054                   node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
74055                   graph = graph.replace(node);
74056
74057                   nodes.splice(endNodeIndex + j, 0, node);
74058                   inBetweenNodes.push(node.id);
74059               }
74060
74061               // Check for other ways that share these keyNodes..
74062               // If keyNodes are adjacent in both ways,
74063               // we can add inBetween nodes to that shared way too..
74064               if (indexRange === 1 && inBetweenNodes.length) {
74065                   var startIndex1 = way.nodes.lastIndexOf(startNode.id),
74066                       endIndex1 = way.nodes.lastIndexOf(endNode.id),
74067                       wayDirection1 = (endIndex1 - startIndex1);
74068                   if (wayDirection1 < -1) { wayDirection1 = 1; }
74069
74070                   /* eslint-disable no-loop-func */
74071                   forEach(without(graph.parentWays(keyNodes[i]), way), function(sharedWay) {
74072                       if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
74073                           var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id),
74074                               endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id),
74075                               wayDirection2 = (endIndex2 - startIndex2),
74076                               insertAt = endIndex2;
74077                           if (wayDirection2 < -1) { wayDirection2 = 1; }
74078
74079                           if (wayDirection1 !== wayDirection2) {
74080                               inBetweenNodes.reverse();
74081                               insertAt = startIndex2;
74082                           }
74083                           for (j = 0; j < inBetweenNodes.length; j++) {
74084                               sharedWay = sharedWay.addNode(inBetweenNodes[j], insertAt + j);
74085                           }
74086                           graph = graph.replace(sharedWay);
74087                       }
74088                   });
74089                   /* eslint-enable no-loop-func */
74090               }
74091
74092           }
74093
74094           // update the way to have all the new nodes
74095           ids = nodes.map(function(n) { return n.id; });
74096           ids.push(ids[0]);
74097
74098           way = way.update({nodes: ids});
74099           graph = graph.replace(way);
74100
74101           return graph;
74102       };
74103
74104
74105       action.makeConvex = function(graph) {
74106           var way = graph.entity(wayId),
74107               nodes = uniq(graph.childNodes(way)),
74108               points = nodes.map(function(n) { return projection(n.loc); }),
74109               sign = d3_polygonArea(points) > 0 ? 1 : -1,
74110               hull = d3_polygonHull(points);
74111
74112           // D3 convex hulls go counterclockwise..
74113           if (sign === -1) {
74114               nodes.reverse();
74115               points.reverse();
74116           }
74117
74118           for (var i = 0; i < hull.length - 1; i++) {
74119               var startIndex = points.indexOf(hull[i]),
74120                   endIndex = points.indexOf(hull[i+1]),
74121                   indexRange = (endIndex - startIndex);
74122
74123               if (indexRange < 0) {
74124                   indexRange += nodes.length;
74125               }
74126
74127               // move interior nodes to the surface of the convex hull..
74128               for (var j = 1; j < indexRange; j++) {
74129                   var point = geoVecInterp(hull[i], hull[i+1], j / indexRange),
74130                       node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
74131                   graph = graph.replace(node);
74132               }
74133           }
74134           return graph;
74135       };
74136
74137
74138       action.disabled = function(graph) {
74139           if (!graph.entity(wayId).isClosed())
74140               return 'not_closed';
74141       };
74142
74143
74144       action.transitionable = true;
74145
74146
74147       return action;
74148   }
74149
74150   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
74151   function actionDeleteWay(wayId) {
74152
74153
74154       function canDeleteNode(node, graph) {
74155           return !graph.parentWays(node).length &&
74156               !graph.parentRelations(node).length &&
74157               !node.hasInterestingTags();
74158       }
74159
74160
74161       var action = function(graph) {
74162           var way = graph.entity(wayId);
74163
74164           graph.parentRelations(way)
74165               .forEach(function(parent) {
74166                   parent = parent.removeMembersWithID(wayId);
74167                   graph = graph.replace(parent);
74168
74169                   if (parent.isDegenerate()) {
74170                       graph = actionDeleteRelation(parent.id)(graph);
74171                   }
74172               });
74173
74174           uniq(way.nodes).forEach(function(nodeId) {
74175               graph = graph.replace(way.removeNode(nodeId));
74176
74177               var node = graph.entity(nodeId);
74178               if (canDeleteNode(node, graph)) {
74179                   graph = graph.remove(node);
74180               }
74181           });
74182
74183           return graph.remove(way);
74184       };
74185
74186
74187       return action;
74188   }
74189
74190   function actionDeleteMultiple(ids) {
74191       var actions = {
74192           way: actionDeleteWay,
74193           node: actionDeleteNode,
74194           relation: actionDeleteRelation
74195       };
74196
74197
74198       var action = function(graph) {
74199           ids.forEach(function(id) {
74200               if (graph.hasEntity(id)) { // It may have been deleted aready.
74201                   graph = actions[graph.entity(id).type](id)(graph);
74202               }
74203           });
74204
74205           return graph;
74206       };
74207
74208
74209       return action;
74210   }
74211
74212   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
74213   function actionDeleteRelation(relationId) {
74214
74215
74216       function canDeleteEntity(entity, graph) {
74217           return !graph.parentWays(entity).length &&
74218               !graph.parentRelations(entity).length &&
74219               !entity.hasInterestingTags();
74220       }
74221
74222
74223       var action = function(graph) {
74224           var relation = graph.entity(relationId);
74225
74226           graph.parentRelations(relation)
74227               .forEach(function(parent) {
74228                   parent = parent.removeMembersWithID(relationId);
74229                   graph = graph.replace(parent);
74230
74231                   if (parent.isDegenerate()) {
74232                       graph = actionDeleteRelation(parent.id)(graph);
74233                   }
74234               });
74235
74236           uniq(map$3(relation.members, 'id')).forEach(function(memberId) {
74237               graph = graph.replace(relation.removeMembersWithID(memberId));
74238
74239               var entity = graph.entity(memberId);
74240               if (canDeleteEntity(entity, graph)) {
74241                   graph = actionDeleteMultiple([memberId])(graph);
74242               }
74243           });
74244
74245           return graph.remove(relation);
74246       };
74247
74248
74249       return action;
74250   }
74251
74252   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
74253   function actionDeleteNode(nodeId) {
74254       var action = function(graph) {
74255           var node = graph.entity(nodeId);
74256
74257           graph.parentWays(node)
74258               .forEach(function(parent) {
74259                   parent = parent.removeNode(nodeId);
74260                   graph = graph.replace(parent);
74261
74262                   if (parent.isDegenerate()) {
74263                       graph = actionDeleteWay(parent.id)(graph);
74264                   }
74265               });
74266
74267           graph.parentRelations(node)
74268               .forEach(function(parent) {
74269                   parent = parent.removeMembersWithID(nodeId);
74270                   graph = graph.replace(parent);
74271
74272                   if (parent.isDegenerate()) {
74273                       graph = actionDeleteRelation(parent.id)(graph);
74274                   }
74275               });
74276
74277           return graph.remove(node);
74278       };
74279
74280
74281       return action;
74282   }
74283
74284   // Connect the ways at the given nodes.
74285   //
74286   // First choose a node to be the survivor, with preference given
74287   // to an existing (not new) node.
74288   //
74289   // Tags and relation memberships of of non-surviving nodes are merged
74290   // to the survivor.
74291   //
74292   // This is the inverse of `iD.actionDisconnect`.
74293   //
74294   // Reference:
74295   //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
74296   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
74297   //
74298   function actionConnect(nodeIDs) {
74299       var action = function(graph) {
74300           var survivor;
74301           var node;
74302           var parents;
74303           var i, j;
74304
74305           // Choose a survivor node, prefer an existing (not new) node - #4974
74306           for (i = 0; i < nodeIDs.length; i++) {
74307               survivor = graph.entity(nodeIDs[i]);
74308               if (survivor.version) break;  // found one
74309           }
74310
74311           // Replace all non-surviving nodes with the survivor and merge tags.
74312           for (i = 0; i < nodeIDs.length; i++) {
74313               node = graph.entity(nodeIDs[i]);
74314               if (node.id === survivor.id) continue;
74315
74316               parents = graph.parentWays(node);
74317               for (j = 0; j < parents.length; j++) {
74318                   if (!parents[j].areAdjacent(node.id, survivor.id)) {
74319                       graph = graph.replace(parents[j].replaceNode(node.id, survivor.id));
74320                   }
74321               }
74322
74323               parents = graph.parentRelations(node);
74324               for (j = 0; j < parents.length; j++) {
74325                   graph = graph.replace(parents[j].replaceMember(node, survivor));
74326               }
74327
74328               survivor = survivor.mergeTags(node.tags);
74329               graph = actionDeleteNode(node.id)(graph);
74330           }
74331
74332           graph = graph.replace(survivor);
74333
74334           return graph;
74335       };
74336
74337
74338       action.disabled = function(graph) {
74339           var seen = {};
74340           var restrictionIDs = [];
74341           var survivor;
74342           var node, way;
74343           var relations, relation, role;
74344           var i, j, k;
74345
74346           // Choose a survivor node, prefer an existing (not new) node - #4974
74347           for (i = 0; i < nodeIDs.length; i++) {
74348               survivor = graph.entity(nodeIDs[i]);
74349               if (survivor.version) break;  // found one
74350           }
74351
74352           // 1. disable if the nodes being connected have conflicting relation roles
74353           for (i = 0; i < nodeIDs.length; i++) {
74354               node = graph.entity(nodeIDs[i]);
74355               relations = graph.parentRelations(node);
74356
74357               for (j = 0; j < relations.length; j++) {
74358                   relation = relations[j];
74359                   role = relation.memberById(node.id).role || '';
74360
74361                   // if this node is a via node in a restriction, remember for later
74362                   if (relation.isValidRestriction()) {
74363                       restrictionIDs.push(relation.id);
74364                   }
74365
74366                   if (seen[relation.id] !== undefined && seen[relation.id] !== role) {
74367                       return 'relation';
74368                   } else {
74369                       seen[relation.id] = role;
74370                   }
74371               }
74372           }
74373
74374           // gather restrictions for parent ways
74375           for (i = 0; i < nodeIDs.length; i++) {
74376               node = graph.entity(nodeIDs[i]);
74377
74378               var parents = graph.parentWays(node);
74379               for (j = 0; j < parents.length; j++) {
74380                   var parent = parents[j];
74381                   relations = graph.parentRelations(parent);
74382
74383                   for (k = 0; k < relations.length; k++) {
74384                       relation = relations[k];
74385                       if (relation.isValidRestriction()) {
74386                           restrictionIDs.push(relation.id);
74387                       }
74388                   }
74389               }
74390           }
74391
74392
74393           // test restrictions
74394           restrictionIDs = uniq(restrictionIDs);
74395           for (i = 0; i < restrictionIDs.length; i++) {
74396               relation = graph.entity(restrictionIDs[i]);
74397               if (!relation.isComplete(graph)) continue;
74398
74399               var memberWays = relation.members
74400                   .filter(function(m) { return m.type === 'way'; })
74401                   .map(function(m) { return graph.entity(m.id); });
74402
74403               memberWays = uniq(memberWays);
74404               var f = relation.memberByRole('from');
74405               var t = relation.memberByRole('to');
74406               var isUturn = (f.id === t.id);
74407
74408               // 2a. disable if connection would damage a restriction
74409               // (a key node is a node at the junction of ways)
74410               var nodes = { from: [], via: [], to: [], keyfrom: [], keyto: [] };
74411               for (j = 0; j < relation.members.length; j++) {
74412                   collectNodes(relation.members[j], nodes);
74413               }
74414
74415               nodes.keyfrom = uniq(nodes.keyfrom.filter(hasDuplicates));
74416               nodes.keyto = uniq(nodes.keyto.filter(hasDuplicates));
74417
74418               var filter = keyNodeFilter(nodes.keyfrom, nodes.keyto);
74419               nodes.from = nodes.from.filter(filter);
74420               nodes.via = nodes.via.filter(filter);
74421               nodes.to = nodes.to.filter(filter);
74422
74423               var connectFrom = false;
74424               var connectVia = false;
74425               var connectTo = false;
74426               var connectKeyFrom = false;
74427               var connectKeyTo = false;
74428
74429               for (j = 0; j < nodeIDs.length; j++) {
74430                   var n = nodeIDs[j];
74431                   if (nodes.from.indexOf(n) !== -1)    { connectFrom = true; }
74432                   if (nodes.via.indexOf(n) !== -1)     { connectVia = true; }
74433                   if (nodes.to.indexOf(n) !== -1)      { connectTo = true; }
74434                   if (nodes.keyfrom.indexOf(n) !== -1) { connectKeyFrom = true; }
74435                   if (nodes.keyto.indexOf(n) !== -1)   { connectKeyTo = true; }
74436               }
74437               if (connectFrom && connectTo && !isUturn) { return 'restriction'; }
74438               if (connectFrom && connectVia) { return 'restriction'; }
74439               if (connectTo   && connectVia) { return 'restriction'; }
74440
74441               // connecting to a key node -
74442               // if both nodes are on a member way (i.e. part of the turn restriction),
74443               // the connecting node must be adjacent to the key node.
74444               if (connectKeyFrom || connectKeyTo) {
74445                   if (nodeIDs.length !== 2) { return 'restriction'; }
74446
74447                   var n0 = null;
74448                   var n1 = null;
74449                   for (j = 0; j < memberWays.length; j++) {
74450                       way = memberWays[j];
74451                       if (way.contains(nodeIDs[0])) { n0 = nodeIDs[0]; }
74452                       if (way.contains(nodeIDs[1])) { n1 = nodeIDs[1]; }
74453                   }
74454
74455                   if (n0 && n1) {    // both nodes are part of the restriction
74456                       var ok = false;
74457                       for (j = 0; j < memberWays.length; j++) {
74458                           way = memberWays[j];
74459                           if (way.areAdjacent(n0, n1)) {
74460                               ok = true;
74461                               break;
74462                           }
74463                       }
74464                       if (!ok) {
74465                           return 'restriction';
74466                       }
74467                   }
74468               }
74469
74470               // 2b. disable if nodes being connected will destroy a member way in a restriction
74471               // (to test, make a copy and try actually connecting the nodes)
74472               for (j = 0; j < memberWays.length; j++) {
74473                   way = memberWays[j].update({});   // make copy
74474                   for (k = 0; k < nodeIDs.length; k++) {
74475                       if (nodeIDs[k] === survivor.id) continue;
74476
74477                       if (way.areAdjacent(nodeIDs[k], survivor.id)) {
74478                           way = way.removeNode(nodeIDs[k]);
74479                       } else {
74480                           way = way.replaceNode(nodeIDs[k], survivor.id);
74481                       }
74482                   }
74483                   if (way.isDegenerate()) {
74484                       return 'restriction';
74485                   }
74486               }
74487           }
74488
74489           return false;
74490
74491
74492           // if a key node appears multiple times (indexOf !== lastIndexOf) it's a FROM-VIA or TO-VIA junction
74493           function hasDuplicates(n, i, arr) {
74494               return arr.indexOf(n) !== arr.lastIndexOf(n);
74495           }
74496
74497           function keyNodeFilter(froms, tos) {
74498               return function(n) {
74499                   return froms.indexOf(n) === -1 && tos.indexOf(n) === -1;
74500               };
74501           }
74502
74503           function collectNodes(member, collection) {
74504               var entity = graph.hasEntity(member.id);
74505               if (!entity) return;
74506
74507               var role = member.role || '';
74508               if (!collection[role]) {
74509                   collection[role] = [];
74510               }
74511
74512               if (member.type === 'node') {
74513                   collection[role].push(member.id);
74514                   if (role === 'via') {
74515                       collection.keyfrom.push(member.id);
74516                       collection.keyto.push(member.id);
74517                   }
74518
74519               } else if (member.type === 'way') {
74520                   collection[role].push.apply(collection[role], entity.nodes);
74521                   if (role === 'from' || role === 'via') {
74522                       collection.keyfrom.push(entity.first());
74523                       collection.keyfrom.push(entity.last());
74524                   }
74525                   if (role === 'to' || role === 'via') {
74526                       collection.keyto.push(entity.first());
74527                       collection.keyto.push(entity.last());
74528                   }
74529               }
74530           }
74531       };
74532
74533
74534       return action;
74535   }
74536
74537   function actionCopyEntities(ids, fromGraph) {
74538       var copies = {};
74539
74540
74541       var action = function(graph) {
74542           ids.forEach(function(id) {
74543               fromGraph.entity(id).copy(fromGraph, copies);
74544           });
74545
74546           for (var id in copies) {
74547               graph = graph.replace(copies[id]);
74548           }
74549
74550           return graph;
74551       };
74552
74553
74554       action.copies = function() {
74555           return copies;
74556       };
74557
74558
74559       return action;
74560   }
74561
74562   function actionDeleteMember(relationId, memberIndex) {
74563       return function(graph) {
74564           var relation = graph.entity(relationId)
74565               .removeMember(memberIndex);
74566
74567           graph = graph.replace(relation);
74568
74569           if (relation.isDegenerate())
74570               graph = actionDeleteRelation(relation.id)(graph);
74571
74572           return graph;
74573       };
74574   }
74575
74576   function actionDeprecateTags(entityId) {
74577
74578       return function(graph) {
74579           var entity = graph.entity(entityId),
74580               newtags = clone(entity.tags),
74581               change = false,
74582               rule;
74583
74584           // This handles dataDeprecated tags with a single condition
74585           for (var i = 0; i < dataDeprecated.length; i++) {
74586
74587               rule = dataDeprecated[i];
74588               var match = toPairs(rule.old)[0],
74589                   replacements = rule.replace ? toPairs(rule.replace) : null;
74590
74591               if (entity.tags[match[0]] && match[1] === '*') {
74592
74593                   var value = entity.tags[match[0]];
74594                   if (replacements && !newtags[replacements[0][0]]) {
74595                       newtags[replacements[0][0]] = value;
74596                   }
74597                   delete newtags[match[0]];
74598                   change = true;
74599
74600               } else if (entity.tags[match[0]] === match[1]) {
74601                   newtags = assign({}, rule.replace || {}, omit(newtags, match[0]));
74602                   change = true;
74603               }
74604           }
74605
74606           if (change) {
74607               return graph.replace(entity.update({tags: newtags}));
74608           } else {
74609               return graph;
74610           }
74611       };
74612   }
74613
74614   function actionDiscardTags(difference) {
74615
74616       return function(graph) {
74617           function discardTags(entity) {
74618               var tags = {};
74619               var keys = Object.keys(entity.tags);
74620               var discarded = false;
74621
74622               for (var i = 0; i < keys.length; i++) {
74623                   var k = keys[i];
74624                   if (dataDiscarded[k] || !entity.tags[k]) {
74625                       discarded = true;
74626                   } else {
74627                       tags[k] = entity.tags[k];
74628                   }
74629               }
74630
74631               if (discarded) {
74632                   graph = graph.replace(entity.update({ tags: tags }));
74633               }
74634           }
74635
74636           difference.modified().forEach(discardTags);
74637           difference.created().forEach(discardTags);
74638
74639           return graph;
74640       };
74641   }
74642
74643   // Disconect the ways at the given node.
74644   //
74645   // Optionally, disconnect only the given ways.
74646   //
74647   // For testing convenience, accepts an ID to assign to the (first) new node.
74648   // Normally, this will be undefined and the way will automatically
74649   // be assigned a new ID.
74650   //
74651   // This is the inverse of `iD.actionConnect`.
74652   //
74653   // Reference:
74654   //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
74655   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
74656   //
74657   function actionDisconnect(nodeId, newNodeId) {
74658       var wayIds;
74659
74660
74661       var action = function(graph) {
74662           var node = graph.entity(nodeId);
74663           var connections = action.connections(graph);
74664
74665           connections.forEach(function(connection) {
74666               var way = graph.entity(connection.wayID);
74667               var newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
74668
74669               graph = graph.replace(newNode);
74670               if (connection.index === 0 && way.isArea()) {
74671                   // replace shared node with shared node..
74672                   graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
74673               } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
74674                   // replace closing node with new new node..
74675                   graph = graph.replace(way.unclose().addNode(newNode.id));
74676               } else {
74677                   // replace shared node with multiple new nodes..
74678                   graph = graph.replace(way.updateNode(newNode.id, connection.index));
74679               }
74680           });
74681
74682           return graph;
74683       };
74684
74685
74686       action.connections = function(graph) {
74687           var candidates = [];
74688           var keeping = false;
74689           var parentWays = graph.parentWays(graph.entity(nodeId));
74690
74691           parentWays.forEach(function(way) {
74692               if (wayIds && wayIds.indexOf(way.id) === -1) {
74693                   keeping = true;
74694                   return;
74695               }
74696               if (way.isArea() && (way.nodes[0] === nodeId)) {
74697                   candidates.push({ wayID: way.id, index: 0 });
74698               } else {
74699                   way.nodes.forEach(function(waynode, index) {
74700                       if (waynode === nodeId) {
74701                           candidates.push({ wayID: way.id, index: index });
74702                       }
74703                   });
74704               }
74705           });
74706
74707           return keeping ? candidates : candidates.slice(1);
74708       };
74709
74710
74711       action.disabled = function(graph) {
74712           var connections = action.connections(graph);
74713           if (connections.length === 0 || (wayIds && wayIds.length !== connections.length))
74714               return 'not_connected';
74715
74716           var parentWays = graph.parentWays(graph.entity(nodeId));
74717           var seenRelationIds = {};
74718           var sharedRelation;
74719
74720           parentWays.forEach(function(way) {
74721               if (wayIds && wayIds.indexOf(way.id) === -1)
74722                   return;
74723
74724               var relations = graph.parentRelations(way);
74725               relations.forEach(function(relation) {
74726                   if (relation.id in seenRelationIds) {
74727                       sharedRelation = relation;
74728                   } else {
74729                       seenRelationIds[relation.id] = true;
74730                   }
74731               });
74732           });
74733
74734           if (sharedRelation)
74735               return 'relation';
74736       };
74737
74738
74739       action.limitWays = function(_) {
74740           if (!arguments.length) return wayIds;
74741           wayIds = _;
74742           return action;
74743       };
74744
74745
74746       return action;
74747   }
74748
74749   // Join ways at the end node they share.
74750   //
74751   // This is the inverse of `iD.actionSplit`.
74752   //
74753   // Reference:
74754   //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
74755   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
74756   //
74757   function actionJoin(ids) {
74758
74759       function groupEntitiesByGeometry(graph) {
74760           var entities = ids.map(function(id) { return graph.entity(id); });
74761           return assignIn({line: []}, groupBy(entities, function(entity) { return entity.geometry(graph); }));
74762       }
74763
74764
74765       var action = function(graph) {
74766           var ways = ids.map(graph.entity, graph);
74767           var survivorID = ways[0].id;
74768
74769           // Prefer to keep an existing way.
74770           for (var i = 0; i < ways.length; i++) {
74771               if (!ways[i].isNew()) {
74772                   survivorID = ways[i].id;
74773                   break;
74774               }
74775           }
74776
74777           var sequences = osmJoinWays(ways, graph);
74778           var joined = sequences[0];
74779
74780           // We might need to reverse some of these ways before joining them.  #4688
74781           // `joined.actions` property will contain any actions we need to apply.
74782           graph = sequences.actions.reduce(function(g, action) { return action(g); }, graph);
74783
74784           var survivor = graph.entity(survivorID);
74785           survivor = survivor.update({ nodes: joined.nodes.map(function(n) { return n.id; }) });
74786           graph = graph.replace(survivor);
74787
74788           joined.forEach(function(way) {
74789               if (way.id === survivorID) return;
74790
74791               graph.parentRelations(way).forEach(function(parent) {
74792                   graph = graph.replace(parent.replaceMember(way, survivor));
74793               });
74794
74795               survivor = survivor.mergeTags(way.tags);
74796
74797               graph = graph.replace(survivor);
74798               graph = actionDeleteWay(way.id)(graph);
74799           });
74800
74801           return graph;
74802       };
74803
74804
74805       action.disabled = function(graph) {
74806           var geometries = groupEntitiesByGeometry(graph);
74807           if (ids.length < 2 || ids.length !== geometries.line.length)
74808               return 'not_eligible';
74809
74810           var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
74811           if (joined.length > 1)
74812               return 'not_adjacent';
74813
74814           var nodeIds = joined[0].nodes.map(function(n) { return n.id; }).slice(1, -1);
74815           var relation;
74816           var tags = {};
74817           var conflicting = false;
74818
74819           joined[0].forEach(function(way) {
74820               var parents = graph.parentRelations(way);
74821               parents.forEach(function(parent) {
74822                   if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; }))
74823                       relation = parent;
74824               });
74825
74826               for (var k in way.tags) {
74827                   if (!(k in tags)) {
74828                       tags[k] = way.tags[k];
74829                   } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
74830                       conflicting = true;
74831                   }
74832               }
74833           });
74834
74835           if (relation)
74836               return 'restriction';
74837
74838           if (conflicting)
74839               return 'conflicting_tags';
74840       };
74841
74842
74843       return action;
74844   }
74845
74846   function actionMerge(ids) {
74847
74848       function groupEntitiesByGeometry(graph) {
74849           var entities = ids.map(function(id) { return graph.entity(id); });
74850           return assignIn({point: [], area: [], line: [], relation: []},
74851               groupBy(entities, function(entity) { return entity.geometry(graph); }));
74852       }
74853
74854
74855       var action = function(graph) {
74856           var geometries = groupEntitiesByGeometry(graph),
74857               target = geometries.area[0] || geometries.line[0],
74858               points = geometries.point;
74859
74860           points.forEach(function(point) {
74861               target = target.mergeTags(point.tags);
74862               graph = graph.replace(target);
74863
74864               graph.parentRelations(point).forEach(function(parent) {
74865                   graph = graph.replace(parent.replaceMember(point, target));
74866               });
74867
74868               var nodes = uniq(graph.childNodes(target)),
74869                   removeNode = point;
74870
74871               for (var i = 0; i < nodes.length; i++) {
74872                   var node = nodes[i];
74873                   if (graph.parentWays(node).length > 1 ||
74874                       graph.parentRelations(node).length ||
74875                       node.hasInterestingTags()) {
74876                       continue;
74877                   }
74878
74879                   // Found an uninteresting child node on the target way.
74880                   // Move orig point into its place to preserve point's history. #3683
74881                   graph = graph.replace(point.update({ tags: {}, loc: node.loc }));
74882                   target = target.replaceNode(node.id, point.id);
74883                   graph = graph.replace(target);
74884                   removeNode = node;
74885                   break;
74886               }
74887
74888               graph = graph.remove(removeNode);
74889           });
74890
74891           return graph;
74892       };
74893
74894
74895       action.disabled = function(graph) {
74896           var geometries = groupEntitiesByGeometry(graph);
74897           if (geometries.point.length === 0 ||
74898               (geometries.area.length + geometries.line.length) !== 1 ||
74899               geometries.relation.length !== 0)
74900               return 'not_eligible';
74901       };
74902
74903
74904       return action;
74905   }
74906
74907   function actionMergePolygon(ids, newRelationId) {
74908
74909       function groupEntities(graph) {
74910           var entities = ids.map(function (id) { return graph.entity(id); });
74911           return assignIn({
74912                   closedWay: [],
74913                   multipolygon: [],
74914                   other: []
74915               }, groupBy(entities, function(entity) {
74916                   if (entity.type === 'way' && entity.isClosed()) {
74917                       return 'closedWay';
74918                   } else if (entity.type === 'relation' && entity.isMultipolygon()) {
74919                       return 'multipolygon';
74920                   } else {
74921                       return 'other';
74922                   }
74923               }));
74924       }
74925
74926
74927       var action = function(graph) {
74928           var entities = groupEntities(graph);
74929
74930           // An array representing all the polygons that are part of the multipolygon.
74931           //
74932           // Each element is itself an array of objects with an id property, and has a
74933           // locs property which is an array of the locations forming the polygon.
74934           var polygons = entities.multipolygon.reduce(function(polygons, m) {
74935               return polygons.concat(osmJoinWays(m.members, graph));
74936           }, []).concat(entities.closedWay.map(function(d) {
74937               var member = [{id: d.id}];
74938               member.nodes = graph.childNodes(d);
74939               return member;
74940           }));
74941
74942           // contained is an array of arrays of boolean values,
74943           // where contained[j][k] is true iff the jth way is
74944           // contained by the kth way.
74945           var contained = polygons.map(function(w, i) {
74946               return polygons.map(function(d, n) {
74947                   if (i === n) return null;
74948                   return geoPolygonContainsPolygon(
74949                       map$3(d.nodes, 'loc'),
74950                       map$3(w.nodes, 'loc'));
74951               });
74952           });
74953
74954           // Sort all polygons as either outer or inner ways
74955           var members = [],
74956               outer = true;
74957
74958           while (polygons.length) {
74959               extractUncontained(polygons);
74960               polygons = polygons.filter(isContained);
74961               contained = contained.filter(isContained).map(filterContained);
74962           }
74963
74964           function isContained(d, i) {
74965               return some(contained[i]);
74966           }
74967
74968           function filterContained(d) {
74969               return d.filter(isContained);
74970           }
74971
74972           function extractUncontained(polygons) {
74973               polygons.forEach(function(d, i) {
74974                   if (!isContained(d, i)) {
74975                       d.forEach(function(member) {
74976                           members.push({
74977                               type: 'way',
74978                               id: member.id,
74979                               role: outer ? 'outer' : 'inner'
74980                           });
74981                       });
74982                   }
74983               });
74984               outer = !outer;
74985           }
74986
74987           // Move all tags to one relation
74988           var relation = entities.multipolygon[0] ||
74989               osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
74990
74991           entities.multipolygon.slice(1).forEach(function(m) {
74992               relation = relation.mergeTags(m.tags);
74993               graph = graph.remove(m);
74994           });
74995
74996           entities.closedWay.forEach(function(way) {
74997               function isThisOuter(m) {
74998                   return m.id === way.id && m.role !== 'inner';
74999               }
75000               if (members.some(isThisOuter)) {
75001                   relation = relation.mergeTags(way.tags);
75002                   graph = graph.replace(way.update({ tags: {} }));
75003               }
75004           });
75005
75006           return graph.replace(relation.update({
75007               members: members,
75008               tags: omit(relation.tags, 'area')
75009           }));
75010       };
75011
75012
75013       action.disabled = function(graph) {
75014           var entities = groupEntities(graph);
75015           if (entities.other.length > 0 ||
75016               entities.closedWay.length + entities.multipolygon.length < 2)
75017               return 'not_eligible';
75018           if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
75019               return 'incomplete_relation';
75020       };
75021
75022
75023       return action;
75024   }
75025
75026   // Text diff algorithm following Hunt and McIlroy 1976.
75027   // J. W. Hunt and M. D. McIlroy, An algorithm for differential file
75028   // comparison, Bell Telephone Laboratories CSTR #41 (1976)
75029   // http://www.cs.dartmouth.edu/~doug/
75030   //
75031   // Expects two arrays of strings.
75032   function LCS(file1, file2) {
75033     var equivalenceClasses;
75034     var file2indices;
75035     var newCandidate;
75036     var candidates;
75037     var line;
75038     var c, i, j, jX, r, s;
75039
75040     equivalenceClasses = {};
75041     for (j = 0; j < file2.length; j++) {
75042       line = file2[j];
75043       if (equivalenceClasses[line]) {
75044         equivalenceClasses[line].push(j);
75045       } else {
75046         equivalenceClasses[line] = [j];
75047       }
75048     }
75049
75050     candidates = [
75051       { file1index: -1, file2index: -1, chain: null }
75052     ];
75053
75054     for (i = 0; i < file1.length; i++) {
75055       line = file1[i];
75056       file2indices = equivalenceClasses[line] || [];
75057
75058       r = 0;
75059       c = candidates[0];
75060
75061       for (jX = 0; jX < file2indices.length; jX++) {
75062         j = file2indices[jX];
75063
75064         for (s = r; s < candidates.length; s++) {
75065           if ((candidates[s].file2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].file2index > j))) {
75066             break;
75067           }
75068         }
75069
75070         if (s < candidates.length) {
75071           newCandidate = { file1index: i, file2index: j, chain: candidates[s] };
75072           if (r === candidates.length) {
75073             candidates.push(c);
75074           } else {
75075             candidates[r] = c;
75076           }
75077           r = s + 1;
75078           c = newCandidate;
75079           if (r === candidates.length) {
75080             break; // no point in examining further (j)s
75081           }
75082         }
75083       }
75084
75085       candidates[r] = c;
75086     }
75087
75088     // At this point, we know the LCS: it's in the reverse of the
75089     // linked-list through .chain of candidates[candidates.length - 1].
75090
75091     return candidates[candidates.length - 1];
75092   }
75093
75094
75095   // We apply the LCS to give a simple representation of the
75096   // offsets and lengths of mismatched chunks in the input
75097   // files. This is used by diff3MergeIndices below.
75098   function diffIndices(file1, file2) {
75099     var result = [];
75100     var tail1 = file1.length;
75101     var tail2 = file2.length;
75102
75103     for (var candidate = LCS(file1, file2);
75104        candidate !== null;
75105        candidate = candidate.chain)
75106     {
75107       var mismatchLength1 = tail1 - candidate.file1index - 1;
75108       var mismatchLength2 = tail2 - candidate.file2index - 1;
75109       tail1 = candidate.file1index;
75110       tail2 = candidate.file2index;
75111
75112       if (mismatchLength1 || mismatchLength2) {
75113         result.push({
75114           file1: [tail1 + 1, mismatchLength1],
75115           file2: [tail2 + 1, mismatchLength2]
75116         });
75117       }
75118     }
75119
75120     result.reverse();
75121     return result;
75122   }
75123
75124
75125   // Given three files, A, O, and B, where both A and B are
75126   // independently derived from O, returns a fairly complicated
75127   // internal representation of merge decisions it's taken. The
75128   // interested reader may wish to consult
75129   //
75130   // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
75131   // 'A Formal Investigation of ' In Arvind and Prasad,
75132   // editors, Foundations of Software Technology and Theoretical
75133   // Computer Science (FSTTCS), December 2007.
75134   //
75135   // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
75136   function diff3MergeIndices(a, o, b) {
75137     var i;
75138     var m1 = diffIndices(o, a);
75139     var m2 = diffIndices(o, b);
75140
75141     var hunks = [];
75142     function addHunk(h, side) {
75143       hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
75144     }
75145     for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); }
75146     for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); }
75147     hunks.sort(function (x, y) { return x[0] - y[0]; });
75148
75149     var result = [];
75150     var commonOffset = 0;
75151     function copyCommon(targetOffset) {
75152       if (targetOffset > commonOffset) {
75153         result.push([1, commonOffset, targetOffset - commonOffset]);
75154         commonOffset = targetOffset;
75155       }
75156     }
75157
75158     for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) {
75159       var firstHunkIndex = hunkIndex;
75160       var hunk = hunks[hunkIndex];
75161       var regionLhs = hunk[0];
75162       var regionRhs = regionLhs + hunk[2];
75163       while (hunkIndex < hunks.length - 1) {
75164         var maybeOverlapping = hunks[hunkIndex + 1];
75165         var maybeLhs = maybeOverlapping[0];
75166         if (maybeLhs > regionRhs) {
75167           break;
75168         }
75169         regionRhs = Math.max(regionRhs, maybeLhs + maybeOverlapping[2]);
75170         hunkIndex++;
75171       }
75172
75173       copyCommon(regionLhs);
75174       if (firstHunkIndex === hunkIndex) {
75175         // The 'overlap' was only one hunk long, meaning that
75176         // there's no conflict here. Either a and o were the
75177         // same, or b and o were the same.
75178         if (hunk[4] > 0) {
75179           result.push([hunk[1], hunk[3], hunk[4]]);
75180         }
75181       } else {
75182         // A proper conflict. Determine the extents of the
75183         // regions involved from a, o and b. Effectively merge
75184         // all the hunks on the left into one giant hunk, and
75185         // do the same for the right; then, correct for skew
75186         // in the regions of o that each side changed, and
75187         // report appropriate spans for the three sides.
75188         var regions = {
75189           0: [a.length, -1, o.length, -1],
75190           2: [b.length, -1, o.length, -1]
75191         };
75192         for (i = firstHunkIndex; i <= hunkIndex; i++) {
75193           hunk = hunks[i];
75194           var side = hunk[1];
75195           var r = regions[side];
75196           var oLhs = hunk[0];
75197           var oRhs = oLhs + hunk[2];
75198           var abLhs = hunk[3];
75199           var abRhs = abLhs + hunk[4];
75200           r[0] = Math.min(abLhs, r[0]);
75201           r[1] = Math.max(abRhs, r[1]);
75202           r[2] = Math.min(oLhs, r[2]);
75203           r[3] = Math.max(oRhs, r[3]);
75204         }
75205         var aLhs = regions[0][0] + (regionLhs - regions[0][2]);
75206         var aRhs = regions[0][1] + (regionRhs - regions[0][3]);
75207         var bLhs = regions[2][0] + (regionLhs - regions[2][2]);
75208         var bRhs = regions[2][1] + (regionRhs - regions[2][3]);
75209         result.push([-1,
75210                      aLhs,      aRhs      - aLhs,
75211                      regionLhs, regionRhs - regionLhs,
75212                      bLhs,      bRhs      - bLhs]);
75213       }
75214       commonOffset = regionRhs;
75215     }
75216
75217     copyCommon(o.length);
75218     return result;
75219   }
75220
75221
75222   // Applies the output of diff3MergeIndices to actually
75223   // construct the merged file; the returned result alternates
75224   // between 'ok' and 'conflict' blocks.
75225   function diff3Merge(a, o, b, excludeFalseConflicts) {
75226     var result = [];
75227     var files = [a, o, b];
75228     var indices = diff3MergeIndices(a, o, b);
75229
75230     var okLines = [];
75231     function flushOk() {
75232       if (okLines.length) {
75233         result.push({ok: okLines});
75234       }
75235       okLines = [];
75236     }
75237     function pushOk(xs) {
75238       for (var j = 0; j < xs.length; j++) {
75239         okLines.push(xs[j]);
75240       }
75241     }
75242
75243     function isTrueConflict(rec) {
75244       if (rec[2] !== rec[6]) return true;
75245       var aoff = rec[1];
75246       var boff = rec[5];
75247       for (var j = 0; j < rec[2]; j++) {
75248         if (a[j + aoff] !== b[j + boff]) {
75249           return true;
75250         }
75251       }
75252       return false;
75253     }
75254
75255     for (var i = 0; i < indices.length; i++) {
75256       var x = indices[i];
75257       var side = x[0];
75258       if (side === -1) {
75259         if (excludeFalseConflicts && !isTrueConflict(x)) {
75260           pushOk(files[0].slice(x[1], x[1] + x[2]));
75261         } else {
75262           flushOk();
75263           result.push({
75264             conflict: {
75265               a: a.slice(x[1], x[1] + x[2]),
75266               aIndex: x[1],
75267               o: o.slice(x[3], x[3] + x[4]),
75268               oIndex: x[3],
75269               b: b.slice(x[5], x[5] + x[6]),
75270               bIndex: x[5]
75271             }
75272           });
75273         }
75274       } else {
75275         pushOk(files[side].slice(x[1], x[1] + x[2]));
75276       }
75277     }
75278
75279     flushOk();
75280     return result;
75281   }
75282
75283   function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
75284       var _option = 'safe';  // 'safe', 'force_local', 'force_remote'
75285       var _conflicts = [];
75286
75287
75288       function user(d) {
75289           return isFunction(formatUser) ? formatUser(d) : d;
75290       }
75291
75292
75293       function mergeLocation(remote, target) {
75294           function pointEqual(a, b) {
75295               var epsilon = 1e-6;
75296               return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon);
75297           }
75298
75299           if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) {
75300               return target;
75301           }
75302           if (_option === 'force_remote') {
75303               return target.update({loc: remote.loc});
75304           }
75305
75306           _conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
75307           return target;
75308       }
75309
75310
75311       function mergeNodes(base, remote, target) {
75312           if (_option === 'force_local' || isEqual(target.nodes, remote.nodes)) {
75313               return target;
75314           }
75315           if (_option === 'force_remote') {
75316               return target.update({nodes: remote.nodes});
75317           }
75318
75319           var ccount = _conflicts.length;
75320           var o = base.nodes || [];
75321           var a = target.nodes || [];
75322           var b = remote.nodes || [];
75323           var nodes = [];
75324           var hunks = diff3Merge(a, o, b, true);
75325
75326           for (var i = 0; i < hunks.length; i++) {
75327               var hunk = hunks[i];
75328               if (hunk.ok) {
75329                   nodes.push.apply(nodes, hunk.ok);
75330               } else {
75331                   // for all conflicts, we can assume c.a !== c.b
75332                   // because `diff3Merge` called with `true` option to exclude false conflicts..
75333                   var c = hunk.conflict;
75334                   if (isEqual(c.o, c.a)) {  // only changed remotely
75335                       nodes.push.apply(nodes, c.b);
75336                   } else if (isEqual(c.o, c.b)) {  // only changed locally
75337                       nodes.push.apply(nodes, c.a);
75338                   } else {       // changed both locally and remotely
75339                       _conflicts.push(t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) }));
75340                       break;
75341                   }
75342               }
75343           }
75344
75345           return (_conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
75346       }
75347
75348
75349       function mergeChildren(targetWay, children, updates, graph) {
75350           function isUsed(node, targetWay) {
75351               var parentWays = map$3(graph.parentWays(node), 'id');
75352               return node.hasInterestingTags() ||
75353                   without(parentWays, targetWay.id).length > 0 ||
75354                   graph.parentRelations(node).length > 0;
75355           }
75356
75357           var ccount = _conflicts.length;
75358
75359           for (var i = 0; i < children.length; i++) {
75360               var id = children[i];
75361               var node = graph.hasEntity(id);
75362
75363               // remove unused childNodes..
75364               if (targetWay.nodes.indexOf(id) === -1) {
75365                   if (node && !isUsed(node, targetWay)) {
75366                       updates.removeIds.push(id);
75367                   }
75368                   continue;
75369               }
75370
75371               // restore used childNodes..
75372               var local = localGraph.hasEntity(id);
75373               var remote = remoteGraph.hasEntity(id);
75374               var target;
75375
75376               if (_option === 'force_remote' && remote && remote.visible) {
75377                   updates.replacements.push(remote);
75378
75379               } else if (_option === 'force_local' && local) {
75380                   target = osmEntity$$1(local);
75381                   if (remote) {
75382                       target = target.update({ version: remote.version });
75383                   }
75384                   updates.replacements.push(target);
75385
75386               } else if (_option === 'safe' && local && remote && local.version !== remote.version) {
75387                   target = osmEntity$$1(local, { version: remote.version });
75388                   if (remote.visible) {
75389                       target = mergeLocation(remote, target);
75390                   } else {
75391                       _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
75392                   }
75393
75394                   if (_conflicts.length !== ccount) break;
75395                   updates.replacements.push(target);
75396               }
75397           }
75398
75399           return targetWay;
75400       }
75401
75402
75403       function updateChildren(updates, graph) {
75404           for (var i = 0; i < updates.replacements.length; i++) {
75405               graph = graph.replace(updates.replacements[i]);
75406           }
75407           if (updates.removeIds.length) {
75408               graph = actionDeleteMultiple(updates.removeIds)(graph);
75409           }
75410           return graph;
75411       }
75412
75413
75414       function mergeMembers(remote, target) {
75415           if (_option === 'force_local' || isEqual(target.members, remote.members)) {
75416               return target;
75417           }
75418           if (_option === 'force_remote') {
75419               return target.update({members: remote.members});
75420           }
75421
75422           _conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
75423           return target;
75424       }
75425
75426
75427       function mergeTags(base, remote, target) {
75428           function ignoreKey(k) {
75429               return dataDiscarded[k];
75430           }
75431
75432           if (_option === 'force_local' || isEqual(target.tags, remote.tags)) {
75433               return target;
75434           }
75435           if (_option === 'force_remote') {
75436               return target.update({tags: remote.tags});
75437           }
75438
75439           var ccount = _conflicts.length;
75440           var o = base.tags || {};
75441           var a = target.tags || {};
75442           var b = remote.tags || {};
75443           var keys = reject(union(keys$1(o), keys$1(a), keys$1(b)), ignoreKey);
75444           var tags = clone(a);
75445           var changed = false;
75446
75447           for (var i = 0; i < keys.length; i++) {
75448               var k = keys[i];
75449
75450               if (o[k] !== b[k] && a[k] !== b[k]) {    // changed remotely..
75451                   if (o[k] !== a[k]) {      // changed locally..
75452                       _conflicts.push(t('merge_remote_changes.conflict.tags',
75453                           { tag: k, local: a[k], remote: b[k], user: user(remote.user) }));
75454
75455                   } else {                  // unchanged locally, accept remote change..
75456                       if (b.hasOwnProperty(k)) {
75457                           tags[k] = b[k];
75458                       } else {
75459                           delete tags[k];
75460                       }
75461                       changed = true;
75462                   }
75463               }
75464           }
75465
75466           return (changed && _conflicts.length === ccount) ? target.update({tags: tags}) : target;
75467       }
75468
75469
75470       //  `graph.base()` is the common ancestor of the two graphs.
75471       //  `localGraph` contains user's edits up to saving
75472       //  `remoteGraph` contains remote edits to modified nodes
75473       //  `graph` must be a descendent of `localGraph` and may include
75474       //      some conflict resolution actions performed on it.
75475       //
75476       //                  --- ... --- `localGraph` -- ... -- `graph`
75477       //                 /
75478       //  `graph.base()` --- ... --- `remoteGraph`
75479       //
75480       var action = function(graph) {
75481           var updates = { replacements: [], removeIds: [] };
75482           var base = graph.base().entities[id];
75483           var local = localGraph.entity(id);
75484           var remote = remoteGraph.entity(id);
75485           var target = osmEntity$$1(local, { version: remote.version });
75486
75487           // delete/undelete
75488           if (!remote.visible) {
75489               if (_option === 'force_remote') {
75490                   return actionDeleteMultiple([id])(graph);
75491
75492               } else if (_option === 'force_local') {
75493                   if (target.type === 'way') {
75494                       target = mergeChildren(target, uniq(local.nodes), updates, graph);
75495                       graph = updateChildren(updates, graph);
75496                   }
75497                   return graph.replace(target);
75498
75499               } else {
75500                   _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
75501                   return graph;  // do nothing
75502               }
75503           }
75504
75505           // merge
75506           if (target.type === 'node') {
75507               target = mergeLocation(remote, target);
75508
75509           } else if (target.type === 'way') {
75510               // pull in any child nodes that may not be present locally..
75511               graph.rebase(remoteGraph.childNodes(remote), [graph], false);
75512               target = mergeNodes(base, remote, target);
75513               target = mergeChildren(target, union(local.nodes, remote.nodes), updates, graph);
75514
75515           } else if (target.type === 'relation') {
75516               target = mergeMembers(remote, target);
75517           }
75518
75519           target = mergeTags(base, remote, target);
75520
75521           if (!_conflicts.length) {
75522               graph = updateChildren(updates, graph).replace(target);
75523           }
75524
75525           return graph;
75526       };
75527
75528
75529       action.withOption = function(opt) {
75530           _option = opt;
75531           return action;
75532       };
75533
75534
75535       action.conflicts = function() {
75536           return _conflicts;
75537       };
75538
75539
75540       return action;
75541   }
75542
75543   // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
75544   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
75545   function actionMove(moveIds, tryDelta, projection, cache) {
75546       var _delta = tryDelta;
75547
75548       function setupCache(graph) {
75549           function canMove(nodeId) {
75550               // Allow movement of any node that is in the selectedIDs list..
75551               if (moveIds.indexOf(nodeId) !== -1) return true;
75552
75553               // Allow movement of a vertex where 2 ways meet..
75554               var parents = map$3(graph.parentWays(graph.entity(nodeId)), 'id');
75555               if (parents.length < 3) return true;
75556
75557               // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
75558               var parentsMoving = every(parents, function(id) { return cache.moving[id]; });
75559               if (!parentsMoving) delete cache.moving[nodeId];
75560
75561               return parentsMoving;
75562           }
75563
75564           function cacheEntities(ids) {
75565               for (var i = 0; i < ids.length; i++) {
75566                   var id = ids[i];
75567                   if (cache.moving[id]) continue;
75568                   cache.moving[id] = true;
75569
75570                   var entity = graph.hasEntity(id);
75571                   if (!entity) continue;
75572
75573                   if (entity.type === 'node') {
75574                       cache.nodes.push(id);
75575                       cache.startLoc[id] = entity.loc;
75576                   } else if (entity.type === 'way') {
75577                       cache.ways.push(id);
75578                       cacheEntities(entity.nodes);
75579                   } else {
75580                       cacheEntities(entity.members.map(function(member) {
75581                           return member.id;
75582                       }));
75583                   }
75584               }
75585           }
75586
75587           function cacheIntersections(ids) {
75588               function isEndpoint(way, id) {
75589                   return !way.isClosed() && !!way.affix(id);
75590               }
75591
75592               for (var i = 0; i < ids.length; i++) {
75593                   var id = ids[i];
75594
75595                   // consider only intersections with 1 moved and 1 unmoved way.
75596                   var childNodes = graph.childNodes(graph.entity(id));
75597                   for (var j = 0; j < childNodes.length; j++) {
75598                       var node = childNodes[j];
75599                       var parents = graph.parentWays(node);
75600                       if (parents.length !== 2) continue;
75601
75602                       var moved = graph.entity(id);
75603                       var unmoved = null;
75604                       for (var k = 0; k < parents.length; k++) {
75605                           var way = parents[k];
75606                           if (!cache.moving[way.id]) {
75607                               unmoved = way;
75608                               break;
75609                           }
75610                       }
75611                       if (!unmoved) continue;
75612
75613                       // exclude ways that are overly connected..
75614                       if (intersection(moved.nodes, unmoved.nodes).length > 2) continue;
75615                       if (moved.isArea() || unmoved.isArea()) continue;
75616
75617                       cache.intersections.push({
75618                           nodeId: node.id,
75619                           movedId: moved.id,
75620                           unmovedId: unmoved.id,
75621                           movedIsEP: isEndpoint(moved, node.id),
75622                           unmovedIsEP: isEndpoint(unmoved, node.id)
75623                       });
75624                   }
75625               }
75626           }
75627
75628
75629           if (!cache) {
75630               cache = {};
75631           }
75632           if (!cache.ok) {
75633               cache.moving = {};
75634               cache.intersections = [];
75635               cache.replacedVertex = {};
75636               cache.startLoc = {};
75637               cache.nodes = [];
75638               cache.ways = [];
75639
75640               cacheEntities(moveIds);
75641               cacheIntersections(cache.ways);
75642               cache.nodes = filter(cache.nodes, canMove);
75643
75644               cache.ok = true;
75645           }
75646       }
75647
75648
75649       // Place a vertex where the moved vertex used to be, to preserve way shape..
75650       //
75651       //  Start:
75652       //      b ---- e
75653       //     / \
75654       //    /   \
75655       //   /     \
75656       //  a       c
75657       //
75658       //      *               node '*' added to preserve shape
75659       //     / \
75660       //    /   b ---- e      way `b,e` moved here:
75661       //   /     \
75662       //  a       c
75663       //
75664       //
75665       function replaceMovedVertex(nodeId, wayId, graph, delta) {
75666           var way = graph.entity(wayId);
75667           var moved = graph.entity(nodeId);
75668           var movedIndex = way.nodes.indexOf(nodeId);
75669           var len, prevIndex, nextIndex;
75670
75671           if (way.isClosed()) {
75672               len = way.nodes.length - 1;
75673               prevIndex = (movedIndex + len - 1) % len;
75674               nextIndex = (movedIndex + len + 1) % len;
75675           } else {
75676               len = way.nodes.length;
75677               prevIndex = movedIndex - 1;
75678               nextIndex = movedIndex + 1;
75679           }
75680
75681           var prev = graph.hasEntity(way.nodes[prevIndex]);
75682           var next = graph.hasEntity(way.nodes[nextIndex]);
75683
75684           // Don't add orig vertex at endpoint..
75685           if (!prev || !next) return graph;
75686
75687           var key = wayId + '_' + nodeId;
75688           var orig = cache.replacedVertex[key];
75689           if (!orig) {
75690               orig = osmNode();
75691               cache.replacedVertex[key] = orig;
75692               cache.startLoc[orig.id] = cache.startLoc[nodeId];
75693           }
75694
75695           var start, end;
75696           if (delta) {
75697               start = projection(cache.startLoc[nodeId]);
75698               end = projection.invert(geoVecAdd(start, delta));
75699           } else {
75700               end = cache.startLoc[nodeId];
75701           }
75702           orig = orig.move(end);
75703
75704           var angle = Math.abs(geoAngle(orig, prev, projection) -
75705                   geoAngle(orig, next, projection)) * 180 / Math.PI;
75706
75707           // Don't add orig vertex if it would just make a straight line..
75708           if (angle > 175 && angle < 185) return graph;
75709
75710           // moving forward or backward along way?
75711           var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
75712           var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection);
75713           var d1 = geoPathLength(p1);
75714           var d2 = geoPathLength(p2);
75715           var insertAt = (d1 <= d2) ? movedIndex : nextIndex;
75716
75717           // moving around closed loop?
75718           if (way.isClosed() && insertAt === 0) insertAt = len;
75719
75720           way = way.addNode(orig.id, insertAt);
75721           return graph.replace(orig).replace(way);
75722       }
75723
75724
75725       // Remove duplicate vertex that might have been added by
75726       // replaceMovedVertex.  This is done after the unzorro checks.
75727       function removeDuplicateVertices(wayId, graph) {
75728           var way = graph.entity(wayId);
75729           var epsilon = 1e-6;
75730           var prev, curr;
75731
75732           function isInteresting(node, graph) {
75733               return graph.parentWays(node).length > 1 ||
75734                   graph.parentRelations(node).length ||
75735                   node.hasInterestingTags();
75736           }
75737
75738           for (var i = 0; i < way.nodes.length; i++) {
75739               curr = graph.entity(way.nodes[i]);
75740
75741               if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) {
75742                   if (!isInteresting(prev, graph)) {
75743                       way = way.removeNode(prev.id);
75744                       graph = graph.replace(way).remove(prev);
75745                   } else if (!isInteresting(curr, graph)) {
75746                       way = way.removeNode(curr.id);
75747                       graph = graph.replace(way).remove(curr);
75748                   }
75749               }
75750
75751               prev = curr;
75752           }
75753
75754           return graph;
75755       }
75756
75757
75758       // Reorder nodes around intersections that have moved..
75759       //
75760       //  Start:                way1.nodes: b,e         (moving)
75761       //  a - b - c ----- d     way2.nodes: a,b,c,d     (static)
75762       //      |                 vertex: b
75763       //      e                 isEP1: true,  isEP2, false
75764       //
75765       //  way1 `b,e` moved here:
75766       //  a ----- c = b - d
75767       //              |
75768       //              e
75769       //
75770       //  reorder nodes         way1.nodes: b,e
75771       //  a ----- c - b - d     way2.nodes: a,c,b,d
75772       //              |
75773       //              e
75774       //
75775       function unZorroIntersection(intersection$$1, graph) {
75776           var vertex = graph.entity(intersection$$1.nodeId);
75777           var way1 = graph.entity(intersection$$1.movedId);
75778           var way2 = graph.entity(intersection$$1.unmovedId);
75779           var isEP1 = intersection$$1.movedIsEP;
75780           var isEP2 = intersection$$1.unmovedIsEP;
75781
75782           // don't move the vertex if it is the endpoint of both ways.
75783           if (isEP1 && isEP2) return graph;
75784
75785           var nodes1 = without(graph.childNodes(way1), vertex);
75786           var nodes2 = without(graph.childNodes(way2), vertex);
75787
75788           if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
75789           if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
75790
75791           var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
75792           var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
75793           var loc;
75794
75795           // snap vertex to nearest edge (or some point between them)..
75796           if (!isEP1 && !isEP2) {
75797               var epsilon = 1e-6, maxIter = 10;
75798               for (var i = 0; i < maxIter; i++) {
75799                   loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
75800                   edge1 = geoChooseEdge(nodes1, projection(loc), projection);
75801                   edge2 = geoChooseEdge(nodes2, projection(loc), projection);
75802                   if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
75803               }
75804           } else if (!isEP1) {
75805               loc = edge1.loc;
75806           } else {
75807               loc = edge2.loc;
75808           }
75809
75810           graph = graph.replace(vertex.move(loc));
75811
75812           // if zorro happened, reorder nodes..
75813           if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
75814               way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
75815               graph = graph.replace(way1);
75816           }
75817           if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
75818               way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
75819               graph = graph.replace(way2);
75820           }
75821
75822           return graph;
75823       }
75824
75825
75826       function cleanupIntersections(graph) {
75827           for (var i = 0; i < cache.intersections.length; i++) {
75828               var obj = cache.intersections[i];
75829               graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
75830               graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
75831               graph = unZorroIntersection(obj, graph);
75832               graph = removeDuplicateVertices(obj.movedId, graph);
75833               graph = removeDuplicateVertices(obj.unmovedId, graph);
75834           }
75835
75836           return graph;
75837       }
75838
75839
75840       // check if moving way endpoint can cross an unmoved way, if so limit delta..
75841       function limitDelta(graph) {
75842           function moveNode(loc) {
75843               return geoVecAdd(projection(loc), _delta);
75844           }
75845
75846           for (var i = 0; i < cache.intersections.length; i++) {
75847               var obj = cache.intersections[i];
75848
75849               // Don't limit movement if this is vertex joins 2 endpoints..
75850               if (obj.movedIsEP && obj.unmovedIsEP) continue;
75851               // Don't limit movement if this vertex is not an endpoint anyway..
75852               if (!obj.movedIsEP) continue;
75853
75854               var node = graph.entity(obj.nodeId);
75855               var start = projection(node.loc);
75856               var end = geoVecAdd(start, _delta);
75857               var movedNodes = graph.childNodes(graph.entity(obj.movedId));
75858               var movedPath = map$3(map$3(movedNodes, 'loc'), moveNode);
75859               var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
75860               var unmovedPath = map$3(map$3(unmovedNodes, 'loc'), projection);
75861               var hits = geoPathIntersections(movedPath, unmovedPath);
75862
75863               for (var j = 0; i < hits.length; i++) {
75864                   if (isEqual(hits[j], end)) continue;
75865                   var edge = geoChooseEdge(unmovedNodes, end, projection);
75866                   _delta = geoVecSubtract(projection(edge.loc), start);
75867               }
75868           }
75869       }
75870
75871
75872       var action = function(graph) {
75873           if (_delta[0] === 0 && _delta[1] === 0) return graph;
75874
75875           setupCache(graph);
75876
75877           if (cache.intersections.length) {
75878               limitDelta(graph);
75879           }
75880
75881           for (var i = 0; i < cache.nodes.length; i++) {
75882               var node = graph.entity(cache.nodes[i]);
75883               var start = projection(node.loc);
75884               var end = geoVecAdd(start, _delta);
75885               graph = graph.replace(node.move(projection.invert(end)));
75886           }
75887
75888           if (cache.intersections.length) {
75889               graph = cleanupIntersections(graph);
75890           }
75891
75892           return graph;
75893       };
75894
75895
75896       action.delta = function() {
75897           return _delta;
75898       };
75899
75900
75901       return action;
75902   }
75903
75904   function actionMoveNode(nodeID, toLoc) {
75905
75906       var action = function(graph, t) {
75907           if (t === null || !isFinite(t)) t = 1;
75908           t = Math.min(Math.max(+t, 0), 1);
75909
75910           var node = graph.entity(nodeID);
75911           return graph.replace(
75912               node.move(geoVecInterp(node.loc, toLoc, t))
75913           );
75914       };
75915
75916       action.transitionable = true;
75917
75918       return action;
75919   }
75920
75921   function actionNoop() {
75922       return function(graph) {
75923           return graph;
75924       };
75925   }
75926
75927   /*
75928    * Based on https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/potlatch2/tools/Quadrilateralise.as
75929    */
75930   function actionOrthogonalize(wayId, projection) {
75931       var threshold = 12, // degrees within right or straight to alter
75932           lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180),
75933           upperThreshold = Math.cos(threshold * Math.PI / 180);
75934
75935
75936       var action = function(graph, t) {
75937           if (t === null || !isFinite(t)) t = 1;
75938           t = Math.min(Math.max(+t, 0), 1);
75939
75940           var way = graph.entity(wayId),
75941               nodes = graph.childNodes(way),
75942               points = uniq(nodes).map(function(n) { return projection(n.loc); }),
75943               corner = {i: 0, dotp: 1},
75944               epsilon = 1e-4,
75945               node, loc, score, motions, i, j;
75946
75947           if (points.length === 3) {   // move only one vertex for right triangle
75948               for (i = 0; i < 1000; i++) {
75949                   motions = points.map(calcMotion);
75950                   points[corner.i] = addPoints(points[corner.i], motions[corner.i]);
75951                   score = corner.dotp;
75952                   if (score < epsilon) {
75953                       break;
75954                   }
75955               }
75956
75957               node = graph.entity(nodes[corner.i].id);
75958               loc = projection.invert(points[corner.i]);
75959               graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
75960
75961           } else {
75962               var best,
75963                   originalPoints = clone(points);
75964               score = Infinity;
75965
75966               for (i = 0; i < 1000; i++) {
75967                   motions = points.map(calcMotion);
75968                   for (j = 0; j < motions.length; j++) {
75969                       points[j] = addPoints(points[j],motions[j]);
75970                   }
75971                   var newScore = squareness(points);
75972                   if (newScore < score) {
75973                       best = clone(points);
75974                       score = newScore;
75975                   }
75976                   if (score < epsilon) {
75977                       break;
75978                   }
75979               }
75980
75981               points = best;
75982
75983               for (i = 0; i < points.length; i++) {
75984                   // only move the points that actually moved
75985                   if (originalPoints[i][0] !== points[i][0] || originalPoints[i][1] !== points[i][1]) {
75986                       loc = projection.invert(points[i]);
75987                       node = graph.entity(nodes[i].id);
75988                       graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
75989                   }
75990               }
75991
75992               // remove empty nodes on straight sections
75993               for (i = 0; t === 1 && i < points.length; i++) {
75994                   node = graph.entity(nodes[i].id);
75995
75996                   if (graph.parentWays(node).length > 1 ||
75997                       graph.parentRelations(node).length ||
75998                       node.hasInterestingTags()) {
75999                       continue;
76000                   }
76001
76002                   var dotp = normalizedDotProduct(i, points);
76003                   if (dotp < -1 + epsilon) {
76004                       graph = actionDeleteNode(node.id)(graph);
76005                   }
76006               }
76007           }
76008
76009           return graph;
76010
76011
76012           function calcMotion(b, i, array) {
76013               var a = array[(i - 1 + array.length) % array.length],
76014                   c = array[(i + 1) % array.length],
76015                   p = subtractPoints(a, b),
76016                   q = subtractPoints(c, b),
76017                   scale, dotp;
76018
76019               scale = 2 * Math.min(geoVecLength(p, [0, 0]), geoVecLength(q, [0, 0]));
76020               p = normalizePoint(p, 1.0);
76021               q = normalizePoint(q, 1.0);
76022
76023               dotp = filterDotProduct(p[0] * q[0] + p[1] * q[1]);
76024
76025               // nasty hack to deal with almost-straight segments (angle is closer to 180 than to 90/270).
76026               if (array.length > 3) {
76027                   if (dotp < -0.707106781186547) {
76028                       dotp += 1.0;
76029                   }
76030               } else if (dotp && Math.abs(dotp) < corner.dotp) {
76031                   corner.i = i;
76032                   corner.dotp = Math.abs(dotp);
76033               }
76034
76035               return normalizePoint(addPoints(p, q), 0.1 * dotp * scale);
76036           }
76037       };
76038
76039
76040       function squareness(points) {
76041           return points.reduce(function(sum, val, i, array) {
76042               var dotp = normalizedDotProduct(i, array);
76043
76044               dotp = filterDotProduct(dotp);
76045               return sum + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
76046           }, 0);
76047       }
76048
76049
76050       function normalizedDotProduct(i, points) {
76051           var a = points[(i - 1 + points.length) % points.length],
76052               b = points[i],
76053               c = points[(i + 1) % points.length],
76054               p = subtractPoints(a, b),
76055               q = subtractPoints(c, b);
76056
76057           p = normalizePoint(p, 1.0);
76058           q = normalizePoint(q, 1.0);
76059
76060           return p[0] * q[0] + p[1] * q[1];
76061       }
76062
76063
76064       function subtractPoints(a, b) {
76065           return [a[0] - b[0], a[1] - b[1]];
76066       }
76067
76068
76069       function addPoints(a, b) {
76070           return [a[0] + b[0], a[1] + b[1]];
76071       }
76072
76073
76074       function normalizePoint(point, scale) {
76075           var vector = [0, 0];
76076           var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
76077           if (length !== 0) {
76078               vector[0] = point[0] / length;
76079               vector[1] = point[1] / length;
76080           }
76081
76082           vector[0] *= scale;
76083           vector[1] *= scale;
76084
76085           return vector;
76086       }
76087
76088
76089       function filterDotProduct(dotp) {
76090           if (lowerThreshold > Math.abs(dotp) || Math.abs(dotp) > upperThreshold) {
76091               return dotp;
76092           }
76093
76094           return 0;
76095       }
76096
76097
76098       action.disabled = function(graph) {
76099           var way = graph.entity(wayId),
76100               nodes = graph.childNodes(way),
76101               points = uniq(nodes).map(function(n) { return projection(n.loc); });
76102
76103           if (squareness(points)) {
76104               return false;
76105           }
76106
76107           return 'not_squarish';
76108       };
76109
76110
76111       action.transitionable = true;
76112
76113
76114       return action;
76115   }
76116
76117   // `actionRestrictTurn` creates a turn restriction relation.
76118   //
76119   // `turn` must be an `osmTurn` object
76120   // see osm/intersection.js, pathToTurn()
76121   //
76122   // This specifies a restriction of type `restriction` when traveling from
76123   // `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`.
76124   // (The action does not check that these entities form a valid intersection.)
76125   //
76126   // From, to, and via ways should be split before calling this action.
76127   // (old versions of the code would split the ways here, but we no longer do it)
76128   //
76129   // For testing convenience, accepts a restrictionID to assign to the new
76130   // relation. Normally, this will be undefined and the relation will
76131   // automatically be assigned a new ID.
76132   //
76133   function actionRestrictTurn(turn, restrictionType, restrictionID) {
76134
76135       return function(graph) {
76136           var fromWay = graph.entity(turn.from.way);
76137           var toWay = graph.entity(turn.to.way);
76138           var viaNode = turn.via.node && graph.entity(turn.via.node);
76139           var viaWays = turn.via.ways && turn.via.ways.map(function(id) { return graph.entity(id); });
76140           var members = [];
76141
76142           members.push({ id: fromWay.id, type: 'way',  role: 'from' });
76143
76144           if (viaNode) {
76145               members.push({ id: viaNode.id,  type: 'node', role: 'via' });
76146           } else if (viaWays) {
76147               viaWays.forEach(function(viaWay) {
76148                   members.push({ id: viaWay.id,  type: 'way', role: 'via' });
76149               });
76150           }
76151
76152           members.push({ id: toWay.id, type: 'way',  role: 'to' });
76153
76154           return graph.replace(osmRelation({
76155               id: restrictionID,
76156               tags: {
76157                   type: 'restriction',
76158                   restriction: restrictionType
76159               },
76160               members: members
76161           }));
76162       };
76163   }
76164
76165   function actionRevert(id) {
76166       var action = function(graph) {
76167           var entity = graph.hasEntity(id),
76168               base = graph.base().entities[id];
76169
76170           if (entity && !base) {    // entity will be removed..
76171               if (entity.type === 'node') {
76172                   graph.parentWays(entity)
76173                       .forEach(function(parent) {
76174                           parent = parent.removeNode(id);
76175                           graph = graph.replace(parent);
76176
76177                           if (parent.isDegenerate()) {
76178                               graph = actionDeleteWay(parent.id)(graph);
76179                           }
76180                       });
76181               }
76182
76183               graph.parentRelations(entity)
76184                   .forEach(function(parent) {
76185                       parent = parent.removeMembersWithID(id);
76186                       graph = graph.replace(parent);
76187
76188                       if (parent.isDegenerate()) {
76189                           graph = actionDeleteRelation(parent.id)(graph);
76190                       }
76191                   });
76192           }
76193
76194           return graph.revert(id);
76195       };
76196
76197       return action;
76198   }
76199
76200   function actionRotate(rotateIds, pivot, angle, projection) {
76201
76202       var action = function(graph) {
76203           return graph.update(function(graph) {
76204               utilGetAllNodes(rotateIds, graph).forEach(function(node) {
76205                   var point = geoRotate([projection(node.loc)], angle, pivot)[0];
76206                   graph = graph.replace(node.move(projection.invert(point)));
76207               });
76208           });
76209       };
76210
76211       return action;
76212   }
76213
76214   /* Built-in method references for those with the same name as other `lodash` methods. */
76215   var nativeMax$8 = Math.max;
76216
76217   /**
76218    * Gets the index at which the first occurrence of `value` is found in `array`
76219    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
76220    * for equality comparisons. If `fromIndex` is negative, it's used as the
76221    * offset from the end of `array`.
76222    *
76223    * @static
76224    * @memberOf _
76225    * @since 0.1.0
76226    * @category Array
76227    * @param {Array} array The array to inspect.
76228    * @param {*} value The value to search for.
76229    * @param {number} [fromIndex=0] The index to search from.
76230    * @returns {number} Returns the index of the matched value, else `-1`.
76231    * @example
76232    *
76233    * _.indexOf([1, 2, 1, 2], 2);
76234    * // => 1
76235    *
76236    * // Search from the `fromIndex`.
76237    * _.indexOf([1, 2, 1, 2], 2, 2);
76238    * // => 3
76239    */
76240   function indexOf(array, value, fromIndex) {
76241     var length = array == null ? 0 : array.length;
76242     if (!length) {
76243       return -1;
76244     }
76245     var index = fromIndex == null ? 0 : toInteger(fromIndex);
76246     if (index < 0) {
76247       index = nativeMax$8(length + index, 0);
76248     }
76249     return baseIndexOf(array, value, index);
76250   }
76251
76252   // Split a way at the given node.
76253   //
76254   // Optionally, split only the given ways, if multiple ways share
76255   // the given node.
76256   //
76257   // This is the inverse of `iD.actionJoin`.
76258   //
76259   // For testing convenience, accepts an ID to assign to the new way.
76260   // Normally, this will be undefined and the way will automatically
76261   // be assigned a new ID.
76262   //
76263   // Reference:
76264   //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
76265   //
76266   function actionSplit(nodeId, newWayIds) {
76267       var _wayIDs;
76268
76269       // If the way is closed, we need to search for a partner node
76270       // to split the way at.
76271       //
76272       // The following looks for a node that is both far away from
76273       // the initial node in terms of way segment length and nearby
76274       // in terms of beeline-distance. This assures that areas get
76275       // split on the most "natural" points (independent of the number
76276       // of nodes).
76277       // For example: bone-shaped areas get split across their waist
76278       // line, circles across the diameter.
76279       function splitArea(nodes, idxA, graph) {
76280           var lengths = new Array(nodes.length);
76281           var length;
76282           var i;
76283           var best = 0;
76284           var idxB;
76285
76286           function wrap(index) {
76287               return utilWrap(index, nodes.length);
76288           }
76289
76290           function dist(nA, nB) {
76291               var locA = graph.entity(nA).loc;
76292               var locB = graph.entity(nB).loc;
76293               var epsilon = 1e-6;
76294               return (locA && locB) ? geoSphericalDistance(locA, locB) : epsilon;
76295           }
76296
76297           // calculate lengths
76298           length = 0;
76299           for (i = wrap(idxA+1); i !== idxA; i = wrap(i+1)) {
76300               length += dist(nodes[i], nodes[wrap(i-1)]);
76301               lengths[i] = length;
76302           }
76303
76304           length = 0;
76305           for (i = wrap(idxA-1); i !== idxA; i = wrap(i-1)) {
76306               length += dist(nodes[i], nodes[wrap(i+1)]);
76307               if (length < lengths[i])
76308                   lengths[i] = length;
76309           }
76310
76311           // determine best opposite node to split
76312           for (i = 0; i < nodes.length; i++) {
76313               var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
76314               if (cost > best) {
76315                   idxB = i;
76316                   best = cost;
76317               }
76318           }
76319
76320           return idxB;
76321       }
76322
76323
76324       function split(graph, wayA, newWayId) {
76325           var wayB = osmWay({id: newWayId, tags: wayA.tags});   // `wayB` is the NEW way
76326           var origNodes = wayA.nodes.slice();
76327           var nodesA;
76328           var nodesB;
76329           var isArea = wayA.isArea();
76330           var isOuter = osmIsSimpleMultipolygonOuterMember(wayA, graph);
76331
76332           if (wayA.isClosed()) {
76333               var nodes = wayA.nodes.slice(0, -1);
76334               var idxA = indexOf(nodes, nodeId);
76335               var idxB = splitArea(nodes, idxA, graph);
76336
76337               if (idxB < idxA) {
76338                   nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
76339                   nodesB = nodes.slice(idxB, idxA + 1);
76340               } else {
76341                   nodesA = nodes.slice(idxA, idxB + 1);
76342                   nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
76343               }
76344           } else {
76345               var idx = indexOf(wayA.nodes, nodeId, 1);
76346               nodesA = wayA.nodes.slice(0, idx + 1);
76347               nodesB = wayA.nodes.slice(idx);
76348           }
76349
76350           wayA = wayA.update({nodes: nodesA});
76351           wayB = wayB.update({nodes: nodesB});
76352
76353           graph = graph.replace(wayA);
76354           graph = graph.replace(wayB);
76355
76356           graph.parentRelations(wayA).forEach(function(relation) {
76357               var member;
76358
76359               // Turn restrictions - make sure:
76360               // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation
76361               //    (whichever one is connected to the VIA node/ways)
76362               // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way
76363               if (relation.isRestriction()) {
76364                   var f = relation.memberByRole('from');
76365                   var v = relation.membersByRole('via');
76366                   var t = relation.memberByRole('to');
76367                   var i;
76368
76369                   // 1. split a FROM/TO
76370                   if (f.id === wayA.id || t.id === wayA.id) {
76371                       var keepB = false;
76372                       if (v.length === 1 && v[0].type === 'node') {   // check via node
76373                           keepB = wayB.contains(v[0].id);
76374                       } else {                                        // check via way(s)
76375                           for (i = 0; i < v.length; i++) {
76376                               if (v[i].type === 'way') {
76377                                   var wayVia = graph.hasEntity(v[i].id);
76378                                   if (wayVia && intersection(wayB.nodes, wayVia.nodes).length) {
76379                                       keepB = true;
76380                                       break;
76381                                   }
76382                               }
76383                           }
76384                       }
76385
76386                       if (keepB) {
76387                           relation = relation.replaceMember(wayA, wayB);
76388                           graph = graph.replace(relation);
76389                       }
76390
76391                   // 2. split a VIA
76392                   } else {
76393                       for (i = 0; i < v.length; i++) {
76394                           if (v[i].type === 'way' && v[i].id === wayA.id) {
76395                               member = {
76396                                   id: wayB.id,
76397                                   type: 'way',
76398                                   role: 'via'
76399                               };
76400                               graph = actionAddMember(relation.id, member, v[i].index + 1)(graph);
76401                               break;
76402                           }
76403                       }
76404                   }
76405
76406               // All other relations (Routes, Multipolygons, etc):
76407               // 1. Both `wayA` and `wayB` remain in the relation
76408               // 2. But must be inserted as a pair (see `actionAddMember` for details)
76409               } else {
76410                   if (relation === isOuter) {
76411                       graph = graph.replace(relation.mergeTags(wayA.tags));
76412                       graph = graph.replace(wayA.update({tags: {}}));
76413                       graph = graph.replace(wayB.update({tags: {}}));
76414                   }
76415
76416                   member = {
76417                       id: wayB.id,
76418                       type: 'way',
76419                       role: relation.memberById(wayA.id).role
76420                   };
76421
76422                   var insertPair = {
76423                       originalID: wayA.id,
76424                       insertedID: wayB.id,
76425                       nodes: origNodes
76426                   };
76427
76428                   graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
76429               }
76430           });
76431
76432           if (!isOuter && isArea) {
76433               var multipolygon = osmRelation({
76434                   tags: assignIn({}, wayA.tags, {type: 'multipolygon'}),
76435                   members: [
76436                       {id: wayA.id, role: 'outer', type: 'way'},
76437                       {id: wayB.id, role: 'outer', type: 'way'}
76438                   ]
76439               });
76440
76441               graph = graph.replace(multipolygon);
76442               graph = graph.replace(wayA.update({tags: {}}));
76443               graph = graph.replace(wayB.update({tags: {}}));
76444           }
76445
76446           return graph;
76447       }
76448
76449
76450       var action = function(graph) {
76451           var candidates = action.ways(graph);
76452           for (var i = 0; i < candidates.length; i++) {
76453               graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
76454           }
76455           return graph;
76456       };
76457
76458
76459       action.ways = function(graph) {
76460           var node = graph.entity(nodeId);
76461           var parents = graph.parentWays(node);
76462           var hasLines = some(parents, function(parent) { return parent.geometry(graph) === 'line'; });
76463
76464           return parents.filter(function(parent) {
76465               if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
76466                   return false;
76467
76468               if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line')
76469                   return false;
76470
76471               if (parent.isClosed()) {
76472                   return true;
76473               }
76474
76475               for (var i = 1; i < parent.nodes.length - 1; i++) {
76476                   if (parent.nodes[i] === nodeId) {
76477                       return true;
76478                   }
76479               }
76480
76481               return false;
76482           });
76483       };
76484
76485
76486       action.disabled = function(graph) {
76487           var candidates = action.ways(graph);
76488           if (candidates.length === 0 || (_wayIDs && _wayIDs.length !== candidates.length))
76489               return 'not_eligible';
76490       };
76491
76492
76493       action.limitWays = function(_) {
76494           if (!arguments.length) return _wayIDs;
76495           _wayIDs = _;
76496           return action;
76497       };
76498
76499
76500       return action;
76501   }
76502
76503   /*
76504    * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
76505    */
76506   function actionStraighten(wayId, projection) {
76507
76508       function positionAlongWay(n, s, e) {
76509           return ((n[0] - s[0]) * (e[0] - s[0]) + (n[1] - s[1]) * (e[1] - s[1])) /
76510                   (Math.pow(e[0] - s[0], 2) + Math.pow(e[1] - s[1], 2));
76511       }
76512
76513
76514       var action = function(graph, t) {
76515           if (t === null || !isFinite(t)) t = 1;
76516           t = Math.min(Math.max(+t, 0), 1);
76517
76518           var way = graph.entity(wayId),
76519               nodes = graph.childNodes(way),
76520               points = nodes.map(function(n) { return projection(n.loc); }),
76521               startPoint = points[0],
76522               endPoint = points[points.length-1],
76523               toDelete = [],
76524               i;
76525
76526           for (i = 1; i < points.length-1; i++) {
76527               var node = nodes[i],
76528                   point = points[i];
76529
76530               if (t < 1 || graph.parentWays(node).length > 1 ||
76531                   graph.parentRelations(node).length ||
76532                   node.hasInterestingTags()) {
76533
76534                   var u = positionAlongWay(point, startPoint, endPoint),
76535                       p = [
76536                           startPoint[0] + u * (endPoint[0] - startPoint[0]),
76537                           startPoint[1] + u * (endPoint[1] - startPoint[1])
76538                       ],
76539                       loc2 = projection.invert(p);
76540
76541                   graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
76542
76543               } else {
76544                   // safe to delete
76545                   if (toDelete.indexOf(node) === -1) {
76546                       toDelete.push(node);
76547                   }
76548               }
76549           }
76550
76551           for (i = 0; i < toDelete.length; i++) {
76552               graph = actionDeleteNode(toDelete[i].id)(graph);
76553           }
76554
76555           return graph;
76556       };
76557
76558
76559       action.disabled = function(graph) {
76560           // check way isn't too bendy
76561           var way = graph.entity(wayId),
76562               nodes = graph.childNodes(way),
76563               points = nodes.map(function(n) { return projection(n.loc); }),
76564               startPoint = points[0],
76565               endPoint = points[points.length-1],
76566               threshold = 0.2 * geoVecLength(startPoint, endPoint),
76567               i;
76568
76569           if (threshold === 0) {
76570               return 'too_bendy';
76571           }
76572
76573           for (i = 1; i < points.length-1; i++) {
76574               var point = points[i],
76575                   u = positionAlongWay(point, startPoint, endPoint),
76576                   p0 = startPoint[0] + u * (endPoint[0] - startPoint[0]),
76577                   p1 = startPoint[1] + u * (endPoint[1] - startPoint[1]),
76578                   dist = Math.sqrt(Math.pow(p0 - point[0], 2) + Math.pow(p1 - point[1], 2));
76579
76580               // to bendy if point is off by 20% of total start/end distance in projected space
76581               if (isNaN(dist) || dist > threshold) {
76582                   return 'too_bendy';
76583               }
76584           }
76585       };
76586
76587
76588       action.transitionable = true;
76589
76590
76591       return action;
76592   }
76593
76594   // `actionUnrestrictTurn` deletes a turn restriction relation.
76595   //
76596   // `turn` must be an `osmTurn` object with a `restrictionID` property.
76597   // see osm/intersection.js, pathToTurn()
76598   //
76599   function actionUnrestrictTurn(turn) {
76600       return function(graph) {
76601           return actionDeleteRelation(turn.restrictionID)(graph);
76602       };
76603   }
76604
76605   /* Reflect the given area around its axis of symmetry */
76606   function actionReflect(reflectIds, projection) {
76607       var useLongAxis = true;
76608
76609
76610       // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
76611       // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
76612       function getSmallestSurroundingRectangle(graph, nodes) {
76613           var points = nodes.map(function(n) { return projection(n.loc); }),
76614               hull = d3_polygonHull(points),
76615               centroid = d3_polygonCentroid(hull),
76616               minArea = Infinity,
76617               ssrExtent = [],
76618               ssrAngle = 0,
76619               c1 = hull[0];
76620
76621           for (var i = 0; i <= hull.length - 1; i++) {
76622               var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1],
76623                   angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]),
76624                   poly = geoRotate(hull, -angle, centroid),
76625                   extent = poly.reduce(function(extent, point) {
76626                           return extent.extend(geoExtent$$1(point));
76627                       }, geoExtent$$1()),
76628                   area = extent.area();
76629
76630               if (area < minArea) {
76631                   minArea = area;
76632                   ssrExtent = extent;
76633                   ssrAngle = angle;
76634               }
76635               c1 = c2;
76636           }
76637
76638           return {
76639               poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
76640               angle: ssrAngle
76641           };
76642       }
76643
76644
76645       var action = function(graph, t) {
76646           if (t === null || !isFinite(t)) t = 1;
76647           t = Math.min(Math.max(+t, 0), 1);
76648
76649           var nodes = utilGetAllNodes(reflectIds, graph),
76650               ssr = getSmallestSurroundingRectangle(graph, nodes);
76651
76652           // Choose line pq = axis of symmetry.
76653           // The shape's surrounding rectangle has 2 axes of symmetry.
76654           // Reflect across the longer axis by default.
76655           var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ],
76656               q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ],
76657               p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ],
76658               q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ],
76659               p, q;
76660
76661           var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
76662           if ((useLongAxis && isLong) || (!useLongAxis && !isLong)) {
76663               p = p1;
76664               q = q1;
76665           } else {
76666               p = p2;
76667               q = q2;
76668           }
76669
76670           // reflect c across pq
76671           // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
76672           var dx = q[0] - p[0];
76673           var dy = q[1] - p[1];
76674           var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
76675           var b = 2 * dx * dy / (dx * dx + dy * dy);
76676           for (var i = 0; i < nodes.length; i++) {
76677               var node = nodes[i];
76678               var c = projection(node.loc);
76679               var c2 = [
76680                   a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
76681                   b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
76682               ];
76683               var loc2 = projection.invert(c2);
76684               node = node.move(geoVecInterp(node.loc, loc2, t));
76685               graph = graph.replace(node);
76686           }
76687
76688           return graph;
76689       };
76690
76691
76692       action.useLongAxis = function(_) {
76693           if (!arguments.length) return useLongAxis;
76694           useLongAxis = _;
76695           return action;
76696       };
76697
76698
76699       action.transitionable = true;
76700
76701
76702       return action;
76703   }
76704
76705
76706
76707   var index$4 = /*#__PURE__*/Object.freeze({
76708     d3combobox: d3combobox,
76709     d3geoTile: d3geoTile,
76710     d3keybinding: d3keybinding
76711   });
76712
76713   var Connection = services.osm;
76714
76715   var debug = false;
76716
76717   var iD = /*#__PURE__*/Object.freeze({
76718     Connection: Connection,
76719     debug: debug,
76720     lib: index$4,
76721     d3: index$3,
76722     Context: coreContext,
76723     setAreaKeys: setAreaKeys,
76724     Difference: coreDifference,
76725     Graph: coreGraph$$1,
76726     History: coreHistory,
76727     Tree: coreTree,
76728     geoCross: geoVecCross,
76729     geoInterp: geoVecInterp,
76730     geoRoundCoordinates: geoVecFloor,
76731     geoEuclideanDistance: geoVecLength,
76732     Entity: osmEntity$$1,
76733     Node: osmNode,
76734     Relation: osmRelation,
76735     Way: osmWay,
76736     BackgroundSource: rendererBackgroundSource,
76737     Background: rendererBackground,
76738     Features: rendererFeatures,
76739     Map: rendererMap,
76740     TileLayer: rendererTileLayer,
76741     Detect: utilDetect,
76742     uiPreset: uiPresetEditor,
76743     actionAddEntity: actionAddEntity,
76744     actionAddMember: actionAddMember,
76745     actionAddMidpoint: actionAddMidpoint,
76746     actionAddVertex: actionAddVertex,
76747     actionChangeMember: actionChangeMember,
76748     actionChangePreset: actionChangePreset,
76749     actionChangeTags: actionChangeTags,
76750     actionCircularize: actionCircularize,
76751     actionConnect: actionConnect,
76752     actionCopyEntities: actionCopyEntities,
76753     actionDeleteMember: actionDeleteMember,
76754     actionDeleteMultiple: actionDeleteMultiple,
76755     actionDeleteNode: actionDeleteNode,
76756     actionDeleteRelation: actionDeleteRelation,
76757     actionDeleteWay: actionDeleteWay,
76758     actionDeprecateTags: actionDeprecateTags,
76759     actionDiscardTags: actionDiscardTags,
76760     actionDisconnect: actionDisconnect,
76761     actionJoin: actionJoin,
76762     actionMerge: actionMerge,
76763     actionMergePolygon: actionMergePolygon,
76764     actionMergeRemoteChanges: actionMergeRemoteChanges,
76765     actionMove: actionMove,
76766     actionMoveNode: actionMoveNode,
76767     actionNoop: actionNoop,
76768     actionOrthogonalize: actionOrthogonalize,
76769     actionRestrictTurn: actionRestrictTurn,
76770     actionReverse: actionReverse,
76771     actionRevert: actionRevert,
76772     actionRotate: actionRotate,
76773     actionSplit: actionSplit,
76774     actionStraighten: actionStraighten,
76775     actionUnrestrictTurn: actionUnrestrictTurn,
76776     actionReflect: actionReflect,
76777     behaviorAddWay: behaviorAddWay,
76778     behaviorBreathe: behaviorBreathe,
76779     behaviorCopy: behaviorCopy,
76780     behaviorDrag: behaviorDrag,
76781     behaviorDrawWay: behaviorDrawWay,
76782     behaviorDraw: behaviorDraw,
76783     behaviorEdit: behaviorEdit,
76784     behaviorHash: behaviorHash,
76785     behaviorHover: behaviorHover,
76786     behaviorLasso: behaviorLasso,
76787     behaviorOperation: behaviorOperation,
76788     behaviorPaste: behaviorPaste,
76789     behaviorSelect: behaviorSelect,
76790     behaviorTail: behaviorTail,
76791     coreContext: coreContext,
76792     coreDifference: coreDifference,
76793     coreGraph: coreGraph$$1,
76794     coreHistory: coreHistory,
76795     coreTree: coreTree,
76796     dataFeatureIcons: dataFeatureIcons,
76797     data: data,
76798     dataWikipedia: wikipedia$2,
76799     dataSuggestions: dataSuggestions,
76800     dataAddressFormats: dataAddressFormats,
76801     dataDeprecated: dataDeprecated,
76802     dataDiscarded: dataDiscarded,
76803     dataLocales: dataLocales,
76804     dataPhoneFormats: dataPhoneFormats,
76805     dataShortcuts: dataShortcuts,
76806     dataImperial: dataImperial,
76807     dataDriveLeft: dataDriveLeft,
76808     dataEn: en,
76809     geoExtent: geoExtent$$1,
76810     geoLatToMeters: geoLatToMeters,
76811     geoLonToMeters: geoLonToMeters,
76812     geoMetersToLat: geoMetersToLat,
76813     geoMetersToLon: geoMetersToLon,
76814     geoMetersToOffset: geoMetersToOffset,
76815     geoOffsetToMeters: geoOffsetToMeters,
76816     geoScaleToZoom: geoScaleToZoom,
76817     geoSphericalDistance: geoSphericalDistance,
76818     geoZoomToScale: geoZoomToScale,
76819     geoAngle: geoAngle,
76820     geoChooseEdge: geoChooseEdge,
76821     geoEdgeEqual: geoEdgeEqual,
76822     geoHasLineIntersections: geoHasLineIntersections,
76823     geoHasSelfIntersections: geoHasSelfIntersections,
76824     geoRotate: geoRotate,
76825     geoLineIntersection: geoLineIntersection,
76826     geoPathHasIntersections: geoPathHasIntersections,
76827     geoPathIntersections: geoPathIntersections,
76828     geoPathLength: geoPathLength,
76829     geoPointInPolygon: geoPointInPolygon,
76830     geoPolygonContainsPolygon: geoPolygonContainsPolygon,
76831     geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
76832     geoViewportEdge: geoViewportEdge,
76833     geoRawMercator: geoRawMercator,
76834     geoVecAdd: geoVecAdd,
76835     geoVecAngle: geoVecAngle,
76836     geoVecCross: geoVecCross,
76837     geoVecDot: geoVecDot,
76838     geoVecEqual: geoVecEqual,
76839     geoVecFloor: geoVecFloor,
76840     geoVecInterp: geoVecInterp,
76841     geoVecLength: geoVecLength,
76842     geoVecSubtract: geoVecSubtract,
76843     geoVecScale: geoVecScale,
76844     modeAddArea: modeAddArea$$1,
76845     modeAddLine: modeAddLine$$1,
76846     modeAddPoint: modeAddPoint$$1,
76847     modeBrowse: modeBrowse,
76848     modeDragNode: modeDragNode$$1,
76849     modeDrawArea: modeDrawArea,
76850     modeDrawLine: modeDrawLine,
76851     modeMove: modeMove$$1,
76852     modeRotate: modeRotate$$1,
76853     modeSave: modeSave$$1,
76854     modeSelect: modeSelect,
76855     operationCircularize: operationCircularize,
76856     operationContinue: operationContinue,
76857     operationDelete: operationDelete,
76858     operationDisconnect: operationDisconnect,
76859     operationMerge: operationMerge,
76860     operationMove: operationMove,
76861     operationOrthogonalize: operationOrthogonalize,
76862     operationReflectShort: operationReflectShort,
76863     operationReflectLong: operationReflectLong,
76864     operationReverse: operationReverse,
76865     operationRotate: operationRotate,
76866     operationSplit: operationSplit,
76867     operationStraighten: operationStraighten,
76868     osmChangeset: osmChangeset,
76869     osmEntity: osmEntity$$1,
76870     osmNode: osmNode,
76871     osmRelation: osmRelation,
76872     osmWay: osmWay,
76873     osmIntersection: osmIntersection,
76874     osmTurn: osmTurn,
76875     osmInferRestriction: osmInferRestriction,
76876     osmLanes: osmLanes,
76877     osmIsSimpleMultipolygonOuterMember: osmIsSimpleMultipolygonOuterMember,
76878     osmSimpleMultipolygonOuterMember: osmSimpleMultipolygonOuterMember,
76879     osmJoinWays: osmJoinWays,
76880     osmOneWayTags: osmOneWayTags,
76881     osmPavedTags: osmPavedTags,
76882     osmIsInterestingTag: osmIsInterestingTag,
76883     presetCategory: presetCategory,
76884     presetCollection: presetCollection,
76885     presetField: presetField,
76886     presetPreset: presetPreset,
76887     presetIndex: presetIndex,
76888     rendererBackgroundSource: rendererBackgroundSource,
76889     rendererBackground: rendererBackground,
76890     rendererFeatures: rendererFeatures,
76891     rendererMap: rendererMap,
76892     rendererTileLayer: rendererTileLayer,
76893     services: services,
76894     serviceMapillary: serviceMapillary,
76895     serviceNominatim: serviceNominatim,
76896     serviceOpenstreetcam: serviceOpenstreetcam,
76897     serviceOsm: serviceOsm,
76898     serviceTaginfo: serviceTaginfo,
76899     serviceWikidata: serviceWikidata,
76900     serviceWikipedia: serviceWikipedia,
76901     svgAreas: svgAreas$$1,
76902     svgDebug: svgDebug$$1,
76903     svgDefs: svgDefs,
76904     svgGpx: svgGpx$$1,
76905     svgIcon: svgIcon,
76906     svgLabels: svgLabels,
76907     svgLayers: svgLayers,
76908     svgLines: svgLines$$1,
76909     svgMapillaryImages: svgMapillaryImages$$1,
76910     svgMapillarySigns: svgMapillarySigns,
76911     svgMidpoints: svgMidpoints$$1,
76912     svgOneWaySegments: svgOneWaySegments,
76913     svgOpenstreetcamImages: svgOpenstreetcamImages$$1,
76914     svgOsm: svgOsm,
76915     svgPassiveVertex: svgPassiveVertex,
76916     svgPath: svgPath,
76917     svgPointTransform: svgPointTransform,
76918     svgPoints: svgPoints$$1,
76919     svgRelationMemberTags: svgRelationMemberTags,
76920     svgSegmentWay: svgSegmentWay,
76921     svgTagClasses: svgTagClasses,
76922     svgTurns: svgTurns,
76923     svgVertices: svgVertices$$1,
76924     uiFields: uiFields,
76925     uiFieldDefaultCheck: uiFieldCheck,
76926     uiFieldOnewayCheck: uiFieldCheck,
76927     uiFieldCheck: uiFieldCheck,
76928     uiFieldMultiCombo: uiFieldCombo,
76929     uiFieldNetworkCombo: uiFieldCombo,
76930     uiFieldSemiCombo: uiFieldCombo,
76931     uiFieldTypeCombo: uiFieldCombo,
76932     uiFieldCombo: uiFieldCombo,
76933     uiFieldUrl: uiFieldText,
76934     uiFieldNumber: uiFieldText,
76935     uiFieldTel: uiFieldText,
76936     uiFieldEmail: uiFieldText,
76937     uiFieldText: uiFieldText,
76938     uiFieldAccess: uiFieldAccess,
76939     uiFieldAddress: uiFieldAddress,
76940     uiFieldCycleway: uiFieldCycleway,
76941     uiFieldLanes: uiFieldLanes,
76942     uiFieldLocalized: uiFieldLocalized,
76943     uiFieldMaxspeed: uiFieldMaxspeed,
76944     uiFieldStructureRadio: uiFieldRadio,
76945     uiFieldRadio: uiFieldRadio,
76946     uiFieldRestrictions: uiFieldRestrictions,
76947     uiFieldTextarea: uiFieldTextarea,
76948     uiFieldWikipedia: uiFieldWikipedia,
76949     uiIntro: uiIntro,
76950     uiInfoPanels: uiInfoPanels,
76951     uiPanelBackground: uiPanelBackground,
76952     uiPanelHistory: uiPanelHistory,
76953     uiPanelLocation: uiPanelLocation,
76954     uiPanelMeasurement: uiPanelMeasurement,
76955     uiInit: uiInit,
76956     uiAccount: uiAccount,
76957     uiAttribution: uiAttribution,
76958     uiBackground: uiBackground,
76959     uiBackgroundDisplayOptions: uiBackgroundDisplayOptions,
76960     uiBackgroundOffset: uiBackgroundOffset,
76961     uiChangesetEditor: uiChangesetEditor,
76962     uiCmd: uiCmd,
76963     uiCommit: uiCommit,
76964     uiCommitChanges: uiCommitChanges,
76965     uiCommitWarnings: uiCommitWarnings,
76966     uiConfirm: uiConfirm,
76967     uiConflicts: uiConflicts,
76968     uiContributors: uiContributors,
76969     uiCurtain: uiCurtain,
76970     uiDisclosure: uiDisclosure,
76971     uiEditMenu: uiEditMenu,
76972     uiEntityEditor: uiEntityEditor,
76973     uiFeatureInfo: uiFeatureInfo,
76974     uiFeatureList: uiFeatureList,
76975     uiField: uiField,
76976     uiFieldHelp: uiFieldHelp,
76977     uiFlash: uiFlash,
76978     uiFormFields: uiFormFields,
76979     uiFullScreen: uiFullScreen,
76980     uiGeolocate: uiGeolocate,
76981     uiHelp: uiHelp,
76982     uiInfo: uiInfo,
76983     uiInspector: uiInspector,
76984     uiLasso: uiLasso,
76985     uiLoading: uiLoading,
76986     uiMapData: uiMapData,
76987     uiMapInMap: uiMapInMap,
76988     uiModal: uiModal,
76989     uiModes: uiModes,
76990     uiNotice: uiNotice,
76991     uiPresetEditor: uiPresetEditor,
76992     uiPresetIcon: uiPresetIcon,
76993     uiPresetList: uiPresetList,
76994     uiRadialMenu: uiRadialMenu,
76995     uiRawMemberEditor: uiRawMemberEditor,
76996     uiRawMembershipEditor: uiRawMembershipEditor,
76997     uiRawTagEditor: uiRawTagEditor,
76998     uiRestore: uiRestore,
76999     uiSave: uiSave,
77000     uiScale: uiScale,
77001     uiSelectionList: uiSelectionList,
77002     uiSidebar: uiSidebar,
77003     uiSourceSwitch: uiSourceSwitch,
77004     uiSpinner: uiSpinner,
77005     uiSplash: uiSplash,
77006     uiStatus: uiStatus,
77007     uiSuccess: uiSuccess$$1,
77008     uiTagReference: uiTagReference,
77009     uiToggle: uiToggle,
77010     uiTooltipHtml: uiTooltipHtml,
77011     uiUndoRedo: uiUndoRedo,
77012     uiVersion: uiVersion,
77013     uiViewOnOSM: uiViewOnOSM,
77014     uiZoom: uiZoom,
77015     utilAsyncMap: utilAsyncMap,
77016     utilCallWhenIdle: utilCallWhenIdle,
77017     utilCleanTags: utilCleanTags,
77018     utilDisplayName: utilDisplayName,
77019     utilDisplayNameForPath: utilDisplayNameForPath,
77020     utilDisplayType: utilDisplayType,
77021     utilEditDistance: utilEditDistance,
77022     utilEntitySelector: utilEntitySelector,
77023     utilEntityOrMemberSelector: utilEntityOrMemberSelector,
77024     utilFastMouse: utilFastMouse,
77025     utilFunctor: utilFunctor,
77026     utilGetAllNodes: utilGetAllNodes,
77027     utilGetPrototypeOf: utilGetPrototypeOf,
77028     utilGetSetValue: utilGetSetValue,
77029     utilIdleWorker: utilIdleWorker,
77030     utilNoAuto: utilNoAuto,
77031     utilPrefixCSSProperty: utilPrefixCSSProperty,
77032     utilPrefixDOMProperty: utilPrefixDOMProperty,
77033     utilQsString: utilQsString,
77034     utilRebind: utilRebind,
77035     utilSetTransform: utilSetTransform,
77036     utilSessionMutex: utilSessionMutex,
77037     utilStringQs: utilStringQs,
77038     utilSuggestNames: utilSuggestNames,
77039     utilTagText: utilTagText,
77040     utilTriggerEvent: utilTriggerEvent,
77041     utilWrap: utilWrap,
77042     d3combobox: d3combobox,
77043     d3geoTile: d3geoTile,
77044     d3keybinding: d3keybinding,
77045     validationDeprecatedTag: validationDeprecatedTag,
77046     validationDisconnectedHighway: validationDisconnectedHighway,
77047     validationManyDeletions: validationManyDeletions,
77048     validationMissingTag: validationMissingTag,
77049     validationOldMultipolygon: validationOldMultipolygon,
77050     validationTagSuggestsArea: validationTagSuggestsArea
77051   });
77052
77053   window.iD = iD;
77054
77055 }());
77056 //# sourceMappingURL=iD.js.map